{"_id":"@atlex/queue","_rev":"16-544de91dcddd8d61a0b22f03a1bd3b40","name":"@atlex/queue","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.1":{"name":"@atlex/queue","version":"0.1.1","keywords":["atlex","queue","typescript","bullmq","jobs"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.1","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/atlex-monorepo/issues"},"dist":{"shasum":"ed41c069d58d46ef4d735e05b5eb45094bd06d5c","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.1.tgz","fileCount":199,"integrity":"sha512-dagGfJosAp0M9NiTd2evnaVMowub3TBocNrkHcaa7zn7pNL2FdF+RaiqWRTg6HNEsk3FcCi80LS4/m+DOq+xEg==","signatures":[{"sig":"MEQCICtMuZKQNoNiTOiJMO0BlyKhVY5HHMT3/mvU2wZ8u/FyAiBgGg48dn1J8GV31JN746V2BzHm1uNQ4PPZhcn/Vc6uWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323533},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/c1f6a5a17212230b97ad6bfd400d8964/atlex-queue-0.1.1.tgz","_integrity":"sha512-dagGfJosAp0M9NiTd2evnaVMowub3TBocNrkHcaa7zn7pNL2FdF+RaiqWRTg6HNEsk3FcCi80LS4/m+DOq+xEg==","repository":{"url":"git+https://github.com/atlex-framework/atlex-monorepo.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.7","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.1","@atlex/core":"0.1.1","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.1_1776194500948_0.42300927188147885","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@atlex/queue","version":"0.1.2","keywords":["atlex","queue","typescript","bullmq","jobs"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.2","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"fa0abf92df0b7b7bcb2bf029e17611aa026626c2","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.2.tgz","fileCount":199,"integrity":"sha512-N0uj4RZsj2yzZkUJgH6jSke945Yc8IY+3kvWsnj0776O6b6hJhK0X5mB8cYpVRY3vFz1crUk0kh8SLWEf6fcYw==","signatures":[{"sig":"MEUCICJWkjRSJyrHrk9rCFGevpwu9NbJZOZ7fUCg4hZPLBEeAiEAuuT7udcdtNbKJraDcheUcBoL8qWALi6YiHeS2OoTXIw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323515},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/080d2ef6d7e1b52ad104d197cc8f7f0a/atlex-queue-0.1.2.tgz","_integrity":"sha512-N0uj4RZsj2yzZkUJgH6jSke945Yc8IY+3kvWsnj0776O6b6hJhK0X5mB8cYpVRY3vFz1crUk0kh8SLWEf6fcYw==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.7","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.2","@atlex/core":"0.1.2","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.2_1776235414035_0.9106502084455554","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@atlex/queue","version":"0.1.3","keywords":["atlex","queue","typescript","bullmq","jobs"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.3","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"5dd27d3312a7686aecde8e989aee58b04c7ed10b","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.3.tgz","fileCount":199,"integrity":"sha512-jQazDWw3y+Ise1XYFDMXirz4X4l30eIXeM4RwhGAC12YRO44XitjUp0TpLRQ+AQDYUMhoyEYoEpTZvQLSXq4kA==","signatures":[{"sig":"MEUCIQCxmU9pgcB+/G+4k6UCRD1oonkayiSVUu2EieV34HePTwIgZLHWP1f9jm4IleyEQ3MkVAbprTpnfuYdwOnwtlC9U2w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323515},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/645605a67eff7da5e14003cadf0e1675/atlex-queue-0.1.3.tgz","_integrity":"sha512-jQazDWw3y+Ise1XYFDMXirz4X4l30eIXeM4RwhGAC12YRO44XitjUp0TpLRQ+AQDYUMhoyEYoEpTZvQLSXq4kA==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.7","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.3","@atlex/core":"0.1.3","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.3_1776256105604_0.0480095949947863","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@atlex/queue","version":"0.1.4","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.4","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"5c940eaeb9b12c9a054b01fcabc24c7eab547bc8","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.4.tgz","fileCount":199,"integrity":"sha512-RxNXUOI2DxtYRjLSeyggXdaUXXI42PzfVfo4mBBC3Z74zx/L80G/iAhXUjqGgzO+3tFc22IeXFzRQNkwMu820A==","signatures":[{"sig":"MEQCIFfdd6vhpXOpREzFd6o0aAwvAJDo48t5L4K167bcc0feAiAo0iJHQtDQl1i1ZRUC0opG87uw3I6nxqA5m9/KfiYHmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323958},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/77074b076a5a29e8d4647c6149544e1c/atlex-queue-0.1.4.tgz","_integrity":"sha512-RxNXUOI2DxtYRjLSeyggXdaUXXI42PzfVfo4mBBC3Z74zx/L80G/iAhXUjqGgzO+3tFc22IeXFzRQNkwMu820A==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.7","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.4","@atlex/core":"0.1.4","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.4_1776259471729_0.3939553042947648","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@atlex/queue","version":"0.1.5","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.5","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"25ddaa8745dffe9b2e3e5e6da5ad41294f7d8c4d","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.5.tgz","fileCount":199,"integrity":"sha512-fXBvMmC5Pq4lCBlaneJ7mL9aQS15/1aLLeh2Z6cLb7Ebe/p7hbP7lukZfupKuj0/HC6dFo78KZEDrS2WE4FP9Q==","signatures":[{"sig":"MEYCIQDX24fl1IpDPiNwjw1d8WbGN5Tqdp2ekAt/RXqVt/wwYwIhAO9p5VFTJoUuTkR5+2xX/UWTLUN7PAbnNA9B5NtzmTVL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323958},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.5.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/dd27b37051dc24d9d91a279bc3f54c25/atlex-queue-0.1.5.tgz","_integrity":"sha512-fXBvMmC5Pq4lCBlaneJ7mL9aQS15/1aLLeh2Z6cLb7Ebe/p7hbP7lukZfupKuj0/HC6dFo78KZEDrS2WE4FP9Q==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.7","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.5","@atlex/core":"0.1.5","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.5_1776260746744_0.8591534137064907","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@atlex/queue","version":"0.1.6","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.6","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"0c82cc1d774100f62ae676eb0fa2480ed843fea9","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.6.tgz","fileCount":199,"integrity":"sha512-RcIs+v3pi5EPjMvepws4FYWzwp3AuMzBy4EhO5FlPlyF/I3HJK6BVNhODWPXkvw3+yeKn+siAnuR8HHTLFOmlA==","signatures":[{"sig":"MEQCIFZdK+HA3uRvuLfJmVIyN8f1DTDispnldxj25LW7Sof9AiApsv6g4eogN/0DOYHz/wKY728nHanVKaVZsChNMlj6Fg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323958},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.6.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/efd8a9aa69583fb335acda621da14783/atlex-queue-0.1.6.tgz","_integrity":"sha512-RcIs+v3pi5EPjMvepws4FYWzwp3AuMzBy4EhO5FlPlyF/I3HJK6BVNhODWPXkvw3+yeKn+siAnuR8HHTLFOmlA==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.7","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.6","@atlex/core":"0.1.6","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.6_1778694381257_0.7686406322131742","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@atlex/queue","version":"0.1.7","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.7","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"654edf2ac2e7db2b6931c1db8e94746d0cfe6d1e","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.7.tgz","fileCount":199,"integrity":"sha512-nHL/piOYkyFRvlpIN9lxMvETpwS6/BdOQXuUpdxQoc4iU1rgup9bioBfCodcHcM1lE+DBubHFf3mpbp7xlZiqw==","signatures":[{"sig":"MEYCIQCH/wC8auxdZdtXLAEUckyhCAn0GZpWFkeyVra8gg4l9gIhAJOIciGkgPiBUMLXI+JqvgM0jLjHribIFNKK/AVL2OpC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323958},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.7.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/3839c10dc8430f62683750ab9e5c0ec2/atlex-queue-0.1.7.tgz","_integrity":"sha512-nHL/piOYkyFRvlpIN9lxMvETpwS6/BdOQXuUpdxQoc4iU1rgup9bioBfCodcHcM1lE+DBubHFf3mpbp7xlZiqw==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.7","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.7","@atlex/core":"0.1.7","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.7_1778755107373_0.439713295121837","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@atlex/queue","version":"0.1.8","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.8","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"5caccd7331a57dcc6dc2e6db40c4d8fb3de87fdf","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.8.tgz","fileCount":199,"integrity":"sha512-ia/u+n4aIL7AgVf1TFJDKfLkP7StlzQs856Ow7LkzzSo9weUP2/BeYQcyzGQSjKOixsLXLJOwlbh04nmk/Ap8w==","signatures":[{"sig":"MEYCIQCCNPqPigDM1qIOnpBAgK1OfIBUU7IXTmUhfasdmZPaggIhAOQDH7qAHpo9777zW1ob1y5utDXpDRwuNHZRxmLYlnx6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323958},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.8.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/2cc542d3612e8db374b0d7da73b96501/atlex-queue-0.1.8.tgz","_integrity":"sha512-ia/u+n4aIL7AgVf1TFJDKfLkP7StlzQs856Ow7LkzzSo9weUP2/BeYQcyzGQSjKOixsLXLJOwlbh04nmk/Ap8w==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.7","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.8","@atlex/core":"0.1.8","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.8_1778775549192_0.7485600790388662","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@atlex/queue","version":"0.1.9","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.9","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"21692d04f45cc32640cd3249f52710c3d5a527d8","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.9.tgz","fileCount":199,"integrity":"sha512-n0N6qtN6mwXlsWRAO5ApMwaA9Z6Isd/708utXB3KLyN6LC4IfPuLf+U+FCJsgr4QKdeQKlwAB/VzesoFP+rdWQ==","signatures":[{"sig":"MEUCICWqEalf+JO8I2LFwAIZCZMtKrHJahdC01dCmBrys21MAiEA9xjRignpseWT4fR2HLVWJna2+9bI1W5yZJ0jvhWxBpE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323959},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.9.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/bc9d084f3bf9f6d2a61856f01b721681/atlex-queue-0.1.9.tgz","_integrity":"sha512-n0N6qtN6mwXlsWRAO5ApMwaA9Z6Isd/708utXB3KLyN6LC4IfPuLf+U+FCJsgr4QKdeQKlwAB/VzesoFP+rdWQ==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.7","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.10","@atlex/core":"0.1.9","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.9_1778830272871_0.2078926353912236","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@atlex/queue","version":"0.1.10","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.10","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"45fcb12a87e41bba64c4379b04a9e6b0b9465653","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.10.tgz","fileCount":199,"integrity":"sha512-8KjAFAtTtLzo69P/ZfpEFuZTwOOH0znbBUxC3sl956m+KnZF+j7Iwe+WFuUhkBMo/z8I289ra0APNaQ8EaS9dg==","signatures":[{"sig":"MEQCIBVeJHehDySk0+k+8u+vzZtEK+hfnqp873T7ln6wODoIAiAOFe8mc2MgB6ub90avgZV1ktGCUgktaLXrv+jqeSvzyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323961},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.10.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/f08cfaad9c4e1b09082192dafa9be87c/atlex-queue-0.1.10.tgz","_integrity":"sha512-8KjAFAtTtLzo69P/ZfpEFuZTwOOH0znbBUxC3sl956m+KnZF+j7Iwe+WFuUhkBMo/z8I289ra0APNaQ8EaS9dg==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.7","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.10","@atlex/core":"0.1.10","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.10_1778834114680_0.4666972979039632","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@atlex/queue","version":"0.1.11","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.1.11","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"815f388bb4f3bdcb28cae5feae47f18fef189684","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.1.11.tgz","fileCount":199,"integrity":"sha512-OYtBPXGvjAa3qtqkM6BYxOQOp9bEojwaVEsywBqKls3xsWS+PZx39xLSdjB5kCGjv4Q7ZV3LXdEw7hLX7ys9vA==","signatures":[{"sig":"MEQCIBHVeIVy9nVOIk0P8KKMS1PHnJDZrkLYLGdHIeQ2Jl9yAiBoq7lYy0coRFKcusRKJYp97wGZWKwRfwUOsHxsjjdR7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323961},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.1.11.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/b562e59ac5fc2548dc5c221f59744b0d/atlex-queue-0.1.11.tgz","_integrity":"sha512-OYtBPXGvjAa3qtqkM6BYxOQOp9bEojwaVEsywBqKls3xsWS+PZx39xLSdjB5kCGjv4Q7ZV3LXdEw7hLX7ys9vA==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.8","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.1.11","@atlex/core":"0.1.11","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.1.11_1780144983516_0.15700021594077174","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@atlex/queue","version":"0.2.0","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.2.0","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"34b023269cfb7ed8d089f1cd1ce94de98abe50ac","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.2.0.tgz","fileCount":199,"integrity":"sha512-K4BfEtciTzIRxyNv9tyIFCQJ9Oj1vsgguz6HPmu6gTUQlxMRfByvk2oeANqlyd/J/bgh0Vsf0EkcH8VFz47snw==","signatures":[{"sig":"MEQCIHOOocnxnSdKWxTngmsSZq13FtNdmhc/4KKmKQPHZo4WAiBT9rxaA1BtNryP8ZpAzfiDyhKX1e8OKegOUYdrZMfEPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323958},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/30a639ceb1099ebc6ee4deb8c4511048/atlex-queue-0.2.0.tgz","_integrity":"sha512-K4BfEtciTzIRxyNv9tyIFCQJ9Oj1vsgguz6HPmu6gTUQlxMRfByvk2oeANqlyd/J/bgh0Vsf0EkcH8VFz47snw==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.8","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.2.0","@atlex/core":"0.2.0","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.2.0_1780306571639_0.07125404414395953","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@atlex/queue","version":"0.2.1","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/queue@0.2.1","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"dist":{"shasum":"aa2c18a7a00b2376f7dfb72e4bf0c4fad9b81828","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.2.1.tgz","fileCount":199,"integrity":"sha512-8RS5FL+fz46ZyaM6P1/Y4ZH112VDpcTCabXJ33/N1jtV6vGDFpHuhdQaG9kDI9DDTgoLx5SKUHUGkQ5w/W32HQ==","signatures":[{"sig":"MEQCIBFViXPPZS+GBBoQ2osVCW6mT/4xNj/vBqpHy9C+9Z+0AiBLBlJIM2X0lNU1qgGoQvIoKw6DWRyzQJtg3qLkJzNS7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323958},"main":"./dist/index.js","type":"module","_from":"file:atlex-queue-0.2.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/722bcca002f0c9ee5cb52ab6745a5e2f/atlex-queue-0.2.1.tgz","_integrity":"sha512-8RS5FL+fz46ZyaM6P1/Y4ZH112VDpcTCabXJ33/N1jtV6vGDFpHuhdQaG9kDI9DDTgoLx5SKUHUGkQ5w/W32HQ==","repository":{"url":"git+https://github.com/atlex-framework/queue.git","type":"git","directory":"packages/queue"},"_npmVersion":"10.9.8","description":"Background jobs, workers, and scheduling for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^11.1.0","bullmq":"^5.73.0","ioredis":"^5.10.1","@atlex/orm":"0.2.1","@atlex/core":"0.2.1","@aws-sdk/client-sqs":"^3.1025.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","better-sqlite3":"^12.8.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_0.2.1_1780423691936_0.8885568685622036","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@atlex/queue","version":"0.2.2","description":"Background jobs, workers, and scheduling for Atlex","type":"module","license":"MIT","author":{"name":"Karen Hamazaspyan","url":"https://github.com/khamazaspyan"},"keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"engines":{"node":">=20"},"repository":{"type":"git","url":"git+https://github.com/atlex-framework/queue.git","directory":"packages/queue"},"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"publishConfig":{"access":"public"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"dependencies":{"@aws-sdk/client-sqs":"^3.1025.0","bullmq":"^5.73.0","ioredis":"^5.10.1","uuid":"^11.1.0","@atlex/core":"0.2.2","@atlex/orm":"0.2.2"},"devDependencies":{"better-sqlite3":"^12.8.0","vitest":"^3.2.4"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts"},"_id":"@atlex/queue@0.2.2","_integrity":"sha512-4x7O1Fk2LILVG/o0tylxXRUetPBdy7taj2aCXa2qVR0atcz6bvb11sRr2vKZ6DtyITnpx8dsPM7UB9U3L0By5w==","_resolved":"/tmp/cd2d1b567c78ac50df233efb73cbbf18/atlex-queue-0.2.2.tgz","_from":"file:atlex-queue-0.2.2.tgz","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-4x7O1Fk2LILVG/o0tylxXRUetPBdy7taj2aCXa2qVR0atcz6bvb11sRr2vKZ6DtyITnpx8dsPM7UB9U3L0By5w==","shasum":"bd9a594cab555a27740b41d34718243256f0ecc9","tarball":"https://registry.npmjs.org/@atlex/queue/-/queue-0.2.2.tgz","fileCount":199,"unpackedSize":323958,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDuFt1zQpEuGUDDJ0577EeRrAdBevkf/KG4/5VBbUtylwIhAO1itIaq1GICLhHrU92AAKxPxW9EQUcCqsdIeAmPjg93"}]},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"directories":{},"maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/queue_0.2.2_1784391618294_0.3972038078314004"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-14T19:21:40.828Z","modified":"2026-07-18T16:20:18.610Z","0.1.0-beta":"2026-04-11T21:23:35.352Z","0.1.1":"2026-04-14T19:21:41.122Z","0.1.2":"2026-04-15T06:43:34.289Z","0.1.3":"2026-04-15T12:28:25.740Z","0.1.4":"2026-04-15T13:24:31.889Z","0.1.5":"2026-04-15T13:45:46.883Z","0.1.6":"2026-05-13T17:46:21.503Z","0.1.7":"2026-05-14T10:38:27.600Z","0.1.8":"2026-05-14T16:19:09.442Z","0.1.9":"2026-05-15T07:31:13.038Z","0.1.10":"2026-05-15T08:35:14.823Z","0.1.11":"2026-05-30T12:43:03.668Z","0.2.0":"2026-06-01T09:36:11.782Z","0.2.1":"2026-06-02T18:08:12.061Z","0.2.2":"2026-07-18T16:20:18.437Z"},"bugs":{"url":"https://github.com/atlex-framework/queue/issues"},"author":{"name":"Karen Hamazaspyan","url":"https://github.com/khamazaspyan"},"license":"MIT","homepage":"https://atlex.dev","keywords":["atlex","queue","jobs","background-jobs","job-queue","worker","job-worker","job-processing","task-queue","redis-queue","bullmq","sqs","database-queue","task-scheduler","scheduler","cron","cron-jobs","laravel-queue","laravel-horizon","horizon-alternative","job-retry","failed-jobs","nodejs","javascript","typescript"],"repository":{"type":"git","url":"git+https://github.com/atlex-framework/queue.git","directory":"packages/queue"},"description":"Background jobs, workers, and scheduling for Atlex","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"readme":"# @atlex/queue\n\n> Robust background job processing with multiple queue drivers, batching, scheduling, and failure handling for Express + Node.js applications.\n\n[![npm version](https://img.shields.io/npm/v/@atlex/queue.svg?style=flat-square&color=7c3aed)](https://www.npmjs.com/package/@atlex/queue)\n[![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6?style=flat-square)](https://www.typescriptlang.org/)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](LICENSE)\n\n[![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-Support-yellow?style=flat-square&logo=buy-me-a-coffee)](https://buymeacoffee.com/khamazaspyan)\n\n## Installation\n\n```bash\nnpm install @atlex/queue\n```\n\nFor BullMQ driver support:\n\n```bash\nnpm install bull bullmq\n```\n\nFor AWS SQS support:\n\n```bash\nnpm install @aws-sdk/client-sqs\n```\n\n## Quick start\n\nDefine a job class:\n\n```typescript\nimport { Job } from '@atlex/queue'\n\nexport class SendEmail extends Job {\n  public static queue = 'emails'\n  public static tries = 3\n  public static timeout = 30\n\n  public constructor(\n    private email: string,\n    private subject: string,\n  ) {\n    super()\n  }\n\n  public async handle(): Promise<void> {\n    console.log(`Sending email to ${this.email}: ${this.subject}`)\n    // Send email logic here\n  }\n}\n```\n\nDispatch the job:\n\n```typescript\nimport { dispatch } from '@atlex/queue'\n\n// Queue for background processing\nawait dispatch(new SendEmail('user@example.com', 'Welcome!'))\n\n// Execute synchronously\nawait dispatch(new SendEmail('user@example.com', 'Welcome!')).dispatchSync()\n\n// Execute after HTTP response\nawait dispatch(new SendEmail('user@example.com', 'Welcome!')).dispatchAfterResponse()\n```\n\nProcess jobs:\n\n```bash\nnpx atlex queue:work\n```\n\n## Features\n\n### Multiple Drivers\n\n- **SyncDriver**: Execute jobs synchronously (development)\n- **NullDriver**: Discard jobs (testing)\n- **DatabaseDriver**: SQL-backed queue with persistence\n- **BullMQDriver**: Redis-backed with BullMQ library\n- **SqsDriver**: AWS SQS integration\n\n### Job Features\n\n- Automatic serialization/deserialization\n- Constructor-based payload preservation\n- Retry logic with configurable attempts\n- Exponential backoff and custom delay strategies\n- Job timeout enforcement\n- Job middleware for wrapping execution\n- Unique job constraints\n- Batch processing support\n- Job chaining\n- Failed job tracking and retry commands\n\n### Failure Handling\n\n- Failed job storage and inspection\n- Retry mechanism with exponential backoff\n- Failed job cleanup\n- DatabaseFailedJobProvider for persistence\n- Max attempts and timeout error distinction\n\n### Batching\n\n- Batch multiple jobs together\n- `then()`, `catch()`, `finally()` callbacks\n- Atomic batch operations\n- Batch callbacks after all jobs complete\n- Batch cancellation\n\n### Scheduling\n\n- Cron-based task scheduling\n- Common schedule shortcuts (daily, weekly, monthly)\n- Timezone support\n- Schedule mutations and mutex locking\n- CacheScheduleMutex, RedisScheduleMutex, FileScheduleMutex\n\n### Middleware\n\n- Job middleware pipeline\n- Execute code before/after job handling\n- Conditional job processing\n- Logging and monitoring hooks\n\n### Configuration\n\n- Per-job settings (queue, connection, tries, timeout)\n- Class-level defaults\n- Runtime overrides\n- Multiple named connections\n\n## Core APIs\n\n### Job Class\n\nDefine background jobs by extending `Job`:\n\n```typescript\nimport { Job } from '@atlex/queue'\n\nexport class ProcessImage extends Job {\n  // Static configuration\n  public static queue = 'images' // Target queue\n  public static connection = 'default' // Connection name\n  public static tries = 3 // Retry attempts\n  public static timeout = 120 // Seconds\n  public static maxExceptions = 2 // Max exceptions before failure\n  public static backoff = 'exponential' // Backoff strategy\n  public static retryUntil = null // Unix timestamp stop retrying\n\n  // Instance properties\n  public attempts = 0 // Current attempt number\n  public batchId: string | null = null // Batch membership\n  public chained: JobPayload[] = [] // Chained jobs\n\n  public constructor(\n    private imageId: string,\n    private format: string = 'jpeg',\n  ) {\n    super()\n  }\n\n  /**\n   * Main job logic.\n   */\n  public async handle(): Promise<void> {\n    const image = await Image.find(this.imageId)\n    await image.processAndStore(this.format)\n  }\n\n  /**\n   * Called before handle() executes. Return false to skip job.\n   */\n  public async before(): Promise<boolean | void> {\n    const image = await Image.find(this.imageId)\n    if (!image) return false // Skip if image doesn't exist\n  }\n\n  /**\n   * Called after successful handle().\n   */\n  public async after(): Promise<void> {\n    console.log('Job completed')\n  }\n\n  /**\n   * Called when job fails (after all retries exhausted).\n   */\n  public async failed(error: Error): Promise<void> {\n    console.error(`Job failed: ${error.message}`)\n    // Notify user, log to external service, etc.\n  }\n\n  /**\n   * Custom middleware for this job.\n   */\n  public middleware(): JobMiddleware[] {\n    return [\n      {\n        async handle(job, next) {\n          console.log('Before job')\n          try {\n            await next()\n          } finally {\n            console.log('After job')\n          }\n        },\n      },\n    ]\n  }\n\n  /**\n   * Run after job succeeds (useful for chaining).\n   */\n  public chained(): JobPayload[] {\n    return [new GenerateThumbnail(this.imageId), new NotifyUser(this.imageId)]\n  }\n}\n```\n\n### Dispatching Jobs\n\n```typescript\nimport { dispatch, dispatchSync, dispatchAfterResponse } from '@atlex/queue'\n\n// Queue job for background processing\nawait dispatch(new SendEmail('user@example.com', 'Hello'))\n\n// Execute immediately (synchronous)\nawait dispatchSync(new SendEmail('user@example.com', 'Hello'))\n\n// Execute after HTTP response sent (non-blocking to client)\nawait dispatchAfterResponse(new SendEmail('user@example.com', 'Hello'))\n```\n\n### QueueManager\n\nCentral job dispatcher and queue manager:\n\n```typescript\nimport { QueueManager } from '@atlex/queue'\n\nconst queueManager = app.make(QueueManager)\n\n// Dispatch job\nawait queueManager.dispatch(job)\n\n// Dispatch after response\nawait queueManager.dispatchAfterResponse(job)\n\n// Dispatch synchronously\nawait queueManager.dispatchSync(job)\n\n// Get driver for specific connection\nconst connection = queueManager.connection('redis')\n\n// Mark job as failed\nawait queueManager.fail(job, error)\n\n// Extend queue with custom driver\nqueueManager.extend('custom', (app) => new CustomDriver(app))\n```\n\n### PendingDispatch\n\nFluent interface for job dispatch with options:\n\n```typescript\nconst pending = dispatch(job)\n\n// Delay job execution\npending.delay(60) // 60 seconds\npending.delay(Duration.minutes(5)) // 5 minutes\n\n// Specify queue\npending.onQueue('emails')\n\n// Specify connection\npending.onConnection('redis')\n\n// Set timeout\npending.timeout(120) // 120 seconds\n\n// Retry configuration\npending.retry(5)\n\n// Ensure job uniqueness\npending.unique()\n\n// Dispatch methods\nawait pending.dispatch() // Queue it\nawait pending.dispatchSync() // Execute now\nawait pending.dispatchAfterResponse() // Queue for after response\n```\n\n### Worker\n\nRun the queue worker to process jobs:\n\n```typescript\nimport { Worker, WorkerOptions } from '@atlex/queue'\n\nconst worker = new Worker(app)\n\nawait worker.run({\n  queue: 'default', // Queue to process\n  connection: 'default', // Connection name\n  memory: 128, // Max memory in MB\n  timeout: 300, // Job timeout in seconds\n  maxJobs: 0, // Max jobs to process (0 = unlimited)\n  sleep: 3, // Sleep time between polls (seconds)\n})\n```\n\nRun via CLI:\n\n```bash\n# Process default queue\nnpx atlex queue:work\n\n# Process specific queue\nnpx atlex queue:work --queue=emails\n\n# Process multiple queues\nnpx atlex queue:work --queue=emails --queue=notifications\n\n# Set memory limit\nnpx atlex queue:work --memory=256\n\n# Set timeout\nnpx atlex queue:work --timeout=180\n\n# Stop after N jobs\nnpx atlex queue:work --max-jobs=100\n```\n\n## Queue Drivers\n\n### SyncDriver\n\nExecute jobs synchronously immediately (useful for development/testing):\n\n```typescript\n// config/queue.ts\nexport default {\n  default: 'sync',\n  connections: {\n    sync: {\n      driver: 'sync',\n    },\n  },\n} as QueueConfig\n```\n\n### NullDriver\n\nDiscard jobs without processing (useful for testing):\n\n```typescript\nexport default {\n  default: 'null',\n  connections: {\n    null: {\n      driver: 'null',\n    },\n  },\n} as QueueConfig\n```\n\n### DatabaseDriver\n\nStore jobs in SQL database with polling:\n\n```typescript\nexport default {\n  default: 'database',\n  connections: {\n    database: {\n      driver: 'database',\n      table: 'jobs',\n      failedTable: 'failed_jobs',\n    },\n  },\n} as QueueConfig\n```\n\nCreate migrations:\n\n```typescript\nimport { JobsTableMigration } from '@atlex/orm'\n\n// In migration\nnew JobsTableMigration().up()\nnew FailedJobsTableMigration().up()\n```\n\n### BullMQDriver\n\nHigh-performance Redis queue using BullMQ:\n\n```typescript\nexport default {\n  default: 'bullmq',\n  connections: {\n    bullmq: {\n      driver: 'bullmq',\n      redis: {\n        host: 'localhost',\n        port: 6379,\n        db: 0,\n      },\n    },\n  },\n} as QueueConfig\n```\n\n### SqsDriver\n\nAWS SQS queue integration:\n\n```typescript\nexport default {\n  default: 'sqs',\n  connections: {\n    sqs: {\n      driver: 'sqs',\n      region: 'us-east-1',\n      queue: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue',\n      accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n      secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n    },\n  },\n} as QueueConfig\n```\n\n## Failure Handling\n\n### DatabaseFailedJobProvider\n\nTrack and retry failed jobs:\n\n```typescript\nimport { DatabaseFailedJobProvider } from '@atlex/queue'\n\nconst provider = new DatabaseFailedJobProvider(db, 'failed_jobs')\n\n// Get all failed jobs\nconst failed = await provider.all()\n\n// Get specific failed job\nconst job = await provider.get(id)\n\n// Retry a failed job\nawait provider.retry(id)\n\n// Delete failed job\nawait provider.forget(id)\n\n// Clear all failed jobs\nawait provider.flush()\n```\n\n### Failed Job Events\n\nFailed jobs trigger specific error types:\n\n```typescript\nimport { MaxAttemptsExceededError, TimeoutExceededError } from '@atlex/queue'\n\nexport class MyJob extends Job {\n  public async failed(error: Error): Promise<void> {\n    if (error instanceof MaxAttemptsExceededError) {\n      console.error('Job exhausted all retries')\n    } else if (error instanceof TimeoutExceededError) {\n      console.error('Job execution timed out')\n    }\n  }\n}\n```\n\n### Retry CLI Commands\n\n```bash\n# List failed jobs\nnpx atlex queue:failed\n\n# Show failed job details\nnpx atlex queue:failed --show=id\n\n# Retry failed job\nnpx atlex queue:retry id\n\n# Flush all failed jobs\nnpx atlex queue:flush\n```\n\n## Batching\n\nGroup multiple jobs and handle completion:\n\n```typescript\nimport { app } from '@atlex/core'\n\nconst batch = app.make(Scheduler).batch()\n\n// Add multiple jobs\nbatch\n  .add(new SendEmail('user1@example.com', 'Hello'))\n  .add(new SendEmail('user2@example.com', 'Hello'))\n  .add(new SendEmail('user3@example.com', 'Hello'))\n\n// Handle completion of all jobs\nbatch.then(async () => {\n  console.log('All emails sent!')\n})\n\n// Handle batch failure\nbatch.catch(async (error) => {\n  console.log('Batch failed:', error)\n})\n\n// Handle finally (always)\nbatch.finally(async () => {\n  console.log('Batch complete')\n})\n\n// Dispatch the batch\nawait batch.dispatch()\n```\n\n## Scheduling\n\nSchedule tasks to run on intervals via cron:\n\n```typescript\nimport { Scheduler } from '@atlex/queue'\n\nconst scheduler = app.make(Scheduler)\n\n// Schedule job to run daily at 2 AM\nscheduler.call(new CleanupOldFiles()).daily()\n\n// Schedule command every 5 minutes\nscheduler.exec('analytics:process').everyFiveMinutes()\n\n// Cron expression\nscheduler.call(new SendDailyReport()).cron('0 9 * * 1-5') // Weekdays at 9 AM\n\n// Advanced scheduling\nscheduler\n  .call(new BackupDatabase())\n  .cron('0 0 * * *') // Daily at midnight\n  .timezone('America/New_York')\n```\n\n### Schedule Shortcuts\n\n```typescript\nscheduler.call(job).everyMinute()\nscheduler.call(job).everyFiveMinutes()\nscheduler.call(job).everyTenMinutes()\nscheduler.call(job).everyFifteenMinutes()\nscheduler.call(job).everyThirtyMinutes()\nscheduler.call(job).hourly()\nscheduler.call(job).daily()\nscheduler.call(job).weekly()\nscheduler.call(job).monthly()\nscheduler.call(job).quarterly()\nscheduler.call(job).yearly()\nscheduler.call(job).weekdays()\nscheduler.call(job).weekends()\nscheduler.call(job).sundays()\nscheduler.call(job).mondays()\n// ... etc for all days\n```\n\n## Configuration\n\nCreate `config/queue.ts`:\n\n```typescript\nimport type { QueueConfig } from '@atlex/queue'\n\nexport default {\n  // Default connection\n  default: process.env.QUEUE_CONNECTION || 'sync',\n\n  // Named connections\n  connections: {\n    sync: {\n      driver: 'sync',\n    },\n\n    database: {\n      driver: 'database',\n      table: 'jobs',\n      failedTable: 'failed_jobs',\n    },\n\n    redis: {\n      driver: 'bullmq',\n      redis: {\n        host: process.env.REDIS_HOST || 'localhost',\n        port: process.env.REDIS_PORT || 6379,\n        db: process.env.REDIS_DB || 0,\n        password: process.env.REDIS_PASSWORD,\n      },\n    },\n\n    sqs: {\n      driver: 'sqs',\n      region: process.env.AWS_REGION || 'us-east-1',\n      queue: process.env.SQS_QUEUE_URL,\n      accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n      secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n    },\n  },\n\n  // Failed jobs\n  failed: {\n    driver: 'database',\n    table: 'failed_jobs',\n  },\n} as QueueConfig\n```\n\n## Complete Examples\n\n### Email Job with Retry\n\n```typescript\nimport { Job } from '@atlex/queue'\nimport { mail } from '@atlex/mail'\n\nexport class SendEmailJob extends Job {\n  public static queue = 'emails'\n  public static tries = 5\n  public static timeout = 30\n  public static backoff = 'exponential'\n\n  public constructor(\n    private readonly email: string,\n    private readonly subject: string,\n    private readonly template: string,\n    private readonly data: Record<string, any> = {},\n  ) {\n    super()\n  }\n\n  public async handle(): Promise<void> {\n    await mail().to(this.email).send(this.template, this.data)\n  }\n\n  public async failed(error: Error): Promise<void> {\n    // Log email failure to monitoring service\n    console.error(`Failed to send email to ${this.email}:`, error)\n\n    // Notify admin\n    await mail().to('admin@example.com').send('email-failure-alert', {\n      email: this.email,\n      error: error.message,\n    })\n  }\n}\n\n// Dispatch\nrouter.post('/signup', async (req, res) => {\n  const user = await User.create(req.body)\n\n  // Queue welcome email\n  await dispatch(new SendEmailJob(user.email, 'Welcome!', 'welcome', { name: user.name })).delay(5) // Delay 5 seconds\n\n  res.json({ message: 'Signed up! Check your email.' })\n})\n```\n\n### Unique Job\n\nPrevent duplicate processing:\n\n```typescript\nexport class ProcessPayment extends Job {\n  public static queue = 'payments'\n  public static tries = 3\n\n  public constructor(private orderId: string) {\n    super()\n  }\n\n  public async handle(): Promise<void> {\n    const order = await Order.find(this.orderId)\n    await order.processPayment()\n  }\n\n  public shouldBeUnique(): boolean {\n    return true // Unique per instance\n  }\n}\n\n// Queue multiple times, only processes once\nawait dispatch(new ProcessPayment('order-123'))\nawait dispatch(new ProcessPayment('order-123'))\nawait dispatch(new ProcessPayment('order-123'))\n```\n\n### Job Chaining\n\nExecute jobs in sequence:\n\n```typescript\nexport class ImageProcessingJob extends Job {\n  public async handle(): Promise<void> {\n    const image = await Image.find(this.imageId)\n    await image.compress()\n  }\n\n  public chained(): JobPayload[] {\n    return [\n      new ResizeImage(this.imageId, { width: 500 }),\n      new GenerateThumbnail(this.imageId),\n      new NotifyUserComplete(this.imageId),\n    ]\n  }\n}\n\n// Dispatch starts the chain\nawait dispatch(new ImageProcessingJob('img-456'))\n// Next: ResizeImage → GenerateThumbnail → NotifyUserComplete\n```\n\n### Batch Processing\n\nProcess multiple jobs with callbacks:\n\n```typescript\nrouter.post('/send-newsletter', async (req, res) => {\n  const users = await User.all()\n\n  const batch = app.make(Scheduler).batch()\n\n  for (const user of users) {\n    batch.add(new SendNewsletter(user.email))\n  }\n\n  batch.then(async () => {\n    console.log(`Newsletter sent to ${users.length} users`)\n  })\n\n  batch.catch(async (error) => {\n    console.error('Newsletter batch failed:', error)\n  })\n\n  await batch.dispatch()\n\n  res.json({ message: 'Newsletter queued for sending' })\n})\n```\n\n### Job Middleware\n\nWrap job execution with logging/monitoring:\n\n```typescript\nexport class MonitoredJob extends Job {\n  public middleware(): JobMiddleware[] {\n    return [\n      {\n        async handle(job, next) {\n          const startTime = Date.now()\n          console.log(`Starting job: ${job.constructor.name}`)\n\n          try {\n            await next()\n            const duration = Date.now() - startTime\n            console.log(`Job completed in ${duration}ms`)\n          } catch (error) {\n            console.error('Job failed:', error)\n            throw error\n          }\n        },\n      },\n    ]\n  }\n}\n```\n\n## API Overview\n\n### Job\n\n- `Job.handle()` - Main job logic (required)\n- `Job.failed(error)` - Called on failure\n- `Job.before()` - Called before handle\n- `Job.after()` - Called after success\n- `Job.middleware()` - Custom middleware\n- `Job.chained()` - Chained jobs\n- `Job.shouldBeUnique()` - Uniqueness check\n\n### Dispatch\n\n- `dispatch(job)` - Queue job\n- `dispatchSync(job)` - Execute immediately\n- `dispatchAfterResponse(job)` - Queue after response\n- `PendingDispatch.delay(seconds)` - Delay execution\n- `PendingDispatch.onQueue(name)` - Specify queue\n- `PendingDispatch.onConnection(name)` - Specify connection\n- `PendingDispatch.timeout(seconds)` - Set timeout\n- `PendingDispatch.retry(attempts)` - Set retries\n\n### QueueManager\n\n- `QueueManager.dispatch(job)` - Queue job\n- `QueueManager.dispatchSync(job)` - Execute immediately\n- `QueueManager.dispatchAfterResponse(job)` - Defer dispatch\n- `QueueManager.connection(name)` - Get driver\n- `QueueManager.fail(job, error)` - Mark failed\n- `QueueManager.extend(name, factory)` - Add driver\n\n### Worker\n\n- `Worker.run(options)` - Start processing\n- `Worker.processJob(job)` - Execute single job\n\n### Scheduler\n\n- `Scheduler.call(job)` - Schedule job\n- `Scheduler.exec(command)` - Schedule command\n- `Scheduler.cron(expression)` - Cron schedule\n\n### Failed Jobs\n\n- `DatabaseFailedJobProvider.all()` - List failed\n- `DatabaseFailedJobProvider.retry(id)` - Retry job\n- `DatabaseFailedJobProvider.forget(id)` - Delete job\n- `DatabaseFailedJobProvider.flush()` - Clear all\n\n## Events\n\nJobs emit events during execution:\n\n- Job dispatched\n- Job executing\n- Job succeeded\n- Job failed\n- Job timeout\n- Job retry\n\nSubscribe via event dispatcher:\n\n```typescript\ndispatcher.on('job.succeeded', (event) => {\n  console.log('Job succeeded:', event.job)\n})\n\ndispatcher.on('job.failed', (event) => {\n  console.log('Job failed:', event.job, event.error)\n})\n```\n\n## Documentation\n\nFor comprehensive documentation, visit [atlex.dev/guide/queue](https://atlex.dev/guide/queue)\n\n## License\n\n## MIT\n\nPart of [Atlex](https://atlex.dev) — A modern framework for Node.js.\n","readmeFilename":"README.md"}