@lowerdeck/queue 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/drivers/bullmq.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.module.js +1 -1
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +15 -6
- package/src/drivers/bullmq.ts +82 -44
- package/src/index.ts +7 -10
- package/.turbo/turbo-build.log +0 -14
- package/.turbo/turbo-test.log +0 -11
- package/CHANGELOG.md +0 -21
- package/tsconfig.json +0 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bullmq.d.ts","sourceRoot":"","sources":["../../src/drivers/bullmq.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bullmq.d.ts","sourceRoot":"","sources":["../../src/drivers/bullmq.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,oBAAoB,EACpB,WAAW,EAGX,YAAY,EAEZ,aAAa,EACd,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAWlC,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,SAAS,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,IAAI,iBAAiB,GAAI,OAAO,EACrC,MAAM,mBAAmB,KACxB,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAiKpC,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("@lowerdeck/delay"),r=require("@lowerdeck/memo"),
|
|
1
|
+
var e=require("@lowerdeck/delay"),t=require("@lowerdeck/execution-context"),r=require("@lowerdeck/id"),n=require("@lowerdeck/memo"),o=require("@lowerdeck/redis"),u=require("@lowerdeck/sentry"),i=require("bullmq");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=/*#__PURE__*/c(require("superjson"));function l(){return l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},l.apply(null,arguments)}function s(e){return s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},s(e)}function d(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(d=function(){return!!e})()}function f(e,t){return f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},f(e,t)}function p(e){var t="function"==typeof Map?new Map:void 0;return p=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return function(e,t,r){if(d())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,t);var o=new(e.bind.apply(e,n));return r&&f(o,r.prototype),o}(e,arguments,s(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),f(r,e)},p(e)}var m=/*#__PURE__*/function(e){function t(){return e.call(this,"RETRY")||this}var r,n;return n=e,(r=t).prototype=Object.create(n.prototype),r.prototype.constructor=r,f(r,n),t}(/*#__PURE__*/p(Error)),y=u.getSentry(),v=function(){var e;return(e=console).log.apply(e,["[QUEUE MANAGER]:"].concat([].slice.call(arguments)))},h={started:!1},P=new Set,j=function(e){return{start:function(){try{return Promise.resolve(Promise.all(e.map(function(e){return e.start()}))).then(function(e){return{close:function(){try{return Promise.resolve(Promise.all(e.map(function(e){return null==e||null==e.close?void 0:e.close()}))).then(function(){})}catch(e){return Promise.reject(e)}}}})}catch(e){return Promise.reject(e)}}}};exports.QueueRetryError=m,exports.combineQueueProcessors=j,exports.createQueue=function(u){if(u.driver||(u.driver="bullmq"),P.has(u.name))throw new Error("Queue with name "+u.name+" already exists");return P.add(u.name),function(u){var c=o.parseRedisUrl(u.redisUrl),s=new i.Queue(u.name,l({},u.queueOpts,{connection:c,defaultJobOptions:l({removeOnComplete:!0,removeOnFail:!0,attempts:10,keepLogs:10},u.jobOpts)})),d=n.memo(function(){return new i.QueueEvents(u.name,{connection:c})});return{name:u.name,add:function(e,r){try{return Promise.resolve(t.withExecutionContextOptional(function(t){try{return Promise.resolve(s.add("j",{payload:a.default.serialize(e),$$execution_context$$:t},{delay:null==r?void 0:r.delay,jobId:null==r?void 0:r.id,deduplication:null==r?void 0:r.deduplication}))}catch(e){return Promise.reject(e)}})).then(function(e){return{waitUntilFinished:function(t){try{var r=d();return Promise.resolve(e.waitUntilFinished(r,null==t?void 0:t.timeout)).then(function(){})}catch(e){return Promise.reject(e)}}}})}catch(e){return Promise.reject(e)}},addMany:function(e,r){try{return Promise.resolve(t.withExecutionContextOptional(function(t){try{return Promise.resolve(s.addBulk(e.map(function(e){return{name:"j",data:{payload:a.default.serialize(e),$$execution_context$$:t},opts:{delay:null==r?void 0:r.delay,jobId:null==r?void 0:r.id,deduplication:null==r?void 0:r.deduplication}}}))).then(function(){})}catch(e){return Promise.reject(e)}})).then(function(){})}catch(e){return Promise.reject(e)}},addManyWithOps:function(e){try{return Promise.resolve(t.withExecutionContextOptional(function(t){try{return Promise.resolve(s.addBulk(e.map(function(e){var r,n,o;return{name:"j",data:{payload:a.default.serialize(e.data),$$execution_context$$:t},opts:{delay:null==(r=e.opts)?void 0:r.delay,jobId:null==(n=e.opts)?void 0:n.id,deduplication:null==(o=e.opts)?void 0:o.deduplication}}}))).then(function(){})}catch(e){return Promise.reject(e)}})).then(function(){})}catch(e){return Promise.reject(e)}},process:function(n){var o={started:!1};return setTimeout(function(){h.started&&!o.started&&v("Queue "+u.name+" was not started within 10 seconds, this is likely a bug")},1e4),{start:function(){try{v("Starting queue "+u.name+" using bullmq"),o.started=!0,h.started=!0;var s=new i.Worker(u.name,function(o){try{return Promise.resolve(function(e,i){try{var c=function(){var e,i,c=o.data;try{i=a.default.deserialize(c.payload)}catch(e){i=c.payload}for(var l=c.$$execution_context$$;l&&"job"==l.type&&l.parent;)l=l.parent;return Promise.resolve(t.provideExecutionContext(t.createExecutionContext({type:"job",contextId:null!=(e=o.id)?e:r.generateSnowflakeId(),queue:u.name,parent:l}),function(){return n(i,o)})).then(function(){})}()}catch(e){return i(e)}return c&&c.then?c.then(void 0,i):c}(0,function(t){if(t instanceof m)return Promise.resolve(e.delay(1e3)).then(function(){throw t});throw y.captureException(t),console.error(t),t}))}catch(e){return Promise.reject(e)}},l({concurrency:50},u.workerOpts,{connection:c}));return Promise.resolve({close:function(){return s.close()}})}catch(e){return Promise.reject(e)}}}}}}({name:u.name,redisUrl:u.redisUrl,jobOpts:u.jobOpts,queueOpts:u.queueOpts,workerOpts:u.workerOpts})},exports.runQueueProcessors=function(e){try{var t=j(e);return Promise.resolve(t.start()).then(function(e){return process.on("SIGINT",function(){try{return Promise.resolve(null==e?void 0:e.close()).then(function(){})}catch(e){return Promise.reject(e)}}),process.on("SIGTERM",function(){try{return Promise.resolve(null==e?void 0:e.close()).then(function(){})}catch(e){return Promise.reject(e)}}),e})}catch(e){return Promise.reject(e)}};
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/lib/queueRetryError.ts","../src/drivers/bullmq.ts","../src/index.ts"],"sourcesContent":["export class QueueRetryError extends Error {\n constructor() {\n super('RETRY');\n }\n}\n","import { delay } from '@lowerdeck/delay';\nimport { memo } from '@lowerdeck/memo';\nimport { parseRedisUrl } from '@lowerdeck/redis';\nimport {\n DeduplicationOptions,\n JobsOptions,\n Queue,\n QueueEvents,\n QueueOptions,\n Worker,\n WorkerOptions\n} from 'bullmq';\nimport { QueueRetryError } from '../lib/queueRetryError';\nimport { IQueue } from '../types';\n\n// @ts-ignore\nimport SuperJson from 'superjson';\n\nlet log = (...any: any[]) => console.log('[QUEUE MANAGER]:', ...any);\n\nlet anyQueueStartedRef = { started: false };\n\nexport interface BullMqQueueOptions {\n delay?: number;\n id?: string;\n deduplication?: DeduplicationOptions;\n}\n\nexport interface BullMqCreateOptions {\n name: string;\n jobOpts?: JobsOptions;\n queueOpts?: Omit<QueueOptions, 'connection'>;\n workerOpts?: Omit<WorkerOptions, 'connection'>;\n redisUrl: string;\n}\n\nexport let createBullMqQueue = <JobData>(\n opts: BullMqCreateOptions\n): IQueue<JobData, BullMqQueueOptions> => {\n let redisOpts = parseRedisUrl(opts.redisUrl);\n\n let queue = new Queue<JobData>(opts.name, {\n ...opts.queueOpts,\n connection: redisOpts,\n defaultJobOptions: {\n removeOnComplete: true,\n removeOnFail: true,\n attempts: 10,\n keepLogs: 10,\n ...opts.jobOpts\n }\n });\n\n let useQueueEvents = memo(() => new QueueEvents(opts.name, { connection: redisOpts }));\n\n return {\n name: opts.name,\n\n add: async (payload, opts) => {\n let job = await queue.add(\n 'j' as any,\n {\n payload: SuperJson.serialize(payload)\n } as any,\n {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n );\n\n return {\n async waitUntilFinished(opts?: { timeout?: number }) {\n let events = useQueueEvents();\n await job.waitUntilFinished(events, opts?.timeout);\n }\n };\n },\n\n addMany: async (payloads, opts) => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload)\n },\n opts: {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n }) as any\n )\n );\n },\n\n addManyWithOps: async payloads => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload.data)\n },\n opts: {\n delay: payload.opts?.delay,\n jobId: payload.opts?.id,\n deduplication: payload.opts?.deduplication\n }\n }) as any\n )\n );\n },\n\n process: cb => {\n let staredRef = { started: false };\n\n setTimeout(() => {\n if (anyQueueStartedRef.started && !staredRef.started) {\n log(`Queue ${opts.name} was not started within 10 seconds, this is likely a bug`);\n }\n }, 10000);\n\n return {\n start: async () => {\n log(`Starting queue ${opts.name} using bullmq`);\n staredRef.started = true;\n anyQueueStartedRef.started = true;\n\n let worker = new Worker<JobData>(\n opts.name,\n async job => {\n try {\n let data = job.data as any;\n\n let payload: any;\n\n try {\n payload = SuperJson.deserialize(data.payload);\n } catch (e: any) {\n payload = data.payload;\n }\n\n await cb(payload as any, job);\n } catch (e: any) {\n if (e instanceof QueueRetryError) {\n await delay(1000);\n throw e;\n } else {\n console.error(`[QUEUE ERROR - ${opts.name}]`, e);\n throw e;\n }\n }\n },\n {\n concurrency: 50,\n ...opts.workerOpts,\n connection: redisOpts\n }\n );\n\n return {\n close: () => worker.close()\n };\n }\n };\n }\n };\n};\n","import { BullMqCreateOptions, createBullMqQueue } from './drivers/bullmq';\nimport { IQueueProcessor } from './types';\n\nexport * from './lib/queueRetryError';\nexport * from './types';\n\nlet seenNames = new Set<string>();\n\nexport let createQueue = <JobData>(opts: { driver?: 'bullmq' } & BullMqCreateOptions) => {\n if (!opts.driver) opts.driver = 'bullmq';\n\n if (seenNames.has(opts.name)) {\n throw new Error(`Queue with name ${opts.name} already exists`);\n }\n seenNames.add(opts.name);\n\n if (opts.driver === 'bullmq') {\n return createBullMqQueue<JobData>({\n name: opts.name,\n jobOpts: opts.jobOpts,\n queueOpts: opts.queueOpts,\n workerOpts: opts.workerOpts,\n redisUrl: opts.redisUrl\n });\n }\n\n throw new Error(`Unknown queue driver: ${opts.driver}`);\n};\n\nexport let combineQueueProcessors = (opts: IQueueProcessor[]): IQueueProcessor => {\n return {\n start: async () => {\n let processors = await Promise.all(opts.map(x => x.start()));\n\n return {\n close: async () => {\n await Promise.all(processors.map(x => x?.close?.()));\n }\n };\n }\n };\n};\n\nexport let runQueueProcessors = async (processor: IQueueProcessor[]) => {\n let combined = combineQueueProcessors(processor);\n\n let res = await combined.start();\n\n process.on('SIGINT', async () => {\n await res?.close();\n });\n\n process.on('SIGTERM', async () => {\n await res?.close();\n });\n\n return res;\n};\n"],"names":["QueueRetryError","_Error","call","this","_wrapNativeSuper","Error","log","_console","console","apply","concat","slice","arguments","anyQueueStartedRef","started","seenNames","Set","combineQueueProcessors","opts","start","Promise","resolve","all","map","x","then","processors","close","e","reject","driver","has","name","add","redisOpts","parseRedisUrl","redisUrl","queue","Queue","_extends","queueOpts","connection","defaultJobOptions","removeOnComplete","removeOnFail","attempts","keepLogs","jobOpts","useQueueEvents","memo","QueueEvents","payload","SuperJson","serialize","delay","jobId","id","deduplication","job","waitUntilFinished","events","timeout","addMany","payloads","addBulk","data","addManyWithOps","_payload$opts","_payload$opts2","_payload$opts3","process","cb","staredRef","setTimeout","worker","Worker","deserialize","_catch","error","concurrency","workerOpts","createBullMqQueue","processor","combined","res","on"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/lib/queueRetryError.ts","../src/drivers/bullmq.ts","../src/index.ts"],"sourcesContent":["export class QueueRetryError extends Error {\n constructor() {\n super('RETRY');\n }\n}\n","import { delay } from '@lowerdeck/delay';\nimport {\n createExecutionContext,\n ExecutionContext,\n provideExecutionContext,\n withExecutionContextOptional\n} from '@lowerdeck/execution-context';\nimport { generateSnowflakeId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\nimport { parseRedisUrl } from '@lowerdeck/redis';\nimport { getSentry } from '@lowerdeck/sentry';\nimport {\n DeduplicationOptions,\n JobsOptions,\n Queue,\n QueueEvents,\n QueueOptions,\n Worker,\n WorkerOptions\n} from 'bullmq';\nimport { QueueRetryError } from '../lib/queueRetryError';\nimport { IQueue } from '../types';\n\n// @ts-ignore\nimport SuperJson from 'superjson';\n\nlet Sentry = getSentry();\n\nlet log = (...any: any[]) => console.log('[QUEUE MANAGER]:', ...any);\n\nlet anyQueueStartedRef = { started: false };\n\nexport interface BullMqQueueOptions {\n delay?: number;\n id?: string;\n deduplication?: DeduplicationOptions;\n}\n\nexport interface BullMqCreateOptions {\n name: string;\n jobOpts?: JobsOptions;\n queueOpts?: Omit<QueueOptions, 'connection'>;\n workerOpts?: Omit<WorkerOptions, 'connection'>;\n redisUrl: string;\n}\n\nexport let createBullMqQueue = <JobData>(\n opts: BullMqCreateOptions\n): IQueue<JobData, BullMqQueueOptions> => {\n let redisOpts = parseRedisUrl(opts.redisUrl);\n\n let queue = new Queue<JobData>(opts.name, {\n ...opts.queueOpts,\n connection: redisOpts,\n defaultJobOptions: {\n removeOnComplete: true,\n removeOnFail: true,\n attempts: 10,\n keepLogs: 10,\n ...opts.jobOpts\n }\n });\n\n let useQueueEvents = memo(() => new QueueEvents(opts.name, { connection: redisOpts }));\n\n return {\n name: opts.name,\n\n add: async (payload, opts) => {\n let job = await withExecutionContextOptional(\n async ctx =>\n await queue.add(\n 'j' as any,\n {\n payload: SuperJson.serialize(payload),\n $$execution_context$$: ctx\n } as any,\n {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n )\n );\n\n return {\n async waitUntilFinished(opts?: { timeout?: number }) {\n let events = useQueueEvents();\n await job.waitUntilFinished(events, opts?.timeout);\n }\n };\n },\n\n addMany: async (payloads, opts) => {\n await withExecutionContextOptional(async ctx => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload),\n $$execution_context$$: ctx\n },\n opts: {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n }) as any\n )\n );\n });\n },\n\n addManyWithOps: async payloads => {\n await withExecutionContextOptional(async ctx => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload.data),\n $$execution_context$$: ctx\n },\n opts: {\n delay: payload.opts?.delay,\n jobId: payload.opts?.id,\n deduplication: payload.opts?.deduplication\n }\n }) as any\n )\n );\n });\n },\n\n process: cb => {\n let staredRef = { started: false };\n\n setTimeout(() => {\n if (anyQueueStartedRef.started && !staredRef.started) {\n log(`Queue ${opts.name} was not started within 10 seconds, this is likely a bug`);\n }\n }, 10000);\n\n return {\n start: async () => {\n log(`Starting queue ${opts.name} using bullmq`);\n staredRef.started = true;\n anyQueueStartedRef.started = true;\n\n let worker = new Worker<JobData>(\n opts.name,\n async job => {\n try {\n let data = job.data as any;\n\n let payload: any;\n\n try {\n payload = SuperJson.deserialize(data.payload);\n } catch (e: any) {\n payload = data.payload;\n }\n\n let parentExecutionContext = (data as any)\n .$$execution_context$$ as ExecutionContext;\n while (\n parentExecutionContext &&\n parentExecutionContext.type == 'job' &&\n parentExecutionContext.parent\n )\n parentExecutionContext = parentExecutionContext.parent;\n\n await provideExecutionContext(\n createExecutionContext({\n type: 'job',\n contextId: job.id ?? generateSnowflakeId(),\n queue: opts.name,\n parent: parentExecutionContext\n }),\n () => cb(payload as any, job)\n );\n } catch (e: any) {\n if (e instanceof QueueRetryError) {\n await delay(1000);\n throw e;\n } else {\n Sentry.captureException(e);\n console.error(e);\n throw e;\n }\n }\n },\n {\n concurrency: 50,\n ...opts.workerOpts,\n connection: redisOpts\n }\n );\n\n return {\n close: () => worker.close()\n };\n }\n };\n }\n };\n};\n","import { BullMqCreateOptions, createBullMqQueue } from './drivers/bullmq';\nimport { IQueueProcessor } from './types';\n\nexport * from './lib/queueRetryError';\nexport * from './types';\n\nlet seenNames = new Set<string>();\n\nexport let createQueue = <JobData>(opts: { driver?: 'bullmq' } & BullMqCreateOptions) => {\n if (!opts.driver) opts.driver = 'bullmq';\n\n if (seenNames.has(opts.name)) {\n throw new Error(`Queue with name ${opts.name} already exists`);\n }\n seenNames.add(opts.name);\n\n return createBullMqQueue<JobData>({\n name: opts.name,\n redisUrl: opts.redisUrl,\n\n jobOpts: opts.jobOpts,\n queueOpts: opts.queueOpts,\n workerOpts: opts.workerOpts\n });\n};\n\nexport let combineQueueProcessors = (opts: IQueueProcessor[]): IQueueProcessor => {\n return {\n start: async () => {\n let processors = await Promise.all(opts.map(x => x.start()));\n\n return {\n close: async () => {\n await Promise.all(processors.map(x => x?.close?.()));\n }\n };\n }\n };\n};\n\nexport let runQueueProcessors = async (processor: IQueueProcessor[]) => {\n let combined = combineQueueProcessors(processor);\n\n let res = await combined.start();\n\n process.on('SIGINT', async () => {\n await res?.close();\n });\n\n process.on('SIGTERM', async () => {\n await res?.close();\n });\n\n return res;\n};\n"],"names":["QueueRetryError","_Error","call","this","_wrapNativeSuper","Error","Sentry","getSentry","log","_console","console","apply","concat","slice","arguments","anyQueueStartedRef","started","seenNames","Set","combineQueueProcessors","opts","start","Promise","resolve","all","map","x","then","processors","close","e","reject","driver","has","name","add","redisOpts","parseRedisUrl","redisUrl","queue","Queue","_extends","queueOpts","connection","defaultJobOptions","removeOnComplete","removeOnFail","attempts","keepLogs","jobOpts","useQueueEvents","memo","QueueEvents","payload","withExecutionContextOptional","ctx","SuperJson","serialize","$$execution_context$$","delay","jobId","id","deduplication","job","waitUntilFinished","events","timeout","addMany","payloads","addBulk","data","addManyWithOps","_payload$opts","_payload$opts2","_payload$opts3","process","cb","staredRef","setTimeout","worker","Worker","_job$id","deserialize","parentExecutionContext","type","parent","provideExecutionContext","createExecutionContext","contextId","generateSnowflakeId","_catch","captureException","error","concurrency","workerOpts","createBullMqQueue","processor","combined","res","on"],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAqB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AAIxB,eAAO,IAAI,WAAW,GAAI,OAAO,EAAE,MAAM;IAAE,MAAM,CAAC,EAAE,QAAQ,CAAA;CAAE,GAAG,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAqB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AAIxB,eAAO,IAAI,WAAW,GAAI,OAAO,EAAE,MAAM;IAAE,MAAM,CAAC,EAAE,QAAQ,CAAA;CAAE,GAAG,mBAAmB,qFAgBnF,CAAC;AAEF,eAAO,IAAI,sBAAsB,GAAI,MAAM,eAAe,EAAE,KAAG,eAY9D,CAAC;AAEF,eAAO,IAAI,kBAAkB,GAAU,WAAW,eAAe,EAAE;;cAclE,CAAC"}
|
package/dist/index.module.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{delay as e}from"@lowerdeck/delay";import{
|
|
1
|
+
import{delay as e}from"@lowerdeck/delay";import{withExecutionContextOptional as t,provideExecutionContext as r,createExecutionContext as n}from"@lowerdeck/execution-context";import{generateSnowflakeId as o}from"@lowerdeck/id";import{memo as i}from"@lowerdeck/memo";import{parseRedisUrl as u}from"@lowerdeck/redis";import{getSentry as c}from"@lowerdeck/sentry";import{Queue as a,QueueEvents as l,Worker as s}from"bullmq";import d from"superjson";function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},f.apply(null,arguments)}function p(e){return p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},p(e)}function m(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(m=function(){return!!e})()}function y(e,t){return y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},y(e,t)}function v(e){var t="function"==typeof Map?new Map:void 0;return v=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return function(e,t,r){if(m())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,t);var o=new(e.bind.apply(e,n));return r&&y(o,r.prototype),o}(e,arguments,p(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),y(r,e)},v(e)}var h=/*#__PURE__*/function(e){function t(){return e.call(this,"RETRY")||this}var r,n;return n=e,(r=t).prototype=Object.create(n.prototype),r.prototype.constructor=r,y(r,n),t}(/*#__PURE__*/v(Error)),P=c(),j=function(){var e;return(e=console).log.apply(e,["[QUEUE MANAGER]:"].concat([].slice.call(arguments)))},b={started:!1},O=new Set,w=function(c){if(c.driver||(c.driver="bullmq"),O.has(c.name))throw new Error("Queue with name "+c.name+" already exists");return O.add(c.name),function(c){var p=u(c.redisUrl),m=new a(c.name,f({},c.queueOpts,{connection:p,defaultJobOptions:f({removeOnComplete:!0,removeOnFail:!0,attempts:10,keepLogs:10},c.jobOpts)})),y=i(function(){return new l(c.name,{connection:p})});return{name:c.name,add:function(e,r){try{return Promise.resolve(t(function(t){try{return Promise.resolve(m.add("j",{payload:d.serialize(e),$$execution_context$$:t},{delay:null==r?void 0:r.delay,jobId:null==r?void 0:r.id,deduplication:null==r?void 0:r.deduplication}))}catch(e){return Promise.reject(e)}})).then(function(e){return{waitUntilFinished:function(t){try{var r=y();return Promise.resolve(e.waitUntilFinished(r,null==t?void 0:t.timeout)).then(function(){})}catch(e){return Promise.reject(e)}}}})}catch(e){return Promise.reject(e)}},addMany:function(e,r){try{return Promise.resolve(t(function(t){try{return Promise.resolve(m.addBulk(e.map(function(e){return{name:"j",data:{payload:d.serialize(e),$$execution_context$$:t},opts:{delay:null==r?void 0:r.delay,jobId:null==r?void 0:r.id,deduplication:null==r?void 0:r.deduplication}}}))).then(function(){})}catch(e){return Promise.reject(e)}})).then(function(){})}catch(e){return Promise.reject(e)}},addManyWithOps:function(e){try{return Promise.resolve(t(function(t){try{return Promise.resolve(m.addBulk(e.map(function(e){var r,n,o;return{name:"j",data:{payload:d.serialize(e.data),$$execution_context$$:t},opts:{delay:null==(r=e.opts)?void 0:r.delay,jobId:null==(n=e.opts)?void 0:n.id,deduplication:null==(o=e.opts)?void 0:o.deduplication}}}))).then(function(){})}catch(e){return Promise.reject(e)}})).then(function(){})}catch(e){return Promise.reject(e)}},process:function(t){var i={started:!1};return setTimeout(function(){b.started&&!i.started&&j("Queue "+c.name+" was not started within 10 seconds, this is likely a bug")},1e4),{start:function(){try{j("Starting queue "+c.name+" using bullmq"),i.started=!0,b.started=!0;var u=new s(c.name,function(i){try{return Promise.resolve(function(e,u){try{var a=function(){var e,u,a=i.data;try{u=d.deserialize(a.payload)}catch(e){u=a.payload}for(var l=a.$$execution_context$$;l&&"job"==l.type&&l.parent;)l=l.parent;return Promise.resolve(r(n({type:"job",contextId:null!=(e=i.id)?e:o(),queue:c.name,parent:l}),function(){return t(u,i)})).then(function(){})}()}catch(e){return u(e)}return a&&a.then?a.then(void 0,u):a}(0,function(t){if(t instanceof h)return Promise.resolve(e(1e3)).then(function(){throw t});throw P.captureException(t),console.error(t),t}))}catch(e){return Promise.reject(e)}},f({concurrency:50},c.workerOpts,{connection:p}));return Promise.resolve({close:function(){return u.close()}})}catch(e){return Promise.reject(e)}}}}}}({name:c.name,redisUrl:c.redisUrl,jobOpts:c.jobOpts,queueOpts:c.queueOpts,workerOpts:c.workerOpts})},x=function(e){return{start:function(){try{return Promise.resolve(Promise.all(e.map(function(e){return e.start()}))).then(function(e){return{close:function(){try{return Promise.resolve(Promise.all(e.map(function(e){return null==e||null==e.close?void 0:e.close()}))).then(function(){})}catch(e){return Promise.reject(e)}}}})}catch(e){return Promise.reject(e)}}}},$=function(e){try{var t=x(e);return Promise.resolve(t.start()).then(function(e){return process.on("SIGINT",function(){try{return Promise.resolve(null==e?void 0:e.close()).then(function(){})}catch(e){return Promise.reject(e)}}),process.on("SIGTERM",function(){try{return Promise.resolve(null==e?void 0:e.close()).then(function(){})}catch(e){return Promise.reject(e)}}),e})}catch(e){return Promise.reject(e)}};export{h as QueueRetryError,x as combineQueueProcessors,w as createQueue,$ as runQueueProcessors};
|
|
2
2
|
//# sourceMappingURL=index.module.js.map
|
package/dist/index.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.js","sources":["../src/lib/queueRetryError.ts","../src/drivers/bullmq.ts","../src/index.ts"],"sourcesContent":["export class QueueRetryError extends Error {\n constructor() {\n super('RETRY');\n }\n}\n","import { delay } from '@lowerdeck/delay';\nimport { memo } from '@lowerdeck/memo';\nimport { parseRedisUrl } from '@lowerdeck/redis';\nimport {\n DeduplicationOptions,\n JobsOptions,\n Queue,\n QueueEvents,\n QueueOptions,\n Worker,\n WorkerOptions\n} from 'bullmq';\nimport { QueueRetryError } from '../lib/queueRetryError';\nimport { IQueue } from '../types';\n\n// @ts-ignore\nimport SuperJson from 'superjson';\n\nlet log = (...any: any[]) => console.log('[QUEUE MANAGER]:', ...any);\n\nlet anyQueueStartedRef = { started: false };\n\nexport interface BullMqQueueOptions {\n delay?: number;\n id?: string;\n deduplication?: DeduplicationOptions;\n}\n\nexport interface BullMqCreateOptions {\n name: string;\n jobOpts?: JobsOptions;\n queueOpts?: Omit<QueueOptions, 'connection'>;\n workerOpts?: Omit<WorkerOptions, 'connection'>;\n redisUrl: string;\n}\n\nexport let createBullMqQueue = <JobData>(\n opts: BullMqCreateOptions\n): IQueue<JobData, BullMqQueueOptions> => {\n let redisOpts = parseRedisUrl(opts.redisUrl);\n\n let queue = new Queue<JobData>(opts.name, {\n ...opts.queueOpts,\n connection: redisOpts,\n defaultJobOptions: {\n removeOnComplete: true,\n removeOnFail: true,\n attempts: 10,\n keepLogs: 10,\n ...opts.jobOpts\n }\n });\n\n let useQueueEvents = memo(() => new QueueEvents(opts.name, { connection: redisOpts }));\n\n return {\n name: opts.name,\n\n add: async (payload, opts) => {\n let job = await queue.add(\n 'j' as any,\n {\n payload: SuperJson.serialize(payload)\n } as any,\n {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n );\n\n return {\n async waitUntilFinished(opts?: { timeout?: number }) {\n let events = useQueueEvents();\n await job.waitUntilFinished(events, opts?.timeout);\n }\n };\n },\n\n addMany: async (payloads, opts) => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload)\n },\n opts: {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n }) as any\n )\n );\n },\n\n addManyWithOps: async payloads => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload.data)\n },\n opts: {\n delay: payload.opts?.delay,\n jobId: payload.opts?.id,\n deduplication: payload.opts?.deduplication\n }\n }) as any\n )\n );\n },\n\n process: cb => {\n let staredRef = { started: false };\n\n setTimeout(() => {\n if (anyQueueStartedRef.started && !staredRef.started) {\n log(`Queue ${opts.name} was not started within 10 seconds, this is likely a bug`);\n }\n }, 10000);\n\n return {\n start: async () => {\n log(`Starting queue ${opts.name} using bullmq`);\n staredRef.started = true;\n anyQueueStartedRef.started = true;\n\n let worker = new Worker<JobData>(\n opts.name,\n async job => {\n try {\n let data = job.data as any;\n\n let payload: any;\n\n try {\n payload = SuperJson.deserialize(data.payload);\n } catch (e: any) {\n payload = data.payload;\n }\n\n await cb(payload as any, job);\n } catch (e: any) {\n if (e instanceof QueueRetryError) {\n await delay(1000);\n throw e;\n } else {\n console.error(`[QUEUE ERROR - ${opts.name}]`, e);\n throw e;\n }\n }\n },\n {\n concurrency: 50,\n ...opts.workerOpts,\n connection: redisOpts\n }\n );\n\n return {\n close: () => worker.close()\n };\n }\n };\n }\n };\n};\n","import { BullMqCreateOptions, createBullMqQueue } from './drivers/bullmq';\nimport { IQueueProcessor } from './types';\n\nexport * from './lib/queueRetryError';\nexport * from './types';\n\nlet seenNames = new Set<string>();\n\nexport let createQueue = <JobData>(opts: { driver?: 'bullmq' } & BullMqCreateOptions) => {\n if (!opts.driver) opts.driver = 'bullmq';\n\n if (seenNames.has(opts.name)) {\n throw new Error(`Queue with name ${opts.name} already exists`);\n }\n seenNames.add(opts.name);\n\n if (opts.driver === 'bullmq') {\n return createBullMqQueue<JobData>({\n name: opts.name,\n jobOpts: opts.jobOpts,\n queueOpts: opts.queueOpts,\n workerOpts: opts.workerOpts,\n redisUrl: opts.redisUrl\n });\n }\n\n throw new Error(`Unknown queue driver: ${opts.driver}`);\n};\n\nexport let combineQueueProcessors = (opts: IQueueProcessor[]): IQueueProcessor => {\n return {\n start: async () => {\n let processors = await Promise.all(opts.map(x => x.start()));\n\n return {\n close: async () => {\n await Promise.all(processors.map(x => x?.close?.()));\n }\n };\n }\n };\n};\n\nexport let runQueueProcessors = async (processor: IQueueProcessor[]) => {\n let combined = combineQueueProcessors(processor);\n\n let res = await combined.start();\n\n process.on('SIGINT', async () => {\n await res?.close();\n });\n\n process.on('SIGTERM', async () => {\n await res?.close();\n });\n\n return res;\n};\n"],"names":["QueueRetryError","_Error","call","this","_wrapNativeSuper","Error","log","_console","console","apply","concat","slice","arguments","anyQueueStartedRef","started","seenNames","Set","createQueue","opts","driver","has","name","add","redisOpts","parseRedisUrl","redisUrl","queue","Queue","_extends","queueOpts","connection","defaultJobOptions","removeOnComplete","removeOnFail","attempts","keepLogs","jobOpts","useQueueEvents","memo","QueueEvents","payload","Promise","resolve","SuperJson","serialize","delay","jobId","id","deduplication","then","job","waitUntilFinished","events","timeout","e","reject","addMany","payloads","addBulk","map","data","addManyWithOps","_payload$opts","_payload$opts2","_payload$opts3","process","cb","staredRef","setTimeout","start","worker","Worker","deserialize","_catch","error","concurrency","workerOpts","close","createBullMqQueue","combineQueueProcessors","all","x","processors","runQueueProcessors","processor","combined","res","on"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.module.js","sources":["../src/lib/queueRetryError.ts","../src/drivers/bullmq.ts","../src/index.ts"],"sourcesContent":["export class QueueRetryError extends Error {\n constructor() {\n super('RETRY');\n }\n}\n","import { delay } from '@lowerdeck/delay';\nimport {\n createExecutionContext,\n ExecutionContext,\n provideExecutionContext,\n withExecutionContextOptional\n} from '@lowerdeck/execution-context';\nimport { generateSnowflakeId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\nimport { parseRedisUrl } from '@lowerdeck/redis';\nimport { getSentry } from '@lowerdeck/sentry';\nimport {\n DeduplicationOptions,\n JobsOptions,\n Queue,\n QueueEvents,\n QueueOptions,\n Worker,\n WorkerOptions\n} from 'bullmq';\nimport { QueueRetryError } from '../lib/queueRetryError';\nimport { IQueue } from '../types';\n\n// @ts-ignore\nimport SuperJson from 'superjson';\n\nlet Sentry = getSentry();\n\nlet log = (...any: any[]) => console.log('[QUEUE MANAGER]:', ...any);\n\nlet anyQueueStartedRef = { started: false };\n\nexport interface BullMqQueueOptions {\n delay?: number;\n id?: string;\n deduplication?: DeduplicationOptions;\n}\n\nexport interface BullMqCreateOptions {\n name: string;\n jobOpts?: JobsOptions;\n queueOpts?: Omit<QueueOptions, 'connection'>;\n workerOpts?: Omit<WorkerOptions, 'connection'>;\n redisUrl: string;\n}\n\nexport let createBullMqQueue = <JobData>(\n opts: BullMqCreateOptions\n): IQueue<JobData, BullMqQueueOptions> => {\n let redisOpts = parseRedisUrl(opts.redisUrl);\n\n let queue = new Queue<JobData>(opts.name, {\n ...opts.queueOpts,\n connection: redisOpts,\n defaultJobOptions: {\n removeOnComplete: true,\n removeOnFail: true,\n attempts: 10,\n keepLogs: 10,\n ...opts.jobOpts\n }\n });\n\n let useQueueEvents = memo(() => new QueueEvents(opts.name, { connection: redisOpts }));\n\n return {\n name: opts.name,\n\n add: async (payload, opts) => {\n let job = await withExecutionContextOptional(\n async ctx =>\n await queue.add(\n 'j' as any,\n {\n payload: SuperJson.serialize(payload),\n $$execution_context$$: ctx\n } as any,\n {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n )\n );\n\n return {\n async waitUntilFinished(opts?: { timeout?: number }) {\n let events = useQueueEvents();\n await job.waitUntilFinished(events, opts?.timeout);\n }\n };\n },\n\n addMany: async (payloads, opts) => {\n await withExecutionContextOptional(async ctx => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload),\n $$execution_context$$: ctx\n },\n opts: {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n }) as any\n )\n );\n });\n },\n\n addManyWithOps: async payloads => {\n await withExecutionContextOptional(async ctx => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload.data),\n $$execution_context$$: ctx\n },\n opts: {\n delay: payload.opts?.delay,\n jobId: payload.opts?.id,\n deduplication: payload.opts?.deduplication\n }\n }) as any\n )\n );\n });\n },\n\n process: cb => {\n let staredRef = { started: false };\n\n setTimeout(() => {\n if (anyQueueStartedRef.started && !staredRef.started) {\n log(`Queue ${opts.name} was not started within 10 seconds, this is likely a bug`);\n }\n }, 10000);\n\n return {\n start: async () => {\n log(`Starting queue ${opts.name} using bullmq`);\n staredRef.started = true;\n anyQueueStartedRef.started = true;\n\n let worker = new Worker<JobData>(\n opts.name,\n async job => {\n try {\n let data = job.data as any;\n\n let payload: any;\n\n try {\n payload = SuperJson.deserialize(data.payload);\n } catch (e: any) {\n payload = data.payload;\n }\n\n let parentExecutionContext = (data as any)\n .$$execution_context$$ as ExecutionContext;\n while (\n parentExecutionContext &&\n parentExecutionContext.type == 'job' &&\n parentExecutionContext.parent\n )\n parentExecutionContext = parentExecutionContext.parent;\n\n await provideExecutionContext(\n createExecutionContext({\n type: 'job',\n contextId: job.id ?? generateSnowflakeId(),\n queue: opts.name,\n parent: parentExecutionContext\n }),\n () => cb(payload as any, job)\n );\n } catch (e: any) {\n if (e instanceof QueueRetryError) {\n await delay(1000);\n throw e;\n } else {\n Sentry.captureException(e);\n console.error(e);\n throw e;\n }\n }\n },\n {\n concurrency: 50,\n ...opts.workerOpts,\n connection: redisOpts\n }\n );\n\n return {\n close: () => worker.close()\n };\n }\n };\n }\n };\n};\n","import { BullMqCreateOptions, createBullMqQueue } from './drivers/bullmq';\nimport { IQueueProcessor } from './types';\n\nexport * from './lib/queueRetryError';\nexport * from './types';\n\nlet seenNames = new Set<string>();\n\nexport let createQueue = <JobData>(opts: { driver?: 'bullmq' } & BullMqCreateOptions) => {\n if (!opts.driver) opts.driver = 'bullmq';\n\n if (seenNames.has(opts.name)) {\n throw new Error(`Queue with name ${opts.name} already exists`);\n }\n seenNames.add(opts.name);\n\n return createBullMqQueue<JobData>({\n name: opts.name,\n redisUrl: opts.redisUrl,\n\n jobOpts: opts.jobOpts,\n queueOpts: opts.queueOpts,\n workerOpts: opts.workerOpts\n });\n};\n\nexport let combineQueueProcessors = (opts: IQueueProcessor[]): IQueueProcessor => {\n return {\n start: async () => {\n let processors = await Promise.all(opts.map(x => x.start()));\n\n return {\n close: async () => {\n await Promise.all(processors.map(x => x?.close?.()));\n }\n };\n }\n };\n};\n\nexport let runQueueProcessors = async (processor: IQueueProcessor[]) => {\n let combined = combineQueueProcessors(processor);\n\n let res = await combined.start();\n\n process.on('SIGINT', async () => {\n await res?.close();\n });\n\n process.on('SIGTERM', async () => {\n await res?.close();\n });\n\n return res;\n};\n"],"names":["QueueRetryError","_Error","call","this","_wrapNativeSuper","Error","Sentry","getSentry","log","_console","console","apply","concat","slice","arguments","anyQueueStartedRef","started","seenNames","Set","createQueue","opts","driver","has","name","add","redisOpts","parseRedisUrl","redisUrl","queue","Queue","_extends","queueOpts","connection","defaultJobOptions","removeOnComplete","removeOnFail","attempts","keepLogs","jobOpts","useQueueEvents","memo","QueueEvents","payload","Promise","resolve","withExecutionContextOptional","ctx","SuperJson","serialize","$$execution_context$$","delay","jobId","id","deduplication","e","reject","then","job","waitUntilFinished","events","timeout","addMany","payloads","addBulk","map","data","addManyWithOps","_payload$opts","_payload$opts2","_payload$opts3","process","cb","staredRef","setTimeout","start","worker","Worker","_job$id","deserialize","parentExecutionContext","type","parent","provideExecutionContext","createExecutionContext","contextId","generateSnowflakeId","_catch","captureException","error","concurrency","workerOpts","close","createBullMqQueue","combineQueueProcessors","all","x","processors","runQueueProcessors","processor","combined","res","on"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@lowerdeck/delay"),require("@lowerdeck/execution-context"),require("@lowerdeck/id"),require("@lowerdeck/memo"),require("@lowerdeck/redis"),require("@lowerdeck/sentry"),require("bullmq"),require("superjson")):"function"==typeof define&&define.amd?define(["exports","@lowerdeck/delay","@lowerdeck/execution-context","@lowerdeck/id","@lowerdeck/memo","@lowerdeck/redis","@lowerdeck/sentry","bullmq","superjson"],t):t((e||self).queue={},e.delay,e.executionContext,e.id,e.memo,e.redis,e.sentry,e.bullmq,e.superjson)}(this,function(e,t,r,n,o,u,i,c,a){function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=/*#__PURE__*/l(a);function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},d.apply(null,arguments)}function f(e){return f=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},f(e)}function p(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(p=function(){return!!e})()}function m(e,t){return m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},m(e,t)}function y(e){var t="function"==typeof Map?new Map:void 0;return y=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return function(e,t,r){if(p())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,t);var o=new(e.bind.apply(e,n));return r&&m(o,r.prototype),o}(e,arguments,f(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),m(r,e)},y(e)}var v=/*#__PURE__*/function(e){function t(){return e.call(this,"RETRY")||this}var r,n;return n=e,(r=t).prototype=Object.create(n.prototype),r.prototype.constructor=r,m(r,n),t}(/*#__PURE__*/y(Error)),h=i.getSentry(),P=function(){var e;return(e=console).log.apply(e,["[QUEUE MANAGER]:"].concat([].slice.call(arguments)))},j={started:!1},w=new Set,b=function(e){return{start:function(){try{return Promise.resolve(Promise.all(e.map(function(e){return e.start()}))).then(function(e){return{close:function(){try{return Promise.resolve(Promise.all(e.map(function(e){return null==e||null==e.close?void 0:e.close()}))).then(function(){})}catch(e){return Promise.reject(e)}}}})}catch(e){return Promise.reject(e)}}}};e.QueueRetryError=v,e.combineQueueProcessors=b,e.createQueue=function(e){if(e.driver||(e.driver="bullmq"),w.has(e.name))throw new Error("Queue with name "+e.name+" already exists");return w.add(e.name),function(e){var i=u.parseRedisUrl(e.redisUrl),a=new c.Queue(e.name,d({},e.queueOpts,{connection:i,defaultJobOptions:d({removeOnComplete:!0,removeOnFail:!0,attempts:10,keepLogs:10},e.jobOpts)})),l=o.memo(function(){return new c.QueueEvents(e.name,{connection:i})});return{name:e.name,add:function(e,t){try{return Promise.resolve(r.withExecutionContextOptional(function(r){try{return Promise.resolve(a.add("j",{payload:s.default.serialize(e),$$execution_context$$:r},{delay:null==t?void 0:t.delay,jobId:null==t?void 0:t.id,deduplication:null==t?void 0:t.deduplication}))}catch(e){return Promise.reject(e)}})).then(function(e){return{waitUntilFinished:function(t){try{var r=l();return Promise.resolve(e.waitUntilFinished(r,null==t?void 0:t.timeout)).then(function(){})}catch(e){return Promise.reject(e)}}}})}catch(e){return Promise.reject(e)}},addMany:function(e,t){try{return Promise.resolve(r.withExecutionContextOptional(function(r){try{return Promise.resolve(a.addBulk(e.map(function(e){return{name:"j",data:{payload:s.default.serialize(e),$$execution_context$$:r},opts:{delay:null==t?void 0:t.delay,jobId:null==t?void 0:t.id,deduplication:null==t?void 0:t.deduplication}}}))).then(function(){})}catch(e){return Promise.reject(e)}})).then(function(){})}catch(e){return Promise.reject(e)}},addManyWithOps:function(e){try{return Promise.resolve(r.withExecutionContextOptional(function(t){try{return Promise.resolve(a.addBulk(e.map(function(e){var r,n,o;return{name:"j",data:{payload:s.default.serialize(e.data),$$execution_context$$:t},opts:{delay:null==(r=e.opts)?void 0:r.delay,jobId:null==(n=e.opts)?void 0:n.id,deduplication:null==(o=e.opts)?void 0:o.deduplication}}}))).then(function(){})}catch(e){return Promise.reject(e)}})).then(function(){})}catch(e){return Promise.reject(e)}},process:function(o){var u={started:!1};return setTimeout(function(){j.started&&!u.started&&P("Queue "+e.name+" was not started within 10 seconds, this is likely a bug")},1e4),{start:function(){try{P("Starting queue "+e.name+" using bullmq"),u.started=!0,j.started=!0;var a=new c.Worker(e.name,function(u){try{return Promise.resolve(function(t,i){try{var c=function(){var t,i,c=u.data;try{i=s.default.deserialize(c.payload)}catch(e){i=c.payload}for(var a=c.$$execution_context$$;a&&"job"==a.type&&a.parent;)a=a.parent;return Promise.resolve(r.provideExecutionContext(r.createExecutionContext({type:"job",contextId:null!=(t=u.id)?t:n.generateSnowflakeId(),queue:e.name,parent:a}),function(){return o(i,u)})).then(function(){})}()}catch(e){return i(e)}return c&&c.then?c.then(void 0,i):c}(0,function(e){if(e instanceof v)return Promise.resolve(t.delay(1e3)).then(function(){throw e});throw h.captureException(e),console.error(e),e}))}catch(e){return Promise.reject(e)}},d({concurrency:50},e.workerOpts,{connection:i}));return Promise.resolve({close:function(){return a.close()}})}catch(e){return Promise.reject(e)}}}}}}({name:e.name,redisUrl:e.redisUrl,jobOpts:e.jobOpts,queueOpts:e.queueOpts,workerOpts:e.workerOpts})},e.runQueueProcessors=function(e){try{var t=b(e);return Promise.resolve(t.start()).then(function(e){return process.on("SIGINT",function(){try{return Promise.resolve(null==e?void 0:e.close()).then(function(){})}catch(e){return Promise.reject(e)}}),process.on("SIGTERM",function(){try{return Promise.resolve(null==e?void 0:e.close()).then(function(){})}catch(e){return Promise.reject(e)}}),e})}catch(e){return Promise.reject(e)}}});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/lib/queueRetryError.ts","../src/drivers/bullmq.ts","../src/index.ts"],"sourcesContent":["export class QueueRetryError extends Error {\n constructor() {\n super('RETRY');\n }\n}\n","import { delay } from '@lowerdeck/delay';\nimport { memo } from '@lowerdeck/memo';\nimport { parseRedisUrl } from '@lowerdeck/redis';\nimport {\n DeduplicationOptions,\n JobsOptions,\n Queue,\n QueueEvents,\n QueueOptions,\n Worker,\n WorkerOptions\n} from 'bullmq';\nimport { QueueRetryError } from '../lib/queueRetryError';\nimport { IQueue } from '../types';\n\n// @ts-ignore\nimport SuperJson from 'superjson';\n\nlet log = (...any: any[]) => console.log('[QUEUE MANAGER]:', ...any);\n\nlet anyQueueStartedRef = { started: false };\n\nexport interface BullMqQueueOptions {\n delay?: number;\n id?: string;\n deduplication?: DeduplicationOptions;\n}\n\nexport interface BullMqCreateOptions {\n name: string;\n jobOpts?: JobsOptions;\n queueOpts?: Omit<QueueOptions, 'connection'>;\n workerOpts?: Omit<WorkerOptions, 'connection'>;\n redisUrl: string;\n}\n\nexport let createBullMqQueue = <JobData>(\n opts: BullMqCreateOptions\n): IQueue<JobData, BullMqQueueOptions> => {\n let redisOpts = parseRedisUrl(opts.redisUrl);\n\n let queue = new Queue<JobData>(opts.name, {\n ...opts.queueOpts,\n connection: redisOpts,\n defaultJobOptions: {\n removeOnComplete: true,\n removeOnFail: true,\n attempts: 10,\n keepLogs: 10,\n ...opts.jobOpts\n }\n });\n\n let useQueueEvents = memo(() => new QueueEvents(opts.name, { connection: redisOpts }));\n\n return {\n name: opts.name,\n\n add: async (payload, opts) => {\n let job = await queue.add(\n 'j' as any,\n {\n payload: SuperJson.serialize(payload)\n } as any,\n {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n );\n\n return {\n async waitUntilFinished(opts?: { timeout?: number }) {\n let events = useQueueEvents();\n await job.waitUntilFinished(events, opts?.timeout);\n }\n };\n },\n\n addMany: async (payloads, opts) => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload)\n },\n opts: {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n }) as any\n )\n );\n },\n\n addManyWithOps: async payloads => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload.data)\n },\n opts: {\n delay: payload.opts?.delay,\n jobId: payload.opts?.id,\n deduplication: payload.opts?.deduplication\n }\n }) as any\n )\n );\n },\n\n process: cb => {\n let staredRef = { started: false };\n\n setTimeout(() => {\n if (anyQueueStartedRef.started && !staredRef.started) {\n log(`Queue ${opts.name} was not started within 10 seconds, this is likely a bug`);\n }\n }, 10000);\n\n return {\n start: async () => {\n log(`Starting queue ${opts.name} using bullmq`);\n staredRef.started = true;\n anyQueueStartedRef.started = true;\n\n let worker = new Worker<JobData>(\n opts.name,\n async job => {\n try {\n let data = job.data as any;\n\n let payload: any;\n\n try {\n payload = SuperJson.deserialize(data.payload);\n } catch (e: any) {\n payload = data.payload;\n }\n\n await cb(payload as any, job);\n } catch (e: any) {\n if (e instanceof QueueRetryError) {\n await delay(1000);\n throw e;\n } else {\n console.error(`[QUEUE ERROR - ${opts.name}]`, e);\n throw e;\n }\n }\n },\n {\n concurrency: 50,\n ...opts.workerOpts,\n connection: redisOpts\n }\n );\n\n return {\n close: () => worker.close()\n };\n }\n };\n }\n };\n};\n","import { BullMqCreateOptions, createBullMqQueue } from './drivers/bullmq';\nimport { IQueueProcessor } from './types';\n\nexport * from './lib/queueRetryError';\nexport * from './types';\n\nlet seenNames = new Set<string>();\n\nexport let createQueue = <JobData>(opts: { driver?: 'bullmq' } & BullMqCreateOptions) => {\n if (!opts.driver) opts.driver = 'bullmq';\n\n if (seenNames.has(opts.name)) {\n throw new Error(`Queue with name ${opts.name} already exists`);\n }\n seenNames.add(opts.name);\n\n if (opts.driver === 'bullmq') {\n return createBullMqQueue<JobData>({\n name: opts.name,\n jobOpts: opts.jobOpts,\n queueOpts: opts.queueOpts,\n workerOpts: opts.workerOpts,\n redisUrl: opts.redisUrl\n });\n }\n\n throw new Error(`Unknown queue driver: ${opts.driver}`);\n};\n\nexport let combineQueueProcessors = (opts: IQueueProcessor[]): IQueueProcessor => {\n return {\n start: async () => {\n let processors = await Promise.all(opts.map(x => x.start()));\n\n return {\n close: async () => {\n await Promise.all(processors.map(x => x?.close?.()));\n }\n };\n }\n };\n};\n\nexport let runQueueProcessors = async (processor: IQueueProcessor[]) => {\n let combined = combineQueueProcessors(processor);\n\n let res = await combined.start();\n\n process.on('SIGINT', async () => {\n await res?.close();\n });\n\n process.on('SIGTERM', async () => {\n await res?.close();\n });\n\n return res;\n};\n"],"names":["QueueRetryError","_Error","call","this","_wrapNativeSuper","Error","log","_console","console","apply","concat","slice","arguments","anyQueueStartedRef","started","seenNames","Set","combineQueueProcessors","opts","start","Promise","resolve","all","map","x","then","processors","close","e","reject","driver","has","name","add","redisOpts","parseRedisUrl","redisUrl","queue","Queue","_extends","queueOpts","connection","defaultJobOptions","removeOnComplete","removeOnFail","attempts","keepLogs","jobOpts","useQueueEvents","memo","QueueEvents","payload","SuperJson","serialize","delay","jobId","id","deduplication","job","waitUntilFinished","events","timeout","addMany","payloads","addBulk","data","addManyWithOps","_payload$opts","_payload$opts2","_payload$opts3","process","cb","staredRef","setTimeout","worker","Worker","deserialize","_catch","error","concurrency","workerOpts","createBullMqQueue","processor","combined","res","on"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/lib/queueRetryError.ts","../src/drivers/bullmq.ts","../src/index.ts"],"sourcesContent":["export class QueueRetryError extends Error {\n constructor() {\n super('RETRY');\n }\n}\n","import { delay } from '@lowerdeck/delay';\nimport {\n createExecutionContext,\n ExecutionContext,\n provideExecutionContext,\n withExecutionContextOptional\n} from '@lowerdeck/execution-context';\nimport { generateSnowflakeId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\nimport { parseRedisUrl } from '@lowerdeck/redis';\nimport { getSentry } from '@lowerdeck/sentry';\nimport {\n DeduplicationOptions,\n JobsOptions,\n Queue,\n QueueEvents,\n QueueOptions,\n Worker,\n WorkerOptions\n} from 'bullmq';\nimport { QueueRetryError } from '../lib/queueRetryError';\nimport { IQueue } from '../types';\n\n// @ts-ignore\nimport SuperJson from 'superjson';\n\nlet Sentry = getSentry();\n\nlet log = (...any: any[]) => console.log('[QUEUE MANAGER]:', ...any);\n\nlet anyQueueStartedRef = { started: false };\n\nexport interface BullMqQueueOptions {\n delay?: number;\n id?: string;\n deduplication?: DeduplicationOptions;\n}\n\nexport interface BullMqCreateOptions {\n name: string;\n jobOpts?: JobsOptions;\n queueOpts?: Omit<QueueOptions, 'connection'>;\n workerOpts?: Omit<WorkerOptions, 'connection'>;\n redisUrl: string;\n}\n\nexport let createBullMqQueue = <JobData>(\n opts: BullMqCreateOptions\n): IQueue<JobData, BullMqQueueOptions> => {\n let redisOpts = parseRedisUrl(opts.redisUrl);\n\n let queue = new Queue<JobData>(opts.name, {\n ...opts.queueOpts,\n connection: redisOpts,\n defaultJobOptions: {\n removeOnComplete: true,\n removeOnFail: true,\n attempts: 10,\n keepLogs: 10,\n ...opts.jobOpts\n }\n });\n\n let useQueueEvents = memo(() => new QueueEvents(opts.name, { connection: redisOpts }));\n\n return {\n name: opts.name,\n\n add: async (payload, opts) => {\n let job = await withExecutionContextOptional(\n async ctx =>\n await queue.add(\n 'j' as any,\n {\n payload: SuperJson.serialize(payload),\n $$execution_context$$: ctx\n } as any,\n {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n )\n );\n\n return {\n async waitUntilFinished(opts?: { timeout?: number }) {\n let events = useQueueEvents();\n await job.waitUntilFinished(events, opts?.timeout);\n }\n };\n },\n\n addMany: async (payloads, opts) => {\n await withExecutionContextOptional(async ctx => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload),\n $$execution_context$$: ctx\n },\n opts: {\n delay: opts?.delay,\n jobId: opts?.id,\n deduplication: opts?.deduplication\n }\n }) as any\n )\n );\n });\n },\n\n addManyWithOps: async payloads => {\n await withExecutionContextOptional(async ctx => {\n await queue.addBulk(\n payloads.map(\n payload =>\n ({\n name: 'j',\n data: {\n payload: SuperJson.serialize(payload.data),\n $$execution_context$$: ctx\n },\n opts: {\n delay: payload.opts?.delay,\n jobId: payload.opts?.id,\n deduplication: payload.opts?.deduplication\n }\n }) as any\n )\n );\n });\n },\n\n process: cb => {\n let staredRef = { started: false };\n\n setTimeout(() => {\n if (anyQueueStartedRef.started && !staredRef.started) {\n log(`Queue ${opts.name} was not started within 10 seconds, this is likely a bug`);\n }\n }, 10000);\n\n return {\n start: async () => {\n log(`Starting queue ${opts.name} using bullmq`);\n staredRef.started = true;\n anyQueueStartedRef.started = true;\n\n let worker = new Worker<JobData>(\n opts.name,\n async job => {\n try {\n let data = job.data as any;\n\n let payload: any;\n\n try {\n payload = SuperJson.deserialize(data.payload);\n } catch (e: any) {\n payload = data.payload;\n }\n\n let parentExecutionContext = (data as any)\n .$$execution_context$$ as ExecutionContext;\n while (\n parentExecutionContext &&\n parentExecutionContext.type == 'job' &&\n parentExecutionContext.parent\n )\n parentExecutionContext = parentExecutionContext.parent;\n\n await provideExecutionContext(\n createExecutionContext({\n type: 'job',\n contextId: job.id ?? generateSnowflakeId(),\n queue: opts.name,\n parent: parentExecutionContext\n }),\n () => cb(payload as any, job)\n );\n } catch (e: any) {\n if (e instanceof QueueRetryError) {\n await delay(1000);\n throw e;\n } else {\n Sentry.captureException(e);\n console.error(e);\n throw e;\n }\n }\n },\n {\n concurrency: 50,\n ...opts.workerOpts,\n connection: redisOpts\n }\n );\n\n return {\n close: () => worker.close()\n };\n }\n };\n }\n };\n};\n","import { BullMqCreateOptions, createBullMqQueue } from './drivers/bullmq';\nimport { IQueueProcessor } from './types';\n\nexport * from './lib/queueRetryError';\nexport * from './types';\n\nlet seenNames = new Set<string>();\n\nexport let createQueue = <JobData>(opts: { driver?: 'bullmq' } & BullMqCreateOptions) => {\n if (!opts.driver) opts.driver = 'bullmq';\n\n if (seenNames.has(opts.name)) {\n throw new Error(`Queue with name ${opts.name} already exists`);\n }\n seenNames.add(opts.name);\n\n return createBullMqQueue<JobData>({\n name: opts.name,\n redisUrl: opts.redisUrl,\n\n jobOpts: opts.jobOpts,\n queueOpts: opts.queueOpts,\n workerOpts: opts.workerOpts\n });\n};\n\nexport let combineQueueProcessors = (opts: IQueueProcessor[]): IQueueProcessor => {\n return {\n start: async () => {\n let processors = await Promise.all(opts.map(x => x.start()));\n\n return {\n close: async () => {\n await Promise.all(processors.map(x => x?.close?.()));\n }\n };\n }\n };\n};\n\nexport let runQueueProcessors = async (processor: IQueueProcessor[]) => {\n let combined = combineQueueProcessors(processor);\n\n let res = await combined.start();\n\n process.on('SIGINT', async () => {\n await res?.close();\n });\n\n process.on('SIGTERM', async () => {\n await res?.close();\n });\n\n return res;\n};\n"],"names":["QueueRetryError","_Error","call","this","_wrapNativeSuper","Error","Sentry","getSentry","log","_console","console","apply","concat","slice","arguments","anyQueueStartedRef","started","seenNames","Set","combineQueueProcessors","opts","start","Promise","resolve","all","map","x","then","processors","close","e","reject","driver","has","name","add","redisOpts","parseRedisUrl","redisUrl","queue","Queue","_extends","queueOpts","connection","defaultJobOptions","removeOnComplete","removeOnFail","attempts","keepLogs","jobOpts","useQueueEvents","memo","QueueEvents","payload","withExecutionContextOptional","ctx","SuperJson","serialize","$$execution_context$$","delay","jobId","id","deduplication","job","waitUntilFinished","events","timeout","addMany","payloads","addBulk","data","addManyWithOps","_payload$opts","_payload$opts2","_payload$opts3","process","cb","staredRef","setTimeout","worker","Worker","_job$id","deserialize","parentExecutionContext","type","parent","provideExecutionContext","createExecutionContext","contextId","generateSnowflakeId","_catch","captureException","error","concurrency","workerOpts","createBullMqQueue","processor","combined","res","on"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lowerdeck/queue",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
+
"files": [
|
|
8
|
+
"src/**",
|
|
9
|
+
"dist/**",
|
|
10
|
+
"README.md",
|
|
11
|
+
"package.json"
|
|
12
|
+
],
|
|
7
13
|
"author": "Tobias Herber",
|
|
8
14
|
"license": "Apache 2",
|
|
9
15
|
"type": "module",
|
|
@@ -21,17 +27,20 @@
|
|
|
21
27
|
"scripts": {
|
|
22
28
|
"test": "vitest run --passWithNoTests",
|
|
23
29
|
"lint": "prettier src/**/*.ts --check",
|
|
24
|
-
"build": "microbundle"
|
|
30
|
+
"build": "rm -rf ./dist && microbundle"
|
|
25
31
|
},
|
|
26
32
|
"dependencies": {
|
|
27
|
-
"@lowerdeck/delay": "^1.0.
|
|
28
|
-
"@lowerdeck/
|
|
29
|
-
"@lowerdeck/
|
|
33
|
+
"@lowerdeck/delay": "^1.0.4",
|
|
34
|
+
"@lowerdeck/execution-context": "^1.0.2",
|
|
35
|
+
"@lowerdeck/id": "^1.0.5",
|
|
36
|
+
"@lowerdeck/memo": "^1.0.4",
|
|
37
|
+
"@lowerdeck/redis": "^1.0.3",
|
|
38
|
+
"@lowerdeck/sentry": "^1.0.2",
|
|
30
39
|
"bullmq": "^5.66.0",
|
|
31
40
|
"superjson": "^2.2.6"
|
|
32
41
|
},
|
|
33
42
|
"devDependencies": {
|
|
34
|
-
"@lowerdeck/tsconfig": "^1.0.
|
|
43
|
+
"@lowerdeck/tsconfig": "^1.0.1",
|
|
35
44
|
"typescript": "5.8.2",
|
|
36
45
|
"microbundle": "^0.15.1",
|
|
37
46
|
"vitest": "^3.1.2"
|
package/src/drivers/bullmq.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { delay } from '@lowerdeck/delay';
|
|
2
|
+
import {
|
|
3
|
+
createExecutionContext,
|
|
4
|
+
ExecutionContext,
|
|
5
|
+
provideExecutionContext,
|
|
6
|
+
withExecutionContextOptional
|
|
7
|
+
} from '@lowerdeck/execution-context';
|
|
8
|
+
import { generateSnowflakeId } from '@lowerdeck/id';
|
|
2
9
|
import { memo } from '@lowerdeck/memo';
|
|
3
10
|
import { parseRedisUrl } from '@lowerdeck/redis';
|
|
11
|
+
import { getSentry } from '@lowerdeck/sentry';
|
|
4
12
|
import {
|
|
5
13
|
DeduplicationOptions,
|
|
6
14
|
JobsOptions,
|
|
@@ -16,6 +24,8 @@ import { IQueue } from '../types';
|
|
|
16
24
|
// @ts-ignore
|
|
17
25
|
import SuperJson from 'superjson';
|
|
18
26
|
|
|
27
|
+
let Sentry = getSentry();
|
|
28
|
+
|
|
19
29
|
let log = (...any: any[]) => console.log('[QUEUE MANAGER]:', ...any);
|
|
20
30
|
|
|
21
31
|
let anyQueueStartedRef = { started: false };
|
|
@@ -57,16 +67,20 @@ export let createBullMqQueue = <JobData>(
|
|
|
57
67
|
name: opts.name,
|
|
58
68
|
|
|
59
69
|
add: async (payload, opts) => {
|
|
60
|
-
let job = await
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
+
let job = await withExecutionContextOptional(
|
|
71
|
+
async ctx =>
|
|
72
|
+
await queue.add(
|
|
73
|
+
'j' as any,
|
|
74
|
+
{
|
|
75
|
+
payload: SuperJson.serialize(payload),
|
|
76
|
+
$$execution_context$$: ctx
|
|
77
|
+
} as any,
|
|
78
|
+
{
|
|
79
|
+
delay: opts?.delay,
|
|
80
|
+
jobId: opts?.id,
|
|
81
|
+
deduplication: opts?.deduplication
|
|
82
|
+
}
|
|
83
|
+
)
|
|
70
84
|
);
|
|
71
85
|
|
|
72
86
|
return {
|
|
@@ -78,41 +92,47 @@ export let createBullMqQueue = <JobData>(
|
|
|
78
92
|
},
|
|
79
93
|
|
|
80
94
|
addMany: async (payloads, opts) => {
|
|
81
|
-
await
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
await withExecutionContextOptional(async ctx => {
|
|
96
|
+
await queue.addBulk(
|
|
97
|
+
payloads.map(
|
|
98
|
+
payload =>
|
|
99
|
+
({
|
|
100
|
+
name: 'j',
|
|
101
|
+
data: {
|
|
102
|
+
payload: SuperJson.serialize(payload),
|
|
103
|
+
$$execution_context$$: ctx
|
|
104
|
+
},
|
|
105
|
+
opts: {
|
|
106
|
+
delay: opts?.delay,
|
|
107
|
+
jobId: opts?.id,
|
|
108
|
+
deduplication: opts?.deduplication
|
|
109
|
+
}
|
|
110
|
+
}) as any
|
|
111
|
+
)
|
|
112
|
+
);
|
|
113
|
+
});
|
|
97
114
|
},
|
|
98
115
|
|
|
99
116
|
addManyWithOps: async payloads => {
|
|
100
|
-
await
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
117
|
+
await withExecutionContextOptional(async ctx => {
|
|
118
|
+
await queue.addBulk(
|
|
119
|
+
payloads.map(
|
|
120
|
+
payload =>
|
|
121
|
+
({
|
|
122
|
+
name: 'j',
|
|
123
|
+
data: {
|
|
124
|
+
payload: SuperJson.serialize(payload.data),
|
|
125
|
+
$$execution_context$$: ctx
|
|
126
|
+
},
|
|
127
|
+
opts: {
|
|
128
|
+
delay: payload.opts?.delay,
|
|
129
|
+
jobId: payload.opts?.id,
|
|
130
|
+
deduplication: payload.opts?.deduplication
|
|
131
|
+
}
|
|
132
|
+
}) as any
|
|
133
|
+
)
|
|
134
|
+
);
|
|
135
|
+
});
|
|
116
136
|
},
|
|
117
137
|
|
|
118
138
|
process: cb => {
|
|
@@ -144,13 +164,31 @@ export let createBullMqQueue = <JobData>(
|
|
|
144
164
|
payload = data.payload;
|
|
145
165
|
}
|
|
146
166
|
|
|
147
|
-
|
|
167
|
+
let parentExecutionContext = (data as any)
|
|
168
|
+
.$$execution_context$$ as ExecutionContext;
|
|
169
|
+
while (
|
|
170
|
+
parentExecutionContext &&
|
|
171
|
+
parentExecutionContext.type == 'job' &&
|
|
172
|
+
parentExecutionContext.parent
|
|
173
|
+
)
|
|
174
|
+
parentExecutionContext = parentExecutionContext.parent;
|
|
175
|
+
|
|
176
|
+
await provideExecutionContext(
|
|
177
|
+
createExecutionContext({
|
|
178
|
+
type: 'job',
|
|
179
|
+
contextId: job.id ?? generateSnowflakeId(),
|
|
180
|
+
queue: opts.name,
|
|
181
|
+
parent: parentExecutionContext
|
|
182
|
+
}),
|
|
183
|
+
() => cb(payload as any, job)
|
|
184
|
+
);
|
|
148
185
|
} catch (e: any) {
|
|
149
186
|
if (e instanceof QueueRetryError) {
|
|
150
187
|
await delay(1000);
|
|
151
188
|
throw e;
|
|
152
189
|
} else {
|
|
153
|
-
|
|
190
|
+
Sentry.captureException(e);
|
|
191
|
+
console.error(e);
|
|
154
192
|
throw e;
|
|
155
193
|
}
|
|
156
194
|
}
|
package/src/index.ts
CHANGED
|
@@ -14,17 +14,14 @@ export let createQueue = <JobData>(opts: { driver?: 'bullmq' } & BullMqCreateOpt
|
|
|
14
14
|
}
|
|
15
15
|
seenNames.add(opts.name);
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
jobOpts: opts.jobOpts,
|
|
21
|
-
queueOpts: opts.queueOpts,
|
|
22
|
-
workerOpts: opts.workerOpts,
|
|
23
|
-
redisUrl: opts.redisUrl
|
|
24
|
-
});
|
|
25
|
-
}
|
|
17
|
+
return createBullMqQueue<JobData>({
|
|
18
|
+
name: opts.name,
|
|
19
|
+
redisUrl: opts.redisUrl,
|
|
26
20
|
|
|
27
|
-
|
|
21
|
+
jobOpts: opts.jobOpts,
|
|
22
|
+
queueOpts: opts.queueOpts,
|
|
23
|
+
workerOpts: opts.workerOpts
|
|
24
|
+
});
|
|
28
25
|
};
|
|
29
26
|
|
|
30
27
|
export let combineQueueProcessors = (opts: IQueueProcessor[]): IQueueProcessor => {
|
package/.turbo/turbo-build.log
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
[0m[2m[35m$[0m [2m[1mmicrobundle[0m
|
|
3
|
-
No name was provided for external module '@lowerdeck/delay' in output.globals – guessing 'delay'
|
|
4
|
-
No name was provided for external module '@lowerdeck/memo' in output.globals – guessing 'memo'
|
|
5
|
-
No name was provided for external module '@lowerdeck/redis' in output.globals – guessing 'redis'
|
|
6
|
-
[34mBuild "@lowerdeck/queue" to dist:[39m
|
|
7
|
-
[32m1.78 kB[39m: [37mindex.cjs[39m.gz
|
|
8
|
-
[32m1.59 kB[39m: [37mindex.cjs[39m.br
|
|
9
|
-
[32m1240 B[39m: [37mindex.module.js[39m.gz
|
|
10
|
-
[32m1090 B[39m: [37mindex.module.js[39m.br
|
|
11
|
-
[32m1.77 kB[39m: [37mindex.module.js[39m.gz
|
|
12
|
-
[32m1.59 kB[39m: [37mindex.module.js[39m.br
|
|
13
|
-
[32m1.88 kB[39m: [37mindex.umd.js[39m.gz
|
|
14
|
-
[32m1.67 kB[39m: [37mindex.umd.js[39m.br
|
package/.turbo/turbo-test.log
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
[0m[2m[35m$[0m [2m[1mvitest run --passWithNoTests[0m
|
|
3
|
-
[?25l
|
|
4
|
-
[1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/Users/tobias/code/metorial/metorial-enterprise/oss/src/packages/backend/queue[39m
|
|
5
|
-
|
|
6
|
-
No test files found, exiting with code 0
|
|
7
|
-
|
|
8
|
-
[2minclude: [22m[33m**/*.{test,spec}.?(c|m)[jt]s?(x)[39m
|
|
9
|
-
[2mexclude: [22m[33m**/node_modules/**[2m, [22m**/dist/**[2m, [22m**/cypress/**[2m, [22m**/.{idea,git,cache,output,temp}/**[2m, [22m**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build,eslint,prettier}.config.*[39m
|
|
10
|
-
|
|
11
|
-
[?25h
|
package/CHANGELOG.md
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# @lowerdeck/queue
|
|
2
|
-
|
|
3
|
-
## 1.0.2
|
|
4
|
-
|
|
5
|
-
### Patch Changes
|
|
6
|
-
|
|
7
|
-
- Fix default entry point
|
|
8
|
-
- Updated dependencies
|
|
9
|
-
- @lowerdeck/delay@1.0.3
|
|
10
|
-
- @lowerdeck/redis@1.0.2
|
|
11
|
-
- @lowerdeck/memo@1.0.3
|
|
12
|
-
|
|
13
|
-
## 1.0.1
|
|
14
|
-
|
|
15
|
-
### Patch Changes
|
|
16
|
-
|
|
17
|
-
- update versions
|
|
18
|
-
- Updated dependencies
|
|
19
|
-
- @lowerdeck/delay@1.0.2
|
|
20
|
-
- @lowerdeck/redis@1.0.1
|
|
21
|
-
- @lowerdeck/memo@1.0.2
|
package/tsconfig.json
DELETED