{"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":["JobNames"]}