@lowerdeck/queue 1.0.4 → 1.0.5

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.
@@ -1 +1 @@
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"}
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,CAoLpC,CAAC"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
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)}};
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 s(){return s=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},s.apply(null,arguments)}function l(e){return l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},l(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,l(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),l=new i.Queue(u.name,s({},u.queueOpts,{connection:c,defaultJobOptions:s({removeOnComplete:!0,removeOnFail:{age:86400},backoff:{type:"custom"},attempts:25,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(l.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(l.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(l.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{var l;v("Starting queue "+u.name+" using bullmq"),o.started=!0,h.started=!0;var d=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 s=c.$$execution_context$$;s&&"job"==s.type&&s.parent;)s=s.parent;return Promise.resolve(t.provideExecutionContext(t.createExecutionContext({type:"job",contextId:null!=(e=o.id)?e:r.generateSnowflakeId(),queue:u.name,parent:s}),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)}},s({concurrency:50},u.workerOpts,{connection:c,settings:s({},null==(l=u.workerOpts)?void 0:l.settings,{backoffStrategy:function(e){var t=6e5,r=1e3*Math.pow(2,e-1);return r>t&&(r=t),r}})}));return Promise.resolve({close:function(){return d.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
@@ -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 {\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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"}
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: {\n age: 60 * 60 * 24 // 1 day\n },\n backoff: {\n type: 'custom'\n },\n attempts: 25,\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 settings: {\n ...opts.workerOpts?.settings,\n\n backoffStrategy: (attemptsMade: number) => {\n let baseDelay = 1000;\n let maxDelay = 1000 * 60 * 10; // 10 minutes\n\n let delay = baseDelay * Math.pow(2, attemptsMade - 1);\n if (delay > maxDelay) delay = maxDelay;\n\n return delay;\n }\n }\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","age","backoff","type","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","_opts$workerOpts","worker","Worker","_job$id","deserialize","parentExecutionContext","parent","provideExecutionContext","createExecutionContext","contextId","generateSnowflakeId","_catch","captureException","error","concurrency","workerOpts","settings","backoffStrategy","attemptsMade","maxDelay","Math","pow","createBullMqQueue","processor","combined","res","on"],"mappings":"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"}
@@ -1,2 +1,2 @@
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};
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 f from"superjson";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 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,d({},c.queueOpts,{connection:p,defaultJobOptions:d({removeOnComplete:!0,removeOnFail:{age:86400},backoff:{type:"custom"},attempts:25,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:f.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:f.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:f.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{var u;j("Starting queue "+c.name+" using bullmq"),i.started=!0,b.started=!0;var a=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=f.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)}},d({concurrency:50},c.workerOpts,{connection:p,settings:d({},null==(u=c.workerOpts)?void 0:u.settings,{backoffStrategy:function(e){var t=6e5,r=1e3*Math.pow(2,e-1);return r>t&&(r=t),r}})}));return Promise.resolve({close:function(){return a.close()}})}catch(e){return Promise.reject(e)}}}}}}({name:c.name,redisUrl:c.redisUrl,jobOpts:c.jobOpts,queueOpts:c.queueOpts,workerOpts:c.workerOpts})},g=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)}}}},k=function(e){try{var t=g(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,g as combineQueueProcessors,w as createQueue,k as runQueueProcessors};
2
2
  //# sourceMappingURL=index.module.js.map
@@ -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 {\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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"}
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: {\n age: 60 * 60 * 24 // 1 day\n },\n backoff: {\n type: 'custom'\n },\n attempts: 25,\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 settings: {\n ...opts.workerOpts?.settings,\n\n backoffStrategy: (attemptsMade: number) => {\n let baseDelay = 1000;\n let maxDelay = 1000 * 60 * 10; // 10 minutes\n\n let delay = baseDelay * Math.pow(2, attemptsMade - 1);\n if (delay > maxDelay) delay = maxDelay;\n\n return delay;\n }\n }\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","age","backoff","type","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","_opts$workerOpts","worker","Worker","_job$id","deserialize","parentExecutionContext","parent","provideExecutionContext","createExecutionContext","contextId","generateSnowflakeId","_catch","captureException","error","concurrency","workerOpts","settings","backoffStrategy","attemptsMade","maxDelay","Math","pow","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,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)}}});
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(),w=function(){var e;return(e=console).log.apply(e,["[QUEUE MANAGER]:"].concat([].slice.call(arguments)))},P={started:!1},b=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)}}}};e.QueueRetryError=v,e.combineQueueProcessors=j,e.createQueue=function(e){if(e.driver||(e.driver="bullmq"),b.has(e.name))throw new Error("Queue with name "+e.name+" already exists");return b.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:{age:86400},backoff:{type:"custom"},attempts:25,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(){P.started&&!u.started&&w("Queue "+e.name+" was not started within 10 seconds, this is likely a bug")},1e4),{start:function(){try{var a;w("Starting queue "+e.name+" using bullmq"),u.started=!0,P.started=!0;var l=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,settings:d({},null==(a=e.workerOpts)?void 0:a.settings,{backoffStrategy:function(e){var t=6e5,r=1e3*Math.pow(2,e-1);return r>t&&(r=t),r}})}));return Promise.resolve({close:function(){return l.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=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.umd.js.map
@@ -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 {\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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"}
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: {\n age: 60 * 60 * 24 // 1 day\n },\n backoff: {\n type: 'custom'\n },\n attempts: 25,\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 settings: {\n ...opts.workerOpts?.settings,\n\n backoffStrategy: (attemptsMade: number) => {\n let baseDelay = 1000;\n let maxDelay = 1000 * 60 * 10; // 10 minutes\n\n let delay = baseDelay * Math.pow(2, attemptsMade - 1);\n if (delay > maxDelay) delay = maxDelay;\n\n return delay;\n }\n }\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","age","backoff","type","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","_opts$workerOpts","worker","Worker","_job$id","deserialize","parentExecutionContext","parent","provideExecutionContext","createExecutionContext","contextId","generateSnowflakeId","_catch","captureException","error","concurrency","workerOpts","settings","backoffStrategy","attemptsMade","maxDelay","Math","pow","createBullMqQueue","processor","combined","res","on"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowerdeck/queue",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -54,8 +54,13 @@ export let createBullMqQueue = <JobData>(
54
54
  connection: redisOpts,
55
55
  defaultJobOptions: {
56
56
  removeOnComplete: true,
57
- removeOnFail: true,
58
- attempts: 10,
57
+ removeOnFail: {
58
+ age: 60 * 60 * 24 // 1 day
59
+ },
60
+ backoff: {
61
+ type: 'custom'
62
+ },
63
+ attempts: 25,
59
64
  keepLogs: 10,
60
65
  ...opts.jobOpts
61
66
  }
@@ -196,7 +201,21 @@ export let createBullMqQueue = <JobData>(
196
201
  {
197
202
  concurrency: 50,
198
203
  ...opts.workerOpts,
199
- connection: redisOpts
204
+ connection: redisOpts,
205
+
206
+ settings: {
207
+ ...opts.workerOpts?.settings,
208
+
209
+ backoffStrategy: (attemptsMade: number) => {
210
+ let baseDelay = 1000;
211
+ let maxDelay = 1000 * 60 * 10; // 10 minutes
212
+
213
+ let delay = baseDelay * Math.pow(2, attemptsMade - 1);
214
+ if (delay > maxDelay) delay = maxDelay;
215
+
216
+ return delay;
217
+ }
218
+ }
200
219
  }
201
220
  );
202
221