{"_id":"@boringnode/queue","_rev":"22-e13fb04fd7ac9972662c3e3adb41a28e","name":"@boringnode/queue","dist-tags":{"alpha":"0.0.1-alpha.4","latest":"0.7.1"},"versions":{"0.0.1-alpha":{"name":"@boringnode/queue","version":"0.0.1-alpha","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.0.1-alpha","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"}],"dist":{"shasum":"fc4e3f2f905fd2b68458cdb912b35f4d92959894","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.0.1-alpha.tgz","fileCount":22,"integrity":"sha512-Ma2gzxLWVyD8CWpFe0pkpy9Ayu5x81m6zP8IB2YDOhogJQnIvrw6ph8wGs0x9PTGxe1Xf89QL559A3OakB4ZpA==","signatures":[{"sig":"MEYCIQCmTmkVjUOXy24PBkO6pFJTEC8EfJfuLqIwk6fem2r9EwIhAIwTPpKZY/UbiXEZ0VfKZUphvygSpWRQiVhQ1daHFg2y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65350},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types/*":"./build/src/types/*.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"284c17428de75238ad69bbfe6835c4dba8316cac","imports":{"#src/*":"./src/*.ts","#types/*":"./src/types/*.ts","#drivers/*":"./src/drivers/*.ts","#contracts/*":"./src/contracts/*.ts","#strategies/*":"./src/strategies/*.ts","#lease_managers/*":"./src/lease_managers/*.ts"},"scripts":{"lint":"eslint .","test":"c8 node --enable-source-maps bin/test.ts","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","typecheck":"tsc --noEmit","prepublishOnly":"yarn build"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.3.0","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@lukeed/ms":"^2.0.2","@verrou/core":"^0.5.1","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","devDependencies":{"c8":"^10.1.3","tsup":"^8.5.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@adonisjs/tsconfig":"^1.4.1","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.0.1-alpha_1763737716959_0.6983509707917879","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.0":{"name":"@boringnode/queue","version":"0.0.1-alpha.0","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.0.1-alpha.0","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"}],"dist":{"shasum":"45f0fef5f07f88ec3f39bdcfe45f08c6e7049e2a","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.0.1-alpha.0.tgz","fileCount":19,"integrity":"sha512-wIPO5DSjeXi/mMXx55eDg2hNH++Nn9h0BQrO2uhWYQVj3h2/t7QyTJl0qO5XREptNtkauwiv7kztGWpDU8aeYw==","signatures":[{"sig":"MEUCIEMYsf67c3pl8s6F/yAwH8LSKugig+IyN04/A37uD+l3AiEA25LS/z1R68rjeOymEvq77d82dZ2LnUo9LPMfhspoMRE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81845},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types/*":"./build/src/types/*.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"784f410c04b5aee67cccebf996cae638beefab0d","imports":{"#src/*":"./src/*.ts","#types/*":"./src/types/*.ts","#drivers/*":"./src/drivers/*.ts","#contracts/*":"./src/contracts/*.ts","#strategies/*":"./src/strategies/*.ts","#lease_managers/*":"./src/lease_managers/*.ts"},"scripts":{"lint":"eslint .","test":"c8 node --enable-source-maps bin/test.ts","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node benchmark/run.ts","typecheck":"tsc --noEmit","benchmark:full":"node benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@lukeed/ms":"^2.0.2","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","readmeFilename":"README.md","devDependencies":{"c8":"^10.1.3","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@adonisjs/tsconfig":"^1.4.1","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.0.1-alpha.0_1765141788118_0.07163911989081484","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.1":{"name":"@boringnode/queue","version":"0.0.1-alpha.1","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.0.1-alpha.1","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"}],"dist":{"shasum":"b3129d1c75238f63ba7977c7170edf312a3a0446","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.0.1-alpha.1.tgz","fileCount":22,"integrity":"sha512-AU8ChiMUBxkUjakCFJmzUwB/ozM+tYHKiVHE/AjFFsFut2n3mWWIyh/JzEBDilojbyM2uH/34ZD7D95+0PFZyg==","signatures":[{"sig":"MEUCIGDAzTdFS3iEqRr9fs1p5USOotdY4S2D8qe62RfOA1p1AiEA7hJntHhDL/1h2V+uB3yYgXNvPxjlhmYRLgF48yrVB8k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104903},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types/*":"./build/src/types/*.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"c41fc8b0d7e1847ab5e38f42fd73933250a4b00d","imports":{"#src/*":"./src/*.ts","#types/*":"./src/types/*.ts","#drivers/*":"./src/drivers/*.ts","#contracts/*":"./src/contracts/*.ts","#strategies/*":"./src/strategies/*.ts","#lease_managers/*":"./src/lease_managers/*.ts"},"scripts":{"lint":"eslint .","test":"c8 node --enable-source-maps bin/test.ts","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node benchmark/run.ts","typecheck":"tsc --noEmit","benchmark:full":"node benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@lukeed/ms":"^2.0.2","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","readmeFilename":"README.md","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@adonisjs/tsconfig":"^1.4.1","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.0.1-alpha.1_1765150508700_0.8899761309357461","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.2":{"name":"@boringnode/queue","version":"0.0.1-alpha.2","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.0.1-alpha.2","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"}],"dist":{"shasum":"8f3c442d663a1b916e8acbe6b46833c989958d3a","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.0.1-alpha.2.tgz","fileCount":22,"integrity":"sha512-PNmaZiv+TFu6XDgU7ssdsw0y+bKIoAt3kRtEXK6JjXofSqPS5CT4gtz6FtoVb3S3t99YD3tW02iCjjJ+c0Cang==","signatures":[{"sig":"MEUCICd70FEe1/gR2SShX6AYWX1K2mn1OtpboY+u/UQWW1mQAiEA7PdKA6HArvQn74B6AsgWYU88v8ogLGeg7M9xFff9pdE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105662},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types/*":"./build/src/types/*.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"0696d205250140a79851791b859a41bdfd0fd9a4","imports":{"#src/*":"./src/*.ts","#types/*":"./src/types/*.ts","#drivers/*":"./src/drivers/*.ts","#contracts/*":"./src/contracts/*.ts","#strategies/*":"./src/strategies/*.ts","#lease_managers/*":"./src/lease_managers/*.ts"},"scripts":{"lint":"eslint .","test":"c8 node --enable-source-maps bin/test.ts","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node benchmark/run.ts","typecheck":"tsc --noEmit","benchmark:full":"node benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.3.0","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@lukeed/ms":"^2.0.2","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","readmeFilename":"README.md","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@adonisjs/tsconfig":"^1.4.1","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.0.1-alpha.2_1765577463429_0.5984304959639353","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.3":{"name":"@boringnode/queue","version":"0.0.1-alpha.3","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.0.1-alpha.3","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"}],"dist":{"shasum":"6f634fee15942608e9118453676cb07ee2db3ca7","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.0.1-alpha.3.tgz","fileCount":24,"integrity":"sha512-WjzCxp4XbMQuOAf2tziwBF+DTO6zbKKvKYGpoA/g43G/0uZurixYd4knM9MjlrIdHkXQ5lBk2N5HR7eaUv0zIA==","signatures":[{"sig":"MEQCIHkBWQlaxwUXyLEqRM5XGMLkm+9dqMsDjQRR/oOsLCFgAiB2Nmcrp45lUWZEIPDdPj1xEp9VEekfHOz9zF24HTVfLg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120849},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types/*":"./build/src/types/*.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"ac2d041afbc021ec47413b548713b5065a59fd1f","scripts":{"lint":"eslint .","test":"c8 node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.3.0","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@lukeed/ms":"^2.0.2","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","readmeFilename":"README.md","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@poppinss/ts-exec":"^1.4.1","@adonisjs/tsconfig":"^2.0.0-next.3","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.0.1-alpha.3_1765579809349_0.011770220731682324","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.4":{"name":"@boringnode/queue","version":"0.0.1-alpha.4","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.0.1-alpha.4","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"dist":{"shasum":"13d19849b29413d3dd0073407273217486e78693","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.0.1-alpha.4.tgz","fileCount":31,"integrity":"sha512-FNSqSvYD3jrQ8KLyfRfLVY4zKU6zWkHqcxj6HF6CRb2MsqL9A0GZK8/JTjCssvIrEa4CTNldMqxKt4pMj5jUlg==","signatures":[{"sig":"MEQCICcaWJ7xRVCshOfBh7V/kHzGScOBOFG41r9v4SFgAYa4AiAf1ewM07umbkSnJGPM/18uk1zYjn8iZq87md3N72iRAA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":222436},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"5cec96392d565ef75ed28b91555d0eb265e3f1db","scripts":{"lint":"eslint .","test":"c8 node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@lukeed/ms":"^2.0.2","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","readmeFilename":"README.md","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@poppinss/ts-exec":"^1.4.1","@adonisjs/tsconfig":"^2.0.0-next.3","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.0.1-alpha.4_1767302408934_0.25272128935941307","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@boringnode/queue","version":"0.1.0","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.1.0","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"dist":{"shasum":"c4e23f6d36a9019ada5950af0d33fee8fa81f9f4","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.1.0.tgz","fileCount":31,"integrity":"sha512-yVn93OEcE4CNAeKnRV5SDkwhxqJTHbqRLxFBAqrPVzAIyXvpUeOtXWapUi17HyWGu2TQ1EG9+vrPfZz2Na8N5Q==","signatures":[{"sig":"MEUCIHsKQqS5c+Kz/uwKfpnU7ebnGHT5ppQRVEib/RSnTPjUAiEAjkzzH0vgNMZmBtUiWRpcKgtftcKcQ8qkVtylgajyGtU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":303005},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"8ed41d0fc36d27f632e13bc9d25c78219dff4131","scripts":{"lint":"eslint .","test":"c8 node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.4.0","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@poppinss/ts-exec":"^1.4.1","@adonisjs/tsconfig":"^2.0.0-next.3","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.0_1767355667037_0.6844100943591562","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@boringnode/queue","version":"0.2.0","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.2.0","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"dist":{"shasum":"9e3d82f41380f043d8217d12f783cb6ae5815caf","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.2.0.tgz","fileCount":31,"integrity":"sha512-JGd9gI/zvNxeNq7J5QLedQ4l4sd6hIopTUovRyqr4kBnzMRxCcunePwrFMUpN8J34NR7lVbgLybPb/cyyBs+FQ==","signatures":[{"sig":"MEYCIQDcT22Jo/svn+uQZi9NXhFO1/x37LjwkBwE4ePQ7aWqQQIhANEH/inSuhE2lvMoj1TQVYe6HzIPf8IMuBA7RFdhhatt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311043},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"00446c36e7cfd0355022c57ccaf04196c952368e","scripts":{"lint":"eslint .","test":"c8 node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.4.0","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@poppinss/ts-exec":"^1.4.1","@adonisjs/tsconfig":"^2.0.0-next.3","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.2.0_1767430424077_0.15502707877425914","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@boringnode/queue","version":"0.3.0","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.3.0","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"dist":{"shasum":"bac3f52e007a51dcf2b54a28dd68991ee5084790","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.3.0.tgz","fileCount":31,"integrity":"sha512-+crqxCHs9D4D4wf2b4V+3QeApjSnUoyUDwNeldaycUhgCsbMSA+Z8y9gYueBneO8bAw7YAUreXiACW1JXAY9MA==","signatures":[{"sig":"MEUCIGvyKJNGPrteq1LWNtSdUUotxNPvcO8sXk5gJvr3WYfGAiEA8538Z8mPfXB3CO2UXTD3U4p+pjEtplGCgIRlsCp5e6c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":360210},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"a0bc28cbccf22244245f81bb680f795d703f9da9","scripts":{"lint":"eslint .","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.4.0","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@poppinss/ts-exec":"^1.4.1","@adonisjs/tsconfig":"^2.0.0-next.3","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.3.0_1768494954213_0.41160647463198985","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@boringnode/queue","version":"0.3.1","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.3.1","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"dist":{"shasum":"53e6f74ea9b05f8da3f5901d0659b65d18443b5c","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.3.1.tgz","fileCount":31,"integrity":"sha512-3ZDZ1XauCG9r0U635ygQM5r9TXxHV3pAstN60mYvqkMi/H5ixjo9eJrucIdwOGiVBFW3qS0B+jTKtj+QygOKMQ==","signatures":[{"sig":"MEUCIQDZzLaFlYSfF0fHJmEHlQveP/izRd9Wp3G6l98fDmYehwIgcuwceWRRl9R43IhvzBz3+cK0VA/Vn15FgeRGHQWmXWs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":360249},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"ca6254a60f645334ccdce7bb6c8d2f2350bae9ac","scripts":{"lint":"eslint .","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.4.0","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@poppinss/ts-exec":"^1.4.1","@adonisjs/tsconfig":"^2.0.0-next.3","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.3.1_1768498657775_0.921102704849512","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@boringnode/queue","version":"0.3.2","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.3.2","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"dist":{"shasum":"22c49a96f774157068c2d60114565aa6c25cdebd","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.3.2.tgz","fileCount":32,"integrity":"sha512-02KvvnPCW+GsZBGL5X6vVxdCBt0Rx7k1p9kS6urjDb+b2hnXx1My8Jj8XfF40ZxDSmW1J4q8kOfAMvY8SDVFaw==","signatures":[{"sig":"MEUCIFGez8vjLL5j8fh2TcQih1YbhskkqwpnrZxmcD0xsjcaAiEA9eSseGBTFwPzEC8e11p2k2AQswVY8diLsMscHjMzaLM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":411773},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"ec9cc57345c247431a86fe3a099abc4d4ab3a259","scripts":{"lint":"eslint .","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.4.0","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@poppinss/ts-exec":"^1.4.1","@adonisjs/tsconfig":"^2.0.0-next.3","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.3.2_1768933433050_0.973874511829482","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@boringnode/queue","version":"0.3.3","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.3.3","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"dist":{"shasum":"6fc39dc84fc1fcc5c9d01eab7764c241954c21d9","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.3.3.tgz","fileCount":32,"integrity":"sha512-/hqTWxuTY6HPH8cAVPjw8/b7f+W2LjM7bmdzgifr3ZhqHyg2csz3XK2uePqI2NjThnlgnv39BAgm+co0xmXS/A==","signatures":[{"sig":"MEUCIQDBK8Rc5pOuISP7YDNz+7Bv/FPR1eddR+lRcmY5DNKFzwIgPH9ZkeYz9zjqcQ72STqs0CQLOEUSFyoeTV33SndeIhs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":412066},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"b5ba7b53aed68dcf3058fe074d6a14383f20b139","scripts":{"lint":"eslint .","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.4.0","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@poppinss/ts-exec":"^1.4.1","@adonisjs/tsconfig":"^2.0.0-next.3","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.3.3_1768939882264_0.552750648180824","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@boringnode/queue","version":"0.3.4","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.3.4","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"dist":{"shasum":"13b01a9328233c90882df1bd00addd4042df65c0","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.3.4.tgz","fileCount":32,"integrity":"sha512-YgHK2K+/HOglm17CZ0M5kLLI+HZY6G8IJqNqk8PQlIoBZ4QFiKILGKuIY9j2Q+pH7HtJU98clIhxo7mJoLoT6A==","signatures":[{"sig":"MEYCIQCNROp8+040aV6yxdVRbbdoboDCWj7e8XV2tLGhS4ADCAIhAJc5Y/SyBF7x7KJK8fX5dVuefLOYiqNpuMZZX6mVcahl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":413320},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"b4dc6d322aa59c747dd4308b06f7ce096bc96736","scripts":{"lint":"eslint .","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"prettier --write .","release":"yarn dlx release-it","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.4.0","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.4+sha512.7b1cb0b62abba6a537b3a2ce00811a843bea02bcf53138581a6ae5b1bf563f734872bd47de49ce32a9ca9dcaff995aa789577ffb16811da7c603dcf69e73750b","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","bullmq":"^5.65.1","eslint":"^9.35.0","del-cli":"^7.0.0","ioredis":"^5.7.0","prettier":"^3.6.2","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","testcontainers":"^11.5.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@poppinss/ts-exec":"^1.4.1","@adonisjs/tsconfig":"^2.0.0-next.3","@types/better-sqlite3":"^7.6.13","@adonisjs/eslint-config":"^2.1.2","@adonisjs/prettier-config":"^1.4.5"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.3.4_1769152850472_0.36438851542235473","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@boringnode/queue","version":"0.4.0","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.4.0","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"dist":{"shasum":"b4f36d38f138b33843f874259b160f9fe30d2059","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.4.0.tgz","fileCount":32,"integrity":"sha512-2uHFPtCfky4og023wyVCpTdG4g3kzgKtonHCtdEE53rFqRp8p90F9oeKAYziYFOc/3jRydEm7JnJz5/8P/dctQ==","signatures":[{"sig":"MEUCIQDWTbdD0ux357nEpKtSkbcuxgQCOD95DJcOxEXbBSe8uQIgI/jrEhCy1fDtzoeo4G5PtkuxeOfOu1B0pKS2UYuXU5A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":413948},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"c331503c2ceb97bc81d86df1fe490d2798a842c2","scripts":{"lint":"oxlint","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"oxfmt --check .","release":"yarn dlx release-it","lint:fix":"oxlint --fix","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","format:fix":"oxfmt --write .","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.4.0","@poppinss/utils":"^6.10.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0+sha512.f45ab632439a67f8bc759bf32ead036a1f413287b9042726b7cc4818b7b49e14e9423ba49b18f9e06ea4941c1ad062385b1d8760a8d5091a1a31e5f6219afca8","devDependencies":{"c8":"^10.1.3","pg":"^8.16.3","knex":"^3.1.0","tsup":"^8.5.1","oxfmt":"^0.26.0","bullmq":"^5.65.1","oxlint":"^1.41.0","del-cli":"^7.0.0","ioredis":"^5.7.0","@types/pg":"^8","release-it":"^19.0.4","typescript":"^5.9.2","@types/node":"^24.3.1","@japa/assert":"^4.1.1","@japa/runner":"^4.4.0","better-sqlite3":"^12.5.0","oxlint-tsgolint":"^0.11.1","@japa/expect-type":"^2.0.3","@japa/file-system":"^2.3.2","@poppinss/ts-exec":"^1.4.1","@adonisjs/tsconfig":"^2.0.0-next.3","@types/better-sqlite3":"^7.6.13"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.4.0_1769498079392_0.854697322425793","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@boringnode/queue","version":"0.4.1","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.4.1","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"homepage":"https://github.com/boringnode/queue#readme","bugs":{"url":"https://github.com/boringnode/queue/issues"},"dist":{"shasum":"89eb32266240a49dd1a13319ae5d75ebeea560d4","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.4.1.tgz","fileCount":32,"integrity":"sha512-ZC9kh0rMrI+V7iX4eXCmRABXDSW7RldUbRC6MdRqYypxNvlZI7XTiuP+BByvSfEfzzRufpPNT5494gSJXVspRA==","signatures":[{"sig":"MEQCIHNrfomAbMKYeYpy/EBvvaTpFbCEN4kRwV07o76yobrrAiBZD7mgvZ8xwa5GgbQX8uw09CKrTe75mzS1SmPfMw6KBA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":422250},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"cdff7ff8cce78b355c13692c58059e9d1a04497e","scripts":{"lint":"oxlint","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"oxfmt --check .","release":"yarn dlx release-it","lint:fix":"oxlint --fix","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","format:fix":"oxfmt --write .","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"repository":{"url":"git+https://github.com/boringnode/queue.git","type":"git"},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.5.0","@poppinss/utils":"^7.0.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"c8":"^11.0.0","pg":"^8.19.0","knex":"^3.1.0","tsup":"^8.5.1","oxfmt":"^0.36.0","bullmq":"^5.70.1","oxlint":"^1.51.0","del-cli":"^7.0.0","ioredis":"^5.10.0","@types/pg":"^8.18.0","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^24.11.0","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","better-sqlite3":"^12.6.2","oxlint-tsgolint":"^0.15.0","@japa/expect-type":"^2.0.4","@japa/file-system":"^3.0.0","@poppinss/ts-exec":"^1.4.4","@adonisjs/tsconfig":"^2.0.0","@types/better-sqlite3":"^7.6.13"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.4.1_1772565622264_0.722435028236796","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@boringnode/queue","version":"0.5.0","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.5.0","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"homepage":"https://github.com/boringnode/queue#readme","bugs":{"url":"https://github.com/boringnode/queue/issues"},"dist":{"shasum":"a29356d9f0584674c7edea2e5b30317bb7a8cd3a","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.5.0.tgz","fileCount":34,"integrity":"sha512-133uUD5G8cteYJ7q3chGddKlfKxVwzLlc1eEaT6zmtpifGcTDfFLQyeMUH0SrjLQzEarjswVFvhIwysL2A4i6w==","signatures":[{"sig":"MEYCIQCfQXdBcNHSkV1PMo8E5YXLOUR02o/cPKgAgQxBoRQ0AwIhAIucHnhOChZNqmXj21jlvAftGOfmGwZy4/D1OGyZXpS0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":439939},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"a6892be62c0adf0ebe8cd001a91db470d3f29169","scripts":{"lint":"oxlint","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"oxfmt --check .","release":"yarn dlx release-it","lint:fix":"oxlint --fix","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","format:fix":"oxfmt --write .","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"repository":{"url":"git+https://github.com/boringnode/queue.git","type":"git"},"_npmVersion":"11.6.2","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.5.0","@poppinss/utils":"^7.0.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"c8":"^11.0.0","pg":"^8.19.0","knex":"^3.1.0","tsup":"^8.5.1","oxfmt":"^0.36.0","bullmq":"^5.70.1","oxlint":"^1.51.0","del-cli":"^7.0.0","ioredis":"^5.10.0","@types/pg":"^8.18.0","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^24.11.0","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","better-sqlite3":"^12.6.2","oxlint-tsgolint":"^0.15.0","@japa/expect-type":"^2.0.4","@japa/file-system":"^3.0.0","@poppinss/ts-exec":"^1.4.4","@adonisjs/tsconfig":"^2.0.0","@types/better-sqlite3":"^7.6.13"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.5.0_1772978792546_0.22945205523685286","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@boringnode/queue","version":"0.5.1","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.5.1","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"homepage":"https://github.com/boringnode/queue#readme","bugs":{"url":"https://github.com/boringnode/queue/issues"},"dist":{"shasum":"7a5a8052858229b1d0e113d81f51a08355b42f09","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.5.1.tgz","fileCount":44,"integrity":"sha512-Bz4fjpsj1CKwpOLaTV0YAy0znz6N8785Hy1zhQIig5EoxEH6DlzxCftLnHd1H+/w2PmUEYIEAiew+k78+kMyqA==","signatures":[{"sig":"MEYCIQD4eCE33Tgap+uSIhEiekxpeTbyb2FvvIem9OQMsN3XDQIhAInSiLesbD7IU0MqWa2s+Jvqsu5tOs/IsnE99PuWcgec","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boringnode%2fqueue@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":483809},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./otel":"./build/src/otel.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"917abd98ddd5d666c992a1fb6a1d64e9c4d3b520","scripts":{"lint":"oxlint","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"oxfmt --check .","release":"yarn dlx release-it","lint:fix":"oxlint --fix","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","format:fix":"oxfmt --write .","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:eeeaa45c-85af-480b-a0e1-78b842108417"}},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"npm":{"publish":true,"skipChecks":true},"github":{"web":true,"release":true,"releaseName":"v${version}"}},"repository":{"url":"git+https://github.com/boringnode/queue.git","type":"git"},"_npmVersion":"11.9.0","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.14.0","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.5.0","@poppinss/utils":"^7.0.1"},"publishConfig":{"tag":"latest","access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"c8":"^11.0.0","pg":"^8.20.0","knex":"3.1.0","tsup":"^8.5.1","oxfmt":"^0.41.0","bullmq":"^5.71.0","oxlint":"^1.56.0","del-cli":"^7.0.0","ioredis":"^5.10.1","@types/pg":"^8.20.0","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.5.0","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","better-sqlite3":"^12.8.0","oxlint-tsgolint":"^0.17.1","@japa/expect-type":"^2.0.4","@japa/file-system":"^3.0.0","@poppinss/ts-exec":"^1.4.4","@adonisjs/tsconfig":"^2.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^2.6.0","@types/better-sqlite3":"^7.6.13","@opentelemetry/sdk-trace-base":"^2.6.0","@opentelemetry/instrumentation":"^0.213.0","@opentelemetry/context-async-hooks":"^2.6.0"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^1.30.0 || ^2.0.0","@opentelemetry/instrumentation":"^0.200.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/core":{"optional":true},"@opentelemetry/instrumentation":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.5.1_1774273574012_0.35988289044513144","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@boringnode/queue","version":"0.5.2","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.5.2","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz+npm@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"homepage":"https://github.com/boringnode/queue#readme","bugs":{"url":"https://github.com/boringnode/queue/issues"},"dist":{"shasum":"e9dd4c18180f2bb12d80d1e7caa0e5ad9461b689","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.5.2.tgz","fileCount":44,"integrity":"sha512-dQ5beCSQc9ry86VJrcrTfpWVrf/hFQwl5hKVeaA4oiPFPSbD6b6d+S2t7YjBkcRDzzqPxWI88IqxAFiW/xZ0/A==","signatures":[{"sig":"MEUCIQC4EO94JNEOo25Y+4UiBc6r5wEEuKldXOXXR2ZI2wjiuwIgZi5yh6BCbUizA1cxEE/xHJcTrH5UiRHIibPxwn+7+PU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boringnode%2fqueue@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":492620},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./otel":"./build/src/otel.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"12f8566296748ebc23c4cc5fb8034ecd66ad7f2b","scripts":{"lint":"oxlint","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"oxfmt --check .","release":"yarn dlx release-it","lint:fix":"oxlint --fix","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","format:fix":"oxfmt --write .","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:eeeaa45c-85af-480b-a0e1-78b842108417"}},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"npm":{"publish":true,"skipChecks":true},"github":{"release":true,"releaseName":"v${version}"}},"repository":{"url":"git+https://github.com/boringnode/queue.git","type":"git"},"_npmVersion":"11.11.0","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.5.0","@poppinss/utils":"^7.0.1"},"publishConfig":{"tag":"latest","access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"c8":"^11.0.0","pg":"^8.20.0","knex":"3.1.0","tsup":"^8.5.1","oxfmt":"^0.41.0","bullmq":"^5.71.0","oxlint":"^1.56.0","del-cli":"^7.0.0","ioredis":"^5.10.1","@types/pg":"^8.20.0","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.5.0","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","better-sqlite3":"^12.8.0","oxlint-tsgolint":"^0.17.1","@japa/expect-type":"^2.0.4","@japa/file-system":"^3.0.0","@poppinss/ts-exec":"^1.4.4","@adonisjs/tsconfig":"^2.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^2.6.0","@types/better-sqlite3":"^7.6.13","@opentelemetry/sdk-trace-base":"^2.6.0","@opentelemetry/instrumentation":"^0.213.0","@opentelemetry/context-async-hooks":"^2.6.0"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^1.30.0 || ^2.0.0","@opentelemetry/instrumentation":"^0.200.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/core":{"optional":true},"@opentelemetry/instrumentation":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.5.2_1778529183250_0.8348272143845612","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@boringnode/queue","version":"0.6.0","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.6.0","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"homepage":"https://github.com/boringnode/queue#readme","bugs":{"url":"https://github.com/boringnode/queue/issues"},"dist":{"shasum":"414499ab9ac7cb39e9fe4eefe8e990d893c26d0c","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.6.0.tgz","fileCount":54,"integrity":"sha512-hgd9zKJUgZH8Y6ua2UKS1LJ4/fonVkJJnXRUxgmEyPpsJcle27WJ4KS30LRtTlCzX188pLUlj4CBzGMNyzVlEA==","signatures":[{"sig":"MEUCIQCryozZGKU2Tb4YgOzHkmM8Aabf6SIVEbhBqILmqD+hkAIgHseOmhLPAbgCF2r3yM0dl8Zpp/jEvsG14BOTdPvS+oI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boringnode%2fqueue@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":623396},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./otel":"./build/src/otel.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"a400cf5e0782697524915391d6240f431d6c058a","scripts":{"lint":"oxlint","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"oxfmt --check .","release":"yarn dlx release-it","lint:fix":"oxlint --fix","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","format:fix":"oxfmt --write .","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:eeeaa45c-85af-480b-a0e1-78b842108417"}},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"npm":{"publish":true,"skipChecks":true},"github":{"release":true,"releaseName":"v${version}"}},"repository":{"url":"git+https://github.com/boringnode/queue.git","type":"git"},"_npmVersion":"11.13.0","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.17.0","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.6.1","@poppinss/utils":"^7.0.1"},"publishConfig":{"tag":"latest","access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"yarn@4.17.0","devDependencies":{"c8":"^11.0.0","pg":"^8.22.0","knex":"3.1.0","tsup":"^8.5.1","oxfmt":"^0.56.0","bullmq":"^5.79.2","oxlint":"^1.71.0","del-cli":"^7.0.0","ioredis":"^5.11.1","@types/pg":"^8.20.0","release-it":"^20.2.1","typescript":"^5.9.3","@types/node":"^25.9.4","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","better-sqlite3":"^12.11.1","oxlint-tsgolint":"^0.17.4","@japa/expect-type":"^2.0.4","@japa/file-system":"^3.0.0","@poppinss/ts-exec":"^1.4.4","@adonisjs/tsconfig":"^2.0.0","@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.8.0","@types/better-sqlite3":"^7.6.13","@opentelemetry/sdk-trace-base":"^2.8.0","@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/context-async-hooks":"^2.8.0"},"peerDependencies":{"knex":"^3.0.0","ioredis":"^5.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^1.30.0 || ^2.0.0","@opentelemetry/instrumentation":"^0.200.0"},"peerDependenciesMeta":{"knex":{"optional":true},"ioredis":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/core":{"optional":true},"@opentelemetry/instrumentation":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.6.0_1782672747876_0.6776740584727543","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@boringnode/queue","version":"0.7.0","keywords":["queue","job","task","worker","redis"],"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","_id":"@boringnode/queue@0.7.0","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"homepage":"https://github.com/boringnode/queue#readme","bugs":{"url":"https://github.com/boringnode/queue/issues"},"dist":{"shasum":"06dfadbe3ae610a3647a41cbcf7002c1a87a4f78","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.7.0.tgz","fileCount":55,"integrity":"sha512-FXDdvwtZpWneRAIa61wv6sdETv4LSMPqn0m6wTXRDeD4azzMKo2OWkKRFtr/ZGG8A96nX1L7HylUJDti8iTlcA==","signatures":[{"sig":"MEQCIB4NKZpzHaZRe57ZIltGNNC4oN9U2k/FgcX8ymf5pQesAiBfEEFtOOgX98luZAcUzgB6PV7NLa3AUxYyLJ7HJyaQIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boringnode%2fqueue@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":723656},"main":"build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./otel":"./build/src/otel.js","./types":"./build/src/types/index.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js"},"gitHead":"f86e54ec867505583eb9f5b528c179ce374f9414","scripts":{"lint":"oxlint","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","build":"yarn clean && tsup-node","clean":"del-cli build","format":"oxfmt --check .","release":"yarn dlx release-it","lint:fix":"oxlint --fix","benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","typecheck":"tsc --noEmit","format:fix":"oxfmt --write .","test:coverage":"c8 yarn test","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","prepublishOnly":"yarn build","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:eeeaa45c-85af-480b-a0e1-78b842108417"}},"release-it":{"git":{"tagName":"v${version}","commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}"},"npm":{"publish":true,"skipChecks":true},"github":{"release":true,"releaseName":"v${version}"}},"repository":{"url":"git+https://github.com/boringnode/queue.git","type":"git"},"_npmVersion":"11.16.0","description":"A simple and efficient queue system for Node.js applications","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@lukeed/ms":"^2.0.2","cron-parser":"^5.6.1","@poppinss/utils":"^7.0.1"},"publishConfig":{"tag":"latest","access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"yarn@4.17.0","devDependencies":{"c8":"^11.0.0","pg":"^8.22.0","knex":"3.1.0","tsup":"^8.5.1","oxfmt":"^0.56.0","bullmq":"^5.79.2","kysely":"^0.29.2","mysql2":"^3.0.0","oxlint":"^1.71.0","del-cli":"^7.0.0","ioredis":"^5.11.1","hot-hook":"^1.0.0","@types/pg":"^8.20.0","release-it":"^20.2.1","typescript":"^5.9.3","@types/node":"^25.9.4","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","better-sqlite3":"^12.11.1","oxlint-tsgolint":"^0.17.4","@japa/expect-type":"^2.0.4","@japa/file-system":"^3.0.0","@poppinss/ts-exec":"^1.4.4","@adonisjs/tsconfig":"^2.0.0","@opentelemetry/api":"^1.9.1","@opentelemetry/core":"^2.8.0","@types/better-sqlite3":"^7.6.13","@opentelemetry/sdk-trace-base":"^2.8.0","@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/context-async-hooks":"^2.8.0"},"peerDependencies":{"knex":"^3.0.0","kysely":"^0.29.0","ioredis":"^5.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^1.30.0 || ^2.0.0","@opentelemetry/instrumentation":"^0.200.0"},"peerDependenciesMeta":{"knex":{"optional":true},"kysely":{"optional":true},"ioredis":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/core":{"optional":true},"@opentelemetry/instrumentation":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/queue_0.7.0_1785395914222_0.22327711520542604","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@boringnode/queue","description":"A simple and efficient queue system for Node.js applications","version":"0.7.1","main":"build/index.js","type":"module","exports":{".":"./build/index.js","./otel":"./build/src/otel.js","./drivers/*":"./build/src/drivers/*.js","./contracts/*":"./build/src/contracts/*.js","./types":"./build/src/types/index.js"},"scripts":{"benchmark":"node --import=@poppinss/ts-exec benchmark/run.ts","benchmark:quick":"node --import=@poppinss/ts-exec benchmark/run.ts --quick","benchmark:full":"node --import=@poppinss/ts-exec benchmark/run.ts --full","build":"yarn clean && tsup-node","clean":"del-cli build","lint":"oxlint","lint:fix":"oxlint --fix","format":"oxfmt --check .","format:fix":"oxfmt --write .","prepublishOnly":"yarn build","release":"yarn dlx release-it","test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts --reporters=dot","test:coverage":"c8 yarn test","typecheck":"tsc --noEmit"},"dependencies":{"@lukeed/ms":"^2.0.2","@poppinss/utils":"^7.0.1","cron-parser":"^5.6.1"},"devDependencies":{"@adonisjs/tsconfig":"^2.0.0","@japa/assert":"^4.2.0","@japa/expect-type":"^2.0.4","@japa/file-system":"^3.0.0","@japa/runner":"^5.3.0","@opentelemetry/api":"^1.9.1","@opentelemetry/context-async-hooks":"^2.8.0","@opentelemetry/core":"^2.8.0","@opentelemetry/instrumentation":"^0.219.0","@opentelemetry/sdk-trace-base":"^2.8.0","@poppinss/ts-exec":"^1.4.4","@types/better-sqlite3":"^7.6.13","@types/node":"^25.9.4","@types/pg":"^8.20.0","better-sqlite3":"^12.11.1","bullmq":"^5.79.2","c8":"^11.0.0","del-cli":"^7.0.0","hot-hook":"^1.0.0","ioredis":"^5.11.1","knex":"3.1.0","kysely":"^0.29.2","mysql2":"^3.0.0","oxfmt":"^0.56.0","oxlint":"^1.71.0","oxlint-tsgolint":"^0.17.4","pg":"^8.22.0","release-it":"^20.2.1","tsup":"^8.5.1","typescript":"^5.9.3"},"peerDependencies":{"@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^1.30.0 || ^2.0.0","@opentelemetry/instrumentation":"^0.200.0","ioredis":"^5.0.0","knex":"^3.0.0","kysely":"^0.29.0"},"peerDependenciesMeta":{"@opentelemetry/api":{"optional":true},"@opentelemetry/core":{"optional":true},"@opentelemetry/instrumentation":{"optional":true},"ioredis":{"optional":true},"knex":{"optional":true},"kysely":{"optional":true}},"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","homepage":"https://github.com/boringnode/queue#readme","bugs":{"url":"https://github.com/boringnode/queue/issues"},"repository":{"type":"git","url":"git+https://github.com/boringnode/queue.git"},"keywords":["queue","job","task","worker","redis"],"publishConfig":{"access":"public","tag":"latest","provenance":true},"release-it":{"git":{"commitMessage":"chore(release): ${version}","tagAnnotation":"v${version}","tagName":"v${version}"},"github":{"release":true,"releaseName":"v${version}"},"npm":{"publish":true,"skipChecks":true}},"packageManager":"yarn@4.17.0","engines":{"node":">=24.0.0"},"gitHead":"bf341bd9044e1d9ea5e29fecf06a1ff4cff5ae93","types":"./build/index.d.ts","_id":"@boringnode/queue@0.7.1","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-n3hGc4FA1kQgd9iZW/D0cTj0v5o4+ZWgOJqe9lnzRrY2fJ9vU9nISlkMMYkCxJcpoSOklC/zBHaTEFXf9j4AMQ==","shasum":"93026f17c0f285bd9e67fc87b451609568e5066b","tarball":"https://registry.npmjs.org/@boringnode/queue/-/queue-0.7.1.tgz","fileCount":55,"unpackedSize":742902,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boringnode%2fqueue@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAPUwFBqHWmPjE8xoNnOF+XFfhhiQnMEEc6WDc2mslGnAiEAwmMqp6wx3vpl0jLmUdg/WXZ5B3UHVxmB5dQC6falle4="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:eeeaa45c-85af-480b-a0e1-78b842108417"}},"directories":{},"maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/queue_0.7.1_1786001879880_0.9702622092796425"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-21T15:08:36.886Z","modified":"2026-08-06T07:38:00.540Z","0.0.1-alpha":"2025-11-21T15:08:37.163Z","0.0.1-alpha.0":"2025-12-07T21:09:48.262Z","0.0.1-alpha.1":"2025-12-07T23:35:08.836Z","0.0.1-alpha.2":"2025-12-12T22:11:03.604Z","0.0.1-alpha.3":"2025-12-12T22:50:09.538Z","0.0.1-alpha.4":"2026-01-01T21:20:09.097Z","0.1.0":"2026-01-02T12:07:47.199Z","0.2.0":"2026-01-03T08:53:44.237Z","0.3.0":"2026-01-15T16:35:54.393Z","0.3.1":"2026-01-15T17:37:38.045Z","0.3.2":"2026-01-20T18:23:53.204Z","0.3.3":"2026-01-20T20:11:22.415Z","0.3.4":"2026-01-23T07:20:50.670Z","0.4.0":"2026-01-27T07:14:39.548Z","0.4.1":"2026-03-03T19:20:22.427Z","0.5.0":"2026-03-08T14:06:32.693Z","0.5.1":"2026-03-23T13:46:14.181Z","0.5.2":"2026-05-11T19:53:03.448Z","0.6.0":"2026-06-28T18:52:28.044Z","0.7.0":"2026-07-30T07:18:34.409Z","0.7.1":"2026-08-06T07:38:00.083Z"},"bugs":{"url":"https://github.com/boringnode/queue/issues"},"author":{"name":"Romain Lanz","email":"romain.lanz@pm.me"},"license":"MIT","homepage":"https://github.com/boringnode/queue#readme","keywords":["queue","job","task","worker","redis"],"repository":{"type":"git","url":"git+https://github.com/boringnode/queue.git"},"description":"A simple and efficient queue system for Node.js applications","maintainers":[{"name":"julien-r44","email":"julien@ripouteau.com"},{"name":"romainlanz","email":"romain.lanz@pm.me"},{"name":"virk","email":"virk@adonisjs.com"}],"readme":"# @boringnode/queue\n\n<div align=\"center\">\n\n[![typescript-image]][typescript-url]\n[![gh-workflow-image]][gh-workflow-url]\n[![npm-image]][npm-url]\n[![npm-download-image]][npm-download-url]\n[![license-image]][license-url]\n\n</div>\n\nA simple and efficient queue system for Node.js applications. Built for simplicity and ease of use, `@boringnode/queue` allows you to dispatch background jobs and process them asynchronously with support for multiple queue adapters.\n\n## Installation\n\n```bash\nnpm install @boringnode/queue\n```\n\n## Features\n\n- **Multiple Queue Adapters**: Redis, Knex, Kysely (PostgreSQL, MySQL, SQLite), and Sync\n- **Type-Safe Jobs**: TypeScript classes with typed payloads\n- **Delayed Jobs**: Schedule jobs to run after a delay\n- **Priority Queues**: Process high-priority jobs first\n- **Bulk Dispatch**: Efficiently dispatch thousands of jobs at once\n- **Job Grouping**: Organize related jobs for monitoring\n- **Job Deduplication**: Prevent duplicate jobs with custom IDs\n- **Retry with Backoff**: Exponential, linear, or fixed backoff strategies\n- **Job Timeout**: Fail or retry jobs that exceed a time limit\n- **Job History**: Retain completed/failed jobs for debugging\n- **Scheduled Jobs**: Cron or interval-based recurring jobs\n- **Auto-Discovery**: Automatically register jobs from specified locations\n- **Development Hot Reload**: Run the latest job implementation without restarting workers\n\n## Quick Start\n\n### 1. Define a Job\n\n```typescript\nimport { Job } from '@boringnode/queue'\nimport type { JobOptions } from '@boringnode/queue/types'\n\ninterface SendEmailPayload {\n  to: string\n}\n\nexport default class SendEmailJob extends Job<SendEmailPayload> {\n  static options: JobOptions = {\n    queue: 'email',\n  }\n\n  async execute(): Promise<void> {\n    console.log(`Sending email to: ${this.payload.to}`)\n  }\n}\n```\n\n> [!NOTE]\n> The job name defaults to the class name (`SendEmailJob`). You can override it with `name: 'CustomName'` in options.\n\n> [!WARNING]\n> If you minify your code in production, class names may be mangled. Always specify `name` explicitly in your job options.\n\n### 2. Configure the Queue Manager\n\n```typescript\nimport { QueueManager } from '@boringnode/queue'\nimport { redis } from '@boringnode/queue/drivers/redis_adapter'\n\nawait QueueManager.init({\n  default: 'redis',\n  adapters: {\n    redis: redis({ host: 'localhost', port: 6379 }),\n  },\n  locations: ['./app/jobs/**/*.ts'],\n})\n```\n\n### 3. Dispatch Jobs\n\n```typescript\n// Simple dispatch\nawait SendEmailJob.dispatch({ to: 'user@example.com' })\n\n// With options\nawait SendEmailJob.dispatch({ to: 'user@example.com' })\n  .toQueue('high-priority')\n  .priority(1)\n  .in('5m')\n```\n\n### 4. Start a Worker\n\n```typescript\nimport { Worker } from '@boringnode/queue'\n\nconst worker = new Worker(config)\nawait worker.start(['default', 'email'])\n```\n\n## Hot Reloading Jobs\n\nDuring development, jobs discovered from `locations` can be reloaded before each execution. This\nallows a long-running worker to use the latest saved job implementation without restarting.\n\nHot reload support integrates with [Hot Hook](https://github.com/Julien-R44/hot-hook). Install and\ninitialize Hot Hook in your application, then enable `hotReload` on the queue manager.\n\n```bash\nnpm install --save-dev hot-hook\n```\n\n```typescript\nawait QueueManager.init({\n  default: 'redis',\n  adapters: {\n    redis: redis({ host: 'localhost', port: 6379 }),\n  },\n  locations: ['./app/jobs/**/*.ts'],\n  hotReload: process.env.NODE_ENV === 'development',\n})\n```\n\nThe process executing the jobs must be running with Hot Hook. For example, AdonisJS applications\ncan start their development server with HMR enabled:\n\n```bash\nnode ace serve --hmr\n```\n\nIf the worker runs in a separate process, that worker process must also initialize Hot Hook. Enabling\nHMR only in the HTTP server does not affect jobs executed by another process. Follow the\n[Hot Hook initialization guide](https://github.com/Julien-R44/hot-hook#initialization) when using it\noutside the AdonisJS development server.\n\n### How it works\n\nJobs loaded from `locations` are registered normally during `QueueManager.init()`. With\n`hotReload: true`, the worker dynamically imports the job module again before every execution. Hot\nHook invalidates changed modules and their reloadable dependencies, allowing the dynamic import to\nreturn the latest job class. The queue marks these imports as Hot Hook boundaries, so jobs do not\nneed to be repeated in Hot Hook's `boundaries` configuration. The queue does not install,\ninitialize, or run Hot Hook itself.\n\n`Locator.registerFromGlob()` can also enable this behavior directly:\n\n```typescript\nimport { Locator } from '@boringnode/queue'\n\nawait Locator.registerFromGlob(['./app/jobs/**/*.ts'], { hotReload: true })\n\nconst JobClass = await Locator.resolve('SendEmailJob')\n```\n\n### Limitations\n\n- Use `hotReload` during development only. Leave it disabled in production.\n- Only jobs discovered from `locations`, or registered with `Locator.registerFromGlob()`, can be\n  reloaded. Jobs registered manually with `Locator.register()` do not have a module path to reload.\n- A running job instance keeps the version it started with. The latest version is used by the next\n  execution.\n- Adding, deleting, moving, or renaming a job requires a process restart so the job registry can be\n  rebuilt.\n- Changing a job's configured `name` also requires a restart. Already queued jobs continue to refer\n  to the name stored when they were dispatched.\n- Avoid import-time side effects in job modules, since their module code may execute again after an\n  invalidation.\n\n## Bulk Dispatch\n\nEfficiently dispatch thousands of jobs in a single batch operation:\n\n```typescript\nconst { jobIds } = await SendEmailJob.dispatchMany([\n  { to: 'user1@example.com' },\n  { to: 'user2@example.com' },\n  { to: 'user3@example.com' },\n])\n  .group('newsletter-jan-2025')\n  .toQueue('emails')\n  .priority(3)\n\nconsole.log(`Dispatched ${jobIds.length} jobs`)\n```\n\nThis uses Redis MULTI/EXEC or SQL batch insert for optimal performance.\n\n## Job Grouping\n\nOrganize related jobs together for monitoring and filtering:\n\n```typescript\n// Group newsletter jobs\nawait SendEmailJob.dispatch({ to: 'user@example.com' }).group('newsletter-jan-2025')\n\n// Group with bulk dispatch\nawait SendEmailJob.dispatchMany(recipients).group('newsletter-jan-2025')\n```\n\nThe `groupId` is stored with job data and accessible via `job.data.groupId`.\n\n## Job Deduplication\n\nPrevent the same job from being pushed multiple times. Four modes, all via `.dedup()`:\n\n### Simple (skip while job exists)\n\n```typescript\n// First dispatch - job is created\nawait SendInvoiceJob.dispatch({ orderId: 123 }).dedup({ id: 'order-123' }).run()\n\n// Second dispatch with same dedup ID - silently skipped\nawait SendInvoiceJob.dispatch({ orderId: 123 }).dedup({ id: 'order-123' }).run()\n```\n\n### Throttle (skip within TTL window)\n\n```typescript\n// Within 5s, duplicates are skipped. After 5s, a new job is created.\nawait SendEmailJob.dispatch({ to: 'user@example.com' })\n  .dedup({ id: 'welcome-123', ttl: '5s' })\n  .run()\n```\n\n### Extend (reset TTL on duplicate)\n\n```typescript\n// Each duplicate push resets the TTL timer.\nawait RateLimitJob.dispatch({ userId: 42 }).dedup({ id: 'rate-42', ttl: '1m', extend: true }).run()\n```\n\n### Debounce (replace payload + reset TTL)\n\n```typescript\n// Within the 2s window, the latest payload overwrites the previous pending job.\nawait SaveDraftJob.dispatch({ content: 'latest draft' })\n  .dedup({ id: 'draft-42', ttl: '2s', replace: true, extend: true })\n  .run()\n```\n\n### Inspecting the outcome\n\n`DispatchResult` tells you what happened:\n\n```typescript\nconst { jobId, deduped } = await SaveDraftJob.dispatch({ content: '...' })\n  .dedup({ id: 'draft-42', ttl: '2s', replace: true })\n  .run()\n\n// deduped: 'added' | 'skipped' | 'replaced' | 'extended'\n// jobId: the UUID of the job (the existing one when deduped)\n```\n\n### How it works\n\n- The dedup ID is automatically prefixed with the job name (`SendInvoiceJob::order-123`), so different job types can reuse the same key.\n- The user-supplied `id` must be ≤ 400 characters, and the combined `<jobName>::<id>` key must be ≤ 510 characters (constrained by the Knex storage column). Both limits are validated at `.dedup()` time.\n- `ttl` accepts a Duration (`'5s'`, `'1m'`) or milliseconds, and must be **positive** when provided. Use `0` or omit `ttl` if you want no expiry — `ttl: 0` is rejected to avoid an ambiguous \"expired immediately vs no-expiry\" interpretation across engines.\n- `extend` and `replace` **require** `ttl` — calling them without `ttl` throws.\n- `replace` only applies to jobs in `pending` or `delayed` state. Jobs that are active (executing) or retained in history (`completed`/`failed` with retention) are left alone; the dispatch returns `{ deduped: 'skipped' }`.\n- `replace` swaps the **payload only** — priority, queue, delay, groupId, and stored dedup options of the existing job are retained. To change those, use a different dedup id or wait for the TTL to expire.\n- `extend` resets the TTL clock but never changes the window length. The window length is fixed to the `ttl` from the first dispatch that created the dedup slot. Later dispatches that pass a different `ttl` only reset the clock; their `ttl` value is ignored. To resize the window, let the slot expire and start over with a new dispatch.\n- `extend` works in **all states** — even when the existing job is `active` (executing) or retained in history. Unlike `replace` (which is no-op on non-replaceable states), `extend` always refreshes the dedup TTL window. Use this when you want the dedup slot to keep blocking new dispatches for the lifetime of a long-running job.\n- `extend` requires the **first** dispatch to have set a `ttl`. If the slot was created without a `ttl`, later `extend` dispatches have no window to refresh and return `{ deduped: 'skipped' }` instead of `'extended'`.\n- `retryJob` does not touch the dedup entry — a retried job continues to occupy the dedup slot. TTL runs on wall-clock time, so long-running retries may outlive the TTL window. Use a generous TTL or no TTL if retries must stay deduped.\n- Atomic and race-free:\n  - **Redis**: a single Lua script per dispatch performs the dedup-key lookup, state check (pending/delayed ZSCORE), payload swap, and TTL refresh atomically.\n  - **Knex/Kysely**: transactional `SELECT ... FOR UPDATE` + insert/update inside a transaction. A savepoint catches unique-constraint violations under concurrent inserts and returns `{ deduped: 'skipped' }` pointing at the winner.\n  - **SyncAdapter**: executes inline, no dedup support.\n\n### Caveats\n\n- Without `.dedup()`, jobs use auto-generated UUIDs and are never deduplicated.\n- The **Sync adapter** ignores `.dedup()` entirely — every dispatch executes inline and `deduped` is always `undefined` on the result. Use Redis, Knex, or Kysely if you need real deduplication.\n- `.dedup()` is only available on single dispatch. `dispatchMany` / `pushManyOn` reject jobs with a `dedup` field.\n- Scheduled jobs (`.schedule()`) do not support dedup — each cron/interval fire is an independent dispatch.\n- With no `ttl`, dedup persists until the job is removed (completed/failed without retention). When retention keeps the record, re-dispatch stays blocked until the record is pruned.\n- With `ttl`, dedup expires after the window — a new job (new UUID) is created. The old job still runs.\n- Knex/Kysely MySQL concurrent race: MySQL does not support partial unique indexes, so two `pushOn` calls with the same dedup id firing at the exact same instant can both succeed. Serialize at the app layer if strict guarantees are required, or use Postgres / SQLite / Redis (all of which serialize correctly via the partial unique index or Lua atomicity).\n\n## Job History & Retention\n\nKeep completed and failed jobs for debugging:\n\n```typescript\nexport default class ImportantJob extends Job<Payload> {\n  static options: JobOptions = {\n    // Keep last 1000 completed jobs\n    removeOnComplete: { count: 1000 },\n\n    // Keep failed jobs for 7 days\n    removeOnFail: { age: '7d' },\n  }\n}\n```\n\n<details>\n<summary><strong>Retention options</strong></summary>\n\n| Value                       | Behavior           |\n| --------------------------- | ------------------ |\n| `true` (default)            | Remove immediately |\n| `false`                     | Keep forever       |\n| `{ count: n }`              | Keep last n jobs   |\n| `{ age: '7d' }`             | Keep for duration  |\n| `{ count: 100, age: '1d' }` | Both limits apply  |\n\nQuery job history:\n\n```typescript\nconst job = await adapter.getJob('job-id', 'queue-name')\nconsole.log(job.status) // 'completed' | 'failed'\nconsole.log(job.finishedAt) // timestamp\nconsole.log(job.error) // error message (if failed)\n```\n\n</details>\n\n## Adapters\n\n### Redis (recommended for production)\n\n```typescript\nimport { redis } from '@boringnode/queue/drivers/redis_adapter'\n\n// With options\nconst adapter = redis({ host: 'localhost', port: 6379 })\n\n// With existing ioredis instance\nimport { Redis } from 'ioredis'\nconst connection = new Redis({ host: 'localhost' })\nconst adapter = redis(connection)\n```\n\n### Knex (PostgreSQL, MySQL, SQLite)\n\n```typescript\nimport { knex } from '@boringnode/queue/drivers/knex_adapter'\n\nconst adapter = knex({\n  client: 'pg',\n  connection: { host: 'localhost', database: 'myapp' },\n})\n```\n\n<details>\n<summary><strong>More Knex examples</strong></summary>\n\n```typescript\n// With existing Knex instance\nimport Knex from 'knex'\nconst connection = Knex({ client: 'pg', connection: '...' })\nconst adapter = knex(connection)\n\n// Custom table name\nconst adapter = knex(config, 'custom_jobs_table')\n```\n\n</details>\n\n<details>\n<summary><strong>Database setup with QueueSchemaService</strong></summary>\n\nThe Knex adapter requires tables to be created before use. Use `QueueSchemaService` to create them:\n\n```typescript\nimport { QueueSchemaService } from '@boringnode/queue'\nimport Knex from 'knex'\n\nconst connection = Knex({ client: 'pg', connection: '...' })\nconst schemaService = new QueueSchemaService(connection)\n\n// Create tables with default names\nawait schemaService.createJobsTable()\nawait schemaService.createSchedulesTable()\n\n// Or extend with custom columns\nawait schemaService.createJobsTable('queue_jobs', (table) => {\n  table.string('tenant_id', 255).nullable()\n})\n```\n\n**AdonisJS migration example:**\n\n```typescript\nimport { BaseSchema } from '@adonisjs/lucid/schema'\nimport { QueueSchemaService } from '@boringnode/queue'\n\nexport default class extends BaseSchema {\n  async up() {\n    const schemaService = new QueueSchemaService(this.db.connection().getWriteClient())\n    await schemaService.createJobsTable()\n    await schemaService.createSchedulesTable()\n  }\n\n  async down() {\n    const schemaService = new QueueSchemaService(this.db.connection().getWriteClient())\n    await schemaService.dropSchedulesTable()\n    await schemaService.dropJobsTable()\n  }\n}\n```\n\n</details>\n\n### Kysely (PostgreSQL, MySQL, SQLite)\n\nPass the application-owned Kysely instance to the adapter factory.\n\n```typescript\nimport {\n  kysely,\n  KyselyQueueSchemaService,\n  type QueueDatabase,\n} from '@boringnode/queue/drivers/kysely_adapter'\n\ninterface Database extends QueueDatabase {\n  orders: OrderTable\n}\n\nconst adapter = kysely<Database>(db, { dialect: 'postgres' })\n```\n\nThe adapter never destroys the application-owned Kysely instance. Use `tableName` and\n`schedulesTableName` in the options when your migration uses custom names.\n\n<details>\n<summary><strong>Database setup with KyselyQueueSchemaService</strong></summary>\n\n```typescript\nconst schema = new KyselyQueueSchemaService(db, { dialect: 'postgres' })\n\nawait schema.createJobsTable()\nawait schema.createSchedulesTable()\n\n// down\nawait schema.dropSchedulesTable()\nawait schema.dropJobsTable()\n```\n\n</details>\n\n### Fake (testing + assertions)\n\n```typescript\nimport { QueueManager } from '@boringnode/queue'\nimport { redis } from '@boringnode/queue/drivers/redis_adapter'\n\nawait QueueManager.init({\n  default: 'redis',\n  adapters: {\n    redis: redis({ host: 'localhost' }),\n  },\n  locations: ['./app/jobs/**/*.ts'],\n})\n\n// The `using` keyword automatically restores the real adapters when\n// the variable goes out of scope (at the end of the test function).\nusing fake = QueueManager.fake()\n\nawait SendEmailJob.dispatch({ to: 'user@example.com' })\n\nfake.assertPushed(SendEmailJob)\nfake.assertPushed(SendEmailJob, {\n  queue: 'default',\n  payload: (payload) => payload.to === 'user@example.com',\n})\nfake.assertPushedCount(1)\n```\n\nYou can also call `QueueManager.restore()` manually if you need more control over when the real adapters are restored.\n\n### Sync (for testing)\n\n```typescript\nimport { sync } from '@boringnode/queue/drivers/sync_adapter'\n\nconst adapter = sync() // Jobs execute immediately\n```\n\nUse the `sync` adapter for tests and lightweight local development only.\n\n- `await MyJob.dispatch(payload).run()` waits for the job to fully finish.\n- Retries are executed inline, not by a background worker.\n- If you configure backoff, the adapter will `sleep` between attempts.\n- This means the caller can stay blocked for the full retry duration.\n\nExample: with `maxRetries: 3` and an exponential backoff of `1s`, `2s`, `4s`,\nthe request or command that dispatched the job can stay busy for about 7 seconds\nbefore the job exhausts its retries and runs `failed()`.\n\n## Job Options\n\n```typescript\nexport default class MyJob extends Job<Payload> {\n  static options: JobOptions = {\n    queue: 'email', // Queue name (default: 'default')\n    priority: 1, // Lower = higher priority (default: 5)\n    maxRetries: 3, // Retry attempts before failing\n    timeout: '30s', // Max execution time\n    failOnTimeout: true, // Fail permanently on timeout (default: retry)\n    removeOnComplete: { count: 100 }, // Keep last 100 completed\n    removeOnFail: { age: '7d' }, // Keep failed for 7 days\n  }\n}\n```\n\n## Delayed Jobs\n\n```typescript\nawait SendEmailJob.dispatch(payload).in('30s') // 30 seconds\nawait SendEmailJob.dispatch(payload).in('5m') // 5 minutes\nawait SendEmailJob.dispatch(payload).in('2h') // 2 hours\nawait SendEmailJob.dispatch(payload).in('1d') // 1 day\n```\n\n## Retry & Backoff\n\n```typescript\nimport { exponentialBackoff } from '@boringnode/queue'\n\nexport default class ReliableJob extends Job<Payload> {\n  static options: JobOptions = {\n    maxRetries: 5,\n    retry: {\n      backoff: () =>\n        exponentialBackoff({\n          baseDelay: '1s',\n          maxDelay: '1m',\n          multiplier: 2,\n          jitter: true,\n        }),\n    },\n  }\n}\n```\n\n`maxRetries` can be defined directly on the job options, and `retry.backoff`\ncontrols the delay between attempts.\n\n> With the `sync` adapter, these delays happen inline in the caller via\n> `sleep`. If a job fails repeatedly, `dispatch().run()` will take as long as\n> the total backoff duration. Use a worker-backed adapter when you do not want\n> retries to slow down the request/command that dispatched the job.\n\n<details>\n<summary><strong>Available strategies</strong></summary>\n\n```typescript\nimport { exponentialBackoff, linearBackoff, fixedBackoff } from '@boringnode/queue'\n\n// Exponential: 1s, 2s, 4s, 8s...\nexponentialBackoff({ baseDelay: '1s', maxDelay: '1m', multiplier: 2 })\n\n// Linear: 1s, 2s, 3s, 4s...\nlinearBackoff({ baseDelay: '1s', maxDelay: '30s', multiplier: 1 })\n\n// Fixed: 5s, 5s, 5s...\nfixedBackoff({ baseDelay: '5s', jitter: true })\n```\n\n</details>\n\n## Job Timeout\n\n```typescript\nexport default class LongRunningJob extends Job<Payload> {\n  static options: JobOptions = {\n    timeout: '30s',\n    failOnTimeout: false, // Will retry (default)\n  }\n\n  async execute(): Promise<void> {\n    for (const item of this.payload.items) {\n      // Check abort signal for graceful timeout handling\n      if (this.signal?.aborted) {\n        throw new Error('Job timed out')\n      }\n      await this.processItem(item)\n    }\n  }\n}\n```\n\n## Job Context\n\nAccess execution metadata via `this.context`:\n\n```typescript\nasync execute(): Promise<void> {\n  console.log(this.context.jobId)       // Unique job ID\n  console.log(this.context.attempt)     // 1, 2, 3...\n  console.log(this.context.queue)       // Queue name\n  console.log(this.context.priority)    // Priority value\n  console.log(this.context.acquiredAt)  // When acquired\n  console.log(this.context.stalledCount) // Stall recoveries\n  console.log(this.context.scheduleId)  // Originating Schedule, when applicable\n}\n```\n\n## Scheduled Jobs\n\nRun jobs on a recurring basis:\n\n```typescript\n// Every 10 seconds\nawait MetricsJob.schedule({ endpoint: '/health' }).every('10s')\n\n// Cron schedule\nawait CleanupJob.schedule({ days: 30 })\n  .id('daily-cleanup')\n  .with('redis')\n  .cron('0 0 * * *') // Midnight daily\n  .timezone('Europe/Paris')\n```\n\n<details>\n<summary><strong>Schedule management</strong></summary>\n\n```typescript\nimport { Schedule } from '@boringnode/queue'\n\n// Find and manage\nconst schedule = await Schedule.find('daily-cleanup')\nawait schedule.pause()\nawait schedule.resume()\nawait schedule.trigger() // Run now\nawait schedule.delete()\n\n// List schedules\nconst all = await Schedule.list()\nconst active = await Schedule.list({ status: 'active' })\n\n// Access schedules stored on a non-default Adapter\nconst redisSchedule = await Schedule.find('daily-cleanup', { adapter: 'redis' })\nconst redisSchedules = await Schedule.list({}, { adapter: 'redis' })\n```\n\n**Schedule options:**\n\n| Method              | Description                       |\n| ------------------- | --------------------------------- |\n| `.id(string)`       | Unique identifier                 |\n| `.every(duration)`  | Fixed interval ('5s', '1m', '1h') |\n| `.cron(expression)` | Cron schedule                     |\n| `.timezone(tz)`     | Timezone (default: 'UTC')         |\n| `.from(date)`       | Start boundary                    |\n| `.to(date)`         | End boundary                      |\n| `.limit(n)`         | Maximum runs                      |\n| `.with(adapter)`    | Adapter that owns the Schedule    |\n\nA Schedule and every Job it dispatches stay on the same Adapter. Start a Worker for each Adapter\nthat owns Schedules.\n\n</details>\n\n## Dependency Injection\n\nIntegrate with IoC containers:\n\n```typescript\nawait QueueManager.init({\n  // ...\n  jobFactory: async (JobClass) => {\n    return app.container.make(JobClass)\n  },\n})\n```\n\n<details>\n<summary><strong>Example with injected services</strong></summary>\n\n```typescript\nexport default class SendEmailJob extends Job<SendEmailPayload> {\n  constructor(\n    private mailer: MailerService,\n    private logger: Logger\n  ) {\n    super()\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(`Sending email to ${this.payload.to}`)\n    await this.mailer.send(this.payload)\n  }\n}\n```\n\n</details>\n\n## Worker Configuration\n\n```typescript\nconst config = {\n  worker: {\n    adapter: 'redis', // Registered Adapter listened to by this Worker\n    concurrency: 5, // Parallel jobs\n    idleDelay: '2s', // Poll interval when idle\n    timeout: '1m', // Default job timeout\n    stalledThreshold: '30s', // When to consider job stalled\n    stalledInterval: '30s', // How often to check\n    maxStalledCount: 1, // Max recoveries before failing\n    gracefulShutdown: true, // Wait for jobs on SIGTERM\n  },\n}\n```\n\n## Logging\n\n```typescript\nimport { pino } from 'pino'\n\nawait QueueManager.init({\n  // ...\n  logger: pino(),\n})\n```\n\n## OpenTelemetry Instrumentation (experimental)\n\n> [!WARNING]\n> The OpenTelemetry instrumentation is experimental and its API may change in future releases.\n\n`@boringnode/queue` ships with built-in OpenTelemetry instrumentation that creates **PRODUCER** spans for job dispatch and **CONSUMER** spans for job execution, following [OTel messaging semantic conventions](https://opentelemetry.io/docs/specs/semconv/messaging/messaging-spans/).\n\n### Quick Setup\n\n```typescript\nimport { QueueInstrumentation } from '@boringnode/queue/otel'\nimport * as boringqueue from '@boringnode/queue'\n\nconst instrumentation = new QueueInstrumentation({\n  messagingSystem: 'boringqueue', // default\n  executionSpanLinkMode: 'link', // or 'parent'\n})\n\ninstrumentation.enable()\ninstrumentation.manuallyRegister(boringqueue)\n```\n\nThe instrumentation patches `QueueManager.init()` to automatically inject its wrappers — no config changes needed in your queue setup.\n\n### Span Attributes\n\nThe instrumentation uses standard [OTel messaging semantic conventions](https://opentelemetry.io/docs/specs/semconv/messaging/messaging-spans/) where they map cleanly, plus a few queue-specific custom attributes.\n\n| Attribute                       | Kind    | Description                                   |\n| ------------------------------- | ------- | --------------------------------------------- |\n| `messaging.system`              | Semconv | `'boringqueue'` (configurable)                |\n| `messaging.operation.name`      | Semconv | `'publish'` or `'process'`                    |\n| `messaging.destination.name`    | Semconv | Queue name                                    |\n| `messaging.message.id`          | Semconv | Job ID for single-message spans               |\n| `messaging.batch.message_count` | Semconv | Number of jobs in a batch dispatch            |\n| `messaging.message.retry.count` | Custom  | Retry count (0-based) for a job attempt       |\n| `messaging.job.name`            | Custom  | Job class name (e.g. `SendEmailJob`)          |\n| `messaging.job.status`          | Custom  | `'completed'`, `'failed'`, or `'retrying'`    |\n| `messaging.job.group_id`        | Custom  | Queue-specific group identifier               |\n| `messaging.job.priority`        | Custom  | Queue-specific job priority                   |\n| `messaging.job.delay_ms`        | Custom  | Delay before the job becomes available        |\n| `messaging.job.queue_time_ms`   | Custom  | Time spent waiting in queue before processing |\n\n### Trace Context Propagation\n\nThe instrumentation automatically propagates trace context from dispatch to execution:\n\n- **Link mode** (default): Each job execution is an independent trace, linked to the dispatch span\n- **Parent mode**: Job execution is a child of the dispatch span (same trace)\n\nChild spans created inside `execute()` (DB queries, HTTP calls, etc.) are automatically parented to the job consumer span.\n\n### diagnostics_channel\n\nRaw telemetry events are available via `diagnostics_channel` for custom subscribers:\n\n```typescript\nimport { tracingChannels } from '@boringnode/queue'\n\nconst { executeChannel } = tracingChannels\n\nexecuteChannel.subscribe({\n  start() {},\n  end() {},\n  asyncStart() {},\n  asyncEnd(message) {\n    console.log(`Job ${message.job.name} ${message.status} in ${message.duration}ms`)\n  },\n  error() {},\n})\n```\n\n## Benchmarks\n\nPerformance comparison with BullMQ (5ms simulated work per job):\n\n| Jobs | Concurrency | @boringnode/queue | BullMQ | Diff        |\n| ---- | ----------- | ----------------- | ------ | ----------- |\n| 1000 | 5           | 1096ms            | 1116ms | 1.8% faster |\n| 1000 | 10          | 565ms             | 579ms  | 2.4% faster |\n| 100K | 10          | 56.2s             | 57.5s  | 2.1% faster |\n| 100K | 20          | 29.1s             | 29.6s  | 1.7% faster |\n\n```bash\nnpm run benchmark -- --realistic\n```\n\n[gh-workflow-image]: https://img.shields.io/github/actions/workflow/status/boringnode/queue/checks.yml?branch=main&style=for-the-badge\n[gh-workflow-url]: https://github.com/boringnode/queue/actions/workflows/checks.yml\n[npm-image]: https://img.shields.io/npm/v/@boringnode/queue.svg?style=for-the-badge&logo=npm\n[npm-url]: https://www.npmjs.com/package/@boringnode/queue\n[npm-download-image]: https://img.shields.io/npm/dm/@boringnode/queue?style=for-the-badge\n[npm-download-url]: https://www.npmjs.com/package/@boringnode/queue\n[typescript-image]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript\n[typescript-url]: https://www.typescriptlang.org\n[license-image]: https://img.shields.io/npm/l/@boringnode/queue?color=blueviolet&style=for-the-badge\n[license-url]: LICENSE.md\n","readmeFilename":"README.md"}