durabull
Version:
A durable workflow engine built on top of BullMQ and Redis
120 lines (119 loc) • 3.72 kB
TypeScript
/**
* 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>;