{"_id":"@flatfile/queue","_rev":"36-edcbecce741d2675e5f140eb075105e4","name":"@flatfile/queue","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@flatfile/queue","version":"1.0.0","author":"","license":"ISC","_id":"@flatfile/queue@1.0.0","maintainers":[{"name":"mollyalger","email":"molly@flatfile.io"},{"name":"bangarang","email":"me@alexjrock.com"},{"name":"madmandrit","email":"wiafe23@gmail.com"},{"name":"roberto-alcantara-ffile","email":"cicero.roberto@flatfile.io"},{"name":"mairechew","email":"mairechew@gmail.com"},{"name":"jmmander","email":"jmzmander@gmail.com"},{"name":"srmotter","email":"stephen@motter.org"},{"name":"driscollrp","email":"driscollrp@gmail.com"},{"name":"abbywigdale","email":"abby.wigdale@gmail.com"},{"name":"sarocu","email":"sam@sarocu.com"},{"name":"dboskovic","email":"me@david.gs"},{"name":"brentkulwicki","email":"brentkulwicki@gmail.com"},{"name":"nate.ferrero","email":"nateferrero@gmail.com"},{"name":"markpieszak","email":"mpieszak84@gmail.com"},{"name":"robbiet480","email":"me@robbiet.us"},{"name":"jaredwalters","email":"jared@kegstool.com"}],"dist":{"shasum":"eba5f480df4aee820d807ac64f4bf72f5108f5ec","tarball":"https://registry.npmjs.org/@flatfile/queue/-/queue-1.0.0.tgz","fileCount":29,"integrity":"sha512-+AjFVFVObGsbtI4sI0GOjW9c+RJmDbAPljwHqD2UskB6hP3uYXBNbrFkKWCsAwHQ13g5kCtJfieZG5ufqB1u1w==","signatures":[{"sig":"MEQCIATMs1Alf4wCQXqC665cvqbA36KnJLKvLDy9I+3wxaa7AiABo85JTpG6JWTA9+oEdxpj5iPLTl/vP3Pu+ysOrTYaWQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":66747,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjKK8hACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpmLw/+Lo3sXTFpPoCjnezcRwqPRRIMyj7nI+qUgCmYzM8tb8HRicqt\r\nNyUWUu8qwJUmWqamnSwkLWyNHR6MOq/mJGh7V/Ttf2sYbpep1mh4BX6CNbgR\r\npNIfxIbsQI1sJzJe4X310PUN5RBI4j6sTaKIj2qBO+6+2bl2r+InefzbrIRh\r\n30s3+AfRbBhvCeBQ0h6DTWWfhg0A8vGswKaakjOOeloCBFTdmUcYMJBO3s0z\r\nY8TjURZRZ01e4F37dB0Lq8nOWQqI5TIXYLbc6gHSq/q3lJwyxugUy3qdBa6W\r\nDtZmw9P6/t+SdwJC5Na9qLd5hQinldk40wihxtmEtXxTuJq8gyxdpRw+qK6b\r\nO486z5kMpM0djFErjrWHmUgJFllr4SVsRMKtKY0afu0lsyd2WiZZ0mPszkTi\r\ngArXgSb3FQdIlEurG3X4UeBGT58eVf8yXA093+m1ennYQQLfjk2ZCU97B/JI\r\nvNrC88Dyc87MZWgSFvpQksWN9inccG+OfGoRqY4TbrQ+l6T/qrueON20TGkU\r\naJ9+5Z0N5H/AIYuXxCtGKLV/t8+dD9PNRhjhbyyOeRfLdfDrm3vPv3rYeAFb\r\nKvxMc8PkNFCacSdi9pcU9R5W4GhTunvB44P++xUX5nFguhlcHbhdkHqcA4Rz\r\nm5YEk64Nx8uRb0sdISXbyv3TjGZYIji6d0U=\r\n=cop8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","tsup":{"dts":true,"clean":true,"entry":["src/index.ts"],"format":["cjs","esm"],"sourcemap":true},"types":"./dist/index.d.ts","module":"dist/index.mjs","gitHead":"2df5ea0523a236e452f92c5c15bc1ba66b405135","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","clean":"rm -rf .turbo && rm -rf node_modules && rm -rf dist","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","coverage":"jest --coverage"},"_npmUser":{"name":"sarocu","email":"sam@sarocu.com"},"_npmVersion":"8.15.0","description":"## Engines - Sync - BullMQ","directories":{},"_nodeVersion":"16.17.0","dependencies":{"@flatfile/id":"^1.0.0","@nestjs/core":"^9.0.11","@nestjs/common":"^9.0.11","graphile-worker":"^0.13.0"},"_hasShrinkwrap":false,"devDependencies":{"givens":"^1.3.9","simple-mock":"^0.8.0","@types/simple-mock":"^0.8.2"},"_npmOperationalInternal":{"tmp":"tmp/queue_1.0.0_1663610656862_0.3256166213636511","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@flatfile/queue","version":"1.1.0","author":"","license":"ISC","_id":"@flatfile/queue@1.1.0","maintainers":[{"name":"hansjhoffman","email":"hoffman.hans.j@gmail.com"},{"name":"haleymt","email":"haley@flatfile.io"},{"name":"mmccooyyy","email":"matthew.e.mccoy@gmail.com"},{"name":"ahollenbeck","email":"alexhollenbeck@gmail.com"},{"name":"maerf0x0","email":"mikegraf000@gmail.com"},{"name":"rjhyde","email":"roby@flatfile.com"},{"name":"mpoythress","email":"michael@flatfile.io"},{"name":"flatderek","email":"derek@flatfile.io"},{"name":"ashleygmulligan","email":"ashleygmulligan@gmail.com"},{"name":"alnoor","email":"alnoor@flatfile.io"},{"name":"flatfilecolin","email":"colin@flatfile.io"},{"name":"bigcountrycrane","email":"eric@flatfile.io"},{"name":"flatfileinfra","email":"infra@flatfile.io"},{"name":"bangarang","email":"me@alexjrock.com"},{"name":"madmandrit","email":"wiafe23@gmail.com"},{"name":"roberto-alcantara-ffile","email":"cicero.roberto@flatfile.io"},{"name":"mairechew","email":"mairechew@gmail.com"},{"name":"jmmander","email":"jmzmander@gmail.com"},{"name":"srmotter","email":"stephen@motter.org"},{"name":"driscollrp","email":"driscollrp@gmail.com"},{"name":"sarocu","email":"sam@sarocu.com"},{"name":"dboskovic","email":"me@david.gs"},{"name":"brentkulwicki","email":"brentkulwicki@gmail.com"},{"name":"nate.ferrero","email":"nateferrero@gmail.com"},{"name":"jaredwalters","email":"jared@kegstool.com"}],"dist":{"shasum":"7fce9e6ea17e6e2be5da4a0f3f2e9781ae287482","tarball":"https://registry.npmjs.org/@flatfile/queue/-/queue-1.1.0.tgz","fileCount":29,"integrity":"sha512-ym/pXiGA2XYcLzch9LE+eVXSnkt9XCW6IeyAVqX6du7lNMbY5tyWtFjvxGTaaIvgMLgwIeTAW0dJgLRfxqq+Kw==","signatures":[{"sig":"MEUCIQDLkHRSyj3DSO09mcuM7G66T9RdbLQFZQ4M6la82ZqgCgIgFRvEdFrbFtk+CfuG1caLl91xe0rn45iY50J49kdAkTM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":1973860},"main":"dist/index.js","tsup":{"dts":true,"clean":true,"entry":["src/index.ts"],"format":["cjs","esm"],"sourcemap":true},"_from":"file:flatfile-queue-1.1.0.tgz","types":"./dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16 || >=18","pnpm":">=7"},"scripts":{"dev":"tsup --watch","test":"DD_SERVICE='@flatfile/queue' NODE_OPTIONS='-r dd-trace/ci/init' jest","build":"tsup","clean":"rm -rf .turbo && rm -rf node_modules && rm -rf dist","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","coverage":"jest --coverage --silent"},"_npmUser":{"name":"flatfileinfra","email":"infra@flatfile.io"},"_resolved":"/tmp/9d5600b13c48fa6e32f86a4c4a157151/flatfile-queue-1.1.0.tgz","_integrity":"sha512-ym/pXiGA2XYcLzch9LE+eVXSnkt9XCW6IeyAVqX6du7lNMbY5tyWtFjvxGTaaIvgMLgwIeTAW0dJgLRfxqq+Kw==","_npmVersion":"9.6.7","description":"## Engines - Sync - BullMQ","directories":{},"_nodeVersion":"18.17.0","dependencies":{"pg":"^8.9.0","axios":"^0.27.2","@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0","graphile-worker":"^0.13.0","reflect-metadata":"^0.1.13","@nestjs/platform-express":"^10.0.0"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","givens":"^1.3.9","lodash":"^4.17.21","express":"^4.18.2","dd-trace":"^3.5.0","@types/pg":"^8.6.6","simple-mock":"^0.8.0","@flatfile/id":"1.0.0","@flatfile/api":"0.0.23","@types/lodash":"^4.14.186","@nestjs/testing":"^10.0.0","@types/simple-mock":"^0.8.2","@flatfile/ts-config-flatfile":"0.0.0","@flatfile/jest-preset-flatfile":"0.0.0"},"peerDependencies":{"@flatfile/id":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/queue_1.1.0_1690827975412_0.14126044858306286","host":"s3://npm-registry-packages"}}},"time":{"created":"2022-09-19T18:04:16.805Z","modified":"2026-04-23T23:55:03.908Z","1.0.0":"2022-09-19T18:04:17.016Z","1.1.0":"2023-07-31T18:26:15.768Z"},"license":"ISC","description":"## Engines - Sync - BullMQ","maintainers":[{"email":"sam@sarocu.com","name":"sarocu"},{"email":"me@david.gs","name":"dboskovic"},{"email":"me@alexjrock.com","name":"bangarang"},{"email":"carlbrugger@proton.me","name":"carlbrugger"},{"email":"infra@flatfile.io","name":"flatfileinfra"},{"email":"derek@flatfile.io","name":"flatderek"},{"email":"eric@flatfile.io","name":"bigcountrycrane"},{"email":"matthew.e.mccoy@gmail.com","name":"mmccooyyy"},{"email":"matthew.gerstman@obvious.ai","name":"matthew-obvious"},{"email":"nikolazaris@gmail.com","name":"nlazaris"},{"email":"lion.hummer@gmail.com","name":"lionhummer"},{"email":"alexpoddubny@googlemail.com","name":"apoddubn"}],"readme":"# `@flatfile/queue`\n\nThis library provides a full-service queue abstraction layer for all systems in Flatfile. It provides a queue agnostic approach that allows us flexibility on the queue engine and effective testing.\n\n## Roadmap\n\n- [ ] Add support for a Redis Queue\n- [ ] Add callback methods to the worker for job failure, timeout, etc.\n- [ ] Verify behavior of SIGINT / SIGTERM on graceful shutdown\n- [ ] Ensure consistent queue depth alerting\n\n## Drivers\n\n### `SyncDriver`\n\nThis will execute jobs immediately. This is very helpful for testing job logic, as it does not require testing the internal operations of a specific queue engine.\n\n### `GraphileDriver({ databaseUrl })`\n\nThis provides a powerful Postgres backed queue implementation with ms latency.\n\n### `BullMQDriver` (coming soon)\n\nAdd support for a redis-based BullMQ implementation\n\n## Writing a new Worker\n\n```ts\nimport { Worker } from '@flatfile/queue'\nimport { Injectable } from '@nestjs/common'\n\n@Injectable() // -> optional if using in Nest\nexport class MyWorker extends Worker<{ myProp: string }> {\n  /**\n   * Provide a custom worker name, otherwise will use class name\n   * @default MyWorker\n   */\n  workerName = 'custom-name'\n\n  /**\n   * Determine the execution priority of this job, lowe numbers are higher priority\n   * @default 50\n   */\n  priority = 1\n\n  /**\n   * Delay the execution of this job by a number of ms\n   * @default 0\n   */\n  delay = 0\n\n  /**\n   * Set a number of milliseconds from enqueue where this job should be expired\n   * If the job is delayed unintentionally beyond this point it will be discarded\n   * @default 0\n   */\n  expiration = 0\n\n  /**\n   * Provide a set of retry options for this job\n   * @default 6\n   */\n  maxAttempts = 3\n\n  execute({ myProp }, attempt) {\n    // write logic here\n  }\n}\n```\n\n## Triggering a Job in Nest\n\nWhen you're ready to send a new job, you just need to call `addJob(worker, params, overrides)` and the magic will happen. If you're using `SyncProvider` it will execute immediately, otherwise it'll execute as soon as the queue reaches that job.\n\n```ts\n@Injectable()\nclass MyService {\n  constructor(\n    private queueProvider: QueueProvider,\n    private myWorker: MyWorker\n  ) {}\n\n  async myMethod() {\n    // enqueue something (await because maybe it'll happen synchronously)\n    await this.queueProvider.queue.addJob(\n      this.myWorker,\n      { myProp },\n      { delay: 500 }\n    )\n  }\n}\n```\n\n## Implementing a Nest Worker Job\n\n```ts\nimport { NestFactory } from '@nestjs/core'\nimport { QueueProvider } from '@flatfile/queue'\nimport { AppModule } from './App.module'\n\nasync function bootstrap() {\n  const app = await NestFactory.createApplicationContext(AppModule)\n  const { queue, workers } = app.get(QueueProvider)\n\n  await queue.runWorkers(...workers)\n}\nbootstrap()\n```\n\n```shell\nts-node ./worker.ts\n```\n\n## Implementing a Filtered Nest Worker\n\n```ts\nasync function bootstrap() {\n  const app = await NestFactory.createApplicationContext(AppModule)\n  const { queue, workers } = app.get(QueueProvider)\n\n  // provider.workers magically detects any Workers exported from any module\n  // use a filter function to run specific workers on a give node\n  await queue.runWorkers(\n    ...workers.filter((w) => process.argv.includes(w.name))\n  )\n}\nbootstrap()\n```\n\n```shell\nts-node ./worker.ts hard-job other-job\n```\n","readmeFilename":"README.md"}