Files
WRNexusJS/packages/queue/src/worker.ts
T
Clintchiz a3ddd39b7b
Quality / quality (ubuntu-latest) (push) Failing after 14m38s
Quality / quality (windows-latest) (push) Canceled after 0s
feat: centralize application framework primitives
2026-08-22 23:07:46 +05:30

37 lines
1.1 KiB
TypeScript

import type { JobHandler } from "./index.ts";
import type { DurableQueue } from "./durable.ts";
export interface WorkerDefinition<T> {
name: string;
handler: JobHandler<T>;
onStart?: () => void | Promise<void>;
onStop?: () => void | Promise<void>;
}
export function defineWorker<T>(definition: WorkerDefinition<T>): WorkerDefinition<T> {
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<T>(queue: DurableQueue, definition: WorkerDefinition<T>) {
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;
},
};
}