pg-workflows 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.entry.cjs +3 -11
- package/dist/client.entry.d.cts +15 -5
- package/dist/client.entry.d.ts +15 -5
- package/dist/client.entry.js +6 -2
- package/dist/client.entry.js.map +4 -4
- package/dist/index.cjs +34 -44
- package/dist/index.d.cts +6 -21
- package/dist/index.d.ts +6 -21
- package/dist/index.js +35 -36
- package/dist/index.js.map +8 -8
- package/dist/shared/{chunk-nygamc7b.js → chunk-ahxqsytt.js} +3 -13
- package/dist/shared/chunk-ahxqsytt.js.map +16 -0
- package/package.json +1 -1
- package/dist/shared/chunk-nygamc7b.js.map +0 -16
package/dist/client.entry.cjs
CHANGED
|
@@ -66,6 +66,8 @@ var exports_client_entry = {};
|
|
|
66
66
|
__export(exports_client_entry, {
|
|
67
67
|
createWorkflowRef: () => createWorkflowRef,
|
|
68
68
|
WorkflowStatus: () => WorkflowStatus,
|
|
69
|
+
WorkflowRunNotFoundError: () => WorkflowRunNotFoundError,
|
|
70
|
+
WorkflowEngineError: () => WorkflowEngineError,
|
|
69
71
|
WorkflowClient: () => WorkflowClient
|
|
70
72
|
});
|
|
71
73
|
module.exports = __toCommonJS(exports_client_entry);
|
|
@@ -535,16 +537,6 @@ var WorkflowStatus;
|
|
|
535
537
|
WorkflowStatus2["FAILED"] = "failed";
|
|
536
538
|
WorkflowStatus2["CANCELLED"] = "cancelled";
|
|
537
539
|
})(WorkflowStatus ||= {});
|
|
538
|
-
var StepType;
|
|
539
|
-
((StepType2) => {
|
|
540
|
-
StepType2["PAUSE"] = "pause";
|
|
541
|
-
StepType2["RUN"] = "run";
|
|
542
|
-
StepType2["WAIT_FOR"] = "waitFor";
|
|
543
|
-
StepType2["WAIT_UNTIL"] = "waitUntil";
|
|
544
|
-
StepType2["DELAY"] = "delay";
|
|
545
|
-
StepType2["POLL"] = "poll";
|
|
546
|
-
StepType2["INVOKE_CHILD_WORKFLOW"] = "invokeChildWorkflow";
|
|
547
|
-
})(StepType ||= {});
|
|
548
540
|
|
|
549
541
|
// src/client.ts
|
|
550
542
|
var LOG_PREFIX = "[WorkflowClient]";
|
|
@@ -885,5 +877,5 @@ function createWorkflowFactory(plugins = []) {
|
|
|
885
877
|
}
|
|
886
878
|
var workflow = createWorkflowFactory();
|
|
887
879
|
|
|
888
|
-
//# debugId=
|
|
880
|
+
//# debugId=AA7D4CB0B3AC99D364756E2164756E21
|
|
889
881
|
//# sourceMappingURL=client.entry.js.map
|
package/dist/client.entry.d.cts
CHANGED
|
@@ -43,7 +43,7 @@ declare enum WorkflowStatus {
|
|
|
43
43
|
}
|
|
44
44
|
type InputParameters = StandardSchemaV1;
|
|
45
45
|
type InferInputParameters<P extends InputParameters> = StandardSchemaV1.InferOutput<P>;
|
|
46
|
-
type
|
|
46
|
+
type StartWorkflowOptions = {
|
|
47
47
|
resourceId?: string;
|
|
48
48
|
timeout?: number;
|
|
49
49
|
retries?: number;
|
|
@@ -97,13 +97,13 @@ type StepBaseContext = {
|
|
|
97
97
|
<
|
|
98
98
|
TInput extends InputParameters,
|
|
99
99
|
TOutput = unknown
|
|
100
|
-
>(stepId: string, ref: WorkflowRef<TInput, TOutput>, input: InferInputParameters<TInput>, options?:
|
|
100
|
+
>(stepId: string, ref: WorkflowRef<TInput, TOutput>, input: InferInputParameters<TInput>, options?: StartWorkflowOptions): Promise<TOutput>;
|
|
101
101
|
<TOutput = unknown>(stepId: string, params: {
|
|
102
102
|
workflowId: string;
|
|
103
103
|
input: unknown;
|
|
104
104
|
resourceId?: string;
|
|
105
105
|
idempotencyKey?: string;
|
|
106
|
-
options?:
|
|
106
|
+
options?: StartWorkflowOptions;
|
|
107
107
|
}): Promise<TOutput>;
|
|
108
108
|
};
|
|
109
109
|
};
|
|
@@ -179,7 +179,6 @@ type WorkflowClientOptions = {
|
|
|
179
179
|
connectionString: string;
|
|
180
180
|
pool?: never;
|
|
181
181
|
});
|
|
182
|
-
type StartWorkflowOptions = WorkflowRunOptions;
|
|
183
182
|
declare class WorkflowClient {
|
|
184
183
|
private boss;
|
|
185
184
|
private db;
|
|
@@ -261,4 +260,15 @@ declare function createWorkflowRef<
|
|
|
261
260
|
>(id: string, options?: {
|
|
262
261
|
inputSchema?: TInput;
|
|
263
262
|
}): WorkflowRef<TInput, TOutput>;
|
|
264
|
-
|
|
263
|
+
import { StandardSchemaV1 as StandardSchemaV12 } from "@standard-schema/spec";
|
|
264
|
+
declare class WorkflowEngineError extends Error {
|
|
265
|
+
readonly workflowId?: string | undefined;
|
|
266
|
+
readonly runId?: string | undefined;
|
|
267
|
+
readonly cause: Error | undefined;
|
|
268
|
+
readonly issues?: StandardSchemaV12.FailureResult["issues"] | undefined;
|
|
269
|
+
constructor(message: string, workflowId?: string | undefined, runId?: string | undefined, cause?: Error | undefined, issues?: StandardSchemaV12.FailureResult["issues"] | undefined);
|
|
270
|
+
}
|
|
271
|
+
declare class WorkflowRunNotFoundError extends WorkflowEngineError {
|
|
272
|
+
constructor(runId?: string, workflowId?: string);
|
|
273
|
+
}
|
|
274
|
+
export { createWorkflowRef, WorkflowStatus, WorkflowRunProgress, WorkflowRunNotFoundError, WorkflowRun, WorkflowRef, WorkflowLogger, WorkflowEngineError, WorkflowClientOptions, WorkflowClient, StartWorkflowOptions, InputParameters, InferInputParameters };
|
package/dist/client.entry.d.ts
CHANGED
|
@@ -43,7 +43,7 @@ declare enum WorkflowStatus {
|
|
|
43
43
|
}
|
|
44
44
|
type InputParameters = StandardSchemaV1;
|
|
45
45
|
type InferInputParameters<P extends InputParameters> = StandardSchemaV1.InferOutput<P>;
|
|
46
|
-
type
|
|
46
|
+
type StartWorkflowOptions = {
|
|
47
47
|
resourceId?: string;
|
|
48
48
|
timeout?: number;
|
|
49
49
|
retries?: number;
|
|
@@ -97,13 +97,13 @@ type StepBaseContext = {
|
|
|
97
97
|
<
|
|
98
98
|
TInput extends InputParameters,
|
|
99
99
|
TOutput = unknown
|
|
100
|
-
>(stepId: string, ref: WorkflowRef<TInput, TOutput>, input: InferInputParameters<TInput>, options?:
|
|
100
|
+
>(stepId: string, ref: WorkflowRef<TInput, TOutput>, input: InferInputParameters<TInput>, options?: StartWorkflowOptions): Promise<TOutput>;
|
|
101
101
|
<TOutput = unknown>(stepId: string, params: {
|
|
102
102
|
workflowId: string;
|
|
103
103
|
input: unknown;
|
|
104
104
|
resourceId?: string;
|
|
105
105
|
idempotencyKey?: string;
|
|
106
|
-
options?:
|
|
106
|
+
options?: StartWorkflowOptions;
|
|
107
107
|
}): Promise<TOutput>;
|
|
108
108
|
};
|
|
109
109
|
};
|
|
@@ -179,7 +179,6 @@ type WorkflowClientOptions = {
|
|
|
179
179
|
connectionString: string;
|
|
180
180
|
pool?: never;
|
|
181
181
|
});
|
|
182
|
-
type StartWorkflowOptions = WorkflowRunOptions;
|
|
183
182
|
declare class WorkflowClient {
|
|
184
183
|
private boss;
|
|
185
184
|
private db;
|
|
@@ -261,4 +260,15 @@ declare function createWorkflowRef<
|
|
|
261
260
|
>(id: string, options?: {
|
|
262
261
|
inputSchema?: TInput;
|
|
263
262
|
}): WorkflowRef<TInput, TOutput>;
|
|
264
|
-
|
|
263
|
+
import { StandardSchemaV1 as StandardSchemaV12 } from "@standard-schema/spec";
|
|
264
|
+
declare class WorkflowEngineError extends Error {
|
|
265
|
+
readonly workflowId?: string | undefined;
|
|
266
|
+
readonly runId?: string | undefined;
|
|
267
|
+
readonly cause: Error | undefined;
|
|
268
|
+
readonly issues?: StandardSchemaV12.FailureResult["issues"] | undefined;
|
|
269
|
+
constructor(message: string, workflowId?: string | undefined, runId?: string | undefined, cause?: Error | undefined, issues?: StandardSchemaV12.FailureResult["issues"] | undefined);
|
|
270
|
+
}
|
|
271
|
+
declare class WorkflowRunNotFoundError extends WorkflowEngineError {
|
|
272
|
+
constructor(runId?: string, workflowId?: string);
|
|
273
|
+
}
|
|
274
|
+
export { createWorkflowRef, WorkflowStatus, WorkflowRunProgress, WorkflowRunNotFoundError, WorkflowRun, WorkflowRef, WorkflowLogger, WorkflowEngineError, WorkflowClientOptions, WorkflowClient, StartWorkflowOptions, InputParameters, InferInputParameters };
|
package/dist/client.entry.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
WorkflowClient,
|
|
3
|
+
WorkflowEngineError,
|
|
4
|
+
WorkflowRunNotFoundError,
|
|
3
5
|
WorkflowStatus,
|
|
4
6
|
createWorkflowRef
|
|
5
|
-
} from "./shared/chunk-
|
|
7
|
+
} from "./shared/chunk-ahxqsytt.js";
|
|
6
8
|
export {
|
|
7
9
|
createWorkflowRef,
|
|
8
10
|
WorkflowStatus,
|
|
11
|
+
WorkflowRunNotFoundError,
|
|
12
|
+
WorkflowEngineError,
|
|
9
13
|
WorkflowClient
|
|
10
14
|
};
|
|
11
15
|
|
|
12
|
-
//# debugId=
|
|
16
|
+
//# debugId=64DD8F1F4DBCBD8C64756E2164756E21
|
|
13
17
|
//# sourceMappingURL=client.entry.js.map
|
package/dist/client.entry.js.map
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["src/client.ts", "src/constants.ts", "src/db/migration.ts", "src/db/queries.ts", "src/error.ts", "src/types.ts", "src/definition.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { merge } from 'es-toolkit';\nimport pg from 'pg';\nimport { type Db, PgBoss } from 'pg-boss';\nimport {\n DEFAULT_PGBOSS_SCHEMA,\n invokeChildWorkflowTimelineKey,\n isInvokeChildWorkflowTimelineEntry,\n PAUSE_EVENT_NAME,\n WORKFLOW_RUN_QUEUE_NAME,\n waitForTimelineKey,\n} from './constants';\nimport { runMigrations } from './db/migration';\nimport {\n getWorkflowRun,\n getWorkflowRuns,\n insertWorkflowRun,\n updateWorkflowRun,\n withPostgresTransaction,\n} from './db/queries';\nimport type { WorkflowRun } from './db/types';\nimport {\n validateResourceId,\n validateWorkflowId,\n WorkflowEngineError,\n WorkflowRunNotFoundError,\n} from './error';\nimport {\n type InferInputParameters,\n type InputParameters,\n type WorkflowLogger,\n type WorkflowRef,\n type WorkflowRunOptions,\n type WorkflowRunProgress,\n WorkflowStatus,\n} from './types';\n\nconst LOG_PREFIX = '[WorkflowClient]';\n\ntype WorkflowRunJobParameters = {\n runId: string;\n resourceId?: string;\n workflowId: string;\n input: unknown;\n event?: {\n name: string;\n data?: Record<string, unknown>;\n };\n};\n\nexport type WorkflowClientOptions = {\n logger?: WorkflowLogger;\n /**\n * Pre-configured pg-boss instance. Pass this when the engine side uses a\n * non-default pg-boss config (schema, retention, logger, etc.) so the\n * client enqueues jobs where the engine reads them. Mirrors the same\n * option on `WorkflowEngineOptions`.\n */\n boss?: PgBoss;\n} & ({ pool: pg.Pool; connectionString?: never } | { connectionString: string; pool?: never });\n\nexport type StartWorkflowOptions = WorkflowRunOptions;\n\nconst defaultLogger: WorkflowLogger = {\n log: (_message: string) => console.warn(_message),\n error: (message: string, error: Error) => console.error(message, error),\n};\n\nconst defaultExpireInSeconds = process.env.WORKFLOW_RUN_EXPIRE_IN_SECONDS\n ? Number.parseInt(process.env.WORKFLOW_RUN_EXPIRE_IN_SECONDS, 10)\n : 5 * 60;\n\nexport class WorkflowClient {\n private boss: PgBoss;\n private db: Db;\n private pool: pg.Pool;\n private _ownsPool = false;\n private _started = false;\n private logger: WorkflowLogger;\n\n constructor({ logger, boss, ...connectionOptions }: WorkflowClientOptions) {\n this.logger = logger ?? defaultLogger;\n\n if ('pool' in connectionOptions && connectionOptions.pool) {\n this.pool = connectionOptions.pool;\n } else if ('connectionString' in connectionOptions && connectionOptions.connectionString) {\n this.pool = new pg.Pool({ connectionString: connectionOptions.connectionString });\n this._ownsPool = true;\n } else {\n throw new WorkflowEngineError('Either pool or connectionString must be provided');\n }\n\n const db: Db = {\n executeSql: (text: string, values?: unknown[]) =>\n this.pool.query(text, values) as Promise<{ rows: unknown[] }>,\n };\n\n if (boss) {\n this.boss = boss;\n } else {\n this.boss = new PgBoss({ db, schema: DEFAULT_PGBOSS_SCHEMA });\n }\n this.db = db;\n }\n\n async start(): Promise<void> {\n if (this._started) {\n return;\n }\n\n await this.boss.start();\n this.db = this.boss.getDb();\n await runMigrations(this.db);\n await this.boss.createQueue(WORKFLOW_RUN_QUEUE_NAME);\n\n this._started = true;\n this.logger.log(`${LOG_PREFIX} Client started`);\n }\n\n async stop(): Promise<void> {\n await this.boss.stop();\n\n if (this._ownsPool) {\n await this.pool.end();\n }\n\n this._started = false;\n this.logger.log(`${LOG_PREFIX} Client stopped`);\n }\n\n async startWorkflow<TInput extends InputParameters>(\n ref: WorkflowRef<TInput>,\n input: InferInputParameters<TInput>,\n options?: StartWorkflowOptions,\n ): Promise<WorkflowRun>;\n\n async startWorkflow(params: {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n }): Promise<WorkflowRun>;\n\n async startWorkflow<TInput extends InputParameters>(\n refOrParams:\n | WorkflowRef<TInput>\n | {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n },\n inputArg?: InferInputParameters<TInput>,\n optionsArg?: StartWorkflowOptions,\n ): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n let workflowId: string;\n let input: unknown;\n let resourceId: string | undefined;\n let idempotencyKey: string | undefined;\n let options: StartWorkflowOptions | undefined;\n\n if (typeof refOrParams === 'function' && 'id' in refOrParams) {\n const ref = refOrParams as WorkflowRef<TInput>;\n workflowId = ref.id;\n input = inputArg;\n options = optionsArg;\n resourceId = optionsArg?.resourceId;\n idempotencyKey = optionsArg?.idempotencyKey;\n\n if (ref.inputSchema) {\n const result = await ref.inputSchema['~standard'].validate(input);\n if (result.issues) {\n throw new WorkflowEngineError(\n JSON.stringify(result.issues),\n workflowId,\n undefined,\n undefined,\n result.issues,\n );\n }\n }\n } else {\n const params = refOrParams as {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n };\n workflowId = params.workflowId;\n input = params.input;\n resourceId = params.resourceId;\n idempotencyKey = params.idempotencyKey;\n options = params.options;\n }\n\n validateWorkflowId(workflowId);\n validateResourceId(resourceId);\n\n const run = await withPostgresTransaction(\n this.db,\n async (_db) => {\n const timeoutAt = options?.timeout ? new Date(Date.now() + options.timeout) : null;\n\n const { run: insertedRun, created } = await insertWorkflowRun(\n {\n resourceId,\n workflowId,\n currentStepId: '__start__',\n status: WorkflowStatus.RUNNING,\n input,\n maxRetries: options?.retries ?? 0,\n timeoutAt,\n idempotencyKey,\n },\n _db,\n );\n\n if (created) {\n const job: WorkflowRunJobParameters = {\n runId: insertedRun.id,\n resourceId,\n workflowId,\n input,\n };\n\n // Same connection (`_db`) used for the workflow_runs INSERT is passed\n // to `boss.send` so the pgboss.job INSERT joins the same transaction.\n // The two writes commit or roll back together, so we never leak an\n // orphan workflow_runs row when the queue insert fails.\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n startAfter: new Date(),\n expireInSeconds: options?.expireInSeconds ?? defaultExpireInSeconds,\n db: _db,\n });\n }\n\n return insertedRun;\n },\n this.pool,\n );\n\n this.logger.log(`${LOG_PREFIX} Started workflow run ${run.id} for ${workflowId}`);\n\n return run;\n }\n\n async triggerEvent({\n runId,\n resourceId,\n eventName,\n data,\n options,\n }: {\n runId: string;\n resourceId?: string;\n eventName: string;\n data?: Record<string, unknown>;\n options?: { expireInSeconds?: number };\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const run = await this.getRun({ runId, resourceId });\n\n const job: WorkflowRunJobParameters = {\n runId: run.id,\n resourceId: resourceId ?? run.resourceId ?? undefined,\n workflowId: run.workflowId,\n input: run.input,\n event: {\n name: eventName,\n data,\n },\n };\n\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n expireInSeconds: options?.expireInSeconds ?? defaultExpireInSeconds,\n });\n\n this.logger.log(`${LOG_PREFIX} Event ${eventName} sent for workflow run ${runId}`);\n return run;\n }\n\n async pauseWorkflow({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const run = await updateWorkflowRun(\n {\n runId,\n resourceId,\n data: {\n status: WorkflowStatus.PAUSED,\n pausedAt: new Date(),\n },\n expectedStatuses: [WorkflowStatus.RUNNING, WorkflowStatus.PENDING],\n },\n this.db,\n );\n\n if (!run) {\n throw new WorkflowRunNotFoundError(runId);\n }\n\n this.logger.log(`${LOG_PREFIX} Paused workflow run ${runId}`);\n return run;\n }\n\n async resumeWorkflow({\n runId,\n resourceId,\n options,\n }: {\n runId: string;\n resourceId?: string;\n options?: { expireInSeconds?: number };\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const current = await this.getRun({ runId, resourceId });\n if (current.status !== WorkflowStatus.PAUSED) {\n throw new WorkflowEngineError(\n `Cannot resume workflow run in '${current.status}' status, must be 'paused'`,\n current.workflowId,\n runId,\n );\n }\n\n const currentStepId = current.currentStepId;\n const currentStepTimelineEntry =\n current.timeline[invokeChildWorkflowTimelineKey(currentStepId)];\n if (isInvokeChildWorkflowTimelineEntry(currentStepTimelineEntry)) {\n return current;\n }\n\n return this.triggerEvent({\n runId,\n resourceId,\n eventName: PAUSE_EVENT_NAME,\n data: {},\n options,\n });\n }\n\n async fastForwardWorkflow({\n runId,\n resourceId,\n data,\n }: {\n runId: string;\n resourceId?: string;\n data?: Record<string, unknown>;\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const run = await this.getRun({ runId, resourceId });\n\n if (run.status !== WorkflowStatus.PAUSED) {\n return run;\n }\n\n const currentStepId = run.currentStepId;\n const currentStepTimelineEntry = run.timeline[invokeChildWorkflowTimelineKey(currentStepId)];\n if (isInvokeChildWorkflowTimelineEntry(currentStepTimelineEntry)) {\n return run;\n }\n\n const waitForEntry = run.timeline[waitForTimelineKey(currentStepId)];\n if (!waitForEntry || typeof waitForEntry !== 'object' || !('waitFor' in waitForEntry)) {\n return run;\n }\n\n const { eventName, timeoutEvent, skipOutput } = (\n waitForEntry as { waitFor: { eventName?: string; timeoutEvent?: string; skipOutput?: true } }\n ).waitFor;\n\n // step.pause() - delegate to resumeWorkflow\n if (eventName === PAUSE_EVENT_NAME) {\n return this.resumeWorkflow({ runId, resourceId });\n }\n\n // step.poll() - write output to timeline first, then trigger resume\n if (skipOutput && timeoutEvent) {\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await getWorkflowRun({ runId, resourceId }, { exclusiveLock: true, db });\n if (!freshRun) throw new WorkflowRunNotFoundError(runId);\n return updateWorkflowRun(\n {\n runId,\n resourceId,\n data: {\n timeline: merge(freshRun.timeline, {\n [currentStepId]: {\n output: data ?? {},\n timestamp: new Date(),\n },\n }),\n },\n },\n db,\n );\n },\n this.pool,\n );\n\n return this.triggerEvent({ runId, resourceId, eventName: timeoutEvent });\n }\n\n // waitFor steps - trigger the event with data\n if (eventName) {\n return this.triggerEvent({ runId, resourceId, eventName, data: data ?? {} });\n }\n\n // delay/waitUntil steps - trigger the timeout event\n if (timeoutEvent) {\n return this.triggerEvent({ runId, resourceId, eventName: timeoutEvent, data: data ?? {} });\n }\n\n return run;\n }\n\n async cancelWorkflow({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const run = await updateWorkflowRun(\n {\n runId,\n resourceId,\n data: {\n status: WorkflowStatus.CANCELLED,\n },\n expectedStatuses: [WorkflowStatus.PENDING, WorkflowStatus.RUNNING, WorkflowStatus.PAUSED],\n },\n this.db,\n );\n\n if (!run) {\n throw new WorkflowRunNotFoundError(runId);\n }\n\n this.logger.log(`${LOG_PREFIX} Cancelled workflow run ${runId}`);\n return run;\n }\n\n async getRun({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const run = await getWorkflowRun({ runId, resourceId }, { db: this.db });\n\n if (!run) {\n throw new WorkflowRunNotFoundError(runId);\n }\n\n return run;\n }\n\n async checkProgress({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRunProgress> {\n const run = await this.getRun({ runId, resourceId });\n\n const completedSteps = Object.values(run.timeline).filter(\n (entry): entry is { output: unknown; timestamp: Date } =>\n typeof entry === 'object' &&\n entry !== null &&\n 'output' in entry &&\n entry.output !== undefined,\n ).length;\n\n // Without registered workflow definitions, total steps are unknown.\n // Use completed steps as best-effort estimate for in-progress runs.\n const totalSteps = run.status === WorkflowStatus.COMPLETED ? completedSteps : 0;\n const completionPercentage =\n run.status === WorkflowStatus.COMPLETED\n ? 100\n : run.status === WorkflowStatus.FAILED || run.status === WorkflowStatus.CANCELLED\n ? 0\n : 0;\n\n return {\n ...run,\n completedSteps,\n completionPercentage,\n totalSteps,\n };\n }\n\n async getRuns({\n resourceId,\n startingAfter,\n endingBefore,\n limit = 20,\n statuses,\n workflowId,\n }: {\n resourceId?: string;\n startingAfter?: string | null;\n endingBefore?: string | null;\n limit?: number;\n statuses?: WorkflowStatus[];\n workflowId?: string;\n }): Promise<{\n items: WorkflowRun[];\n nextCursor: string | null;\n prevCursor: string | null;\n hasMore: boolean;\n hasPrev: boolean;\n }> {\n await this.ensureStarted();\n\n if (workflowId) validateWorkflowId(workflowId);\n validateResourceId(resourceId);\n\n return getWorkflowRuns(\n {\n resourceId,\n startingAfter,\n endingBefore,\n limit,\n statuses,\n workflowId,\n },\n this.db,\n );\n }\n\n private async ensureStarted(): Promise<void> {\n if (!this._started) {\n await this.start();\n }\n }\n}\n",
|
|
5
|
+
"import { merge } from 'es-toolkit';\nimport pg from 'pg';\nimport { type Db, PgBoss } from 'pg-boss';\nimport {\n DEFAULT_PGBOSS_SCHEMA,\n invokeChildWorkflowTimelineKey,\n isInvokeChildWorkflowTimelineEntry,\n PAUSE_EVENT_NAME,\n WORKFLOW_RUN_QUEUE_NAME,\n waitForTimelineKey,\n} from './constants';\nimport { runMigrations } from './db/migration';\nimport {\n getWorkflowRun,\n getWorkflowRuns,\n insertWorkflowRun,\n updateWorkflowRun,\n withPostgresTransaction,\n} from './db/queries';\nimport type { WorkflowRun } from './db/types';\nimport {\n validateResourceId,\n validateWorkflowId,\n WorkflowEngineError,\n WorkflowRunNotFoundError,\n} from './error';\nimport {\n type InferInputParameters,\n type InputParameters,\n type StartWorkflowOptions,\n type WorkflowLogger,\n type WorkflowRef,\n type WorkflowRunProgress,\n WorkflowStatus,\n} from './types';\n\nconst LOG_PREFIX = '[WorkflowClient]';\n\ntype WorkflowRunJobParameters = {\n runId: string;\n resourceId?: string;\n workflowId: string;\n input: unknown;\n event?: {\n name: string;\n data?: Record<string, unknown>;\n };\n};\n\nexport type WorkflowClientOptions = {\n logger?: WorkflowLogger;\n /**\n * Pre-configured pg-boss instance. Pass this when the engine side uses a\n * non-default pg-boss config (schema, retention, logger, etc.) so the\n * client enqueues jobs where the engine reads them. Mirrors the same\n * option on `WorkflowEngineOptions`.\n */\n boss?: PgBoss;\n} & ({ pool: pg.Pool; connectionString?: never } | { connectionString: string; pool?: never });\n\nconst defaultLogger: WorkflowLogger = {\n log: (_message: string) => console.warn(_message),\n error: (message: string, error: Error) => console.error(message, error),\n};\n\nconst defaultExpireInSeconds = process.env.WORKFLOW_RUN_EXPIRE_IN_SECONDS\n ? Number.parseInt(process.env.WORKFLOW_RUN_EXPIRE_IN_SECONDS, 10)\n : 5 * 60;\n\nexport class WorkflowClient {\n private boss: PgBoss;\n private db: Db;\n private pool: pg.Pool;\n private _ownsPool = false;\n private _started = false;\n private logger: WorkflowLogger;\n\n constructor({ logger, boss, ...connectionOptions }: WorkflowClientOptions) {\n this.logger = logger ?? defaultLogger;\n\n if ('pool' in connectionOptions && connectionOptions.pool) {\n this.pool = connectionOptions.pool;\n } else if ('connectionString' in connectionOptions && connectionOptions.connectionString) {\n this.pool = new pg.Pool({ connectionString: connectionOptions.connectionString });\n this._ownsPool = true;\n } else {\n throw new WorkflowEngineError('Either pool or connectionString must be provided');\n }\n\n const db: Db = {\n executeSql: (text: string, values?: unknown[]) =>\n this.pool.query(text, values) as Promise<{ rows: unknown[] }>,\n };\n\n if (boss) {\n this.boss = boss;\n } else {\n this.boss = new PgBoss({ db, schema: DEFAULT_PGBOSS_SCHEMA });\n }\n this.db = db;\n }\n\n async start(): Promise<void> {\n if (this._started) {\n return;\n }\n\n await this.boss.start();\n this.db = this.boss.getDb();\n await runMigrations(this.db);\n await this.boss.createQueue(WORKFLOW_RUN_QUEUE_NAME);\n\n this._started = true;\n this.logger.log(`${LOG_PREFIX} Client started`);\n }\n\n async stop(): Promise<void> {\n await this.boss.stop();\n\n if (this._ownsPool) {\n await this.pool.end();\n }\n\n this._started = false;\n this.logger.log(`${LOG_PREFIX} Client stopped`);\n }\n\n async startWorkflow<TInput extends InputParameters>(\n ref: WorkflowRef<TInput>,\n input: InferInputParameters<TInput>,\n options?: StartWorkflowOptions,\n ): Promise<WorkflowRun>;\n\n async startWorkflow(params: {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n }): Promise<WorkflowRun>;\n\n async startWorkflow<TInput extends InputParameters>(\n refOrParams:\n | WorkflowRef<TInput>\n | {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n },\n inputArg?: InferInputParameters<TInput>,\n optionsArg?: StartWorkflowOptions,\n ): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n let workflowId: string;\n let input: unknown;\n let resourceId: string | undefined;\n let idempotencyKey: string | undefined;\n let options: StartWorkflowOptions | undefined;\n\n if (typeof refOrParams === 'function' && 'id' in refOrParams) {\n const ref = refOrParams as WorkflowRef<TInput>;\n workflowId = ref.id;\n input = inputArg;\n options = optionsArg;\n resourceId = optionsArg?.resourceId;\n idempotencyKey = optionsArg?.idempotencyKey;\n\n if (ref.inputSchema) {\n const result = await ref.inputSchema['~standard'].validate(input);\n if (result.issues) {\n throw new WorkflowEngineError(\n JSON.stringify(result.issues),\n workflowId,\n undefined,\n undefined,\n result.issues,\n );\n }\n }\n } else {\n const params = refOrParams as {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n };\n workflowId = params.workflowId;\n input = params.input;\n resourceId = params.resourceId;\n idempotencyKey = params.idempotencyKey;\n options = params.options;\n }\n\n validateWorkflowId(workflowId);\n validateResourceId(resourceId);\n\n const run = await withPostgresTransaction(\n this.db,\n async (_db) => {\n const timeoutAt = options?.timeout ? new Date(Date.now() + options.timeout) : null;\n\n const { run: insertedRun, created } = await insertWorkflowRun(\n {\n resourceId,\n workflowId,\n currentStepId: '__start__',\n status: WorkflowStatus.RUNNING,\n input,\n maxRetries: options?.retries ?? 0,\n timeoutAt,\n idempotencyKey,\n },\n _db,\n );\n\n if (created) {\n const job: WorkflowRunJobParameters = {\n runId: insertedRun.id,\n resourceId,\n workflowId,\n input,\n };\n\n // Same connection (`_db`) used for the workflow_runs INSERT is passed\n // to `boss.send` so the pgboss.job INSERT joins the same transaction.\n // The two writes commit or roll back together, so we never leak an\n // orphan workflow_runs row when the queue insert fails.\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n startAfter: new Date(),\n expireInSeconds: options?.expireInSeconds ?? defaultExpireInSeconds,\n db: _db,\n });\n }\n\n return insertedRun;\n },\n this.pool,\n );\n\n this.logger.log(`${LOG_PREFIX} Started workflow run ${run.id} for ${workflowId}`);\n\n return run;\n }\n\n async triggerEvent({\n runId,\n resourceId,\n eventName,\n data,\n options,\n }: {\n runId: string;\n resourceId?: string;\n eventName: string;\n data?: Record<string, unknown>;\n options?: { expireInSeconds?: number };\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const run = await this.getRun({ runId, resourceId });\n\n const job: WorkflowRunJobParameters = {\n runId: run.id,\n resourceId: resourceId ?? run.resourceId ?? undefined,\n workflowId: run.workflowId,\n input: run.input,\n event: {\n name: eventName,\n data,\n },\n };\n\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n expireInSeconds: options?.expireInSeconds ?? defaultExpireInSeconds,\n });\n\n this.logger.log(`${LOG_PREFIX} Event ${eventName} sent for workflow run ${runId}`);\n return run;\n }\n\n async pauseWorkflow({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const run = await updateWorkflowRun(\n {\n runId,\n resourceId,\n data: {\n status: WorkflowStatus.PAUSED,\n pausedAt: new Date(),\n },\n expectedStatuses: [WorkflowStatus.RUNNING, WorkflowStatus.PENDING],\n },\n this.db,\n );\n\n if (!run) {\n throw new WorkflowRunNotFoundError(runId);\n }\n\n this.logger.log(`${LOG_PREFIX} Paused workflow run ${runId}`);\n return run;\n }\n\n async resumeWorkflow({\n runId,\n resourceId,\n options,\n }: {\n runId: string;\n resourceId?: string;\n options?: { expireInSeconds?: number };\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const current = await this.getRun({ runId, resourceId });\n if (current.status !== WorkflowStatus.PAUSED) {\n throw new WorkflowEngineError(\n `Cannot resume workflow run in '${current.status}' status, must be 'paused'`,\n current.workflowId,\n runId,\n );\n }\n\n const currentStepId = current.currentStepId;\n const currentStepTimelineEntry =\n current.timeline[invokeChildWorkflowTimelineKey(currentStepId)];\n if (isInvokeChildWorkflowTimelineEntry(currentStepTimelineEntry)) {\n return current;\n }\n\n return this.triggerEvent({\n runId,\n resourceId,\n eventName: PAUSE_EVENT_NAME,\n data: {},\n options,\n });\n }\n\n async fastForwardWorkflow({\n runId,\n resourceId,\n data,\n }: {\n runId: string;\n resourceId?: string;\n data?: Record<string, unknown>;\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const run = await this.getRun({ runId, resourceId });\n\n if (run.status !== WorkflowStatus.PAUSED) {\n return run;\n }\n\n const currentStepId = run.currentStepId;\n const currentStepTimelineEntry = run.timeline[invokeChildWorkflowTimelineKey(currentStepId)];\n if (isInvokeChildWorkflowTimelineEntry(currentStepTimelineEntry)) {\n return run;\n }\n\n const waitForEntry = run.timeline[waitForTimelineKey(currentStepId)];\n if (!waitForEntry || typeof waitForEntry !== 'object' || !('waitFor' in waitForEntry)) {\n return run;\n }\n\n const { eventName, timeoutEvent, skipOutput } = (\n waitForEntry as { waitFor: { eventName?: string; timeoutEvent?: string; skipOutput?: true } }\n ).waitFor;\n\n // step.pause() - delegate to resumeWorkflow\n if (eventName === PAUSE_EVENT_NAME) {\n return this.resumeWorkflow({ runId, resourceId });\n }\n\n // step.poll() - write output to timeline first, then trigger resume\n if (skipOutput && timeoutEvent) {\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await getWorkflowRun({ runId, resourceId }, { exclusiveLock: true, db });\n if (!freshRun) throw new WorkflowRunNotFoundError(runId);\n return updateWorkflowRun(\n {\n runId,\n resourceId,\n data: {\n timeline: merge(freshRun.timeline, {\n [currentStepId]: {\n output: data ?? {},\n timestamp: new Date(),\n },\n }),\n },\n },\n db,\n );\n },\n this.pool,\n );\n\n return this.triggerEvent({ runId, resourceId, eventName: timeoutEvent });\n }\n\n // waitFor steps - trigger the event with data\n if (eventName) {\n return this.triggerEvent({ runId, resourceId, eventName, data: data ?? {} });\n }\n\n // delay/waitUntil steps - trigger the timeout event\n if (timeoutEvent) {\n return this.triggerEvent({ runId, resourceId, eventName: timeoutEvent, data: data ?? {} });\n }\n\n return run;\n }\n\n async cancelWorkflow({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const run = await updateWorkflowRun(\n {\n runId,\n resourceId,\n data: {\n status: WorkflowStatus.CANCELLED,\n },\n expectedStatuses: [WorkflowStatus.PENDING, WorkflowStatus.RUNNING, WorkflowStatus.PAUSED],\n },\n this.db,\n );\n\n if (!run) {\n throw new WorkflowRunNotFoundError(runId);\n }\n\n this.logger.log(`${LOG_PREFIX} Cancelled workflow run ${runId}`);\n return run;\n }\n\n async getRun({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRun> {\n await this.ensureStarted();\n\n const run = await getWorkflowRun({ runId, resourceId }, { db: this.db });\n\n if (!run) {\n throw new WorkflowRunNotFoundError(runId);\n }\n\n return run;\n }\n\n async checkProgress({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRunProgress> {\n const run = await this.getRun({ runId, resourceId });\n\n const completedSteps = Object.values(run.timeline).filter(\n (entry): entry is { output: unknown; timestamp: Date } =>\n typeof entry === 'object' &&\n entry !== null &&\n 'output' in entry &&\n entry.output !== undefined,\n ).length;\n\n // Without registered workflow definitions, total steps are unknown.\n // Use completed steps as best-effort estimate for in-progress runs.\n const totalSteps = run.status === WorkflowStatus.COMPLETED ? completedSteps : 0;\n const completionPercentage =\n run.status === WorkflowStatus.COMPLETED\n ? 100\n : run.status === WorkflowStatus.FAILED || run.status === WorkflowStatus.CANCELLED\n ? 0\n : 0;\n\n return {\n ...run,\n completedSteps,\n completionPercentage,\n totalSteps,\n };\n }\n\n async getRuns({\n resourceId,\n startingAfter,\n endingBefore,\n limit = 20,\n statuses,\n workflowId,\n }: {\n resourceId?: string;\n startingAfter?: string | null;\n endingBefore?: string | null;\n limit?: number;\n statuses?: WorkflowStatus[];\n workflowId?: string;\n }): Promise<{\n items: WorkflowRun[];\n nextCursor: string | null;\n prevCursor: string | null;\n hasMore: boolean;\n hasPrev: boolean;\n }> {\n await this.ensureStarted();\n\n if (workflowId) validateWorkflowId(workflowId);\n validateResourceId(resourceId);\n\n return getWorkflowRuns(\n {\n resourceId,\n startingAfter,\n endingBefore,\n limit,\n statuses,\n workflowId,\n },\n this.db,\n );\n }\n\n private async ensureStarted(): Promise<void> {\n if (!this._started) {\n await this.start();\n }\n }\n}\n",
|
|
6
6
|
"export const PAUSE_EVENT_NAME = '__internal_pause';\nexport const WORKFLOW_RUN_QUEUE_NAME = 'workflow-run';\nexport const WORKFLOW_RUN_DLQ_QUEUE_NAME = 'workflow_run_dlq';\nexport const DEFAULT_PGBOSS_SCHEMA = 'pgboss_v12_pgworkflow';\nexport const MAX_WORKFLOW_ID_LENGTH = 256;\nexport const MAX_RESOURCE_ID_LENGTH = 256;\n\n// Per-step timeline key suffixes. The shared helpers below are the single\n// source of truth for engine + client so timeline-shape changes only need to\n// happen in one place.\nexport const INVOKE_CHILD_WORKFLOW_TIMELINE_SUFFIX = 'invoke-child-workflow';\nexport const WAIT_FOR_TIMELINE_SUFFIX = 'wait-for';\nexport const invokeChildWorkflowTimelineKey = (stepId: string) =>\n `${stepId}-${INVOKE_CHILD_WORKFLOW_TIMELINE_SUFFIX}`;\nexport const waitForTimelineKey = (stepId: string) => `${stepId}-${WAIT_FOR_TIMELINE_SUFFIX}`;\n\n/**\n * Type guard for `${stepId}-invoke-child-workflow` timeline entries. Used by the\n * engine to dispatch invoke-aware behavior and by the client's resume /\n * fast-forward no-op guards. Centralizing this keeps the timeline shape\n * contract in one place.\n */\nexport const isInvokeChildWorkflowTimelineEntry = (\n entry: unknown,\n): entry is { invokeChildWorkflow: { childRunId: string; childWorkflowId: string } } =>\n !!entry && typeof entry === 'object' && 'invokeChildWorkflow' in entry;\n",
|
|
7
7
|
"import type { Db } from 'pg-boss';\n\n// Arbitrary but stable lock ID for serializing migrations across processes\nexport const MIGRATION_LOCK_ID = 738291645;\n\n// Bump this when adding new migrations. The engine stores the current version\n// in a `workflow_schema_version` table so migrations only run once per version.\nconst CURRENT_SCHEMA_VERSION = 4;\n\nexport async function runMigrations(db: Db): Promise<void> {\n // Fast path: skip the advisory lock if schema is already current.\n // This is the common case - every engine.start() after initial setup.\n if (await isSchemaUpToDate(db)) {\n return;\n }\n\n // Slow path: build migration SQL based on current version, then execute\n // everything in a single transaction with an advisory lock.\n // This mirrors pg-boss's approach: one executeSql call ensures all DDL\n // runs on a single connection inside BEGIN/COMMIT, and pg_advisory_xact_lock\n // auto-releases on commit or rollback (no manual unlock needed).\n const currentVersion = await getCurrentVersion(db);\n\n const commands: string[] = [];\n\n if (currentVersion < 1) {\n commands.push(`\n CREATE TABLE IF NOT EXISTS workflow_runs (\n id varchar(32) PRIMARY KEY NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n resource_id varchar(256),\n workflow_id varchar(256) NOT NULL,\n status text DEFAULT 'pending' NOT NULL,\n input jsonb NOT NULL,\n output jsonb,\n error text,\n current_step_id varchar(256) NOT NULL,\n timeline jsonb DEFAULT '{}'::jsonb NOT NULL,\n paused_at timestamp with time zone,\n resumed_at timestamp with time zone,\n completed_at timestamp with time zone,\n timeout_at timestamp with time zone,\n retry_count integer DEFAULT 0 NOT NULL,\n max_retries integer DEFAULT 0 NOT NULL,\n job_id varchar(256)\n )\n `);\n commands.push(`\n CREATE INDEX IF NOT EXISTS workflow_runs_created_at_idx ON workflow_runs USING btree (created_at)\n `);\n commands.push(`\n CREATE INDEX IF NOT EXISTS workflow_runs_resource_id_created_at_idx ON workflow_runs USING btree (resource_id, created_at DESC)\n `);\n commands.push(`\n CREATE INDEX IF NOT EXISTS workflow_runs_status_created_at_idx ON workflow_runs USING btree (status, created_at DESC)\n `);\n commands.push(`\n CREATE INDEX IF NOT EXISTS workflow_runs_workflow_id_created_at_idx ON workflow_runs USING btree (workflow_id, created_at DESC)\n `);\n commands.push(`\n CREATE INDEX IF NOT EXISTS workflow_runs_resource_id_workflow_id_created_at_idx ON workflow_runs USING btree (resource_id, workflow_id, created_at DESC)\n `);\n }\n\n if (currentVersion < 2) {\n commands.push('DROP INDEX IF EXISTS workflow_runs_workflow_id_idx');\n commands.push('DROP INDEX IF EXISTS workflow_runs_resource_id_idx');\n commands.push(\n 'ALTER TABLE workflow_runs ADD COLUMN IF NOT EXISTS idempotency_key varchar(256)',\n );\n commands.push(`\n CREATE UNIQUE INDEX IF NOT EXISTS workflow_runs_idempotency_key_idx ON workflow_runs (idempotency_key) WHERE idempotency_key IS NOT NULL\n `);\n }\n\n if (currentVersion < 3) {\n commands.push('ALTER TABLE workflow_runs ALTER COLUMN resource_id TYPE varchar(256)');\n commands.push('ALTER TABLE workflow_runs ALTER COLUMN workflow_id TYPE varchar(256)');\n }\n\n if (currentVersion < 4) {\n commands.push('ALTER TABLE workflow_runs ADD COLUMN IF NOT EXISTS parent_run_id varchar(32)');\n commands.push('ALTER TABLE workflow_runs ADD COLUMN IF NOT EXISTS parent_step_id varchar(256)');\n commands.push(\n 'ALTER TABLE workflow_runs ADD COLUMN IF NOT EXISTS parent_resource_id varchar(256)',\n );\n }\n\n // Upsert the schema version\n if (currentVersion === 0) {\n commands.push(\n `INSERT INTO workflow_schema_version (version) VALUES (${CURRENT_SCHEMA_VERSION})`,\n );\n } else {\n commands.push(`UPDATE workflow_schema_version SET version = ${CURRENT_SCHEMA_VERSION}`);\n }\n\n if (commands.length === 0) {\n return;\n }\n\n const sql = [\n 'BEGIN',\n \"SET LOCAL lock_timeout = '30s'\",\n \"SET LOCAL idle_in_transaction_session_timeout = '30s'\",\n `SELECT pg_advisory_xact_lock(${MIGRATION_LOCK_ID})`,\n 'CREATE TABLE IF NOT EXISTS workflow_schema_version (version integer NOT NULL)',\n ...commands,\n 'COMMIT',\n ].join(';\\n');\n\n await db.executeSql(sql, []);\n}\n\nasync function isSchemaUpToDate(db: Db): Promise<boolean> {\n try {\n const result = await db.executeSql('SELECT version FROM workflow_schema_version LIMIT 1', []);\n return (\n ((result.rows[0] as { version: number } | undefined)?.version ?? 0) >= CURRENT_SCHEMA_VERSION\n );\n } catch {\n // Table doesn't exist yet - needs migration\n return false;\n }\n}\n\nasync function getCurrentVersion(db: Db): Promise<number> {\n try {\n const result = await db.executeSql('SELECT version FROM workflow_schema_version LIMIT 1', []);\n return (result.rows[0] as { version: number } | undefined)?.version ?? 0;\n } catch {\n return 0;\n }\n}\n",
|
|
8
8
|
"import ksuid from 'ksuid';\nimport type { Db } from 'pg-boss';\nimport type { WorkflowRun } from './types';\n\nexport function generateKSUID(prefix?: string): string {\n return `${prefix ? `${prefix}_` : ''}${ksuid.randomSync().string}`;\n}\n\ntype WorkflowRunRow = {\n id: string;\n created_at: string | Date;\n updated_at: string | Date;\n resource_id: string | null;\n workflow_id: string;\n status: 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled';\n input: string | unknown;\n output: string | unknown | null;\n error: string | null;\n current_step_id: string;\n timeline: string | Record<string, unknown>;\n paused_at: string | Date | null;\n resumed_at: string | Date | null;\n completed_at: string | Date | null;\n timeout_at: string | Date | null;\n retry_count: number;\n max_retries: number;\n job_id: string | null;\n idempotency_key: string | null;\n parent_run_id: string | null;\n parent_step_id: string | null;\n parent_resource_id: string | null;\n};\n\nfunction mapRowToWorkflowRun(row: WorkflowRunRow): WorkflowRun {\n return {\n id: row.id,\n createdAt: new Date(row.created_at),\n updatedAt: new Date(row.updated_at),\n resourceId: row.resource_id,\n workflowId: row.workflow_id,\n status: row.status,\n input: typeof row.input === 'string' ? JSON.parse(row.input) : row.input,\n output:\n typeof row.output === 'string'\n ? row.output.trim().startsWith('{') || row.output.trim().startsWith('[')\n ? JSON.parse(row.output)\n : row.output\n : (row.output ?? null),\n error: row.error,\n currentStepId: row.current_step_id,\n timeline: typeof row.timeline === 'string' ? JSON.parse(row.timeline) : row.timeline,\n pausedAt: row.paused_at ? new Date(row.paused_at) : null,\n resumedAt: row.resumed_at ? new Date(row.resumed_at) : null,\n completedAt: row.completed_at ? new Date(row.completed_at) : null,\n timeoutAt: row.timeout_at ? new Date(row.timeout_at) : null,\n retryCount: row.retry_count,\n maxRetries: row.max_retries,\n jobId: row.job_id,\n idempotencyKey: row.idempotency_key,\n parentRunId: row.parent_run_id,\n parentStepId: row.parent_step_id,\n parentResourceId: row.parent_resource_id,\n };\n}\n\nexport async function insertWorkflowRun(\n {\n resourceId,\n workflowId,\n currentStepId,\n status,\n input,\n maxRetries,\n timeoutAt,\n idempotencyKey,\n parentRunId,\n parentStepId,\n parentResourceId,\n }: {\n resourceId?: string;\n workflowId: string;\n currentStepId: string;\n status: string;\n input: unknown;\n maxRetries: number;\n timeoutAt: Date | null;\n idempotencyKey?: string;\n parentRunId?: string;\n parentStepId?: string;\n parentResourceId?: string;\n },\n db: Db,\n): Promise<{ run: WorkflowRun; created: boolean }> {\n const runId = generateKSUID('run');\n const now = new Date();\n\n const result = await db.executeSql(\n `INSERT INTO workflow_runs (\n id,\n resource_id,\n workflow_id,\n current_step_id,\n status,\n input,\n max_retries,\n timeout_at,\n created_at,\n updated_at,\n timeline,\n retry_count,\n idempotency_key,\n parent_run_id,\n parent_step_id,\n parent_resource_id\n )\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)\n ON CONFLICT (idempotency_key) WHERE idempotency_key IS NOT NULL DO NOTHING\n RETURNING *`,\n [\n runId,\n resourceId ?? null,\n workflowId,\n currentStepId,\n status,\n JSON.stringify(input),\n maxRetries,\n timeoutAt,\n now,\n now,\n '{}',\n 0,\n idempotencyKey ?? null,\n parentRunId ?? null,\n parentStepId ?? null,\n parentResourceId ?? null,\n ],\n );\n\n if (result.rows[0]) {\n return { run: mapRowToWorkflowRun(result.rows[0]), created: true };\n }\n\n // Conflict - fetch the existing row\n const existing = await db.executeSql('SELECT * FROM workflow_runs WHERE idempotency_key = $1', [\n idempotencyKey,\n ]);\n\n if (!existing.rows[0]) {\n throw new Error(`Idempotency conflict: existing run not found for key \"${idempotencyKey}\"`);\n }\n\n return { run: mapRowToWorkflowRun(existing.rows[0]), created: false };\n}\n\nexport async function getWorkflowRun(\n {\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n },\n { exclusiveLock = false, db }: { exclusiveLock?: boolean; db: Db },\n): Promise<WorkflowRun | null> {\n const lockSuffix = exclusiveLock ? 'FOR UPDATE' : '';\n\n const result = resourceId\n ? await db.executeSql(\n `SELECT * FROM workflow_runs \n WHERE id = $1 AND resource_id = $2\n ${lockSuffix}`,\n [runId, resourceId],\n )\n : await db.executeSql(\n `SELECT * FROM workflow_runs \n WHERE id = $1\n ${lockSuffix}`,\n [runId],\n );\n\n const run = result.rows[0];\n\n if (!run) {\n return null;\n }\n\n return mapRowToWorkflowRun(run);\n}\n\nexport async function updateWorkflowRun(\n {\n runId,\n resourceId,\n data,\n expectedStatuses,\n }: {\n runId: string;\n resourceId?: string;\n data: Partial<WorkflowRun>;\n expectedStatuses?: string[];\n },\n db: Db,\n): Promise<WorkflowRun | null> {\n const now = new Date();\n\n const updates: string[] = ['updated_at = $1'];\n const values: (string | number | Date | null | string[])[] = [now];\n let paramIndex = 2;\n\n if (data.status !== undefined) {\n updates.push(`status = $${paramIndex}`);\n values.push(data.status);\n paramIndex++;\n }\n if (data.currentStepId !== undefined) {\n updates.push(`current_step_id = $${paramIndex}`);\n values.push(data.currentStepId);\n paramIndex++;\n }\n if (data.timeline !== undefined) {\n updates.push(`timeline = $${paramIndex}`);\n values.push(JSON.stringify(data.timeline));\n paramIndex++;\n }\n if (data.pausedAt !== undefined) {\n updates.push(`paused_at = $${paramIndex}`);\n values.push(data.pausedAt);\n paramIndex++;\n }\n if (data.resumedAt !== undefined) {\n updates.push(`resumed_at = $${paramIndex}`);\n values.push(data.resumedAt);\n paramIndex++;\n }\n if (data.completedAt !== undefined) {\n updates.push(`completed_at = $${paramIndex}`);\n values.push(data.completedAt);\n paramIndex++;\n }\n if (data.output !== undefined) {\n updates.push(`output = $${paramIndex}`);\n values.push(JSON.stringify(data.output));\n paramIndex++;\n }\n if (data.error !== undefined) {\n updates.push(`error = $${paramIndex}`);\n values.push(data.error);\n paramIndex++;\n }\n if (data.retryCount !== undefined) {\n updates.push(`retry_count = $${paramIndex}`);\n values.push(data.retryCount);\n paramIndex++;\n }\n if (data.jobId !== undefined) {\n updates.push(`job_id = $${paramIndex}`);\n values.push(data.jobId);\n paramIndex++;\n }\n\n values.push(runId);\n const idParam = paramIndex;\n paramIndex++;\n\n if (resourceId) {\n values.push(resourceId);\n paramIndex++;\n }\n\n if (expectedStatuses && expectedStatuses.length > 0) {\n values.push(expectedStatuses);\n paramIndex++;\n }\n\n let whereClause = resourceId\n ? `WHERE id = $${idParam} AND resource_id = $${idParam + 1}`\n : `WHERE id = $${idParam}`;\n\n if (expectedStatuses && expectedStatuses.length > 0) {\n whereClause += ` AND status = ANY($${paramIndex - 1})`;\n }\n\n const query = `\n UPDATE workflow_runs \n SET ${updates.join(', ')}\n ${whereClause}\n RETURNING *\n `;\n\n const result = await db.executeSql(query, values);\n const run = result.rows[0];\n\n if (!run) {\n return null;\n }\n\n return mapRowToWorkflowRun(run);\n}\n\nexport async function getWorkflowRuns(\n {\n resourceId,\n startingAfter,\n endingBefore,\n limit = 20,\n statuses,\n workflowId,\n }: {\n resourceId?: string;\n startingAfter?: string | null;\n endingBefore?: string | null;\n limit?: number;\n statuses?: string[];\n workflowId?: string;\n },\n db: Db,\n): Promise<{\n items: WorkflowRun[];\n nextCursor: string | null;\n prevCursor: string | null;\n hasMore: boolean;\n hasPrev: boolean;\n}> {\n const conditions: string[] = [];\n const values: (string | number | string[] | Date)[] = [];\n let paramIndex = 1;\n\n if (resourceId) {\n conditions.push(`resource_id = $${paramIndex}`);\n values.push(resourceId);\n paramIndex++;\n }\n\n if (statuses && statuses.length > 0) {\n conditions.push(`status = ANY($${paramIndex})`);\n values.push(statuses);\n paramIndex++;\n }\n\n if (workflowId) {\n conditions.push(`workflow_id = $${paramIndex}`);\n values.push(workflowId);\n paramIndex++;\n }\n\n const cursorIds = [startingAfter, endingBefore].filter(Boolean) as string[];\n if (cursorIds.length > 0) {\n const cursorResult = await db.executeSql(\n 'SELECT id, created_at FROM workflow_runs WHERE id = ANY($1)',\n [cursorIds],\n );\n const cursorMap = new Map<string, Date>();\n for (const row of cursorResult.rows) {\n cursorMap.set(\n row.id,\n typeof row.created_at === 'string' ? new Date(row.created_at) : row.created_at,\n );\n }\n\n if (startingAfter) {\n const cursor = cursorMap.get(startingAfter);\n if (cursor) {\n conditions.push(`created_at < $${paramIndex}`);\n values.push(cursor);\n paramIndex++;\n }\n }\n\n if (endingBefore) {\n const cursor = cursorMap.get(endingBefore);\n if (cursor) {\n conditions.push(`created_at > $${paramIndex}`);\n values.push(cursor);\n paramIndex++;\n }\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const actualLimit = Math.min(Math.max(limit, 1), 100) + 1;\n\n const isBackward = !!endingBefore && !startingAfter;\n\n const query = `\n SELECT * FROM workflow_runs\n ${whereClause}\n ORDER BY created_at ${isBackward ? 'ASC' : 'DESC'}\n LIMIT $${paramIndex}\n `;\n values.push(actualLimit);\n\n const result = await db.executeSql(query, values);\n const rows = result.rows;\n\n const hasExtraRow = rows.length > (limit ?? 20);\n const rawItems = hasExtraRow ? rows.slice(0, limit) : rows;\n\n if (isBackward) {\n rawItems.reverse();\n }\n\n const items = rawItems.map((row) => mapRowToWorkflowRun(row));\n\n const hasMore = isBackward ? items.length > 0 : hasExtraRow;\n const hasPrev = isBackward ? hasExtraRow : !!startingAfter && items.length > 0;\n\n const nextCursor = hasMore && items.length > 0 ? (items[items.length - 1]?.id ?? null) : null;\n const prevCursor = hasPrev && items.length > 0 ? (items[0]?.id ?? null) : null;\n\n return { items, nextCursor, prevCursor, hasMore, hasPrev };\n}\n\n/**\n * Run a callback inside a PostgreSQL transaction using a dedicated client.\n *\n * When a `pool` is provided, a dedicated client is checked out so that\n * BEGIN / COMMIT / ROLLBACK all execute on the **same** connection.\n * This is critical for `SELECT … FOR UPDATE` locks and any work that\n * yields to the event-loop inside the transaction (e.g. async step handlers).\n *\n * Falls back to the pg-boss `Db` adapter when no pool is given (unit-test path).\n */\nexport async function withPostgresTransaction<T>(\n db: Db,\n callback: (db: Db) => Promise<T>,\n pool?: {\n connect: () => Promise<{\n query: (text: string, values?: unknown[]) => Promise<unknown>;\n release: () => void;\n }>;\n },\n): Promise<T> {\n let txDb: Db;\n let release: (() => void) | undefined;\n\n if (pool) {\n const client = await pool.connect();\n txDb = {\n executeSql: (text: string, values?: unknown[]) =>\n client.query(text, values) as Promise<{ rows: unknown[] }>,\n };\n release = () => client.release();\n } else {\n txDb = db;\n }\n\n try {\n await txDb.executeSql('BEGIN', []);\n const result = await callback(txDb);\n await txDb.executeSql('COMMIT', []);\n return result;\n } catch (error) {\n await txDb.executeSql('ROLLBACK', []);\n throw error;\n } finally {\n release?.();\n }\n}\n",
|
|
9
9
|
"import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { MAX_RESOURCE_ID_LENGTH, MAX_WORKFLOW_ID_LENGTH } from './constants';\n\nexport function validateWorkflowId(workflowId: string): void {\n if (workflowId.length > MAX_WORKFLOW_ID_LENGTH) {\n throw new WorkflowEngineError(\n `workflowId exceeds maximum length of ${MAX_WORKFLOW_ID_LENGTH} characters (got ${workflowId.length})`,\n workflowId,\n );\n }\n}\n\nexport function validateResourceId(resourceId: string | undefined | null): void {\n if (resourceId != null && resourceId.length > MAX_RESOURCE_ID_LENGTH) {\n throw new WorkflowEngineError(\n `resourceId exceeds maximum length of ${MAX_RESOURCE_ID_LENGTH} characters (got ${resourceId.length})`,\n );\n }\n}\n\nexport class WorkflowEngineError extends Error {\n constructor(\n message: string,\n public readonly workflowId?: string,\n public readonly runId?: string,\n public override readonly cause: Error | undefined = undefined,\n public readonly issues?: StandardSchemaV1.FailureResult['issues'] | undefined,\n ) {\n super(message);\n this.name = 'WorkflowEngineError';\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, WorkflowEngineError);\n }\n }\n}\n\nexport class WorkflowRunNotFoundError extends WorkflowEngineError {\n constructor(runId?: string, workflowId?: string) {\n super('Workflow run not found', workflowId, runId);\n this.name = 'WorkflowRunNotFoundError';\n }\n}\n",
|
|
10
|
-
"import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { WorkflowRun } from './db/types';\nimport type { Duration } from './duration';\n\nexport enum WorkflowStatus {\n PENDING = 'pending',\n RUNNING = 'running',\n PAUSED = 'paused',\n COMPLETED = 'completed',\n FAILED = 'failed',\n CANCELLED = 'cancelled',\n}\n\nexport enum StepType {\n PAUSE = 'pause',\n RUN = 'run',\n WAIT_FOR = 'waitFor',\n WAIT_UNTIL = 'waitUntil',\n DELAY = 'delay',\n POLL = 'poll',\n INVOKE_CHILD_WORKFLOW = 'invokeChildWorkflow',\n}\n\nexport type InputParameters = StandardSchemaV1;\nexport type InferInputParameters<P extends InputParameters> = StandardSchemaV1.InferOutput<P>;\n\nexport type
|
|
10
|
+
"import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { WorkflowRun } from './db/types';\nimport type { Duration } from './duration';\n\nexport enum WorkflowStatus {\n PENDING = 'pending',\n RUNNING = 'running',\n PAUSED = 'paused',\n COMPLETED = 'completed',\n FAILED = 'failed',\n CANCELLED = 'cancelled',\n}\n\nexport enum StepType {\n PAUSE = 'pause',\n RUN = 'run',\n WAIT_FOR = 'waitFor',\n WAIT_UNTIL = 'waitUntil',\n DELAY = 'delay',\n POLL = 'poll',\n INVOKE_CHILD_WORKFLOW = 'invokeChildWorkflow',\n}\n\nexport type InputParameters = StandardSchemaV1;\nexport type InferInputParameters<P extends InputParameters> = StandardSchemaV1.InferOutput<P>;\n\nexport type StartWorkflowOptions = {\n resourceId?: string;\n timeout?: number;\n retries?: number;\n expireInSeconds?: number;\n idempotencyKey?: string;\n};\n\nexport type WorkflowOptions<I extends InputParameters> = {\n timeout?: number;\n retries?: number;\n inputSchema?: I;\n};\n\nexport type StepBaseContext = {\n run: <T>(stepId: string, handler: () => Promise<T>) => Promise<T>;\n waitFor: {\n <T extends InputParameters>(\n stepId: string,\n options: { eventName: string; schema?: T },\n ): Promise<InferInputParameters<T>>;\n <T extends InputParameters>(\n stepId: string,\n options: { eventName: string; timeout: number; schema?: T },\n ): Promise<InferInputParameters<T> | undefined>;\n };\n waitUntil: {\n (stepId: string, date: Date): Promise<void>;\n (stepId: string, dateString: string): Promise<void>;\n (stepId: string, options: { date: Date | string }): Promise<void>;\n };\n /** Delay execution for a duration (sugar over waitUntil). Alias: sleep. */\n delay: (stepId: string, duration: Duration) => Promise<void>;\n /** Alias for delay. */\n sleep: (stepId: string, duration: Duration) => Promise<void>;\n pause: (stepId: string) => Promise<void>;\n poll: <T>(\n stepId: string,\n conditionFn: () => Promise<T | false>,\n options?: { interval?: Duration; timeout?: Duration },\n ) => Promise<{ timedOut: false; data: T } | { timedOut: true }>;\n /**\n * Invoke a child workflow from inside the current workflow and pause until\n * the child run reaches a terminal state.\n */\n invokeChildWorkflow: {\n <TInput extends InputParameters, TOutput = unknown>(\n stepId: string,\n ref: WorkflowRef<TInput, TOutput>,\n input: InferInputParameters<TInput>,\n options?: StartWorkflowOptions,\n ): Promise<TOutput>;\n <TOutput = unknown>(\n stepId: string,\n params: {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n },\n ): Promise<TOutput>;\n };\n};\n\n/**\n * Plugin that extends the workflow step API with extra methods.\n * @template TStepBase - The step type this plugin receives (base + previous plugins).\n * @template TStepExt - The extra methods this plugin adds to step.\n */\nexport interface WorkflowPlugin<TStepBase = StepBaseContext, TStepExt = object> {\n name: string;\n methods: (step: TStepBase) => TStepExt;\n}\n\nexport type WorkflowContext<\n TInput extends InputParameters = InputParameters,\n TStep extends StepBaseContext = StepBaseContext,\n> = {\n input: InferInputParameters<TInput>;\n step: TStep;\n workflowId: string;\n runId: string;\n timeline: Record<string, unknown>;\n logger: WorkflowLogger;\n};\n\nexport type WorkflowDefinition<TInput extends InputParameters = InputParameters> = {\n id: string;\n /** Widest context avoids contravariance when collecting definitions; `workflow()` still types the handler narrowly. */\n handler: (context: WorkflowContext<InputParameters, StepBaseContext>) => Promise<unknown>;\n inputSchema?: TInput;\n timeout?: number; // milliseconds\n retries?: number;\n plugins?: WorkflowPlugin[];\n};\n\nexport type StepInternalDefinition = {\n id: string;\n type: StepType;\n conditional: boolean;\n loop: boolean;\n isDynamic: boolean;\n};\n\nexport type WorkflowInternalDefinition<TInput extends InputParameters = InputParameters> =\n WorkflowDefinition<TInput> & {\n steps: StepInternalDefinition[];\n };\n\n/**\n * Chainable workflow factory: call as (id, handler, options) and/or use .use(plugin).\n * TStepExt is the accumulated step extension from all plugins (step = StepContext & TStepExt).\n */\nexport interface WorkflowFactory<TStepExt = object> {\n <I extends InputParameters = InputParameters>(\n id: string,\n handler: (context: WorkflowContext<I, StepBaseContext & TStepExt>) => Promise<unknown>,\n options?: WorkflowOptions<I>,\n ): WorkflowDefinition<I>;\n use<TNewExt>(\n plugin: WorkflowPlugin<StepBaseContext & TStepExt, TNewExt>,\n ): WorkflowFactory<TStepExt & TNewExt>;\n ref<TInput extends InputParameters = InputParameters, TOutput = unknown>(\n id: string,\n options?: { inputSchema?: TInput },\n ): WorkflowRef<TInput, TOutput>;\n}\n\n/**\n * Lightweight workflow reference - carries the workflow ID and input type\n * but no handler code. Safe to import in API services without pulling in\n * heavy worker dependencies.\n *\n * Callable: pass a handler to create a full WorkflowDefinition.\n */\nexport interface WorkflowRef<\n TInput extends InputParameters = InputParameters,\n // biome-ignore lint/correctness/noUnusedVariables: phantom type carried for typed return inference\n TOutput = unknown,\n> {\n (\n handler: (context: WorkflowContext<TInput, StepBaseContext>) => Promise<unknown>,\n options?: Omit<WorkflowOptions<TInput>, 'inputSchema'>,\n ): WorkflowDefinition<TInput>;\n readonly id: string;\n readonly inputSchema?: TInput;\n}\n\nexport type WorkflowRunProgress = WorkflowRun & {\n completionPercentage: number;\n totalSteps: number;\n completedSteps: number;\n};\n\nexport interface WorkflowLogger {\n log(message: string): void;\n error(message: string, ...args: unknown[]): void;\n}\n\nexport type WorkflowInternalLoggerContext = {\n runId?: string;\n workflowId?: string;\n};\nexport interface WorkflowInternalLogger {\n log(message: string, context?: WorkflowInternalLoggerContext): void;\n error(message: string, error: Error, context?: WorkflowInternalLoggerContext): void;\n}\n",
|
|
11
11
|
"import type {\n InputParameters,\n StepBaseContext,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowFactory,\n WorkflowOptions,\n WorkflowPlugin,\n WorkflowRef,\n} from './types';\n\n/**\n * Create a lightweight workflow reference.\n * Safe to import from `pg-workflows/client` - no engine or handler code.\n */\nexport function createWorkflowRef<\n TOutput = unknown,\n TInput extends InputParameters = InputParameters,\n>(id: string, options?: { inputSchema?: TInput }): WorkflowRef<TInput, TOutput> {\n const ref = ((\n handler: (context: WorkflowContext<TInput, StepBaseContext>) => Promise<unknown>,\n defineOptions?: Omit<WorkflowOptions<TInput>, 'inputSchema'>,\n ): WorkflowDefinition<TInput> => ({\n id,\n handler: handler as (\n context: WorkflowContext<InputParameters, StepBaseContext>,\n ) => Promise<unknown>,\n inputSchema: options?.inputSchema,\n timeout: defineOptions?.timeout,\n retries: defineOptions?.retries,\n })) as WorkflowRef<TInput, TOutput>;\n\n Object.defineProperty(ref, 'id', { value: id, enumerable: true });\n Object.defineProperty(ref, 'inputSchema', {\n value: options?.inputSchema,\n enumerable: true,\n });\n\n return ref;\n}\n\nfunction createWorkflowFactory<TStepExt extends object = object>(\n plugins: Array<WorkflowPlugin<unknown, object>> = [],\n): WorkflowFactory<TStepExt> {\n const factory = (<I extends InputParameters>(\n id: string,\n handler: (context: WorkflowContext<I, StepBaseContext & TStepExt>) => Promise<unknown>,\n { inputSchema, timeout, retries }: WorkflowOptions<I> = {},\n ): WorkflowDefinition<I> => ({\n id,\n handler: handler as (\n context: WorkflowContext<InputParameters, StepBaseContext>,\n ) => Promise<unknown>,\n inputSchema,\n timeout,\n retries,\n plugins: plugins.length > 0 ? (plugins as WorkflowPlugin[]) : undefined,\n })) as WorkflowFactory<TStepExt>;\n\n factory.use = <TNewExt>(\n plugin: WorkflowPlugin<StepBaseContext & TStepExt, TNewExt>,\n ): WorkflowFactory<TStepExt & TNewExt> =>\n createWorkflowFactory<TStepExt & TNewExt>([\n ...plugins,\n plugin as WorkflowPlugin<unknown, object>,\n ]);\n\n factory.ref = createWorkflowRef;\n\n return factory;\n}\n\nexport const workflow: WorkflowFactory = createWorkflowFactory();\n"
|
|
12
12
|
],
|
|
13
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAsB,IAAtB;AACe,IAAf;AACgC,IAAhC;;;ACFO,IAAM,mBAAmB;AACzB,IAAM,0BAA0B;AAChC,IAAM,8BAA8B;AACpC,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAK/B,IAAM,wCAAwC;AAC9C,IAAM,2BAA2B;AACjC,IAAM,iCAAiC,CAAC,WAC7C,GAAG,UAAU;AACR,IAAM,qBAAqB,CAAC,WAAmB,GAAG,UAAU;AAQ5D,IAAM,qCAAqC,CAChD,UAEA,CAAC,CAAC,SAAS,OAAO,UAAU,aAAY,yBAAyB;;;ACtB5D,IAAM,oBAAoB;AAIjC,IAAM,yBAAyB;AAE/B,eAAsB,aAAa,CAAC,IAAuB;AAAA,EAGzD,IAAI,MAAM,iBAAiB,EAAE,GAAG;AAAA,IAC9B;AAAA,EACF;AAAA,EAOA,MAAM,iBAAiB,MAAM,kBAAkB,EAAE;AAAA,EAEjD,MAAM,WAAqB,CAAC;AAAA,EAE5B,IAAI,iBAAiB,GAAG;AAAA,IACtB,SAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAqBb;AAAA,IACD,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,IACD,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,IACD,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,IACD,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,IACD,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,EACH;AAAA,EAEA,IAAI,iBAAiB,GAAG;AAAA,IACtB,SAAS,KAAK,oDAAoD;AAAA,IAClE,SAAS,KAAK,oDAAoD;AAAA,IAClE,SAAS,KACP,iFACF;AAAA,IACA,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,EACH;AAAA,EAEA,IAAI,iBAAiB,GAAG;AAAA,IACtB,SAAS,KAAK,sEAAsE;AAAA,IACpF,SAAS,KAAK,sEAAsE;AAAA,EACtF;AAAA,EAEA,IAAI,iBAAiB,GAAG;AAAA,IACtB,SAAS,KAAK,8EAA8E;AAAA,IAC5F,SAAS,KAAK,gFAAgF;AAAA,IAC9F,SAAS,KACP,oFACF;AAAA,EACF;AAAA,EAGA,IAAI,mBAAmB,GAAG;AAAA,IACxB,SAAS,KACP,yDAAyD,yBAC3D;AAAA,EACF,EAAO;AAAA,IACL,SAAS,KAAK,gDAAgD,wBAAwB;AAAA;AAAA,EAGxF,IAAI,SAAS,WAAW,GAAG;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,MAAM;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,gCAAgC;AAAA,IAChC;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF,EAAE,KAAK;AAAA,CAAK;AAAA,EAEZ,MAAM,GAAG,WAAW,KAAK,CAAC,CAAC;AAAA;AAG7B,eAAe,gBAAgB,CAAC,IAA0B;AAAA,EACxD,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,GAAG,WAAW,uDAAuD,CAAC,CAAC;AAAA,IAC5F,QACI,OAAO,KAAK,IAAwC,WAAW,MAAM;AAAA,IAEzE,MAAM;AAAA,IAEN,OAAO;AAAA;AAAA;AAIX,eAAe,iBAAiB,CAAC,IAAyB;AAAA,EACxD,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,GAAG,WAAW,uDAAuD,CAAC,CAAC;AAAA,IAC5F,OAAQ,OAAO,KAAK,IAAwC,WAAW;AAAA,IACvE,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;ACpIO,IAAlB;AAIO,SAAS,aAAa,CAAC,QAAyB;AAAA,EACrD,OAAO,GAAG,SAAS,GAAG,YAAY,KAAK,qBAAM,WAAW,EAAE;AAAA;AA4B5D,SAAS,mBAAmB,CAAC,KAAkC;AAAA,EAC7D,OAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,WAAW,IAAI,KAAK,IAAI,UAAU;AAAA,IAClC,WAAW,IAAI,KAAK,IAAI,UAAU;AAAA,IAClC,YAAY,IAAI;AAAA,IAChB,YAAY,IAAI;AAAA,IAChB,QAAQ,IAAI;AAAA,IACZ,OAAO,OAAO,IAAI,UAAU,WAAW,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,IACnE,QACE,OAAO,IAAI,WAAW,WAClB,IAAI,OAAO,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,OAAO,KAAK,EAAE,WAAW,GAAG,IACnE,KAAK,MAAM,IAAI,MAAM,IACrB,IAAI,SACL,IAAI,UAAU;AAAA,IACrB,OAAO,IAAI;AAAA,IACX,eAAe,IAAI;AAAA,IACnB,UAAU,OAAO,IAAI,aAAa,WAAW,KAAK,MAAM,IAAI,QAAQ,IAAI,IAAI;AAAA,IAC5E,UAAU,IAAI,YAAY,IAAI,KAAK,IAAI,SAAS,IAAI;AAAA,IACpD,WAAW,IAAI,aAAa,IAAI,KAAK,IAAI,UAAU,IAAI;AAAA,IACvD,aAAa,IAAI,eAAe,IAAI,KAAK,IAAI,YAAY,IAAI;AAAA,IAC7D,WAAW,IAAI,aAAa,IAAI,KAAK,IAAI,UAAU,IAAI;AAAA,IACvD,YAAY,IAAI;AAAA,IAChB,YAAY,IAAI;AAAA,IAChB,OAAO,IAAI;AAAA,IACX,gBAAgB,IAAI;AAAA,IACpB,aAAa,IAAI;AAAA,IACjB,cAAc,IAAI;AAAA,IAClB,kBAAkB,IAAI;AAAA,EACxB;AAAA;AAGF,eAAsB,iBAAiB;AAAA,EAEnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAcF,IACiD;AAAA,EACjD,MAAM,QAAQ,cAAc,KAAK;AAAA,EACjC,MAAM,MAAM,IAAI;AAAA,EAEhB,MAAM,SAAS,MAAM,GAAG,WACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAqBA;AAAA,IACE;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,KAAK;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,EACtB,CACF;AAAA,EAEA,IAAI,OAAO,KAAK,IAAI;AAAA,IAClB,OAAO,EAAE,KAAK,oBAAoB,OAAO,KAAK,EAAE,GAAG,SAAS,KAAK;AAAA,EACnE;AAAA,EAGA,MAAM,WAAW,MAAM,GAAG,WAAW,0DAA0D;AAAA,IAC7F;AAAA,EACF,CAAC;AAAA,EAED,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,IACrB,MAAM,IAAI,MAAM,yDAAyD,iBAAiB;AAAA,EAC5F;AAAA,EAEA,OAAO,EAAE,KAAK,oBAAoB,SAAS,KAAK,EAAE,GAAG,SAAS,MAAM;AAAA;AAGtE,eAAsB,cAAc;AAAA,EAEhC;AAAA,EACA;AAAA,KAKA,gBAAgB,OAAO,MACI;AAAA,EAC7B,MAAM,aAAa,gBAAgB,eAAe;AAAA,EAElD,MAAM,SAAS,aACX,MAAM,GAAG,WACP;AAAA;AAAA,UAEE,cACF,CAAC,OAAO,UAAU,CACpB,IACA,MAAM,GAAG,WACP;AAAA;AAAA,UAEE,cACF,CAAC,KAAK,CACR;AAAA,EAEJ,MAAM,MAAM,OAAO,KAAK;AAAA,EAExB,IAAI,CAAC,KAAK;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,oBAAoB,GAAG;AAAA;AAGhC,eAAsB,iBAAiB;AAAA,EAEnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAOF,IAC6B;AAAA,EAC7B,MAAM,MAAM,IAAI;AAAA,EAEhB,MAAM,UAAoB,CAAC,iBAAiB;AAAA,EAC5C,MAAM,SAAuD,CAAC,GAAG;AAAA,EACjE,IAAI,aAAa;AAAA,EAEjB,IAAI,KAAK,WAAW,WAAW;AAAA,IAC7B,QAAQ,KAAK,aAAa,YAAY;AAAA,IACtC,OAAO,KAAK,KAAK,MAAM;AAAA,IACvB;AAAA,EACF;AAAA,EACA,IAAI,KAAK,kBAAkB,WAAW;AAAA,IACpC,QAAQ,KAAK,sBAAsB,YAAY;AAAA,IAC/C,OAAO,KAAK,KAAK,aAAa;AAAA,IAC9B;AAAA,EACF;AAAA,EACA,IAAI,KAAK,aAAa,WAAW;AAAA,IAC/B,QAAQ,KAAK,eAAe,YAAY;AAAA,IACxC,OAAO,KAAK,KAAK,UAAU,KAAK,QAAQ,CAAC;AAAA,IACzC;AAAA,EACF;AAAA,EACA,IAAI,KAAK,aAAa,WAAW;AAAA,IAC/B,QAAQ,KAAK,gBAAgB,YAAY;AAAA,IACzC,OAAO,KAAK,KAAK,QAAQ;AAAA,IACzB;AAAA,EACF;AAAA,EACA,IAAI,KAAK,cAAc,WAAW;AAAA,IAChC,QAAQ,KAAK,iBAAiB,YAAY;AAAA,IAC1C,OAAO,KAAK,KAAK,SAAS;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,IAAI,KAAK,gBAAgB,WAAW;AAAA,IAClC,QAAQ,KAAK,mBAAmB,YAAY;AAAA,IAC5C,OAAO,KAAK,KAAK,WAAW;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,IAAI,KAAK,WAAW,WAAW;AAAA,IAC7B,QAAQ,KAAK,aAAa,YAAY;AAAA,IACtC,OAAO,KAAK,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACvC;AAAA,EACF;AAAA,EACA,IAAI,KAAK,UAAU,WAAW;AAAA,IAC5B,QAAQ,KAAK,YAAY,YAAY;AAAA,IACrC,OAAO,KAAK,KAAK,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EACA,IAAI,KAAK,eAAe,WAAW;AAAA,IACjC,QAAQ,KAAK,kBAAkB,YAAY;AAAA,IAC3C,OAAO,KAAK,KAAK,UAAU;AAAA,IAC3B;AAAA,EACF;AAAA,EACA,IAAI,KAAK,UAAU,WAAW;AAAA,IAC5B,QAAQ,KAAK,aAAa,YAAY;AAAA,IACtC,OAAO,KAAK,KAAK,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO,KAAK,KAAK;AAAA,EACjB,MAAM,UAAU;AAAA,EAChB;AAAA,EAEA,IAAI,YAAY;AAAA,IACd,OAAO,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,IAAI,oBAAoB,iBAAiB,SAAS,GAAG;AAAA,IACnD,OAAO,KAAK,gBAAgB;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,IAAI,cAAc,aACd,eAAe,8BAA8B,UAAU,MACvD,eAAe;AAAA,EAEnB,IAAI,oBAAoB,iBAAiB,SAAS,GAAG;AAAA,IACnD,eAAe,sBAAsB,aAAa;AAAA,EACpD;AAAA,EAEA,MAAM,QAAQ;AAAA;AAAA,UAEN,QAAQ,KAAK,IAAI;AAAA,MACrB;AAAA;AAAA;AAAA,EAIJ,MAAM,SAAS,MAAM,GAAG,WAAW,OAAO,MAAM;AAAA,EAChD,MAAM,MAAM,OAAO,KAAK;AAAA,EAExB,IAAI,CAAC,KAAK;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,oBAAoB,GAAG;AAAA;AAGhC,eAAsB,eAAe;AAAA,EAEjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,GASF,IAOC;AAAA,EACD,MAAM,aAAuB,CAAC;AAAA,EAC9B,MAAM,SAAgD,CAAC;AAAA,EACvD,IAAI,aAAa;AAAA,EAEjB,IAAI,YAAY;AAAA,IACd,WAAW,KAAK,kBAAkB,YAAY;AAAA,IAC9C,OAAO,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,IAAI,YAAY,SAAS,SAAS,GAAG;AAAA,IACnC,WAAW,KAAK,iBAAiB,aAAa;AAAA,IAC9C,OAAO,KAAK,QAAQ;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,IAAI,YAAY;AAAA,IACd,WAAW,KAAK,kBAAkB,YAAY;AAAA,IAC9C,OAAO,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,CAAC,eAAe,YAAY,EAAE,OAAO,OAAO;AAAA,EAC9D,IAAI,UAAU,SAAS,GAAG;AAAA,IACxB,MAAM,eAAe,MAAM,GAAG,WAC5B,+DACA,CAAC,SAAS,CACZ;AAAA,IACA,MAAM,YAAY,IAAI;AAAA,IACtB,WAAW,OAAO,aAAa,MAAM;AAAA,MACnC,UAAU,IACR,IAAI,IACJ,OAAO,IAAI,eAAe,WAAW,IAAI,KAAK,IAAI,UAAU,IAAI,IAAI,UACtE;AAAA,IACF;AAAA,IAEA,IAAI,eAAe;AAAA,MACjB,MAAM,SAAS,UAAU,IAAI,aAAa;AAAA,MAC1C,IAAI,QAAQ;AAAA,QACV,WAAW,KAAK,iBAAiB,YAAY;AAAA,QAC7C,OAAO,KAAK,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,cAAc;AAAA,MAChB,MAAM,SAAS,UAAU,IAAI,YAAY;AAAA,MACzC,IAAI,QAAQ;AAAA,QACV,WAAW,KAAK,iBAAiB,YAAY;AAAA,QAC7C,OAAO,KAAK,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,WAAW,SAAS,IAAI,SAAS,WAAW,KAAK,OAAO,MAAM;AAAA,EAClF,MAAM,cAAc,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI;AAAA,EAExD,MAAM,aAAa,CAAC,CAAC,gBAAgB,CAAC;AAAA,EAEtC,MAAM,QAAQ;AAAA;AAAA,MAEV;AAAA,0BACoB,aAAa,QAAQ;AAAA,aAClC;AAAA;AAAA,EAEX,OAAO,KAAK,WAAW;AAAA,EAEvB,MAAM,SAAS,MAAM,GAAG,WAAW,OAAO,MAAM;AAAA,EAChD,MAAM,OAAO,OAAO;AAAA,EAEpB,MAAM,cAAc,KAAK,UAAU,SAAS;AAAA,EAC5C,MAAM,WAAW,cAAc,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,EAEtD,IAAI,YAAY;AAAA,IACd,SAAS,QAAQ;AAAA,EACnB;AAAA,EAEA,MAAM,QAAQ,SAAS,IAAI,CAAC,QAAQ,oBAAoB,GAAG,CAAC;AAAA,EAE5D,MAAM,UAAU,aAAa,MAAM,SAAS,IAAI;AAAA,EAChD,MAAM,UAAU,aAAa,cAAc,CAAC,CAAC,iBAAiB,MAAM,SAAS;AAAA,EAE7E,MAAM,aAAa,WAAW,MAAM,SAAS,IAAK,MAAM,MAAM,SAAS,IAAI,MAAM,OAAQ;AAAA,EACzF,MAAM,aAAa,WAAW,MAAM,SAAS,IAAK,MAAM,IAAI,MAAM,OAAQ;AAAA,EAE1E,OAAO,EAAE,OAAO,YAAY,YAAY,SAAS,QAAQ;AAAA;AAa3D,eAAsB,uBAA0B,CAC9C,IACA,UACA,MAMY;AAAA,EACZ,IAAI;AAAA,EACJ,IAAI;AAAA,EAEJ,IAAI,MAAM;AAAA,IACR,MAAM,SAAS,MAAM,KAAK,QAAQ;AAAA,IAClC,OAAO;AAAA,MACL,YAAY,CAAC,MAAc,WACzB,OAAO,MAAM,MAAM,MAAM;AAAA,IAC7B;AAAA,IACA,UAAU,MAAM,OAAO,QAAQ;AAAA,EACjC,EAAO;AAAA,IACL,OAAO;AAAA;AAAA,EAGT,IAAI;AAAA,IACF,MAAM,KAAK,WAAW,SAAS,CAAC,CAAC;AAAA,IACjC,MAAM,SAAS,MAAM,SAAS,IAAI;AAAA,IAClC,MAAM,KAAK,WAAW,UAAU,CAAC,CAAC;AAAA,IAClC,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IACd,MAAM,KAAK,WAAW,YAAY,CAAC,CAAC;AAAA,IACpC,MAAM;AAAA,YACN;AAAA,IACA,UAAU;AAAA;AAAA;;;ACpcP,SAAS,kBAAkB,CAAC,YAA0B;AAAA,EAC3D,IAAI,WAAW,SAAS,wBAAwB;AAAA,IAC9C,MAAM,IAAI,oBACR,wCAAwC,0CAA0C,WAAW,WAC7F,UACF;AAAA,EACF;AAAA;AAGK,SAAS,kBAAkB,CAAC,YAA6C;AAAA,EAC9E,IAAI,cAAc,QAAQ,WAAW,SAAS,wBAAwB;AAAA,IACpE,MAAM,IAAI,oBACR,wCAAwC,0CAA0C,WAAW,SAC/F;AAAA,EACF;AAAA;AAAA;AAGK,MAAM,4BAA4B,MAAM;AAAA,EAG3B;AAAA,EACA;AAAA,EACS;AAAA,EACT;AAAA,EALlB,WAAW,CACT,SACgB,YACA,OACS,QAA2B,WACpC,QAChB;AAAA,IACA,MAAM,OAAO;AAAA,IALG;AAAA,IACA;AAAA,IACS;AAAA,IACT;AAAA,IAGhB,KAAK,OAAO;AAAA,IAEZ,IAAI,MAAM,mBAAmB;AAAA,MAC3B,MAAM,kBAAkB,MAAM,mBAAmB;AAAA,IACnD;AAAA;AAEJ;AAAA;AAEO,MAAM,iCAAiC,oBAAoB;AAAA,EAChE,WAAW,CAAC,OAAgB,YAAqB;AAAA,IAC/C,MAAM,0BAA0B,YAAY,KAAK;AAAA,IACjD,KAAK,OAAO;AAAA;AAEhB;;;ACtCO,IAAK;AAAA,CAAL,CAAK,oBAAL;AAAA,EACL,6BAAU;AAAA,EACV,6BAAU;AAAA,EACV,4BAAS;AAAA,EACT,+BAAY;AAAA,EACZ,4BAAS;AAAA,EACT,+BAAY;AAAA,GANF;AASL,IAAK;AAAA,CAAL,CAAK,cAAL;AAAA,EACL,qBAAQ;AAAA,EACR,mBAAM;AAAA,EACN,wBAAW;AAAA,EACX,0BAAa;AAAA,EACb,qBAAQ;AAAA,EACR,oBAAO;AAAA,EACP,qCAAwB;AAAA,GAPd;;;ALuBZ,IAAM,aAAa;AA0BnB,IAAM,gBAAgC;AAAA,EACpC,KAAK,CAAC,aAAqB,QAAQ,KAAK,QAAQ;AAAA,EAChD,OAAO,CAAC,SAAiB,UAAiB,QAAQ,MAAM,SAAS,KAAK;AACxE;AAEA,IAAM,yBAAyB,QAAQ,IAAI,iCACvC,OAAO,SAAS,QAAQ,IAAI,gCAAgC,EAAE,IAC9D,IAAI;AAAA;AAED,MAAM,eAAe;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EAER,WAAW,GAAG,QAAQ,SAAS,qBAA4C;AAAA,IACzE,KAAK,SAAS,UAAU;AAAA,IAExB,IAAI,UAAU,qBAAqB,kBAAkB,MAAM;AAAA,MACzD,KAAK,OAAO,kBAAkB;AAAA,IAChC,EAAO,SAAI,sBAAsB,qBAAqB,kBAAkB,kBAAkB;AAAA,MACxF,KAAK,OAAO,IAAI,kBAAG,KAAK,EAAE,kBAAkB,kBAAkB,iBAAiB,CAAC;AAAA,MAChF,KAAK,YAAY;AAAA,IACnB,EAAO;AAAA,MACL,MAAM,IAAI,oBAAoB,kDAAkD;AAAA;AAAA,IAGlF,MAAM,KAAS;AAAA,MACb,YAAY,CAAC,MAAc,WACzB,KAAK,KAAK,MAAM,MAAM,MAAM;AAAA,IAChC;AAAA,IAEA,IAAI,MAAM;AAAA,MACR,KAAK,OAAO;AAAA,IACd,EAAO;AAAA,MACL,KAAK,OAAO,IAAI,sBAAO,EAAE,IAAI,QAAQ,sBAAsB,CAAC;AAAA;AAAA,IAE9D,KAAK,KAAK;AAAA;AAAA,OAGN,MAAK,GAAkB;AAAA,IAC3B,IAAI,KAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,KAAK,MAAM;AAAA,IACtB,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA,IAC1B,MAAM,cAAc,KAAK,EAAE;AAAA,IAC3B,MAAM,KAAK,KAAK,YAAY,uBAAuB;AAAA,IAEnD,KAAK,WAAW;AAAA,IAChB,KAAK,OAAO,IAAI,GAAG,2BAA2B;AAAA;AAAA,OAG1C,KAAI,GAAkB;AAAA,IAC1B,MAAM,KAAK,KAAK,KAAK;AAAA,IAErB,IAAI,KAAK,WAAW;AAAA,MAClB,MAAM,KAAK,KAAK,IAAI;AAAA,IACtB;AAAA,IAEA,KAAK,WAAW;AAAA,IAChB,KAAK,OAAO,IAAI,GAAG,2BAA2B;AAAA;AAAA,OAiB1C,cAA6C,CACjD,aASA,UACA,YACsB;AAAA,IACtB,MAAM,KAAK,cAAc;AAAA,IAEzB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IAEJ,IAAI,OAAO,gBAAgB,cAAc,QAAQ,aAAa;AAAA,MAC5D,MAAM,MAAM;AAAA,MACZ,aAAa,IAAI;AAAA,MACjB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa,YAAY;AAAA,MACzB,iBAAiB,YAAY;AAAA,MAE7B,IAAI,IAAI,aAAa;AAAA,QACnB,MAAM,SAAS,MAAM,IAAI,YAAY,aAAa,SAAS,KAAK;AAAA,QAChE,IAAI,OAAO,QAAQ;AAAA,UACjB,MAAM,IAAI,oBACR,KAAK,UAAU,OAAO,MAAM,GAC5B,YACA,WACA,WACA,OAAO,MACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,EAAO;AAAA,MACL,MAAM,SAAS;AAAA,MAOf,aAAa,OAAO;AAAA,MACpB,QAAQ,OAAO;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,iBAAiB,OAAO;AAAA,MACxB,UAAU,OAAO;AAAA;AAAA,IAGnB,mBAAmB,UAAU;AAAA,IAC7B,mBAAmB,UAAU;AAAA,IAE7B,MAAM,MAAM,MAAM,wBAChB,KAAK,IACL,OAAO,QAAQ;AAAA,MACb,MAAM,YAAY,SAAS,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,OAAO,IAAI;AAAA,MAE9E,QAAQ,KAAK,aAAa,YAAY,MAAM,kBAC1C;AAAA,QACE;AAAA,QACA;AAAA,QACA,eAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA,YAAY,SAAS,WAAW;AAAA,QAChC;AAAA,QACA;AAAA,MACF,GACA,GACF;AAAA,MAEA,IAAI,SAAS;AAAA,QACX,MAAM,MAAgC;AAAA,UACpC,OAAO,YAAY;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QAMA,MAAM,KAAK,KAAK,KAAK,yBAAyB,KAAK;AAAA,UACjD,YAAY,IAAI;AAAA,UAChB,iBAAiB,SAAS,mBAAmB;AAAA,UAC7C,IAAI;AAAA,QACN,CAAC;AAAA,MACH;AAAA,MAEA,OAAO;AAAA,OAET,KAAK,IACP;AAAA,IAEA,KAAK,OAAO,IAAI,GAAG,mCAAmC,IAAI,UAAU,YAAY;AAAA,IAEhF,OAAO;AAAA;AAAA,OAGH,aAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,KAOuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IAEnD,MAAM,MAAgC;AAAA,MACpC,OAAO,IAAI;AAAA,MACX,YAAY,cAAc,IAAI,cAAc;AAAA,MAC5C,YAAY,IAAI;AAAA,MAChB,OAAO,IAAI;AAAA,MACX,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,KAAK,KAAK,yBAAyB,KAAK;AAAA,MACjD,iBAAiB,SAAS,mBAAmB;AAAA,IAC/C,CAAC;AAAA,IAED,KAAK,OAAO,IAAI,GAAG,oBAAoB,mCAAmC,OAAO;AAAA,IACjF,OAAO;AAAA;AAAA,OAGH,cAAa;AAAA,IACjB;AAAA,IACA;AAAA,KAIuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,MAAM,MAAM,kBAChB;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,QACA,UAAU,IAAI;AAAA,MAChB;AAAA,MACA,kBAAkB,iDAA+C;AAAA,IACnE,GACA,KAAK,EACP;AAAA,IAEA,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI,yBAAyB,KAAK;AAAA,IAC1C;AAAA,IAEA,KAAK,OAAO,IAAI,GAAG,kCAAkC,OAAO;AAAA,IAC5D,OAAO;AAAA;AAAA,OAGH,eAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,KAKuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,UAAU,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IACvD,IAAI,QAAQ,kCAAkC;AAAA,MAC5C,MAAM,IAAI,oBACR,kCAAkC,QAAQ,oCAC1C,QAAQ,YACR,KACF;AAAA,IACF;AAAA,IAEA,MAAM,gBAAgB,QAAQ;AAAA,IAC9B,MAAM,2BACJ,QAAQ,SAAS,+BAA+B,aAAa;AAAA,IAC/D,IAAI,mCAAmC,wBAAwB,GAAG;AAAA,MAChE,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,KAAK,aAAa;AAAA,MACvB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,MAAM,CAAC;AAAA,MACP;AAAA,IACF,CAAC;AAAA;AAAA,OAGG,oBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,KAKuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IAEnD,IAAI,IAAI,kCAAkC;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,gBAAgB,IAAI;AAAA,IAC1B,MAAM,2BAA2B,IAAI,SAAS,+BAA+B,aAAa;AAAA,IAC1F,IAAI,mCAAmC,wBAAwB,GAAG;AAAA,MAChE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,eAAe,IAAI,SAAS,mBAAmB,aAAa;AAAA,IAClE,IAAI,CAAC,gBAAgB,OAAO,iBAAiB,YAAY,EAAE,aAAa,eAAe;AAAA,MACrF,OAAO;AAAA,IACT;AAAA,IAEA,QAAQ,WAAW,cAAc,eAC/B,aACA;AAAA,IAGF,IAAI,cAAc,kBAAkB;AAAA,MAClC,OAAO,KAAK,eAAe,EAAE,OAAO,WAAW,CAAC;AAAA,IAClD;AAAA,IAGA,IAAI,cAAc,cAAc;AAAA,MAC9B,MAAM,wBACJ,KAAK,IACL,OAAO,OAAO;AAAA,QACZ,MAAM,WAAW,MAAM,eAAe,EAAE,OAAO,WAAW,GAAG,EAAE,eAAe,MAAM,GAAG,CAAC;AAAA,QACxF,IAAI,CAAC;AAAA,UAAU,MAAM,IAAI,yBAAyB,KAAK;AAAA,QACvD,OAAO,kBACL;AAAA,UACE;AAAA,UACA;AAAA,UACA,MAAM;AAAA,YACJ,UAAU,wBAAM,SAAS,UAAU;AAAA,eAChC,gBAAgB;AAAA,gBACf,QAAQ,QAAQ,CAAC;AAAA,gBACjB,WAAW,IAAI;AAAA,cACjB;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,GACA,EACF;AAAA,SAEF,KAAK,IACP;AAAA,MAEA,OAAO,KAAK,aAAa,EAAE,OAAO,YAAY,WAAW,aAAa,CAAC;AAAA,IACzE;AAAA,IAGA,IAAI,WAAW;AAAA,MACb,OAAO,KAAK,aAAa,EAAE,OAAO,YAAY,WAAW,MAAM,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC7E;AAAA,IAGA,IAAI,cAAc;AAAA,MAChB,OAAO,KAAK,aAAa,EAAE,OAAO,YAAY,WAAW,cAAc,MAAM,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC3F;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,eAAc;AAAA,IAClB;AAAA,IACA;AAAA,KAIuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,MAAM,MAAM,kBAChB;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,MACA,kBAAkB,wEAAsE;AAAA,IAC1F,GACA,KAAK,EACP;AAAA,IAEA,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI,yBAAyB,KAAK;AAAA,IAC1C;AAAA,IAEA,KAAK,OAAO,IAAI,GAAG,qCAAqC,OAAO;AAAA,IAC/D,OAAO;AAAA;AAAA,OAGH,OAAM;AAAA,IACV;AAAA,IACA;AAAA,KAIuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,MAAM,MAAM,eAAe,EAAE,OAAO,WAAW,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC;AAAA,IAEvE,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI,yBAAyB,KAAK;AAAA,IAC1C;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,cAAa;AAAA,IACjB;AAAA,IACA;AAAA,KAI+B;AAAA,IAC/B,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IAEnD,MAAM,iBAAiB,OAAO,OAAO,IAAI,QAAQ,EAAE,OACjD,CAAC,UACC,OAAO,UAAU,YACjB,UAAU,SACV,YAAY,UACZ,MAAM,WAAW,SACrB,EAAE;AAAA,IAIF,MAAM,aAAa,IAAI,yCAAsC,iBAAiB;AAAA,IAC9E,MAAM,uBACJ,IAAI,yCACA,MACA,IAAI,oCAAoC,IAAI,yCAC1C,IACA;AAAA,IAER,OAAO;AAAA,SACF;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,OAGI,QAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,KAcC;AAAA,IACD,MAAM,KAAK,cAAc;AAAA,IAEzB,IAAI;AAAA,MAAY,mBAAmB,UAAU;AAAA,IAC7C,mBAAmB,UAAU;AAAA,IAE7B,OAAO,gBACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GACA,KAAK,EACP;AAAA;AAAA,OAGY,cAAa,GAAkB;AAAA,IAC3C,IAAI,CAAC,KAAK,UAAU;AAAA,MAClB,MAAM,KAAK,MAAM;AAAA,IACnB;AAAA;AAEJ;;AM9hBO,SAAS,iBAGf,CAAC,IAAY,SAAkE;AAAA,EAC9E,MAAM,MAAO,CACX,SACA,mBACgC;AAAA,IAChC;AAAA,IACA;AAAA,IAGA,aAAa,SAAS;AAAA,IACtB,SAAS,eAAe;AAAA,IACxB,SAAS,eAAe;AAAA,EAC1B;AAAA,EAEA,OAAO,eAAe,KAAK,MAAM,EAAE,OAAO,IAAI,YAAY,KAAK,CAAC;AAAA,EAChE,OAAO,eAAe,KAAK,eAAe;AAAA,IACxC,OAAO,SAAS;AAAA,IAChB,YAAY;AAAA,EACd,CAAC;AAAA,EAED,OAAO;AAAA;AAGT,SAAS,qBAAuD,CAC9D,UAAkD,CAAC,GACxB;AAAA,EAC3B,MAAM,UAAW,CACf,IACA,WACE,aAAa,SAAS,YAAgC,CAAC,OAC9B;AAAA,IAC3B;AAAA,IACA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,QAAQ,SAAS,IAAK,UAA+B;AAAA,EAChE;AAAA,EAEA,QAAQ,MAAM,CACZ,WAEA,sBAA0C;AAAA,IACxC,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AAAA,EAEH,QAAQ,MAAM;AAAA,EAEd,OAAO;AAAA;AAGF,IAAM,WAA4B,sBAAsB;",
|
|
14
|
-
"debugId": "
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "AA7D4CB0B3AC99D364756E2164756E21",
|
|
15
15
|
"names": []
|
|
16
16
|
}
|
package/dist/index.cjs
CHANGED
|
@@ -65,16 +65,12 @@ var __export = (target, all) => {
|
|
|
65
65
|
var exports_src = {};
|
|
66
66
|
__export(exports_src, {
|
|
67
67
|
workflow: () => workflow,
|
|
68
|
-
validateWorkflowId: () => validateWorkflowId,
|
|
69
|
-
validateResourceId: () => validateResourceId,
|
|
70
|
-
parseDuration: () => parseDuration,
|
|
71
68
|
createWorkflowRef: () => createWorkflowRef,
|
|
72
69
|
WorkflowStatus: () => WorkflowStatus,
|
|
73
70
|
WorkflowRunNotFoundError: () => WorkflowRunNotFoundError,
|
|
74
71
|
WorkflowEngineError: () => WorkflowEngineError,
|
|
75
72
|
WorkflowEngine: () => WorkflowEngine,
|
|
76
|
-
WorkflowClient: () => WorkflowClient
|
|
77
|
-
StepType: () => StepType
|
|
73
|
+
WorkflowClient: () => WorkflowClient
|
|
78
74
|
});
|
|
79
75
|
module.exports = __toCommonJS(exports_src);
|
|
80
76
|
|
|
@@ -543,16 +539,6 @@ var WorkflowStatus;
|
|
|
543
539
|
WorkflowStatus2["FAILED"] = "failed";
|
|
544
540
|
WorkflowStatus2["CANCELLED"] = "cancelled";
|
|
545
541
|
})(WorkflowStatus ||= {});
|
|
546
|
-
var StepType;
|
|
547
|
-
((StepType2) => {
|
|
548
|
-
StepType2["PAUSE"] = "pause";
|
|
549
|
-
StepType2["RUN"] = "run";
|
|
550
|
-
StepType2["WAIT_FOR"] = "waitFor";
|
|
551
|
-
StepType2["WAIT_UNTIL"] = "waitUntil";
|
|
552
|
-
StepType2["DELAY"] = "delay";
|
|
553
|
-
StepType2["POLL"] = "poll";
|
|
554
|
-
StepType2["INVOKE_CHILD_WORKFLOW"] = "invokeChildWorkflow";
|
|
555
|
-
})(StepType ||= {});
|
|
556
542
|
|
|
557
543
|
// src/client.ts
|
|
558
544
|
var LOG_PREFIX = "[WorkflowClient]";
|
|
@@ -892,31 +878,6 @@ function createWorkflowFactory(plugins = []) {
|
|
|
892
878
|
return factory;
|
|
893
879
|
}
|
|
894
880
|
var workflow = createWorkflowFactory();
|
|
895
|
-
// src/duration.ts
|
|
896
|
-
var import_parse_duration = __toESM(require("parse-duration"));
|
|
897
|
-
var MS_PER_SECOND = 1000;
|
|
898
|
-
var MS_PER_MINUTE = 60 * MS_PER_SECOND;
|
|
899
|
-
var MS_PER_HOUR = 60 * MS_PER_MINUTE;
|
|
900
|
-
var MS_PER_DAY = 24 * MS_PER_HOUR;
|
|
901
|
-
var MS_PER_WEEK = 7 * MS_PER_DAY;
|
|
902
|
-
function parseDuration(duration) {
|
|
903
|
-
if (typeof duration === "string") {
|
|
904
|
-
if (duration.trim() === "") {
|
|
905
|
-
throw new WorkflowEngineError("Invalid duration: empty string");
|
|
906
|
-
}
|
|
907
|
-
const ms2 = import_parse_duration.default(duration);
|
|
908
|
-
if (ms2 == null || ms2 <= 0) {
|
|
909
|
-
throw new WorkflowEngineError(`Invalid duration: "${duration}"`);
|
|
910
|
-
}
|
|
911
|
-
return ms2;
|
|
912
|
-
}
|
|
913
|
-
const { weeks = 0, days = 0, hours = 0, minutes = 0, seconds = 0 } = duration;
|
|
914
|
-
const ms = weeks * MS_PER_WEEK + days * MS_PER_DAY + hours * MS_PER_HOUR + minutes * MS_PER_MINUTE + seconds * MS_PER_SECOND;
|
|
915
|
-
if (ms <= 0) {
|
|
916
|
-
throw new WorkflowEngineError("Invalid duration: must be a positive value");
|
|
917
|
-
}
|
|
918
|
-
return ms;
|
|
919
|
-
}
|
|
920
881
|
// src/engine.ts
|
|
921
882
|
var import_es_toolkit2 = require("es-toolkit");
|
|
922
883
|
var import_pg2 = __toESM(require("pg"));
|
|
@@ -992,6 +953,32 @@ function parseWorkflowHandler(handler) {
|
|
|
992
953
|
return { steps: Array.from(steps.values()) };
|
|
993
954
|
}
|
|
994
955
|
|
|
956
|
+
// src/duration.ts
|
|
957
|
+
var import_parse_duration = __toESM(require("parse-duration"));
|
|
958
|
+
var MS_PER_SECOND = 1000;
|
|
959
|
+
var MS_PER_MINUTE = 60 * MS_PER_SECOND;
|
|
960
|
+
var MS_PER_HOUR = 60 * MS_PER_MINUTE;
|
|
961
|
+
var MS_PER_DAY = 24 * MS_PER_HOUR;
|
|
962
|
+
var MS_PER_WEEK = 7 * MS_PER_DAY;
|
|
963
|
+
function parseDuration(duration) {
|
|
964
|
+
if (typeof duration === "string") {
|
|
965
|
+
if (duration.trim() === "") {
|
|
966
|
+
throw new WorkflowEngineError("Invalid duration: empty string");
|
|
967
|
+
}
|
|
968
|
+
const ms2 = import_parse_duration.default(duration);
|
|
969
|
+
if (ms2 == null || ms2 <= 0) {
|
|
970
|
+
throw new WorkflowEngineError(`Invalid duration: "${duration}"`);
|
|
971
|
+
}
|
|
972
|
+
return ms2;
|
|
973
|
+
}
|
|
974
|
+
const { weeks = 0, days = 0, hours = 0, minutes = 0, seconds = 0 } = duration;
|
|
975
|
+
const ms = weeks * MS_PER_WEEK + days * MS_PER_DAY + hours * MS_PER_HOUR + minutes * MS_PER_MINUTE + seconds * MS_PER_SECOND;
|
|
976
|
+
if (ms <= 0) {
|
|
977
|
+
throw new WorkflowEngineError("Invalid duration: must be a positive value");
|
|
978
|
+
}
|
|
979
|
+
return ms;
|
|
980
|
+
}
|
|
981
|
+
|
|
995
982
|
// src/engine.ts
|
|
996
983
|
var LOG_PREFIX2 = "[WorkflowEngine]";
|
|
997
984
|
var StepTypeToIcon = {
|
|
@@ -1141,7 +1128,7 @@ class WorkflowEngine {
|
|
|
1141
1128
|
async startWorkflow(refOrParams, inputArg, optionsArg) {
|
|
1142
1129
|
const { workflowId, input, resourceId, idempotencyKey, options } = this.resolveWorkflowRunParameters(refOrParams, inputArg, optionsArg);
|
|
1143
1130
|
if (!this._started) {
|
|
1144
|
-
await this.start(false
|
|
1131
|
+
await this.start(false);
|
|
1145
1132
|
}
|
|
1146
1133
|
const { run } = await this.createWorkflowRun({
|
|
1147
1134
|
workflowId,
|
|
@@ -1610,7 +1597,9 @@ class WorkflowEngine {
|
|
|
1610
1597
|
input: run.input,
|
|
1611
1598
|
workflowId: run.workflowId,
|
|
1612
1599
|
runId: run.id,
|
|
1613
|
-
timeline
|
|
1600
|
+
get timeline() {
|
|
1601
|
+
return run?.timeline ?? {};
|
|
1602
|
+
},
|
|
1614
1603
|
logger: this.logger,
|
|
1615
1604
|
step
|
|
1616
1605
|
};
|
|
@@ -1907,7 +1896,7 @@ class WorkflowEngine {
|
|
|
1907
1896
|
if (output === undefined) {
|
|
1908
1897
|
output = {};
|
|
1909
1898
|
}
|
|
1910
|
-
|
|
1899
|
+
const updated = await this.updateRun({
|
|
1911
1900
|
runId: run.id,
|
|
1912
1901
|
resourceId: run.resourceId ?? undefined,
|
|
1913
1902
|
data: {
|
|
@@ -1919,6 +1908,7 @@ class WorkflowEngine {
|
|
|
1919
1908
|
})
|
|
1920
1909
|
}
|
|
1921
1910
|
}, { db });
|
|
1911
|
+
Object.assign(run, updated);
|
|
1922
1912
|
return output;
|
|
1923
1913
|
} catch (error) {
|
|
1924
1914
|
this.logger.error(`Step ${stepId} failed:`, error, {
|
|
@@ -2147,5 +2137,5 @@ ${error.stack}` : String(error)
|
|
|
2147
2137
|
}
|
|
2148
2138
|
}
|
|
2149
2139
|
|
|
2150
|
-
//# debugId=
|
|
2140
|
+
//# debugId=B0870008EFFA04F064756E2164756E21
|
|
2151
2141
|
//# sourceMappingURL=index.js.map
|
package/dist/index.d.cts
CHANGED
|
@@ -33,7 +33,6 @@ type DurationObject = {
|
|
|
33
33
|
seconds?: number;
|
|
34
34
|
};
|
|
35
35
|
type Duration = string | DurationObject;
|
|
36
|
-
declare function parseDuration(duration: Duration): number;
|
|
37
36
|
declare enum WorkflowStatus {
|
|
38
37
|
PENDING = "pending",
|
|
39
38
|
RUNNING = "running",
|
|
@@ -53,7 +52,7 @@ declare enum StepType {
|
|
|
53
52
|
}
|
|
54
53
|
type InputParameters = StandardSchemaV1;
|
|
55
54
|
type InferInputParameters<P extends InputParameters> = StandardSchemaV1.InferOutput<P>;
|
|
56
|
-
type
|
|
55
|
+
type StartWorkflowOptions = {
|
|
57
56
|
resourceId?: string;
|
|
58
57
|
timeout?: number;
|
|
59
58
|
retries?: number;
|
|
@@ -107,13 +106,13 @@ type StepBaseContext = {
|
|
|
107
106
|
<
|
|
108
107
|
TInput extends InputParameters,
|
|
109
108
|
TOutput = unknown
|
|
110
|
-
>(stepId: string, ref: WorkflowRef<TInput, TOutput>, input: InferInputParameters<TInput>, options?:
|
|
109
|
+
>(stepId: string, ref: WorkflowRef<TInput, TOutput>, input: InferInputParameters<TInput>, options?: StartWorkflowOptions): Promise<TOutput>;
|
|
111
110
|
<TOutput = unknown>(stepId: string, params: {
|
|
112
111
|
workflowId: string;
|
|
113
112
|
input: unknown;
|
|
114
113
|
resourceId?: string;
|
|
115
114
|
idempotencyKey?: string;
|
|
116
|
-
options?:
|
|
115
|
+
options?: StartWorkflowOptions;
|
|
117
116
|
}): Promise<TOutput>;
|
|
118
117
|
};
|
|
119
118
|
};
|
|
@@ -197,14 +196,6 @@ interface WorkflowLogger {
|
|
|
197
196
|
log(message: string): void;
|
|
198
197
|
error(message: string, ...args: unknown[]): void;
|
|
199
198
|
}
|
|
200
|
-
type WorkflowInternalLoggerContext = {
|
|
201
|
-
runId?: string;
|
|
202
|
-
workflowId?: string;
|
|
203
|
-
};
|
|
204
|
-
interface WorkflowInternalLogger {
|
|
205
|
-
log(message: string, context?: WorkflowInternalLoggerContext): void;
|
|
206
|
-
error(message: string, error: Error, context?: WorkflowInternalLoggerContext): void;
|
|
207
|
-
}
|
|
208
199
|
type WorkflowClientOptions = {
|
|
209
200
|
logger?: WorkflowLogger;
|
|
210
201
|
/**
|
|
@@ -221,7 +212,6 @@ type WorkflowClientOptions = {
|
|
|
221
212
|
connectionString: string;
|
|
222
213
|
pool?: never;
|
|
223
214
|
});
|
|
224
|
-
type StartWorkflowOptions = WorkflowRunOptions;
|
|
225
215
|
declare class WorkflowClient {
|
|
226
216
|
private boss;
|
|
227
217
|
private db;
|
|
@@ -306,9 +296,6 @@ declare function createWorkflowRef<
|
|
|
306
296
|
declare const workflow: WorkflowFactory;
|
|
307
297
|
import pg2 from "pg";
|
|
308
298
|
import { Db, PgBoss as PgBoss2 } from "pg-boss";
|
|
309
|
-
type StartWorkflowOptions2 = WorkflowRunOptions & {
|
|
310
|
-
batchSize?: number;
|
|
311
|
-
};
|
|
312
299
|
type WorkflowEngineOptions = {
|
|
313
300
|
workflows?: WorkflowDefinition[];
|
|
314
301
|
logger?: WorkflowLogger;
|
|
@@ -339,13 +326,13 @@ declare class WorkflowEngine {
|
|
|
339
326
|
unregisterWorkflow(workflowId: string): Promise<WorkflowEngine>;
|
|
340
327
|
unregisterAllWorkflows(): Promise<WorkflowEngine>;
|
|
341
328
|
private resolveWorkflowRunParameters;
|
|
342
|
-
startWorkflow<TInput extends InputParameters>(ref: WorkflowRef<TInput>, input: InferInputParameters<TInput>, options?:
|
|
329
|
+
startWorkflow<TInput extends InputParameters>(ref: WorkflowRef<TInput>, input: InferInputParameters<TInput>, options?: StartWorkflowOptions): Promise<WorkflowRun>;
|
|
343
330
|
startWorkflow(params: {
|
|
344
331
|
resourceId?: string;
|
|
345
332
|
workflowId: string;
|
|
346
333
|
input: unknown;
|
|
347
334
|
idempotencyKey?: string;
|
|
348
|
-
options?:
|
|
335
|
+
options?: StartWorkflowOptions;
|
|
349
336
|
}): Promise<WorkflowRun>;
|
|
350
337
|
private createWorkflowRun;
|
|
351
338
|
private enqueueWorkflowRun;
|
|
@@ -455,8 +442,6 @@ declare class WorkflowEngine {
|
|
|
455
442
|
}>;
|
|
456
443
|
}
|
|
457
444
|
import { StandardSchemaV1 as StandardSchemaV12 } from "@standard-schema/spec";
|
|
458
|
-
declare function validateWorkflowId(workflowId: string): void;
|
|
459
|
-
declare function validateResourceId(resourceId: string | undefined | null): void;
|
|
460
445
|
declare class WorkflowEngineError extends Error {
|
|
461
446
|
readonly workflowId?: string | undefined;
|
|
462
447
|
readonly runId?: string | undefined;
|
|
@@ -467,4 +452,4 @@ declare class WorkflowEngineError extends Error {
|
|
|
467
452
|
declare class WorkflowRunNotFoundError extends WorkflowEngineError {
|
|
468
453
|
constructor(runId?: string, workflowId?: string);
|
|
469
454
|
}
|
|
470
|
-
export { workflow,
|
|
455
|
+
export { workflow, createWorkflowRef, WorkflowStatus, WorkflowRunProgress, WorkflowRunNotFoundError, WorkflowRun, WorkflowRef, WorkflowPlugin, WorkflowOptions, WorkflowLogger, WorkflowEngineOptions, WorkflowEngineError, WorkflowEngine, WorkflowDefinition, WorkflowContext, WorkflowClientOptions, WorkflowClient, StepBaseContext, StartWorkflowOptions, InputParameters, InferInputParameters, Duration };
|