@workflow/core 4.0.1-beta.3 → 4.0.1-beta.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +201 -21
- package/dist/builtins.js +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.d.ts +40 -25
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +22 -27
- package/dist/events-consumer.js +1 -1
- package/dist/global.d.ts +11 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +28 -5
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/logger.js +1 -1
- package/dist/observability.d.ts +19 -0
- package/dist/observability.d.ts.map +1 -1
- package/dist/observability.js +76 -19
- package/dist/parse-name.d.ts.map +1 -1
- package/dist/parse-name.js +18 -3
- package/dist/private.d.ts +10 -1
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +6 -1
- package/dist/runtime/helpers.d.ts +25 -0
- package/dist/runtime/helpers.d.ts.map +1 -0
- package/dist/runtime/helpers.js +71 -0
- package/dist/runtime/resume-hook.d.ts +15 -10
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +71 -61
- package/dist/runtime/start.d.ts +4 -0
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +56 -45
- package/dist/runtime/step-handler.d.ts +7 -0
- package/dist/runtime/step-handler.d.ts.map +1 -0
- package/dist/runtime/step-handler.js +335 -0
- package/dist/runtime/suspension-handler.d.ts +20 -0
- package/dist/runtime/suspension-handler.d.ts.map +1 -0
- package/dist/runtime/suspension-handler.js +167 -0
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +22 -21
- package/dist/runtime.d.ts +2 -7
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +66 -334
- package/dist/schemas.d.ts +1 -15
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +2 -15
- package/dist/serialization.d.ts +57 -10
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +179 -52
- package/dist/sleep.d.ts +33 -0
- package/dist/sleep.d.ts.map +1 -0
- package/dist/sleep.js +10 -0
- package/dist/source-map.d.ts +10 -0
- package/dist/source-map.d.ts.map +1 -0
- package/dist/source-map.js +56 -0
- package/dist/step/context-storage.d.ts +2 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step/get-closure-vars.d.ts +9 -0
- package/dist/step/get-closure-vars.d.ts.map +1 -0
- package/dist/step/get-closure-vars.js +16 -0
- package/dist/step/get-step-metadata.js +1 -1
- package/dist/step/get-workflow-metadata.js +1 -1
- package/dist/step/writable-stream.d.ts +14 -0
- package/dist/step/writable-stream.d.ts.map +1 -0
- package/dist/step/writable-stream.js +30 -0
- package/dist/step.d.ts +1 -1
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +38 -10
- package/dist/symbols.d.ts +2 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +3 -1
- package/dist/telemetry/semantic-conventions.d.ts +66 -38
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +16 -3
- package/dist/telemetry.d.ts +8 -4
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +39 -6
- package/dist/types.d.ts +0 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -26
- package/dist/util.d.ts +9 -27
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +34 -42
- package/dist/vm/index.js +2 -2
- package/dist/vm/uuid.js +1 -1
- package/dist/workflow/create-hook.js +1 -1
- package/dist/workflow/define-hook.d.ts +3 -3
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +1 -1
- package/dist/workflow/get-workflow-metadata.js +1 -1
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +6 -9
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -1
- package/dist/workflow/sleep.d.ts +4 -0
- package/dist/workflow/sleep.d.ts.map +1 -0
- package/dist/workflow/sleep.js +54 -0
- package/dist/workflow/writable-stream.js +1 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +60 -9
- package/dist/writable-stream.d.ts +5 -4
- package/dist/writable-stream.d.ts.map +1 -1
- package/dist/writable-stream.js +7 -6
- package/package.json +21 -18
- package/dist/builtins.js.map +0 -1
- package/dist/create-hook.js.map +0 -1
- package/dist/define-hook.js.map +0 -1
- package/dist/events-consumer.js.map +0 -1
- package/dist/global.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/observability.js.map +0 -1
- package/dist/parse-name.js.map +0 -1
- package/dist/private.js.map +0 -1
- package/dist/runtime/resume-hook.js.map +0 -1
- package/dist/runtime/start.js.map +0 -1
- package/dist/runtime/world.js.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/schemas.js.map +0 -1
- package/dist/serialization.js.map +0 -1
- package/dist/step/context-storage.js.map +0 -1
- package/dist/step/get-step-metadata.js.map +0 -1
- package/dist/step/get-workflow-metadata.js.map +0 -1
- package/dist/step.js.map +0 -1
- package/dist/symbols.js.map +0 -1
- package/dist/telemetry/semantic-conventions.js.map +0 -1
- package/dist/telemetry.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/util.js.map +0 -1
- package/dist/vm/index.js.map +0 -1
- package/dist/vm/uuid.js.map +0 -1
- package/dist/workflow/create-hook.js.map +0 -1
- package/dist/workflow/define-hook.js.map +0 -1
- package/dist/workflow/get-workflow-metadata.js.map +0 -1
- package/dist/workflow/hook.js.map +0 -1
- package/dist/workflow/index.js.map +0 -1
- package/dist/workflow/writable-stream.js.map +0 -1
- package/dist/workflow.js.map +0 -1
- package/dist/writable-stream.js.map +0 -1
package/dist/runtime.js
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { WorkflowRunCancelledError, WorkflowRunFailedError, WorkflowRunNotCompletedError, } from '@workflow/errors';
|
|
2
|
+
import { WorkflowInvokePayloadSchema, } from '@workflow/world';
|
|
3
3
|
import { WorkflowSuspension } from './global.js';
|
|
4
4
|
import { runtimeLogger } from './logger.js';
|
|
5
|
-
import {
|
|
5
|
+
import { parseWorkflowName } from './parse-name.js';
|
|
6
|
+
import { getAllWorkflowRunEvents, getQueueOverhead, withHealthCheck, } from './runtime/helpers.js';
|
|
7
|
+
import { handleSuspension } from './runtime/suspension-handler.js';
|
|
6
8
|
import { getWorld, getWorldHandlers } from './runtime/world.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
// TODO: move step handler out to a separate file
|
|
10
|
-
import { contextStorage } from './step/context-storage.js';
|
|
9
|
+
import { getExternalRevivers, hydrateWorkflowReturnValue, } from './serialization.js';
|
|
10
|
+
import { remapErrorStack } from './source-map.js';
|
|
11
11
|
import * as Attribute from './telemetry/semantic-conventions.js';
|
|
12
|
-
import {
|
|
13
|
-
import { getErrorName, getErrorStack
|
|
12
|
+
import { linkToCurrentContext, trace, withTraceContext } from './telemetry.js';
|
|
13
|
+
import { getErrorName, getErrorStack } from './types.js';
|
|
14
14
|
import { buildWorkflowSuspensionMessage, getWorkflowRunStreamId, } from './util.js';
|
|
15
15
|
import { runWorkflow } from './workflow.js';
|
|
16
16
|
export { WorkflowSuspension } from './global.js';
|
|
17
17
|
export { getHookByToken, resumeHook, resumeWebhook, } from './runtime/resume-hook.js';
|
|
18
18
|
export { start } from './runtime/start.js';
|
|
19
19
|
export { createWorld, getWorld, getWorldHandlers, setWorld, } from './runtime/world.js';
|
|
20
|
+
export { stepEntrypoint } from './runtime/step-handler.js';
|
|
20
21
|
/**
|
|
21
22
|
* A handler class for a workflow run.
|
|
22
23
|
*/
|
|
@@ -95,7 +96,7 @@ export class Run {
|
|
|
95
96
|
getReadable(options = {}) {
|
|
96
97
|
const { ops = [], global = globalThis, startIndex, namespace } = options;
|
|
97
98
|
const name = getWorkflowRunStreamId(this.runId, namespace);
|
|
98
|
-
return getExternalRevivers(global, ops).ReadableStream({
|
|
99
|
+
return getExternalRevivers(global, ops, this.runId).ReadableStream({
|
|
99
100
|
name,
|
|
100
101
|
startIndex,
|
|
101
102
|
});
|
|
@@ -110,18 +111,18 @@ export class Run {
|
|
|
110
111
|
try {
|
|
111
112
|
const run = await this.world.runs.get(this.runId);
|
|
112
113
|
if (run.status === 'completed') {
|
|
113
|
-
return hydrateWorkflowReturnValue(run.output, [],
|
|
114
|
+
return hydrateWorkflowReturnValue(run.output, [], this.runId);
|
|
114
115
|
}
|
|
115
116
|
if (run.status === 'cancelled') {
|
|
116
117
|
throw new WorkflowRunCancelledError(this.runId);
|
|
117
118
|
}
|
|
118
119
|
if (run.status === 'failed') {
|
|
119
|
-
throw new WorkflowRunFailedError(this.runId, run.error
|
|
120
|
+
throw new WorkflowRunFailedError(this.runId, run.error);
|
|
120
121
|
}
|
|
121
122
|
throw new WorkflowRunNotCompletedError(this.runId, run.status);
|
|
122
123
|
}
|
|
123
124
|
catch (error) {
|
|
124
|
-
if (error
|
|
125
|
+
if (WorkflowRunNotCompletedError.is(error)) {
|
|
125
126
|
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
126
127
|
continue;
|
|
127
128
|
}
|
|
@@ -140,30 +141,6 @@ export class Run {
|
|
|
140
141
|
export function getRun(runId) {
|
|
141
142
|
return new Run(runId);
|
|
142
143
|
}
|
|
143
|
-
/**
|
|
144
|
-
* Loads all workflow run events by iterating through all pages of paginated results.
|
|
145
|
-
* This ensures that *all* events are loaded into memory before running the workflow.
|
|
146
|
-
* Events must be in chronological order (ascending) for proper workflow replay.
|
|
147
|
-
*/
|
|
148
|
-
async function getAllWorkflowRunEvents(runId) {
|
|
149
|
-
const allEvents = [];
|
|
150
|
-
let cursor = null;
|
|
151
|
-
let hasMore = true;
|
|
152
|
-
const world = getWorld();
|
|
153
|
-
while (hasMore) {
|
|
154
|
-
const response = await world.events.list({
|
|
155
|
-
runId,
|
|
156
|
-
pagination: {
|
|
157
|
-
sortOrder: 'asc', // Required: events must be in chronological order for replay
|
|
158
|
-
cursor: cursor ?? undefined,
|
|
159
|
-
},
|
|
160
|
-
});
|
|
161
|
-
allEvents.push(...response.data);
|
|
162
|
-
hasMore = response.hasMore;
|
|
163
|
-
cursor = response.cursor;
|
|
164
|
-
}
|
|
165
|
-
return allEvents;
|
|
166
|
-
}
|
|
167
144
|
/**
|
|
168
145
|
* Function that creates a single route which handles any workflow execution
|
|
169
146
|
* request and routes to the appropriate workflow function.
|
|
@@ -173,18 +150,21 @@ async function getAllWorkflowRunEvents(runId) {
|
|
|
173
150
|
* @returns A function that can be used as a Vercel API route.
|
|
174
151
|
*/
|
|
175
152
|
export function workflowEntrypoint(workflowCode) {
|
|
176
|
-
|
|
177
|
-
const { runId, traceCarrier: traceContext } = WorkflowInvokePayloadSchema.parse(message_);
|
|
153
|
+
const handler = getWorldHandlers().createQueueHandler('__wkf_workflow_', async (message_, metadata) => {
|
|
154
|
+
const { runId, traceCarrier: traceContext, requestedAt, } = WorkflowInvokePayloadSchema.parse(message_);
|
|
178
155
|
// Extract the workflow name from the topic name
|
|
179
156
|
const workflowName = metadata.queueName.slice('__wkf_workflow_'.length);
|
|
157
|
+
const spanLinks = await linkToCurrentContext();
|
|
180
158
|
// Invoke user workflow within the propagated trace context
|
|
181
159
|
return await withTraceContext(traceContext, async () => {
|
|
182
160
|
const world = getWorld();
|
|
183
|
-
return trace(`WORKFLOW ${workflowName}`, async (span) => {
|
|
161
|
+
return trace(`WORKFLOW ${workflowName}`, { links: spanLinks }, async (span) => {
|
|
184
162
|
span?.setAttributes({
|
|
185
163
|
...Attribute.WorkflowName(workflowName),
|
|
186
164
|
...Attribute.WorkflowOperation('execute'),
|
|
187
165
|
...Attribute.QueueName(metadata.queueName),
|
|
166
|
+
...Attribute.QueueMessageId(metadata.messageId),
|
|
167
|
+
...getQueueOverhead({ requestedAt }),
|
|
188
168
|
});
|
|
189
169
|
// TODO: validate `workflowName` exists before consuming message?
|
|
190
170
|
span?.setAttributes({
|
|
@@ -222,6 +202,24 @@ export function workflowEntrypoint(workflowCode) {
|
|
|
222
202
|
}
|
|
223
203
|
// Load all events into memory before running
|
|
224
204
|
const events = await getAllWorkflowRunEvents(workflowRun.runId);
|
|
205
|
+
// Check for any elapsed waits and create wait_completed events
|
|
206
|
+
const now = Date.now();
|
|
207
|
+
for (const event of events) {
|
|
208
|
+
if (event.eventType === 'wait_created') {
|
|
209
|
+
const resumeAt = event.eventData.resumeAt;
|
|
210
|
+
const hasCompleted = events.some((e) => e.eventType === 'wait_completed' &&
|
|
211
|
+
e.correlationId === event.correlationId);
|
|
212
|
+
// If wait has elapsed and hasn't been completed yet
|
|
213
|
+
if (!hasCompleted && now >= resumeAt.getTime()) {
|
|
214
|
+
const completedEvent = await world.events.create(runId, {
|
|
215
|
+
eventType: 'wait_completed',
|
|
216
|
+
correlationId: event.correlationId,
|
|
217
|
+
});
|
|
218
|
+
// Add the event to the events array so the workflow can see it
|
|
219
|
+
events.push(completedEvent);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
225
223
|
const result = await runWorkflow(workflowCode, workflowRun, events);
|
|
226
224
|
// Update the workflow run with the result
|
|
227
225
|
await world.runs.update(runId, {
|
|
@@ -234,94 +232,41 @@ export function workflowEntrypoint(workflowCode) {
|
|
|
234
232
|
});
|
|
235
233
|
}
|
|
236
234
|
catch (err) {
|
|
237
|
-
if (
|
|
238
|
-
const suspensionMessage = buildWorkflowSuspensionMessage(runId, err.stepCount, err.hookCount);
|
|
235
|
+
if (WorkflowSuspension.is(err)) {
|
|
236
|
+
const suspensionMessage = buildWorkflowSuspensionMessage(runId, err.stepCount, err.hookCount, err.waitCount);
|
|
239
237
|
if (suspensionMessage) {
|
|
240
|
-
|
|
241
|
-
// console.debug(suspensionMessage);
|
|
238
|
+
runtimeLogger.debug(suspensionMessage);
|
|
242
239
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
const step = await world.steps.create(runId, {
|
|
251
|
-
stepId: queueItem.correlationId,
|
|
252
|
-
stepName: queueItem.stepName,
|
|
253
|
-
input: dehydratedArgs,
|
|
254
|
-
});
|
|
255
|
-
waitUntil(Promise.all(ops));
|
|
256
|
-
await world.queue(`__wkf_step_${queueItem.stepName}`, {
|
|
257
|
-
workflowName,
|
|
258
|
-
workflowRunId: runId,
|
|
259
|
-
workflowStartedAt,
|
|
260
|
-
stepId: step.stepId,
|
|
261
|
-
traceCarrier: await serializeTraceCarrier(),
|
|
262
|
-
}, {
|
|
263
|
-
idempotencyKey: queueItem.correlationId,
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
catch (err) {
|
|
267
|
-
if (isInstanceOf(err, WorkflowAPIError) &&
|
|
268
|
-
err.status === 409) {
|
|
269
|
-
// Step already exists, so we can skip it
|
|
270
|
-
console.warn(`Step "${queueItem.stepName}" with correlation ID "${queueItem.correlationId}" already exists, skipping: ${err.message}`);
|
|
271
|
-
continue;
|
|
272
|
-
}
|
|
273
|
-
throw err;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
else if (queueItem.type === 'hook') {
|
|
277
|
-
// Handle hook operations
|
|
278
|
-
try {
|
|
279
|
-
// Create hook in database
|
|
280
|
-
const hookMetadata = typeof queueItem.metadata === 'undefined'
|
|
281
|
-
? undefined
|
|
282
|
-
: dehydrateStepArguments(queueItem.metadata, err.globalThis);
|
|
283
|
-
await world.hooks.create(runId, {
|
|
284
|
-
hookId: queueItem.correlationId,
|
|
285
|
-
token: queueItem.token,
|
|
286
|
-
metadata: hookMetadata,
|
|
287
|
-
});
|
|
288
|
-
// Create hook_created event in event log
|
|
289
|
-
await world.events.create(runId, {
|
|
290
|
-
eventType: 'hook_created',
|
|
291
|
-
correlationId: queueItem.correlationId,
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
catch (err) {
|
|
295
|
-
if (isInstanceOf(err, WorkflowAPIError)) {
|
|
296
|
-
if (err.status === 409) {
|
|
297
|
-
// Hook already exists (duplicate hook_id constraint), so we can skip it
|
|
298
|
-
console.warn(`Hook with correlation ID "${queueItem.correlationId}" already exists, skipping: ${err.message}`);
|
|
299
|
-
continue;
|
|
300
|
-
}
|
|
301
|
-
else if (err.status === 410) {
|
|
302
|
-
// Workflow has already completed, so no-op
|
|
303
|
-
console.warn(`Workflow run "${runId}" has already completed, skipping hook "${queueItem.correlationId}": ${err.message}`);
|
|
304
|
-
continue;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
throw err;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
span?.setAttributes({
|
|
312
|
-
...Attribute.WorkflowRunStatus('pending_steps'),
|
|
313
|
-
...Attribute.WorkflowStepsCreated(err.steps.length),
|
|
240
|
+
const result = await handleSuspension({
|
|
241
|
+
suspension: err,
|
|
242
|
+
world,
|
|
243
|
+
runId,
|
|
244
|
+
workflowName,
|
|
245
|
+
workflowStartedAt,
|
|
246
|
+
span,
|
|
314
247
|
});
|
|
248
|
+
if (result.timeoutSeconds !== undefined) {
|
|
249
|
+
return { timeoutSeconds: result.timeoutSeconds };
|
|
250
|
+
}
|
|
315
251
|
}
|
|
316
252
|
else {
|
|
317
253
|
const errorName = getErrorName(err);
|
|
318
|
-
const
|
|
254
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
255
|
+
let errorStack = getErrorStack(err);
|
|
256
|
+
// Remap error stack using source maps to show original source locations
|
|
257
|
+
if (errorStack) {
|
|
258
|
+
const parsedName = parseWorkflowName(workflowName);
|
|
259
|
+
const filename = parsedName?.path || workflowName;
|
|
260
|
+
errorStack = remapErrorStack(errorStack, filename, workflowCode);
|
|
261
|
+
}
|
|
319
262
|
console.error(`${errorName} while running "${runId}" workflow:\n\n${errorStack}`);
|
|
320
263
|
await world.runs.update(runId, {
|
|
321
264
|
status: 'failed',
|
|
322
|
-
error:
|
|
323
|
-
|
|
324
|
-
|
|
265
|
+
error: {
|
|
266
|
+
message: errorMessage,
|
|
267
|
+
stack: errorStack,
|
|
268
|
+
// TODO: include error codes when we define them
|
|
269
|
+
},
|
|
325
270
|
});
|
|
326
271
|
span?.setAttributes({
|
|
327
272
|
...Attribute.WorkflowRunStatus('failed'),
|
|
@@ -333,222 +278,9 @@ export function workflowEntrypoint(workflowCode) {
|
|
|
333
278
|
}); // End withTraceContext
|
|
334
279
|
});
|
|
335
280
|
});
|
|
281
|
+
return withHealthCheck(handler);
|
|
336
282
|
}
|
|
337
|
-
/**
|
|
338
|
-
* A single route that handles any step execution request and routes to the
|
|
339
|
-
* appropriate step function. We may eventually want to create different bundles
|
|
340
|
-
* for each step, this is temporary.
|
|
341
|
-
*/
|
|
342
|
-
export const stepEntrypoint =
|
|
343
|
-
/* @__PURE__ */ getWorldHandlers().createQueueHandler('__wkf_step_', async (message_, metadata) => {
|
|
344
|
-
const { workflowName, workflowRunId, workflowStartedAt, stepId, traceCarrier: traceContext, } = StepInvokePayloadSchema.parse(message_);
|
|
345
|
-
// Execute step within the propagated trace context
|
|
346
|
-
return await withTraceContext(traceContext, async () => {
|
|
347
|
-
// Extract the step name from the topic name
|
|
348
|
-
const stepName = metadata.queueName.slice('__wkf_step_'.length);
|
|
349
|
-
const world = getWorld();
|
|
350
|
-
return trace(`STEP ${stepName}`, async (span) => {
|
|
351
|
-
span?.setAttributes({
|
|
352
|
-
...Attribute.StepName(stepName),
|
|
353
|
-
...Attribute.StepAttempt(metadata.attempt),
|
|
354
|
-
...Attribute.QueueName(metadata.queueName),
|
|
355
|
-
});
|
|
356
|
-
const stepFn = getStepFunction(stepName);
|
|
357
|
-
if (!stepFn) {
|
|
358
|
-
throw new Error(`Step "${stepName}" not found`);
|
|
359
|
-
}
|
|
360
|
-
if (typeof stepFn !== 'function') {
|
|
361
|
-
throw new Error(`Step "${stepName}" is not a function (got ${typeof stepFn})`);
|
|
362
|
-
}
|
|
363
|
-
span?.setAttributes({
|
|
364
|
-
...Attribute.WorkflowName(workflowName),
|
|
365
|
-
...Attribute.WorkflowRunId(workflowRunId),
|
|
366
|
-
...Attribute.StepId(stepId),
|
|
367
|
-
...Attribute.StepMaxRetries(stepFn.maxRetries ?? 3),
|
|
368
|
-
...Attribute.StepTracePropagated(!!traceContext),
|
|
369
|
-
});
|
|
370
|
-
let step = await world.steps.get(workflowRunId, stepId);
|
|
371
|
-
runtimeLogger.debug('Step execution details', {
|
|
372
|
-
stepName,
|
|
373
|
-
stepId: step.stepId,
|
|
374
|
-
status: step.status,
|
|
375
|
-
attempt: step.attempt,
|
|
376
|
-
});
|
|
377
|
-
span?.setAttributes({
|
|
378
|
-
...Attribute.StepStatus(step.status),
|
|
379
|
-
});
|
|
380
|
-
let result;
|
|
381
|
-
const attempt = step.attempt + 1;
|
|
382
|
-
try {
|
|
383
|
-
if (step.status !== 'pending') {
|
|
384
|
-
// We should only be running the step if it's pending
|
|
385
|
-
// (initial state, or state set on re-try), so the step has been
|
|
386
|
-
// invoked erroneously.
|
|
387
|
-
console.error(`[Workflows] "${workflowRunId}" - Step invoked erroneously, expected status "pending", got "${step.status}" instead, skipping execution`);
|
|
388
|
-
span?.setAttributes({
|
|
389
|
-
...Attribute.StepSkipped(true),
|
|
390
|
-
...Attribute.StepSkipReason(step.status),
|
|
391
|
-
});
|
|
392
|
-
return;
|
|
393
|
-
}
|
|
394
|
-
await world.events.create(workflowRunId, {
|
|
395
|
-
eventType: 'step_started', // TODO: Replace with 'step_retrying'
|
|
396
|
-
correlationId: stepId,
|
|
397
|
-
});
|
|
398
|
-
step = await world.steps.update(workflowRunId, stepId, {
|
|
399
|
-
attempt,
|
|
400
|
-
status: 'running',
|
|
401
|
-
});
|
|
402
|
-
if (!step.startedAt) {
|
|
403
|
-
throw new WorkflowRuntimeError(`Step "${stepId}" has no "startedAt" timestamp`);
|
|
404
|
-
}
|
|
405
|
-
// Hydrate the step input arguments
|
|
406
|
-
const ops = [];
|
|
407
|
-
const args = hydrateStepArguments(step.input, ops);
|
|
408
|
-
span?.setAttributes({
|
|
409
|
-
...Attribute.StepArgumentsCount(args.length),
|
|
410
|
-
});
|
|
411
|
-
result = await contextStorage.run({
|
|
412
|
-
stepMetadata: {
|
|
413
|
-
stepId,
|
|
414
|
-
stepStartedAt: new Date(+step.startedAt),
|
|
415
|
-
attempt,
|
|
416
|
-
},
|
|
417
|
-
workflowMetadata: {
|
|
418
|
-
workflowRunId,
|
|
419
|
-
workflowStartedAt: new Date(+workflowStartedAt),
|
|
420
|
-
// TODO: there should be a getUrl method on the world interface itself. This
|
|
421
|
-
// solution only works for vercel + embedded worlds.
|
|
422
|
-
url: process.env.VERCEL_URL
|
|
423
|
-
? `https://${process.env.VERCEL_URL}`
|
|
424
|
-
: `http://localhost:${process.env.PORT || 3000}`,
|
|
425
|
-
},
|
|
426
|
-
}, () => stepFn(...args));
|
|
427
|
-
result = dehydrateStepReturnValue(result, ops);
|
|
428
|
-
waitUntil(Promise.all(ops));
|
|
429
|
-
// Update the event log with the step result
|
|
430
|
-
await world.events.create(workflowRunId, {
|
|
431
|
-
eventType: 'step_completed',
|
|
432
|
-
correlationId: stepId,
|
|
433
|
-
eventData: {
|
|
434
|
-
result: result,
|
|
435
|
-
},
|
|
436
|
-
});
|
|
437
|
-
await world.steps.update(workflowRunId, stepId, {
|
|
438
|
-
status: 'completed',
|
|
439
|
-
output: result,
|
|
440
|
-
});
|
|
441
|
-
span?.setAttributes({
|
|
442
|
-
...Attribute.StepStatus('completed'),
|
|
443
|
-
...Attribute.StepResultType(typeof result),
|
|
444
|
-
});
|
|
445
|
-
}
|
|
446
|
-
catch (err) {
|
|
447
|
-
span?.setAttributes({
|
|
448
|
-
...Attribute.StepErrorName(getErrorName(err)),
|
|
449
|
-
...Attribute.StepErrorMessage(String(err)),
|
|
450
|
-
});
|
|
451
|
-
if (isInstanceOf(err, WorkflowAPIError)) {
|
|
452
|
-
if (err.status === 410) {
|
|
453
|
-
// Workflow has already completed, so no-op
|
|
454
|
-
console.warn(`Workflow run "${workflowRunId}" has already completed, skipping step "${stepId}": ${err.message}`);
|
|
455
|
-
return;
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
if (isInstanceOf(err, FatalError)) {
|
|
459
|
-
const stackLines = getErrorStack(err).split('\n').slice(0, 4);
|
|
460
|
-
console.error(`[Workflows] "${workflowRunId}" - Encountered \`FatalError\` while executing step "${stepName}":\n > ${stackLines.join('\n > ')}\n\nBubbling up error to parent workflow`);
|
|
461
|
-
// Fatal error - store the error in the event log and re-invoke the workflow
|
|
462
|
-
await world.events.create(workflowRunId, {
|
|
463
|
-
eventType: 'step_failed',
|
|
464
|
-
correlationId: stepId,
|
|
465
|
-
eventData: {
|
|
466
|
-
error: String(err),
|
|
467
|
-
stack: err.stack,
|
|
468
|
-
fatal: true,
|
|
469
|
-
},
|
|
470
|
-
});
|
|
471
|
-
await world.steps.update(workflowRunId, stepId, {
|
|
472
|
-
status: 'failed',
|
|
473
|
-
error: String(err),
|
|
474
|
-
// TODO: include error codes when we define them
|
|
475
|
-
// TODO: serialize/include the error name and stack?
|
|
476
|
-
});
|
|
477
|
-
span?.setAttributes({
|
|
478
|
-
...Attribute.StepStatus('failed'),
|
|
479
|
-
...Attribute.StepFatalError(true),
|
|
480
|
-
});
|
|
481
|
-
}
|
|
482
|
-
else {
|
|
483
|
-
const maxRetries = stepFn.maxRetries ?? 3;
|
|
484
|
-
span?.setAttributes({
|
|
485
|
-
...Attribute.StepAttempt(attempt),
|
|
486
|
-
...Attribute.StepMaxRetries(maxRetries),
|
|
487
|
-
});
|
|
488
|
-
if (attempt >= maxRetries) {
|
|
489
|
-
// Max retries reached
|
|
490
|
-
const stackLines = getErrorStack(err).split('\n').slice(0, 4);
|
|
491
|
-
console.error(`[Workflows] "${workflowRunId}" - Encountered \`Error\` while executing step "${stepName}" (attempt ${attempt}):\n > ${stackLines.join('\n > ')}\n\n Max retries reached\n Bubbling error to parent workflow`);
|
|
492
|
-
const errorMessage = `Step "${stepName}" failed after max retries: ${String(err)}`;
|
|
493
|
-
await world.events.create(workflowRunId, {
|
|
494
|
-
eventType: 'step_failed',
|
|
495
|
-
correlationId: stepId,
|
|
496
|
-
eventData: {
|
|
497
|
-
error: errorMessage,
|
|
498
|
-
stack: getErrorStack(err),
|
|
499
|
-
fatal: true,
|
|
500
|
-
},
|
|
501
|
-
});
|
|
502
|
-
await world.steps.update(workflowRunId, stepId, {
|
|
503
|
-
status: 'failed',
|
|
504
|
-
error: errorMessage,
|
|
505
|
-
});
|
|
506
|
-
span?.setAttributes({
|
|
507
|
-
...Attribute.StepStatus('failed'),
|
|
508
|
-
...Attribute.StepRetryExhausted(true),
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
else {
|
|
512
|
-
// Not at max retries yet - log as a retryable error
|
|
513
|
-
if (isInstanceOf(err, RetryableError)) {
|
|
514
|
-
console.warn(`[Workflows] "${workflowRunId}" - Encountered \`RetryableError\` while executing step "${stepName}" (attempt ${attempt}):\n > ${String(err.message)}\n\n This step has failed but will be retried`);
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
const stackLines = getErrorStack(err).split('\n').slice(0, 4);
|
|
518
|
-
console.error(`[Workflows] "${workflowRunId}" - Encountered \`Error\` while executing step "${stepName}" (attempt ${attempt}):\n > ${stackLines.join('\n > ')}\n\n This step has failed but will be retried`);
|
|
519
|
-
}
|
|
520
|
-
await world.events.create(workflowRunId, {
|
|
521
|
-
eventType: 'step_failed',
|
|
522
|
-
correlationId: stepId,
|
|
523
|
-
eventData: {
|
|
524
|
-
error: String(err),
|
|
525
|
-
stack: getErrorStack(err),
|
|
526
|
-
},
|
|
527
|
-
});
|
|
528
|
-
await world.steps.update(workflowRunId, stepId, {
|
|
529
|
-
status: 'pending', // TODO: Should be "retrying" once we have that status
|
|
530
|
-
});
|
|
531
|
-
const timeoutSeconds = Math.max(1, isInstanceOf(err, RetryableError)
|
|
532
|
-
? Math.floor((+err.retryAfter.getTime() - Date.now()) / 1000)
|
|
533
|
-
: 1);
|
|
534
|
-
span?.setAttributes({
|
|
535
|
-
...Attribute.StepRetryTimeoutSeconds(timeoutSeconds),
|
|
536
|
-
...Attribute.StepRetryWillRetry(true),
|
|
537
|
-
});
|
|
538
|
-
// It's a retryable error - so have the queue keep the message visible
|
|
539
|
-
// so that it gets retried.
|
|
540
|
-
return { timeoutSeconds };
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
await world.queue(`__wkf_workflow_${workflowName}`, {
|
|
545
|
-
runId: workflowRunId,
|
|
546
|
-
traceCarrier: await serializeTraceCarrier(),
|
|
547
|
-
});
|
|
548
|
-
});
|
|
549
|
-
});
|
|
550
|
-
});
|
|
551
283
|
// this is a no-op placeholder as the client is
|
|
552
284
|
// expecting this to be present but we aren't actually using it
|
|
553
285
|
export function runStep() { }
|
|
554
|
-
//# sourceMappingURL=runtime.js.map
|
|
286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLDRCQUE0QixHQUM3QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFFTCwyQkFBMkIsR0FJNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixlQUFlLEdBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhFLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsMEJBQTBCLEdBQzNCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxTQUFTLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pELE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsc0JBQXNCLEdBQ3ZCLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHNUMsT0FBTyxFQUFFLGtCQUFrQixF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
|
package/dist/schemas.d.ts
CHANGED
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
export declare const WorkflowInvokePayloadSchema: z.ZodObject<{
|
|
3
|
-
runId: z.ZodString;
|
|
4
|
-
traceCarrier: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
5
|
-
}, z.core.$strip>;
|
|
6
|
-
export declare const StepInvokePayloadSchema: z.ZodObject<{
|
|
7
|
-
workflowName: z.ZodString;
|
|
8
|
-
workflowRunId: z.ZodString;
|
|
9
|
-
workflowStartedAt: z.ZodNumber;
|
|
10
|
-
stepId: z.ZodString;
|
|
11
|
-
traceCarrier: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
12
|
-
}, z.core.$strip>;
|
|
13
|
-
export type WorkflowInvokePayload = z.infer<typeof WorkflowInvokePayloadSchema>;
|
|
14
|
-
export type StepInvokePayload = z.infer<typeof StepInvokePayloadSchema>;
|
|
15
1
|
/**
|
|
16
2
|
* A serializable value:
|
|
17
3
|
* Any valid JSON object is serializable
|
|
@@ -25,5 +11,5 @@ export type StepInvokePayload = z.infer<typeof StepInvokePayloadSchema>;
|
|
|
25
11
|
*/
|
|
26
12
|
export type Serializable = string | number | boolean | null | undefined | Serializable[] | {
|
|
27
13
|
[key: string]: Serializable;
|
|
28
|
-
} | ArrayBuffer | BigInt64Array | BigUint64Array | Date | Float32Array | Float64Array | Headers | Int8Array | Int16Array | Int32Array | Map<Serializable, Serializable> | ReadableStream<Uint8Array> | RegExp | Response | Set<Serializable> | URL | URLSearchParams | Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array | WritableStream<Uint8Array
|
|
14
|
+
} | ArrayBuffer | bigint | BigInt64Array | BigUint64Array | Date | Float32Array | Float64Array | Headers | Int8Array | Int16Array | Int32Array | Map<Serializable, Serializable> | ReadableStream<Uint8Array> | RegExp | Response | Set<Serializable> | URL | URLSearchParams | Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array | WritableStream<Uint8Array> | ((...args: Serializable[]) => Promise<Serializable>);
|
|
29
15
|
//# sourceMappingURL=schemas.d.ts.map
|
package/dist/schemas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GAEpB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,YAAY,EAAE,GACd;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,GAG/B,WAAW,GACX,MAAM,GACN,aAAa,GACb,cAAc,GACd,IAAI,GACJ,YAAY,GACZ,YAAY,GACZ,OAAO,GACP,SAAS,GACT,UAAU,GACV,UAAU,GACV,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,GAC/B,cAAc,CAAC,UAAU,CAAC,GAC1B,MAAM,GACN,QAAQ,GACR,GAAG,CAAC,YAAY,CAAC,GACjB,GAAG,GACH,eAAe,GACf,UAAU,GACV,iBAAiB,GACjB,WAAW,GACX,WAAW,GACX,cAAc,CAAC,UAAU,CAAC,GAC1B,CAAC,CAAC,GAAG,IAAI,EAAE,YAAY,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC"}
|
package/dist/schemas.js
CHANGED
|
@@ -1,15 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const TraceCarrierSchema = z.record(z.string(), z.string());
|
|
4
|
-
export const WorkflowInvokePayloadSchema = z.object({
|
|
5
|
-
runId: z.string(),
|
|
6
|
-
traceCarrier: TraceCarrierSchema.optional(),
|
|
7
|
-
});
|
|
8
|
-
export const StepInvokePayloadSchema = z.object({
|
|
9
|
-
workflowName: z.string(),
|
|
10
|
-
workflowRunId: z.string(),
|
|
11
|
-
workflowStartedAt: z.number(),
|
|
12
|
-
stepId: z.string(),
|
|
13
|
-
traceCarrier: TraceCarrierSchema.optional(),
|
|
14
|
-
});
|
|
15
|
-
//# sourceMappingURL=schemas.js.map
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zY2hlbWFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
|