@usehelical/workflows 0.0.1-alpha.13 → 0.0.1-alpha.14

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../core/internal/events/polling-loop.ts","../core/internal/events/event-bus-core.ts","../core/internal/repository/get-state.ts","../core/internal/repository/get-state-batch.ts","../core/internal/events/state-event-bus.ts","../core/internal/repository/get-message-batch.ts","../core/internal/events/message-event-bus.ts","../client/run-workflow.ts","../core/internal/run-registry.ts","../core/internal/repository/get-operations.ts","../core/internal/repository/get-pending-runs.ts","../core/internal/repository/upsert-run.ts","../core/internal/recover-pending-runs.ts","../core/internal/workflow-registry.ts","../core/internal/repository/get-run-batch.ts","../core/internal/events/run-event-bus.ts","../core/internal/queue-registry.ts","../client/cancel-run.ts","../core/internal/repository/enqueue-run.ts","../client/queue-workflow.ts","../core/internal/repository/dequeue-run.ts","../core/internal/repository/get-executable-runs.ts","../core/internal/repository/get-queue-partitions.ts","../core/internal/queue-manager.ts","../core/internal/events/setup-postgres-notify.ts","../core/internal/db/driver-pg.ts","../core/internal/repository/resume-run.ts","../client/resume-run.ts","../core/internal/repository/insert-message.ts","../client/send-message.ts","../client/get-state.ts","../client/runtime.ts"],"names":["POLLING_FALLBACK_INTERVAL_MS","sql","cancelRun","run","crypto","runs","resumeRun","getState"],"mappings":"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","file":"index.js","sourcesContent":["export class PollingLoop {\n private readonly intervalMs: number;\n private readonly jitterFactor: number;\n private intervalHandle: NodeJS.Timeout | null = null;\n private readonly callback: () => void;\n private running: boolean = false;\n\n constructor(intervalMs: number, callback: () => void, jitterFactor: number = 0.1) {\n this.intervalMs = intervalMs;\n this.callback = callback;\n this.jitterFactor = Math.max(0, Math.min(1, jitterFactor));\n }\n\n private calculateNextInterval(): number {\n const jitterRange = this.intervalMs * this.jitterFactor;\n const jitter = (Math.random() * 2 - 1) * jitterRange;\n return Math.max(0, this.intervalMs + jitter);\n }\n\n private scheduleNext() {\n if (!this.running) {\n return;\n }\n\n const nextInterval = this.calculateNextInterval();\n this.intervalHandle = setTimeout(() => {\n try {\n this.callback();\n } catch (error) {\n // Log error but continue polling\n console.error('PollingLoop callback error:', error);\n }\n this.scheduleNext();\n }, nextInterval);\n }\n\n start() {\n if (this.running) {\n return;\n }\n this.running = true;\n this.scheduleNext();\n }\n\n stop() {\n this.running = false;\n if (this.intervalHandle) {\n clearTimeout(this.intervalHandle);\n this.intervalHandle = null;\n }\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import { PollingLoop } from './polling-loop';\n\nexport type SubscriptionCallback<T> = (data: T) => void;\n\nexport type Wildcard = '*';\n\ntype EventBusCoreConfig = {\n allowWildcardSubscriptions: boolean;\n};\n\nexport interface EventBus {\n handleNotify: (payload: string) => void;\n subscribe: CallableFunction;\n emitEvent: CallableFunction;\n destroy: () => void;\n}\n\nexport class EventBusCore<TEvent> {\n private readonly subscribers: Map<string, Set<SubscriptionCallback<TEvent>>> = new Map();\n private readonly eventSequence = new Map<string, number>();\n private readonly pollingLoop: PollingLoop;\n private readonly allowWildcardSubscriptions: boolean;\n\n constructor(\n private readonly config: EventBusCoreConfig,\n pollingLoop: PollingLoop,\n ) {\n this.allowWildcardSubscriptions = config.allowWildcardSubscriptions;\n this.pollingLoop = pollingLoop;\n }\n\n subscribe(subject: string, key: string | '*', callback: SubscriptionCallback<TEvent>) {\n const subscriptionKey = createSubscriptionKey(subject, key);\n if (!this.subscribers.has(subscriptionKey)) {\n this.subscribers.set(subscriptionKey, new Set());\n }\n this.subscribers.get(subscriptionKey)!.add(callback);\n this.pollingLoop.start();\n\n return () => this.unsubscribe(subscriptionKey, callback);\n }\n\n private unsubscribe(subscriptionKey: string, callback: SubscriptionCallback<TEvent>) {\n const subscriptionCallbacks = this.subscribers.get(subscriptionKey);\n if (subscriptionCallbacks) {\n subscriptionCallbacks.delete(callback);\n if (subscriptionCallbacks.size === 0) {\n this.subscribers.delete(subscriptionKey);\n this.eventSequence.delete(subscriptionKey);\n }\n }\n if (this.subscribers.size === 0) {\n this.pollingLoop.stop();\n }\n }\n\n emitEvent(subject: string, key: string, event: TEvent, eventChangeId: number) {\n const subscriptionKeys = [createSubscriptionKey(subject, key)].concat(\n this.allowWildcardSubscriptions ? [createSubscriptionKey(subject, '*')] : [],\n );\n for (const subscriptionKey of subscriptionKeys) {\n const subscribers = this.subscribers.get(subscriptionKey);\n if (subscribers) {\n for (const subscriptionCallback of subscribers) {\n subscriptionCallback(event);\n }\n }\n }\n this.eventSequence.set(subscriptionKeys[0], eventChangeId);\n }\n\n checkHasSubscribers(subject: string, key: string) {\n const subscriptionKeys = [createSubscriptionKey(subject, key)].concat(\n this.allowWildcardSubscriptions ? [createSubscriptionKey(subject, '*')] : [],\n );\n return subscriptionKeys.some((subscriptionKey) => this.subscribers.has(subscriptionKey));\n }\n\n getEventSequence(subject: string, key: string) {\n return this.eventSequence.get(createSubscriptionKey(subject, key)) ?? 0;\n }\n\n getSubscriptionKeys() {\n return Array.from(this.subscribers.keys()).map(splitSubscriptionKey);\n }\n}\n\nfunction createSubscriptionKey(subject: string, key: string) {\n return `${subject}::${key}`;\n}\n\nfunction splitSubscriptionKey(subscriptionKey: string) {\n return subscriptionKey.split('::');\n}\n","import { Database } from '../db/db';\n\nexport async function getState(\n db: Database,\n runId: string,\n key: string,\n): Promise<string | undefined> {\n const result = await db\n .selectFrom('state')\n .select(['key', 'value', 'change_id'])\n .where('run_id', '=', runId)\n .where('key', '=', key)\n .executeTakeFirst();\n\n if (!result) {\n return undefined;\n }\n\n return result.value;\n}\n","import { Database } from '../db/db';\nimport { StateRetrievalRequest } from '../events/state-event-bus';\n\nexport async function getStateBatch(db: Database, stateRetrievalRequests: StateRetrievalRequest) {\n const results = await db\n .selectFrom('state')\n .select(['key', 'value', 'change_id', 'run_id', 'change_id'])\n .where(\n 'run_id',\n 'in',\n stateRetrievalRequests.map((r) => r.runId),\n )\n .where(\n 'key',\n 'in',\n stateRetrievalRequests.map((r) => r.key),\n )\n .execute();\n return results.map((r) => ({\n runId: r.run_id,\n key: r.key,\n value: r.value,\n changeId: r.change_id,\n }));\n}\n","import { PollingLoop } from './polling-loop';\nimport { EventBus, EventBusCore } from './event-bus-core';\nimport { getState } from '../repository/get-state';\nimport { Database } from '../db/db';\nimport { getStateBatch } from '../repository/get-state-batch';\n\ntype SubscriptionCallback<T> = (data: T) => void;\n\nconst POLLING_FALLBACK_INTERVAL_MS = 10_000;\n\ntype StateEvent = unknown;\n\nexport class StateEventBus implements EventBus {\n private readonly bus: EventBusCore<StateEvent>;\n private readonly pollingLoop: PollingLoop;\n\n constructor(private readonly db: Database) {\n this.pollingLoop = new PollingLoop(POLLING_FALLBACK_INTERVAL_MS, this.handlePoll.bind(this));\n this.bus = new EventBusCore({ allowWildcardSubscriptions: false }, this.pollingLoop);\n this.pollingLoop.start();\n }\n\n handleNotify(payload: string) {\n const [workflowId, key, changeIdString] = payload.split('::');\n const changeId = Number(changeIdString);\n if (\n !this.bus.checkHasSubscribers(workflowId, key) ||\n this.bus.getEventSequence(workflowId, key) >= changeId\n ) {\n return;\n }\n getState(this.db, workflowId, key).then((state) => {\n if (!state) {\n return;\n }\n this.bus.emitEvent(workflowId, key, state, changeId);\n });\n }\n\n private async handlePoll() {\n const stateRetrievalRequests = getStateRetrievalRequests(this.bus.getSubscriptionKeys());\n if (stateRetrievalRequests.length === 0) {\n return;\n }\n const states = await getStateBatch(this.db, stateRetrievalRequests);\n for (const state of states) {\n if (this.bus.getEventSequence(state.runId, state.key) >= state.changeId) {\n continue;\n }\n this.bus.emitEvent(state.runId, state.key, state.value, state.changeId);\n }\n }\n\n subscribe<T>(workflowId: string, key: string, callback: SubscriptionCallback<T>) {\n return this.bus.subscribe(workflowId, key, callback as SubscriptionCallback<unknown>);\n }\n\n emitEvent<T>(workflowId: string, key: string, data: T, changeId: number) {\n this.bus.emitEvent(workflowId, key, data, changeId);\n }\n\n destroy() {\n this.pollingLoop.stop();\n }\n}\n\nfunction getStateRetrievalRequests(keys: string[][]) {\n return keys.map((k) => {\n const [runId, key] = k;\n return {\n runId,\n key,\n };\n });\n}\n\nexport type StateRetrievalRequest = ReturnType<typeof getStateRetrievalRequests>;\n","import { sql } from 'kysely';\nimport { Database } from '../db/db';\nimport { MessageRetrievalRequest } from '../events/message-event-bus';\n\nexport async function getMessageBatch(\n db: Database,\n messageRetrievalRequests: MessageRetrievalRequest,\n) {\n const uniquePairs = Array.from(\n new Map(\n messageRetrievalRequests.map((r) => [`${r.destinationWorkflowId}:${r.messageType}`, r]),\n ).values(),\n );\n\n const results = await db\n .selectFrom('messages')\n .select(['id', 'payload', 'type', 'destination_run_id'])\n .where(\n sql<boolean>`(destination_run_id, type) IN (${sql.join(\n uniquePairs.map((r) => sql`(${r.destinationWorkflowId}, ${r.messageType})`),\n )})`,\n )\n .execute();\n\n return results.map((r) => ({\n id: r.id,\n payload: r.payload,\n type: r.type,\n destinationRunId: r.destination_run_id,\n }));\n}\n","import { EventBus, EventBusCore } from './event-bus-core';\nimport { PollingLoop } from './polling-loop';\nimport { Database } from '../db/db';\nimport { getMessageBatch } from '../repository/get-message-batch';\n\ntype MessageEvent = undefined;\n\ntype MessageCallback = (event: MessageEvent) => void;\n\nconst POLLING_FALLBACK_INTERVAL_MS = 10_000;\n\nexport class MessageEventBus implements Omit<EventBus, 'emitEvent'> {\n private readonly bus: EventBusCore<MessageEvent>;\n private readonly pollingLoop: PollingLoop;\n\n constructor(private readonly db: Database) {\n this.pollingLoop = new PollingLoop(POLLING_FALLBACK_INTERVAL_MS, this.handlePoll.bind(this));\n this.bus = new EventBusCore({ allowWildcardSubscriptions: true }, this.pollingLoop);\n this.pollingLoop.start();\n }\n\n handleNotify(payload: string) {\n const [destinationWorkflowId, messageType, messageCount] = payload.split('::');\n if (!this.bus.checkHasSubscribers(destinationWorkflowId, messageType)) {\n return;\n }\n this.bus.emitEvent(destinationWorkflowId, messageType, undefined, Number(messageCount));\n }\n\n private async handlePoll() {\n const messageRetrievalRequests = getMessageRetrievalRequests(this.bus.getSubscriptionKeys());\n if (messageRetrievalRequests.length === 0) {\n return;\n }\n const messages = await getMessageBatch(this.db, messageRetrievalRequests);\n for (const message of messages) {\n this.bus.emitEvent(message.destinationRunId, message.type, undefined, 1);\n }\n }\n\n subscribe(destinationWorkflowId: string, type: string, cb: MessageCallback) {\n return this.bus.subscribe(destinationWorkflowId, type, cb);\n }\n\n destroy() {\n this.pollingLoop.stop();\n }\n}\n\nfunction getMessageRetrievalRequests(subscriptionKeys: string[][]) {\n return subscriptionKeys.map(([destinationWorkflowId, messageType]) => ({\n destinationWorkflowId,\n messageType,\n }));\n}\n\nexport type MessageRetrievalRequest = ReturnType<typeof getMessageRetrievalRequests>;\n","import crypto from 'node:crypto';\nimport { serialize } from '../core/internal/serialization';\nimport { WorkflowEntry, WorkflowFunction } from '../core/workflow';\nimport { executeWorkflow } from '../core/internal/execute-workflow';\nimport { RuntimeContext } from '../core/internal/runtime-context';\nimport { WorkflowNotFoundError } from './errors';\nimport { createRunHandle } from './run';\nimport { insertPendingRun } from '../core/internal/repository/insert-pending-run';\n\nexport type RunWorkflowOptions = {\n timeout?: number;\n deadline?: number;\n id?: string;\n};\n\nexport async function runWorkflow<TArgs extends unknown[], TReturn>(\n ctx: RuntimeContext,\n wf: WorkflowEntry<TArgs, TReturn> | string,\n args: TArgs = [] as unknown as TArgs,\n options: RunWorkflowOptions = {},\n) {\n const { db, executorId, workflowRegistry } = ctx;\n\n const workflow =\n typeof wf === 'string'\n ? workflowRegistry.getByName(wf)\n : workflowRegistry.getByWorkflowDefinition(wf);\n if (!workflow) {\n throw new WorkflowNotFoundError('Workflow not found');\n }\n\n const runId = options.id ?? crypto.randomUUID();\n\n const { path } = await insertPendingRun(db, {\n runId,\n path: [runId],\n inputs: serialize(args),\n executorId: executorId,\n workflowName: workflow.name,\n });\n\n await executeWorkflow<TArgs, TReturn>(ctx, {\n runId: runId,\n runPath: path,\n workflowName: workflow.name,\n fn: workflow.fn as WorkflowFunction<TArgs, TReturn>,\n args,\n options,\n });\n\n return createRunHandle<TReturn>(ctx, runId);\n}\n","import { ExecutionContext } from './execution-context';\n\nexport interface RunEntry<TReturn = unknown> {\n store: ExecutionContext;\n promise: Promise<TReturn>;\n abortController: AbortController;\n getPromiseState(): 'pending' | 'fulfilled' | 'rejected';\n}\n\nexport class RunRegistry {\n private readonly runs: Map<string, RunEntry> = new Map();\n\n registerRun(runId: string, entry: Omit<RunEntry, 'getPromiseState'>) {\n let state: 'pending' | 'fulfilled' | 'rejected' = 'pending';\n\n entry.promise.then(\n () => {\n state = 'fulfilled';\n },\n () => {\n state = 'rejected';\n },\n );\n\n this.runs.set(runId, {\n ...entry,\n getPromiseState: () => state,\n });\n }\n\n unregisterRun(runId: string) {\n this.runs.delete(runId);\n }\n\n getRun(runId: string) {\n return this.runs.get(runId);\n }\n}\n","import { Database } from '../db/db';\nimport { OperationResult } from '../operation-manager';\n\nexport async function getOperations(db: Database, runId: string): Promise<OperationResult[]> {\n const results = await db\n .selectFrom('operations')\n .select(['output', 'error'])\n .where('run_id', '=', runId)\n .orderBy('sequence_id', 'desc')\n .execute();\n return results.map((r) => ({\n result: r.output ?? undefined,\n error: r.error ?? undefined,\n }));\n}\n","import { Database } from '../db/db';\n\nexport async function getPendingRuns(db: Database, executorId: string) {\n const pendingRuns = await db\n .selectFrom('runs')\n .select(['id', 'path', 'inputs', 'workflow_name'])\n .where('status', '=', 'pending')\n .where('executor_id', '=', executorId)\n .execute();\n\n return pendingRuns.map((run) => ({\n id: run.id,\n path: run.path,\n inputs: run.inputs,\n workflowName: run.workflow_name,\n }));\n}\n","import { sql } from 'kysely';\nimport { RunStatus } from '../../workflow';\nimport { Database, Transaction } from '../db/db';\nimport { MaxRecoveryAttemptsExceededError } from '../../../client/errors';\n\nconst DEFAULT_MAX_RETRIES = 10;\n\nexport type UpsertRunOptions = {\n runId: string;\n path: string[];\n inputs: string;\n executorId: string;\n workflowName: string;\n parentRunId?: string;\n status: RunStatus;\n idempotencyKey?: string;\n timeout?: number;\n deadline?: number;\n isRecovery?: boolean;\n maxRetries?: number;\n queueName?: string;\n};\n\nexport type UpsertRunResult = {\n runId: string;\n path: string[];\n changeId: number;\n executorId?: string;\n recoveryAttempts: number;\n idempotencyKey?: string;\n status: RunStatus;\n shouldExecute: boolean;\n};\n\nexport async function upsertRun(\n db: Database | Transaction,\n options: UpsertRunOptions,\n): Promise<UpsertRunResult> {\n const incrementAttempts = options.isRecovery ? 1 : 0;\n const initialRecoveryAttempts = options.status === 'queued' ? 0 : 1;\n\n const result = await db\n .insertInto('runs')\n .values({\n id: options.runId,\n path: options.path,\n workflow_name: options.workflowName,\n status: options.status,\n inputs: options.inputs,\n idempotency_key: options.idempotencyKey,\n executor_id: options.executorId,\n parent_run_id: options.parentRunId,\n timeout_ms: options.timeout,\n deadline_epoch_ms: options.deadline,\n recovery_attempts: initialRecoveryAttempts,\n queue_name: options.queueName,\n created_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .onConflict((oc) =>\n oc.column('id').doUpdateSet({\n recovery_attempts: sql`CASE \n WHEN runs.status != 'QUEUED' \n THEN runs.recovery_attempts + ${incrementAttempts}\n ELSE runs.recovery_attempts\n END`,\n\n // Update executor_id when NEW status is not ENQUEUED\n // This allows dequeue operations to claim the workflow\n executor_id: sql`CASE \n WHEN EXCLUDED.status != 'QUEUED' \n THEN EXCLUDED.executor_id\n ELSE runs.executor_id\n END`,\n\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n }),\n )\n .returning([\n 'id',\n 'change_id',\n 'recovery_attempts',\n 'executor_id',\n 'idempotency_key',\n 'status',\n 'path',\n ])\n .executeTakeFirst();\n\n if (!result) {\n throw new Error('Unexpectedly failed to upsert run');\n }\n\n // check if idempotency key matches\n const isOwner = result.idempotency_key === options.idempotencyKey;\n const shouldExecute = isOwner || options.isRecovery;\n\n // Check max recovery attempts if authorized to execute\n if (shouldExecute) {\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n if ((result.recovery_attempts as unknown as number) > maxRetries + 1) {\n // Mark as exceeded\n await db\n .updateTable('runs')\n .set({\n status: 'MAX_RECOVERY_ATTEMPTS_EXCEEDED',\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .where('id', '=', result.id)\n .where('status', '=', 'PENDING')\n .execute();\n\n throw new MaxRecoveryAttemptsExceededError(result.id, maxRetries);\n }\n }\n\n return {\n runId: result.id,\n path: options.path,\n changeId: result.change_id,\n recoveryAttempts: result.recovery_attempts as unknown as number,\n executorId: result.executor_id ?? undefined,\n idempotencyKey: result.idempotency_key ?? undefined,\n status: result.status as RunStatus,\n shouldExecute: shouldExecute ?? false,\n };\n}\n","import { executeWorkflow } from './execute-workflow';\nimport { getOperations } from './repository/get-operations';\nimport { getPendingRuns } from './repository/get-pending-runs';\nimport { upsertRun } from './repository/upsert-run';\nimport { RuntimeContext } from './runtime-context';\nimport { deserialize } from './serialization';\n\nexport async function recoverPendingRuns(ctx: RuntimeContext) {\n const { db, executorId, workflowRegistry } = ctx;\n const pendingRuns = await getPendingRuns(db, executorId);\n for (const run of pendingRuns) {\n try {\n const operations = await getOperations(db, run.id);\n const workflow = workflowRegistry.getByName(run.workflowName);\n if (!workflow) {\n console.error(`Workflow ${run.workflowName} not found for recovery`);\n continue;\n }\n const args = run.inputs ? deserialize<unknown[]>(run.inputs) : [];\n const upsertResult = await upsertRun(db, {\n runId: run.id,\n path: run.path,\n inputs: run.inputs ?? '',\n executorId: executorId,\n workflowName: run.workflowName,\n status: 'pending',\n isRecovery: true,\n });\n if (!upsertResult.shouldExecute) {\n console.log(`Run ${run.id} already executed, skipping recovery`);\n continue;\n }\n await executeWorkflow(ctx, {\n runId: upsertResult.runId,\n runPath: upsertResult.path,\n workflowName: run.workflowName,\n fn: workflow.fn,\n args: args,\n operations,\n });\n } catch (error) {\n console.error(`Error recovering run ${run.id}:`, error);\n }\n }\n}\n","import { WorkflowDefinition, WorkflowEntry } from '../workflow';\n\nexport class WorkflowRegistry {\n private readonly workflows: Record<string, WorkflowEntry> = {};\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n private readonly fnToName: Map<Function, string> = new Map();\n\n constructor(workflows: Record<string, WorkflowEntry>) {\n this.workflows = workflows;\n for (const [name, entry] of Object.entries(workflows)) {\n this.fnToName.set(entry, name);\n }\n }\n\n getByName(name: string): (WorkflowDefinition & { name: string }) | undefined {\n const entry = this.workflows[name];\n if (!entry) {\n return undefined;\n }\n return {\n ...entry(),\n name,\n };\n }\n\n getByWorkflowDefinition<TArgs extends unknown[], TReturn>(\n definition: WorkflowEntry<TArgs, TReturn>,\n ): (WorkflowDefinition<TArgs, TReturn> & { name: string }) | undefined {\n const name = this.fnToName.get(definition);\n if (!name) {\n return undefined;\n }\n return {\n ...definition(),\n name,\n };\n }\n}\n","import { RunStatus } from '../../workflow';\nimport { Database } from '../db/db';\n\nexport async function getRunBatch(db: Database, runIds: string[]) {\n const results = await db\n .selectFrom('runs')\n .select(['id', 'inputs', 'output', 'error', 'status', 'change_id', 'queue_name'])\n .where('id', 'in', runIds)\n .execute();\n return results.map((r) => ({\n id: r.id,\n input: r.inputs ?? undefined,\n output: r.output ?? undefined,\n error: r.error ?? undefined,\n status: r.status as RunStatus,\n changeId: r.change_id,\n queueName: r.queue_name ?? undefined,\n }));\n}\n","import { RunStatus } from '../../workflow';\nimport { EventBus, EventBusCore } from './event-bus-core';\nimport { PollingLoop } from './polling-loop';\nimport { getRun } from '../repository/get-run';\nimport { getRunBatch } from '../repository/get-run-batch';\nimport { Database } from '../db/db';\n\ninterface RunEvent {\n status: RunStatus;\n queueName?: string;\n result?: unknown;\n error?: string;\n}\n\ntype RunEventCallback = (e: RunEvent) => void;\n\nconst POLLING_FALLBACK_INTERVAL_MS = 100; // Changed from 10_000 for testing\n\nexport class RunEventBus implements Omit<EventBus, 'emitEvent'> {\n private readonly bus: EventBusCore<RunEvent>;\n private readonly pollingLoop: PollingLoop;\n\n constructor(private readonly db: Database) {\n this.pollingLoop = new PollingLoop(POLLING_FALLBACK_INTERVAL_MS, this.handlePoll.bind(this));\n this.bus = new EventBusCore({ allowWildcardSubscriptions: true }, this.pollingLoop);\n this.pollingLoop.start();\n }\n\n handleNotify(payload: string) {\n const [runId, status, changeIdString] = payload.split('::');\n const changeId = Number(changeIdString);\n if (\n !this.bus.checkHasSubscribers(runId, status) ||\n this.bus.getEventSequence(runId, status) >= changeId\n ) {\n return;\n }\n getRun(this.db, runId).then((run) => {\n if (!run) {\n return;\n }\n this.bus.emitEvent(\n runId,\n status,\n {\n status: run.status,\n queueName: run.queueName,\n result: run.output,\n error: run.error,\n },\n changeId,\n );\n });\n }\n\n private async handlePoll() {\n const workflowIds = [\n ...new Set(this.bus.getSubscriptionKeys().map(([workflowId]) => workflowId)),\n ];\n if (workflowIds.length === 0) {\n return;\n }\n const runs = await getRunBatch(this.db, workflowIds);\n for (const run of runs) {\n this.bus.emitEvent(\n run.id,\n run.status,\n {\n status: run.status,\n queueName: run.queueName,\n result: run.output,\n error: run.error,\n },\n run.changeId,\n );\n }\n }\n\n subscribe(runId: string, status: RunStatus | '*', cb: RunEventCallback) {\n return this.bus.subscribe(runId, status, cb);\n }\n\n destroy() {\n this.pollingLoop.stop();\n }\n}\n","import { QueueDefinition, QueueEntry } from '../queue';\nimport { QueueInstance } from './queue-manager';\n\nexport class QueueRegistry {\n private readonly queues: Record<string, QueueEntry> = {};\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n private readonly fnToName: Map<Function, string> = new Map();\n\n constructor(queues: Record<string, QueueEntry>) {\n this.queues = queues;\n for (const [name, entry] of Object.entries(queues)) {\n this.fnToName.set(entry, name);\n }\n }\n\n getByName(name: string): QueueDefinition | undefined {\n const entry = this.queues[name];\n if (!entry) {\n return undefined;\n }\n return {\n name,\n ...entry(),\n };\n }\n\n getByQueueEntry(entry: QueueEntry) {\n const name = this.fnToName.get(entry);\n if (!name) {\n return undefined;\n }\n return {\n ...entry(),\n name,\n };\n }\n\n getQueueInstances(): Record<string, QueueInstance> {\n return Object.entries(this.queues).reduce(\n (acc, [name, entry]) => {\n const options = entry();\n acc[name] = {\n rateLimit: options.rateLimit ?? undefined,\n workerConcurrency: options.workerConcurrency ?? undefined,\n concurrency: options.concurrency ?? undefined,\n priorityEnabled: options.priorityEnabled ?? undefined,\n };\n return acc;\n },\n {} as Record<string, QueueInstance>,\n );\n }\n}\n","import { RunNotFoundError } from '../core/internal/errors';\nimport { cancelRun as cancelRunInDb } from '../core/internal/repository/cancel-run';\nimport { RuntimeContext } from '../core/internal/runtime-context';\n\nexport async function cancelRun(ctx: RuntimeContext, runId: string) {\n const { db, runRegistry } = ctx;\n const run = await cancelRunInDb(runId, db);\n if (!run) {\n throw new RunNotFoundError(runId);\n }\n for (const pathPart of run.path) {\n const run = runRegistry.getRun(pathPart);\n if (run) {\n run.abortController.abort();\n }\n }\n}\n","import { sql } from 'kysely';\nimport { Database, Transaction } from '../db/db';\n\nexport type EnqueueRunOptions = {\n runId: string;\n path: string[];\n inputs: string;\n executorId: string;\n workflowName: string;\n timeout?: number;\n deadline?: number;\n recoveryAttempts?: number;\n deduplicationId?: string;\n queueName: string;\n queuePartitionKey?: string;\n};\n\nexport async function enqueueRun(db: Database | Transaction, options: EnqueueRunOptions) {\n const result = await db\n .insertInto('runs')\n .values({\n id: options.runId,\n path: options.path,\n inputs: options.inputs,\n queue_name: options.queueName,\n queue_partition_key: options.queuePartitionKey,\n queue_deduplication_id: options.deduplicationId,\n executor_id: options.executorId,\n workflow_name: options.workflowName,\n status: 'queued',\n recovery_attempts: options.recoveryAttempts,\n created_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .onConflict((oc) => oc.columns(['queue_name', 'queue_deduplication_id']).doNothing())\n .returning(['id', 'change_id'])\n .executeTakeFirst();\n\n return {\n runId: result?.id,\n changeId: result?.change_id,\n };\n}\n","import { QueueNotFoundError, WorkflowNotFoundError } from './errors';\nimport { RuntimeContext } from '../core/internal/runtime-context';\nimport { serialize } from '../core/internal/serialization';\nimport { QueueEntry } from '../core/queue';\nimport { WorkflowEntry } from '../core/workflow';\nimport crypto from 'node:crypto';\nimport { createRunHandle } from './run';\nimport { enqueueRun } from '../core/internal/repository/enqueue-run';\n\nexport type QueueWorkflowOptions = {\n timeout?: number;\n deadline?: number;\n priority?: number;\n partitionKey?: string;\n deduplicationId?: string;\n};\n\nexport async function queueWorkflow<TArgs extends unknown[], TReturn>(\n ctx: RuntimeContext,\n queue: QueueEntry | string,\n wf: WorkflowEntry<TArgs, TReturn> | string,\n args?: TArgs,\n options?: QueueWorkflowOptions,\n) {\n const { db, executorId, workflowRegistry, queueRegistry } = ctx;\n\n const runId = crypto.randomUUID();\n\n const workflowName =\n typeof wf === 'string' ? wf : workflowRegistry.getByWorkflowDefinition(wf)?.name;\n if (!workflowName) {\n throw new WorkflowNotFoundError('Workflow name not specified');\n }\n\n const queueName = typeof queue === 'string' ? queue : queueRegistry.getByQueueEntry(queue)?.name;\n if (!queueName) {\n throw new QueueNotFoundError('Queue name not specified');\n }\n\n await enqueueRun(db, {\n runId,\n path: [runId],\n inputs: serialize(args),\n executorId,\n workflowName,\n timeout: options?.timeout,\n deadline: options?.deadline,\n queueName,\n });\n\n return createRunHandle<TReturn>(ctx, runId);\n}\n","import { sql } from 'kysely';\nimport { Transaction } from '../db/db';\nimport { RunNotFoundError } from '../errors';\n\nexport type DequeuedRun = {\n runId: string;\n changeId: number;\n path: string[];\n timeoutMs?: number;\n deadlineEpochMs?: number;\n inputs?: string;\n workflowName: string;\n};\n\nexport async function dequeueRun(\n tx: Transaction,\n runId: string,\n executorId: string,\n): Promise<DequeuedRun> {\n const result = await tx\n .updateTable('runs')\n .set({\n status: 'pending',\n started_at_epoch_ms: sql`(extract(epoch from now()) * 1000)::bigint`,\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n executor_id: executorId,\n })\n .where('id', '=', runId)\n .where('status', '=', 'queued')\n .returning([\n 'id',\n 'change_id',\n 'path',\n 'timeout_ms',\n 'deadline_epoch_ms',\n 'inputs',\n 'workflow_name',\n ])\n .executeTakeFirst();\n\n if (!result) {\n throw new RunNotFoundError(runId);\n }\n\n return {\n runId: result.id,\n changeId: result.change_id,\n path: result.path,\n timeoutMs: result.timeout_ms ? Number(result.timeout_ms) : undefined,\n deadlineEpochMs: result.deadline_epoch_ms ? Number(result.deadline_epoch_ms) : undefined,\n inputs: result.inputs ?? undefined,\n workflowName: result.workflow_name,\n };\n}\n","import { sql } from 'kysely';\nimport { QueueRateLimit } from '../../queue';\nimport { Database } from '../db/db';\nimport { withDbRetry } from '../db/retry';\nimport { DequeuedRun, dequeueRun } from './dequeue-run';\n\ntype GetExecutableRunsParams = {\n queueName: string;\n executorId: string;\n workerConcurrency?: number;\n globalConcurrency?: number;\n rateLimit?: QueueRateLimit;\n partitionKey?: string;\n priorityEnabled?: boolean;\n};\n\nexport async function getExecutableRuns(\n db: Database,\n {\n queueName,\n executorId,\n workerConcurrency,\n globalConcurrency,\n rateLimit,\n partitionKey,\n priorityEnabled,\n }: GetExecutableRunsParams,\n): Promise<DequeuedRun[]> {\n const startTimeMs = Date.now();\n const limiterPeriodMs = rateLimit ? rateLimit.period * 1000 : 0;\n\n return await withDbRetry(async () =>\n db.transaction().execute(async (tx) => {\n // rate limit check\n if (rateLimit) {\n const result = await tx\n .selectFrom('runs')\n .select(({ fn }) => [fn.count<number>('id').as('count')])\n .where('queue_name', '=', queueName)\n .where('status', '!=', 'queued')\n .where('started_at_epoch_ms', '>', (startTimeMs - limiterPeriodMs).toString())\n .$if(partitionKey !== undefined, (qb) =>\n qb.where('queue_partition_key', '=', partitionKey!),\n )\n .executeTakeFirstOrThrow();\n\n if (result.count >= rateLimit.limitPerPeriod) {\n return [];\n }\n }\n\n // Calculate concurrency\n let maxTasks = Infinity;\n\n if (globalConcurrency || workerConcurrency) {\n const runningTasks = await tx\n .selectFrom('runs')\n .select(['executor_id', ({ fn }) => fn.count<number>('id').as('task_count')])\n .where('queue_name', '=', queueName)\n .where('status', '=', 'pending')\n .$if(partitionKey !== undefined, (qb) =>\n qb.where('queue_partition_key', '=', partitionKey!),\n )\n .groupBy('executor_id')\n .execute();\n\n const tasksByExecutor = Object.fromEntries(\n runningTasks.map((row) => [row.executor_id!, row.task_count]),\n );\n\n const runningForThisWorker = tasksByExecutor[executorId] ?? 0;\n\n if (workerConcurrency !== undefined) {\n maxTasks = Math.max(0, workerConcurrency - runningForThisWorker);\n }\n\n if (globalConcurrency !== undefined) {\n const totalRunning = Object.values(tasksByExecutor).reduce((a, b) => a + b, 0);\n const availableGlobal = Math.max(0, globalConcurrency - totalRunning);\n maxTasks = Math.min(maxTasks, availableGlobal);\n }\n\n if (maxTasks <= 0) {\n return [];\n }\n }\n\n const lockClause = globalConcurrency ? 'FOR UPDATE NOWAIT' : 'FOR UPDATE SKIP LOCKED';\n\n const workflowIds = await sql<{ id: string }>`\n SELECT id \n FROM runs\n WHERE status = ${'queued'}\n AND queue_name = ${queueName}\n ${partitionKey !== undefined ? sql`AND queue_partition_key = ${partitionKey}` : sql``}\n ${priorityEnabled ? sql`ORDER BY priority ASC, created_at ASC` : sql`ORDER BY created_at ASC`}\n ${maxTasks !== Infinity ? sql`LIMIT ${maxTasks}` : sql``}\n ${sql.raw(lockClause)}\n `.execute(tx);\n\n const claimedRuns: DequeuedRun[] = [];\n\n for (const { id } of workflowIds.rows) {\n const dequeuedRun = await dequeueRun(tx, id, executorId);\n claimedRuns.push(dequeuedRun);\n }\n\n return claimedRuns;\n }),\n );\n}\n","import { Database } from '../db/db';\n\nexport async function getQueuePartitions(db: Database, queueName: string): Promise<string[]> {\n const result = await db\n .selectFrom('runs')\n .select('queue_partition_key')\n .distinct()\n .where('queue_name', '=', queueName)\n .where('status', '=', 'queued')\n .where('queue_partition_key', 'is not', null)\n .execute();\n return result.map((row) => row.queue_partition_key!);\n}\n","import { PollingLoop } from './events/polling-loop';\nimport { getExecutableRuns } from './repository/get-executable-runs';\nimport { QueueRateLimit } from '../queue';\nimport { deserialize } from './serialization';\nimport { executeWorkflow } from './execute-workflow';\nimport { RuntimeContext } from './runtime-context';\nimport { getQueuePartitions } from './repository/get-queue-partitions';\n\nexport interface QueueInstance {\n rateLimit?: QueueRateLimit;\n workerConcurrency?: number;\n concurrency?: number;\n priorityEnabled?: boolean;\n partitioningEnabled?: boolean;\n}\n\nconst POLLING_INTERVAL_MS = 1000;\n\nexport class QueueManager {\n private readonly pollingLoop: PollingLoop;\n private readonly queues: Record<string, QueueInstance> = {};\n\n constructor(private readonly ctx: RuntimeContext) {\n this.pollingLoop = new PollingLoop(POLLING_INTERVAL_MS, this.handlePoll.bind(this));\n this.queues = this.ctx.queueRegistry.getQueueInstances();\n }\n\n private async handlePoll() {\n for (const [queueName, queue] of Object.entries(this.queues)) {\n await this.dispatch(queueName, queue);\n }\n }\n\n private async dispatch(queueName: string, queue: QueueInstance) {\n const { db, executorId } = this.ctx;\n\n let partitions: string[] = [];\n\n if (queue.partitioningEnabled) {\n partitions = await getQueuePartitions(db, queueName);\n\n for (const partition of partitions) {\n const runs = await getExecutableRuns(db, {\n queueName,\n executorId,\n workerConcurrency: queue.workerConcurrency,\n globalConcurrency: queue.concurrency,\n rateLimit: queue.rateLimit,\n partitionKey: partition,\n priorityEnabled: queue.priorityEnabled,\n });\n for (const run of runs) {\n const workflow = this.ctx.workflowRegistry.getByName(run.workflowName);\n if (!workflow) {\n console.error(`Workflow ${run.workflowName} not found`);\n continue;\n }\n await executeWorkflow(this.ctx, {\n runId: run.runId,\n runPath: run.path,\n workflowName: run.workflowName,\n fn: workflow.fn,\n args: deserialize<unknown[]>(run.inputs ?? '[]'),\n });\n }\n }\n return;\n }\n\n const runs = await getExecutableRuns(db, {\n queueName,\n executorId,\n workerConcurrency: queue.workerConcurrency,\n globalConcurrency: queue.concurrency,\n rateLimit: queue.rateLimit,\n priorityEnabled: queue.priorityEnabled,\n });\n for (const run of runs) {\n const workflow = this.ctx.workflowRegistry.getByName(run.workflowName);\n if (!workflow) {\n console.error(`Workflow ${run.workflowName} not found`);\n continue;\n }\n await executeWorkflow(this.ctx, {\n runId: run.runId,\n runPath: run.path,\n workflowName: run.workflowName,\n fn: workflow.fn,\n args: deserialize<unknown[]>(run.inputs ?? '[]'),\n });\n }\n }\n\n start() {\n this.pollingLoop.start();\n }\n\n destroy() {\n this.pollingLoop.stop();\n }\n}\n","import { Client } from '../db/driver-pg';\nimport { withDbRetry } from '../db/retry';\n\ntype SubscriptionCallback<T> = (data: T) => void;\n\nconst CHANNELS = ['runs', 'messages', 'state'];\n\ntype Channel = (typeof CHANNELS)[number];\n\ntype Subscriptions = {\n [K in Channel]: SubscriptionCallback<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n};\n\nexport async function setupPostgresNotify(client: Client, subscriptions: Subscriptions) {\n await withDbRetry(async () => {\n try {\n await client.query(`BEGIN`);\n for (const channel of CHANNELS) {\n await client.query(`LISTEN \"helical_${channel}\"`);\n }\n await client.query(`COMMIT`);\n } catch (error) {\n await client.query(`ROLLBACK`);\n throw error;\n }\n\n for (const [channel, callback] of Object.entries(subscriptions)) {\n await client.listen(`helical_${channel}`, callback);\n }\n });\n}\n","import { Kysely, PostgresDialect } from 'kysely';\nimport { Pool, PoolClient } from 'pg';\nimport { DB } from './types';\nimport { Database } from './db';\n\nexport interface Client {\n listen(channel: string, callback: (payload: string | undefined) => void): Promise<void>;\n query(query: string): Promise<void>;\n}\n\nexport interface DbDriver {\n client: Client;\n db: Database;\n}\n\nexport function createPgDriver({ connectionString }: { connectionString: string }): DbDriver {\n const pool = new Pool({\n connectionString: connectionString,\n max: 10,\n });\n let clientPromise: Promise<PoolClient> | undefined;\n const getClient = async () => {\n if (!clientPromise) {\n clientPromise = pool.connect();\n }\n return await clientPromise;\n };\n return {\n client: {\n listen: async (channel: string, callback: (payload: string | undefined) => void) => {\n const client = await getClient();\n client.on('notification', (msg) => {\n if (msg.channel !== channel) return;\n callback(msg.payload);\n });\n },\n query: async (query: string) => {\n const client = await getClient();\n await client.query(query);\n },\n },\n db: new Kysely<DB>({ dialect: new PostgresDialect({ pool }) }),\n };\n}\n","import { sql } from 'kysely';\nimport { Database, Transaction } from '../db/db';\nimport { RunNotFoundError } from '../errors';\n\nconst INTERNAL_QUEUE_NAME = '_helical_internal_queue';\n\nexport async function resumeRun(db: Database | Transaction, runId: string) {\n const result = await db\n .updateTable('runs')\n .set({\n status: 'queued',\n queue_name: INTERNAL_QUEUE_NAME,\n deadline_epoch_ms: null,\n timeout_ms: null,\n recovery_attempts: 0,\n started_at_epoch_ms: sql`(extract(epoch from now()) * 1000)::bigint`,\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .where('id', '=', runId)\n .where('status', '=', 'pending')\n .execute();\n\n if (!result) {\n throw new RunNotFoundError(runId);\n }\n}\n","import { RuntimeContext } from '../core/internal/runtime-context';\nimport { resumeRun as resumeRunInDb } from '../core/internal/repository/resume-run';\nimport { createRunHandle } from './run';\n\nexport async function resumeRun(ctx: RuntimeContext, runId: string) {\n const { db } = ctx;\n await resumeRunInDb(db, runId);\n return createRunHandle<void>(ctx, runId);\n}\n","import { Database, Transaction } from '../db/db';\n\ntype InsertMessageOptions = {\n destinationWorkflowId: string;\n messageType: string;\n data: string;\n};\n\nexport async function insertMessage(db: Database | Transaction, options: InsertMessageOptions) {\n return await db\n .insertInto('messages')\n .values({\n destination_run_id: options.destinationWorkflowId,\n type: options.messageType,\n payload: options.data,\n })\n .execute();\n}\n","import { RuntimeContext } from '../core/internal/runtime-context';\nimport { serialize } from '../core/internal/serialization';\nimport { MessageDefinition } from '../core/message';\nimport { Run } from './run';\nimport { insertMessage } from '../core/internal/repository/insert-message';\n\nexport async function sendMessage(\n ctx: RuntimeContext,\n target: Run | string,\n name: MessageDefinition<unknown> | string,\n data?: unknown,\n) {\n const { db } = ctx;\n\n const destinationWorkflowId = typeof target === 'string' ? target : target.id;\n const messageType = typeof name === 'string' ? name : name.name;\n const serializedData = serialize(data);\n\n await insertMessage(db, {\n destinationWorkflowId,\n messageType,\n data: serializedData,\n });\n}\n","import { withDbRetry } from '../core/internal/db/retry';\nimport { RuntimeContext } from '../core/internal/runtime-context';\nimport { StateDefinition } from '../core/state';\nimport { getState as getStateRepository } from '../core/internal/repository/get-state';\nimport { Run } from './run';\nimport { deserialize } from '../core/internal/serialization';\nimport { StateEventBus } from '../core/internal/events/state-event-bus';\n\nclass StateNotAvailableError extends Error {}\n\nexport async function getState<T>(\n ctx: RuntimeContext,\n target: Run | string,\n key: StateDefinition<T> | string,\n) {\n const { db, stateEventBus } = ctx;\n\n const destinationWorkflowId = typeof target === 'string' ? target : target.id;\n const stateKey = typeof key === 'string' ? key : key.name;\n\n while (true) {\n try {\n return await withDbRetry(async () => {\n const state = await getStateRepository(db, destinationWorkflowId, stateKey);\n if (!state) {\n throw new StateNotAvailableError();\n }\n return deserialize(state) as T;\n });\n } catch (error) {\n if (error instanceof StateNotAvailableError) {\n await waitForStateNotification(stateEventBus, destinationWorkflowId, stateKey);\n continue;\n }\n throw error;\n }\n }\n}\n\nasync function waitForStateNotification(stateEventBus: StateEventBus, runId: string, key: string) {\n return new Promise((resolve) => {\n const unsubscribe = stateEventBus.subscribe(runId, key, (state) => {\n unsubscribe();\n resolve(state);\n });\n });\n}\n","import crypto from 'node:crypto';\nimport { QueueEntry } from '../core/queue';\nimport { WorkflowEntry } from '../core/workflow';\nimport { StateEventBus } from '../core/internal/events/state-event-bus';\nimport { MessageEventBus } from '../core/internal/events/message-event-bus';\nimport { runWorkflow, RunWorkflowOptions } from './run-workflow';\nimport { RunRegistry } from '../core/internal/run-registry';\nimport { recoverPendingRuns } from '../core/internal/recover-pending-runs';\nimport { RuntimeContext } from '../core/internal/runtime-context';\nimport { WorkflowRegistry } from '../core/internal/workflow-registry';\nimport { RunEventBus } from '../core/internal/events/run-event-bus';\nimport { createRunHandle, Run } from './run';\nimport { QueueRegistry } from '../core/internal/queue-registry';\nimport { cancelRun } from './cancel-run';\nimport { queueWorkflow, QueueWorkflowOptions } from './queue-workflow';\nimport { QueueManager } from '../core/internal/queue-manager';\nimport { setupPostgresNotify } from '../core/internal/events/setup-postgres-notify';\nimport { createPgDriver } from '../core/internal/db/driver-pg';\nimport { resumeRun } from './resume-run';\nimport { MessageDefinition } from '../core/message';\nimport { sendMessage } from './send-message';\nimport { StateDefinition } from '../core/state';\nimport { getState } from './get-state';\nimport { getRunStatus } from './get-run-status';\nimport { waitForRunResult } from './wait-for-run-result';\n\ntype CreateInstanceOptions = {\n instanceId?: string;\n connectionString: string;\n};\n\nexport type CreateInstanceParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n workflows: Record<string, WorkflowEntry<any, any>>;\n queues?: Record<string, QueueEntry>;\n options: CreateInstanceOptions;\n};\n\nexport function createInstance(props: CreateInstanceParams) {\n const { db, client } = createPgDriver({ connectionString: props.options.connectionString });\n const messageEventBus = new MessageEventBus(db);\n const stateEventBus = new StateEventBus(db);\n const executorId = props.options.instanceId || crypto.randomUUID();\n const runRegistry = new RunRegistry();\n const workflowRegistry = new WorkflowRegistry(props.workflows);\n const runEventBus = new RunEventBus(db);\n const queueRegistry = new QueueRegistry(props.queues || {});\n\n const runtimeContext: RuntimeContext = {\n db,\n executorId,\n messageEventBus,\n stateEventBus,\n runRegistry,\n workflowRegistry,\n runEventBus,\n queueRegistry,\n };\n\n const notifySetupPromise = setupPostgresNotify(client, {\n runs: runEventBus.handleNotify.bind(runEventBus),\n state: stateEventBus.handleNotify.bind(stateEventBus),\n messages: messageEventBus.handleNotify.bind(messageEventBus),\n });\n\n const queueManager = new QueueManager(runtimeContext);\n queueManager.start();\n\n recoverPendingRuns(runtimeContext);\n\n return {\n runWorkflow: async <TArgs extends unknown[], TReturn>(\n wf: WorkflowEntry<TArgs, TReturn> | string,\n args?: TArgs,\n options?: RunWorkflowOptions,\n ) => {\n await notifySetupPromise;\n return runWorkflow<TArgs, TReturn>(runtimeContext, wf, args, options);\n },\n cancelRun: async (runId: string) => cancelRun(runtimeContext, runId),\n resumeRun: async (runId: string) => resumeRun(runtimeContext, runId),\n getRun: async (runId: string) => {\n await notifySetupPromise;\n return createRunHandle(runtimeContext, runId);\n },\n getRunStatus: async (runId: string) => getRunStatus(runtimeContext, runId),\n waitForRunResult: async <TReturn>(runId: string) =>\n waitForRunResult<TReturn>(runtimeContext, runId),\n queueWorkflow: async <TArgs extends unknown[], TReturn>(\n queue: QueueEntry | string,\n wf: WorkflowEntry<TArgs, TReturn> | string,\n args?: TArgs,\n options?: QueueWorkflowOptions,\n ) => {\n await notifySetupPromise;\n return queueWorkflow<TArgs, TReturn>(runtimeContext, queue, wf, args, options);\n },\n sendMessage: async <T>(target: Run | string, name: MessageDefinition<T>, data: T) => {\n await notifySetupPromise;\n return sendMessage(runtimeContext, target, name, data);\n },\n getState: async <T>(target: Run | string, key: StateDefinition<T> | string) => {\n await notifySetupPromise;\n return getState<T>(runtimeContext, target, key);\n },\n };\n}\n\nexport type Instance = ReturnType<typeof createInstance>;\n"]}
1
+ {"version":3,"sources":["../core/internal/events/polling-loop.ts","../core/internal/events/event-bus-core.ts","../core/internal/repository/get-state-batch.ts","../core/internal/events/state-event-bus.ts","../core/internal/repository/get-message-batch.ts","../core/internal/events/message-event-bus.ts","../client/run-workflow.ts","../core/internal/run-registry.ts","../core/internal/repository/get-operations.ts","../core/internal/repository/get-pending-runs.ts","../core/internal/repository/upsert-run.ts","../core/internal/recover-pending-runs.ts","../core/internal/workflow-registry.ts","../core/internal/repository/get-run-batch.ts","../core/internal/events/run-event-bus.ts","../core/internal/queue-registry.ts","../client/cancel-run.ts","../client/queue-workflow.ts","../core/internal/repository/dequeue-run.ts","../core/internal/repository/get-executable-runs.ts","../core/internal/repository/get-queue-partitions.ts","../core/internal/queue-manager.ts","../core/internal/events/setup-postgres-notify.ts","../core/internal/db/driver-pg.ts","../core/internal/repository/resume-run.ts","../client/resume-run.ts","../client/send-message.ts","../client/runtime.ts"],"names":["POLLING_FALLBACK_INTERVAL_MS","sql","cancelRun","run","crypto","runs","resumeRun","getState"],"mappings":"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","file":"index.js","sourcesContent":["export class PollingLoop {\n private readonly intervalMs: number;\n private readonly jitterFactor: number;\n private intervalHandle: NodeJS.Timeout | null = null;\n private readonly callback: () => void;\n private running: boolean = false;\n\n constructor(intervalMs: number, callback: () => void, jitterFactor: number = 0.1) {\n this.intervalMs = intervalMs;\n this.callback = callback;\n this.jitterFactor = Math.max(0, Math.min(1, jitterFactor));\n }\n\n private calculateNextInterval(): number {\n const jitterRange = this.intervalMs * this.jitterFactor;\n const jitter = (Math.random() * 2 - 1) * jitterRange;\n return Math.max(0, this.intervalMs + jitter);\n }\n\n private scheduleNext() {\n if (!this.running) {\n return;\n }\n\n const nextInterval = this.calculateNextInterval();\n this.intervalHandle = setTimeout(() => {\n try {\n this.callback();\n } catch (error) {\n // Log error but continue polling\n console.error('PollingLoop callback error:', error);\n }\n this.scheduleNext();\n }, nextInterval);\n }\n\n start() {\n if (this.running) {\n return;\n }\n this.running = true;\n this.scheduleNext();\n }\n\n stop() {\n this.running = false;\n if (this.intervalHandle) {\n clearTimeout(this.intervalHandle);\n this.intervalHandle = null;\n }\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import { PollingLoop } from './polling-loop';\n\nexport type SubscriptionCallback<T> = (data: T) => void;\n\nexport type Wildcard = '*';\n\ntype EventBusCoreConfig = {\n allowWildcardSubscriptions: boolean;\n};\n\nexport interface EventBus {\n handleNotify: (payload: string) => void;\n subscribe: CallableFunction;\n emitEvent: CallableFunction;\n destroy: () => void;\n}\n\nexport class EventBusCore<TEvent> {\n private readonly subscribers: Map<string, Set<SubscriptionCallback<TEvent>>> = new Map();\n private readonly eventSequence = new Map<string, number>();\n private readonly pollingLoop: PollingLoop;\n private readonly allowWildcardSubscriptions: boolean;\n\n constructor(\n private readonly config: EventBusCoreConfig,\n pollingLoop: PollingLoop,\n ) {\n this.allowWildcardSubscriptions = config.allowWildcardSubscriptions;\n this.pollingLoop = pollingLoop;\n }\n\n subscribe(subject: string, key: string | '*', callback: SubscriptionCallback<TEvent>) {\n const subscriptionKey = createSubscriptionKey(subject, key);\n if (!this.subscribers.has(subscriptionKey)) {\n this.subscribers.set(subscriptionKey, new Set());\n }\n this.subscribers.get(subscriptionKey)!.add(callback);\n this.pollingLoop.start();\n\n return () => this.unsubscribe(subscriptionKey, callback);\n }\n\n private unsubscribe(subscriptionKey: string, callback: SubscriptionCallback<TEvent>) {\n const subscriptionCallbacks = this.subscribers.get(subscriptionKey);\n if (subscriptionCallbacks) {\n subscriptionCallbacks.delete(callback);\n if (subscriptionCallbacks.size === 0) {\n this.subscribers.delete(subscriptionKey);\n this.eventSequence.delete(subscriptionKey);\n }\n }\n if (this.subscribers.size === 0) {\n this.pollingLoop.stop();\n }\n }\n\n emitEvent(subject: string, key: string, event: TEvent, eventChangeId: number) {\n const subscriptionKeys = [createSubscriptionKey(subject, key)].concat(\n this.allowWildcardSubscriptions ? [createSubscriptionKey(subject, '*')] : [],\n );\n for (const subscriptionKey of subscriptionKeys) {\n const subscribers = this.subscribers.get(subscriptionKey);\n if (subscribers) {\n for (const subscriptionCallback of subscribers) {\n subscriptionCallback(event);\n }\n }\n }\n this.eventSequence.set(subscriptionKeys[0], eventChangeId);\n }\n\n checkHasSubscribers(subject: string, key: string) {\n const subscriptionKeys = [createSubscriptionKey(subject, key)].concat(\n this.allowWildcardSubscriptions ? [createSubscriptionKey(subject, '*')] : [],\n );\n return subscriptionKeys.some((subscriptionKey) => this.subscribers.has(subscriptionKey));\n }\n\n getEventSequence(subject: string, key: string) {\n return this.eventSequence.get(createSubscriptionKey(subject, key)) ?? 0;\n }\n\n getSubscriptionKeys() {\n return Array.from(this.subscribers.keys()).map(splitSubscriptionKey);\n }\n}\n\nfunction createSubscriptionKey(subject: string, key: string) {\n return `${subject}::${key}`;\n}\n\nfunction splitSubscriptionKey(subscriptionKey: string) {\n return subscriptionKey.split('::');\n}\n","import { Database } from '../db/db';\nimport { StateRetrievalRequest } from '../events/state-event-bus';\n\nexport async function getStateBatch(db: Database, stateRetrievalRequests: StateRetrievalRequest) {\n const results = await db\n .selectFrom('state')\n .select(['key', 'value', 'change_id', 'run_id', 'change_id'])\n .where(\n 'run_id',\n 'in',\n stateRetrievalRequests.map((r) => r.runId),\n )\n .where(\n 'key',\n 'in',\n stateRetrievalRequests.map((r) => r.key),\n )\n .execute();\n return results.map((r) => ({\n runId: r.run_id,\n key: r.key,\n value: r.value,\n changeId: r.change_id,\n }));\n}\n","import { PollingLoop } from './polling-loop';\nimport { EventBus, EventBusCore } from './event-bus-core';\nimport { getState } from '../repository/get-state';\nimport { Database } from '../db/db';\nimport { getStateBatch } from '../repository/get-state-batch';\n\ntype SubscriptionCallback<T> = (data: T) => void;\n\nconst POLLING_FALLBACK_INTERVAL_MS = 10_000;\n\ntype StateEvent = unknown;\n\nexport class StateEventBus implements EventBus {\n private readonly bus: EventBusCore<StateEvent>;\n private readonly pollingLoop: PollingLoop;\n\n constructor(private readonly db: Database) {\n this.pollingLoop = new PollingLoop(POLLING_FALLBACK_INTERVAL_MS, this.handlePoll.bind(this));\n this.bus = new EventBusCore({ allowWildcardSubscriptions: false }, this.pollingLoop);\n this.pollingLoop.start();\n }\n\n handleNotify(payload: string) {\n const [workflowId, key, changeIdString] = payload.split('::');\n const changeId = Number(changeIdString);\n if (\n !this.bus.checkHasSubscribers(workflowId, key) ||\n this.bus.getEventSequence(workflowId, key) >= changeId\n ) {\n return;\n }\n getState(this.db, workflowId, key).then((state) => {\n if (!state) {\n return;\n }\n this.bus.emitEvent(workflowId, key, state, changeId);\n });\n }\n\n private async handlePoll() {\n const stateRetrievalRequests = getStateRetrievalRequests(this.bus.getSubscriptionKeys());\n if (stateRetrievalRequests.length === 0) {\n return;\n }\n const states = await getStateBatch(this.db, stateRetrievalRequests);\n for (const state of states) {\n if (this.bus.getEventSequence(state.runId, state.key) >= state.changeId) {\n continue;\n }\n this.bus.emitEvent(state.runId, state.key, state.value, state.changeId);\n }\n }\n\n subscribe<T>(workflowId: string, key: string, callback: SubscriptionCallback<T>) {\n return this.bus.subscribe(workflowId, key, callback as SubscriptionCallback<unknown>);\n }\n\n emitEvent<T>(workflowId: string, key: string, data: T, changeId: number) {\n this.bus.emitEvent(workflowId, key, data, changeId);\n }\n\n destroy() {\n this.pollingLoop.stop();\n }\n}\n\nfunction getStateRetrievalRequests(keys: string[][]) {\n return keys.map((k) => {\n const [runId, key] = k;\n return {\n runId,\n key,\n };\n });\n}\n\nexport type StateRetrievalRequest = ReturnType<typeof getStateRetrievalRequests>;\n","import { sql } from 'kysely';\nimport { Database } from '../db/db';\nimport { MessageRetrievalRequest } from '../events/message-event-bus';\n\nexport async function getMessageBatch(\n db: Database,\n messageRetrievalRequests: MessageRetrievalRequest,\n) {\n const uniquePairs = Array.from(\n new Map(\n messageRetrievalRequests.map((r) => [`${r.destinationWorkflowId}:${r.messageType}`, r]),\n ).values(),\n );\n\n const results = await db\n .selectFrom('messages')\n .select(['id', 'payload', 'type', 'destination_run_id'])\n .where(\n sql<boolean>`(destination_run_id, type) IN (${sql.join(\n uniquePairs.map((r) => sql`(${r.destinationWorkflowId}, ${r.messageType})`),\n )})`,\n )\n .execute();\n\n return results.map((r) => ({\n id: r.id,\n payload: r.payload,\n type: r.type,\n destinationRunId: r.destination_run_id,\n }));\n}\n","import { EventBus, EventBusCore } from './event-bus-core';\nimport { PollingLoop } from './polling-loop';\nimport { Database } from '../db/db';\nimport { getMessageBatch } from '../repository/get-message-batch';\n\ntype MessageEvent = undefined;\n\ntype MessageCallback = (event: MessageEvent) => void;\n\nconst POLLING_FALLBACK_INTERVAL_MS = 10_000;\n\nexport class MessageEventBus implements Omit<EventBus, 'emitEvent'> {\n private readonly bus: EventBusCore<MessageEvent>;\n private readonly pollingLoop: PollingLoop;\n\n constructor(private readonly db: Database) {\n this.pollingLoop = new PollingLoop(POLLING_FALLBACK_INTERVAL_MS, this.handlePoll.bind(this));\n this.bus = new EventBusCore({ allowWildcardSubscriptions: true }, this.pollingLoop);\n this.pollingLoop.start();\n }\n\n handleNotify(payload: string) {\n const [destinationWorkflowId, messageType, messageCount] = payload.split('::');\n if (!this.bus.checkHasSubscribers(destinationWorkflowId, messageType)) {\n return;\n }\n this.bus.emitEvent(destinationWorkflowId, messageType, undefined, Number(messageCount));\n }\n\n private async handlePoll() {\n const messageRetrievalRequests = getMessageRetrievalRequests(this.bus.getSubscriptionKeys());\n if (messageRetrievalRequests.length === 0) {\n return;\n }\n const messages = await getMessageBatch(this.db, messageRetrievalRequests);\n for (const message of messages) {\n this.bus.emitEvent(message.destinationRunId, message.type, undefined, 1);\n }\n }\n\n subscribe(destinationWorkflowId: string, type: string, cb: MessageCallback) {\n return this.bus.subscribe(destinationWorkflowId, type, cb);\n }\n\n destroy() {\n this.pollingLoop.stop();\n }\n}\n\nfunction getMessageRetrievalRequests(subscriptionKeys: string[][]) {\n return subscriptionKeys.map(([destinationWorkflowId, messageType]) => ({\n destinationWorkflowId,\n messageType,\n }));\n}\n\nexport type MessageRetrievalRequest = ReturnType<typeof getMessageRetrievalRequests>;\n","import crypto from 'node:crypto';\nimport { serialize } from '../core/internal/serialization';\nimport { WorkflowEntry, WorkflowFunction } from '../core/workflow';\nimport { executeWorkflow } from '../core/internal/execute-workflow';\nimport { RuntimeContext } from '../core/internal/runtime-context';\nimport { WorkflowNotFoundError } from './errors';\nimport { createRunHandle } from './run';\nimport { insertPendingRun } from '../core/internal/repository/insert-pending-run';\n\nexport type RunWorkflowOptions = {\n timeout?: number;\n deadline?: number;\n id?: string;\n};\n\nexport async function runWorkflow<TArgs extends unknown[], TReturn>(\n ctx: RuntimeContext,\n wf: WorkflowEntry<TArgs, TReturn> | string,\n args: TArgs = [] as unknown as TArgs,\n options: RunWorkflowOptions = {},\n) {\n const { db, executorId, workflowRegistry } = ctx;\n\n const workflow =\n typeof wf === 'string'\n ? workflowRegistry.getByName(wf)\n : workflowRegistry.getByWorkflowDefinition(wf);\n if (!workflow) {\n throw new WorkflowNotFoundError('Workflow not found');\n }\n\n const runId = options.id ?? crypto.randomUUID();\n\n const { path } = await insertPendingRun(db, {\n runId,\n path: [runId],\n inputs: serialize(args),\n executorId: executorId,\n workflowName: workflow.name,\n });\n\n await executeWorkflow<TArgs, TReturn>(ctx, {\n runId: runId,\n runPath: path,\n workflowName: workflow.name,\n fn: workflow.fn as WorkflowFunction<TArgs, TReturn>,\n args,\n options,\n });\n\n return createRunHandle<TReturn>(ctx, runId);\n}\n","import { ExecutionContext } from './execution-context';\n\nexport interface RunEntry<TReturn = unknown> {\n store: ExecutionContext;\n promise: Promise<TReturn>;\n abortController: AbortController;\n getPromiseState(): 'pending' | 'fulfilled' | 'rejected';\n}\n\nexport class RunRegistry {\n private readonly runs: Map<string, RunEntry> = new Map();\n\n registerRun(runId: string, entry: Omit<RunEntry, 'getPromiseState'>) {\n let state: 'pending' | 'fulfilled' | 'rejected' = 'pending';\n\n entry.promise.then(\n () => {\n state = 'fulfilled';\n },\n () => {\n state = 'rejected';\n },\n );\n\n this.runs.set(runId, {\n ...entry,\n getPromiseState: () => state,\n });\n }\n\n unregisterRun(runId: string) {\n this.runs.delete(runId);\n }\n\n getRun(runId: string) {\n return this.runs.get(runId);\n }\n}\n","import { Database } from '../db/db';\nimport { OperationResult } from '../operation-manager';\n\nexport async function getOperations(db: Database, runId: string): Promise<OperationResult[]> {\n const results = await db\n .selectFrom('operations')\n .select(['output', 'error'])\n .where('run_id', '=', runId)\n .orderBy('sequence_id', 'desc')\n .execute();\n return results.map((r) => ({\n result: r.output ?? undefined,\n error: r.error ?? undefined,\n }));\n}\n","import { Database } from '../db/db';\n\nexport async function getPendingRuns(db: Database, executorId: string) {\n const pendingRuns = await db\n .selectFrom('runs')\n .select(['id', 'path', 'inputs', 'workflow_name'])\n .where('status', '=', 'pending')\n .where('executor_id', '=', executorId)\n .execute();\n\n return pendingRuns.map((run) => ({\n id: run.id,\n path: run.path,\n inputs: run.inputs,\n workflowName: run.workflow_name,\n }));\n}\n","import { sql } from 'kysely';\nimport { RunStatus } from '../../workflow';\nimport { Database, Transaction } from '../db/db';\nimport { MaxRecoveryAttemptsExceededError } from '../../../client/errors';\n\nconst DEFAULT_MAX_RETRIES = 10;\n\nexport type UpsertRunOptions = {\n runId: string;\n path: string[];\n inputs: string;\n executorId: string;\n workflowName: string;\n parentRunId?: string;\n status: RunStatus;\n idempotencyKey?: string;\n timeout?: number;\n deadline?: number;\n isRecovery?: boolean;\n maxRetries?: number;\n queueName?: string;\n};\n\nexport type UpsertRunResult = {\n runId: string;\n path: string[];\n changeId: number;\n executorId?: string;\n recoveryAttempts: number;\n idempotencyKey?: string;\n status: RunStatus;\n shouldExecute: boolean;\n};\n\nexport async function upsertRun(\n db: Database | Transaction,\n options: UpsertRunOptions,\n): Promise<UpsertRunResult> {\n const incrementAttempts = options.isRecovery ? 1 : 0;\n const initialRecoveryAttempts = options.status === 'queued' ? 0 : 1;\n\n const result = await db\n .insertInto('runs')\n .values({\n id: options.runId,\n path: options.path,\n workflow_name: options.workflowName,\n status: options.status,\n inputs: options.inputs,\n idempotency_key: options.idempotencyKey,\n executor_id: options.executorId,\n parent_run_id: options.parentRunId,\n timeout_ms: options.timeout,\n deadline_epoch_ms: options.deadline,\n recovery_attempts: initialRecoveryAttempts,\n queue_name: options.queueName,\n created_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .onConflict((oc) =>\n oc.column('id').doUpdateSet({\n recovery_attempts: sql`CASE \n WHEN runs.status != 'QUEUED' \n THEN runs.recovery_attempts + ${incrementAttempts}\n ELSE runs.recovery_attempts\n END`,\n\n // Update executor_id when NEW status is not ENQUEUED\n // This allows dequeue operations to claim the workflow\n executor_id: sql`CASE \n WHEN EXCLUDED.status != 'QUEUED' \n THEN EXCLUDED.executor_id\n ELSE runs.executor_id\n END`,\n\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n }),\n )\n .returning([\n 'id',\n 'change_id',\n 'recovery_attempts',\n 'executor_id',\n 'idempotency_key',\n 'status',\n 'path',\n ])\n .executeTakeFirst();\n\n if (!result) {\n throw new Error('Unexpectedly failed to upsert run');\n }\n\n // check if idempotency key matches\n const isOwner = result.idempotency_key === options.idempotencyKey;\n const shouldExecute = isOwner || options.isRecovery;\n\n // Check max recovery attempts if authorized to execute\n if (shouldExecute) {\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n if ((result.recovery_attempts as unknown as number) > maxRetries + 1) {\n // Mark as exceeded\n await db\n .updateTable('runs')\n .set({\n status: 'MAX_RECOVERY_ATTEMPTS_EXCEEDED',\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .where('id', '=', result.id)\n .where('status', '=', 'PENDING')\n .execute();\n\n throw new MaxRecoveryAttemptsExceededError(result.id, maxRetries);\n }\n }\n\n return {\n runId: result.id,\n path: options.path,\n changeId: result.change_id,\n recoveryAttempts: result.recovery_attempts as unknown as number,\n executorId: result.executor_id ?? undefined,\n idempotencyKey: result.idempotency_key ?? undefined,\n status: result.status as RunStatus,\n shouldExecute: shouldExecute ?? false,\n };\n}\n","import { executeWorkflow } from './execute-workflow';\nimport { getOperations } from './repository/get-operations';\nimport { getPendingRuns } from './repository/get-pending-runs';\nimport { upsertRun } from './repository/upsert-run';\nimport { RuntimeContext } from './runtime-context';\nimport { deserialize } from './serialization';\n\nexport async function recoverPendingRuns(ctx: RuntimeContext) {\n const { db, executorId, workflowRegistry } = ctx;\n const pendingRuns = await getPendingRuns(db, executorId);\n for (const run of pendingRuns) {\n try {\n const operations = await getOperations(db, run.id);\n const workflow = workflowRegistry.getByName(run.workflowName);\n if (!workflow) {\n console.error(`Workflow ${run.workflowName} not found for recovery`);\n continue;\n }\n const args = run.inputs ? deserialize<unknown[]>(run.inputs) : [];\n const upsertResult = await upsertRun(db, {\n runId: run.id,\n path: run.path,\n inputs: run.inputs ?? '',\n executorId: executorId,\n workflowName: run.workflowName,\n status: 'pending',\n isRecovery: true,\n });\n if (!upsertResult.shouldExecute) {\n console.log(`Run ${run.id} already executed, skipping recovery`);\n continue;\n }\n await executeWorkflow(ctx, {\n runId: upsertResult.runId,\n runPath: upsertResult.path,\n workflowName: run.workflowName,\n fn: workflow.fn,\n args: args,\n operations,\n });\n } catch (error) {\n console.error(`Error recovering run ${run.id}:`, error);\n }\n }\n}\n","import { WorkflowDefinition, WorkflowEntry } from '../workflow';\n\nexport class WorkflowRegistry {\n private readonly workflows: Record<string, WorkflowEntry> = {};\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n private readonly fnToName: Map<Function, string> = new Map();\n\n constructor(workflows: Record<string, WorkflowEntry>) {\n this.workflows = workflows;\n for (const [name, entry] of Object.entries(workflows)) {\n this.fnToName.set(entry, name);\n }\n }\n\n getByName(name: string): (WorkflowDefinition & { name: string }) | undefined {\n const entry = this.workflows[name];\n if (!entry) {\n return undefined;\n }\n return {\n ...entry(),\n name,\n };\n }\n\n getByWorkflowDefinition<TArgs extends unknown[], TReturn>(\n definition: WorkflowEntry<TArgs, TReturn>,\n ): (WorkflowDefinition<TArgs, TReturn> & { name: string }) | undefined {\n const name = this.fnToName.get(definition);\n if (!name) {\n return undefined;\n }\n return {\n ...definition(),\n name,\n };\n }\n}\n","import { RunStatus } from '../../workflow';\nimport { Database } from '../db/db';\n\nexport async function getRunBatch(db: Database, runIds: string[]) {\n const results = await db\n .selectFrom('runs')\n .select(['id', 'inputs', 'output', 'error', 'status', 'change_id', 'queue_name'])\n .where('id', 'in', runIds)\n .execute();\n return results.map((r) => ({\n id: r.id,\n input: r.inputs ?? undefined,\n output: r.output ?? undefined,\n error: r.error ?? undefined,\n status: r.status as RunStatus,\n changeId: r.change_id,\n queueName: r.queue_name ?? undefined,\n }));\n}\n","import { RunStatus } from '../../workflow';\nimport { EventBus, EventBusCore } from './event-bus-core';\nimport { PollingLoop } from './polling-loop';\nimport { getRun } from '../repository/get-run';\nimport { getRunBatch } from '../repository/get-run-batch';\nimport { Database } from '../db/db';\n\ninterface RunEvent {\n status: RunStatus;\n queueName?: string;\n result?: unknown;\n error?: string;\n}\n\ntype RunEventCallback = (e: RunEvent) => void;\n\nconst POLLING_FALLBACK_INTERVAL_MS = 100; // Changed from 10_000 for testing\n\nexport class RunEventBus implements Omit<EventBus, 'emitEvent'> {\n private readonly bus: EventBusCore<RunEvent>;\n private readonly pollingLoop: PollingLoop;\n\n constructor(private readonly db: Database) {\n this.pollingLoop = new PollingLoop(POLLING_FALLBACK_INTERVAL_MS, this.handlePoll.bind(this));\n this.bus = new EventBusCore({ allowWildcardSubscriptions: true }, this.pollingLoop);\n this.pollingLoop.start();\n }\n\n handleNotify(payload: string) {\n const [runId, status, changeIdString] = payload.split('::');\n const changeId = Number(changeIdString);\n if (\n !this.bus.checkHasSubscribers(runId, status) ||\n this.bus.getEventSequence(runId, status) >= changeId\n ) {\n return;\n }\n getRun(this.db, runId).then((run) => {\n if (!run) {\n return;\n }\n this.bus.emitEvent(\n runId,\n status,\n {\n status: run.status,\n queueName: run.queueName,\n result: run.output,\n error: run.error,\n },\n changeId,\n );\n });\n }\n\n private async handlePoll() {\n const workflowIds = [\n ...new Set(this.bus.getSubscriptionKeys().map(([workflowId]) => workflowId)),\n ];\n if (workflowIds.length === 0) {\n return;\n }\n const runs = await getRunBatch(this.db, workflowIds);\n for (const run of runs) {\n this.bus.emitEvent(\n run.id,\n run.status,\n {\n status: run.status,\n queueName: run.queueName,\n result: run.output,\n error: run.error,\n },\n run.changeId,\n );\n }\n }\n\n subscribe(runId: string, status: RunStatus | '*', cb: RunEventCallback) {\n return this.bus.subscribe(runId, status, cb);\n }\n\n destroy() {\n this.pollingLoop.stop();\n }\n}\n","import { QueueDefinition, QueueEntry } from '../queue';\nimport { QueueInstance } from './queue-manager';\n\nexport class QueueRegistry {\n private readonly queues: Record<string, QueueEntry> = {};\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n private readonly fnToName: Map<Function, string> = new Map();\n\n constructor(queues: Record<string, QueueEntry>) {\n this.queues = queues;\n for (const [name, entry] of Object.entries(queues)) {\n this.fnToName.set(entry, name);\n }\n }\n\n getByName(name: string): QueueDefinition | undefined {\n const entry = this.queues[name];\n if (!entry) {\n return undefined;\n }\n return {\n name,\n ...entry(),\n };\n }\n\n getByQueueEntry(entry: QueueEntry) {\n const name = this.fnToName.get(entry);\n if (!name) {\n return undefined;\n }\n return {\n ...entry(),\n name,\n };\n }\n\n getQueueInstances(): Record<string, QueueInstance> {\n return Object.entries(this.queues).reduce(\n (acc, [name, entry]) => {\n const options = entry();\n acc[name] = {\n rateLimit: options.rateLimit ?? undefined,\n workerConcurrency: options.workerConcurrency ?? undefined,\n concurrency: options.concurrency ?? undefined,\n priorityEnabled: options.priorityEnabled ?? undefined,\n };\n return acc;\n },\n {} as Record<string, QueueInstance>,\n );\n }\n}\n","import { RunNotFoundError } from '../core/internal/errors';\nimport { cancelRun as cancelRunInDb } from '../core/internal/repository/cancel-run';\nimport { RuntimeContext } from '../core/internal/runtime-context';\n\nexport async function cancelRun(ctx: RuntimeContext, runId: string) {\n const { db, runRegistry } = ctx;\n const run = await cancelRunInDb(runId, db);\n if (!run) {\n throw new RunNotFoundError(runId);\n }\n for (const pathPart of run.path) {\n const run = runRegistry.getRun(pathPart);\n if (run) {\n run.abortController.abort();\n }\n }\n}\n","import { QueueNotFoundError, WorkflowNotFoundError } from './errors';\nimport { RuntimeContext } from '../core/internal/runtime-context';\nimport { serialize } from '../core/internal/serialization';\nimport { QueueEntry } from '../core/queue';\nimport { WorkflowEntry } from '../core/workflow';\nimport crypto from 'node:crypto';\nimport { createRunHandle } from './run';\nimport { enqueueRun } from '../core/internal/repository/enqueue-run';\n\nexport type QueueWorkflowOptions = {\n timeout?: number;\n deadline?: number;\n priority?: number;\n partitionKey?: string;\n id?: string;\n deduplicationId?: string;\n};\n\nexport async function queueWorkflow<TArgs extends unknown[], TReturn>(\n ctx: RuntimeContext,\n queue: QueueEntry | string,\n wf: WorkflowEntry<TArgs, TReturn> | string,\n args?: TArgs,\n options?: QueueWorkflowOptions,\n) {\n const { db, executorId, workflowRegistry, queueRegistry } = ctx;\n\n const runId = options?.id ?? crypto.randomUUID();\n\n const workflowName =\n typeof wf === 'string' ? wf : workflowRegistry.getByWorkflowDefinition(wf)?.name;\n if (!workflowName) {\n throw new WorkflowNotFoundError('Workflow name not specified');\n }\n\n const queueName = typeof queue === 'string' ? queue : queueRegistry.getByQueueEntry(queue)?.name;\n if (!queueName) {\n throw new QueueNotFoundError('Queue name not specified');\n }\n\n await enqueueRun(db, {\n runId,\n path: [runId],\n inputs: serialize(args),\n executorId,\n workflowName,\n timeout: options?.timeout,\n deadline: options?.deadline,\n queueName,\n });\n\n return createRunHandle<TReturn>(ctx, runId);\n}\n","import { sql } from 'kysely';\nimport { Transaction } from '../db/db';\nimport { RunNotFoundError } from '../errors';\n\nexport type DequeuedRun = {\n runId: string;\n changeId: number;\n path: string[];\n timeoutMs?: number;\n deadlineEpochMs?: number;\n inputs?: string;\n workflowName: string;\n};\n\nexport async function dequeueRun(\n tx: Transaction,\n runId: string,\n executorId: string,\n): Promise<DequeuedRun> {\n const result = await tx\n .updateTable('runs')\n .set({\n status: 'pending',\n started_at_epoch_ms: sql`(extract(epoch from now()) * 1000)::bigint`,\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n executor_id: executorId,\n })\n .where('id', '=', runId)\n .where('status', '=', 'queued')\n .returning([\n 'id',\n 'change_id',\n 'path',\n 'timeout_ms',\n 'deadline_epoch_ms',\n 'inputs',\n 'workflow_name',\n ])\n .executeTakeFirst();\n\n if (!result) {\n throw new RunNotFoundError(runId);\n }\n\n return {\n runId: result.id,\n changeId: result.change_id,\n path: result.path,\n timeoutMs: result.timeout_ms ? Number(result.timeout_ms) : undefined,\n deadlineEpochMs: result.deadline_epoch_ms ? Number(result.deadline_epoch_ms) : undefined,\n inputs: result.inputs ?? undefined,\n workflowName: result.workflow_name,\n };\n}\n","import { sql } from 'kysely';\nimport { QueueRateLimit } from '../../queue';\nimport { Database } from '../db/db';\nimport { withDbRetry } from '../db/retry';\nimport { DequeuedRun, dequeueRun } from './dequeue-run';\n\ntype GetExecutableRunsParams = {\n queueName: string;\n executorId: string;\n workerConcurrency?: number;\n globalConcurrency?: number;\n rateLimit?: QueueRateLimit;\n partitionKey?: string;\n priorityEnabled?: boolean;\n};\n\nexport async function getExecutableRuns(\n db: Database,\n {\n queueName,\n executorId,\n workerConcurrency,\n globalConcurrency,\n rateLimit,\n partitionKey,\n priorityEnabled,\n }: GetExecutableRunsParams,\n): Promise<DequeuedRun[]> {\n const startTimeMs = Date.now();\n const limiterPeriodMs = rateLimit ? rateLimit.period * 1000 : 0;\n\n return await withDbRetry(async () =>\n db.transaction().execute(async (tx) => {\n // rate limit check\n if (rateLimit) {\n const result = await tx\n .selectFrom('runs')\n .select(({ fn }) => [fn.count<number>('id').as('count')])\n .where('queue_name', '=', queueName)\n .where('status', '!=', 'queued')\n .where('started_at_epoch_ms', '>', (startTimeMs - limiterPeriodMs).toString())\n .$if(partitionKey !== undefined, (qb) =>\n qb.where('queue_partition_key', '=', partitionKey!),\n )\n .executeTakeFirstOrThrow();\n\n if (result.count >= rateLimit.limitPerPeriod) {\n return [];\n }\n }\n\n // Calculate concurrency\n let maxTasks = Infinity;\n\n if (globalConcurrency || workerConcurrency) {\n const runningTasks = await tx\n .selectFrom('runs')\n .select(['executor_id', ({ fn }) => fn.count<number>('id').as('task_count')])\n .where('queue_name', '=', queueName)\n .where('status', '=', 'pending')\n .$if(partitionKey !== undefined, (qb) =>\n qb.where('queue_partition_key', '=', partitionKey!),\n )\n .groupBy('executor_id')\n .execute();\n\n const tasksByExecutor = Object.fromEntries(\n runningTasks.map((row) => [row.executor_id!, row.task_count]),\n );\n\n const runningForThisWorker = tasksByExecutor[executorId] ?? 0;\n\n if (workerConcurrency !== undefined) {\n maxTasks = Math.max(0, workerConcurrency - runningForThisWorker);\n }\n\n if (globalConcurrency !== undefined) {\n const totalRunning = Object.values(tasksByExecutor).reduce((a, b) => a + b, 0);\n const availableGlobal = Math.max(0, globalConcurrency - totalRunning);\n maxTasks = Math.min(maxTasks, availableGlobal);\n }\n\n if (maxTasks <= 0) {\n return [];\n }\n }\n\n const lockClause = globalConcurrency ? 'FOR UPDATE NOWAIT' : 'FOR UPDATE SKIP LOCKED';\n\n const workflowIds = await sql<{ id: string }>`\n SELECT id \n FROM runs\n WHERE status = ${'queued'}\n AND queue_name = ${queueName}\n ${partitionKey !== undefined ? sql`AND queue_partition_key = ${partitionKey}` : sql``}\n ${priorityEnabled ? sql`ORDER BY priority ASC, created_at ASC` : sql`ORDER BY created_at ASC`}\n ${maxTasks !== Infinity ? sql`LIMIT ${maxTasks}` : sql``}\n ${sql.raw(lockClause)}\n `.execute(tx);\n\n const claimedRuns: DequeuedRun[] = [];\n\n for (const { id } of workflowIds.rows) {\n const dequeuedRun = await dequeueRun(tx, id, executorId);\n claimedRuns.push(dequeuedRun);\n }\n\n return claimedRuns;\n }),\n );\n}\n","import { Database } from '../db/db';\n\nexport async function getQueuePartitions(db: Database, queueName: string): Promise<string[]> {\n const result = await db\n .selectFrom('runs')\n .select('queue_partition_key')\n .distinct()\n .where('queue_name', '=', queueName)\n .where('status', '=', 'queued')\n .where('queue_partition_key', 'is not', null)\n .execute();\n return result.map((row) => row.queue_partition_key!);\n}\n","import { PollingLoop } from './events/polling-loop';\nimport { getExecutableRuns } from './repository/get-executable-runs';\nimport { QueueRateLimit } from '../queue';\nimport { deserialize } from './serialization';\nimport { executeWorkflow } from './execute-workflow';\nimport { RuntimeContext } from './runtime-context';\nimport { getQueuePartitions } from './repository/get-queue-partitions';\n\nexport interface QueueInstance {\n rateLimit?: QueueRateLimit;\n workerConcurrency?: number;\n concurrency?: number;\n priorityEnabled?: boolean;\n partitioningEnabled?: boolean;\n}\n\nconst POLLING_INTERVAL_MS = 1000;\n\nexport class QueueManager {\n private readonly pollingLoop: PollingLoop;\n private readonly queues: Record<string, QueueInstance> = {};\n\n constructor(private readonly ctx: RuntimeContext) {\n this.pollingLoop = new PollingLoop(POLLING_INTERVAL_MS, this.handlePoll.bind(this));\n this.queues = this.ctx.queueRegistry.getQueueInstances();\n }\n\n private async handlePoll() {\n for (const [queueName, queue] of Object.entries(this.queues)) {\n await this.dispatch(queueName, queue);\n }\n }\n\n private async dispatch(queueName: string, queue: QueueInstance) {\n const { db, executorId } = this.ctx;\n\n let partitions: string[] = [];\n\n if (queue.partitioningEnabled) {\n partitions = await getQueuePartitions(db, queueName);\n\n for (const partition of partitions) {\n const runs = await getExecutableRuns(db, {\n queueName,\n executorId,\n workerConcurrency: queue.workerConcurrency,\n globalConcurrency: queue.concurrency,\n rateLimit: queue.rateLimit,\n partitionKey: partition,\n priorityEnabled: queue.priorityEnabled,\n });\n for (const run of runs) {\n const workflow = this.ctx.workflowRegistry.getByName(run.workflowName);\n if (!workflow) {\n console.error(`Workflow ${run.workflowName} not found`);\n continue;\n }\n await executeWorkflow(this.ctx, {\n runId: run.runId,\n runPath: run.path,\n workflowName: run.workflowName,\n fn: workflow.fn,\n args: deserialize<unknown[]>(run.inputs ?? '[]'),\n });\n }\n }\n return;\n }\n\n const runs = await getExecutableRuns(db, {\n queueName,\n executorId,\n workerConcurrency: queue.workerConcurrency,\n globalConcurrency: queue.concurrency,\n rateLimit: queue.rateLimit,\n priorityEnabled: queue.priorityEnabled,\n });\n for (const run of runs) {\n const workflow = this.ctx.workflowRegistry.getByName(run.workflowName);\n if (!workflow) {\n console.error(`Workflow ${run.workflowName} not found`);\n continue;\n }\n await executeWorkflow(this.ctx, {\n runId: run.runId,\n runPath: run.path,\n workflowName: run.workflowName,\n fn: workflow.fn,\n args: deserialize<unknown[]>(run.inputs ?? '[]'),\n });\n }\n }\n\n start() {\n this.pollingLoop.start();\n }\n\n destroy() {\n this.pollingLoop.stop();\n }\n}\n","import { Client } from '../db/driver-pg';\nimport { withDbRetry } from '../db/retry';\n\ntype SubscriptionCallback<T> = (data: T) => void;\n\nconst CHANNELS = ['runs', 'messages', 'state'];\n\ntype Channel = (typeof CHANNELS)[number];\n\ntype Subscriptions = {\n [K in Channel]: SubscriptionCallback<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n};\n\nexport async function setupPostgresNotify(client: Client, subscriptions: Subscriptions) {\n await withDbRetry(async () => {\n try {\n await client.query(`BEGIN`);\n for (const channel of CHANNELS) {\n await client.query(`LISTEN \"helical_${channel}\"`);\n }\n await client.query(`COMMIT`);\n } catch (error) {\n await client.query(`ROLLBACK`);\n throw error;\n }\n\n for (const [channel, callback] of Object.entries(subscriptions)) {\n await client.listen(`helical_${channel}`, callback);\n }\n });\n}\n","import { Kysely, PostgresDialect } from 'kysely';\nimport { Pool, PoolClient } from 'pg';\nimport { DB } from './types';\nimport { Database } from './db';\n\nexport interface Client {\n listen(channel: string, callback: (payload: string | undefined) => void): Promise<void>;\n query(query: string): Promise<void>;\n}\n\nexport interface DbDriver {\n client: Client;\n db: Database;\n}\n\nexport function createPgDriver({ connectionString }: { connectionString: string }): DbDriver {\n const pool = new Pool({\n connectionString: connectionString,\n max: 10,\n });\n let clientPromise: Promise<PoolClient> | undefined;\n const getClient = async () => {\n if (!clientPromise) {\n clientPromise = pool.connect();\n }\n return await clientPromise;\n };\n return {\n client: {\n listen: async (channel: string, callback: (payload: string | undefined) => void) => {\n const client = await getClient();\n client.on('notification', (msg) => {\n if (msg.channel !== channel) return;\n callback(msg.payload);\n });\n },\n query: async (query: string) => {\n const client = await getClient();\n await client.query(query);\n },\n },\n db: new Kysely<DB>({ dialect: new PostgresDialect({ pool }) }),\n };\n}\n","import { sql } from 'kysely';\nimport { Database, Transaction } from '../db/db';\nimport { RunNotFoundError } from '../errors';\n\nconst INTERNAL_QUEUE_NAME = '_helical_internal_queue';\n\nexport async function resumeRun(db: Database | Transaction, runId: string) {\n const result = await db\n .updateTable('runs')\n .set({\n status: 'queued',\n queue_name: INTERNAL_QUEUE_NAME,\n deadline_epoch_ms: null,\n timeout_ms: null,\n recovery_attempts: 0,\n started_at_epoch_ms: sql`(extract(epoch from now()) * 1000)::bigint`,\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .where('id', '=', runId)\n .where('status', '=', 'pending')\n .execute();\n\n if (!result) {\n throw new RunNotFoundError(runId);\n }\n}\n","import { RuntimeContext } from '../core/internal/runtime-context';\nimport { resumeRun as resumeRunInDb } from '../core/internal/repository/resume-run';\nimport { createRunHandle } from './run';\n\nexport async function resumeRun(ctx: RuntimeContext, runId: string) {\n const { db } = ctx;\n await resumeRunInDb(db, runId);\n return createRunHandle<void>(ctx, runId);\n}\n","import { RuntimeContext } from '../core/internal/runtime-context';\nimport { serialize } from '../core/internal/serialization';\nimport { MessageDefinition } from '../core/message';\nimport { Run } from './run';\nimport { insertMessage } from '../core/internal/repository/insert-message';\n\nexport async function sendMessage(\n ctx: RuntimeContext,\n target: Run | string,\n name: MessageDefinition<unknown> | string,\n data?: unknown,\n) {\n const { db } = ctx;\n\n const destinationWorkflowId = typeof target === 'string' ? target : target.id;\n const messageType = typeof name === 'string' ? name : name.name;\n const serializedData = serialize(data);\n\n await insertMessage(db, {\n destinationWorkflowId,\n messageType,\n data: serializedData,\n });\n}\n","import crypto from 'node:crypto';\nimport { QueueEntry } from '../core/queue';\nimport { WorkflowEntry } from '../core/workflow';\nimport { StateEventBus } from '../core/internal/events/state-event-bus';\nimport { MessageEventBus } from '../core/internal/events/message-event-bus';\nimport { runWorkflow, RunWorkflowOptions } from './run-workflow';\nimport { RunRegistry } from '../core/internal/run-registry';\nimport { recoverPendingRuns } from '../core/internal/recover-pending-runs';\nimport { RuntimeContext } from '../core/internal/runtime-context';\nimport { WorkflowRegistry } from '../core/internal/workflow-registry';\nimport { RunEventBus } from '../core/internal/events/run-event-bus';\nimport { createRunHandle, Run } from './run';\nimport { QueueRegistry } from '../core/internal/queue-registry';\nimport { cancelRun } from './cancel-run';\nimport { queueWorkflow, QueueWorkflowOptions } from './queue-workflow';\nimport { QueueManager } from '../core/internal/queue-manager';\nimport { setupPostgresNotify } from '../core/internal/events/setup-postgres-notify';\nimport { createPgDriver } from '../core/internal/db/driver-pg';\nimport { resumeRun } from './resume-run';\nimport { MessageDefinition } from '../core/message';\nimport { sendMessage } from './send-message';\nimport { StateDefinition } from '../core/state';\nimport { getState } from './get-state';\nimport { getRunStatus } from './get-run-status';\nimport { waitForRunResult } from './wait-for-run-result';\n\ntype CreateInstanceOptions = {\n instanceId?: string;\n connectionString: string;\n};\n\nexport type CreateInstanceParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n workflows: Record<string, WorkflowEntry<any, any>>;\n queues?: Record<string, QueueEntry>;\n options: CreateInstanceOptions;\n};\n\nexport function createInstance(props: CreateInstanceParams) {\n const { db, client } = createPgDriver({ connectionString: props.options.connectionString });\n const messageEventBus = new MessageEventBus(db);\n const stateEventBus = new StateEventBus(db);\n const executorId = props.options.instanceId || crypto.randomUUID();\n const runRegistry = new RunRegistry();\n const workflowRegistry = new WorkflowRegistry(props.workflows);\n const runEventBus = new RunEventBus(db);\n const queueRegistry = new QueueRegistry(props.queues || {});\n\n const runtimeContext: RuntimeContext = {\n db,\n executorId,\n messageEventBus,\n stateEventBus,\n runRegistry,\n workflowRegistry,\n runEventBus,\n queueRegistry,\n };\n\n const notifySetupPromise = setupPostgresNotify(client, {\n runs: runEventBus.handleNotify.bind(runEventBus),\n state: stateEventBus.handleNotify.bind(stateEventBus),\n messages: messageEventBus.handleNotify.bind(messageEventBus),\n });\n\n const queueManager = new QueueManager(runtimeContext);\n queueManager.start();\n\n recoverPendingRuns(runtimeContext);\n\n return {\n runWorkflow: async <TArgs extends unknown[], TReturn>(\n wf: WorkflowEntry<TArgs, TReturn> | string,\n args?: TArgs,\n options?: RunWorkflowOptions,\n ) => {\n await notifySetupPromise;\n return runWorkflow<TArgs, TReturn>(runtimeContext, wf, args, options);\n },\n cancelRun: async (runId: string) => cancelRun(runtimeContext, runId),\n resumeRun: async (runId: string) => resumeRun(runtimeContext, runId),\n getRun: async (runId: string) => {\n await notifySetupPromise;\n return createRunHandle(runtimeContext, runId);\n },\n getRunStatus: async (runId: string) => getRunStatus(runtimeContext, runId),\n waitForRunResult: async <TReturn>(runId: string) =>\n waitForRunResult<TReturn>(runtimeContext, runId),\n queueWorkflow: async <TArgs extends unknown[], TReturn>(\n queue: QueueEntry | string,\n wf: WorkflowEntry<TArgs, TReturn> | string,\n args?: TArgs,\n options?: QueueWorkflowOptions,\n ) => {\n await notifySetupPromise;\n return queueWorkflow<TArgs, TReturn>(runtimeContext, queue, wf, args, options);\n },\n sendMessage: async <T>(target: Run | string, name: MessageDefinition<T>, data: T) => {\n await notifySetupPromise;\n return sendMessage(runtimeContext, target, name, data);\n },\n getState: async <T>(target: Run | string, key: StateDefinition<T> | string) => {\n await notifySetupPromise;\n return getState<T>(runtimeContext, target, key);\n },\n };\n}\n\nexport type Instance = ReturnType<typeof createInstance>;\n"]}
@@ -45,6 +45,15 @@ type RunWorkflowOptions = {
45
45
  id?: string;
46
46
  };
47
47
 
48
+ type QueueWorkflowOptions = {
49
+ timeout?: number;
50
+ deadline?: number;
51
+ priority?: number;
52
+ partitionKey?: string;
53
+ id?: string;
54
+ deduplicationId?: string;
55
+ };
56
+
48
57
  type RunResult<TReturn> = {
49
58
  error: Error;
50
59
  success: false;
@@ -58,4 +67,4 @@ interface Run<TReturn = unknown> {
58
67
  waitForResult: () => Promise<RunResult<TReturn>>;
59
68
  }
60
69
 
61
- export { type MessageDefinition as M, type QueueEntry as Q, type RunWorkflowOptions as R, type StateDefinition as S, type WorkflowEntry as W, type Run as a, type RunStatus as b, type RunResult as c, type QueueDefinition as d, type QueueOptions as e, type QueueRateLimit as f, type WorkflowDefinition as g, type WorkflowFunction as h, defineMessage as i, defineQueue as j, defineState as k, defineWorkflow as l };
70
+ export { type MessageDefinition as M, type QueueEntry as Q, type RunWorkflowOptions as R, type StateDefinition as S, type WorkflowEntry as W, type Run as a, type RunStatus as b, type RunResult as c, type QueueWorkflowOptions as d, type QueueDefinition as e, type QueueOptions as f, type QueueRateLimit as g, type WorkflowDefinition as h, type WorkflowFunction as i, defineMessage as j, defineQueue as k, defineState as l, defineWorkflow as m };
@@ -1,5 +1,5 @@
1
- import { S as StateDefinition, M as MessageDefinition, W as WorkflowEntry, R as RunWorkflowOptions, a as Run } from './run-oOlOK2Rg.js';
2
- export { d as QueueDefinition, Q as QueueEntry, e as QueueOptions, f as QueueRateLimit, b as RunStatus, g as WorkflowDefinition, h as WorkflowFunction, i as defineMessage, j as defineQueue, k as defineState, l as defineWorkflow } from './run-oOlOK2Rg.js';
1
+ import { S as StateDefinition, M as MessageDefinition, W as WorkflowEntry, R as RunWorkflowOptions, a as Run, Q as QueueEntry, d as QueueWorkflowOptions } from './run-BCTOgHFp.js';
2
+ export { e as QueueDefinition, f as QueueOptions, g as QueueRateLimit, b as RunStatus, h as WorkflowDefinition, i as WorkflowFunction, j as defineMessage, k as defineQueue, l as defineState, m as defineWorkflow } from './run-BCTOgHFp.js';
3
3
 
4
4
  type RetryConfig = {
5
5
  maxRetries?: number;
@@ -42,6 +42,14 @@ declare function randomUUID(): Promise<string>;
42
42
 
43
43
  declare function runWorkflow<TArgs extends unknown[], TReturn>(wf: WorkflowEntry<TArgs, TReturn> | string, args?: TArgs, options?: RunWorkflowOptions): Promise<Run<TReturn>>;
44
44
 
45
+ declare function sendMessage<T>(target: Run | string, name: MessageDefinition<T>, data?: T): Promise<void>;
46
+
47
+ declare function queueWorkflow<TArgs extends unknown[], TReturn>(queue: QueueEntry | string, wf: WorkflowEntry<TArgs, TReturn> | string, args?: TArgs, options?: QueueWorkflowOptions): Promise<Run<TReturn>>;
48
+
49
+ declare function now(): Promise<number>;
50
+
51
+ declare function getState<T = unknown>(target: Run | string, key: StateDefinition<T> | string): Promise<T>;
52
+
45
53
  declare class TimeoutError extends Error {
46
54
  constructor(message: string);
47
55
  }
@@ -55,4 +63,4 @@ declare class QueueNotFoundError extends Error {
55
63
  constructor(message: string);
56
64
  }
57
65
 
58
- export { MaxRecoveryAttemptsExceededError, MessageDefinition, QueueNotFoundError, type ReceiveMessageOptions, type RetryConfig, StateDefinition, TimeoutError, WorkflowEntry, WorkflowNotFoundError, cancellableSleep, executeStepWithRetries, getAbortSignal, getRunId, getStepId, randomUUID, receiveMessage, runStep, runWorkflow, setState, sleep };
66
+ export { MaxRecoveryAttemptsExceededError, MessageDefinition, QueueEntry, QueueNotFoundError, type ReceiveMessageOptions, type RetryConfig, StateDefinition, TimeoutError, WorkflowEntry, WorkflowNotFoundError, cancellableSleep, executeStepWithRetries, getAbortSignal, getRunId, getState, getStepId, now, queueWorkflow, randomUUID, receiveMessage, runStep, runWorkflow, sendMessage, setState, sleep };
package/dist/workflows.js CHANGED
@@ -1,7 +1,7 @@
1
- import { getExecutionContext, returnOrThrowOperationResult, executeAndRecordOperation, FatalError, MaxRetriesExceededError, sleep, ErrorThatShouldNeverHappen, withDbRetry, serialize, WorkflowNotFoundError, deserializeError, deserialize, createRunHandle, insertPendingRun, executeWorkflow, TimeoutError, serializeError, RunCancelledError } from './chunk-SQ7WUJCB.js';
2
- export { MaxRecoveryAttemptsExceededError, QueueNotFoundError, TimeoutError2 as TimeoutError, WorkflowNotFoundError } from './chunk-SQ7WUJCB.js';
1
+ import { getExecutionContext, returnOrThrowOperationResult, executeAndRecordOperation, FatalError, MaxRetriesExceededError, sleep, ErrorThatShouldNeverHappen, withDbRetry, serialize, WorkflowNotFoundError, deserializeError, deserialize, createRunHandle, insertPendingRun, executeWorkflow, insertMessage, QueueNotFoundError, enqueueRun, getState, StateNotAvailableError, waitForStateNotification, serializeError, TimeoutError, RunCancelledError } from './chunk-2CPBPIZ7.js';
2
+ export { MaxRecoveryAttemptsExceededError, QueueNotFoundError, TimeoutError2 as TimeoutError, WorkflowNotFoundError } from './chunk-2CPBPIZ7.js';
3
3
  import { sql } from 'kysely';
4
- import crypto, { createHash } from 'crypto';
4
+ import crypto2, { createHash } from 'crypto';
5
5
 
6
6
  // core/message.ts
7
7
  function defineMessage(name) {
@@ -284,20 +284,15 @@ function cancellableSleep(ms, signal) {
284
284
  signal?.addEventListener("abort", onAbort);
285
285
  });
286
286
  }
287
- var RANDOM_UUID_OPERATION_NAME = "_helical::randomUUID";
288
287
  async function randomUUID() {
289
288
  const { operationManager } = getExecutionContext();
290
289
  const existingResult = operationManager.getOperationResult();
291
290
  if (existingResult) {
292
291
  return existingResult.result;
293
292
  } else {
294
- return await executeAndRecordOperation(
295
- operationManager,
296
- RANDOM_UUID_OPERATION_NAME,
297
- async () => {
298
- return crypto.randomUUID();
299
- }
300
- );
293
+ return await executeAndRecordOperation(operationManager, "randomUUID", async () => {
294
+ return crypto2.randomUUID();
295
+ });
301
296
  }
302
297
  }
303
298
  async function runWorkflow(wf, args = [], options = {}) {
@@ -316,7 +311,7 @@ async function runWorkflow(wf, args = [], options = {}) {
316
311
  return createRunHandle(ctx, newRun2.runId);
317
312
  }
318
313
  const newRun = await executeAndRecordOperation(operationManager, "runWorkflow", async () => {
319
- const newRunId = options.id ?? crypto.randomUUID();
314
+ const newRunId = options.id ?? crypto2.randomUUID();
320
315
  const newRun2 = {
321
316
  runId: newRunId,
322
317
  runPath: [...runPath, newRunId],
@@ -343,6 +338,107 @@ async function runWorkflow(wf, args = [], options = {}) {
343
338
  return createRunHandle(ctx, newRun.runId);
344
339
  }
345
340
 
346
- export { cancellableSleep, defineMessage, defineQueue, defineState, defineWorkflow, executeStepWithRetries, getAbortSignal, getRunId, getStepId, randomUUID, receiveMessage, runStep, runWorkflow, setState, sleep2 as sleep };
341
+ // core/steps/send-message.ts
342
+ var SEND_MESSAGE_OPERATION_NAME = "workflow::message::send";
343
+ async function sendMessage(target, name, data) {
344
+ const { operationManager, db } = getExecutionContext();
345
+ const destinationWorkflowId = typeof target === "string" ? target : target.id;
346
+ const messageType = typeof name === "string" ? name : name.name;
347
+ const prevOp = operationManager.getOperationResult();
348
+ if (prevOp) {
349
+ return returnOrThrowOperationResult(prevOp);
350
+ }
351
+ const seqId = operationManager.reserveSequenceId();
352
+ const serializedData = serialize(data);
353
+ await withDbRetry(async () => {
354
+ return await db.transaction().execute(async (tx) => {
355
+ await insertMessage(tx, { destinationWorkflowId, messageType, data: serializedData });
356
+ await operationManager.recordResult(SEND_MESSAGE_OPERATION_NAME, seqId, null, tx);
357
+ });
358
+ });
359
+ }
360
+
361
+ // core/steps/queue-workflow.ts
362
+ async function queueWorkflow(queue, wf, args, options) {
363
+ const ctx = getExecutionContext();
364
+ const { db, operationManager, queueRegistry, workflowRegistry, runPath, executorId } = ctx;
365
+ const workflowName = typeof wf === "string" ? wf : workflowRegistry.getByWorkflowDefinition(wf)?.name;
366
+ if (!workflowName) {
367
+ throw new WorkflowNotFoundError("Workflow name not specified");
368
+ }
369
+ const queueName = typeof queue === "string" ? queue : queueRegistry.getByQueueEntry(queue)?.name;
370
+ if (!queueName) {
371
+ throw new QueueNotFoundError("Queue name not specified");
372
+ }
373
+ const op = operationManager.getOperationResult();
374
+ if (op) {
375
+ if (op.error) {
376
+ throw deserializeError(op.error);
377
+ }
378
+ const newRunId2 = deserialize(op.result);
379
+ return createRunHandle(ctx, newRunId2);
380
+ }
381
+ const newRunId = await executeAndRecordOperation(operationManager, "queueWorkflow", async () => {
382
+ const newRunId2 = options?.id ?? crypto.randomUUID();
383
+ const { runId } = await enqueueRun(db, {
384
+ runId: newRunId2,
385
+ path: [...runPath, newRunId2],
386
+ inputs: serialize(args),
387
+ executorId,
388
+ workflowName,
389
+ queueName,
390
+ timeout: options?.timeout,
391
+ deadline: options?.deadline
392
+ });
393
+ return runId;
394
+ });
395
+ return createRunHandle(ctx, newRunId);
396
+ }
397
+
398
+ // core/steps/now.ts
399
+ async function now() {
400
+ const { operationManager } = getExecutionContext();
401
+ const op = operationManager.getOperationResult();
402
+ if (op) {
403
+ return Number(op.result);
404
+ } else {
405
+ return await executeAndRecordOperation(operationManager, "now", async () => {
406
+ return Date.now();
407
+ });
408
+ }
409
+ }
410
+
411
+ // core/steps/get-state.ts
412
+ async function getState2(target, key) {
413
+ const { operationManager, db, stateEventBus } = getExecutionContext();
414
+ const stateKey = typeof key === "string" ? key : key.name;
415
+ const targetId = typeof target === "string" ? target : target.id;
416
+ const op = operationManager.getOperationResult();
417
+ if (op) {
418
+ return returnOrThrowOperationResult(op);
419
+ }
420
+ const seqId = operationManager.reserveSequenceId();
421
+ while (true) {
422
+ try {
423
+ return await withDbRetry(async () => {
424
+ const state = await getState(db, targetId, stateKey);
425
+ if (!state) {
426
+ throw new StateNotAvailableError();
427
+ }
428
+ await operationManager.recordResult("getState", seqId, state);
429
+ return deserialize(state);
430
+ });
431
+ } catch (error) {
432
+ if (error instanceof StateNotAvailableError) {
433
+ await waitForStateNotification(stateEventBus, targetId, stateKey);
434
+ continue;
435
+ }
436
+ await operationManager.recordError("getState", seqId, serializeError(error));
437
+ throw error;
438
+ }
439
+ }
440
+ }
441
+
442
+ export { cancellableSleep, defineMessage, defineQueue, defineState, defineWorkflow, executeStepWithRetries, getAbortSignal, getRunId, getState2 as getState, getStepId, now, queueWorkflow, randomUUID, receiveMessage, runStep, runWorkflow, sendMessage, setState, sleep2 as sleep };
347
443
  //# sourceMappingURL=workflows.js.map
348
444
  //# sourceMappingURL=workflows.js.map