@workflow/core 4.0.1-beta.2 → 4.0.1-beta.21
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 +10 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +14 -2
- 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.map +1 -1
- package/dist/observability.js +39 -11
- package/dist/parse-name.js +1 -1
- package/dist/private.d.ts +5 -0
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +6 -1
- 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 +5 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +56 -45
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +20 -20
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +213 -57
- 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 +54 -7
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +129 -34
- 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 +35 -6
- package/dist/symbols.d.ts +1 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +2 -1
- package/dist/telemetry/semantic-conventions.d.ts +46 -38
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +7 -3
- package/dist/telemetry.d.ts +8 -4
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +20 -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 +2 -2
- 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 +55 -0
- package/dist/workflow/writable-stream.js +1 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +22 -7
- 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,16 +1,19 @@
|
|
|
1
1
|
import { waitUntil } from '@vercel/functions';
|
|
2
2
|
import { FatalError, RetryableError, WorkflowAPIError, WorkflowRunCancelledError, WorkflowRunFailedError, WorkflowRunNotCompletedError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
3
|
+
import { getPort } from '@workflow/utils/get-port';
|
|
4
|
+
import { StepInvokePayloadSchema, WorkflowInvokePayloadSchema, } from '@workflow/world';
|
|
3
5
|
import { WorkflowSuspension } from './global.js';
|
|
4
6
|
import { runtimeLogger } from './logger.js';
|
|
7
|
+
import { parseWorkflowName } from './parse-name.js';
|
|
5
8
|
import { getStepFunction } from './private.js';
|
|
6
9
|
import { getWorld, getWorldHandlers } from './runtime/world.js';
|
|
7
|
-
import { StepInvokePayloadSchema, WorkflowInvokePayloadSchema, } from './schemas.js';
|
|
8
10
|
import { dehydrateStepArguments, dehydrateStepReturnValue, getExternalRevivers, hydrateStepArguments, hydrateWorkflowReturnValue, } from './serialization.js';
|
|
11
|
+
import { remapErrorStack } from './source-map.js';
|
|
9
12
|
// TODO: move step handler out to a separate file
|
|
10
13
|
import { contextStorage } from './step/context-storage.js';
|
|
11
14
|
import * as Attribute from './telemetry/semantic-conventions.js';
|
|
12
|
-
import { serializeTraceCarrier, trace, withTraceContext } from './telemetry.js';
|
|
13
|
-
import { getErrorName, getErrorStack
|
|
15
|
+
import { getSpanKind, linkToCurrentContext, serializeTraceCarrier, trace, withTraceContext, } from './telemetry.js';
|
|
16
|
+
import { getErrorName, getErrorStack } from './types.js';
|
|
14
17
|
import { buildWorkflowSuspensionMessage, getWorkflowRunStreamId, } from './util.js';
|
|
15
18
|
import { runWorkflow } from './workflow.js';
|
|
16
19
|
export { WorkflowSuspension } from './global.js';
|
|
@@ -95,7 +98,7 @@ export class Run {
|
|
|
95
98
|
getReadable(options = {}) {
|
|
96
99
|
const { ops = [], global = globalThis, startIndex, namespace } = options;
|
|
97
100
|
const name = getWorkflowRunStreamId(this.runId, namespace);
|
|
98
|
-
return getExternalRevivers(global, ops).ReadableStream({
|
|
101
|
+
return getExternalRevivers(global, ops, this.runId).ReadableStream({
|
|
99
102
|
name,
|
|
100
103
|
startIndex,
|
|
101
104
|
});
|
|
@@ -110,18 +113,18 @@ export class Run {
|
|
|
110
113
|
try {
|
|
111
114
|
const run = await this.world.runs.get(this.runId);
|
|
112
115
|
if (run.status === 'completed') {
|
|
113
|
-
return hydrateWorkflowReturnValue(run.output, [],
|
|
116
|
+
return hydrateWorkflowReturnValue(run.output, [], this.runId);
|
|
114
117
|
}
|
|
115
118
|
if (run.status === 'cancelled') {
|
|
116
119
|
throw new WorkflowRunCancelledError(this.runId);
|
|
117
120
|
}
|
|
118
121
|
if (run.status === 'failed') {
|
|
119
|
-
throw new WorkflowRunFailedError(this.runId, run.error
|
|
122
|
+
throw new WorkflowRunFailedError(this.runId, run.error);
|
|
120
123
|
}
|
|
121
124
|
throw new WorkflowRunNotCompletedError(this.runId, run.status);
|
|
122
125
|
}
|
|
123
126
|
catch (error) {
|
|
124
|
-
if (error
|
|
127
|
+
if (WorkflowRunNotCompletedError.is(error)) {
|
|
125
128
|
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
126
129
|
continue;
|
|
127
130
|
}
|
|
@@ -174,17 +177,20 @@ async function getAllWorkflowRunEvents(runId) {
|
|
|
174
177
|
*/
|
|
175
178
|
export function workflowEntrypoint(workflowCode) {
|
|
176
179
|
return getWorldHandlers().createQueueHandler('__wkf_workflow_', async (message_, metadata) => {
|
|
177
|
-
const { runId, traceCarrier: traceContext } = WorkflowInvokePayloadSchema.parse(message_);
|
|
180
|
+
const { runId, traceCarrier: traceContext, requestedAt, } = WorkflowInvokePayloadSchema.parse(message_);
|
|
178
181
|
// Extract the workflow name from the topic name
|
|
179
182
|
const workflowName = metadata.queueName.slice('__wkf_workflow_'.length);
|
|
183
|
+
const spanLinks = await linkToCurrentContext();
|
|
180
184
|
// Invoke user workflow within the propagated trace context
|
|
181
185
|
return await withTraceContext(traceContext, async () => {
|
|
182
186
|
const world = getWorld();
|
|
183
|
-
return trace(`WORKFLOW ${workflowName}`, async (span) => {
|
|
187
|
+
return trace(`WORKFLOW ${workflowName}`, { links: spanLinks }, async (span) => {
|
|
184
188
|
span?.setAttributes({
|
|
185
189
|
...Attribute.WorkflowName(workflowName),
|
|
186
190
|
...Attribute.WorkflowOperation('execute'),
|
|
187
191
|
...Attribute.QueueName(metadata.queueName),
|
|
192
|
+
...Attribute.QueueMessageId(metadata.messageId),
|
|
193
|
+
...getQueueOverhead({ requestedAt }),
|
|
188
194
|
});
|
|
189
195
|
// TODO: validate `workflowName` exists before consuming message?
|
|
190
196
|
span?.setAttributes({
|
|
@@ -222,6 +228,24 @@ export function workflowEntrypoint(workflowCode) {
|
|
|
222
228
|
}
|
|
223
229
|
// Load all events into memory before running
|
|
224
230
|
const events = await getAllWorkflowRunEvents(workflowRun.runId);
|
|
231
|
+
// Check for any elapsed waits and create wait_completed events
|
|
232
|
+
const now = Date.now();
|
|
233
|
+
for (const event of events) {
|
|
234
|
+
if (event.eventType === 'wait_created') {
|
|
235
|
+
const resumeAt = event.eventData.resumeAt;
|
|
236
|
+
const hasCompleted = events.some((e) => e.eventType === 'wait_completed' &&
|
|
237
|
+
e.correlationId === event.correlationId);
|
|
238
|
+
// If wait has elapsed and hasn't been completed yet
|
|
239
|
+
if (!hasCompleted && now >= resumeAt.getTime()) {
|
|
240
|
+
const completedEvent = await world.events.create(runId, {
|
|
241
|
+
eventType: 'wait_completed',
|
|
242
|
+
correlationId: event.correlationId,
|
|
243
|
+
});
|
|
244
|
+
// Add the event to the events array so the workflow can see it
|
|
245
|
+
events.push(completedEvent);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
225
249
|
const result = await runWorkflow(workflowCode, workflowRun, events);
|
|
226
250
|
// Update the workflow run with the result
|
|
227
251
|
await world.runs.update(runId, {
|
|
@@ -234,38 +258,48 @@ export function workflowEntrypoint(workflowCode) {
|
|
|
234
258
|
});
|
|
235
259
|
}
|
|
236
260
|
catch (err) {
|
|
237
|
-
if (
|
|
238
|
-
const suspensionMessage = buildWorkflowSuspensionMessage(runId, err.stepCount, err.hookCount);
|
|
261
|
+
if (WorkflowSuspension.is(err)) {
|
|
262
|
+
const suspensionMessage = buildWorkflowSuspensionMessage(runId, err.stepCount, err.hookCount, err.waitCount);
|
|
239
263
|
if (suspensionMessage) {
|
|
240
264
|
// Note: suspensionMessage logged only in debug mode to avoid production noise
|
|
241
265
|
// console.debug(suspensionMessage);
|
|
242
266
|
}
|
|
243
267
|
// Process each operation in the queue (steps and hooks)
|
|
268
|
+
let minTimeoutSeconds = null;
|
|
244
269
|
for (const queueItem of err.steps) {
|
|
245
270
|
if (queueItem.type === 'step') {
|
|
246
271
|
// Handle step operations
|
|
247
272
|
const ops = [];
|
|
248
|
-
const
|
|
273
|
+
const dehydratedInput = dehydrateStepArguments({
|
|
274
|
+
args: queueItem.args,
|
|
275
|
+
closureVars: queueItem.closureVars,
|
|
276
|
+
}, err.globalThis);
|
|
249
277
|
try {
|
|
250
278
|
const step = await world.steps.create(runId, {
|
|
251
279
|
stepId: queueItem.correlationId,
|
|
252
280
|
stepName: queueItem.stepName,
|
|
253
|
-
input:
|
|
281
|
+
input: dehydratedInput,
|
|
254
282
|
});
|
|
255
|
-
waitUntil(Promise.all(ops))
|
|
256
|
-
|
|
283
|
+
waitUntil(Promise.all(ops).catch((err) => {
|
|
284
|
+
// Ignore expected client disconnect errors (e.g., browser refresh during streaming)
|
|
285
|
+
const isAbortError = err?.name === 'AbortError' ||
|
|
286
|
+
err?.name === 'ResponseAborted';
|
|
287
|
+
if (!isAbortError)
|
|
288
|
+
throw err;
|
|
289
|
+
}));
|
|
290
|
+
await queueMessage(world, `__wkf_step_${queueItem.stepName}`, {
|
|
257
291
|
workflowName,
|
|
258
292
|
workflowRunId: runId,
|
|
259
293
|
workflowStartedAt,
|
|
260
294
|
stepId: step.stepId,
|
|
261
295
|
traceCarrier: await serializeTraceCarrier(),
|
|
296
|
+
requestedAt: new Date(),
|
|
262
297
|
}, {
|
|
263
298
|
idempotencyKey: queueItem.correlationId,
|
|
264
299
|
});
|
|
265
300
|
}
|
|
266
301
|
catch (err) {
|
|
267
|
-
if (
|
|
268
|
-
err.status === 409) {
|
|
302
|
+
if (WorkflowAPIError.is(err) && err.status === 409) {
|
|
269
303
|
// Step already exists, so we can skip it
|
|
270
304
|
console.warn(`Step "${queueItem.stepName}" with correlation ID "${queueItem.correlationId}" already exists, skipping: ${err.message}`);
|
|
271
305
|
continue;
|
|
@@ -292,7 +326,7 @@ export function workflowEntrypoint(workflowCode) {
|
|
|
292
326
|
});
|
|
293
327
|
}
|
|
294
328
|
catch (err) {
|
|
295
|
-
if (
|
|
329
|
+
if (WorkflowAPIError.is(err)) {
|
|
296
330
|
if (err.status === 409) {
|
|
297
331
|
// Hook already exists (duplicate hook_id constraint), so we can skip it
|
|
298
332
|
console.warn(`Hook with correlation ID "${queueItem.correlationId}" already exists, skipping: ${err.message}`);
|
|
@@ -307,21 +341,67 @@ export function workflowEntrypoint(workflowCode) {
|
|
|
307
341
|
throw err;
|
|
308
342
|
}
|
|
309
343
|
}
|
|
344
|
+
else if (queueItem.type === 'wait') {
|
|
345
|
+
// Handle wait operations
|
|
346
|
+
try {
|
|
347
|
+
// Only create wait_created event if it hasn't been created yet
|
|
348
|
+
if (!queueItem.hasCreatedEvent) {
|
|
349
|
+
await world.events.create(runId, {
|
|
350
|
+
eventType: 'wait_created',
|
|
351
|
+
correlationId: queueItem.correlationId,
|
|
352
|
+
eventData: {
|
|
353
|
+
resumeAt: queueItem.resumeAt,
|
|
354
|
+
},
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
// Calculate how long to wait before resuming
|
|
358
|
+
const now = Date.now();
|
|
359
|
+
const resumeAtMs = queueItem.resumeAt.getTime();
|
|
360
|
+
const delayMs = Math.max(1000, resumeAtMs - now);
|
|
361
|
+
const timeoutSeconds = Math.ceil(delayMs / 1000);
|
|
362
|
+
// Track the minimum timeout across all waits
|
|
363
|
+
if (minTimeoutSeconds === null ||
|
|
364
|
+
timeoutSeconds < minTimeoutSeconds) {
|
|
365
|
+
minTimeoutSeconds = timeoutSeconds;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
if (WorkflowAPIError.is(err) && err.status === 409) {
|
|
370
|
+
// Wait already exists, so we can skip it
|
|
371
|
+
console.warn(`Wait with correlation ID "${queueItem.correlationId}" already exists, skipping: ${err.message}`);
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
throw err;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
310
377
|
}
|
|
311
378
|
span?.setAttributes({
|
|
312
379
|
...Attribute.WorkflowRunStatus('pending_steps'),
|
|
313
380
|
...Attribute.WorkflowStepsCreated(err.steps.length),
|
|
314
381
|
});
|
|
382
|
+
// If we encountered any waits, return the minimum timeout
|
|
383
|
+
if (minTimeoutSeconds !== null) {
|
|
384
|
+
return { timeoutSeconds: minTimeoutSeconds };
|
|
385
|
+
}
|
|
315
386
|
}
|
|
316
387
|
else {
|
|
317
388
|
const errorName = getErrorName(err);
|
|
318
|
-
const
|
|
389
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
390
|
+
let errorStack = getErrorStack(err);
|
|
391
|
+
// Remap error stack using source maps to show original source locations
|
|
392
|
+
if (errorStack) {
|
|
393
|
+
const parsedName = parseWorkflowName(workflowName);
|
|
394
|
+
const filename = parsedName?.path || workflowName;
|
|
395
|
+
errorStack = remapErrorStack(errorStack, filename, workflowCode);
|
|
396
|
+
}
|
|
319
397
|
console.error(`${errorName} while running "${runId}" workflow:\n\n${errorStack}`);
|
|
320
398
|
await world.runs.update(runId, {
|
|
321
399
|
status: 'failed',
|
|
322
|
-
error:
|
|
323
|
-
|
|
324
|
-
|
|
400
|
+
error: {
|
|
401
|
+
message: errorMessage,
|
|
402
|
+
stack: errorStack,
|
|
403
|
+
// TODO: include error codes when we define them
|
|
404
|
+
},
|
|
325
405
|
});
|
|
326
406
|
span?.setAttributes({
|
|
327
407
|
...Attribute.WorkflowRunStatus('failed'),
|
|
@@ -341,17 +421,22 @@ export function workflowEntrypoint(workflowCode) {
|
|
|
341
421
|
*/
|
|
342
422
|
export const stepEntrypoint =
|
|
343
423
|
/* @__PURE__ */ getWorldHandlers().createQueueHandler('__wkf_step_', async (message_, metadata) => {
|
|
344
|
-
const { workflowName, workflowRunId, workflowStartedAt, stepId, traceCarrier: traceContext, } = StepInvokePayloadSchema.parse(message_);
|
|
424
|
+
const { workflowName, workflowRunId, workflowStartedAt, stepId, traceCarrier: traceContext, requestedAt, } = StepInvokePayloadSchema.parse(message_);
|
|
425
|
+
const spanLinks = await linkToCurrentContext();
|
|
345
426
|
// Execute step within the propagated trace context
|
|
346
427
|
return await withTraceContext(traceContext, async () => {
|
|
347
428
|
// Extract the step name from the topic name
|
|
348
429
|
const stepName = metadata.queueName.slice('__wkf_step_'.length);
|
|
349
430
|
const world = getWorld();
|
|
350
|
-
|
|
431
|
+
// Get the port early to avoid async operations during step execution
|
|
432
|
+
const port = await getPort();
|
|
433
|
+
return trace(`STEP ${stepName}`, { kind: await getSpanKind('CONSUMER'), links: spanLinks }, async (span) => {
|
|
351
434
|
span?.setAttributes({
|
|
352
435
|
...Attribute.StepName(stepName),
|
|
353
436
|
...Attribute.StepAttempt(metadata.attempt),
|
|
354
437
|
...Attribute.QueueName(metadata.queueName),
|
|
438
|
+
...Attribute.QueueMessageId(metadata.messageId),
|
|
439
|
+
...getQueueOverhead({ requestedAt }),
|
|
355
440
|
});
|
|
356
441
|
const stepFn = getStepFunction(stepName);
|
|
357
442
|
if (!stepFn) {
|
|
@@ -377,14 +462,30 @@ export const stepEntrypoint =
|
|
|
377
462
|
span?.setAttributes({
|
|
378
463
|
...Attribute.StepStatus(step.status),
|
|
379
464
|
});
|
|
465
|
+
// Check if the step has a `retryAfter` timestamp that hasn't been reached yet
|
|
466
|
+
const now = Date.now();
|
|
467
|
+
if (step.retryAfter && step.retryAfter.getTime() > now) {
|
|
468
|
+
const timeoutSeconds = Math.ceil((step.retryAfter.getTime() - now) / 1000);
|
|
469
|
+
span?.setAttributes({
|
|
470
|
+
...Attribute.StepRetryTimeoutSeconds(timeoutSeconds),
|
|
471
|
+
});
|
|
472
|
+
runtimeLogger.debug('Step retryAfter timestamp not yet reached', {
|
|
473
|
+
stepName,
|
|
474
|
+
stepId: step.stepId,
|
|
475
|
+
retryAfter: step.retryAfter,
|
|
476
|
+
timeoutSeconds,
|
|
477
|
+
});
|
|
478
|
+
return { timeoutSeconds };
|
|
479
|
+
}
|
|
380
480
|
let result;
|
|
381
481
|
const attempt = step.attempt + 1;
|
|
382
482
|
try {
|
|
383
|
-
if (step.status
|
|
384
|
-
// We should only be running the step if it's
|
|
385
|
-
//
|
|
386
|
-
//
|
|
387
|
-
|
|
483
|
+
if (!['pending', 'running'].includes(step.status)) {
|
|
484
|
+
// We should only be running the step if it's either
|
|
485
|
+
// a) pending - initial state, or state set on re-try
|
|
486
|
+
// b) running - if a step fails mid-execution, like a function timeout
|
|
487
|
+
// otherwise, the step has been invoked erroneously
|
|
488
|
+
console.error(`[Workflows] "${workflowRunId}" - Step invoked erroneously, expected status "pending" or "running", got "${step.status}" instead, skipping execution`);
|
|
388
489
|
span?.setAttributes({
|
|
389
490
|
...Attribute.StepSkipped(true),
|
|
390
491
|
...Attribute.StepSkipReason(step.status),
|
|
@@ -402,9 +503,10 @@ export const stepEntrypoint =
|
|
|
402
503
|
if (!step.startedAt) {
|
|
403
504
|
throw new WorkflowRuntimeError(`Step "${stepId}" has no "startedAt" timestamp`);
|
|
404
505
|
}
|
|
405
|
-
// Hydrate the step input arguments
|
|
506
|
+
// Hydrate the step input arguments and closure variables
|
|
406
507
|
const ops = [];
|
|
407
|
-
const
|
|
508
|
+
const hydratedInput = hydrateStepArguments(step.input, ops, workflowRunId);
|
|
509
|
+
const args = hydratedInput.args;
|
|
408
510
|
span?.setAttributes({
|
|
409
511
|
...Attribute.StepArgumentsCount(args.length),
|
|
410
512
|
});
|
|
@@ -418,15 +520,34 @@ export const stepEntrypoint =
|
|
|
418
520
|
workflowRunId,
|
|
419
521
|
workflowStartedAt: new Date(+workflowStartedAt),
|
|
420
522
|
// TODO: there should be a getUrl method on the world interface itself. This
|
|
421
|
-
// solution only works for vercel +
|
|
523
|
+
// solution only works for vercel + local worlds.
|
|
422
524
|
url: process.env.VERCEL_URL
|
|
423
525
|
? `https://${process.env.VERCEL_URL}`
|
|
424
|
-
: `http://localhost:${
|
|
526
|
+
: `http://localhost:${port ?? 3000}`,
|
|
425
527
|
},
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
//
|
|
528
|
+
ops,
|
|
529
|
+
closureVars: hydratedInput.closureVars,
|
|
530
|
+
}, () => stepFn.apply(null, args));
|
|
531
|
+
// NOTE: None of the code from this point is guaranteed to run
|
|
532
|
+
// Since the step might fail or cause a function timeout and the process might be SIGKILL'd
|
|
533
|
+
// The workflow runtime must be resilient to the below code not executing on a failed step
|
|
534
|
+
result = dehydrateStepReturnValue(result, ops, workflowRunId);
|
|
535
|
+
waitUntil(Promise.all(ops).catch((err) => {
|
|
536
|
+
// Ignore expected client disconnect errors (e.g., browser refresh during streaming)
|
|
537
|
+
const isAbortError = err?.name === 'AbortError' ||
|
|
538
|
+
err?.name === 'ResponseAborted';
|
|
539
|
+
if (!isAbortError)
|
|
540
|
+
throw err;
|
|
541
|
+
}));
|
|
542
|
+
// Mark the step as completed first. This order is important. If a concurrent
|
|
543
|
+
// execution marked the step as complete, this request should throw, and
|
|
544
|
+
// this prevent the step_completed event in the event log
|
|
545
|
+
// TODO: this should really be atomic and handled by the world
|
|
546
|
+
await world.steps.update(workflowRunId, stepId, {
|
|
547
|
+
status: 'completed',
|
|
548
|
+
output: result,
|
|
549
|
+
});
|
|
550
|
+
// Then, append the event log with the step result
|
|
430
551
|
await world.events.create(workflowRunId, {
|
|
431
552
|
eventType: 'step_completed',
|
|
432
553
|
correlationId: stepId,
|
|
@@ -434,10 +555,6 @@ export const stepEntrypoint =
|
|
|
434
555
|
result: result,
|
|
435
556
|
},
|
|
436
557
|
});
|
|
437
|
-
await world.steps.update(workflowRunId, stepId, {
|
|
438
|
-
status: 'completed',
|
|
439
|
-
output: result,
|
|
440
|
-
});
|
|
441
558
|
span?.setAttributes({
|
|
442
559
|
...Attribute.StepStatus('completed'),
|
|
443
560
|
...Attribute.StepResultType(typeof result),
|
|
@@ -448,15 +565,16 @@ export const stepEntrypoint =
|
|
|
448
565
|
...Attribute.StepErrorName(getErrorName(err)),
|
|
449
566
|
...Attribute.StepErrorMessage(String(err)),
|
|
450
567
|
});
|
|
451
|
-
if (
|
|
568
|
+
if (WorkflowAPIError.is(err)) {
|
|
452
569
|
if (err.status === 410) {
|
|
453
570
|
// Workflow has already completed, so no-op
|
|
454
571
|
console.warn(`Workflow run "${workflowRunId}" has already completed, skipping step "${stepId}": ${err.message}`);
|
|
455
572
|
return;
|
|
456
573
|
}
|
|
457
574
|
}
|
|
458
|
-
if (
|
|
459
|
-
const
|
|
575
|
+
if (FatalError.is(err)) {
|
|
576
|
+
const errorStack = getErrorStack(err);
|
|
577
|
+
const stackLines = errorStack.split('\n').slice(0, 4);
|
|
460
578
|
console.error(`[Workflows] "${workflowRunId}" - Encountered \`FatalError\` while executing step "${stepName}":\n > ${stackLines.join('\n > ')}\n\nBubbling up error to parent workflow`);
|
|
461
579
|
// Fatal error - store the error in the event log and re-invoke the workflow
|
|
462
580
|
await world.events.create(workflowRunId, {
|
|
@@ -464,15 +582,17 @@ export const stepEntrypoint =
|
|
|
464
582
|
correlationId: stepId,
|
|
465
583
|
eventData: {
|
|
466
584
|
error: String(err),
|
|
467
|
-
stack:
|
|
585
|
+
stack: errorStack,
|
|
468
586
|
fatal: true,
|
|
469
587
|
},
|
|
470
588
|
});
|
|
471
589
|
await world.steps.update(workflowRunId, stepId, {
|
|
472
590
|
status: 'failed',
|
|
473
|
-
error:
|
|
474
|
-
|
|
475
|
-
|
|
591
|
+
error: {
|
|
592
|
+
message: err.message || String(err),
|
|
593
|
+
stack: errorStack,
|
|
594
|
+
// TODO: include error codes when we define them
|
|
595
|
+
},
|
|
476
596
|
});
|
|
477
597
|
span?.setAttributes({
|
|
478
598
|
...Attribute.StepStatus('failed'),
|
|
@@ -487,7 +607,8 @@ export const stepEntrypoint =
|
|
|
487
607
|
});
|
|
488
608
|
if (attempt >= maxRetries) {
|
|
489
609
|
// Max retries reached
|
|
490
|
-
const
|
|
610
|
+
const errorStack = getErrorStack(err);
|
|
611
|
+
const stackLines = errorStack.split('\n').slice(0, 4);
|
|
491
612
|
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
613
|
const errorMessage = `Step "${stepName}" failed after max retries: ${String(err)}`;
|
|
493
614
|
await world.events.create(workflowRunId, {
|
|
@@ -495,13 +616,16 @@ export const stepEntrypoint =
|
|
|
495
616
|
correlationId: stepId,
|
|
496
617
|
eventData: {
|
|
497
618
|
error: errorMessage,
|
|
498
|
-
stack:
|
|
619
|
+
stack: errorStack,
|
|
499
620
|
fatal: true,
|
|
500
621
|
},
|
|
501
622
|
});
|
|
502
623
|
await world.steps.update(workflowRunId, stepId, {
|
|
503
624
|
status: 'failed',
|
|
504
|
-
error:
|
|
625
|
+
error: {
|
|
626
|
+
message: errorMessage,
|
|
627
|
+
stack: errorStack,
|
|
628
|
+
},
|
|
505
629
|
});
|
|
506
630
|
span?.setAttributes({
|
|
507
631
|
...Attribute.StepStatus('failed'),
|
|
@@ -510,11 +634,13 @@ export const stepEntrypoint =
|
|
|
510
634
|
}
|
|
511
635
|
else {
|
|
512
636
|
// Not at max retries yet - log as a retryable error
|
|
513
|
-
if (
|
|
637
|
+
if (RetryableError.is(err)) {
|
|
514
638
|
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
639
|
}
|
|
516
640
|
else {
|
|
517
|
-
const stackLines = getErrorStack(err)
|
|
641
|
+
const stackLines = getErrorStack(err)
|
|
642
|
+
.split('\n')
|
|
643
|
+
.slice(0, 4);
|
|
518
644
|
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
645
|
}
|
|
520
646
|
await world.events.create(workflowRunId, {
|
|
@@ -527,9 +653,12 @@ export const stepEntrypoint =
|
|
|
527
653
|
});
|
|
528
654
|
await world.steps.update(workflowRunId, stepId, {
|
|
529
655
|
status: 'pending', // TODO: Should be "retrying" once we have that status
|
|
656
|
+
...(RetryableError.is(err) && {
|
|
657
|
+
retryAfter: err.retryAfter,
|
|
658
|
+
}),
|
|
530
659
|
});
|
|
531
|
-
const timeoutSeconds = Math.max(1,
|
|
532
|
-
? Math.
|
|
660
|
+
const timeoutSeconds = Math.max(1, RetryableError.is(err)
|
|
661
|
+
? Math.ceil((+err.retryAfter.getTime() - Date.now()) / 1000)
|
|
533
662
|
: 1);
|
|
534
663
|
span?.setAttributes({
|
|
535
664
|
...Attribute.StepRetryTimeoutSeconds(timeoutSeconds),
|
|
@@ -541,14 +670,41 @@ export const stepEntrypoint =
|
|
|
541
670
|
}
|
|
542
671
|
}
|
|
543
672
|
}
|
|
544
|
-
await world
|
|
673
|
+
await queueMessage(world, `__wkf_workflow_${workflowName}`, {
|
|
545
674
|
runId: workflowRunId,
|
|
546
675
|
traceCarrier: await serializeTraceCarrier(),
|
|
676
|
+
requestedAt: new Date(),
|
|
547
677
|
});
|
|
548
678
|
});
|
|
549
679
|
});
|
|
550
680
|
});
|
|
681
|
+
/**
|
|
682
|
+
* Queues a message to the specified queue with tracing.
|
|
683
|
+
*/
|
|
684
|
+
async function queueMessage(world, ...args) {
|
|
685
|
+
const queueName = args[0];
|
|
686
|
+
await trace('queueMessage', {
|
|
687
|
+
attributes: Attribute.QueueName(queueName),
|
|
688
|
+
kind: await getSpanKind('PRODUCER'),
|
|
689
|
+
}, async (span) => {
|
|
690
|
+
const { messageId } = await world.queue(...args);
|
|
691
|
+
span?.setAttributes(Attribute.QueueMessageId(messageId));
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Calculates the queue overhead time in milliseconds for a given message.
|
|
696
|
+
*/
|
|
697
|
+
function getQueueOverhead(message) {
|
|
698
|
+
if (!message.requestedAt)
|
|
699
|
+
return;
|
|
700
|
+
try {
|
|
701
|
+
return Attribute.QueueOverheadMs(Date.now() - message.requestedAt.getTime());
|
|
702
|
+
}
|
|
703
|
+
catch {
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
551
707
|
// this is a no-op placeholder as the client is
|
|
552
708
|
// expecting this to be present but we aren't actually using it
|
|
553
709
|
export function runStep() { }
|
|
554
|
-
//# sourceMappingURL=runtime.js.map
|
|
710
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0Qiw0QkFBNEIsRUFDNUIsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsMkJBQTJCLEdBSTVCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEUsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQiwwQkFBMEIsR0FDM0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsaURBQWlEO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssU0FBUyxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixLQUFLLEVBQ0wsZ0JBQWdCLEdBQ2pC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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==
|