{"_id":"@amirafa/idle-requester","_rev":"2-5ac31bc1f84e993a1f415ef4acdc469f","name":"@amirafa/idle-requester","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@amirafa/idle-requester","version":"1.0.0","keywords":["idle-requester","fetch","requestIdleCallback","request"],"author":{"name":"Amirafa","email":"amir.h.rafati@gmail.com"},"license":"MIT","_id":"@amirafa/idle-requester@1.0.0","maintainers":[{"name":"amirafa","email":"amir.h.rafati@gmail.com"}],"homepage":"https://github.com/amirafa/idle-requester#readme","bugs":{"url":"https://github.com/amirafa/idle-requester/issues"},"dist":{"shasum":"4ee7b2942fad68815074519ce7e8dadf0a87e8a1","tarball":"https://registry.npmjs.org/@amirafa/idle-requester/-/idle-requester-1.0.0.tgz","fileCount":6,"integrity":"sha512-gsCOF5d4jcylpX6JJ8xBQINmdBSA0u5iTZtgNAM0YH31RmGm4/XksCQSIuED57dlRcNYmkltfkmV49lALrmgfA==","signatures":[{"sig":"MEUCIQD4Wq7HRO2Ep7ZxARmex+kDYrkTOjHSvQtWYahco96GNQIgQdcCChuhPfE2HnnTiBCToe+MTBffN6oQuxNHs6+Kjks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12600},"main":"./dist/idle-requester.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/idle-requester.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/idle-requester.js","require":"./dist/idle-requester.umd.cjs"}},"gitHead":"4f25bf809f4d4843c0509419a9094f65ec136575","scripts":{"build":"tsc && vite build"},"_npmUser":{"name":"amirafa","email":"amir.h.rafati@gmail.com"},"repository":{"url":"git+https://github.com/amirafa/idle-requester.git","type":"git"},"_npmVersion":"10.9.4","description":"A background fetch queue using requestIdleCallback","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","typescript":"^5.0.0","vite-plugin-dts":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/idle-requester_1.0.0_1780838707578_0.010016291260712684","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@amirafa/idle-requester","version":"1.0.1","description":"A background fetch queue using requestIdleCallback","license":"MIT","author":{"name":"Amirafa","email":"amir.h.rafati@gmail.com"},"publishConfig":{"access":"public"},"keywords":["idleRequester","idle-requester","fetch","requestIdleCallback","request"],"repository":{"type":"git","url":"git+https://github.com/amirafa/idleRequester.git"},"type":"module","main":"./dist/idle-requester.umd.cjs","module":"./dist/idle-requester.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/idle-requester.js","require":"./dist/idle-requester.umd.cjs"}},"scripts":{"build":"tsc && vite build"},"devDependencies":{"typescript":"^5.0.0","vite":"^5.0.0","vite-plugin-dts":"^3.0.0"},"_id":"@amirafa/idle-requester@1.0.1","gitHead":"38cc2a6f1f7a2cb1661f51325073e690e2b8e600","bugs":{"url":"https://github.com/amirafa/idleRequester/issues"},"homepage":"https://github.com/amirafa/idleRequester#readme","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-LYBZyNHRNRtySmtpuHYwzgs7g7laiI1/YSVeBM/5erMTiLu8FsVKiuLKp3E2jq3jswtdC+sAeSWPkKmaL2TIaw==","shasum":"735b500e97e3d3323d7efb37e36592521470e126","tarball":"https://registry.npmjs.org/@amirafa/idle-requester/-/idle-requester-1.0.1.tgz","fileCount":6,"unpackedSize":12625,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCfZdktgTad+yLdaHT+d6/M03qctupfp4q8T4PyWmyKUAIhAPqeAMXQcY//Irjs5dzZXDgMWxAO83q5VZKMi0zcI1dP"}]},"_npmUser":{"name":"amirafa","email":"amir.h.rafati@gmail.com"},"directories":{},"maintainers":[{"name":"amirafa","email":"amir.h.rafati@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/idle-requester_1.0.1_1780897454596_0.39607280197007055"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-07T13:25:07.459Z","modified":"2026-06-08T05:44:14.839Z","1.0.0":"2026-06-07T13:25:07.774Z","1.0.1":"2026-06-08T05:44:14.731Z"},"bugs":{"url":"https://github.com/amirafa/idleRequester/issues"},"author":{"name":"Amirafa","email":"amir.h.rafati@gmail.com"},"license":"MIT","homepage":"https://github.com/amirafa/idleRequester#readme","keywords":["idleRequester","idle-requester","fetch","requestIdleCallback","request"],"repository":{"type":"git","url":"git+https://github.com/amirafa/idleRequester.git"},"description":"A background fetch queue using requestIdleCallback","maintainers":[{"name":"amirafa","email":"amir.h.rafati@gmail.com"}],"readme":"# idle-requester\n\nA lightweight, strongly-typed background fetch queue that utilizes the browser's `requestIdleCallback` API.\n\nIt defers non-critical API requests to the browser's idle periods, ensuring smoother user interactions and eliminating frame drops on heavy network loads.\n\n---\n\n# Features\n\n* **Performance Optimized** — Offloads fetches to non-blocking idle frames.\n* **Priority Lane** — High-priority requests jump to the front of the queue.\n* **Auto-Retry** — Configurable network failure retries.\n* **Abortable** — Completely integrated with native `AbortController` signals.\n* **Smart Fallback** — Transparent `setTimeout` queue worker loop for Safari and SSR setups.\n\n---\n\n# Installation\n\n```bash\nnpm install idle-requester\n```\n\n---\n\n# Usage\n\n## 1. Vanilla JavaScript\n\nDirectly use the default singleton instance anywhere in your scripts.\n\n```js\nimport idleRequester from 'idle-requester';\n\nconst cancel = idleRequester.enqueue(\n  'https://api.example.com/analytics',\n  (err, data) => {\n    if (err) {\n      return console.error('Aborted or failed:', err);\n    }\n\n    console.log('Metrics logged:', data);\n  }\n);\n\n// Cancel processing if needed before execution completes\n// cancel();\n```\n\n---\n\n## 2. Vue 3 (Composition API)\n\nManage the instance cleanup cycles within Vue component lifecycles automatically.\n\n```vue\n<script setup>\nimport { onUnmounted, ref } from 'vue';\nimport idleRequester from 'idle-requester';\n\nconst userData = ref(null);\nlet cancelFetch = null;\n\nfunction loadRecommendationData() {\n  cancelFetch = idleRequester.enqueue(\n    '/api/recommendations',\n    {\n      priority: 'low',\n      retries: 1\n    },\n    (err, data) => {\n      if (!err) {\n        userData.value = data;\n      }\n    }\n  );\n}\n\nloadRecommendationData();\n\nonUnmounted(() => {\n  if (cancelFetch) {\n    cancelFetch();\n  }\n});\n</script>\n\n<template>\n  <div v-if=\"userData\">\n    <!-- Render data here -->\n  </div>\n</template>\n```\n\n---\n\n## 3. React\n\nIncorporate the utility inside a `useEffect` hook to prevent leaking asynchronous memory state during unmount steps.\n\n```tsx\nimport React, { useEffect, useState } from 'react';\nimport idleRequester from 'idle-requester';\n\nexport const SuggestionsComponent = () => {\n  const [items, setItems] = useState([]);\n\n  useEffect(() => {\n    const cancel = idleRequester.enqueue(\n      '/api/suggestions',\n      (err, data) => {\n        if (!err && data) {\n          setItems(data);\n        }\n      }\n    );\n\n    return () => {\n      cancel();\n    };\n  }, []);\n\n  return (\n    <ul>\n      {items.map((item: any) => (\n        <li key={item.id}>{item.name}</li>\n      ))}\n    </ul>\n  );\n};\n```\n\n---\n\n## 4. Angular\n\nEncapsulate the worker within a service block, or resolve individual items using RxJS patterns or component pipelines.\n\n```ts\nimport { Component, OnInit, OnDestroy } from '@angular/core';\nimport idleRequester from 'idle-requester';\n\n@Component({\n  selector: 'app-background-loader',\n  template: `<p>Background processing element</p>`\n})\nexport class BackgroundLoaderComponent implements OnInit, OnDestroy {\n  private cancelTask?: () => boolean;\n\n  ngOnInit() {\n    this.cancelTask = idleRequester.enqueue(\n      'https://api.example.com/logs',\n      {\n        method: 'POST',\n        priority: 'low'\n      },\n      (err, data) => {\n        if (err) {\n          console.error('Log sync failed', err);\n        }\n      }\n    );\n  }\n\n  ngOnDestroy() {\n    if (this.cancelTask) {\n      this.cancelTask();\n    }\n  }\n}\n```\n\n---\n\n# API Reference\n\n## `idleRequester.enqueue(url, options, callback)`\n\n| Parameter  | Type               | Required | Description                               |\n| ---------- | ------------------ | -------- | ----------------------------------------- |\n| `url`      | `string`           | Yes      | Target endpoint string                    |\n| `options`  | `IdleFetchOptions` | No       | Configuration options                     |\n| `callback` | `Function`         | No       | Signature matches `(error, data) => void` |\n\n---\n\n# Advanced Options\n\n```ts\ninterface IdleFetchOptions extends RequestInit {\n  priority?: 'high' | 'low';\n  // Default: 'low'\n  // 'high' puts the request at the front of the queue\n\n  retries?: number;\n  // Default: 0\n  // Amount of retry iteration limits\n\n  timeout?: number;\n  // Default: 3000ms\n  // Deadline timeout constant\n}\n```\n\n---\n\n# Instantiating Isolated Queues\n\nIf you want to maintain separate isolated environments across individual modules, instantiate distinct contextual objects manually instead of consuming the default export singleton.\n\n```ts\nimport { IdleRequester } from 'idle-requester';\n\nconst specializedQueue = new IdleRequester({\n  timeout: 5000\n});\n```\n\n---\n\n# License\n\nMIT\n","readmeFilename":"README.md"}