@usehelical/workflows 0.0.1-alpha.14 → 0.0.1-alpha.16
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/LICENSE +661 -0
- package/README.md +0 -111
- package/dist/api.d.ts +45 -0
- package/dist/{workflows.js → api.js} +32 -167
- package/dist/api.js.map +1 -0
- package/dist/chunk-HRDI7EOY.js +441 -0
- package/dist/chunk-HRDI7EOY.js.map +1 -0
- package/dist/index.d.ts +165 -17
- package/dist/index.js +710 -195
- package/dist/index.js.map +1 -1
- package/dist/state-DygxhGtl.d.ts +49 -0
- package/package.json +5 -4
- package/dist/chunk-2CPBPIZ7.js +0 -725
- package/dist/chunk-2CPBPIZ7.js.map +0 -1
- package/dist/run-BCTOgHFp.d.ts +0 -70
- package/dist/workflows.d.ts +0 -66
- package/dist/workflows.js.map +0 -1
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-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"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/events/polling-loop.ts","../src/internal/events/event-bus-core.ts","../src/internal/db/queries/get-state.ts","../src/internal/db/queries/get-state-batch.ts","../src/internal/events/state-event-bus.ts","../src/internal/db/queries/get-message-batch.ts","../src/internal/events/message-event-bus.ts","../src/internal/db/commands/record-run-result.ts","../src/internal/execute-workflow.ts","../src/internal/db/queries/get-run-status.ts","../src/internal/get-run-status.ts","../src/internal/wait-for-run-result.ts","../src/internal/run.ts","../src/internal/db/commands/insert-pending-run.ts","../src/internal/run-workflow.ts","../src/internal/context/run-registry.ts","../src/internal/db/queries/get-operations.ts","../src/internal/db/queries/get-pending-runs.ts","../src/internal/db/commands/upsert-run.ts","../src/internal/recover-pending-runs.ts","../src/internal/db/queries/get-run-batch.ts","../src/internal/events/run-event-bus.ts","../src/internal/db/commands/cancel-run.ts","../src/internal/cancel-run.ts","../src/internal/db/commands/enqueue-run.ts","../src/internal/queue-workflow.ts","../src/internal/db/commands/dequeue-run.ts","../src/internal/db/queries/get-executable-runs.ts","../src/internal/db/queries/get-queue-partitions.ts","../src/internal/context/queue-manager.ts","../src/internal/events/setup-postgres-notify.ts","../src/internal/db/driver-pg.ts","../src/internal/db/commands/resume-run.ts","../src/internal/resume-run.ts","../src/internal/db/commands/insert-message.ts","../src/internal/send-message.ts","../src/internal/get-state.ts","../src/main/executor/executor.ts","../src/main/client/client.ts"],"names":["POLLING_FALLBACK_INTERVAL_MS","sql","getRunStatus","run","newRun","cancelRun","crypto","newRunId","runs","resumeRun","getState","options"],"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) => Promise<void> | 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';\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';\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 '../db/queries/get-state';\nimport { Database } from '../db/db';\nimport { getStateBatch } from '../db/queries/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 async 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';\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 '../db/queries/get-message-batch';\nimport { withDbRetry } from '../db/retry';\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(\n private readonly db: Database,\n pollingFallbackIntervalMs: number = POLLING_FALLBACK_INTERVAL_MS,\n ) {\n this.pollingLoop = new PollingLoop(pollingFallbackIntervalMs, 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 try {\n const messages = await withDbRetry(\n async () => await getMessageBatch(this.db, messageRetrievalRequests),\n );\n for (const message of messages) {\n this.bus.emitEvent(message.destinationRunId, message.type, undefined, 1);\n }\n } catch (error) {\n console.error('Error polling messages:', error);\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 { sql } from 'kysely';\nimport { Database } from '../db';\n\ntype RunResult = {\n result?: string;\n error?: string;\n};\n\nexport async function recordRunResult(\n db: Database,\n runId: string,\n result: RunResult,\n cancelled?: boolean,\n) {\n const [{ change_id }] = await db\n .updateTable('runs')\n .set({\n output: result.result,\n error: result.error,\n status: cancelled ? 'cancelled' : result.error ? 'error' : 'success',\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .where('id', '=', runId)\n .returning(['change_id'])\n .execute();\n return change_id;\n}\n","import { WorkflowFunction } from '@api/workflow';\nimport { OperationResult } from '@internal/context/operation-manager';\nimport { recordRunResult } from './db/commands/record-run-result';\nimport { serialize, serializeError } from './utils/serialization';\nimport { RunWorkflowOptions } from './run-workflow';\nimport { RunCancelledError, RunDeadlineExceededError, RunTimedOutError } from './errors';\nimport {\n createExecutionContext,\n ExecutionContext,\n getExecutionContext,\n runWithExecutionContext,\n} from './context/execution-context';\nimport { RuntimeContext } from './context/runtime-context';\n\nexport type ExecuteWorkflowParams<TArgs extends unknown[] = unknown[], TReturn = unknown> = {\n runId: string;\n runPath: string[];\n workflowName: string;\n fn: WorkflowFunction<TArgs, TReturn>;\n args: TArgs;\n options?: RunWorkflowOptions;\n operations?: OperationResult[];\n};\n\nexport async function executeWorkflow<TArgs extends unknown[], TReturn>(\n ctx: RuntimeContext | ExecutionContext,\n params: ExecuteWorkflowParams<TArgs, TReturn>,\n): Promise<void> {\n const { db, runRegistry } = ctx;\n const { options, runId, runPath, fn, args, operations } = params;\n\n const abortController = new AbortController();\n const [deadline, deadlineReason] = getDeadlineAndReason({\n timeout: options?.timeout,\n deadline: options?.deadline,\n });\n\n const runStore = createExecutionContext({\n ctx,\n abortSignal: AbortSignal.any(\n [abortController.signal].concat(deadline ? [AbortSignal.timeout(deadline - Date.now())] : []),\n ),\n runId,\n runPath,\n operations,\n });\n\n const executionPromise = (async () => {\n try {\n const result = await runWithExecutionContext(runStore, async () => {\n return await runWithTimeout(async () => {\n return await fn(...args);\n }, deadlineReason);\n });\n await recordRunResult(db, runId, { result: result ? serialize(result) : undefined });\n return result;\n } catch (error) {\n if (error instanceof RunCancelledError) {\n // User already called cancelRun() - just record the error\n await recordRunResult(db, runId, { error: serializeError(error as Error) }, true);\n } else {\n await recordRunResult(db, runId, { error: serializeError(error as Error) });\n }\n throw error;\n } finally {\n runRegistry.unregisterRun(runId);\n }\n })();\n\n runRegistry.registerRun(runId, {\n store: runStore,\n promise: executionPromise,\n abortController: abortController,\n });\n}\n\nfunction getDeadlineAndReason({\n timeout,\n deadline,\n}: {\n timeout?: number;\n deadline?: number;\n}): [number | undefined, 'timeout' | 'deadline' | undefined] {\n const now = Date.now();\n const timeoutDeadline = timeout ? now + timeout : undefined;\n\n if (timeoutDeadline && deadline) {\n return [\n Math.min(timeoutDeadline, deadline),\n timeoutDeadline < deadline ? 'timeout' : 'deadline',\n ];\n } else if (timeoutDeadline) {\n return [timeoutDeadline, 'timeout'];\n } else if (deadline) {\n return [deadline, 'deadline'];\n }\n return [undefined, undefined];\n}\n\nexport async function runWithTimeout<T>(\n fn: () => Promise<T>,\n deadlineReason?: 'timeout' | 'deadline',\n): Promise<T> {\n const { abortSignal } = getExecutionContext();\n\n const abortPromise = new Promise<T>((_, reject) => {\n abortSignal.throwIfAborted();\n abortSignal.addEventListener(\n 'abort',\n () => {\n if (abortSignal.reason?.name === 'TimeoutError') {\n reject(new RunTimedOutError());\n return;\n }\n reject(new RunCancelledError());\n },\n { once: true },\n );\n });\n\n const callPromise = fn();\n\n try {\n return await Promise.race([callPromise, abortPromise]);\n } catch (error) {\n if (error instanceof RunTimedOutError) {\n if (deadlineReason === 'timeout') {\n throw new RunTimedOutError();\n } else if (deadlineReason === 'deadline') {\n throw new RunDeadlineExceededError();\n }\n throw error;\n }\n await callPromise.catch(() => {});\n throw error;\n }\n}\n","import { RunStatus } from '@api/workflow';\nimport { Database } from '../db';\nimport { RunNotFoundError } from '../../errors';\n\nexport async function getRunStatus(db: Database, runId: string): Promise<RunStatus> {\n const run = await db\n .selectFrom('runs')\n .select('status')\n .where('id', '=', runId)\n .executeTakeFirst();\n if (!run) {\n throw new RunNotFoundError(runId);\n }\n return run.status as RunStatus;\n}\n","import { RunStatus } from '@api/workflow';\nimport { ClientContext } from './context/client-context';\nimport { RunEntry } from './context/run-registry';\nimport { RuntimeContext } from './context/runtime-context';\nimport { getRunStatus as getRunStatusQuery } from './db/queries/get-run-status';\nimport { ExecutionContext } from './context/execution-context';\nimport {\n executeAndRecordOperation,\n returnOrThrowOperationResult,\n} from './context/operation-manager';\n\nexport async function getRunStatus(\n ctx: RuntimeContext | ClientContext | ExecutionContext,\n runId: string,\n): Promise<RunStatus> {\n const { db } = ctx;\n if (ctx.type === 'runtime') {\n const { runRegistry } = ctx;\n const run = runRegistry.getRun(runId);\n if (run) {\n return deriveRunStatus(run);\n }\n return getRunStatusQuery(db, runId);\n }\n\n if (ctx.type === 'execution') {\n const { operationManager, runRegistry } = ctx;\n const op = operationManager.getOperationResult();\n if (op) {\n returnOrThrowOperationResult<RunStatus>(op);\n }\n const status = await executeAndRecordOperation(operationManager, 'getRunStatus', async () => {\n const run = runRegistry.getRun(runId);\n if (run) {\n return deriveRunStatus(run);\n }\n return await getRunStatusQuery(db, runId);\n });\n return status;\n }\n\n return await getRunStatusQuery(db, runId);\n}\n\nasync function deriveRunStatus(runEntry: RunEntry): Promise<RunStatus> {\n if (runEntry.store.abortSignal.aborted) {\n return 'cancelled';\n }\n const promiseState = runEntry.getPromiseState();\n if (promiseState === 'pending') {\n return 'pending';\n }\n if (promiseState === 'fulfilled') {\n return 'success';\n }\n return 'error';\n}\n","import {\n MaxRecoveryAttemptsExceededError,\n RunCancelledError,\n RunNotFoundError,\n UnknownError,\n} from './errors';\nimport { getRun } from './db/queries/get-run';\nimport { RuntimeContext } from './context/runtime-context';\nimport { deserialize, deserializeError } from './utils/serialization';\nimport { RunResult } from './run';\nimport { TERMINAL_STATES } from '@api/workflow';\nimport { ClientContext } from './context/client-context';\nimport { ExecutionContext } from './context/execution-context';\nimport {\n executeAndRecordOperation,\n returnOrThrowOperationResult,\n} from './context/operation-manager';\n\nexport async function waitForRunResult<TReturn>(\n ctx: RuntimeContext | ClientContext | ExecutionContext,\n runId: string,\n): Promise<RunResult<TReturn>> {\n if (ctx.type === 'execution') {\n const { operationManager } = ctx;\n const op = operationManager.getOperationResult();\n if (op) {\n returnOrThrowOperationResult<RunResult<TReturn>>(op);\n }\n const result = await executeAndRecordOperation(\n operationManager,\n 'waitForRunResult',\n async () => {\n return await getOrSubscribeToRunResult<TReturn>(ctx, runId);\n },\n );\n return result;\n }\n return await getOrSubscribeToRunResult<TReturn>(ctx, runId);\n}\n\nasync function getOrSubscribeToRunResult<TReturn>(\n ctx: RuntimeContext | ClientContext | ExecutionContext,\n runId: string,\n): Promise<RunResult<TReturn>> {\n const { db, runEventBus } = ctx;\n const run = await getRun(db, runId);\n if (!run) {\n return {\n error: new RunNotFoundError(runId),\n success: false,\n };\n }\n switch (run.status) {\n case 'success':\n return {\n data: run.output ? (deserialize(run.output) as TReturn) : (undefined as TReturn),\n success: true,\n };\n case 'error':\n return {\n error: run.error ? (deserializeError(run.error) as unknown as Error) : new UnknownError(),\n success: false,\n };\n case 'cancelled':\n return {\n error: new RunCancelledError(),\n success: false,\n };\n case 'max_recovery_attempts_exceeded':\n return {\n error: run.error\n ? (deserializeError(run.error) as unknown as Error)\n : new MaxRecoveryAttemptsExceededError(runId, run.recoveryAttempts),\n success: false,\n };\n }\n\n return new Promise<RunResult<TReturn>>((resolve, reject) => {\n const unsubscribe = runEventBus.subscribe(runId, '*', async (e) => {\n if (TERMINAL_STATES.includes(e.status)) {\n unsubscribe();\n try {\n const run = await getRun(db, runId);\n if (!run) {\n reject(new RunNotFoundError(runId));\n return;\n }\n switch (run.status) {\n case 'success':\n resolve({\n data: run.output ? (deserialize(run.output) as TReturn) : (undefined as TReturn),\n success: true,\n });\n return;\n case 'error':\n resolve({\n error: run.error\n ? (deserializeError(run.error) as unknown as Error)\n : new UnknownError(),\n success: false,\n });\n return;\n case 'cancelled':\n resolve({\n error: new RunCancelledError(),\n success: false,\n });\n return;\n case 'max_recovery_attempts_exceeded':\n resolve({\n error: run.error\n ? (deserializeError(run.error) as unknown as Error)\n : new MaxRecoveryAttemptsExceededError(runId, run.recoveryAttempts),\n success: false,\n });\n return;\n }\n } catch (error) {\n if (error instanceof RunNotFoundError) {\n reject(error);\n return;\n }\n resolve({\n error: error as Error,\n success: false,\n });\n }\n }\n });\n });\n}\n","import { RuntimeContext } from '@internal/context/runtime-context';\nimport { RunStatus } from '../api';\nimport { getRunStatus } from '@internal/get-run-status';\nimport { waitForRunResult } from '@internal/wait-for-run-result';\nimport { BaseError } from '@internal/errors';\nimport { ClientContext } from '@internal/context/client-context';\nimport { ExecutionContext } from '@internal/context/execution-context';\n\nexport type RunResult<TReturn> =\n | { error: BaseError | Error; success: false }\n | { data: TReturn; success: true };\n\nexport interface Run<TReturn = unknown> {\n id: string;\n getStatus: () => Promise<RunStatus>;\n waitForResult: () => Promise<RunResult<TReturn>>;\n}\n\nexport function createRunHandle<TReturn = unknown>(\n runtimeContext: RuntimeContext | ClientContext | ExecutionContext,\n id: string,\n): Run<TReturn> {\n return {\n id,\n getStatus: () => getRunStatus(runtimeContext, id),\n waitForResult: () => waitForRunResult<TReturn>(runtimeContext, id),\n };\n}\n","import { sql } from 'kysely';\nimport { Database, Transaction } from '../db';\n\nexport type InsertRunOptions = {\n runId: string;\n path: string[];\n inputs: string;\n executorId: string;\n workflowName: string;\n};\n\nexport async function insertPendingRun(db: Database | Transaction, options: InsertRunOptions) {\n const result = await db\n .insertInto('runs')\n .values({\n id: options.runId,\n path: options.path,\n inputs: options.inputs,\n executor_id: options.executorId,\n workflow_name: options.workflowName,\n status: 'pending',\n started_at_epoch_ms: sql`(extract(epoch from now()) * 1000)::bigint`,\n created_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .returning(['id', 'path', 'change_id'])\n .executeTakeFirst();\n\n return {\n runId: result!.id,\n path: result!.path,\n changeId: result!.change_id,\n };\n}\n","import crypto from 'node:crypto';\nimport { deserialize, deserializeError, serialize } from './utils/serialization';\nimport { WorkflowFunction } from '@api/workflow';\nimport { executeWorkflow } from './execute-workflow';\nimport { RuntimeContext } from './context/runtime-context';\nimport { WorkflowNotFoundError } from '@internal/errors';\nimport { createRunHandle } from './run';\nimport { insertPendingRun } from './db/commands/insert-pending-run';\nimport { ExecutionContext } from './context/execution-context';\nimport { executeAndRecordOperation } from './context/operation-manager';\nimport { withDbRetry } from './db/retry';\n\nexport type RunWorkflowOptions = {\n timeout?: number;\n deadline?: number;\n id?: string;\n};\n\ntype RunWorkflowOperationResult = {\n runId: string;\n runPath: string[];\n workflowName: string;\n};\n\nexport async function runWorkflow<TArgs extends unknown[], TReturn>(\n ctx: RuntimeContext | ExecutionContext,\n wf: string,\n args: TArgs = [] as unknown as TArgs,\n options: RunWorkflowOptions = {},\n) {\n const { db, executorId, workflowsMap, type } = ctx;\n\n const workflow = workflowsMap[wf];\n if (!workflow) {\n throw new WorkflowNotFoundError(wf);\n }\n\n const newRunId = options.id ?? crypto.randomUUID();\n let newRunPath: string[] = [];\n\n if (type === 'execution') {\n const { operationManager, runPath } = ctx;\n const op = operationManager.getOperationResult();\n if (op) {\n if (op.error) {\n throw deserializeError(op.error);\n }\n const newRun = deserialize<RunWorkflowOperationResult>(op.result!);\n return createRunHandle<TReturn>(ctx, newRun.runId);\n }\n\n const newRun = await executeAndRecordOperation(operationManager, 'runWorkflow', async () => {\n const newRun: RunWorkflowOperationResult = {\n runId: newRunId,\n runPath: [...runPath, newRunId],\n workflowName: workflow.name,\n };\n withDbRetry(async () => {\n return await insertPendingRun(db, {\n ...newRun,\n path: newRun.runPath,\n inputs: serialize(args),\n executorId: executorId,\n });\n });\n return newRun;\n });\n\n newRunPath = newRun.runPath;\n }\n\n if (type === 'runtime') {\n const { path } = await insertPendingRun(db, {\n runId: newRunId,\n path: [newRunId],\n inputs: serialize(args),\n executorId: executorId,\n workflowName: workflow.name,\n });\n newRunPath = path;\n }\n\n await executeWorkflow<TArgs, TReturn>(ctx, {\n runId: newRunId,\n runPath: newRunPath,\n workflowName: workflow.name,\n fn: workflow.fn as WorkflowFunction<TArgs, TReturn>,\n args,\n options,\n });\n\n return createRunHandle<TReturn>(ctx, newRunId);\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';\nimport { OperationResult } from '../../context/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';\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 '../../../api/workflow';\nimport { Database, Transaction } from '../db';\nimport { MaxRecoveryAttemptsExceededError } from '../../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 './db/queries/get-operations';\nimport { getPendingRuns } from './db/queries/get-pending-runs';\nimport { upsertRun } from './db/commands/upsert-run';\nimport { RuntimeContext } from './context/runtime-context';\nimport { deserialize } from './utils/serialization';\n\nexport async function recoverPendingRuns(ctx: RuntimeContext) {\n const { db, executorId, workflowsMap } = 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 = workflowsMap[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 { RunStatus } from '@api/workflow';\nimport { Database } from '../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 '@api/workflow';\nimport { EventBus, EventBusCore } from './event-bus-core';\nimport { PollingLoop } from './polling-loop';\nimport { getRun } from '../db/queries/get-run';\nimport { getRunBatch } from '../db/queries/get-run-batch';\nimport { Database } from '../db/db';\nimport { withDbRetry } from '../db/retry';\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(\n private readonly db: Database,\n pollingFallbackIntervalMs: number = POLLING_FALLBACK_INTERVAL_MS,\n ) {\n this.pollingLoop = new PollingLoop(pollingFallbackIntervalMs, this.handlePoll.bind(this));\n this.bus = new EventBusCore({ allowWildcardSubscriptions: true }, this.pollingLoop);\n this.pollingLoop.start();\n }\n\n async 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 try {\n const run = await withDbRetry(async () => await getRun(this.db, runId));\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 } catch (error) {\n console.error('Error handling notify for run:', error);\n return;\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 try {\n const runs = await withDbRetry(async () => 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 } catch (error) {\n console.error('Error polling runs:', error);\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 { sql } from 'kysely';\nimport { Database } from '../db';\nimport { RunNotFoundError } from '../../errors';\nimport { TERMINAL_STATES } from '@api/workflow';\n\nexport async function cancelRun(runId: string, db: Database, options: { cascade?: boolean } = {}) {\n if (options.cascade) {\n return db.transaction().execute(async (tx) => {\n const result = await tx\n .updateTable('runs')\n .set({\n status: 'cancelled',\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .where((eb) => eb.and([eb('id', '=', runId), eb('status', 'not in', TERMINAL_STATES)]))\n .returning(['change_id', 'path'])\n .executeTakeFirst();\n\n if (!result) {\n const exists = await tx\n .selectFrom('runs')\n .select([])\n .where('id', '=', runId)\n .executeTakeFirst();\n if (exists) {\n return undefined;\n }\n throw new RunNotFoundError(runId);\n }\n await sql`\n UPDATE runs\n SET \n status = ${'cancelled'},\n updated_at = (extract(epoch from now()) * 1000)::bigint\n WHERE path @> ARRAY[${runId}]::text[]\n AND id != ${runId}\n AND status NOT IN (${'cancelled'}, ${'success'}, ${'error'})\n `.execute(tx);\n\n return {\n path: result.path,\n changeId: result.change_id,\n };\n });\n } else {\n const result = await db\n .updateTable('runs')\n .set({\n status: 'cancelled',\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .where((eb) => eb.and([eb('id', '=', runId), eb('status', 'not in', TERMINAL_STATES)]))\n .returning(['path', 'change_id'])\n .executeTakeFirst();\n\n if (!result) {\n throw new RunNotFoundError(runId);\n }\n return {\n path: result.path,\n changeId: result.change_id,\n };\n }\n}\n","import { cancelRun as cancelRunCommand } from './db/commands/cancel-run';\nimport { RuntimeContext } from './context/runtime-context';\nimport { ClientContext } from './context/client-context';\nimport { ExecutionContext } from './context/execution-context';\n\nexport async function cancelRun(\n ctx: RuntimeContext | ClientContext | ExecutionContext,\n runId: string,\n options: { cascade?: boolean } = {},\n) {\n if (ctx.type === 'execution' || ctx.type === 'runtime') {\n const { db, runRegistry } = ctx;\n const run = await cancelRunCommand(runId, db, options);\n if (!run) {\n return;\n }\n if (options.cascade) {\n for (const pathPart of run.path) {\n const run = runRegistry.getRun(pathPart);\n if (run) {\n run.abortController.abort();\n }\n }\n return;\n }\n runRegistry.getRun(runId)?.abortController.abort();\n } else {\n const { db } = ctx;\n const run = await cancelRunCommand(runId, db, options);\n if (!run) {\n return;\n }\n }\n}\n","import { sql } from 'kysely';\nimport { Database, Transaction } from '../db';\n\nexport type EnqueueRunOptions = {\n runId: string;\n path: string[];\n inputs: 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 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 { RuntimeContext } from './context/runtime-context';\nimport { deserialize, deserializeError, serialize } from './utils/serialization';\n\nimport crypto from 'node:crypto';\nimport { createRunHandle } from './run';\nimport { enqueueRun } from './db/commands/enqueue-run';\nimport { ClientContext } from './context/client-context';\nimport { withDbRetry } from './db/retry';\nimport { ExecutionContext } from './context/execution-context';\nimport { executeAndRecordOperation } from './context/operation-manager';\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 | ClientContext | ExecutionContext,\n queueName: string,\n workflowName: string,\n args?: TArgs,\n options?: QueueWorkflowOptions,\n) {\n const { db } = ctx;\n const newRunId = options?.id ?? crypto.randomUUID();\n\n if (ctx.type === 'execution') {\n const { operationManager, runPath } = ctx;\n const op = operationManager.getOperationResult();\n if (op) {\n if (op.error) {\n throw deserializeError(op.error);\n }\n const newRunId = deserialize<string>(op.result!);\n return createRunHandle<TReturn>(ctx, newRunId);\n }\n\n await executeAndRecordOperation(operationManager, 'queueWorkflow', async () => {\n const { runId } = await enqueueRun(db, {\n runId: newRunId,\n path: [...runPath, newRunId],\n inputs: serialize(args),\n workflowName,\n queueName,\n timeout: options?.timeout,\n deadline: options?.deadline,\n });\n return runId;\n });\n\n return createRunHandle<TReturn>(ctx, newRunId);\n }\n\n await withDbRetry(\n async () =>\n await enqueueRun(db, {\n runId: newRunId,\n path: [newRunId],\n inputs: serialize(args),\n workflowName: workflowName,\n queueName: queueName,\n timeout: options?.timeout,\n deadline: options?.deadline,\n }),\n );\n\n return createRunHandle<TReturn>(ctx, newRunId);\n}\n","import { sql } from 'kysely';\nimport { Transaction } from '../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 '@api/queue';\nimport { Database } from '../db';\nimport { withDbRetry } from '../retry';\nimport { DequeuedRun, dequeueRun } from '../commands/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';\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 '../db/queries/get-executable-runs';\nimport { QueueDefinition, QueueRateLimit } from '@api/queue';\nimport { deserialize } from '../utils/serialization';\nimport { executeWorkflow } from '../execute-workflow';\nimport { RuntimeContext } from './runtime-context';\nimport { getQueuePartitions } from '../db/queries/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: QueueDefinition[];\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;\n }\n\n private async handlePoll() {\n for (const queue of this.queues) {\n await this.dispatch(queue.name, 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.workflowsMap[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.workflowsMap[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 | Promise<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';\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 './context/runtime-context';\nimport { resumeRun as resumeRunInDb } from './db/commands/resume-run';\nimport { ClientContext } from './context/client-context';\nimport { ExecutionContext } from './context/execution-context';\nimport {\n executeAndRecordOperation,\n returnOrThrowOperationResult,\n} from './context/operation-manager';\nimport { withDbRetry } from './db/retry';\n\nexport async function resumeRun(\n ctx: RuntimeContext | ClientContext | ExecutionContext,\n runId: string,\n) {\n const { db } = ctx;\n if (ctx.type === 'execution') {\n const { operationManager } = ctx;\n const op = operationManager.getOperationResult();\n if (op) {\n returnOrThrowOperationResult<void>(op);\n }\n await executeAndRecordOperation(operationManager, 'resumeRun', async () => {\n await withDbRetry(async () => await resumeRunInDb(db, runId));\n });\n } else {\n await withDbRetry(async () => await resumeRunInDb(db, runId));\n }\n}\n","import { Database, Transaction } from '../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 './context/runtime-context';\nimport { serialize } from './utils/serialization';\nimport { insertMessage } from './db/commands/insert-message';\nimport { ClientContext } from './context/client-context';\nimport { MessageDefinition } from '@api/message';\nimport { Run } from './run';\nimport { ExecutionContext } from './context/execution-context';\nimport {\n executeAndRecordOperation,\n returnOrThrowOperationResult,\n} from './context/operation-manager';\n\nexport async function sendMessage(\n ctx: RuntimeContext | ClientContext | ExecutionContext,\n target: Run | string,\n name: MessageDefinition<unknown> | string,\n data?: unknown,\n) {\n const { db } = ctx;\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 if (ctx.type === 'execution') {\n const { operationManager } = ctx;\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<void>(op);\n }\n await executeAndRecordOperation(operationManager, 'sendMessage', async () => {\n await insertMessage(db, {\n destinationWorkflowId,\n messageType,\n data: serializedData,\n });\n });\n } else {\n await insertMessage(db, {\n destinationWorkflowId,\n messageType,\n data: serializedData,\n });\n }\n}\n","import { withDbRetry } from './db/retry';\nimport { RuntimeContext } from './context/runtime-context';\nimport { StateDefinition } from '@api/state';\nimport { getState as getStateRepository } from './db/queries/get-state';\nimport { deserialize } from './utils/serialization';\nimport { StateEventBus } from './events/state-event-bus';\nimport { ClientContext } from './context/client-context';\nimport { ExecutionContext } from './context/execution-context';\nimport {\n executeAndRecordOperation,\n returnOrThrowOperationResult,\n} from './context/operation-manager';\nimport { Run } from './run';\n\nclass StateNotAvailableError extends Error {}\n\nexport async function getState<T>(\n ctx: RuntimeContext | ClientContext | ExecutionContext,\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 if (ctx.type === 'execution') {\n const { operationManager } = ctx;\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<T>(op) as T;\n }\n }\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 if (ctx.type === 'execution') {\n const { operationManager } = ctx;\n await executeAndRecordOperation(operationManager, 'getState', async () => {\n return state;\n });\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\nexport async function waitForStateNotification(\n stateEventBus: StateEventBus,\n runId: string,\n key: string,\n) {\n return new Promise((resolve) => {\n const unsubscribe = stateEventBus.subscribe(runId, key, (state) => {\n unsubscribe();\n resolve(state);\n });\n });\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport crypto from 'node:crypto';\nimport { QueueDefinition, QueueSignature } from '@api/queue';\nimport { WorkflowDefinition, WorkflowSignature } from '@api/workflow';\nimport { StateEventBus } from '@internal/events/state-event-bus';\nimport { MessageEventBus } from '@internal/events/message-event-bus';\nimport { runWorkflow, RunWorkflowOptions } from '@internal/run-workflow';\nimport { RunRegistry } from '@internal/context/run-registry';\nimport { recoverPendingRuns } from '@internal/recover-pending-runs';\nimport { RuntimeContext } from '@internal/context/runtime-context';\nimport { RunEventBus } from '@internal/events/run-event-bus';\nimport { createRunHandle, Run, RunResult } from '../../internal/run';\nimport { cancelRun } from '@internal/cancel-run';\nimport { queueWorkflow, QueueWorkflowOptions } from '@internal/queue-workflow';\nimport { QueueManager } from '@internal/context/queue-manager';\nimport { setupPostgresNotify } from '@internal/events/setup-postgres-notify';\nimport { createPgDriver } from '@internal/db/driver-pg';\nimport { resumeRun } from '@internal/resume-run';\nimport { MessageDefinition } from '@api/message';\nimport { sendMessage } from '@internal/send-message';\nimport { StateDefinition } from '@api/state';\nimport { getState } from '@internal/get-state';\nimport { getRunStatus } from '@internal/get-run-status';\nimport { waitForRunResult } from '@internal/wait-for-run-result';\n\ntype CreateInstanceOptions = {\n instanceId?: string;\n connectionString: string;\n};\n\nexport type createExecutorParams<\n TWorkflows extends Array<WorkflowDefinition<unknown[], unknown>>,\n TQueues extends Array<QueueDefinition>,\n> = {\n workflows: TWorkflows;\n queues?: TQueues;\n options: CreateInstanceOptions;\n};\n\ntype ExtractNames<T extends readonly { name: string }[]> = T[number]['name'];\n\nexport interface WorkflowOperations<\n TWorkflows extends readonly WorkflowSignature<unknown[], unknown>[],\n TQueues extends readonly QueueDefinition[],\n> {\n // queueWorkflow overloads\n queueWorkflow<\n TQueue extends Extract<TQueues[number], { name: ExtractNames<TQueues> }> = Extract<\n TQueues[number],\n { name: ExtractNames<TQueues> }\n >,\n TWorkflow extends Extract<TWorkflows[number], { name: ExtractNames<TWorkflows> }> = Extract<\n TWorkflows[number],\n { name: ExtractNames<TWorkflows> }\n >,\n TArgs extends unknown[] = TWorkflow extends WorkflowSignature<\n infer A extends unknown[],\n unknown\n >\n ? A\n : never,\n TReturn = TWorkflow extends WorkflowSignature<unknown[], infer R> ? R : never,\n >(\n queue: TQueue,\n wf: TWorkflow,\n args: TArgs,\n options?: QueueWorkflowOptions,\n ): Promise<Run<TReturn>>;\n\n queueWorkflow<\n QK extends ExtractNames<TQueues>,\n WK extends ExtractNames<TWorkflows>,\n TWorkflow extends Extract<TWorkflows[number], { name: WK }> = Extract<\n TWorkflows[number],\n { name: WK }\n >,\n TReturn = TWorkflow extends WorkflowSignature<unknown[], infer R> ? R : never,\n >(\n queue: QK,\n wf: WK,\n options: QueueWorkflowOptions,\n ): Promise<Run<TReturn>>;\n\n queueWorkflow<\n QK extends ExtractNames<TQueues>,\n WK extends ExtractNames<TWorkflows>,\n TWorkflow extends Extract<TWorkflows[number], { name: WK }> = Extract<\n TWorkflows[number],\n { name: WK }\n >,\n TReturn = TWorkflow extends WorkflowSignature<unknown[], infer R> ? R : never,\n >(\n queue: QK,\n wf: WK,\n ): Promise<Run<TReturn>>;\n\n // Shared methods\n cancelRun(runId: string): Promise<void>;\n resumeRun(runId: string): Promise<void>;\n getRun<TWorkflow extends WorkflowSignature<unknown[], unknown>>(\n runId: string,\n ): Promise<Run<TWorkflow extends WorkflowSignature<unknown[], infer R> ? R : never>>;\n getRun<TReturn>(runId: string): Promise<Run<TReturn>>;\n getRunStatus(runId: string): Promise<string>;\n waitForRunResult<TWorkflow extends WorkflowSignature<unknown[], unknown>>(\n runId: string,\n ): Promise<RunResult<TWorkflow extends WorkflowSignature<unknown[], infer R> ? R : never>>;\n waitForRunResult<TReturn>(runId: string): Promise<RunResult<TReturn>>;\n sendMessage<T>(target: Run | string, name: MessageDefinition<T>, data: T): Promise<void>;\n getState<T>(target: Run | string, key: StateDefinition<T> | string): Promise<T | undefined>;\n}\n\nexport interface Executor<\n TWorkflows extends Array<WorkflowDefinition<unknown[], unknown>>,\n TQueues extends Array<QueueDefinition>,\n> extends WorkflowOperations<TWorkflows, TQueues> {\n // Executor-specific: runWorkflow overloads\n runWorkflow<\n TWorkflow extends WorkflowDefinition<any[], any> & { name: ExtractNames<TWorkflows> },\n TReturn = TWorkflow extends WorkflowDefinition<any[], infer R> ? R : never,\n >(\n wf: TWorkflow,\n ): Promise<Run<TReturn>>;\n\n runWorkflow<\n TWorkflow extends WorkflowDefinition<any[], any> & { name: ExtractNames<TWorkflows> },\n TReturn = TWorkflow extends WorkflowDefinition<any[], infer R> ? R : never,\n >(\n wf: TWorkflow,\n options: RunWorkflowOptions,\n ): Promise<Run<TReturn>>;\n\n runWorkflow<\n TWorkflow extends WorkflowDefinition<any[], any> & { name: ExtractNames<TWorkflows> },\n TArgs extends any[] = TWorkflow extends WorkflowDefinition<infer A extends unknown[], unknown>\n ? A\n : never,\n TReturn = TWorkflow extends WorkflowDefinition<any[], infer R> ? R : never,\n >(\n wf: TWorkflow,\n args: TArgs,\n options?: RunWorkflowOptions,\n ): Promise<Run<TReturn>>;\n}\n\nexport function createExecutor<\n TWorkflows extends Array<WorkflowDefinition<any[], any>>,\n TQueues extends Array<QueueDefinition>,\n>(props: createExecutorParams<TWorkflows, TQueues>): Executor<TWorkflows, TQueues> {\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 runEventBus = new RunEventBus(db);\n\n const workflowsMap = Object.fromEntries(props.workflows.map((w) => [w.name, w])) as Record<\n string,\n WorkflowDefinition<unknown[], unknown>\n >;\n\n const runtimeContext: RuntimeContext = {\n type: 'runtime',\n db,\n executorId,\n messageEventBus,\n stateEventBus,\n runRegistry,\n workflowsMap,\n queueRegistry: props.queues || [],\n runEventBus,\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[] = unknown[], TReturn = unknown>(\n wf: WorkflowSignature<TArgs, TReturn>,\n argsOrOptions?: TArgs | RunWorkflowOptions,\n options?: RunWorkflowOptions,\n ) => {\n await notifySetupPromise;\n let args, opts;\n if (argsOrOptions !== undefined) {\n if (Array.isArray(argsOrOptions)) {\n args = argsOrOptions;\n opts = options;\n } else {\n opts = argsOrOptions;\n }\n }\n return runWorkflow<TArgs, TReturn>(runtimeContext, wf.name, args, opts);\n },\n queueWorkflow: async (\n queue: QueueSignature,\n wf: WorkflowSignature<unknown[], unknown>,\n argsOrOptions?: unknown[] | QueueWorkflowOptions,\n options?: QueueWorkflowOptions,\n ) => {\n await notifySetupPromise;\n let args, opts;\n if (argsOrOptions !== undefined) {\n if (Array.isArray(argsOrOptions)) {\n args = argsOrOptions;\n opts = options;\n } else {\n opts = argsOrOptions;\n }\n }\n return queueWorkflow(runtimeContext, queue.name, wf.name, args, opts);\n },\n getRun: async (runId: string) => {\n await notifySetupPromise;\n return createRunHandle(runtimeContext, runId);\n },\n waitForRunResult: async (runId: string) => {\n await notifySetupPromise;\n return waitForRunResult(runtimeContext, runId);\n },\n cancelRun: async (runId: string) => cancelRun(runtimeContext, runId),\n resumeRun: async (runId: string) => resumeRun(runtimeContext, runId),\n getRunStatus: async (runId: string) => getRunStatus(runtimeContext, runId),\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>) => {\n await notifySetupPromise;\n return getState<T>(runtimeContext, target, key);\n },\n };\n}\n\nexport type Instance = ReturnType<typeof createExecutor>;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { createPgDriver } from '@internal/db/driver-pg';\nimport { MessageEventBus } from '@internal/events/message-event-bus';\nimport { StateEventBus } from '@internal/events/state-event-bus';\nimport { RunEventBus } from '@internal/events/run-event-bus';\nimport { ClientContext } from '@internal/context/client-context';\nimport { setupPostgresNotify } from '@internal/events/setup-postgres-notify';\nimport { cancelRun } from '@internal/cancel-run';\nimport { resumeRun } from '@internal/resume-run';\nimport { createRunHandle } from '../../internal/run';\nimport { getRunStatus } from '@internal/get-run-status';\nimport { waitForRunResult } from '@internal/wait-for-run-result';\nimport { queueWorkflow, QueueWorkflowOptions } from '@internal/queue-workflow';\nimport { MessageDefinition } from '@api/message';\nimport { sendMessage } from '@internal/send-message';\nimport { StateDefinition } from '@api/state';\nimport { getState } from '@internal/get-state';\nimport { WorkflowDefinition, WorkflowSignature } from '@api/workflow';\nimport { QueueDefinition, QueueSignature } from '@api/queue';\nimport { Executor, WorkflowOperations } from '../executor';\n\ntype ExtractWorkflows<T> = T extends Executor<infer W, any> ? W : never;\n\ntype ExtractQueues<T> = T extends Executor<any, infer Q> ? Q : never;\n\ntype QueuesProxy<TQueues extends Record<string, QueueDefinition>> = {\n [K in keyof TQueues]: {\n name: K;\n definition: TQueues[K];\n };\n};\n\ntype WorkflowsProxy<TWorkflows extends Record<string, WorkflowDefinition<unknown[], unknown>>> = {\n [K in keyof TWorkflows]: {\n name: K;\n definition: TWorkflows[K];\n };\n};\n\ninterface Client<\n TWorkflows extends Record<string, WorkflowDefinition<unknown[], unknown>>,\n TQueues extends Record<string, QueueDefinition>,\n> extends WorkflowOperations<ExtractWorkflows<TWorkflows>, ExtractQueues<TQueues>> {\n workflows: WorkflowsProxy<TWorkflows>;\n queues: QueuesProxy<TQueues>;\n}\n\ntype ClientOptions = {\n connectionString: string;\n};\n\nexport function createClient<TExecutor extends Executor<any, any>>(\n options: ClientOptions,\n): Client<ExtractWorkflows<TExecutor>, ExtractQueues<TExecutor>> {\n const { db, client } = createPgDriver({ connectionString: options.connectionString });\n const messageEventBus = new MessageEventBus(db);\n const stateEventBus = new StateEventBus(db);\n const runEventBus = new RunEventBus(db);\n\n const clientContext: ClientContext = {\n type: 'client',\n db,\n messageEventBus,\n stateEventBus,\n runEventBus,\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 workflows = new Proxy({} as any, {\n get(_target, prop: string) {\n return {\n name: prop,\n // Could include type metadata if needed\n };\n },\n });\n\n const queues = new Proxy({} as any, {\n get(_target, prop: string) {\n return {\n name: prop,\n // Could include type metadata if needed\n };\n },\n });\n\n return {\n workflows,\n queues,\n queueWorkflow: async <TArgs extends unknown[], TReturn>(\n queue: QueueSignature,\n wf: WorkflowSignature<TArgs, TReturn>,\n args?: TArgs,\n options?: QueueWorkflowOptions,\n ) => {\n await notifySetupPromise;\n return queueWorkflow<TArgs, TReturn>(clientContext, queue.name, wf.name, args, options);\n },\n cancelRun: async (runId: string) => cancelRun(clientContext, runId),\n resumeRun: async (runId: string) => resumeRun(clientContext, runId),\n getRun: async (runId: string) => {\n await notifySetupPromise;\n return createRunHandle(clientContext, runId);\n },\n getRunStatus: async (runId: string) => getRunStatus(clientContext, runId),\n waitForRunResult: async <TReturn>(runId: string) =>\n waitForRunResult<TReturn>(clientContext, runId),\n sendMessage: async <T>(runId: string, name: MessageDefinition<T>, data: T) => {\n await notifySetupPromise;\n return sendMessage(clientContext, runId, name, data);\n },\n getState: async <T>(runId: string, key: StateDefinition<T> | string) => {\n await notifySetupPromise;\n return getState<T>(clientContext, runId, key);\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
type QueueRateLimit = {
|
|
2
|
+
limitPerPeriod: number;
|
|
3
|
+
period: number;
|
|
4
|
+
};
|
|
5
|
+
type QueueOptions = {
|
|
6
|
+
workerConcurrency?: number;
|
|
7
|
+
concurrency?: number;
|
|
8
|
+
rateLimit?: QueueRateLimit;
|
|
9
|
+
priorityEnabled?: boolean;
|
|
10
|
+
partitioningEnabled?: boolean;
|
|
11
|
+
};
|
|
12
|
+
type QueueDefinition = QueueOptions & {
|
|
13
|
+
name: string;
|
|
14
|
+
};
|
|
15
|
+
type QueueSignature = {
|
|
16
|
+
name: string;
|
|
17
|
+
};
|
|
18
|
+
declare function defineQueue(name: string, options?: QueueOptions): QueueDefinition;
|
|
19
|
+
|
|
20
|
+
type RunStatus = 'pending' | 'queued' | 'success' | 'error' | 'cancelled' | 'max_recovery_attempts_exceeded';
|
|
21
|
+
declare const TERMINAL_STATES: RunStatus[];
|
|
22
|
+
type WorkflowFunction<Args extends unknown[], R> = (...args: Args) => Promise<R> | R;
|
|
23
|
+
type WorkflowSignature<TArgs extends unknown[] = unknown[], TReturn = unknown> = {
|
|
24
|
+
name: string;
|
|
25
|
+
__args?: TArgs;
|
|
26
|
+
__return?: TReturn;
|
|
27
|
+
};
|
|
28
|
+
type WorkflowDefinition<TArgs extends unknown[] = unknown[], TReturn = unknown> = {
|
|
29
|
+
name: string;
|
|
30
|
+
fn: WorkflowFunction<TArgs, TReturn>;
|
|
31
|
+
maxRecoveryAttempts?: number;
|
|
32
|
+
};
|
|
33
|
+
declare function defineWorkflow<TArgs extends unknown[], TReturn>(name: string, fn: WorkflowFunction<TArgs, TReturn>, options?: {
|
|
34
|
+
maxRecoveryAttempts?: number;
|
|
35
|
+
}): WorkflowDefinition<TArgs, TReturn>;
|
|
36
|
+
|
|
37
|
+
type MessageDefinition<T> = {
|
|
38
|
+
name: string;
|
|
39
|
+
__data?: T;
|
|
40
|
+
};
|
|
41
|
+
declare function defineMessage<T>(name: string): MessageDefinition<T>;
|
|
42
|
+
|
|
43
|
+
interface StateDefinition<T> {
|
|
44
|
+
name: string;
|
|
45
|
+
data?: T;
|
|
46
|
+
}
|
|
47
|
+
declare function defineState<T>(name: string): StateDefinition<T>;
|
|
48
|
+
|
|
49
|
+
export { type MessageDefinition as M, type QueueDefinition as Q, type RunStatus as R, type StateDefinition as S, TERMINAL_STATES as T, type WorkflowDefinition as W, type WorkflowSignature as a, type QueueOptions as b, type QueueRateLimit as c, type QueueSignature as d, type WorkflowFunction as e, defineMessage as f, defineQueue as g, defineState as h, defineWorkflow as i };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usehelical/workflows",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.16",
|
|
4
4
|
"description": "simple typesage durable workflows without magic",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
"import": "./dist/index.js",
|
|
11
11
|
"types": "./dist/index.d.ts"
|
|
12
12
|
},
|
|
13
|
-
"./
|
|
14
|
-
"types": "./dist/
|
|
15
|
-
"import": "./dist/
|
|
13
|
+
"./api": {
|
|
14
|
+
"types": "./dist/api.d.ts",
|
|
15
|
+
"import": "./dist/api.js"
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"typescript": "^5.9.3",
|
|
54
54
|
"typescript-eslint": "^8.54.0",
|
|
55
55
|
"uuid_ossp": "link:@electric-sql/pglite/contrib/uuid_ossp",
|
|
56
|
+
"vite-tsconfig-paths": "^6.1.0",
|
|
56
57
|
"vitest": "^4.0.17"
|
|
57
58
|
},
|
|
58
59
|
"dependencies": {
|