UNPKG

durabull

Version:

A durable workflow engine built on top of BullMQ and Redis

120 lines (119 loc) 3.72 kB
/** * Storage facade for workflow persistence */ import { WorkflowRecord, History, HistoryEvent } from './history'; /** * Signal envelope */ export interface SignalEnvelope { name: string; payload: unknown; ts: number; } /** * Storage interface for workflow persistence */ export interface Storage { writeRecord(rec: WorkflowRecord): Promise<void>; readRecord(id: string): Promise<WorkflowRecord | null>; writeHistory(id: string, hist: History): Promise<void>; readHistory(id: string): Promise<History | null>; appendEvent(id: string, ev: HistoryEvent): Promise<void>; listSignals(id: string): Promise<SignalEnvelope[]>; pushSignal(id: string, signal: SignalEnvelope): Promise<void>; popSignal(id: string): Promise<SignalEnvelope | null>; acquireLock(id: string, lockName: string, ttlSeconds: number): Promise<boolean>; releaseLock(id: string, lockName: string): Promise<void>; refreshHeartbeat(workflowId: string, activityId: string, ttlSeconds: number): Promise<void>; checkHeartbeat(workflowId: string, activityId: string): Promise<number | null>; addChild(parentId: string, childId: string): Promise<void>; getChildren(parentId: string): Promise<string[]>; } /** * Redis-based storage implementation */ export declare class RedisStorage implements Storage { private redis; private serializer; constructor(redisUrl?: string, serializerType?: 'json' | 'base64'); /** * Write workflow record */ writeRecord(rec: WorkflowRecord): Promise<void>; /** * Read workflow record */ readRecord(id: string): Promise<WorkflowRecord | null>; /** * Write complete history * Optimized to only update cursor if events are managed via appendEvent */ writeHistory(id: string, hist: History): Promise<void>; /** * Read history */ readHistory(id: string): Promise<History | null>; /** * Append event to history (optimized) */ appendEvent(id: string, ev: HistoryEvent): Promise<void>; /** * List all signals for a workflow */ listSignals(id: string): Promise<SignalEnvelope[]>; /** * Push signal to workflow queue */ pushSignal(id: string, signal: SignalEnvelope): Promise<void>; /** * Pop signal from workflow queue (FIFO) */ popSignal(id: string): Promise<SignalEnvelope | null>; /** * Acquire a lock for workflow or activity */ acquireLock(id: string, lockName: string, ttlSeconds: number): Promise<boolean>; /** * Release a lock */ releaseLock(id: string, lockName: string): Promise<void>; /** * Refresh activity heartbeat */ refreshHeartbeat(workflowId: string, activityId: string, ttlSeconds: number): Promise<void>; /** * Check last heartbeat timestamp */ checkHeartbeat(workflowId: string, activityId: string): Promise<number | null>; /** * Add child workflow relationship */ addChild(parentId: string, childId: string): Promise<void>; /** * Get all children of a workflow */ getChildren(parentId: string): Promise<string[]>; /** * Close Redis connection */ close(): Promise<void>; private getHistoryEventsKey; private getHistoryCursorKey; private getRecordKey; private getSignalsKey; private getLockKey; private getHeartbeatKey; private getChildrenKey; } /** * Get or create storage instance */ export declare function getStorage(): Storage; /** * Set custom storage implementation */ export declare function setStorage(storage: Storage): void; /** * Close storage connection */ export declare function closeStorage(): Promise<void>;