{"_id":"qrate","_rev":"12-c1afcf2deda63e30fbdbc62fb4de603d","name":"qrate","dist-tags":{"latest":"2.0.1"},"versions":{"1.0.0":{"name":"qrate","version":"1.0.0","keywords":["queue","async","rate","node.js"],"author":{"name":"Glynn Bird","email":"glynn.bird@gmail.com"},"license":"Apache-2.0","_id":"qrate@1.0.0","maintainers":[{"name":"glynnbird","email":"glynn.bird@gmail.com"}],"homepage":"https://github.com/glynnbird/qrate#readme","bugs":{"url":"https://github.com/glynnbird/qrate/issues"},"dist":{"shasum":"e62aca7780098f10aa3e7e963b681f7455bf55a9","tarball":"https://registry.npmjs.org/qrate/-/qrate-1.0.0.tgz","integrity":"sha512-fN1lnwfwth0Q/l8LXtR0FOP3Ftyf2/Ybcxul5fZx48FqcFHM/8YZmGM3hMMPq+fAVliwy5j9FAEeZcU6JRWH3g==","signatures":[{"sig":"MEUCIA+Y0bBztYFRXSPPTRbU2vqrOnTeJjwuwaxCrrBA4a2PAiEAzJ0HveRQH35gKnF8oQx2neBiR25s8sVhXgFFVJ0TFcw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","_from":".","_shasum":"e62aca7780098f10aa3e7e963b681f7455bf55a9","gitHead":"d9bc180bc17b49b0f6233305cdee06cd5d5fb003","scripts":{"test":"mocha"},"_npmUser":{"name":"glynnbird","email":"glynn.bird@gmail.com"},"repository":{"url":"git+https://github.com/glynnbird/qrate.git","type":"git"},"_npmVersion":"3.10.10","description":"A Node.js queue library with controllable concurrency and rate limiting","directories":{},"_nodeVersion":"6.9.5","devDependencies":{"chai":"^4.0.1","mocha":"^3.4.2"},"_npmOperationalInternal":{"tmp":"tmp/qrate-1.0.0.tgz_1496560180905_0.6873858773615211","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"qrate","version":"1.0.1","keywords":["queue","async","rate","node.js"],"author":{"name":"Glynn Bird","email":"glynn.bird@gmail.com"},"license":"Apache-2.0","_id":"qrate@1.0.1","maintainers":[{"name":"glynnbird","email":"glynn.bird@gmail.com"}],"homepage":"https://github.com/glynnbird/qrate#readme","bugs":{"url":"https://github.com/glynnbird/qrate/issues"},"dist":{"shasum":"2b4388f8714a00699590ce149e673147d2aed09a","tarball":"https://registry.npmjs.org/qrate/-/qrate-1.0.1.tgz","integrity":"sha512-pAmaRw+AuRc11sOOijEyJvRBwj4JLYN+anZAZdnchxbwOXMxEQrGlp3PwhDWs476l1Gth3Q3Ua9UY/Byo0TGlg==","signatures":[{"sig":"MEUCIQDkUl+2DP6gtiHd/cF7Hw+cd5Zup4MUkQyljePu/MpNZgIgTLvfEPi5+PayVqh3HWq2zTxs7tXxH0AZDW7w1aJGhg0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","_from":".","_shasum":"2b4388f8714a00699590ce149e673147d2aed09a","gitHead":"65b4f99decd0c5976971ab0831a9f9045d6fc518","scripts":{"test":"mocha"},"_npmUser":{"name":"glynnbird","email":"glynn.bird@gmail.com"},"repository":{"url":"git+https://github.com/glynnbird/qrate.git","type":"git"},"_npmVersion":"3.10.10","description":"A Node.js queue library with controllable concurrency and rate limiting","directories":{},"_nodeVersion":"6.9.5","devDependencies":{"chai":"^4.0.1","mocha":"^3.4.2"},"_npmOperationalInternal":{"tmp":"tmp/qrate-1.0.1.tgz_1496564002134_0.30229892232455313","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"qrate","version":"1.0.2","keywords":["queue","async","rate","node.js"],"author":{"name":"Glynn Bird","email":"glynn.bird@gmail.com"},"license":"Apache-2.0","_id":"qrate@1.0.2","maintainers":[{"name":"glynnbird","email":"glynn.bird@gmail.com"}],"homepage":"https://github.com/glynnbird/qrate#readme","bugs":{"url":"https://github.com/glynnbird/qrate/issues"},"dist":{"shasum":"50d5da3c69e50dbb8ce3ed761e2dbd95657fb225","tarball":"https://registry.npmjs.org/qrate/-/qrate-1.0.2.tgz","integrity":"sha512-h3i/T7JDkPSXYI5JhTVfSVTBKK9ZP6oq7oROu4JKcbu1X9v3AXs/cK1hVWFnRhDyVaiP1aVGaXsB1SX1rU7s7A==","signatures":[{"sig":"MEUCIQDCoAPwrWL6PtaBcfKLyP7JMCArN36jywJnjgGb3YaiLQIgIJH6ZBrmBKM6h0r3Cjc6TcDdUTSY5897N02TkNIq5T4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","_from":".","_shasum":"50d5da3c69e50dbb8ce3ed761e2dbd95657fb225","gitHead":"0b4741159ce17ad038c094dbe955f43bc8f83ab2","scripts":{"test":"mocha"},"_npmUser":{"name":"glynnbird","email":"glynn.bird@gmail.com"},"repository":{"url":"git+https://github.com/glynnbird/qrate.git","type":"git"},"_npmVersion":"3.10.10","description":"A Node.js queue library with controllable concurrency and rate limiting","directories":{},"_nodeVersion":"6.9.5","devDependencies":{"chai":"^4.0.1","mocha":"^3.4.2"},"_npmOperationalInternal":{"tmp":"tmp/qrate-1.0.2.tgz_1496593589397_0.12528763944283128","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"qrate","version":"1.1.0","keywords":["queue","async","rate","node.js"],"author":{"name":"Glynn Bird","email":"glynn.bird@gmail.com"},"license":"Apache-2.0","_id":"qrate@1.1.0","maintainers":[{"name":"glynnbird","email":"glynn.bird@gmail.com"}],"homepage":"https://github.com/glynnbird/qrate#readme","bugs":{"url":"https://github.com/glynnbird/qrate/issues"},"dist":{"shasum":"88670e4913bc3e4b96fa1ee21129413b8aae2b79","tarball":"https://registry.npmjs.org/qrate/-/qrate-1.1.0.tgz","fileCount":14,"integrity":"sha512-Udk0g2het6NhUGNSrBj5oaGF0+SPlxP4sGGh9d+nvUKe9DFR9Ht9VzXZwFB+ilPVav6RiPYQgiujOPU57rTktw==","signatures":[{"sig":"MEYCIQCDvPelVSs74saiHJ4ua2yYaPW7FP1b69+r8Trio7tBBwIhAOVlhF2PZBer5QL2iZSEbAO3+ksEyHEVGYusPJf6w78o","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":57935,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwaYuCRA9TVsSAnZWagAAjlkQAJYoI64Wwlekx47Ks3jm\n7PsMg41ao72Nk24ScINu8KKxb9f/fs2eoMpP5YW72KkzdHJ7/wwqqPJIP9nJ\ns6C/Jdx5jim43EEn3xmnqcSv2d5fZyCs7bWEOZobXsM7YL+Oq6YDNnH9Eka6\nA4dru/KXnZNN/E3pYCMf3+7ao5ANutl0iPFZO+ZCQ0/AfeKI+/r6M+QsNb0j\nTj2/ozfTUV0FfAT1O1gXyizvGBu0tw2tTn7Qx6Fjzw7bLuXYx8lf9EuYbe11\nd8fkMDgLbA5c4dEji/22EOhWv86Cs3E7nna3jwCdhQgL/MHCRP/yHtU5vWC5\noQ6YkYflA8jmpeTHfbvDi5W1vymZrvKeMTImleeDeE2HdZSaOBxBdBp1NmEu\ncNAWRvx9VIJBQ9RKJRIGAtNlck0q+11Bl35HO4OA2F3U7TnKIUIfC4WW7TSy\nejWNM2E7h3C0R/fy40vbydru3+vGv0WKyvl5H1MvZOGtg0KYxfbfgq/PdRJr\nMDva1KNU01/0ITISGydjuBNlm0+Jz/SchFUzhehtK5NfPAiRmPhYcPF9BUOM\nRcWUsQxXoND5p2hxBiQ8RTcYtOjmxyQXzUb38bASmBQuKzhOqJP/IeGZz4O/\nqEYX5jAa7ShJpWZMQyk48+PVVuxX9tcUDligo6tv4gVdYbp3CnptoMbZ67BE\nl9EV\r\n=TkCs\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"3b3c4697fc393b002c201ef3dbffade2ce33c42b","scripts":{"test":"mocha"},"_npmUser":{"name":"glynnbird","email":"glynn.bird@gmail.com"},"repository":{"url":"git+https://github.com/glynnbird/qrate.git","type":"git"},"_npmVersion":"6.9.0","description":"A Node.js queue library with controllable concurrency and rate limiting","directories":{},"_nodeVersion":"10.14.0","_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","mocha":"^6.1.4"},"_npmOperationalInternal":{"tmp":"tmp/qrate_1.1.0_1556194861519_0.4326242909848004","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"qrate","version":"1.2.0","keywords":["queue","async","rate","node.js"],"author":{"name":"Glynn Bird","email":"glynn.bird@gmail.com"},"license":"Apache-2.0","_id":"qrate@1.2.0","maintainers":[{"name":"glynnbird","email":"glynn.bird@gmail.com"}],"homepage":"https://github.com/glynnbird/qrate#readme","bugs":{"url":"https://github.com/glynnbird/qrate/issues"},"dist":{"shasum":"8a5fe009e45534035835c58010f9d776b8cd3585","tarball":"https://registry.npmjs.org/qrate/-/qrate-1.2.0.tgz","fileCount":11,"integrity":"sha512-2dZchmcnFk15FrXvaNhA+pEeY8RPKKPFTDHVArcBstKWnXOTRgaMRur19n+sG+dA6JFZfdULd5YpEtNonssbWQ==","signatures":[{"sig":"MEQCIBKNd/5usCbbtnOsream8I/DImnWNrHVEZrEOcKvaGt3AiAcrP5zFWHcUA8NOBA2RFrb094Jbpaqj+HnFFtowo1/LA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34828,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0/miCRA9TVsSAnZWagAAnmEP/i44tdx+3YJqqCMH+/k7\nrrEdXwSGorNm3anEfCpg7Bc/CVApPivoP5LRuT8JDxJOZjrQlGju8UR08JkM\nMrBwaPCmxae+K28oFZDsKC0CT6P2Dtr/3pRbbb9jZ30Y6Rsr0DUl+a3+O/Ze\nSBYMwp+BRDh6nGbq4smCkw6n4ZkD5qc0BoxI8XFar6JFQVr2ynRKhG17CaMg\nt/ZinJZk0FRb57PE3Hoc6o+TuoziF9VhezTH3oZ9wfA1BlfEov4ECBD/LVKE\nMjxmGVagYGSFudyK6nHGxU7A8M5kTjuybqoSnsQM5BWvqw129+5SfXMH+4O2\nr3mcjOZUbazoni7QMEXmsth7wABDGDslHcO/4Hve6RjenvAA3iP4pR8uvoOC\nCehS5qE0QEzT662JUF+ENcPOMUr30hTPnixNXWLb4gBH2oBpvc4v2/eM5o9C\nwn6HPavoIJVuob0Msob2FklqwG4ikGIu/e4HUq8nZWhxVurZQ/ACURsuyj9I\n2NZe6yUdVJtAso5gbKwACFxar2VgbTisAAiVTO0Cnw8KCm/E3GMBsOHiLKH6\n55ewbdOekeGlQTgOJLqzVgPL3rjQpk/SYqOCGR3+DtlSntYTmyliJX47zBVN\n0cE7I/EWNAcQxHH2OGitJGWk0lDSmH3YNItQNxevcO4Jc4924HvqMUbq+ix3\npPbI\r\n=PwgU\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"eccb4ed2668de8678adf7554411660bb3f40494d","scripts":{"test":"mocha","standard":"standard --fix"},"_npmUser":{"name":"glynnbird","email":"glynn.bird@gmail.com"},"repository":{"url":"git+https://github.com/glynnbird/qrate.git","type":"git"},"_npmVersion":"6.9.0","description":"A Node.js queue library with controllable concurrency and rate limiting","directories":{},"_nodeVersion":"10.14.0","_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","mocha":"^6.1.4","standard":"^12.0.1"},"_npmOperationalInternal":{"tmp":"tmp/qrate_1.2.0_1557395873764_0.7222040312673443","host":"s3://npm-registry-packages"}},"1.2.1":{"name":"qrate","version":"1.2.1","keywords":["queue","async","rate","node.js"],"author":{"name":"Glynn Bird","email":"glynn.bird@gmail.com"},"license":"Apache-2.0","_id":"qrate@1.2.1","maintainers":[{"name":"glynnbird","email":"glynn.bird@gmail.com"}],"homepage":"https://github.com/glynnbird/qrate#readme","bugs":{"url":"https://github.com/glynnbird/qrate/issues"},"dist":{"shasum":"7a7c3b61492d92934a62cce354e4e5fa5ff35e36","tarball":"https://registry.npmjs.org/qrate/-/qrate-1.2.1.tgz","fileCount":11,"integrity":"sha512-Mn22peejkh9l6kUteF12RCTrYjJARunXd52C2A8Ych4sX1wPt56Sg/jPti3RiMKa216QeCunouCSg+hmn9eUDA==","signatures":[{"sig":"MEUCIEQ3TsSiLeuDY+omhUoeu88Swj5U+u+giEinS+AfGK6nAiEAo1kaPkPWDcRrggsuUokeON1dc5hvjBlIQpwL6OmJNbg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":36045,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhNyyTCRA9TVsSAnZWagAAQJAP/3yzoFW2usqXcv90kldF\nsCaLxJangTPGqJuIv7n8EPnrciixrH5APfnoOfYlH9EVRgAXarj9xkS/IKcM\nS5SaMx5ZeAqmK1BBaInrnYX2IAXNq9Nmd7d8S/SxfyXWmQjkgAVBspUcvhtx\n2UHe+xAhIWF+uBmRV1FIWI6mJXH2AkYU3XrOn09EP2K9Yfp1hUzdyaD5nrQj\nt7r/ljnaOZW7WBPPkwieabZn6f+f74MKqlkGmYF+oj+bsoceUh4Wyv6DfKNk\nl0tD6Z+oN3CjcI3jYI0i5MhGyiKQaQtOn9QgD6o3TOwgCQau9QNrPewlVRqZ\nOkhCPWo2q8csiwMyYwpV+NPJMRMeiKsdZEaarxl1SLO4gm5ou7JtqCrMy3qr\nmDhseFKVjaQtA3twCcm6MWtb3eKAPOSUo6iAPKi6cL0ax20gPoKmHoNYzgPe\npFuqMA7kSNJ7dboakdopNMO2HQZ76IzD0MQAJ6W5A4m2yDCVXph3RUsqqznr\nEHN7z/2oh4ZYmk30coAzSl4qJ6DjYvJ6u+kFKCrHtZdxuL3GrBO7tZQvX+mk\nC4Kc0sRN4lTBF5DNEnLRquDZGVIuZJZ9aPTLyFSTJXidAaebXiKcuZTwOmJb\njr7bXz0B0D2w5etrDpjLSyu/is4IXyR6YrmZxhk+sRw80CPvSIKr6UiVtXZ+\nmYN4\r\n=Jw41\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"03ef42b3d80506fd74a3e02969a1532c3c70789c","scripts":{"test":"mocha","standard":"standard --fix"},"_npmUser":{"name":"glynnbird","email":"glynn.bird@gmail.com"},"repository":{"url":"git+https://github.com/glynnbird/qrate.git","type":"git"},"_npmVersion":"7.16.0","description":"A Node.js queue library with controllable concurrency and rate limiting","directories":{},"_nodeVersion":"14.15.1","_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.4","mocha":"^9.1.1","standard":"^16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/qrate_1.2.1_1631005843684_0.29714799817091153","host":"s3://npm-registry-packages"}},"1.2.4":{"name":"qrate","version":"1.2.4","keywords":["queue","async","rate","node.js"],"author":{"name":"Glynn Bird","email":"glynn.bird@gmail.com"},"license":"Apache-2.0","_id":"qrate@1.2.4","maintainers":[{"name":"glynnbird","email":"glynn.bird@gmail.com"}],"homepage":"https://github.com/glynnbird/qrate#readme","bugs":{"url":"https://github.com/glynnbird/qrate/issues"},"dist":{"shasum":"bfe9347f45f56895695fcd08c0f82b4c458f54b6","tarball":"https://registry.npmjs.org/qrate/-/qrate-1.2.4.tgz","fileCount":12,"integrity":"sha512-EnpBgT5Vg2uUFYVNtriZ3hwgc/m64lnts6B+2CnDGzc8bbGPUIIKvyEcEJRXIylm/K5+p44f5hzD1g0sk/aYQw==","signatures":[{"sig":"MEYCIQD3KZvrF1+h7Li+JxPN0CeDRxHBaoIePXEvJQWPFPX1AwIhAOABUwIgX4N8MAED5AnLnkAd0TjXU8crrFKaIa7M5FO1","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":56065},"main":"index.js","gitHead":"ee745ea9e80d3eae9a86af87acd627a3dcdfc40d","scripts":{"test":"node --test"},"_npmUser":{"name":"glynnbird","email":"glynn.bird@gmail.com"},"repository":{"url":"git+https://github.com/glynnbird/qrate.git","type":"git"},"_npmVersion":"9.6.7","description":"A Node.js queue library with controllable concurrency and rate limiting","directories":{},"_nodeVersion":"18.17.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/qrate_1.2.4_1720799047176_0.2949512284834621","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"qrate","version":"2.0.0","keywords":["queue","async","rate","node.js"],"author":{"name":"Glynn Bird","email":"glynn.bird@gmail.com"},"license":"Apache-2.0","_id":"qrate@2.0.0","maintainers":[{"name":"glynnbird","email":"glynn.bird@gmail.com"}],"homepage":"https://github.com/glynnbird/qrate#readme","bugs":{"url":"https://github.com/glynnbird/qrate/issues"},"dist":{"shasum":"ca312e1f1ae7b1c46a58331c5f42002b7e002b1d","tarball":"https://registry.npmjs.org/qrate/-/qrate-2.0.0.tgz","fileCount":12,"integrity":"sha512-v7WXlAx369C5Y6jmGpbXOE8xRCfgMaJwHwGiJy9ViFuWEMFiQCDbzir4m5iuf7bIXJ6i5sRu2p/espkos4u+NQ==","signatures":[{"sig":"MEYCIQDqNa7Jz2jrnDO2Bt2MC6dlMG/W/mT27+iwRwzNPLRdMAIhAKWG+jvxr/uxaJ9HCjqb6cYTyeNJedHFX4sf2BtX8/Y4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55973},"main":"index.js","type":"module","gitHead":"7f32400fa2179b70d914c2cd786f7c8a207d16a1","scripts":{"test":"node --test"},"_npmUser":{"name":"glynnbird","actor":{"name":"glynnbird","type":"user","email":"glynn.bird@gmail.com"},"email":"glynn.bird@gmail.com"},"repository":{"url":"git+https://github.com/glynnbird/qrate.git","type":"git"},"_npmVersion":"10.9.2","description":"A Node.js queue library with controllable concurrency and rate limiting","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/qrate_2.0.0_1750259470263_0.9566472419010636","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"qrate","version":"2.0.1","type":"module","description":"A Node.js queue library with controllable concurrency and rate limiting","main":"index.js","scripts":{"test":"node --test"},"repository":{"type":"git","url":"git+https://github.com/glynnbird/qrate.git"},"keywords":["queue","async","rate","node.js"],"author":{"name":"Glynn Bird","email":"glynn.bird@gmail.com"},"license":"Apache-2.0","bugs":{"url":"https://github.com/glynnbird/qrate/issues"},"homepage":"https://github.com/glynnbird/qrate#readme","_id":"qrate@2.0.1","gitHead":"a0125e5dd6456de19717c3be727fdce82012a39d","_nodeVersion":"22.19.0","_npmVersion":"11.6.0","dist":{"integrity":"sha512-LEpgjFJTrTmNSDdpSi6sQftSV16idmx9oP4NOM0OQjA3pIAUc2YwcMNM8MiN7qX1xOl4zvE6sKq7mgSDHRFAdw==","shasum":"d32fba547dc8522cffdabbbd664767b4db1faf7f","tarball":"https://registry.npmjs.org/qrate/-/qrate-2.0.1.tgz","fileCount":12,"unpackedSize":55973,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/qrate@2.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAPYezuXRK37d3vp89SpaAqJoZyDVJIA8VJw72eQAQkbAiB9a9AK0BVjhwFvsLAEuXg0cvMsgFRRloyHE5Y9PhjHhg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ccdc7e7a-4fbd-4e5b-8265-d057819e45e3"}},"directories":{},"maintainers":[{"name":"glynnbird","email":"glynn.bird@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/qrate_2.0.1_1758535283704_0.7425964710894262"},"_hasShrinkwrap":false}},"time":{"created":"2017-06-04T07:09:41.909Z","modified":"2025-09-22T10:01:24.293Z","1.0.0":"2017-06-04T07:09:41.909Z","1.0.1":"2017-06-04T08:13:23.142Z","1.0.2":"2017-06-04T16:26:30.483Z","1.1.0":"2019-04-25T12:21:01.667Z","1.2.0":"2019-05-09T09:57:53.930Z","1.2.1":"2021-09-07T09:10:43.801Z","1.2.4":"2024-07-12T15:44:07.346Z","2.0.0":"2025-06-18T15:11:10.503Z","2.0.1":"2025-09-22T10:01:23.874Z"},"bugs":{"url":"https://github.com/glynnbird/qrate/issues"},"author":{"name":"Glynn Bird","email":"glynn.bird@gmail.com"},"license":"Apache-2.0","homepage":"https://github.com/glynnbird/qrate#readme","keywords":["queue","async","rate","node.js"],"repository":{"type":"git","url":"git+https://github.com/glynnbird/qrate.git"},"description":"A Node.js queue library with controllable concurrency and rate limiting","maintainers":[{"name":"glynnbird","email":"glynn.bird@gmail.com"}],"readme":"# qrate\n\n[![Build Status](https://travis-ci.org/glynnbird/qrate.svg?branch=master)](https://travis-ci.org/glynnbird/qrate) [![npm version](https://badge.fury.io/js/qrate.svg)](https://badge.fury.io/js/qrate)\n\n## Introduction\n\nThe queue library based on the [async.queue](http://caolan.github.io/async/docs.html#queue) utility but modified to allow a queue's throughput to be controlled in terms of:\n\n- concurrency - the maximum number of workers running at any point in time\n- rateLimit - the maximum number of workers started per second\n\nThe default behaviour is a `concurrency` of 1 (one worker at a time) and a `rateLimit` of null (no rate limiting).\n\nThe *qrate* library can be used as a drop-in replacement for the [async.queue](http://caolan.github.io/async/docs.html#queue) function.\n\n## Installation\n\nInstall with\n\n```sh\nnpm install qrate\n```\n\nor to import it into your Node.js project:\n\n```sh\nnpm install --save qrate\n```\n\n## Usage\n\nA queue is created by calling `qrate` passing in the the worker function you want to operate on each item in the queue. The returned `q` can then be used to push data into the queue.\n\n```js\n\n// require qrate library\nimport qrate from 'qrate'\n\n// mark the start time of this script\nconst start = new Date().getTime()\n\n// worker function that calls back after 100ms\nconst worker = function(data, done) {\n\n  // your worker code goes here\n  // 'data' contains the queue to work on\n  // call 'done' when finished.\n\n\n  // output a message including a timestamp\n  console.log('Processing', data, '@', new Date().getTime() - start, 'ms');\n\n  // call the 'done' function after 100ms\n  setTimeout(done, 100);\n};\n\n// create a queue with default properties (concurrency = 1, rateLimit = null)\n// using our 'worker' function to process each item in the queue\nconst q = qrate(worker);\n\n// add ten things to the queue\nfor (let i = 0; i < 10; i++) {\n  q.push({ i: i });\n}\n```\n\nThe queue has the default `concurrency` of 1, so worker starts after its predecessor finishes:\n\n```sh\nProcessing { i: 0 } @ 21 ms\nProcessing { i: 1 } @ 129 ms\nProcessing { i: 2 } @ 233 ms\nProcessing { i: 3 } @ 338 ms\nProcessing { i: 4 } @ 441 ms\nProcessing { i: 5 } @ 545 ms\nProcessing { i: 6 } @ 650 ms\nProcessing { i: 7 } @ 751 ms\nProcessing { i: 8 } @ 852 ms\nProcessing { i: 9 } @ 958 ms\n```\n\nWe can increase the number of workers running in parallel by passing a `concurrency` value as a second parameter:\n\n```js\n\n// create a queue where up to three workers run at any time\nconst q = qrate(worker, 3);\n```\n\nwhich speeds things up significantly:\n\n```\nProcessing { i: 0 } @ 27 ms\nProcessing { i: 1 } @ 33 ms\nProcessing { i: 2 } @ 35 ms\nProcessing { i: 3 } @ 134 ms\nProcessing { i: 4 } @ 135 ms\nProcessing { i: 5 } @ 135 ms\nProcessing { i: 6 } @ 235 ms\nProcessing { i: 7 } @ 235 ms\nProcessing { i: 8 } @ 236 ms\nProcessing { i: 9 } @ 340 ms\n```\n\nSo far we have not done anything that a normal `async.queue` could do. This is where the third parameter comes in.\n\n## Rate limiting the queue\n\nIf you want to limit the rate of throughput of the queue (e.g. 5 jobs per second), then you can pass a third `rateLimit`  parameter to `qrate`. The `rateLimit` indicates the maximum number workers per second you want the queue to start:\n\n- rateLimit = 1 - one per second\n- rateLimit = 5 - five per second\n- rateLimit = 0.5 - one every two seconds\n- rateLimit = null - as fast as possible (default)\n\n```js\n// concurrency 1, rateLimit 2 workers per second\nconst q = qrate(worker, 1, 2);\n```\n\nwhich produces the output:\n\n```\nProcessing { i: 0 } @ 16 ms\nProcessing { i: 1 } @ 126 ms\nProcessing { i: 2 } @ 1007 ms\nProcessing { i: 3 } @ 1111 ms\nProcessing { i: 4 } @ 2013 ms\nProcessing { i: 5 } @ 2118 ms\nProcessing { i: 6 } @ 3018 ms\nProcessing { i: 7 } @ 3124 ms\nProcessing { i: 8 } @ 4025 ms\nProcessing { i: 9 } @ 4127 ms\n```\n\nNotice how in the early part of each second, two workers are executed in turn, then the queue waits until the next second boundary before resuming work again.\n\nRate-limiting is useful if you want to ensure that the number of API calls your code generates stays below the API provider's quota, e.g. five API calls per second.\n\n## Worker functions with callbacks\n\nYour worker function can be a standard JavaScript function with two parameters\n\n- the payload - the data that your function receives from the queue.\n- a callback - you call this function to indicate that the worker has finished its work.\n\n```js\n// worker function that calls back after 100ms\nconst worker = function(data, done) {\n  // let's imagine we're writing data to a database\n  // This is typically an asynchronous action.\n  db.insert(data, function(err, insertData) {\n    // now we can call the callback function to show that we're finished\n    done(err, insertData)\n  })\n};\n```\n\n## Work functions with Promises\n\nAlternatively, a more modern pattern is to define your worker function as an `async` function. This allows you to deal with asynchronous activity, like database calls, without callbacks. This time the function only accepts one parameter:\n\n```js\nconst worker = async (data) => {\n  const insertData = await db.insert(data)\n  return {ok: true}\n};\n```\n\n## Detecting that the queue is empty\n\nIf you create a `q.drain` function, it will be called when the queue size reaches zero. This can be used as a trigger to publish results, fetch more work or to kill the queue & tidy up. (see Killing the queue).\n\n```js\nq.drain = () => {\n  // all of the queue items have been processed\n  console.log('the queue is empty');\n}\n```\n\n## Killing the queue\n\nA rate-limited `qrate` queue sets up a timer to handle the throttling of a rate-limited queue. The queue can be cleaned up by calling the `q.kill()` function.\n\nIf your application is working through a single list of work, the you can provide a `q.drain` function that is called when a queue is emptied and call `q.kill` in that function:\n\n```js\nq.drain = () => {\n  console.log('the queue is empty');\n  q.kill();\n};\n```\n\nor, simply tie the `drain` and `kill` functions together:\n\n```js\nq.drain = q.kill;\n```\n\nIn other applications, you may wish to keep the queue alive and periodically feed it with fresh work. \n\n\n\n\n\n\n\n","readmeFilename":"README.md"}