import type { JobHandler } from "./index.ts"; import type { DurableQueue } from "./durable.ts"; export interface WorkerDefinition { name: string; handler: JobHandler; onStart?: () => void | Promise; onStop?: () => void | Promise; } export function defineWorker(definition: WorkerDefinition): WorkerDefinition { if (!definition.name.trim()) throw new TypeError("worker name cannot be empty"); return Object.freeze({ ...definition }); } /** Explicit process lifecycle for queue workers; safe to start and stop repeatedly. */ export function runWorker(queue: DurableQueue, definition: WorkerDefinition) { let started = false; return { async start() { if (started) return; started = true; queue.process(definition.name, definition.handler); await definition.onStart?.(); }, async stop(options?: { force?: boolean }) { if (!started) return; started = false; await queue.shutdown(options); await definition.onStop?.(); }, get running() { return started; }, }; }