From 5b2cb8ba11c74a2127670e7db6007b9029cd69e2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 16 Feb 2026 01:37:03 +0000 Subject: [PATCH] refactor(cron): dedupe finished event emit --- src/cron/service/timer.ts | 52 +++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/cron/service/timer.ts b/src/cron/service/timer.ts index 852678552..08cdfad62 100644 --- a/src/cron/service/timer.ts +++ b/src/cron/service/timer.ts @@ -276,18 +276,7 @@ export async function onTimer(state: CronServiceState) { endedAt: result.endedAt, }); - emit(state, { - jobId: job.id, - action: "finished", - status: result.status, - error: result.error, - summary: result.summary, - sessionId: result.sessionId, - sessionKey: result.sessionKey, - runAtMs: result.startedAt, - durationMs: job.state.lastDurationMs, - nextRunAtMs: job.state.nextRunAtMs, - }); + emitJobFinished(state, job, result, result.startedAt); if (shouldDelete && state.store) { state.store.jobs = state.store.jobs.filter((j) => j.id !== job.id); @@ -565,18 +554,7 @@ export async function executeJob( endedAt, }); - emit(state, { - jobId: job.id, - action: "finished", - status: coreResult.status, - error: coreResult.error, - summary: coreResult.summary, - sessionId: coreResult.sessionId, - sessionKey: coreResult.sessionKey, - runAtMs: startedAt, - durationMs: job.state.lastDurationMs, - nextRunAtMs: job.state.nextRunAtMs, - }); + emitJobFinished(state, job, coreResult, startedAt); if (shouldDelete && state.store) { state.store.jobs = state.store.jobs.filter((j) => j.id !== job.id); @@ -584,6 +562,32 @@ export async function executeJob( } } +function emitJobFinished( + state: CronServiceState, + job: CronJob, + result: { + status: "ok" | "error" | "skipped"; + error?: string; + summary?: string; + sessionId?: string; + sessionKey?: string; + }, + runAtMs: number, +) { + emit(state, { + jobId: job.id, + action: "finished", + status: result.status, + error: result.error, + summary: result.summary, + sessionId: result.sessionId, + sessionKey: result.sessionKey, + runAtMs, + durationMs: job.state.lastDurationMs, + nextRunAtMs: job.state.nextRunAtMs, + }); +} + export function wake( state: CronServiceState, opts: { mode: "now" | "next-heartbeat"; text: string },