export type JsonPrimitive = string | number | boolean | null; export type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }; export type Awaitable = T | Promise; export type JobData = Record; export type JobStatus = | 'pending' | 'active' | 'completed' | 'failed' | 'cancelled' | 'stale'; export type JobPhaseStatus = 'pending' | 'active' | 'completed' | 'failed' | 'cancelled'; export type RetryBackoffStrategy = 'fixed' | 'linear' | 'exponential'; export type ErrorDisposition = 'recoverable' | 'fatal'; export interface JobPhaseState { name: string; status: JobPhaseStatus; progress: number; message: string | null; startedAt: string | null; completedAt: string | null; error: string | null; } export interface JobFailure { message: string; phase: string | null; recoverable: boolean; timestamp: string; attempt: number; } export interface JobRetryEvent { jobId: string; phase: string | null; attempt: number; delayMs: number; nextRunAt: string; timestamp: string; } export interface JobProgressEvent { jobId: string; phase: string; phaseProgress: number; overallProgress: number; message: string | null; timestamp: string; details?: JsonValue; } export interface JobRecord { id: string; status: JobStatus; data: TData; currentPhase: string | null; phases: JobPhaseState[]; phaseResults: Record; progress: number; progressMessage: string | null; error: JobFailure | null; retryCount: number; maxAttempts: number; webhookUrl: string | null; webhookSent: boolean; createdAt: string; startedAt: string | null; completedAt: string | null; updatedAt: string; scheduledAt: string | null; cancelledAt: string | null; } export interface EnqueueOptions { id?: string; scheduledAt?: string | Date; maxAttempts?: number; webhookUrl?: string; } export interface RetryOptions { fromStart?: boolean; scheduledAt?: string | Date; } export interface ListJobsOptions { statuses?: JobStatus[]; limit?: number; offset?: number; } export interface StreamOptions { jobId?: string; includeSnapshot?: boolean; keepAliveMs?: number; } export interface RetryConfig { maxAttempts?: number; strategy?: RetryBackoffStrategy; baseDelayMs?: number; maxDelayMs?: number; classifyError?: ( error: unknown, job: JobRecord, ) => Awaitable; } export interface RetentionConfig { staleAfterMs: number; deleteAfterMs: number; intervalMs?: number; onStale?: (job: JobRecord) => Awaitable; onDelete?: (job: JobRecord) => Awaitable; } export type WebhookEventName = | 'job:completed' | 'job:failed' | 'job:retrying' | 'job:cancelled' | 'job:stale'; export interface WebhookConfig { url?: string; events?: WebhookEventName[]; secret?: string; timeoutMs?: number; headers?: Record; maxAttempts?: number; baseDelayMs?: number; maxDelayMs?: number; } export interface QueueConfig { dbPath: string; phases: readonly string[]; concurrency?: number; retry?: RetryConfig; retention?: RetentionConfig; webhook?: WebhookConfig; shutdownTimeoutMs?: number; } export interface PhaseContext { readonly job: JobRecord; readonly phase: string; readonly signal: AbortSignal; progress: (percent: number, message?: string, details?: JsonValue) => Promise>; phaseResult: (phaseName: string) => TResult | undefined; phaseResults: () => Record; isCancelled: () => boolean; throwIfCancelled: () => Promise; } export type PhaseHandler = ( job: JobRecord, context: PhaseContext, ) => Awaitable; export interface WebhookDispatchResult { event: WebhookEventName; jobId: string; status: number; deliveredAt: string; } export interface WebhookDispatchError { event: WebhookEventName; jobId: string; message: string; finalAttempt: number; } export interface QueueStreamEvent { type: | 'snapshot' | 'job:enqueued' | 'job:started' | 'job:progress' | 'job:phase:completed' | 'job:completed' | 'job:failed' | 'job:retrying' | 'job:cancelled' | 'job:stale' | 'job:deleted' | 'job:webhook:delivered' | 'job:webhook:failed' | 'ping'; jobId?: string; job?: JobRecord; progress?: JobProgressEvent; phase?: JobPhaseState; failure?: JobFailure; retry?: JobRetryEvent; webhook?: WebhookDispatchResult | WebhookDispatchError; deletedJobId?: string; timestamp: string; } export interface JobQueueEvents { 'job:enqueued': [job: JobRecord]; 'job:started': [job: JobRecord]; 'job:progress': [job: JobRecord, progress: JobProgressEvent]; 'job:phase:completed': [job: JobRecord, phase: JobPhaseState]; 'job:completed': [job: JobRecord]; 'job:failed': [job: JobRecord, failure: JobFailure]; 'job:retrying': [job: JobRecord, retry: JobRetryEvent]; 'job:cancelled': [job: JobRecord]; 'job:stale': [job: JobRecord]; 'job:deleted': [jobId: string]; 'job:webhook:delivered': [job: JobRecord, result: WebhookDispatchResult]; 'job:webhook:failed': [job: JobRecord, error: WebhookDispatchError]; }