pg-workflows 0.8.0 → 0.8.2
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 +12 -4
- package/dist/client.entry.d.cts +11 -1
- package/dist/client.entry.d.ts +11 -1
- package/dist/client.entry.js +1 -1
- package/dist/client.entry.js.map +3 -3
- package/dist/index.cjs +12 -4
- package/dist/index.d.cts +13 -3
- package/dist/index.d.ts +13 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +3 -3
- package/dist/shared/{chunk-8n9chg7z.js → chunk-2xy8z3xp.js} +13 -5
- package/dist/shared/{chunk-8n9chg7z.js.map → chunk-2xy8z3xp.js.map} +3 -3
- package/package.json +1 -1
package/dist/client.entry.cjs
CHANGED
|
@@ -520,7 +520,7 @@ class WorkflowClient {
|
|
|
520
520
|
_ownsPool = false;
|
|
521
521
|
_started = false;
|
|
522
522
|
logger;
|
|
523
|
-
constructor({ logger, ...connectionOptions }) {
|
|
523
|
+
constructor({ logger, boss, ...connectionOptions }) {
|
|
524
524
|
this.logger = logger ?? defaultLogger;
|
|
525
525
|
if ("pool" in connectionOptions && connectionOptions.pool) {
|
|
526
526
|
this.pool = connectionOptions.pool;
|
|
@@ -533,7 +533,11 @@ class WorkflowClient {
|
|
|
533
533
|
const db = {
|
|
534
534
|
executeSql: (text, values) => this.pool.query(text, values)
|
|
535
535
|
};
|
|
536
|
-
|
|
536
|
+
if (boss) {
|
|
537
|
+
this.boss = boss;
|
|
538
|
+
} else {
|
|
539
|
+
this.boss = new import_pg_boss.PgBoss({ db, schema: DEFAULT_PGBOSS_SCHEMA });
|
|
540
|
+
}
|
|
537
541
|
this.db = db;
|
|
538
542
|
}
|
|
539
543
|
async start() {
|
|
@@ -560,6 +564,7 @@ class WorkflowClient {
|
|
|
560
564
|
let workflowId;
|
|
561
565
|
let input;
|
|
562
566
|
let resourceId;
|
|
567
|
+
let idempotencyKey;
|
|
563
568
|
let options;
|
|
564
569
|
if (typeof refOrParams === "function" && "id" in refOrParams) {
|
|
565
570
|
const ref = refOrParams;
|
|
@@ -567,6 +572,7 @@ class WorkflowClient {
|
|
|
567
572
|
input = inputArg;
|
|
568
573
|
options = optionsArg;
|
|
569
574
|
resourceId = optionsArg?.resourceId;
|
|
575
|
+
idempotencyKey = optionsArg?.idempotencyKey;
|
|
570
576
|
if (ref.inputSchema) {
|
|
571
577
|
const result = await ref.inputSchema["~standard"].validate(input);
|
|
572
578
|
if (result.issues) {
|
|
@@ -578,6 +584,7 @@ class WorkflowClient {
|
|
|
578
584
|
workflowId = params.workflowId;
|
|
579
585
|
input = params.input;
|
|
580
586
|
resourceId = params.resourceId;
|
|
587
|
+
idempotencyKey = params.idempotencyKey;
|
|
581
588
|
options = params.options;
|
|
582
589
|
}
|
|
583
590
|
const run = await withPostgresTransaction(this.db, async (_db) => {
|
|
@@ -589,7 +596,8 @@ class WorkflowClient {
|
|
|
589
596
|
status: "running" /* RUNNING */,
|
|
590
597
|
input,
|
|
591
598
|
maxRetries: options?.retries ?? 0,
|
|
592
|
-
timeoutAt
|
|
599
|
+
timeoutAt,
|
|
600
|
+
idempotencyKey
|
|
593
601
|
}, _db);
|
|
594
602
|
if (created) {
|
|
595
603
|
const job = {
|
|
@@ -818,5 +826,5 @@ function createWorkflowFactory(plugins = []) {
|
|
|
818
826
|
}
|
|
819
827
|
var workflow = createWorkflowFactory();
|
|
820
828
|
|
|
821
|
-
//# debugId=
|
|
829
|
+
//# debugId=3DE4F376EEE27CBD64756E2164756E21
|
|
822
830
|
//# sourceMappingURL=client.entry.js.map
|
package/dist/client.entry.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import pg from "pg";
|
|
2
|
+
import { PgBoss } from "pg-boss";
|
|
2
3
|
type WorkflowRun = {
|
|
3
4
|
id: string;
|
|
4
5
|
createdAt: Date;
|
|
@@ -134,6 +135,13 @@ interface WorkflowLogger {
|
|
|
134
135
|
}
|
|
135
136
|
type WorkflowClientOptions = {
|
|
136
137
|
logger?: WorkflowLogger;
|
|
138
|
+
/**
|
|
139
|
+
* Pre-configured pg-boss instance. Pass this when the engine side uses a
|
|
140
|
+
* non-default pg-boss config (schema, retention, logger, etc.) so the
|
|
141
|
+
* client enqueues jobs where the engine reads them. Mirrors the same
|
|
142
|
+
* option on `WorkflowEngineOptions`.
|
|
143
|
+
*/
|
|
144
|
+
boss?: PgBoss;
|
|
137
145
|
} & ({
|
|
138
146
|
pool: pg.Pool;
|
|
139
147
|
connectionString?: never;
|
|
@@ -146,6 +154,7 @@ type StartWorkflowOptions = {
|
|
|
146
154
|
timeout?: number;
|
|
147
155
|
retries?: number;
|
|
148
156
|
expireInSeconds?: number;
|
|
157
|
+
idempotencyKey?: string;
|
|
149
158
|
};
|
|
150
159
|
declare class WorkflowClient {
|
|
151
160
|
private boss;
|
|
@@ -154,7 +163,7 @@ declare class WorkflowClient {
|
|
|
154
163
|
private _ownsPool;
|
|
155
164
|
private _started;
|
|
156
165
|
private logger;
|
|
157
|
-
constructor({ logger,...connectionOptions }: WorkflowClientOptions);
|
|
166
|
+
constructor({ logger, boss,...connectionOptions }: WorkflowClientOptions);
|
|
158
167
|
start(): Promise<void>;
|
|
159
168
|
stop(): Promise<void>;
|
|
160
169
|
startWorkflow<TInput extends InputParameters>(ref: WorkflowRef<TInput>, input: InferInputParameters<TInput>, options?: StartWorkflowOptions): Promise<WorkflowRun>;
|
|
@@ -162,6 +171,7 @@ declare class WorkflowClient {
|
|
|
162
171
|
workflowId: string;
|
|
163
172
|
input: unknown;
|
|
164
173
|
resourceId?: string;
|
|
174
|
+
idempotencyKey?: string;
|
|
165
175
|
options?: StartWorkflowOptions;
|
|
166
176
|
}): Promise<WorkflowRun>;
|
|
167
177
|
triggerEvent({ runId, resourceId, eventName, data, options }: {
|
package/dist/client.entry.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import pg from "pg";
|
|
2
|
+
import { PgBoss } from "pg-boss";
|
|
2
3
|
type WorkflowRun = {
|
|
3
4
|
id: string;
|
|
4
5
|
createdAt: Date;
|
|
@@ -134,6 +135,13 @@ interface WorkflowLogger {
|
|
|
134
135
|
}
|
|
135
136
|
type WorkflowClientOptions = {
|
|
136
137
|
logger?: WorkflowLogger;
|
|
138
|
+
/**
|
|
139
|
+
* Pre-configured pg-boss instance. Pass this when the engine side uses a
|
|
140
|
+
* non-default pg-boss config (schema, retention, logger, etc.) so the
|
|
141
|
+
* client enqueues jobs where the engine reads them. Mirrors the same
|
|
142
|
+
* option on `WorkflowEngineOptions`.
|
|
143
|
+
*/
|
|
144
|
+
boss?: PgBoss;
|
|
137
145
|
} & ({
|
|
138
146
|
pool: pg.Pool;
|
|
139
147
|
connectionString?: never;
|
|
@@ -146,6 +154,7 @@ type StartWorkflowOptions = {
|
|
|
146
154
|
timeout?: number;
|
|
147
155
|
retries?: number;
|
|
148
156
|
expireInSeconds?: number;
|
|
157
|
+
idempotencyKey?: string;
|
|
149
158
|
};
|
|
150
159
|
declare class WorkflowClient {
|
|
151
160
|
private boss;
|
|
@@ -154,7 +163,7 @@ declare class WorkflowClient {
|
|
|
154
163
|
private _ownsPool;
|
|
155
164
|
private _started;
|
|
156
165
|
private logger;
|
|
157
|
-
constructor({ logger,...connectionOptions }: WorkflowClientOptions);
|
|
166
|
+
constructor({ logger, boss,...connectionOptions }: WorkflowClientOptions);
|
|
158
167
|
start(): Promise<void>;
|
|
159
168
|
stop(): Promise<void>;
|
|
160
169
|
startWorkflow<TInput extends InputParameters>(ref: WorkflowRef<TInput>, input: InferInputParameters<TInput>, options?: StartWorkflowOptions): Promise<WorkflowRun>;
|
|
@@ -162,6 +171,7 @@ declare class WorkflowClient {
|
|
|
162
171
|
workflowId: string;
|
|
163
172
|
input: unknown;
|
|
164
173
|
resourceId?: string;
|
|
174
|
+
idempotencyKey?: string;
|
|
165
175
|
options?: StartWorkflowOptions;
|
|
166
176
|
}): Promise<WorkflowRun>;
|
|
167
177
|
triggerEvent({ runId, resourceId, eventName, data, options }: {
|
package/dist/client.entry.js
CHANGED
package/dist/client.entry.js.map
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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 { DEFAULT_PGBOSS_SCHEMA, PAUSE_EVENT_NAME, WORKFLOW_RUN_QUEUE_NAME } 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 { WorkflowEngineError, WorkflowRunNotFoundError } from './error';\nimport {\n type InferInputParameters,\n type InputParameters,\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} & ({ pool: pg.Pool; connectionString?: never } | { connectionString: string; pool?: never });\n\nexport type StartWorkflowOptions = {\n resourceId?: string;\n timeout?: number;\n retries?: number;\n expireInSeconds?: number;\n};\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, ...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 this.boss = new PgBoss({ db, schema: DEFAULT_PGBOSS_SCHEMA });\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 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 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 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\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 options?: StartWorkflowOptions;\n };\n workflowId = params.workflowId;\n input = params.input;\n resourceId = params.resourceId;\n options = params.options;\n }\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 },\n _db,\n );\n\n if (created) {\n const job: WorkflowRunJobParameters = {\n runId: insertedRun.id,\n resourceId,\n workflowId,\n input,\n };\n\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n startAfter: new Date(),\n expireInSeconds: options?.expireInSeconds ?? defaultExpireInSeconds,\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 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 stepId = run.currentStepId;\n const waitForEntry = run.timeline[`${stepId}-wait-for`];\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 [stepId]: {\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 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 { DEFAULT_PGBOSS_SCHEMA, PAUSE_EVENT_NAME, WORKFLOW_RUN_QUEUE_NAME } 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 { WorkflowEngineError, WorkflowRunNotFoundError } from './error';\nimport {\n type InferInputParameters,\n type InputParameters,\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\nexport type StartWorkflowOptions = {\n resourceId?: string;\n timeout?: number;\n retries?: number;\n expireInSeconds?: number;\n idempotencyKey?: string;\n};\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 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 await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n startAfter: new Date(),\n expireInSeconds: options?.expireInSeconds ?? defaultExpireInSeconds,\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 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 stepId = run.currentStepId;\n const waitForEntry = run.timeline[`${stepId}-wait-for`];\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 [stepId]: {\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 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 DEFAULT_PGBOSS_SCHEMA = 'pgboss_v12_pgworkflow';\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 = 2;\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(32),\n workflow_id varchar(32) 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 // 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};\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 };\n}\n\nexport async function insertWorkflowRun(\n {\n resourceId,\n workflowId,\n currentStepId,\n status,\n input,\n maxRetries,\n timeoutAt,\n idempotencyKey,\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 },\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 )\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)\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 ],\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",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
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}\n\nexport type InputParameters = StandardSchemaV1;\nexport type InferInputParameters<P extends InputParameters> = StandardSchemaV1.InferOutput<P>;\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\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>(\n id: string,\n options?: { inputSchema?: TInput },\n ): WorkflowRef<TInput>;\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<TInput extends InputParameters = InputParameters> {\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<TInput extends InputParameters = InputParameters>(\n id: string,\n options?: { inputSchema?: TInput },\n): WorkflowRef<TInput> {\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>;\n\n Object.defineProperty(ref, 'id', { value: id, enumerable: true });\n Object.defineProperty(ref, 'inputSchema', { value: options?.inputSchema, enumerable: true });\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": "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",
|
|
14
|
-
"debugId": "
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "3DE4F376EEE27CBD64756E2164756E21",
|
|
15
15
|
"names": []
|
|
16
16
|
}
|
package/dist/index.cjs
CHANGED
|
@@ -526,7 +526,7 @@ class WorkflowClient {
|
|
|
526
526
|
_ownsPool = false;
|
|
527
527
|
_started = false;
|
|
528
528
|
logger;
|
|
529
|
-
constructor({ logger, ...connectionOptions }) {
|
|
529
|
+
constructor({ logger, boss, ...connectionOptions }) {
|
|
530
530
|
this.logger = logger ?? defaultLogger;
|
|
531
531
|
if ("pool" in connectionOptions && connectionOptions.pool) {
|
|
532
532
|
this.pool = connectionOptions.pool;
|
|
@@ -539,7 +539,11 @@ class WorkflowClient {
|
|
|
539
539
|
const db = {
|
|
540
540
|
executeSql: (text, values) => this.pool.query(text, values)
|
|
541
541
|
};
|
|
542
|
-
|
|
542
|
+
if (boss) {
|
|
543
|
+
this.boss = boss;
|
|
544
|
+
} else {
|
|
545
|
+
this.boss = new import_pg_boss.PgBoss({ db, schema: DEFAULT_PGBOSS_SCHEMA });
|
|
546
|
+
}
|
|
543
547
|
this.db = db;
|
|
544
548
|
}
|
|
545
549
|
async start() {
|
|
@@ -566,6 +570,7 @@ class WorkflowClient {
|
|
|
566
570
|
let workflowId;
|
|
567
571
|
let input;
|
|
568
572
|
let resourceId;
|
|
573
|
+
let idempotencyKey;
|
|
569
574
|
let options;
|
|
570
575
|
if (typeof refOrParams === "function" && "id" in refOrParams) {
|
|
571
576
|
const ref = refOrParams;
|
|
@@ -573,6 +578,7 @@ class WorkflowClient {
|
|
|
573
578
|
input = inputArg;
|
|
574
579
|
options = optionsArg;
|
|
575
580
|
resourceId = optionsArg?.resourceId;
|
|
581
|
+
idempotencyKey = optionsArg?.idempotencyKey;
|
|
576
582
|
if (ref.inputSchema) {
|
|
577
583
|
const result = await ref.inputSchema["~standard"].validate(input);
|
|
578
584
|
if (result.issues) {
|
|
@@ -584,6 +590,7 @@ class WorkflowClient {
|
|
|
584
590
|
workflowId = params.workflowId;
|
|
585
591
|
input = params.input;
|
|
586
592
|
resourceId = params.resourceId;
|
|
593
|
+
idempotencyKey = params.idempotencyKey;
|
|
587
594
|
options = params.options;
|
|
588
595
|
}
|
|
589
596
|
const run = await withPostgresTransaction(this.db, async (_db) => {
|
|
@@ -595,7 +602,8 @@ class WorkflowClient {
|
|
|
595
602
|
status: "running" /* RUNNING */,
|
|
596
603
|
input,
|
|
597
604
|
maxRetries: options?.retries ?? 0,
|
|
598
|
-
timeoutAt
|
|
605
|
+
timeoutAt,
|
|
606
|
+
idempotencyKey
|
|
599
607
|
}, _db);
|
|
600
608
|
if (created) {
|
|
601
609
|
const job = {
|
|
@@ -1797,5 +1805,5 @@ ${error.stack}` : String(error)
|
|
|
1797
1805
|
}
|
|
1798
1806
|
}
|
|
1799
1807
|
|
|
1800
|
-
//# debugId=
|
|
1808
|
+
//# debugId=E199D83236562DFF64756E2164756E21
|
|
1801
1809
|
//# sourceMappingURL=index.js.map
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import pg from "pg";
|
|
2
|
+
import { PgBoss } from "pg-boss";
|
|
2
3
|
type WorkflowRun = {
|
|
3
4
|
id: string;
|
|
4
5
|
createdAt: Date;
|
|
@@ -172,6 +173,13 @@ interface WorkflowInternalLogger {
|
|
|
172
173
|
}
|
|
173
174
|
type WorkflowClientOptions = {
|
|
174
175
|
logger?: WorkflowLogger;
|
|
176
|
+
/**
|
|
177
|
+
* Pre-configured pg-boss instance. Pass this when the engine side uses a
|
|
178
|
+
* non-default pg-boss config (schema, retention, logger, etc.) so the
|
|
179
|
+
* client enqueues jobs where the engine reads them. Mirrors the same
|
|
180
|
+
* option on `WorkflowEngineOptions`.
|
|
181
|
+
*/
|
|
182
|
+
boss?: PgBoss;
|
|
175
183
|
} & ({
|
|
176
184
|
pool: pg.Pool;
|
|
177
185
|
connectionString?: never;
|
|
@@ -184,6 +192,7 @@ type StartWorkflowOptions = {
|
|
|
184
192
|
timeout?: number;
|
|
185
193
|
retries?: number;
|
|
186
194
|
expireInSeconds?: number;
|
|
195
|
+
idempotencyKey?: string;
|
|
187
196
|
};
|
|
188
197
|
declare class WorkflowClient {
|
|
189
198
|
private boss;
|
|
@@ -192,7 +201,7 @@ declare class WorkflowClient {
|
|
|
192
201
|
private _ownsPool;
|
|
193
202
|
private _started;
|
|
194
203
|
private logger;
|
|
195
|
-
constructor({ logger,...connectionOptions }: WorkflowClientOptions);
|
|
204
|
+
constructor({ logger, boss,...connectionOptions }: WorkflowClientOptions);
|
|
196
205
|
start(): Promise<void>;
|
|
197
206
|
stop(): Promise<void>;
|
|
198
207
|
startWorkflow<TInput extends InputParameters>(ref: WorkflowRef<TInput>, input: InferInputParameters<TInput>, options?: StartWorkflowOptions): Promise<WorkflowRun>;
|
|
@@ -200,6 +209,7 @@ declare class WorkflowClient {
|
|
|
200
209
|
workflowId: string;
|
|
201
210
|
input: unknown;
|
|
202
211
|
resourceId?: string;
|
|
212
|
+
idempotencyKey?: string;
|
|
203
213
|
options?: StartWorkflowOptions;
|
|
204
214
|
}): Promise<WorkflowRun>;
|
|
205
215
|
triggerEvent({ runId, resourceId, eventName, data, options }: {
|
|
@@ -264,7 +274,7 @@ declare function createWorkflowRef<TInput extends InputParameters = InputParamet
|
|
|
264
274
|
}): WorkflowRef<TInput>;
|
|
265
275
|
declare const workflow: WorkflowFactory;
|
|
266
276
|
import pg2 from "pg";
|
|
267
|
-
import { Db, PgBoss } from "pg-boss";
|
|
277
|
+
import { Db, PgBoss as PgBoss2 } from "pg-boss";
|
|
268
278
|
type StartWorkflowOptions2 = {
|
|
269
279
|
resourceId?: string;
|
|
270
280
|
timeout?: number;
|
|
@@ -276,7 +286,7 @@ type StartWorkflowOptions2 = {
|
|
|
276
286
|
type WorkflowEngineOptions = {
|
|
277
287
|
workflows?: WorkflowDefinition[];
|
|
278
288
|
logger?: WorkflowLogger;
|
|
279
|
-
boss?:
|
|
289
|
+
boss?: PgBoss2;
|
|
280
290
|
} & ({
|
|
281
291
|
pool: pg2.Pool;
|
|
282
292
|
connectionString?: never;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import pg from "pg";
|
|
2
|
+
import { PgBoss } from "pg-boss";
|
|
2
3
|
type WorkflowRun = {
|
|
3
4
|
id: string;
|
|
4
5
|
createdAt: Date;
|
|
@@ -172,6 +173,13 @@ interface WorkflowInternalLogger {
|
|
|
172
173
|
}
|
|
173
174
|
type WorkflowClientOptions = {
|
|
174
175
|
logger?: WorkflowLogger;
|
|
176
|
+
/**
|
|
177
|
+
* Pre-configured pg-boss instance. Pass this when the engine side uses a
|
|
178
|
+
* non-default pg-boss config (schema, retention, logger, etc.) so the
|
|
179
|
+
* client enqueues jobs where the engine reads them. Mirrors the same
|
|
180
|
+
* option on `WorkflowEngineOptions`.
|
|
181
|
+
*/
|
|
182
|
+
boss?: PgBoss;
|
|
175
183
|
} & ({
|
|
176
184
|
pool: pg.Pool;
|
|
177
185
|
connectionString?: never;
|
|
@@ -184,6 +192,7 @@ type StartWorkflowOptions = {
|
|
|
184
192
|
timeout?: number;
|
|
185
193
|
retries?: number;
|
|
186
194
|
expireInSeconds?: number;
|
|
195
|
+
idempotencyKey?: string;
|
|
187
196
|
};
|
|
188
197
|
declare class WorkflowClient {
|
|
189
198
|
private boss;
|
|
@@ -192,7 +201,7 @@ declare class WorkflowClient {
|
|
|
192
201
|
private _ownsPool;
|
|
193
202
|
private _started;
|
|
194
203
|
private logger;
|
|
195
|
-
constructor({ logger,...connectionOptions }: WorkflowClientOptions);
|
|
204
|
+
constructor({ logger, boss,...connectionOptions }: WorkflowClientOptions);
|
|
196
205
|
start(): Promise<void>;
|
|
197
206
|
stop(): Promise<void>;
|
|
198
207
|
startWorkflow<TInput extends InputParameters>(ref: WorkflowRef<TInput>, input: InferInputParameters<TInput>, options?: StartWorkflowOptions): Promise<WorkflowRun>;
|
|
@@ -200,6 +209,7 @@ declare class WorkflowClient {
|
|
|
200
209
|
workflowId: string;
|
|
201
210
|
input: unknown;
|
|
202
211
|
resourceId?: string;
|
|
212
|
+
idempotencyKey?: string;
|
|
203
213
|
options?: StartWorkflowOptions;
|
|
204
214
|
}): Promise<WorkflowRun>;
|
|
205
215
|
triggerEvent({ runId, resourceId, eventName, data, options }: {
|
|
@@ -264,7 +274,7 @@ declare function createWorkflowRef<TInput extends InputParameters = InputParamet
|
|
|
264
274
|
}): WorkflowRef<TInput>;
|
|
265
275
|
declare const workflow: WorkflowFactory;
|
|
266
276
|
import pg2 from "pg";
|
|
267
|
-
import { Db, PgBoss } from "pg-boss";
|
|
277
|
+
import { Db, PgBoss as PgBoss2 } from "pg-boss";
|
|
268
278
|
type StartWorkflowOptions2 = {
|
|
269
279
|
resourceId?: string;
|
|
270
280
|
timeout?: number;
|
|
@@ -276,7 +286,7 @@ type StartWorkflowOptions2 = {
|
|
|
276
286
|
type WorkflowEngineOptions = {
|
|
277
287
|
workflows?: WorkflowDefinition[];
|
|
278
288
|
logger?: WorkflowLogger;
|
|
279
|
-
boss?:
|
|
289
|
+
boss?: PgBoss2;
|
|
280
290
|
} & ({
|
|
281
291
|
pool: pg2.Pool;
|
|
282
292
|
connectionString?: never;
|
package/dist/index.js
CHANGED