diff --git a/src/classes/queue.ts b/src/classes/queue.ts index d9d51c073f..89b233335e 100644 --- a/src/classes/queue.ts +++ b/src/classes/queue.ts @@ -465,6 +465,15 @@ export class Queue< * * @returns The next job to be scheduled (would normally be in delayed state). */ + async upsertJobScheduler( + jobSchedulerId: string, + repeatOpts: Omit, + jobTemplate: { + name: NameType; + data?: DataType; + opts?: JobSchedulerTemplateOptions; + }, + ): Promise | undefined>; async upsertJobScheduler( jobSchedulerId: NameType, repeatOpts: Omit, @@ -473,6 +482,15 @@ export class Queue< data?: DataType; opts?: JobSchedulerTemplateOptions; }, + ): Promise | undefined>; + async upsertJobScheduler( + jobSchedulerId: string, + repeatOpts: Omit, + jobTemplate?: { + name?: NameType; + data?: DataType; + opts?: JobSchedulerTemplateOptions; + }, ) { if (repeatOpts.endDate) { if (+new Date(repeatOpts.endDate) < Date.now()) { @@ -487,7 +505,7 @@ export class Queue< >( jobSchedulerId, repeatOpts, - jobTemplate?.name ?? jobSchedulerId, + jobTemplate?.name ?? (jobSchedulerId as NameType), jobTemplate?.data ?? {}, { ...this.jobsOpts, ...jobTemplate?.opts }, { override: true }, diff --git a/tests/test_issue_3937.test.ts b/tests/test_issue_3937.test.ts new file mode 100644 index 0000000000..55f8904c8d --- /dev/null +++ b/tests/test_issue_3937.test.ts @@ -0,0 +1,24 @@ +import { Queue } from '../src/classes/queue'; + +type JobName = 'generate-report' | 'send-email'; + +interface JobData { + accountId: string; +} + +const queue = new Queue('issue-3937'); +const dynamicId = String('inst_12345'); + +// Scheduler IDs must accept dynamic strings independently of the job name type. +queue.upsertJobScheduler( + dynamicId, + { + every: 60_000, + }, + { + name: 'generate-report', + data: { + accountId: 'acct_12345', + }, + }, +);