Problem
Five job routines in packages/entrypoints/src/jobs/ share identical boilerplate:
ServerCleanupRoutine.ts
PendingServerCleanupRoutine.ts
TerminateLongRunningServerRoutine.ts
ConsumeCreditsRoutine.ts
TerminateServersWithoutCreditRoutine.ts
Each one repeats this exact ~15 line pattern:
schedule.scheduleJob('<cron>', async () => {
try {
logger.emit({ severityText: 'INFO', body: 'Running <Routine Name>...' });
await dependencies.<useCase>.execute();
logger.emit({ severityText: 'INFO', body: '<Routine Name> completed successfully.' });
} catch (error) {
logger.emit({ severityText: 'ERROR', body: 'Error during <Routine Name>', attributes: { error: JSON.stringify(error, Object.getOwnPropertyNames(error)) } });
await dependencies.eventLogger.log({
eventMessage: `Error during <Routine Name>: ${error instanceof Error ? error.message : String(error)}`,
actorId: 'system',
});
}
});
Only the cron expression, routine name, and the use case call differ.
Fix
- Extract a helper function (e.g.,
createScheduledRoutine) in packages/entrypoints/src/jobs/:
export function createScheduledRoutine(
cronExpression: string,
routineName: string,
fn: () => Promise<void>,
eventLogger: EventLogger
): void {
schedule.scheduleJob(cronExpression, async () => {
try {
logger.emit({ severityText: 'INFO', body: `Running ${routineName}...` });
await fn();
logger.emit({ severityText: 'INFO', body: `${routineName} completed successfully.` });
} catch (error) {
logger.emit({ severityText: 'ERROR', body: `Error during ${routineName}`, attributes: { error: JSON.stringify(error, Object.getOwnPropertyNames(error)) } });
await eventLogger.log({
eventMessage: `Error during ${routineName}: ${error instanceof Error ? error.message : String(error)}`,
actorId: 'system',
});
}
});
}
- Refactor all 5 routines to use
createScheduledRoutine.
Problem
Five job routines in
packages/entrypoints/src/jobs/share identical boilerplate:ServerCleanupRoutine.tsPendingServerCleanupRoutine.tsTerminateLongRunningServerRoutine.tsConsumeCreditsRoutine.tsTerminateServersWithoutCreditRoutine.tsEach one repeats this exact ~15 line pattern:
Only the cron expression, routine name, and the use case call differ.
Fix
createScheduledRoutine) inpackages/entrypoints/src/jobs/:createScheduledRoutine.