diff --git a/.changeset/sweet-cups-rescue.md b/.changeset/sweet-cups-rescue.md new file mode 100644 index 000000000..9cb5e5655 --- /dev/null +++ b/.changeset/sweet-cups-rescue.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/sdk": patch +--- + +Added human readable cron expression property to cron triggers diff --git a/apps/webapp/app/services/schedules/nextScheduledEvent.server.ts b/apps/webapp/app/services/schedules/nextScheduledEvent.server.ts index 7b10e095a..e41466039 100644 --- a/apps/webapp/app/services/schedules/nextScheduledEvent.server.ts +++ b/apps/webapp/app/services/schedules/nextScheduledEvent.server.ts @@ -43,7 +43,7 @@ export class NextScheduledEventService { ); logger.debug("enqueuing scheduled event", { - scheduleSourceId: scheduleSource.id, + scheduleSource, scheduleTime, lastTimestamp: scheduleSource.lastEventTimestamp, }); @@ -61,6 +61,7 @@ export class NextScheduledEventService { runAt: scheduleTime, queueName: `scheduler:${scheduleSource.environmentId}`, tx, + jobKey: `scheduled:${scheduleSource.id}`, } ); diff --git a/apps/webapp/app/services/schedules/registerScheduleSource.server.ts b/apps/webapp/app/services/schedules/registerScheduleSource.server.ts index fceec0bd4..4ef8af35e 100644 --- a/apps/webapp/app/services/schedules/registerScheduleSource.server.ts +++ b/apps/webapp/app/services/schedules/registerScheduleSource.server.ts @@ -68,7 +68,7 @@ export class RegisterScheduleSourceService { }, }); - if (scheduleSource.active && !scheduleSource.workerJobId) { + if (scheduleSource.active) { const service = new NextScheduledEventService(tx); await service.call(scheduleSource.id); diff --git a/examples/nextjs-example/src/jobs/schedules.ts b/examples/nextjs-example/src/jobs/schedules.ts new file mode 100644 index 000000000..2ce714e76 --- /dev/null +++ b/examples/nextjs-example/src/jobs/schedules.ts @@ -0,0 +1,18 @@ +import { client } from "@/trigger"; +import { Job, cronTrigger } from "@trigger.dev/sdk"; + +new Job(client, { + id: "test-cron-schedule-2", + name: "Test Cron Schedule 2", + version: "0.0.1", + logLevel: "debug", + trigger: cronTrigger({ + cron: "*/5 * * * *", + }), + run: async (payload, io, ctx) => { + await io.logger.debug("Hello cron schedule 2a", { + payload, + payload2: payload, + }); + }, +}); diff --git a/examples/nextjs-example/src/pages/api/trigger.ts b/examples/nextjs-example/src/pages/api/trigger.ts index 4f6c1bd12..3c47ddcf6 100644 --- a/examples/nextjs-example/src/pages/api/trigger.ts +++ b/examples/nextjs-example/src/pages/api/trigger.ts @@ -5,6 +5,7 @@ import "@/jobs/resend"; import "@/jobs/general"; import "@/jobs/slack"; import "@/jobs/logging"; +import "@/jobs/schedules"; import { createPagesRoute } from "@trigger.dev/nextjs"; const { handler, config } = createPagesRoute(client); diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index 5adce4c4e..08d8fb37d 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -38,6 +38,7 @@ }, "dependencies": { "chalk": "^5.2.0", + "cronstrue": "^2.21.0", "debug": "^4.3.4", "evt": "^2.4.13", "get-caller-file": "^2.0.5", diff --git a/packages/trigger-sdk/src/triggers/scheduled.ts b/packages/trigger-sdk/src/triggers/scheduled.ts index dddf8aeb0..3b520a2d1 100644 --- a/packages/trigger-sdk/src/triggers/scheduled.ts +++ b/packages/trigger-sdk/src/triggers/scheduled.ts @@ -1,6 +1,5 @@ import { CronOptions, - EventExample, IntervalOptions, ScheduleMetadata, ScheduledPayload, @@ -11,6 +10,7 @@ import { import { Job } from "../job"; import { TriggerClient } from "../triggerClient"; import { EventSpecification, Trigger } from "../types"; +import cronstrue from "cronstrue"; type ScheduledEventSpecification = EventSpecification; @@ -76,6 +76,10 @@ export class CronTrigger implements Trigger { constructor(private options: CronOptions) {} get event() { + const humanReadable = cronstrue.toString(this.options.cron, { + throwExceptionOnParseError: false, + }); + return { name: "trigger.scheduled", title: "Cron Schedule", @@ -85,9 +89,13 @@ export class CronTrigger implements Trigger { parsePayload: ScheduledPayloadSchema.parse, properties: [ { - label: "Expression", + label: "cron", text: this.options.cron, }, + { + label: "Schedule", + text: humanReadable, + }, ], }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9471a74c8..eb90427cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -811,6 +811,7 @@ importers: '@types/uuid': ^9.0.0 '@types/ws': ^8.5.3 chalk: ^5.2.0 + cronstrue: ^2.21.0 debug: ^4.3.4 evt: ^2.4.13 get-caller-file: ^2.0.5 @@ -830,6 +831,7 @@ importers: zod-to-json-schema: ^3.20.2 dependencies: chalk: 5.2.0 + cronstrue: 2.21.0 debug: 4.3.4 evt: 2.4.13 get-caller-file: 2.0.5