@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.
Files changed (129) hide show
  1. package/LICENSE.md +201 -21
  2. package/dist/builtins.js +1 -1
  3. package/dist/create-hook.js +1 -1
  4. package/dist/define-hook.d.ts +40 -25
  5. package/dist/define-hook.d.ts.map +1 -1
  6. package/dist/define-hook.js +22 -27
  7. package/dist/events-consumer.js +1 -1
  8. package/dist/global.d.ts +10 -1
  9. package/dist/global.d.ts.map +1 -1
  10. package/dist/global.js +14 -2
  11. package/dist/index.d.ts +3 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -2
  14. package/dist/logger.js +1 -1
  15. package/dist/observability.d.ts.map +1 -1
  16. package/dist/observability.js +39 -11
  17. package/dist/parse-name.js +1 -1
  18. package/dist/private.d.ts +5 -0
  19. package/dist/private.d.ts.map +1 -1
  20. package/dist/private.js +6 -1
  21. package/dist/runtime/resume-hook.d.ts +15 -10
  22. package/dist/runtime/resume-hook.d.ts.map +1 -1
  23. package/dist/runtime/resume-hook.js +71 -61
  24. package/dist/runtime/start.d.ts +5 -1
  25. package/dist/runtime/start.d.ts.map +1 -1
  26. package/dist/runtime/start.js +56 -45
  27. package/dist/runtime/world.d.ts.map +1 -1
  28. package/dist/runtime/world.js +20 -20
  29. package/dist/runtime.d.ts +1 -1
  30. package/dist/runtime.d.ts.map +1 -1
  31. package/dist/runtime.js +213 -57
  32. package/dist/schemas.d.ts +1 -15
  33. package/dist/schemas.d.ts.map +1 -1
  34. package/dist/schemas.js +2 -15
  35. package/dist/serialization.d.ts +54 -7
  36. package/dist/serialization.d.ts.map +1 -1
  37. package/dist/serialization.js +129 -34
  38. package/dist/sleep.d.ts +33 -0
  39. package/dist/sleep.d.ts.map +1 -0
  40. package/dist/sleep.js +10 -0
  41. package/dist/source-map.d.ts +10 -0
  42. package/dist/source-map.d.ts.map +1 -0
  43. package/dist/source-map.js +56 -0
  44. package/dist/step/context-storage.d.ts +2 -0
  45. package/dist/step/context-storage.d.ts.map +1 -1
  46. package/dist/step/context-storage.js +1 -1
  47. package/dist/step/get-closure-vars.d.ts +9 -0
  48. package/dist/step/get-closure-vars.d.ts.map +1 -0
  49. package/dist/step/get-closure-vars.js +16 -0
  50. package/dist/step/get-step-metadata.js +1 -1
  51. package/dist/step/get-workflow-metadata.js +1 -1
  52. package/dist/step/writable-stream.d.ts +14 -0
  53. package/dist/step/writable-stream.d.ts.map +1 -0
  54. package/dist/step/writable-stream.js +30 -0
  55. package/dist/step.d.ts +1 -1
  56. package/dist/step.d.ts.map +1 -1
  57. package/dist/step.js +35 -6
  58. package/dist/symbols.d.ts +1 -0
  59. package/dist/symbols.d.ts.map +1 -1
  60. package/dist/symbols.js +2 -1
  61. package/dist/telemetry/semantic-conventions.d.ts +46 -38
  62. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  63. package/dist/telemetry/semantic-conventions.js +7 -3
  64. package/dist/telemetry.d.ts +8 -4
  65. package/dist/telemetry.d.ts.map +1 -1
  66. package/dist/telemetry.js +20 -6
  67. package/dist/types.d.ts +0 -7
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/types.js +1 -26
  70. package/dist/util.d.ts +9 -27
  71. package/dist/util.d.ts.map +1 -1
  72. package/dist/util.js +34 -42
  73. package/dist/vm/index.js +2 -2
  74. package/dist/vm/uuid.js +1 -1
  75. package/dist/workflow/create-hook.js +1 -1
  76. package/dist/workflow/define-hook.d.ts +3 -3
  77. package/dist/workflow/define-hook.d.ts.map +1 -1
  78. package/dist/workflow/define-hook.js +1 -1
  79. package/dist/workflow/get-workflow-metadata.js +1 -1
  80. package/dist/workflow/hook.d.ts.map +1 -1
  81. package/dist/workflow/hook.js +2 -2
  82. package/dist/workflow/index.d.ts +1 -0
  83. package/dist/workflow/index.d.ts.map +1 -1
  84. package/dist/workflow/index.js +2 -1
  85. package/dist/workflow/sleep.d.ts +4 -0
  86. package/dist/workflow/sleep.d.ts.map +1 -0
  87. package/dist/workflow/sleep.js +55 -0
  88. package/dist/workflow/writable-stream.js +1 -1
  89. package/dist/workflow.d.ts.map +1 -1
  90. package/dist/workflow.js +22 -7
  91. package/dist/writable-stream.d.ts +5 -4
  92. package/dist/writable-stream.d.ts.map +1 -1
  93. package/dist/writable-stream.js +7 -6
  94. package/package.json +21 -18
  95. package/dist/builtins.js.map +0 -1
  96. package/dist/create-hook.js.map +0 -1
  97. package/dist/define-hook.js.map +0 -1
  98. package/dist/events-consumer.js.map +0 -1
  99. package/dist/global.js.map +0 -1
  100. package/dist/index.js.map +0 -1
  101. package/dist/logger.js.map +0 -1
  102. package/dist/observability.js.map +0 -1
  103. package/dist/parse-name.js.map +0 -1
  104. package/dist/private.js.map +0 -1
  105. package/dist/runtime/resume-hook.js.map +0 -1
  106. package/dist/runtime/start.js.map +0 -1
  107. package/dist/runtime/world.js.map +0 -1
  108. package/dist/runtime.js.map +0 -1
  109. package/dist/schemas.js.map +0 -1
  110. package/dist/serialization.js.map +0 -1
  111. package/dist/step/context-storage.js.map +0 -1
  112. package/dist/step/get-step-metadata.js.map +0 -1
  113. package/dist/step/get-workflow-metadata.js.map +0 -1
  114. package/dist/step.js.map +0 -1
  115. package/dist/symbols.js.map +0 -1
  116. package/dist/telemetry/semantic-conventions.js.map +0 -1
  117. package/dist/telemetry.js.map +0 -1
  118. package/dist/types.js.map +0 -1
  119. package/dist/util.js.map +0 -1
  120. package/dist/vm/index.js.map +0 -1
  121. package/dist/vm/uuid.js.map +0 -1
  122. package/dist/workflow/create-hook.js.map +0 -1
  123. package/dist/workflow/define-hook.js.map +0 -1
  124. package/dist/workflow/get-workflow-metadata.js.map +0 -1
  125. package/dist/workflow/hook.js.map +0 -1
  126. package/dist/workflow/index.js.map +0 -1
  127. package/dist/workflow/writable-stream.js.map +0 -1
  128. package/dist/workflow.js.map +0 -1
  129. 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, isInstanceOf } from './types.js';
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, [], globalThis);
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 ?? 'Unknown 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 instanceof WorkflowRunNotCompletedError) {
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 (isInstanceOf(err, WorkflowSuspension)) {
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 dehydratedArgs = dehydrateStepArguments(queueItem.args, err.globalThis);
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: dehydratedArgs,
281
+ input: dehydratedInput,
254
282
  });
255
- waitUntil(Promise.all(ops));
256
- await world.queue(`__wkf_step_${queueItem.stepName}`, {
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 (isInstanceOf(err, WorkflowAPIError) &&
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 (isInstanceOf(err, WorkflowAPIError)) {
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 errorStack = getErrorStack(err);
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: String(err),
323
- // TODO: include error codes when we define them
324
- // TODO: serialize/include the error name and stack?
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
- return trace(`STEP ${stepName}`, async (span) => {
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 !== '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`);
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 args = hydrateStepArguments(step.input, ops);
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 + embedded worlds.
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:${process.env.PORT || 3000}`,
526
+ : `http://localhost:${port ?? 3000}`,
425
527
  },
426
- }, () => stepFn(...args));
427
- result = dehydrateStepReturnValue(result, ops);
428
- waitUntil(Promise.all(ops));
429
- // Update the event log with the step result
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 (isInstanceOf(err, WorkflowAPIError)) {
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 (isInstanceOf(err, FatalError)) {
459
- const stackLines = getErrorStack(err).split('\n').slice(0, 4);
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: err.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: String(err),
474
- // TODO: include error codes when we define them
475
- // TODO: serialize/include the error name and stack?
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 stackLines = getErrorStack(err).split('\n').slice(0, 4);
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: getErrorStack(err),
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: errorMessage,
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 (isInstanceOf(err, RetryableError)) {
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).split('\n').slice(0, 4);
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, isInstanceOf(err, RetryableError)
532
- ? Math.floor((+err.retryAfter.getTime() - Date.now()) / 1000)
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.queue(`__wkf_workflow_${workflowName}`, {
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
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,2BAA2B;;;iBAGtC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;iBAMlC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;;;;;;;;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,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,CAAC"}
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
- import { z } from 'zod';
2
- // OpenTelemetry trace context for distributed tracing
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==