@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.
@@ -1 +1 @@
1
- {"version":3,"file":"bullmq.d.ts","sourceRoot":"","sources":["../../src/drivers/bullmq.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,WAAW,EAGX,YAAY,EAEZ,aAAa,EACd,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AASlC,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,CAqIpC,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,CAiKpC,CAAC"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("@lowerdeck/delay"),r=require("@lowerdeck/memo"),t=require("@lowerdeck/redis"),n=require("bullmq");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=/*#__PURE__*/o(require("superjson"));function i(){return i=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},i.apply(null,arguments)}function c(e){return c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},c(e)}function a(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(a=function(){return!!e})()}function l(e,r){return l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,r){return e.__proto__=r,e},l(e,r)}function s(e){var r="function"==typeof Map?new Map:void 0;return s=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(r){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!==r){if(r.has(e))return r.get(e);r.set(e,t)}function t(){return function(e,r,t){if(a())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,r);var o=new(e.bind.apply(e,n));return t&&l(o,t.prototype),o}(e,arguments,c(this).constructor)}return t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),l(t,e)},s(e)}var d=/*#__PURE__*/function(e){function r(){return e.call(this,"RETRY")||this}var t,n;return n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,l(t,n),r}(/*#__PURE__*/s(Error)),f=function(){var e;return(e=console).log.apply(e,["[QUEUE MANAGER]:"].concat([].slice.call(arguments)))},p={started:!1},m=new Set,v=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=d,exports.combineQueueProcessors=v,exports.createQueue=function(o){if(o.driver||(o.driver="bullmq"),m.has(o.name))throw new Error("Queue with name "+o.name+" already exists");if(m.add(o.name),"bullmq"===o.driver)return function(o){var c=t.parseRedisUrl(o.redisUrl),a=new n.Queue(o.name,i({},o.queueOpts,{connection:c,defaultJobOptions:i({removeOnComplete:!0,removeOnFail:!0,attempts:10,keepLogs:10},o.jobOpts)})),l=r.memo(function(){return new n.QueueEvents(o.name,{connection:c})});return{name:o.name,add:function(e,r){try{return Promise.resolve(a.add("j",{payload:u.default.serialize(e)},{delay:null==r?void 0:r.delay,jobId:null==r?void 0:r.id,deduplication:null==r?void 0:r.deduplication})).then(function(e){return{waitUntilFinished:function(r){try{var t=l();return Promise.resolve(e.waitUntilFinished(t,null==r?void 0:r.timeout)).then(function(){})}catch(e){return Promise.reject(e)}}}})}catch(e){return Promise.reject(e)}},addMany:function(e,r){try{return Promise.resolve(a.addBulk(e.map(function(e){return{name:"j",data:{payload:u.default.serialize(e)},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)}},addManyWithOps:function(e){try{return Promise.resolve(a.addBulk(e.map(function(e){var r,t,n;return{name:"j",data:{payload:u.default.serialize(e.data)},opts:{delay:null==(r=e.opts)?void 0:r.delay,jobId:null==(t=e.opts)?void 0:t.id,deduplication:null==(n=e.opts)?void 0:n.deduplication}}}))).then(function(){})}catch(e){return Promise.reject(e)}},process:function(r){var t={started:!1};return setTimeout(function(){p.started&&!t.started&&f("Queue "+o.name+" was not started within 10 seconds, this is likely a bug")},1e4),{start:function(){try{f("Starting queue "+o.name+" using bullmq"),t.started=!0,p.started=!0;var a=new n.Worker(o.name,function(t){try{return Promise.resolve(function(e,n){try{var o=function(){var e,n=t.data;try{e=u.default.deserialize(n.payload)}catch(r){e=n.payload}return Promise.resolve(r(e,t)).then(function(){})}()}catch(e){return n(e)}return o&&o.then?o.then(void 0,n):o}(0,function(r){if(r instanceof d)return Promise.resolve(e.delay(1e3)).then(function(){throw r});throw console.error("[QUEUE ERROR - "+o.name+"]",r),r}))}catch(e){return Promise.reject(e)}},i({concurrency:50},o.workerOpts,{connection:c}));return Promise.resolve({close:function(){return a.close()}})}catch(e){return Promise.reject(e)}}}}}}({name:o.name,jobOpts:o.jobOpts,queueOpts:o.queueOpts,workerOpts:o.workerOpts,redisUrl:o.redisUrl});throw new Error("Unknown queue driver: "+o.driver)},exports.runQueueProcessors=function(e){try{var r=v(e);return Promise.resolve(r.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 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
@@ -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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"}
@@ -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,qFAmBnF,CAAC;AAEF,eAAO,IAAI,sBAAsB,GAAI,MAAM,eAAe,EAAE,KAAG,eAY9D,CAAC;AAEF,eAAO,IAAI,kBAAkB,GAAU,WAAW,eAAe,EAAE;;cAclE,CAAC"}
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"}
@@ -1,2 +1,2 @@
1
- import{delay as e}from"@lowerdeck/delay";import{memo as t}from"@lowerdeck/memo";import{parseRedisUrl as r}from"@lowerdeck/redis";import{Queue as n,QueueEvents as o,Worker as i}from"bullmq";import u from"superjson";function c(){return c=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},c.apply(null,arguments)}function a(e){return a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},a(e)}function l(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(l=function(){return!!e})()}function s(e,t){return s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},s(e,t)}function d(e){var t="function"==typeof Map?new Map:void 0;return d=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(l())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,t);var o=new(e.bind.apply(e,n));return r&&s(o,r.prototype),o}(e,arguments,a(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),s(r,e)},d(e)}var f=/*#__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,s(r,n),t}(/*#__PURE__*/d(Error)),p=function(){var e;return(e=console).log.apply(e,["[QUEUE MANAGER]:"].concat([].slice.call(arguments)))},m={started:!1},v=new Set,y=function(a){if(a.driver||(a.driver="bullmq"),v.has(a.name))throw new Error("Queue with name "+a.name+" already exists");if(v.add(a.name),"bullmq"===a.driver)return function(a){var l=r(a.redisUrl),s=new n(a.name,c({},a.queueOpts,{connection:l,defaultJobOptions:c({removeOnComplete:!0,removeOnFail:!0,attempts:10,keepLogs:10},a.jobOpts)})),d=t(function(){return new o(a.name,{connection:l})});return{name:a.name,add:function(e,t){try{return Promise.resolve(s.add("j",{payload:u.serialize(e)},{delay:null==t?void 0:t.delay,jobId:null==t?void 0:t.id,deduplication:null==t?void 0:t.deduplication})).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,t){try{return Promise.resolve(s.addBulk(e.map(function(e){return{name:"j",data:{payload:u.serialize(e)},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)}},addManyWithOps:function(e){try{return Promise.resolve(s.addBulk(e.map(function(e){var t,r,n;return{name:"j",data:{payload:u.serialize(e.data)},opts:{delay:null==(t=e.opts)?void 0:t.delay,jobId:null==(r=e.opts)?void 0:r.id,deduplication:null==(n=e.opts)?void 0:n.deduplication}}}))).then(function(){})}catch(e){return Promise.reject(e)}},process:function(t){var r={started:!1};return setTimeout(function(){m.started&&!r.started&&p("Queue "+a.name+" was not started within 10 seconds, this is likely a bug")},1e4),{start:function(){try{p("Starting queue "+a.name+" using bullmq"),r.started=!0,m.started=!0;var n=new i(a.name,function(r){try{return Promise.resolve(function(e,n){try{var o=function(){var e,n=r.data;try{e=u.deserialize(n.payload)}catch(t){e=n.payload}return Promise.resolve(t(e,r)).then(function(){})}()}catch(e){return n(e)}return o&&o.then?o.then(void 0,n):o}(0,function(t){if(t instanceof f)return Promise.resolve(e(1e3)).then(function(){throw t});throw console.error("[QUEUE ERROR - "+a.name+"]",t),t}))}catch(e){return Promise.reject(e)}},c({concurrency:50},a.workerOpts,{connection:l}));return Promise.resolve({close:function(){return n.close()}})}catch(e){return Promise.reject(e)}}}}}}({name:a.name,jobOpts:a.jobOpts,queueOpts:a.queueOpts,workerOpts:a.workerOpts,redisUrl:a.redisUrl});throw new Error("Unknown queue driver: "+a.driver)},h=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)}}}},P=function(e){try{var t=h(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{f as QueueRetryError,h as combineQueueProcessors,y as createQueue,P 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 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
@@ -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,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@lowerdeck/delay"),require("@lowerdeck/memo"),require("@lowerdeck/redis"),require("bullmq"),require("superjson")):"function"==typeof define&&define.amd?define(["exports","@lowerdeck/delay","@lowerdeck/memo","@lowerdeck/redis","bullmq","superjson"],r):r((e||self).queue={},e.delay,e.memo,e.redis,e.bullmq,e.superjson)}(this,function(e,r,t,n,o,u){function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=/*#__PURE__*/i(u);function a(){return a=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},a.apply(null,arguments)}function l(e){return l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},l(e)}function s(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(s=function(){return!!e})()}function d(e,r){return d=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,r){return e.__proto__=r,e},d(e,r)}function f(e){var r="function"==typeof Map?new Map:void 0;return f=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(r){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!==r){if(r.has(e))return r.get(e);r.set(e,t)}function t(){return function(e,r,t){if(s())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,r);var o=new(e.bind.apply(e,n));return t&&d(o,t.prototype),o}(e,arguments,l(this).constructor)}return t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),d(t,e)},f(e)}var p=/*#__PURE__*/function(e){function r(){return e.call(this,"RETRY")||this}var t,n;return n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,d(t,n),r}(/*#__PURE__*/f(Error)),m=function(){var e;return(e=console).log.apply(e,["[QUEUE MANAGER]:"].concat([].slice.call(arguments)))},y={started:!1},v=new Set,h=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=p,e.combineQueueProcessors=h,e.createQueue=function(e){if(e.driver||(e.driver="bullmq"),v.has(e.name))throw new Error("Queue with name "+e.name+" already exists");if(v.add(e.name),"bullmq"===e.driver)return function(e){var u=n.parseRedisUrl(e.redisUrl),i=new o.Queue(e.name,a({},e.queueOpts,{connection:u,defaultJobOptions:a({removeOnComplete:!0,removeOnFail:!0,attempts:10,keepLogs:10},e.jobOpts)})),l=t.memo(function(){return new o.QueueEvents(e.name,{connection:u})});return{name:e.name,add:function(e,r){try{return Promise.resolve(i.add("j",{payload:c.default.serialize(e)},{delay:null==r?void 0:r.delay,jobId:null==r?void 0:r.id,deduplication:null==r?void 0:r.deduplication})).then(function(e){return{waitUntilFinished:function(r){try{var t=l();return Promise.resolve(e.waitUntilFinished(t,null==r?void 0:r.timeout)).then(function(){})}catch(e){return Promise.reject(e)}}}})}catch(e){return Promise.reject(e)}},addMany:function(e,r){try{return Promise.resolve(i.addBulk(e.map(function(e){return{name:"j",data:{payload:c.default.serialize(e)},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)}},addManyWithOps:function(e){try{return Promise.resolve(i.addBulk(e.map(function(e){var r,t,n;return{name:"j",data:{payload:c.default.serialize(e.data)},opts:{delay:null==(r=e.opts)?void 0:r.delay,jobId:null==(t=e.opts)?void 0:t.id,deduplication:null==(n=e.opts)?void 0:n.deduplication}}}))).then(function(){})}catch(e){return Promise.reject(e)}},process:function(t){var n={started:!1};return setTimeout(function(){y.started&&!n.started&&m("Queue "+e.name+" was not started within 10 seconds, this is likely a bug")},1e4),{start:function(){try{m("Starting queue "+e.name+" using bullmq"),n.started=!0,y.started=!0;var i=new o.Worker(e.name,function(n){try{return Promise.resolve(function(e,r){try{var o=function(){var e,r=n.data;try{e=c.default.deserialize(r.payload)}catch(t){e=r.payload}return Promise.resolve(t(e,n)).then(function(){})}()}catch(e){return r(e)}return o&&o.then?o.then(void 0,r):o}(0,function(t){if(t instanceof p)return Promise.resolve(r.delay(1e3)).then(function(){throw t});throw console.error("[QUEUE ERROR - "+e.name+"]",t),t}))}catch(e){return Promise.reject(e)}},a({concurrency:50},e.workerOpts,{connection:u}));return Promise.resolve({close:function(){return i.close()}})}catch(e){return Promise.reject(e)}}}}}}({name:e.name,jobOpts:e.jobOpts,queueOpts:e.queueOpts,workerOpts:e.workerOpts,redisUrl:e.redisUrl});throw new Error("Unknown queue driver: "+e.driver)},e.runQueueProcessors=function(e){try{var r=h(e);return Promise.resolve(r.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(),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
@@ -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.2",
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.3",
28
- "@lowerdeck/memo": "^1.0.3",
29
- "@lowerdeck/redis": "^1.0.2",
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.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"
@@ -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 queue.add(
61
- 'j' as any,
62
- {
63
- payload: SuperJson.serialize(payload)
64
- } as any,
65
- {
66
- delay: opts?.delay,
67
- jobId: opts?.id,
68
- deduplication: opts?.deduplication
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 queue.addBulk(
82
- payloads.map(
83
- payload =>
84
- ({
85
- name: 'j',
86
- data: {
87
- payload: SuperJson.serialize(payload)
88
- },
89
- opts: {
90
- delay: opts?.delay,
91
- jobId: opts?.id,
92
- deduplication: opts?.deduplication
93
- }
94
- }) as any
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 queue.addBulk(
101
- payloads.map(
102
- payload =>
103
- ({
104
- name: 'j',
105
- data: {
106
- payload: SuperJson.serialize(payload.data)
107
- },
108
- opts: {
109
- delay: payload.opts?.delay,
110
- jobId: payload.opts?.id,
111
- deduplication: payload.opts?.deduplication
112
- }
113
- }) as any
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
- await cb(payload as any, job);
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
- console.error(`[QUEUE ERROR - ${opts.name}]`, e);
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
- if (opts.driver === 'bullmq') {
18
- return createBullMqQueue<JobData>({
19
- name: opts.name,
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
- throw new Error(`Unknown queue driver: ${opts.driver}`);
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 => {
@@ -1,14 +0,0 @@
1
-
2
- $ microbundle
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
- Build "@lowerdeck/queue" to dist:
7
- 1.78 kB: index.cjs.gz
8
- 1.59 kB: index.cjs.br
9
- 1240 B: index.module.js.gz
10
- 1090 B: index.module.js.br
11
- 1.77 kB: index.module.js.gz
12
- 1.59 kB: index.module.js.br
13
- 1.88 kB: index.umd.js.gz
14
- 1.67 kB: index.umd.js.br
@@ -1,11 +0,0 @@
1
-
2
- $ vitest run --passWithNoTests
3
- [?25l
4
-  RUN  v3.2.4 /Users/tobias/code/metorial/metorial-enterprise/oss/src/packages/backend/queue
5
-
6
- No test files found, exiting with code 0
7
-
8
- include: **/*.{test,spec}.?(c|m)[jt]s?(x)
9
- exclude: **/node_modules/**, **/dist/**, **/cypress/**, **/.{idea,git,cache,output,temp}/**, **/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build,eslint,prettier}.config.*
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
@@ -1,11 +0,0 @@
1
- {
2
- "$schema": "https://json.schemastore.org/tsconfig",
3
- "extends": "@lowerdeck/tsconfig/base.json",
4
- "exclude": ["dist"],
5
- "include": ["src"],
6
- "compilerOptions": {
7
- "outDir": "dist",
8
- "lib": ["es2021"],
9
- "target": "ES2019"
10
- }
11
- }