{"version":3,"sources":["../../../../src/jobs/types/redis.ts"],"sourcesContent":["import { Queue, Worker } from 'bullmq'\n\nimport { RedisCache } from '../../cache/types/redis'\nimport { Instance } from '../../instance'\nimport type { CronTypes, DelayedJobs, RepeatableJobs } from '../../types'\nimport { Random } from '../../utilities'\nimport type { RedisJobConfig } from '../pipes'\n\nenum JobNames {\n\tCronJob = 'CronJob',\n\tRepeatableJob = 'RepeatableJob',\n\tDelayedJob = 'DelayedJob',\n}\n\ntype Cron = CronTypes[keyof CronTypes]\ntype DelayedJobEvent = DelayedJobs[keyof DelayedJobs]\ntype RepeatableJobEvent = RepeatableJobs[keyof RepeatableJobs]\ntype DelayedJobCallback = (data: DelayedJobEvent) => Promise<void> | void\ntype CronJobCallback = (name: CronTypes[keyof CronTypes]) => Promise<void> | void\ntype RepeatableJobCallback = (data: RepeatableJobEvent) => Promise<void> | void\n\ntype JobCallbacks = { onDelayed?: DelayedJobCallback; onCron?: CronJobCallback; onRepeatable?: RepeatableJobCallback }\n\nexport class RedisJob {\n\t#queue: Queue\n\t#callbacks: JobCallbacks = {}\n\t#crons: { name: Cron; cron: string }[] = []\n\n\tconstructor(config: RedisJobConfig) {\n\t\tconst redisCache = new RedisCache(config.redisConfig, {\n\t\t\tmaxRetriesPerRequest: null,\n\t\t\tenableReadyCheck: false,\n\t\t})\n\t\tconst queueName = Instance.get().getScopedName(config.queueName)\n\t\tthis.#queue = new Queue(queueName, { connection: redisCache.client.options, skipVersionCheck: true })\n\t\tconst worker = new Worker(\n\t\t\tqueueName,\n\t\t\tasync (job) => {\n\t\t\t\tswitch (job.name) {\n\t\t\t\t\tcase JobNames.DelayedJob:\n\t\t\t\t\t\treturn (this.#callbacks.onDelayed as any)?.(job.data)\n\t\t\t\t\tcase JobNames.CronJob:\n\t\t\t\t\t\treturn (this.#callbacks.onCron as any)?.(job.data.type)\n\t\t\t\t\tcase JobNames.RepeatableJob:\n\t\t\t\t\t\treturn (this.#callbacks.onRepeatable as any)?.(job.data)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ connection: redisCache.client.options, autorun: false, skipVersionCheck: true },\n\t\t)\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.#cleanup()\n\t\t\t\tawait Promise.all(this.#crons.map(({ cron, name }) => this.#addCron(name, cron)))\n\t\t\t\tworker.run()\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n\n\tset callbacks(callbacks: JobCallbacks) {\n\t\tthis.#callbacks = callbacks\n\t}\n\n\tset crons(crons: { name: Cron; cron: string }[]) {\n\t\tthis.#crons = crons\n\t}\n\n\tstatic #getNewId() {\n\t\treturn [Date.now(), Random.string()].join('_')\n\t}\n\n\tasync addDelayed(data: DelayedJobEvent, delayInMs: number): Promise<string> {\n\t\tconst job = await this.#queue.add(JobNames.DelayedJob, data, {\n\t\t\tjobId: RedisJob.#getNewId(),\n\t\t\tdelay: delayInMs,\n\t\t\tremoveOnComplete: true,\n\t\t\tbackoff: 1000,\n\t\t\tattempts: 3,\n\t\t})\n\t\treturn job.id!.toString()\n\t}\n\n\tasync addRepeatable(data: RepeatableJobEvent, cron: string, tz?: string): Promise<string> {\n\t\tconst job = await this.#queue.add(JobNames.RepeatableJob, data, {\n\t\t\tjobId: RedisJob.#getNewId(),\n\t\t\trepeat: { pattern: cron, ...(tz ? { tz } : {}) },\n\t\t\tremoveOnComplete: true,\n\t\t\tbackoff: 1000,\n\t\t\tattempts: 3,\n\t\t})\n\t\treturn job.opts?.repeat?.key ?? ''\n\t}\n\n\tasync removeDelayed(jobId: string) {\n\t\tconst job = await this.#queue.getJob(jobId)\n\t\tif (job) await job.remove()\n\t}\n\n\tasync retryAllFailedJobs() {\n\t\tconst failedJobs = await this.#queue.getFailed()\n\t\tawait Promise.all(failedJobs.map((job) => job.retry()))\n\t}\n\n\tasync #addCron(type: Cron | string, cron: string): Promise<string> {\n\t\tconst job = await this.#queue.add(\n\t\t\tJobNames.CronJob,\n\t\t\t{ type },\n\t\t\t{\n\t\t\t\tjobId: RedisJob.#getNewId(),\n\t\t\t\trepeat: { pattern: cron },\n\t\t\t\tremoveOnComplete: true,\n\t\t\t\tbackoff: 1000,\n\t\t\t\tattempts: 3,\n\t\t\t},\n\t\t)\n\t\treturn job.id!.toString()\n\t}\n\n\tasync #cleanup() {\n\t\tawait this.retryAllFailedJobs()\n\t\tconst repeatableJobs = await this.#queue.getJobSchedulers()\n\t\tawait Promise.all(repeatableJobs.map((job) => this.#queue.removeJobScheduler(job.key)))\n\t}\n}\n"],"mappings":"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","names":["Queue","Worker","RedisCache","Instance","Random","JobNames","RedisJob","#queue","#callbacks","#crons","config","redisCache","queueName","worker","job","#cleanup","cron","name","#addCron","callbacks","crons","#getNewId","data","delayInMs","tz","jobId","failedJobs","type","repeatableJobs"]}