@stepflowjs/core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index-D_2FGtKL.d.ts +155 -0
- package/dist/index.d.ts +466 -0
- package/dist/index.js +1256 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/index.d.ts +114 -0
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/triggers/index.d.ts +1 -0
- package/dist/triggers/index.js +3 -0
- package/dist/triggers/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/workflow.ts","../src/utils/duration.ts","../src/context.ts","../src/worker.ts","../src/utils/token.ts","../src/stepflow.ts"],"names":["ms","options","nanoid","EventEmitter"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\n// Workflow Definition\n// ============================================================================\n\nimport type { WorkflowConfig } from \"./types.js\";\nimport type { WorkflowContext } from \"./context.js\";\n\n// ============================================================================\n// Workflow Handler Type\n// ============================================================================\n\nexport type WorkflowHandler<TInput = unknown, TResult = unknown> = (\n context: WorkflowContext<TInput>,\n) => Promise<TResult>;\n\n// ============================================================================\n// Workflow Definition\n// ============================================================================\n\nexport interface WorkflowDefinition<TInput = unknown, TResult = unknown> {\n readonly id: string;\n readonly config: WorkflowConfig;\n readonly handler: WorkflowHandler<TInput, TResult>;\n}\n\n// ============================================================================\n// Create Workflow Factory\n// ============================================================================\n\nexport interface CreateWorkflowOptions extends Partial<WorkflowConfig> {\n id: string;\n}\n\n/**\n * Create a new workflow definition\n *\n * @example\n * ```typescript\n * // Simple usage with input type\n * const processOrder = createWorkflow<{ orderId: string }>({\n * id: 'process-order',\n * retries: 3,\n * }, async ({ event, step, sleep }) => {\n * const order = await step.run('validate', async () => {\n * return validateOrder(event.data.orderId); // orderId is typed\n * });\n *\n * await sleep('wait-before-shipping', '1h');\n *\n * await step.run('ship', async () => {\n * return shipOrder(order);\n * });\n *\n * return { status: 'completed' };\n * });\n *\n * // With explicit result type\n * const workflow = createWorkflow<{ userId: string }, { status: string }>({\n * id: 'my-workflow',\n * }, async ({ event }) => {\n * return { status: 'done' }; // result type is enforced\n * });\n * ```\n */\nexport function createWorkflow<TInput = unknown, TResult = unknown>(\n options: CreateWorkflowOptions,\n handler: WorkflowHandler<TInput, TResult>,\n): WorkflowDefinition<TInput, TResult> {\n const config: WorkflowConfig = {\n id: options.id,\n version: options.version,\n retries: options.retries ?? 0,\n retryDelay: options.retryDelay ?? 1000,\n timeout: options.timeout,\n cron: options.cron,\n };\n\n return {\n id: options.id,\n config,\n handler,\n };\n}\n\n// ============================================================================\n// Workflow Registry\n// ============================================================================\n\nexport class WorkflowRegistry {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private workflows = new Map<\n string,\n Map<string, WorkflowDefinition<any, any>>\n >();\n\n /**\n * Register a workflow\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(workflow: WorkflowDefinition<any, any>): void {\n const version = workflow.config.version ?? \"1.0.0\";\n const id = workflow.id;\n\n if (!this.workflows.has(id)) {\n this.workflows.set(id, new Map());\n }\n\n const versions = this.workflows.get(id)!;\n if (versions.has(version)) {\n throw new Error(\n `Workflow \"${id}\" version \"${version}\" is already registered`,\n );\n }\n versions.set(version, workflow);\n }\n\n /**\n * Get a workflow by ID and optional version\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(id: string, version?: string): WorkflowDefinition<any, any> | undefined {\n const versions = this.workflows.get(id);\n if (!versions) return undefined;\n\n if (version) {\n return versions.get(version);\n }\n return this.getLatest(id);\n }\n\n /**\n * Get the latest version of a workflow\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getLatest(id: string): WorkflowDefinition<any, any> | undefined {\n const versions = this.workflows.get(id);\n if (!versions || versions.size === 0) return undefined;\n\n // Get all versions and sort them, return the highest\n const sortedVersions = Array.from(versions.keys()).sort(\n this.compareVersions,\n );\n return versions.get(sortedVersions[sortedVersions.length - 1]);\n }\n\n /**\n * Compare semantic versions\n */\n private compareVersions(a: string, b: string): number {\n const partsA = a.split(\".\").map(Number);\n const partsB = b.split(\".\").map(Number);\n for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {\n const numA = partsA[i] ?? 0;\n const numB = partsB[i] ?? 0;\n if (numA !== numB) return numA - numB;\n }\n return 0;\n }\n\n /**\n * Check if a workflow exists\n */\n has(id: string): boolean {\n const versions = this.workflows.get(id);\n return versions !== undefined && versions.size > 0;\n }\n\n /**\n * Get all registered workflows (latest version of each)\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n all(): WorkflowDefinition<any, any>[] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: WorkflowDefinition<any, any>[] = [];\n for (const versions of this.workflows.values()) {\n // Return only latest version of each workflow\n const sortedVersions = Array.from(versions.keys()).sort(\n this.compareVersions,\n );\n const latest = versions.get(sortedVersions[sortedVersions.length - 1]);\n if (latest) result.push(latest);\n }\n return result;\n }\n\n /**\n * Get all versions of a workflow\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n allVersions(id: string): WorkflowDefinition<any, any>[] {\n const versions = this.workflows.get(id);\n if (!versions) return [];\n return Array.from(versions.values());\n }\n\n /**\n * Get all workflows with cron schedules\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n scheduled(): WorkflowDefinition<any, any>[] {\n return this.all().filter((w) => w.config.cron);\n }\n\n /**\n * Unregister a workflow or specific version\n */\n unregister(id: string, version?: string): boolean {\n if (version) {\n const versions = this.workflows.get(id);\n return versions?.delete(version) ?? false;\n }\n return this.workflows.delete(id);\n }\n\n /**\n * Clear all workflows\n */\n clear(): void {\n this.workflows.clear();\n }\n}\n","// ============================================================================\n// Duration Parsing Utility\n// ============================================================================\n\nimport type { Duration } from \"../types.js\";\nimport ms from \"ms\";\n\n/**\n * Parse a duration value to milliseconds\n *\n * Supports:\n * - Number: treated as milliseconds\n * - String: parsed with ms library (e.g., \"1d\", \"2h\", \"30m\", \"10s\", \"500ms\")\n */\nexport function parseDuration(duration: Duration): number {\n if (typeof duration === \"number\") {\n return duration;\n }\n\n // Handle our specific duration format\n const match = duration.match(/^(\\d+)(ms|s|m|h|d)$/);\n if (match) {\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case \"ms\":\n return value;\n case \"s\":\n return value * 1000;\n case \"m\":\n return value * 60 * 1000;\n case \"h\":\n return value * 60 * 60 * 1000;\n case \"d\":\n return value * 24 * 60 * 60 * 1000;\n default:\n throw new Error(`Invalid duration unit: ${unit}`);\n }\n }\n\n // Fallback to ms library for more complex expressions\n const parsed = ms(duration);\n if (typeof parsed !== \"number\") {\n throw new Error(`Invalid duration: ${duration}`);\n }\n\n return parsed;\n}\n\n/**\n * Format milliseconds as a human-readable duration string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) {\n return `${seconds}s`;\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n const remainingSeconds = seconds % 60;\n return remainingSeconds > 0\n ? `${minutes}m ${remainingSeconds}s`\n : `${minutes}m`;\n }\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n const remainingMinutes = minutes % 60;\n return remainingMinutes > 0\n ? `${hours}h ${remainingMinutes}m`\n : `${hours}h`;\n }\n\n const days = Math.floor(hours / 24);\n const remainingHours = hours % 24;\n return remainingHours > 0 ? `${days}d ${remainingHours}h` : `${days}d`;\n}\n","// ============================================================================\n// Workflow Context - The main interface for workflow execution\n// ============================================================================\n\nimport type {\n WorkflowEvent,\n Duration,\n InvokeOptions,\n WaitForEventOptions,\n WaitForEventResult,\n TimelineEvent,\n TimelineEventType,\n StepOptions,\n} from \"./types.js\";\nimport type { StorageAdapter } from \"./storage/interface.js\";\nimport { parseDuration } from \"./utils/duration.js\";\nimport { nanoid } from \"nanoid\";\n\nexport interface WorkflowContext<TPayload = unknown> {\n /**\n * The event that triggered this workflow\n */\n readonly event: WorkflowEvent<TPayload>;\n\n /**\n * Execution metadata\n */\n readonly execution: {\n readonly id: string;\n readonly runId: string;\n readonly attempt: number;\n readonly startedAt: Date;\n };\n\n /**\n * Step execution methods (checkpointed, never re-execute on retry)\n */\n readonly step: StepContext;\n\n /**\n * Sleep for a duration (durable - survives restarts)\n */\n sleep(name: string, duration: Duration): Promise<void>;\n\n /**\n * Sleep until a specific timestamp\n */\n sleepUntil(name: string, timestamp: Date): Promise<void>;\n\n /**\n * Wait for an external event\n */\n waitForEvent<T = unknown>(\n name: string,\n eventId: string,\n options?: WaitForEventOptions,\n ): Promise<WaitForEventResult<T>>;\n\n /**\n * Structured logging (captured in timeline)\n */\n readonly log: LogContext;\n\n /**\n * Update metadata (visible to subscribers)\n */\n setMetadata(key: string, value: unknown): Promise<void>;\n\n /**\n * Get metadata value\n */\n getMetadata<T = unknown>(key: string): T | undefined;\n}\n\nexport interface StepContext {\n /**\n * Run a step with automatic checkpointing\n * If the workflow retries, completed steps are not re-executed\n */\n run<T>(\n name: string,\n fn: () => Promise<T> | T,\n options?: StepOptions,\n ): Promise<T>;\n\n /**\n * Run multiple steps in parallel\n */\n parallel<T extends readonly unknown[]>(\n name: string,\n fns: { [K in keyof T]: () => Promise<T[K]> },\n options?: StepOptions,\n ): Promise<T>;\n\n /**\n * Invoke another workflow\n */\n invoke<TResult = unknown>(\n workflowId: string,\n payload: unknown,\n options?: InvokeOptions,\n ): Promise<TResult>;\n\n /**\n * Send an event (for waitForEvent in other workflows)\n */\n sendEvent(eventId: string, data: unknown): Promise<void>;\n}\n\nexport interface LogContext {\n info(message: string, data?: Record<string, unknown>): void;\n warn(message: string, data?: Record<string, unknown>): void;\n error(message: string, data?: Record<string, unknown>): void;\n debug(message: string, data?: Record<string, unknown>): void;\n}\n\n// ============================================================================\n// Context Implementation\n// ============================================================================\n\nexport interface CreateContextOptions<TPayload> {\n event: WorkflowEvent<TPayload>;\n executionId: string;\n runId: string;\n attempt: number;\n startedAt: Date;\n storage: StorageAdapter;\n onTimelineEvent?: (event: TimelineEvent) => void;\n}\n\nexport function createContext<TPayload>(\n options: CreateContextOptions<TPayload>,\n): WorkflowContext<TPayload> {\n const {\n event,\n executionId,\n runId,\n attempt,\n startedAt,\n storage,\n onTimelineEvent,\n } = options;\n\n const metadata: Record<string, unknown> = {};\n const timeline: TimelineEvent[] = [];\n\n const addTimelineEvent = (\n type: TimelineEventType,\n data: unknown,\n stepName?: string,\n ): TimelineEvent => {\n const timelineEvent: TimelineEvent = {\n id: nanoid(),\n type,\n timestamp: new Date(),\n data,\n stepName,\n };\n timeline.push(timelineEvent);\n onTimelineEvent?.(timelineEvent);\n return timelineEvent;\n };\n\n const step: StepContext = {\n async run<T>(\n name: string,\n fn: () => Promise<T> | T,\n options?: StepOptions,\n ): Promise<T> {\n // Use idempotencyKey as cache key if provided, otherwise use step name\n const cacheKey = options?.idempotencyKey ?? name;\n\n // Check for cached result (checkpoint)\n const cached = await storage.execution.getStepResult<T>(\n executionId,\n cacheKey,\n );\n if (cached) {\n addTimelineEvent(\"step:cached\", cached.data, name);\n return cached.data;\n }\n\n // Execute the step\n addTimelineEvent(\"step:start\", { name }, name);\n const stepStartedAt = new Date();\n\n try {\n let result: T;\n\n if (options?.timeout) {\n const timeoutMs = parseDuration(options.timeout);\n result = await Promise.race([\n Promise.resolve(fn()),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new StepTimeoutError(name, timeoutMs)),\n timeoutMs,\n ),\n ),\n ]);\n } else {\n result = await fn();\n }\n\n const completedAt = new Date();\n const durationMs = completedAt.getTime() - stepStartedAt.getTime();\n\n // Save checkpoint\n await storage.execution.saveStepResult(executionId, cacheKey, {\n data: result,\n startedAt: stepStartedAt,\n completedAt,\n durationMs,\n });\n\n addTimelineEvent(\"step:complete\", result, name);\n return result;\n } catch (error) {\n addTimelineEvent(\n \"step:failed\",\n {\n name: (error as Error).name,\n message: (error as Error).message,\n stack: (error as Error).stack,\n },\n name,\n );\n throw error;\n }\n },\n\n async parallel<T extends readonly unknown[]>(\n name: string,\n fns: { [K in keyof T]: () => Promise<T[K]> },\n options?: StepOptions,\n ): Promise<T> {\n // Use idempotencyKey as cache key if provided, otherwise use step name\n const cacheKey = options?.idempotencyKey ?? name;\n\n // Check for cached result\n const cached = await storage.execution.getStepResult<T>(\n executionId,\n cacheKey,\n );\n if (cached) {\n addTimelineEvent(\"step:cached\", cached.data, name);\n return cached.data;\n }\n\n addTimelineEvent(\n \"step:start\",\n { name, parallel: true, count: fns.length },\n name,\n );\n const stepStartedAt = new Date();\n\n try {\n let results: T;\n\n if (options?.timeout) {\n const timeoutMs = parseDuration(options.timeout);\n results = await Promise.race([\n Promise.all(fns.map((fn) => fn())) as unknown as Promise<T>,\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new StepTimeoutError(name, timeoutMs)),\n timeoutMs,\n ),\n ),\n ]);\n } else {\n results = (await Promise.all(fns.map((fn) => fn()))) as unknown as T;\n }\n\n const completedAt = new Date();\n const durationMs = completedAt.getTime() - stepStartedAt.getTime();\n\n await storage.execution.saveStepResult(executionId, cacheKey, {\n data: results,\n startedAt: stepStartedAt,\n completedAt,\n durationMs,\n });\n\n addTimelineEvent(\"step:complete\", results, name);\n return results;\n } catch (error) {\n addTimelineEvent(\"step:failed\", error, name);\n throw error;\n }\n },\n\n async invoke<TResult>(\n workflowId: string,\n payload: unknown,\n invokeOptions?: InvokeOptions,\n ): Promise<TResult> {\n const stepName = `invoke:${workflowId}`;\n\n // Check cache (checkpoint)\n const cached = await storage.execution.getStepResult<TResult>(\n executionId,\n stepName,\n );\n if (cached) {\n addTimelineEvent(\"step:cached\", cached.data, stepName);\n return cached.data;\n }\n\n const childExecutionId = nanoid();\n\n addTimelineEvent(\n \"invoke:start\",\n { workflowId, childExecutionId, payload, options: invokeOptions },\n stepName,\n );\n\n // Throw special error to pause execution (will be caught by orchestrator)\n throw new InvokeInterrupt(\n stepName,\n workflowId,\n payload,\n childExecutionId,\n invokeOptions,\n );\n },\n\n async sendEvent(eventId: string, data: unknown): Promise<void> {\n await storage.events.publish(eventId, data);\n addTimelineEvent(\"event:received\", { eventId, data });\n },\n };\n\n const log: LogContext = {\n info(message: string, data?: Record<string, unknown>) {\n addTimelineEvent(\"log:info\", { message, ...data });\n },\n warn(message: string, data?: Record<string, unknown>) {\n addTimelineEvent(\"log:warn\", { message, ...data });\n },\n error(message: string, data?: Record<string, unknown>) {\n addTimelineEvent(\"log:error\", { message, ...data });\n },\n debug(message: string, data?: Record<string, unknown>) {\n addTimelineEvent(\"log:debug\", { message, ...data });\n },\n };\n\n const context: WorkflowContext<TPayload> = {\n event,\n execution: {\n id: executionId,\n runId,\n attempt,\n startedAt,\n },\n step,\n log,\n\n async sleep(name: string, duration: Duration): Promise<void> {\n // Check cache\n const cached = await storage.execution.getStepResult(executionId, name);\n if (cached) {\n addTimelineEvent(\"sleep:complete\", { name, cached: true }, name);\n return;\n }\n\n const durationMs = parseDuration(duration);\n const wakeAt = new Date(Date.now() + durationMs);\n\n addTimelineEvent(\"sleep:start\", { name, durationMs, wakeAt }, name);\n\n // Store the sleep state and throw to pause execution\n await storage.execution.update(executionId, {\n status: \"sleeping\",\n metadata: {\n ...metadata,\n _sleepName: name,\n _sleepWakeAt: wakeAt.toISOString(),\n },\n });\n\n // Schedule wake-up job\n await storage.queue.schedule(\n {\n id: nanoid(),\n workflowId: event.name,\n eventName: `__resume:${executionId}`,\n payload: { sleepName: name },\n metadata: { executionId, type: \"sleep-wake\" },\n priority: 0,\n attempts: 0,\n maxAttempts: 1,\n createdAt: new Date(),\n },\n wakeAt,\n );\n\n // Save checkpoint so we don't re-sleep\n await storage.execution.saveStepResult(executionId, name, {\n data: { sleptUntil: wakeAt },\n startedAt: new Date(),\n completedAt: wakeAt,\n durationMs,\n });\n\n // Throw special error to pause execution (will be caught by orchestrator)\n throw new SleepInterrupt(name, wakeAt);\n },\n\n async sleepUntil(name: string, timestamp: Date): Promise<void> {\n const now = new Date();\n const durationMs = Math.max(0, timestamp.getTime() - now.getTime());\n return context.sleep(name, durationMs);\n },\n\n async waitForEvent<T = unknown>(\n name: string,\n eventId: string,\n waitOptions?: WaitForEventOptions,\n ): Promise<WaitForEventResult<T>> {\n // Check cache\n const cached = await storage.execution.getStepResult<\n WaitForEventResult<T>\n >(executionId, name);\n if (cached) {\n addTimelineEvent(\"step:cached\", cached.data, name);\n return cached.data;\n }\n\n const timeoutMs = waitOptions?.timeout\n ? parseDuration(waitOptions.timeout)\n : 24 * 60 * 60 * 1000; // Default 24 hours\n const timeoutAt = new Date(Date.now() + timeoutMs);\n\n addTimelineEvent(\"event:wait\", { name, eventId, timeoutAt }, name);\n\n // Subscribe to the event\n await storage.events.subscribe(eventId, executionId, timeoutAt);\n\n // Update execution status\n await storage.execution.update(executionId, {\n status: \"waiting\",\n metadata: {\n ...metadata,\n _waitEventId: eventId,\n _waitTimeoutAt: timeoutAt.toISOString(),\n },\n });\n\n // Schedule timeout job\n await storage.queue.schedule(\n {\n id: nanoid(),\n workflowId: event.name,\n eventName: `__timeout:${executionId}`,\n payload: { eventId, stepName: name },\n metadata: { executionId, type: \"event-timeout\" },\n priority: 0,\n attempts: 0,\n maxAttempts: 1,\n createdAt: new Date(),\n },\n timeoutAt,\n );\n\n // Throw special error to pause execution\n throw new WaitForEventInterrupt(name, eventId, timeoutAt);\n },\n\n async setMetadata(key: string, value: unknown): Promise<void> {\n metadata[key] = value;\n addTimelineEvent(\"metadata:update\", { [key]: value });\n await storage.execution.update(executionId, { metadata });\n await storage.realtime.publish(`execution:${executionId}`, { metadata });\n },\n\n getMetadata<T = unknown>(key: string): T | undefined {\n return metadata[key] as T | undefined;\n },\n };\n\n return context;\n}\n\n// ============================================================================\n// Special Interrupt Errors\n// ============================================================================\n\nexport class StepTimeoutError extends Error {\n constructor(\n public readonly stepName: string,\n public readonly timeoutMs: number,\n ) {\n super(`Step \"${stepName}\" timed out after ${timeoutMs}ms`);\n this.name = \"StepTimeoutError\";\n }\n}\n\nexport class SleepInterrupt extends Error {\n constructor(\n public readonly stepName: string,\n public readonly wakeAt: Date,\n ) {\n super(`Sleep interrupt: ${stepName}`);\n this.name = \"SleepInterrupt\";\n }\n}\n\nexport class WaitForEventInterrupt extends Error {\n constructor(\n public readonly stepName: string,\n public readonly eventId: string,\n public readonly timeoutAt: Date,\n ) {\n super(`WaitForEvent interrupt: ${stepName}`);\n this.name = \"WaitForEventInterrupt\";\n }\n}\n\nexport class InvokeInterrupt extends Error {\n constructor(\n public readonly stepName: string,\n public readonly workflowId: string,\n public readonly payload: unknown,\n public readonly childExecutionId: string,\n public readonly options?: InvokeOptions,\n ) {\n super(`Invoke interrupt: ${stepName} -> ${workflowId}`);\n this.name = \"InvokeInterrupt\";\n }\n}\n","// ============================================================================\n// Worker - Processes workflow jobs from the queue\n// ============================================================================\n\nimport { EventEmitter } from \"events\";\nimport { nanoid } from \"nanoid\";\nimport type { StorageAdapter } from \"./storage/interface.js\";\nimport type { WorkflowDefinition, WorkflowRegistry } from \"./workflow.js\";\nimport type { QueueJob, TimelineEvent, WorkflowEvent } from \"./types.js\";\nimport {\n createContext,\n InvokeInterrupt,\n SleepInterrupt,\n WaitForEventInterrupt,\n} from \"./context.js\";\nimport { parseDuration } from \"./utils/duration.js\";\n\n// ============================================================================\n// Worker Events\n// ============================================================================\n\nexport interface WorkerEvents {\n \"execution:start\": {\n executionId: string;\n workflowId: string;\n eventName: string;\n };\n \"execution:complete\": { executionId: string; result: unknown };\n \"execution:failed\": { executionId: string; error: Error; willRetry: boolean };\n \"execution:sleeping\": { executionId: string; wakeAt: Date };\n \"execution:waiting\": {\n executionId: string;\n eventId: string;\n timeoutAt: Date;\n };\n \"execution:invoking\": {\n executionId: string;\n childExecutionId: string;\n childWorkflowId: string;\n };\n \"step:complete\": { executionId: string; stepName: string; result: unknown };\n \"step:failed\": { executionId: string; stepName: string; error: Error };\n error: { error: Error };\n}\n\n// ============================================================================\n// Worker Options\n// ============================================================================\n\nexport interface WorkerOptions {\n /**\n * Storage adapter for persistence\n */\n storage: StorageAdapter;\n\n /**\n * Workflow registry\n */\n registry: WorkflowRegistry;\n\n /**\n * Number of concurrent jobs to process\n * @default 1\n */\n concurrency?: number;\n\n /**\n * Interval in ms to poll for jobs when queue is empty\n * @default 1000\n */\n pollInterval?: number;\n\n /**\n * Worker ID (for debugging/logging)\n */\n workerId?: string;\n\n /**\n * Enable logging\n * @default false\n */\n logging?: boolean;\n}\n\n// ============================================================================\n// Worker Implementation\n// ============================================================================\n\nexport class Worker extends EventEmitter {\n private storage: StorageAdapter;\n private registry: WorkflowRegistry;\n private concurrency: number;\n private pollInterval: number;\n private workerId: string;\n private logging: boolean;\n\n private running = false;\n private activeJobs = 0;\n private pollTimeout?: NodeJS.Timeout;\n\n constructor(options: WorkerOptions) {\n super();\n this.storage = options.storage;\n this.registry = options.registry;\n this.concurrency = options.concurrency ?? 1;\n this.pollInterval = options.pollInterval ?? 1000;\n this.workerId = options.workerId ?? `worker-${nanoid(8)}`;\n this.logging = options.logging ?? false;\n }\n\n /**\n * Start the worker\n */\n async start(): Promise<void> {\n if (this.running) return;\n\n this.running = true;\n this.log(\"Worker started\", { concurrency: this.concurrency });\n\n // Start polling loop\n this.poll();\n }\n\n /**\n * Stop the worker gracefully\n */\n async stop(): Promise<void> {\n this.running = false;\n\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n }\n\n // Wait for active jobs to complete\n while (this.activeJobs > 0) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n this.log(\"Worker stopped\");\n }\n\n /**\n * Poll for jobs\n */\n private async poll(): Promise<void> {\n if (!this.running) return;\n\n // Process jobs up to concurrency limit\n while (this.running && this.activeJobs < this.concurrency) {\n const job = await this.storage.queue.pop({\n workerId: this.workerId,\n lockDuration: 30000,\n });\n\n if (!job) break;\n\n this.activeJobs++;\n this.processJob(job).finally(() => {\n this.activeJobs--;\n });\n }\n\n // Schedule next poll\n this.pollTimeout = setTimeout(() => this.poll(), this.pollInterval);\n }\n\n /**\n * Process a single job\n */\n private async processJob(job: QueueJob): Promise<void> {\n this.log(\"Processing job\", { jobId: job.id, workflowId: job.workflowId });\n\n try {\n // Handle internal events (resume from sleep/wait/invoke)\n if (job.eventName.startsWith(\"__resume:\")) {\n await this.handleResume(job);\n return;\n }\n\n if (job.eventName.startsWith(\"__timeout:\")) {\n await this.handleTimeout(job);\n return;\n }\n\n if (job.eventName.startsWith(\"__invoke-complete:\")) {\n await this.handleInvokeComplete(job);\n return;\n }\n\n // Normal workflow execution\n // Check if this is a new execution or resuming an existing one\n const executionId = job.metadata.executionId as string | undefined;\n let workflowVersion: string | undefined;\n\n if (executionId) {\n const execution = await this.storage.execution.get(executionId);\n workflowVersion = execution?.workflowVersion;\n }\n\n const workflow = this.registry.get(job.workflowId, workflowVersion);\n if (!workflow) {\n this.log(\"Workflow not found\", { workflowId: job.workflowId });\n await this.storage.queue.ack(job.id);\n return;\n }\n\n await this.executeWorkflow(workflow, job);\n } catch (error) {\n this.log(\"Job processing error\", { error });\n this.emit(\"error\", { error });\n\n // Nack the job for retry\n await this.storage.queue.nack(job.id, {\n delay: 1000 * Math.pow(2, job.attempts), // Exponential backoff\n });\n }\n }\n\n /**\n * Execute a workflow\n */\n private async executeWorkflow(\n workflow: WorkflowDefinition,\n job: QueueJob,\n ): Promise<void> {\n const runId = (job.metadata.runId as string) ?? nanoid();\n const executionId = (job.metadata.executionId as string) ?? nanoid();\n const attempt = job.attempts + 1;\n\n // Create or get execution record\n let execution = await this.storage.execution.get(executionId);\n if (!execution) {\n execution = {\n id: executionId,\n runId,\n workflowId: workflow.id,\n workflowVersion: workflow.config.version ?? \"1.0.0\",\n eventName: job.eventName,\n payload: job.payload,\n status: \"running\",\n steps: [],\n metadata: job.metadata,\n attempt,\n startedAt: new Date(),\n timeline: [],\n };\n await this.storage.execution.create(execution);\n } else {\n await this.storage.execution.update(executionId, {\n status: \"running\",\n attempt,\n });\n }\n\n this.emit(\"execution:start\", {\n executionId,\n workflowId: workflow.id,\n eventName: job.eventName,\n });\n\n // Create workflow event\n const event: WorkflowEvent = {\n id: job.id,\n name: job.eventName,\n data: job.payload,\n timestamp: job.createdAt,\n metadata: job.metadata,\n };\n\n // Create context\n const context = createContext({\n event,\n executionId,\n runId,\n attempt,\n startedAt: execution.startedAt,\n storage: this.storage,\n onTimelineEvent: (timelineEvent) => {\n this.handleTimelineEvent(executionId, timelineEvent);\n },\n });\n\n try {\n // Execute the workflow\n const result = await workflow.handler(context);\n\n // Success!\n await this.storage.execution.update(executionId, {\n status: \"completed\",\n result,\n completedAt: new Date(),\n });\n\n await this.storage.queue.ack(job.id);\n\n this.emit(\"execution:complete\", { executionId, result });\n this.log(\"Workflow completed\", { executionId, workflowId: workflow.id });\n\n // Publish completion event\n await this.storage.realtime.publish(`execution:${executionId}`, {\n status: \"completed\",\n result,\n });\n\n // If this execution was invoked by a parent workflow, notify parent\n const parentExecutionId = job.metadata.parentExecutionId as\n | string\n | undefined;\n const parentStepName = job.metadata.parentStepName as string | undefined;\n if (parentExecutionId && parentStepName) {\n await this.storage.queue.push({\n id: nanoid(),\n workflowId: job.workflowId,\n eventName: `__invoke-complete:${parentExecutionId}`,\n payload: {\n parentExecutionId,\n parentStepName,\n childExecutionId: executionId,\n result,\n },\n metadata: {\n executionId: parentExecutionId,\n type: \"invoke-complete\",\n },\n priority: 0,\n attempts: 0,\n maxAttempts: 1,\n createdAt: new Date(),\n });\n }\n } catch (error) {\n if (error instanceof SleepInterrupt) {\n // Workflow is sleeping\n await this.storage.queue.ack(job.id);\n\n this.emit(\"execution:sleeping\", {\n executionId,\n wakeAt: error.wakeAt,\n });\n\n this.log(\"Workflow sleeping\", {\n executionId,\n stepName: error.stepName,\n wakeAt: error.wakeAt,\n });\n return;\n }\n\n if (error instanceof WaitForEventInterrupt) {\n // Workflow is waiting for event\n await this.storage.queue.ack(job.id);\n\n this.emit(\"execution:waiting\", {\n executionId,\n eventId: error.eventId,\n timeoutAt: error.timeoutAt,\n });\n\n this.log(\"Workflow waiting for event\", {\n executionId,\n stepName: error.stepName,\n eventId: error.eventId,\n });\n return;\n }\n\n if (error instanceof InvokeInterrupt) {\n // Workflow is invoking a child workflow\n await this.storage.queue.ack(job.id);\n\n const childJob: QueueJob = {\n id: nanoid(),\n workflowId: error.workflowId,\n eventName: error.workflowId,\n payload: error.payload,\n metadata: {\n ...(error.options?.metadata ?? {}),\n parentExecutionId: executionId,\n parentStepName: error.stepName,\n runId,\n executionId: error.childExecutionId,\n },\n priority: 0,\n attempts: 0,\n maxAttempts: workflow.config.retries ?? 0,\n createdAt: new Date(),\n };\n\n await this.storage.queue.push(childJob);\n\n const invokeMetadata = {\n ...execution.metadata,\n _invokeWorkflowId: error.workflowId,\n _invokeChildExecutionId: error.childExecutionId,\n _invokeStepName: error.stepName,\n };\n\n await this.storage.execution.update(executionId, {\n status: \"waiting\",\n metadata: invokeMetadata,\n });\n\n await this.storage.realtime.publish(`execution:${executionId}`, {\n status: \"waiting\",\n metadata: invokeMetadata,\n });\n\n this.emit(\"execution:invoking\", {\n executionId,\n childExecutionId: error.childExecutionId,\n childWorkflowId: error.workflowId,\n });\n\n this.log(\"Workflow invoking child\", {\n executionId,\n stepName: error.stepName,\n childWorkflowId: error.workflowId,\n childExecutionId: error.childExecutionId,\n });\n\n return;\n }\n\n // Real error\n const err = error as Error;\n const willRetry =\n workflow.config.retries !== undefined &&\n attempt <= workflow.config.retries;\n\n await this.storage.execution.update(executionId, {\n status: willRetry ? \"pending\" : \"failed\",\n error: {\n name: err.name,\n message: err.message,\n stack: err.stack,\n },\n });\n\n if (willRetry) {\n const delay = workflow.config.retryDelay\n ? parseDuration(workflow.config.retryDelay)\n : 1000;\n\n await this.storage.queue.nack(job.id, {\n delay: delay * Math.pow(2, attempt - 1),\n });\n } else {\n await this.storage.queue.ack(job.id);\n }\n\n this.emit(\"execution:failed\", { executionId, error: err, willRetry });\n this.log(\"Workflow failed\", {\n executionId,\n error: err.message,\n willRetry,\n });\n\n // Publish failure event\n await this.storage.realtime.publish(`execution:${executionId}`, {\n status: \"failed\",\n error: { name: err.name, message: err.message },\n });\n }\n }\n\n /**\n * Handle resume from sleep\n */\n private async handleResume(job: QueueJob): Promise<void> {\n const executionId = job.metadata.executionId as string;\n const execution = await this.storage.execution.get(executionId);\n\n if (!execution) {\n await this.storage.queue.ack(job.id);\n return;\n }\n\n const workflow = this.registry.get(\n execution.workflowId,\n execution.workflowVersion,\n );\n if (!workflow) {\n await this.storage.queue.ack(job.id);\n return;\n }\n\n this.log(\"Resuming workflow from sleep\", { executionId });\n\n // Re-run the workflow (checkpointed steps will be skipped)\n await this.executeWorkflow(workflow, {\n ...job,\n workflowId: execution.workflowId,\n eventName: execution.eventName,\n payload: execution.payload,\n metadata: { ...execution.metadata, executionId, runId: execution.runId },\n });\n }\n\n /**\n * Handle event timeout\n */\n private async handleTimeout(job: QueueJob): Promise<void> {\n const executionId = job.metadata.executionId as string;\n const stepName = (job.payload as { stepName: string }).stepName;\n\n const execution = await this.storage.execution.get(executionId);\n if (!execution || execution.status !== \"waiting\") {\n await this.storage.queue.ack(job.id);\n return;\n }\n\n this.log(\"Event wait timeout\", { executionId, stepName });\n\n // Save timeout result\n await this.storage.execution.saveStepResult(executionId, stepName, {\n data: { eventData: null, timeout: true },\n startedAt: new Date(),\n completedAt: new Date(),\n durationMs: 0,\n });\n\n // Resume the workflow\n const workflow = this.registry.get(\n execution.workflowId,\n execution.workflowVersion,\n );\n if (workflow) {\n await this.executeWorkflow(workflow, {\n ...job,\n workflowId: execution.workflowId,\n eventName: execution.eventName,\n payload: execution.payload,\n metadata: {\n ...execution.metadata,\n executionId,\n runId: execution.runId,\n },\n });\n }\n\n await this.storage.queue.ack(job.id);\n }\n\n /**\n * Handle child workflow completion\n */\n private async handleInvokeComplete(job: QueueJob): Promise<void> {\n const executionId = job.metadata.executionId as string;\n const execution = await this.storage.execution.get(executionId);\n\n if (!execution) {\n await this.storage.queue.ack(job.id);\n return;\n }\n\n const payload = job.payload as {\n parentExecutionId: string;\n parentStepName: string;\n childExecutionId: string;\n result: unknown;\n };\n\n // Save child result as the parent's step result\n await this.storage.execution.saveStepResult(\n executionId,\n payload.parentStepName,\n {\n data: payload.result,\n startedAt: new Date(),\n completedAt: new Date(),\n durationMs: 0,\n },\n );\n\n // Resume the parent workflow\n const workflow = this.registry.get(\n execution.workflowId,\n execution.workflowVersion,\n );\n if (workflow) {\n await this.executeWorkflow(workflow, {\n ...job,\n workflowId: execution.workflowId,\n eventName: execution.eventName,\n payload: execution.payload,\n metadata: {\n ...execution.metadata,\n executionId,\n runId: execution.runId,\n },\n });\n }\n\n await this.storage.queue.ack(job.id);\n }\n\n /**\n * Handle timeline events\n */\n private handleTimelineEvent(executionId: string, event: TimelineEvent): void {\n if (event.type === \"step:complete\") {\n this.emit(\"step:complete\", {\n executionId,\n stepName: event.stepName!,\n result: event.data,\n });\n }\n\n if (event.type === \"step:failed\") {\n this.emit(\"step:failed\", {\n executionId,\n stepName: event.stepName!,\n error: event.data as Error,\n });\n }\n\n // Publish to realtime channel\n this.storage.realtime.publish(`execution:${executionId}`, event);\n }\n\n /**\n * Log helper\n */\n private log(message: string, data?: Record<string, unknown>): void {\n if (this.logging) {\n console.log(`[${this.workerId}] ${message}`, data ?? \"\");\n }\n }\n}\n","// ============================================================================\n// Token Utilities - Simple JWT-like tokens for public access\n// ============================================================================\n\nimport { createHmac } from \"crypto\";\n\ninterface TokenPayload {\n runId: string;\n executionId?: string;\n exp: number;\n}\n\n/**\n * Create a simple signed access token\n */\nexport function createAccessToken(\n data: { runId: string; executionId?: string },\n secret: string,\n expirySeconds: number,\n): string {\n const payload: TokenPayload = {\n runId: data.runId,\n executionId: data.executionId,\n exp: Math.floor(Date.now() / 1000) + expirySeconds,\n };\n\n const payloadStr = Buffer.from(JSON.stringify(payload)).toString(\"base64url\");\n const signature = createHmac(\"sha256\", secret)\n .update(payloadStr)\n .digest(\"base64url\");\n\n return `${payloadStr}.${signature}`;\n}\n\n/**\n * Verify and decode an access token\n */\nexport function verifyAccessToken(\n token: string,\n secret: string,\n): TokenPayload | null {\n const parts = token.split(\".\");\n if (parts.length !== 2) {\n return null;\n }\n\n const [payloadStr, signature] = parts;\n\n // Verify signature\n const expectedSignature = createHmac(\"sha256\", secret)\n .update(payloadStr)\n .digest(\"base64url\");\n\n if (signature !== expectedSignature) {\n return null;\n }\n\n // Decode payload\n try {\n const payload = JSON.parse(\n Buffer.from(payloadStr, \"base64url\").toString(),\n ) as TokenPayload;\n\n // Check expiry\n if (payload.exp < Math.floor(Date.now() / 1000)) {\n return null;\n }\n\n return payload;\n } catch {\n return null;\n }\n}\n","// ============================================================================\n// Stepflow - Main Orchestrator\n// ============================================================================\n\nimport { EventEmitter } from \"events\";\nimport { nanoid } from \"nanoid\";\nimport type { StorageAdapter } from \"./storage/interface.js\";\nimport type { WorkflowDefinition } from \"./workflow.js\";\nimport { WorkflowRegistry } from \"./workflow.js\";\nimport { Worker, type WorkerOptions } from \"./worker.js\";\nimport type {\n Execution,\n TriggerResult,\n NotifyResult,\n ListOptions,\n QueueJob,\n Trigger,\n TriggerEvent,\n} from \"./types.js\";\nimport { createAccessToken, verifyAccessToken } from \"./utils/token.js\";\n\n// ============================================================================\n// Stepflow Options\n// ============================================================================\n\nexport interface StepflowOptions {\n /**\n * Storage adapter for persistence\n */\n storage: StorageAdapter;\n\n /**\n * Number of worker concurrency\n * @default 1\n */\n concurrency?: number;\n\n /**\n * Enable logging\n * @default false\n */\n logging?: boolean;\n\n /**\n * Secret for signing access tokens\n */\n tokenSecret?: string;\n\n /**\n * Access token expiry in seconds\n * @default 3600 (1 hour)\n */\n tokenExpiry?: number;\n}\n\n// ============================================================================\n// Stepflow Class\n// ============================================================================\n\nexport class Stepflow extends EventEmitter {\n private storage: StorageAdapter;\n private registry: WorkflowRegistry;\n private worker: Worker;\n private triggers: Map<string, Trigger> = new Map();\n private logging: boolean;\n private tokenSecret: string;\n private tokenExpiry: number;\n\n constructor(options: StepflowOptions) {\n super();\n\n this.storage = options.storage;\n this.logging = options.logging ?? false;\n this.tokenSecret = options.tokenSecret ?? nanoid(32);\n this.tokenExpiry = options.tokenExpiry ?? 3600;\n\n this.registry = new WorkflowRegistry();\n\n this.worker = new Worker({\n storage: this.storage,\n registry: this.registry,\n concurrency: options.concurrency ?? 1,\n logging: this.logging,\n });\n\n // Forward worker events\n this.worker.on(\"execution:start\", (data) =>\n this.emit(\"execution:start\", data),\n );\n this.worker.on(\"execution:complete\", (data) =>\n this.emit(\"execution:complete\", data),\n );\n this.worker.on(\"execution:failed\", (data) =>\n this.emit(\"execution:failed\", data),\n );\n this.worker.on(\"execution:sleeping\", (data) =>\n this.emit(\"execution:sleeping\", data),\n );\n this.worker.on(\"execution:waiting\", (data) =>\n this.emit(\"execution:waiting\", data),\n );\n this.worker.on(\"step:complete\", (data) => this.emit(\"step:complete\", data));\n this.worker.on(\"step:failed\", (data) => this.emit(\"step:failed\", data));\n this.worker.on(\"error\", (data) => this.emit(\"error\", data));\n }\n\n /**\n * Register a workflow\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(workflow: WorkflowDefinition<any, any>): this {\n this.registry.register(workflow);\n this.log(\"Registered workflow\", { id: workflow.id });\n return this;\n }\n\n /**\n * Register multiple workflows\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerAll(workflows: WorkflowDefinition<any, any>[]): this {\n for (const workflow of workflows) {\n this.register(workflow);\n }\n return this;\n }\n\n /**\n * Add a trigger\n */\n addTrigger(name: string, trigger: Trigger): this {\n this.triggers.set(name, trigger);\n return this;\n }\n\n /**\n * Start the orchestrator\n */\n async start(): Promise<void> {\n // Connect storage\n await this.storage.connect();\n\n // Start worker\n await this.worker.start();\n\n // Start triggers\n for (const [name, trigger] of this.triggers) {\n await trigger.start(this.handleTrigger.bind(this));\n this.log(\"Started trigger\", { name, type: trigger.type });\n }\n\n this.log(\"Stepflow started\");\n }\n\n /**\n * Stop the orchestrator\n */\n async stop(): Promise<void> {\n // Stop triggers\n for (const [name, trigger] of this.triggers) {\n await trigger.stop();\n }\n\n // Stop worker\n await this.worker.stop();\n\n // Disconnect storage\n await this.storage.disconnect();\n\n this.log(\"Stepflow stopped\");\n }\n\n /**\n * Trigger a workflow execution\n */\n async trigger<TPayload = unknown>(\n workflowId: string,\n payload: TPayload,\n options?: {\n runId?: string;\n metadata?: Record<string, unknown>;\n delay?: number;\n idempotencyKey?: string;\n },\n ): Promise<TriggerResult> {\n const workflow = this.registry.get(workflowId);\n if (!workflow) {\n throw new Error(`Workflow \"${workflowId}\" not found`);\n }\n\n // Check idempotency key first\n if (options?.idempotencyKey) {\n const existing = await this.storage.execution.getByIdempotencyKey(\n workflowId,\n options.idempotencyKey,\n );\n if (existing) {\n this.log(\"Deduplicated workflow trigger\", {\n workflowId,\n runId: existing.runId,\n executionId: existing.id,\n idempotencyKey: options.idempotencyKey,\n });\n return {\n runId: existing.runId,\n executionId: existing.id,\n publicAccessToken: this.createPublicToken(\n existing.runId,\n existing.id,\n ),\n deduplicated: true,\n };\n }\n }\n\n const runId = options?.runId ?? nanoid();\n const executionId = nanoid();\n\n const job: QueueJob = {\n id: nanoid(),\n workflowId,\n eventName: workflowId,\n payload,\n metadata: {\n ...options?.metadata,\n workflowVersion: workflow.config.version ?? \"1.0.0\",\n idempotencyKey: options?.idempotencyKey,\n runId,\n executionId,\n },\n priority: 0,\n attempts: 0,\n maxAttempts: workflow.config.retries ?? 0,\n createdAt: new Date(),\n };\n\n if (options?.delay) {\n await this.storage.queue.schedule(\n job,\n new Date(Date.now() + options.delay),\n );\n } else {\n await this.storage.queue.push(job);\n }\n\n const publicAccessToken = createAccessToken(\n { runId, executionId },\n this.tokenSecret,\n this.tokenExpiry,\n );\n\n this.log(\"Triggered workflow\", { workflowId, runId, executionId });\n\n return {\n runId,\n executionId,\n publicAccessToken,\n };\n }\n\n /**\n * Get a run by ID\n */\n async getRun(\n runId: string,\n options?: { accessToken?: string },\n ): Promise<Execution | null> {\n // Verify access token if provided\n if (options?.accessToken) {\n const payload = verifyAccessToken(options.accessToken, this.tokenSecret);\n if (!payload || payload.runId !== runId) {\n throw new Error(\"Invalid access token\");\n }\n }\n\n const executions = await this.storage.execution.list({ runId, limit: 1 });\n return executions[0] ?? null;\n }\n\n /**\n * Get execution by ID\n */\n async getExecution(executionId: string): Promise<Execution | null> {\n return this.storage.execution.get(executionId);\n }\n\n /**\n * List executions\n */\n async listRuns(options?: ListOptions): Promise<Execution[]> {\n return this.storage.execution.list(options ?? {});\n }\n\n /**\n * Notify an event (for waitForEvent)\n */\n async notify(eventId: string, data: unknown): Promise<NotifyResult> {\n const waiters = await this.storage.events.getWaiters(eventId);\n const count = await this.storage.events.publish(eventId, data);\n\n // Resume waiting executions\n for (const waiter of waiters) {\n const execution = await this.storage.execution.get(waiter.executionId);\n if (execution && execution.status === \"waiting\") {\n // Find the step that was waiting\n const stepName = execution.metadata._waitEventId as string;\n\n // Save the event data as the step result\n await this.storage.execution.saveStepResult(\n waiter.executionId,\n stepName,\n {\n data: { eventData: data, timeout: false },\n startedAt: new Date(),\n completedAt: new Date(),\n durationMs: 0,\n },\n );\n\n // Queue resume job\n await this.storage.queue.push({\n id: nanoid(),\n workflowId: execution.workflowId,\n eventName: `__resume:${waiter.executionId}`,\n payload: { eventId, data },\n metadata: { executionId: waiter.executionId, type: \"event-resume\" },\n priority: 0,\n attempts: 0,\n maxAttempts: 1,\n createdAt: new Date(),\n });\n }\n }\n\n return {\n waiters: count,\n executions: waiters.map((w) => w.executionId),\n };\n }\n\n /**\n * Create a public access token for a run\n */\n createPublicToken(runId: string, executionId?: string): string {\n return createAccessToken(\n { runId, executionId },\n this.tokenSecret,\n this.tokenExpiry,\n );\n }\n\n /**\n * Subscribe to run updates\n */\n subscribeToRun(\n runId: string,\n callback: (execution: Execution) => void,\n ): () => void {\n return this.storage.realtime.subscribe(`run:${runId}`, (data) => {\n callback(data as Execution);\n });\n }\n\n /**\n * Subscribe to execution updates\n */\n subscribeToExecution(\n executionId: string,\n callback: (event: unknown) => void,\n ): () => void {\n return this.storage.realtime.subscribe(\n `execution:${executionId}`,\n callback,\n );\n }\n\n /**\n * Handle trigger events\n */\n private async handleTrigger(event: TriggerEvent): Promise<void> {\n // Find workflow that matches the trigger\n const workflow = this.registry.get(event.source);\n if (!workflow) {\n this.log(\"No workflow found for trigger\", { source: event.source });\n return;\n }\n\n await this.trigger(workflow.id, event.data, {\n metadata: {\n triggerType: event.type,\n ...event.metadata,\n },\n });\n }\n\n /**\n * Get a trigger by name\n */\n getTrigger(type: string, ...args: unknown[]): Trigger | undefined {\n for (const [name, trigger] of this.triggers) {\n if (trigger.type === type) {\n return trigger;\n }\n }\n return undefined;\n }\n\n /**\n * Health check\n */\n async healthCheck(): Promise<boolean> {\n return this.storage.healthCheck();\n }\n\n /**\n * Get workflow registry\n */\n getRegistry(): WorkflowRegistry {\n return this.registry;\n }\n\n /**\n * Log helper\n */\n private log(message: string, data?: Record<string, unknown>): void {\n if (this.logging) {\n console.log(`[Stepflow] ${message}`, data ?? \"\");\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Q as QueueJob, P as PopOptions, l as NackOptions, E as Execution, L as ListOptions, j as StepResult, o as EventWaiter, U as Unsubscribe } from '../index-D_2FGtKL.js';
|
|
2
|
+
|
|
3
|
+
interface StorageAdapter {
|
|
4
|
+
connect(): Promise<void>;
|
|
5
|
+
disconnect(): Promise<void>;
|
|
6
|
+
healthCheck(): Promise<boolean>;
|
|
7
|
+
queue: QueueOperations;
|
|
8
|
+
execution: ExecutionOperations;
|
|
9
|
+
events: EventOperations;
|
|
10
|
+
leader: LeaderOperations;
|
|
11
|
+
realtime: RealtimeOperations;
|
|
12
|
+
}
|
|
13
|
+
interface QueueOperations {
|
|
14
|
+
/**
|
|
15
|
+
* Push a job to the queue
|
|
16
|
+
*/
|
|
17
|
+
push(job: QueueJob): Promise<string>;
|
|
18
|
+
/**
|
|
19
|
+
* Pop a job from the queue (atomic lock)
|
|
20
|
+
*/
|
|
21
|
+
pop(options?: PopOptions): Promise<QueueJob | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Acknowledge successful job completion
|
|
24
|
+
*/
|
|
25
|
+
ack(jobId: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Negative acknowledge - return job to queue
|
|
28
|
+
*/
|
|
29
|
+
nack(jobId: string, options?: NackOptions): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Schedule a job for future execution
|
|
32
|
+
*/
|
|
33
|
+
schedule(job: QueueJob, executeAt: Date): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Get all delayed/scheduled jobs
|
|
36
|
+
*/
|
|
37
|
+
getDelayed(): Promise<QueueJob[]>;
|
|
38
|
+
}
|
|
39
|
+
interface ExecutionOperations {
|
|
40
|
+
/**
|
|
41
|
+
* Create a new execution record
|
|
42
|
+
*/
|
|
43
|
+
create(execution: Execution): Promise<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Get an execution by ID
|
|
46
|
+
*/
|
|
47
|
+
get(executionId: string): Promise<Execution | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Get execution by idempotency key (for deduplication)
|
|
50
|
+
*/
|
|
51
|
+
getByIdempotencyKey(workflowId: string, idempotencyKey: string): Promise<Execution | null>;
|
|
52
|
+
/**
|
|
53
|
+
* Update an execution
|
|
54
|
+
*/
|
|
55
|
+
update(executionId: string, updates: Partial<Execution>): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* List executions with filters
|
|
58
|
+
*/
|
|
59
|
+
list(options: ListOptions): Promise<Execution[]>;
|
|
60
|
+
/**
|
|
61
|
+
* Get a cached step result (for checkpoint/replay)
|
|
62
|
+
*/
|
|
63
|
+
getStepResult<T = unknown>(executionId: string, stepName: string): Promise<StepResult<T> | null>;
|
|
64
|
+
/**
|
|
65
|
+
* Save a step result (checkpoint)
|
|
66
|
+
*/
|
|
67
|
+
saveStepResult(executionId: string, stepName: string, result: StepResult): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
interface EventOperations {
|
|
70
|
+
/**
|
|
71
|
+
* Publish an event, notifying all waiters
|
|
72
|
+
* Returns the number of waiters notified
|
|
73
|
+
*/
|
|
74
|
+
publish(eventId: string, data: unknown): Promise<number>;
|
|
75
|
+
/**
|
|
76
|
+
* Subscribe an execution to wait for an event
|
|
77
|
+
*/
|
|
78
|
+
subscribe(eventId: string, executionId: string, timeout: Date): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Get all executions waiting for an event
|
|
81
|
+
*/
|
|
82
|
+
getWaiters(eventId: string): Promise<EventWaiter[]>;
|
|
83
|
+
}
|
|
84
|
+
interface LeaderOperations {
|
|
85
|
+
/**
|
|
86
|
+
* Attempt to acquire a leadership lock
|
|
87
|
+
*/
|
|
88
|
+
acquire(lockId: string, ttlSeconds: number): Promise<boolean>;
|
|
89
|
+
/**
|
|
90
|
+
* Release a leadership lock
|
|
91
|
+
*/
|
|
92
|
+
release(lockId: string): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Renew an existing leadership lock
|
|
95
|
+
*/
|
|
96
|
+
renew(lockId: string, ttlSeconds: number): Promise<boolean>;
|
|
97
|
+
}
|
|
98
|
+
interface RealtimeOperations {
|
|
99
|
+
/**
|
|
100
|
+
* Subscribe to a channel for real-time updates
|
|
101
|
+
*/
|
|
102
|
+
subscribe(channel: string, callback: (data: unknown) => void): Unsubscribe;
|
|
103
|
+
/**
|
|
104
|
+
* Publish data to a channel
|
|
105
|
+
*/
|
|
106
|
+
publish(channel: string, data: unknown): Promise<void>;
|
|
107
|
+
}
|
|
108
|
+
interface StorageAdapterConfig {
|
|
109
|
+
type: string;
|
|
110
|
+
[key: string]: unknown;
|
|
111
|
+
}
|
|
112
|
+
type StorageAdapterFactory = (config: StorageAdapterConfig) => StorageAdapter;
|
|
113
|
+
|
|
114
|
+
export type { EventOperations, ExecutionOperations, LeaderOperations, QueueOperations, RealtimeOperations, StorageAdapter, StorageAdapterConfig, StorageAdapterFactory };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { d as Trigger, m as TriggerEvent, n as TriggerHandler } from '../index-D_2FGtKL.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stepflowjs/core",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Durable workflow orchestration for TypeScript",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./storage": {
|
|
15
|
+
"import": "./dist/storage/index.js",
|
|
16
|
+
"types": "./dist/storage/index.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./triggers": {
|
|
19
|
+
"import": "./dist/triggers/index.js",
|
|
20
|
+
"types": "./dist/triggers/index.d.ts"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"cron-parser": "^5.5.0",
|
|
28
|
+
"ms": "^2.1.3",
|
|
29
|
+
"nanoid": "^5.1.6"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/ms": "^2.1.0",
|
|
33
|
+
"tsup": "^8.5.1",
|
|
34
|
+
"vitest": "^4.0.17"
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"typescript": "^5.0.0"
|
|
38
|
+
},
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"author": "Stepflow Contributors",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://stepflow-production.up.railway.app",
|
|
44
|
+
"directory": "packages/core"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://stepflow-production.up.railway.app",
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://stepflow-production.up.railway.app"
|
|
49
|
+
},
|
|
50
|
+
"keywords": [
|
|
51
|
+
"stepflow",
|
|
52
|
+
"workflow",
|
|
53
|
+
"orchestration",
|
|
54
|
+
"durable",
|
|
55
|
+
"typescript"
|
|
56
|
+
],
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "tsup",
|
|
62
|
+
"dev": "tsup --watch",
|
|
63
|
+
"typecheck": "tsc --noEmit",
|
|
64
|
+
"test": "vitest",
|
|
65
|
+
"lint": "eslint src/",
|
|
66
|
+
"clean": "rm -rf dist"
|
|
67
|
+
}
|
|
68
|
+
}
|