import { ZodType } from "zod"; import { PluginManager, PluginType } from "./plugins"; export interface EnqueueOptions { idempotencyKey?: string; priority?: number; delayMs?: number; } export interface QueueOptions { defaultJobArgs: { numRetries: number; }; keepFailedJobs: boolean; } export interface DequeuedJob { id: string; data: T; priority: number; runNumber: number; abortSignal: AbortSignal; } export interface DequeuedJobError { id: string; data?: T; priority: number; error: Error; runNumber: number; numRetriesLeft: number; } export interface RunnerFuncs { run: (job: DequeuedJob) => Promise; onComplete?: (job: DequeuedJob) => Promise; onError?: (job: DequeuedJobError) => Promise; } export interface RunnerOptions { pollIntervalMs?: number; timeoutSecs: number; concurrency: number; validator?: ZodType; } export interface Queue { opts: QueueOptions; name(): string; enqueue(payload: T, options?: EnqueueOptions): Promise; stats(): Promise<{ pending: number; pending_retry: number; running: number; failed: number; }>; cancelAllNonRunning?(): Promise; } export interface Runner<_T> { run(): Promise; stop(): void; runUntilEmpty?(): Promise; } export interface QueueClient { prepare(): Promise; start(): Promise; createQueue(name: string, options: QueueOptions): Queue; createRunner( queue: Queue, funcs: RunnerFuncs, opts: RunnerOptions, ): Runner; shutdown?(): Promise; } export async function getQueueClient(): Promise { const client = await PluginManager.getClient(PluginType.Queue); if (!client) { throw new Error("Failed to get queue client"); } return client; }