diff --git a/packages/lib/jobs/client/_internal/job.ts b/packages/lib/jobs/client/_internal/job.ts index dce2f652b..80bee2c99 100644 --- a/packages/lib/jobs/client/_internal/job.ts +++ b/packages/lib/jobs/client/_internal/job.ts @@ -26,16 +26,26 @@ export type TriggerJobOptions = }; }[number]; +export type CronTrigger = { + type: 'cron'; + schedule: string; + name?: string; +}; + +export type EventTrigger = { + type: 'event'; + name: N; +}; + // eslint-disable-next-line @typescript-eslint/no-explicit-any export type JobDefinition = { id: string; name: string; version: string; enabled?: boolean; - trigger: { - name: Name; - schema?: z.ZodType; - }; + trigger: + | (EventTrigger & { schema?: z.ZodType }) + | (CronTrigger & { schema?: z.ZodType }); handler: (options: { payload: Schema; io: JobRunIO }) => Promise; }; diff --git a/packages/lib/jobs/client/inngest.ts b/packages/lib/jobs/client/inngest.ts index 7ac81271e..0e7c65988 100644 --- a/packages/lib/jobs/client/inngest.ts +++ b/packages/lib/jobs/client/inngest.ts @@ -38,30 +38,58 @@ export class InngestJobProvider extends BaseJobProvider { public defineJob(job: JobDefinition): void { console.log('defining job', job.id); - const fn = this._client.createFunction( - { - id: job.id, - name: job.name, - }, - { - event: job.trigger.name, - }, - async (ctx) => { - const io = this.convertInngestIoToJobRunIo(ctx); - // We need to cast to any so we can deal with parsing later. - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any - let payload = ctx.event.data as any; + if (job.trigger.type === 'cron') { + const fn = this._client.createFunction( + { + id: job.id, + name: job.name, + }, + { + cron: job.trigger.schedule, + }, + async (ctx) => { + const io = this.convertInngestIoToJobRunIo(ctx); - if (job.trigger.schema) { - payload = job.trigger.schema.parse(payload); - } + // We need to cast to any so we can deal with parsing later. + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any + let payload = ctx.event.data as any; - await job.handler({ payload, io }); - }, - ); + if (job.trigger.schema) { + payload = job.trigger.schema.parse(payload); + } - this._functions.push(fn); + await job.handler({ payload, io }); + }, + ); + + this._functions.push(fn); + } else { + const fn = this._client.createFunction( + { + id: job.id, + name: job.name, + }, + { + event: job.trigger.name, + }, + async (ctx) => { + const io = this.convertInngestIoToJobRunIo(ctx); + + // We need to cast to any so we can deal with parsing later. + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any + let payload = ctx.event.data as any; + + if (job.trigger.schema) { + payload = job.trigger.schema.parse(payload); + } + + await job.handler({ payload, io }); + }, + ); + + this._functions.push(fn); + } } public async triggerJob(options: SimpleTriggerJobOptions): Promise { diff --git a/packages/lib/jobs/client/trigger.ts b/packages/lib/jobs/client/trigger.ts index 4cd64b5b1..00145042f 100644 --- a/packages/lib/jobs/client/trigger.ts +++ b/packages/lib/jobs/client/trigger.ts @@ -1,6 +1,6 @@ import { createPagesRoute } from '@trigger.dev/nextjs'; import type { IO } from '@trigger.dev/sdk'; -import { TriggerClient, eventTrigger } from '@trigger.dev/sdk'; +import { TriggerClient, cronTrigger, eventTrigger } from '@trigger.dev/sdk'; import type { JobDefinition, JobRunIO, SimpleTriggerJobOptions } from './_internal/job'; import { BaseJobProvider } from './base'; @@ -31,16 +31,30 @@ export class TriggerJobProvider extends BaseJobProvider { } public defineJob(job: JobDefinition): void { - this._client.defineJob({ - id: job.id, - name: job.name, - version: job.version, - trigger: eventTrigger({ - name: job.trigger.name, - schema: job.trigger.schema, - }), - run: async (payload, io) => job.handler({ payload, io: this.convertTriggerIoToJobRunIo(io) }), - }); + if (job.trigger.type === 'cron') { + this._client.defineJob({ + id: job.id, + name: job.name, + version: job.version, + trigger: cronTrigger({ + cron: job.trigger.schedule, + }), + run: async (payload, io) => + job.handler({ payload: payload as T, io: this.convertTriggerIoToJobRunIo(io) }), + }); + } else { + this._client.defineJob({ + id: job.id, + name: job.name, + version: job.version, + trigger: eventTrigger({ + name: job.trigger.name, + schema: job.trigger.schema, + }), + run: async (payload, io) => + job.handler({ payload, io: this.convertTriggerIoToJobRunIo(io) }), + }); + } } public async triggerJob(options: SimpleTriggerJobOptions): Promise { diff --git a/packages/lib/jobs/definitions/emails/send-confirmation-email.ts b/packages/lib/jobs/definitions/emails/send-confirmation-email.ts index 34513082e..94e0e9722 100644 --- a/packages/lib/jobs/definitions/emails/send-confirmation-email.ts +++ b/packages/lib/jobs/definitions/emails/send-confirmation-email.ts @@ -15,6 +15,7 @@ export const SEND_CONFIRMATION_EMAIL_JOB_DEFINITION = { name: 'Send Confirmation Email', version: '1.0.0', trigger: { + type: 'event', name: SEND_CONFIRMATION_EMAIL_JOB_DEFINITION_ID, schema: SEND_CONFIRMATION_EMAIL_JOB_DEFINITION_SCHEMA, }, diff --git a/packages/lib/jobs/definitions/emails/send-rejection-emails.ts b/packages/lib/jobs/definitions/emails/send-rejection-emails.ts index a3a6914e1..d0817e6c3 100644 --- a/packages/lib/jobs/definitions/emails/send-rejection-emails.ts +++ b/packages/lib/jobs/definitions/emails/send-rejection-emails.ts @@ -30,6 +30,7 @@ export const SEND_SIGNING_REJECTION_EMAILS_JOB_DEFINITION = { name: 'Send Rejection Emails', version: '1.0.0', trigger: { + type: 'event', name: SEND_SIGNING_REJECTION_EMAILS_JOB_DEFINITION_ID, schema: SEND_SIGNING_REJECTION_EMAILS_JOB_DEFINITION_SCHEMA, }, diff --git a/packages/lib/jobs/definitions/emails/send-signing-email.ts b/packages/lib/jobs/definitions/emails/send-signing-email.ts index 32859ce14..130b91ef5 100644 --- a/packages/lib/jobs/definitions/emails/send-signing-email.ts +++ b/packages/lib/jobs/definitions/emails/send-signing-email.ts @@ -43,6 +43,7 @@ export const SEND_SIGNING_EMAIL_JOB_DEFINITION = { name: 'Send Signing Email', version: '1.0.0', trigger: { + type: 'event', name: SEND_SIGNING_EMAIL_JOB_DEFINITION_ID, schema: SEND_SIGNING_EMAIL_JOB_DEFINITION_SCHEMA, }, diff --git a/packages/lib/jobs/definitions/emails/send-team-deleted-email.ts b/packages/lib/jobs/definitions/emails/send-team-deleted-email.ts index 3f943b89e..08fc6d489 100644 --- a/packages/lib/jobs/definitions/emails/send-team-deleted-email.ts +++ b/packages/lib/jobs/definitions/emails/send-team-deleted-email.ts @@ -40,6 +40,7 @@ export const SEND_TEAM_DELETED_EMAIL_JOB_DEFINITION = { name: 'Send Team Deleted Email', version: '1.0.0', trigger: { + type: 'event', name: SEND_TEAM_DELETED_EMAIL_JOB_DEFINITION_ID, schema: SEND_TEAM_DELETED_EMAIL_JOB_DEFINITION_SCHEMA, }, diff --git a/packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts b/packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts index ff606327f..331e6c78a 100644 --- a/packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts +++ b/packages/lib/jobs/definitions/emails/send-team-member-joined-email.ts @@ -27,6 +27,7 @@ export const SEND_TEAM_MEMBER_JOINED_EMAIL_JOB_DEFINITION = { name: 'Send Team Member Joined Email', version: '1.0.0', trigger: { + type: 'event', name: SEND_TEAM_MEMBER_JOINED_EMAIL_JOB_DEFINITION_ID, schema: SEND_TEAM_MEMBER_JOINED_EMAIL_JOB_DEFINITION_SCHEMA, }, diff --git a/packages/lib/jobs/definitions/emails/send-team-member-left-email.ts b/packages/lib/jobs/definitions/emails/send-team-member-left-email.ts index 598b79ced..b628510e4 100644 --- a/packages/lib/jobs/definitions/emails/send-team-member-left-email.ts +++ b/packages/lib/jobs/definitions/emails/send-team-member-left-email.ts @@ -27,6 +27,7 @@ export const SEND_TEAM_MEMBER_LEFT_EMAIL_JOB_DEFINITION = { name: 'Send Team Member Left Email', version: '1.0.0', trigger: { + type: 'event', name: SEND_TEAM_MEMBER_LEFT_EMAIL_JOB_DEFINITION_ID, schema: SEND_TEAM_MEMBER_LEFT_EMAIL_JOB_DEFINITION_SCHEMA, }, diff --git a/packages/lib/jobs/definitions/internal/seal-document.ts b/packages/lib/jobs/definitions/internal/seal-document.ts index f37b390d1..462cd50f6 100644 --- a/packages/lib/jobs/definitions/internal/seal-document.ts +++ b/packages/lib/jobs/definitions/internal/seal-document.ts @@ -41,6 +41,7 @@ export const SEAL_DOCUMENT_JOB_DEFINITION = { name: 'Seal Document', version: '1.0.0', trigger: { + type: 'event', name: SEAL_DOCUMENT_JOB_DEFINITION_ID, schema: SEAL_DOCUMENT_JOB_DEFINITION_SCHEMA, },