@workflow/world-testing 5.0.0-beta.35 → 5.0.0-beta.36

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.
@@ -356,6 +356,8 @@ var init_error_codes = __esm({
356
356
  REPLAY_DIVERGENCE: "REPLAY_DIVERGENCE",
357
357
  /** Run exceeded the maximum number of queue deliveries */
358
358
  MAX_DELIVERIES_EXCEEDED: "MAX_DELIVERIES_EXCEEDED",
359
+ /** Run exceeded the maximum number of events per run */
360
+ MAX_EVENTS_EXCEEDED: "MAX_EVENTS_EXCEEDED",
359
361
  /** Workflow replay exceeded the maximum allowed duration */
360
362
  REPLAY_TIMEOUT: "REPLAY_TIMEOUT",
361
363
  /** World response violated the SDK contract and cannot be retried safely */
@@ -16713,6 +16715,7 @@ var init_events = __esm({
16713
16715
  correlationId: external_exports.string(),
16714
16716
  eventData: external_exports.object({
16715
16717
  token: external_exports.string(),
16718
+ tokenRetentionUntil: external_exports.coerce.date().optional(),
16716
16719
  metadata: SerializedDataSchema.optional(),
16717
16720
  isWebhook: external_exports.boolean().optional(),
16718
16721
  isSystem: external_exports.boolean().optional()
@@ -16882,6 +16885,9 @@ var init_events = __esm({
16882
16885
  });
16883
16886
 
16884
16887
  // ../world/dist/runs.js
16888
+ function isTerminalWorkflowRunStatus(status) {
16889
+ return TERMINAL_WORKFLOW_RUN_STATUSES.includes(status);
16890
+ }
16885
16891
  var WorkflowRunStatusSchema, TerminalWorkflowRunStatusSchema, TERMINAL_WORKFLOW_RUN_STATUSES, WorkflowRunBaseSchema, WorkflowRunSchema;
16886
16892
  var init_runs = __esm({
16887
16893
  "../world/dist/runs.js"() {
@@ -16901,6 +16907,7 @@ var init_runs = __esm({
16901
16907
  "cancelled"
16902
16908
  ]);
16903
16909
  TERMINAL_WORKFLOW_RUN_STATUSES = TerminalWorkflowRunStatusSchema.options;
16910
+ __name(isTerminalWorkflowRunStatus, "isTerminalWorkflowRunStatus");
16904
16911
  WorkflowRunBaseSchema = external_exports.object({
16905
16912
  runId: external_exports.string(),
16906
16913
  status: WorkflowRunStatusSchema,
@@ -18323,6 +18330,28 @@ var init_devalue = __esm({
18323
18330
  }
18324
18331
  });
18325
18332
 
18333
+ // ../core/dist/symbols.js
18334
+ var STABLE_ULID, STREAM_NAME_SYMBOL, STREAM_TYPE_SYMBOL, STREAM_FRAMING_SYMBOL, STREAM_SERVER_RUN_ID_SYMBOL, STREAM_SERVER_DEPLOYMENT_ID_SYMBOL, STREAM_WRITE_BATCH_SYMBOL, BODY_INIT_SYMBOL, WEBHOOK_RESPONSE_WRITABLE, WORKFLOW_CLASS_REGISTRY, ABORT_STREAM_NAME, ABORT_HOOK_TOKEN, ABORT_LISTENER_ATTACHED, ABORT_READER_CANCEL;
18335
+ var init_symbols = __esm({
18336
+ "../core/dist/symbols.js"() {
18337
+ "use strict";
18338
+ STABLE_ULID = /* @__PURE__ */ Symbol.for("WORKFLOW_STABLE_ULID");
18339
+ STREAM_NAME_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_NAME");
18340
+ STREAM_TYPE_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_TYPE");
18341
+ STREAM_FRAMING_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_FRAMING");
18342
+ STREAM_SERVER_RUN_ID_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_SERVER_RUN_ID");
18343
+ STREAM_SERVER_DEPLOYMENT_ID_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_SERVER_DEPLOYMENT_ID");
18344
+ STREAM_WRITE_BATCH_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_WRITE_BATCH");
18345
+ BODY_INIT_SYMBOL = /* @__PURE__ */ Symbol.for("BODY_INIT");
18346
+ WEBHOOK_RESPONSE_WRITABLE = /* @__PURE__ */ Symbol.for("WEBHOOK_RESPONSE_WRITABLE");
18347
+ WORKFLOW_CLASS_REGISTRY = /* @__PURE__ */ Symbol.for("workflow-class-registry");
18348
+ ABORT_STREAM_NAME = /* @__PURE__ */ Symbol.for("WORKFLOW_ABORT_STREAM_NAME");
18349
+ ABORT_HOOK_TOKEN = /* @__PURE__ */ Symbol.for("WORKFLOW_ABORT_HOOK_TOKEN");
18350
+ ABORT_LISTENER_ATTACHED = /* @__PURE__ */ Symbol.for("WORKFLOW_ABORT_LISTENER_ATTACHED");
18351
+ ABORT_READER_CANCEL = /* @__PURE__ */ Symbol.for("WORKFLOW_ABORT_READER_CANCEL");
18352
+ }
18353
+ });
18354
+
18326
18355
  // ../core/dist/flushable-stream.js
18327
18356
  function createFlushableState() {
18328
18357
  const state = {
@@ -18403,7 +18432,11 @@ function pollReadableLock(readable, state) {
18403
18432
  }, getLockPollIntervalMs());
18404
18433
  state.readablePollingInterval = intervalId;
18405
18434
  }
18406
- async function flushablePipe(source, sink, state) {
18435
+ function flushablePipe(source, sink, state) {
18436
+ const batchWrite = sink[STREAM_WRITE_BATCH_SYMBOL];
18437
+ return typeof batchWrite === "function" ? flushablePipeCoalescing(source, sink, state, batchWrite) : flushablePipePerChunk(source, sink, state);
18438
+ }
18439
+ async function flushablePipePerChunk(source, sink, state) {
18407
18440
  const reader = source.getReader();
18408
18441
  const writer = sink.getWriter();
18409
18442
  let cancelReason;
@@ -18452,13 +18485,142 @@ async function flushablePipe(source, sink, state) {
18452
18485
  writer.releaseLock();
18453
18486
  }
18454
18487
  }
18455
- var LOCK_POLL_INTERVAL_MS, getLockPollIntervalMs;
18488
+ function wake(ctx, which) {
18489
+ const resolve = ctx[which];
18490
+ if (resolve) {
18491
+ ctx[which] = null;
18492
+ resolve();
18493
+ }
18494
+ }
18495
+ function nextBatchSize(ctx) {
18496
+ let count2 = 0;
18497
+ let bytes = 0;
18498
+ for (const chunk of ctx.queue) {
18499
+ if (count2 >= ctx.maxChunksPerBatch) break;
18500
+ if (count2 > 0 && bytes + chunk.byteLength > ctx.maxBytesPerBatch) break;
18501
+ count2++;
18502
+ bytes += chunk.byteLength;
18503
+ }
18504
+ return count2;
18505
+ }
18506
+ async function drainBatches(ctx) {
18507
+ while (true) {
18508
+ if (ctx.queue.length === 0) {
18509
+ if (ctx.sourceDone) return;
18510
+ await new Promise((resolve) => {
18511
+ ctx.wakeConsumer = resolve;
18512
+ });
18513
+ continue;
18514
+ }
18515
+ const count2 = nextBatchSize(ctx);
18516
+ const batch = ctx.queue.slice(0, count2);
18517
+ ctx.queue = ctx.queue.slice(count2);
18518
+ await ctx.batchWrite(batch);
18519
+ ctx.state.pendingOps -= batch.length;
18520
+ wake(ctx, "wakeProducer");
18521
+ }
18522
+ }
18523
+ function readNextChunk(reader, writer, consumer) {
18524
+ return Promise.race([
18525
+ reader.read(),
18526
+ writer.closed.then(() => {
18527
+ throw new WorkflowRuntimeError("Writable stream closed prematurely");
18528
+ }),
18529
+ consumer.then(() => {
18530
+ throw new WorkflowRuntimeError("Stream consumer ended prematurely");
18531
+ }, (err) => {
18532
+ throw err;
18533
+ })
18534
+ ]);
18535
+ }
18536
+ async function awaitBackpressureRelief(ctx, consumer, maxInflight) {
18537
+ if (ctx.state.pendingOps < maxInflight) return;
18538
+ await Promise.race([
18539
+ new Promise((resolve) => {
18540
+ ctx.wakeProducer = resolve;
18541
+ }),
18542
+ consumer.then(() => void 0, () => void 0)
18543
+ ]);
18544
+ }
18545
+ async function flushablePipeCoalescing(source, sink, state, batchWrite) {
18546
+ const reader = source.getReader();
18547
+ const writer = sink.getWriter();
18548
+ const maxInflight = getMaxInflightChunks();
18549
+ let cancelReason;
18550
+ const ctx = {
18551
+ state,
18552
+ batchWrite,
18553
+ queue: [],
18554
+ sourceDone: false,
18555
+ wakeConsumer: null,
18556
+ wakeProducer: null,
18557
+ maxChunksPerBatch: getMaxChunksPerBatch(),
18558
+ maxBytesPerBatch: getMaxBytesPerBatch()
18559
+ };
18560
+ const consumer = drainBatches(ctx);
18561
+ try {
18562
+ while (!state.streamEnded) {
18563
+ const readResult = await readNextChunk(reader, writer, consumer);
18564
+ if (state.streamEnded) return;
18565
+ if (readResult.done) {
18566
+ ctx.sourceDone = true;
18567
+ wake(ctx, "wakeConsumer");
18568
+ await consumer;
18569
+ state.streamEnded = true;
18570
+ await writer.close();
18571
+ if (!state.doneResolved) {
18572
+ state.doneResolved = true;
18573
+ state.resolve();
18574
+ }
18575
+ return;
18576
+ }
18577
+ ctx.queue.push(readResult.value);
18578
+ state.pendingOps++;
18579
+ wake(ctx, "wakeConsumer");
18580
+ await awaitBackpressureRelief(ctx, consumer, maxInflight);
18581
+ }
18582
+ } catch (err) {
18583
+ state.streamEnded = true;
18584
+ cancelReason = err;
18585
+ ctx.sourceDone = true;
18586
+ wake(ctx, "wakeConsumer");
18587
+ await consumer.catch(() => {
18588
+ });
18589
+ if (!state.doneResolved) {
18590
+ state.doneResolved = true;
18591
+ state.reject(err);
18592
+ }
18593
+ throw err;
18594
+ } finally {
18595
+ reader.cancel(cancelReason).catch(() => {
18596
+ });
18597
+ reader.releaseLock();
18598
+ writer.releaseLock();
18599
+ }
18600
+ }
18601
+ var MAX_INFLIGHT_CHUNKS, getMaxInflightChunks, MAX_CHUNKS_PER_BATCH, getMaxChunksPerBatch, MAX_BYTES_PER_BATCH, getMaxBytesPerBatch, LOCK_POLL_INTERVAL_MS, getLockPollIntervalMs;
18456
18602
  var init_flushable_stream = __esm({
18457
18603
  "../core/dist/flushable-stream.js"() {
18458
18604
  "use strict";
18459
18605
  init_dist2();
18460
18606
  init_dist();
18461
18607
  init_dist4();
18608
+ init_symbols();
18609
+ MAX_INFLIGHT_CHUNKS = 1e3;
18610
+ getMaxInflightChunks = /* @__PURE__ */ __name(() => envNumber("WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS", MAX_INFLIGHT_CHUNKS, {
18611
+ integer: true,
18612
+ min: 1
18613
+ }), "getMaxInflightChunks");
18614
+ MAX_CHUNKS_PER_BATCH = 1e3;
18615
+ getMaxChunksPerBatch = /* @__PURE__ */ __name(() => envNumber("WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH", MAX_CHUNKS_PER_BATCH, {
18616
+ integer: true,
18617
+ min: 1
18618
+ }), "getMaxChunksPerBatch");
18619
+ MAX_BYTES_PER_BATCH = 1024 * 1024;
18620
+ getMaxBytesPerBatch = /* @__PURE__ */ __name(() => envNumber("WORKFLOW_STREAM_MAX_BYTES_PER_BATCH", MAX_BYTES_PER_BATCH, {
18621
+ integer: true,
18622
+ min: 1
18623
+ }), "getMaxBytesPerBatch");
18462
18624
  LOCK_POLL_INTERVAL_MS = 10;
18463
18625
  getLockPollIntervalMs = /* @__PURE__ */ __name(() => envNumber("WORKFLOW_LOCK_POLL_INTERVAL_MS", LOCK_POLL_INTERVAL_MS, {
18464
18626
  integer: true,
@@ -18470,6 +18632,13 @@ var init_flushable_stream = __esm({
18470
18632
  __name(pollWritableLock, "pollWritableLock");
18471
18633
  __name(pollReadableLock, "pollReadableLock");
18472
18634
  __name(flushablePipe, "flushablePipe");
18635
+ __name(flushablePipePerChunk, "flushablePipePerChunk");
18636
+ __name(wake, "wake");
18637
+ __name(nextBatchSize, "nextBatchSize");
18638
+ __name(drainBatches, "drainBatches");
18639
+ __name(readNextChunk, "readNextChunk");
18640
+ __name(awaitBackpressureRelief, "awaitBackpressureRelief");
18641
+ __name(flushablePipeCoalescing, "flushablePipeCoalescing");
18473
18642
  }
18474
18643
  });
18475
18644
 
@@ -18598,27 +18767,6 @@ var init_get_world_lazy = __esm({
18598
18767
  }
18599
18768
  });
18600
18769
 
18601
- // ../core/dist/symbols.js
18602
- var STABLE_ULID, STREAM_NAME_SYMBOL, STREAM_TYPE_SYMBOL, STREAM_FRAMING_SYMBOL, STREAM_SERVER_RUN_ID_SYMBOL, STREAM_SERVER_DEPLOYMENT_ID_SYMBOL, BODY_INIT_SYMBOL, WEBHOOK_RESPONSE_WRITABLE, WORKFLOW_CLASS_REGISTRY, ABORT_STREAM_NAME, ABORT_HOOK_TOKEN, ABORT_LISTENER_ATTACHED, ABORT_READER_CANCEL;
18603
- var init_symbols = __esm({
18604
- "../core/dist/symbols.js"() {
18605
- "use strict";
18606
- STABLE_ULID = /* @__PURE__ */ Symbol.for("WORKFLOW_STABLE_ULID");
18607
- STREAM_NAME_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_NAME");
18608
- STREAM_TYPE_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_TYPE");
18609
- STREAM_FRAMING_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_FRAMING");
18610
- STREAM_SERVER_RUN_ID_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_SERVER_RUN_ID");
18611
- STREAM_SERVER_DEPLOYMENT_ID_SYMBOL = /* @__PURE__ */ Symbol.for("WORKFLOW_STREAM_SERVER_DEPLOYMENT_ID");
18612
- BODY_INIT_SYMBOL = /* @__PURE__ */ Symbol.for("BODY_INIT");
18613
- WEBHOOK_RESPONSE_WRITABLE = /* @__PURE__ */ Symbol.for("WEBHOOK_RESPONSE_WRITABLE");
18614
- WORKFLOW_CLASS_REGISTRY = /* @__PURE__ */ Symbol.for("workflow-class-registry");
18615
- ABORT_STREAM_NAME = /* @__PURE__ */ Symbol.for("WORKFLOW_ABORT_STREAM_NAME");
18616
- ABORT_HOOK_TOKEN = /* @__PURE__ */ Symbol.for("WORKFLOW_ABORT_HOOK_TOKEN");
18617
- ABORT_LISTENER_ATTACHED = /* @__PURE__ */ Symbol.for("WORKFLOW_ABORT_LISTENER_ATTACHED");
18618
- ABORT_READER_CANCEL = /* @__PURE__ */ Symbol.for("WORKFLOW_ABORT_READER_CANCEL");
18619
- }
18620
- });
18621
-
18622
18770
  // ../core/dist/class-serialization.js
18623
18771
  function getRegistry(global2 = globalThis) {
18624
18772
  const g = global2;
@@ -24492,7 +24640,7 @@ var version2;
24492
24640
  var init_version = __esm({
24493
24641
  "../core/dist/version.js"() {
24494
24642
  "use strict";
24495
- version2 = "5.0.0-beta.35";
24643
+ version2 = "5.0.0-beta.36";
24496
24644
  }
24497
24645
  });
24498
24646
 
@@ -25833,18 +25981,24 @@ __export(resume_hook_exports, {
25833
25981
  resumeHook: () => resumeHook,
25834
25982
  resumeWebhook: () => resumeWebhook
25835
25983
  });
25836
- async function getHookByTokenWithKey(token) {
25984
+ async function getHookAndRun(token) {
25837
25985
  const world = await getWorldLazy();
25838
25986
  const hook = await world.hooks.getByToken(token);
25839
25987
  const run2 = await world.runs.get(hook.runId);
25840
- const rawKey = await world.getEncryptionKeyForRun?.(run2);
25988
+ return {
25989
+ hook,
25990
+ run: run2
25991
+ };
25992
+ }
25993
+ async function getHookByTokenWithKey(token) {
25994
+ const { hook, run: run2 } = await getHookAndRun(token);
25995
+ const rawKey = await (await getWorldLazy()).getEncryptionKeyForRun?.(run2);
25841
25996
  const encryptionKey = rawKey ? await importKey(rawKey) : void 0;
25842
25997
  if (typeof hook.metadata !== "undefined") {
25843
25998
  hook.metadata = await hydrateStepArguments(hook.metadata, hook.runId, encryptionKey);
25844
25999
  }
25845
26000
  return {
25846
26001
  hook,
25847
- run: run2,
25848
26002
  encryptionKey
25849
26003
  };
25850
26004
  }
@@ -25859,27 +26013,27 @@ async function resumeHook(tokenOrHook, payload, encryptionKeyOverride) {
25859
26013
  try {
25860
26014
  let hook;
25861
26015
  let workflowRun;
25862
- let encryptionKey;
25863
26016
  if (typeof tokenOrHook === "string") {
25864
- const result = await getHookByTokenWithKey(tokenOrHook);
26017
+ const result = await getHookAndRun(tokenOrHook);
25865
26018
  hook = result.hook;
25866
26019
  workflowRun = result.run;
25867
- encryptionKey = encryptionKeyOverride ?? result.encryptionKey;
25868
26020
  } else {
25869
26021
  hook = tokenOrHook;
25870
26022
  workflowRun = await world.runs.get(hook.runId);
25871
- if (encryptionKeyOverride) {
25872
- encryptionKey = encryptionKeyOverride;
25873
- } else {
25874
- const rawKey = await world.getEncryptionKeyForRun?.(workflowRun);
25875
- encryptionKey = rawKey ? await importKey(rawKey) : void 0;
25876
- }
25877
26023
  }
25878
26024
  span?.setAttributes({
25879
26025
  ...HookToken(hook.token),
25880
26026
  ...HookId(hook.hookId),
25881
26027
  ...WorkflowRunId(hook.runId)
25882
26028
  });
26029
+ if (isTerminalWorkflowRunStatus(workflowRun.status)) {
26030
+ throw new HookNotFoundError(hook.token);
26031
+ }
26032
+ let encryptionKey = encryptionKeyOverride;
26033
+ if (!encryptionKey) {
26034
+ const rawKey = await world.getEncryptionKeyForRun?.(workflowRun);
26035
+ encryptionKey = rawKey ? await importKey(rawKey) : void 0;
26036
+ }
25883
26037
  const rawVersion = workflowRun.executionContext?.workflowCoreVersion;
25884
26038
  const capabilities = getRunCapabilities(typeof rawVersion === "string" ? rawVersion : void 0);
25885
26039
  if (!capabilities.supportedFormats.has(SerializationFormat.ENCRYPTED)) {
@@ -25991,6 +26145,7 @@ var init_resume_hook = __esm({
25991
26145
  init_get_world_lazy();
25992
26146
  init_helpers();
25993
26147
  init_wait_until();
26148
+ __name(getHookAndRun, "getHookAndRun");
25994
26149
  __name(getHookByTokenWithKey, "getHookByTokenWithKey");
25995
26150
  __name(getHookByToken, "getHookByToken");
25996
26151
  __name(resumeHook, "resumeHook");
@@ -27093,9 +27248,6 @@ function getStepRevivers(global2 = globalThis, ops, runId, cryptoKey, deployment
27093
27248
  AbortSignal: /* @__PURE__ */ __name((value) => reviveAbortSignal(value, ops, runId), "AbortSignal")
27094
27249
  };
27095
27250
  }
27096
- async function maybeDecrypt(data, key) {
27097
- return decrypt2(data, key);
27098
- }
27099
27251
  async function dehydrateWorkflowArguments(value, runId, key, ops = [], global2 = globalThis, v1Compat = false, framedByteStreams = false, compression = false) {
27100
27252
  if (v1Compat) {
27101
27253
  const str = stringify(value, getExternalReducers(global2, ops, runId, key, framedByteStreams));
@@ -27196,7 +27348,7 @@ async function dehydrateStepReturnValue(value, runId, key, ops = [], global2 = g
27196
27348
  }
27197
27349
  async function hydrateRunError(value, runId, key, ops = [], global2 = globalThis, extraRevivers = {}) {
27198
27350
  const compressionStats = {};
27199
- const decrypted = await decompress(await maybeDecrypt(value, key), compressionStats);
27351
+ const decrypted = await decompress(await decrypt2(value, key), compressionStats);
27200
27352
  await recordCompression(compressionStats, "deserialize");
27201
27353
  if (!(decrypted instanceof Uint8Array)) {
27202
27354
  return unflatten(decrypted, {
@@ -27473,6 +27625,16 @@ var init_serialization2 = __esm({
27473
27625
  for (const w of waiters) w.reject(abortError);
27474
27626
  }
27475
27627
  });
27628
+ Object.defineProperty(this, STREAM_WRITE_BATCH_SYMBOL, {
27629
+ value: /* @__PURE__ */ __name(async (chunks) => {
27630
+ if (chunks.length === 0) return;
27631
+ if (batchStartAt === void 0) batchStartAt = Date.now();
27632
+ for (const chunk of chunks) buffer2.push(chunk);
27633
+ await flush();
27634
+ }, "value"),
27635
+ enumerable: false,
27636
+ writable: false
27637
+ });
27476
27638
  }
27477
27639
  };
27478
27640
  __name(getAllBaseReducers, "getAllBaseReducers");
@@ -27491,7 +27653,6 @@ var init_serialization2 = __esm({
27491
27653
  __name(getForwardedWritableEncryptionKey, "getForwardedWritableEncryptionKey");
27492
27654
  __name(getExternalRevivers, "getExternalRevivers");
27493
27655
  __name(getStepRevivers, "getStepRevivers");
27494
- __name(maybeDecrypt, "maybeDecrypt");
27495
27656
  __name(dehydrateWorkflowArguments, "dehydrateWorkflowArguments");
27496
27657
  __name(hydrateWorkflowReturnValue, "hydrateWorkflowReturnValue");
27497
27658
  __name(dehydrateStepArguments, "dehydrateStepArguments");
@@ -27921,7 +28082,7 @@ __name(start, "start");
27921
28082
  value: "start",
27922
28083
  configurable: true
27923
28084
  });
27924
- })(start, "step//@workflow/core/runtime/start@5.0.0-beta.35//start");
28085
+ })(start, "step//@workflow/core/runtime/start@5.0.0-beta.36//start");
27925
28086
 
27926
28087
  // ../core/dist/runtime/runs.js
27927
28088
  async function wakeUpRun(world, runId, options) {
@@ -28257,7 +28418,7 @@ var Run = class _Run {
28257
28418
  value: "wakeUp",
28258
28419
  configurable: true
28259
28420
  });
28260
- })(Run.prototype["wakeUp"], "step//@workflow/core/runtime/run@5.0.0-beta.35//Run#wakeUp");
28421
+ })(Run.prototype["wakeUp"], "step//@workflow/core/runtime/run@5.0.0-beta.36//Run#wakeUp");
28261
28422
  (function(__wf_fn, __wf_id) {
28262
28423
  var __wf_sym = /* @__PURE__ */ Symbol.for("@workflow/core//registeredSteps"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28263
28424
  __wf_reg.set(__wf_id, __wf_fn);
@@ -28266,7 +28427,7 @@ var Run = class _Run {
28266
28427
  value: "cancel",
28267
28428
  configurable: true
28268
28429
  });
28269
- })(Run.prototype["cancel"], "step//@workflow/core/runtime/run@5.0.0-beta.35//Run#cancel");
28430
+ })(Run.prototype["cancel"], "step//@workflow/core/runtime/run@5.0.0-beta.36//Run#cancel");
28270
28431
  (function(__wf_fn, __wf_id) {
28271
28432
  var __wf_sym = /* @__PURE__ */ Symbol.for("@workflow/core//registeredSteps"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28272
28433
  __wf_reg.set(__wf_id, __wf_fn);
@@ -28275,7 +28436,7 @@ var Run = class _Run {
28275
28436
  value: "getReadable",
28276
28437
  configurable: true
28277
28438
  });
28278
- })(Run.prototype["getReadable"], "step//@workflow/core/runtime/run@5.0.0-beta.35//Run#getReadable");
28439
+ })(Run.prototype["getReadable"], "step//@workflow/core/runtime/run@5.0.0-beta.36//Run#getReadable");
28279
28440
  (function(__wf_fn, __wf_id) {
28280
28441
  var __wf_sym = /* @__PURE__ */ Symbol.for("@workflow/core//registeredSteps"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28281
28442
  __wf_reg.set(__wf_id, __wf_fn);
@@ -28284,7 +28445,7 @@ var Run = class _Run {
28284
28445
  value: "exists",
28285
28446
  configurable: true
28286
28447
  });
28287
- })(Object.getOwnPropertyDescriptor(Run.prototype, "exists").get, "step//@workflow/core/runtime/run@5.0.0-beta.35//Run#exists");
28448
+ })(Object.getOwnPropertyDescriptor(Run.prototype, "exists").get, "step//@workflow/core/runtime/run@5.0.0-beta.36//Run#exists");
28288
28449
  (function(__wf_fn, __wf_id) {
28289
28450
  var __wf_sym = /* @__PURE__ */ Symbol.for("@workflow/core//registeredSteps"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28290
28451
  __wf_reg.set(__wf_id, __wf_fn);
@@ -28293,7 +28454,7 @@ var Run = class _Run {
28293
28454
  value: "status",
28294
28455
  configurable: true
28295
28456
  });
28296
- })(Object.getOwnPropertyDescriptor(Run.prototype, "status").get, "step//@workflow/core/runtime/run@5.0.0-beta.35//Run#status");
28457
+ })(Object.getOwnPropertyDescriptor(Run.prototype, "status").get, "step//@workflow/core/runtime/run@5.0.0-beta.36//Run#status");
28297
28458
  (function(__wf_fn, __wf_id) {
28298
28459
  var __wf_sym = /* @__PURE__ */ Symbol.for("@workflow/core//registeredSteps"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28299
28460
  __wf_reg.set(__wf_id, __wf_fn);
@@ -28302,7 +28463,7 @@ var Run = class _Run {
28302
28463
  value: "returnValue",
28303
28464
  configurable: true
28304
28465
  });
28305
- })(Object.getOwnPropertyDescriptor(Run.prototype, "returnValue").get, "step//@workflow/core/runtime/run@5.0.0-beta.35//Run#returnValue");
28466
+ })(Object.getOwnPropertyDescriptor(Run.prototype, "returnValue").get, "step//@workflow/core/runtime/run@5.0.0-beta.36//Run#returnValue");
28306
28467
  (function(__wf_fn, __wf_id) {
28307
28468
  var __wf_sym = /* @__PURE__ */ Symbol.for("@workflow/core//registeredSteps"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28308
28469
  __wf_reg.set(__wf_id, __wf_fn);
@@ -28311,7 +28472,7 @@ var Run = class _Run {
28311
28472
  value: "workflowName",
28312
28473
  configurable: true
28313
28474
  });
28314
- })(Object.getOwnPropertyDescriptor(Run.prototype, "workflowName").get, "step//@workflow/core/runtime/run@5.0.0-beta.35//Run#workflowName");
28475
+ })(Object.getOwnPropertyDescriptor(Run.prototype, "workflowName").get, "step//@workflow/core/runtime/run@5.0.0-beta.36//Run#workflowName");
28315
28476
  (function(__wf_fn, __wf_id) {
28316
28477
  var __wf_sym = /* @__PURE__ */ Symbol.for("@workflow/core//registeredSteps"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28317
28478
  __wf_reg.set(__wf_id, __wf_fn);
@@ -28320,7 +28481,7 @@ var Run = class _Run {
28320
28481
  value: "createdAt",
28321
28482
  configurable: true
28322
28483
  });
28323
- })(Object.getOwnPropertyDescriptor(Run.prototype, "createdAt").get, "step//@workflow/core/runtime/run@5.0.0-beta.35//Run#createdAt");
28484
+ })(Object.getOwnPropertyDescriptor(Run.prototype, "createdAt").get, "step//@workflow/core/runtime/run@5.0.0-beta.36//Run#createdAt");
28324
28485
  (function(__wf_fn, __wf_id) {
28325
28486
  var __wf_sym = /* @__PURE__ */ Symbol.for("@workflow/core//registeredSteps"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28326
28487
  __wf_reg.set(__wf_id, __wf_fn);
@@ -28329,7 +28490,7 @@ var Run = class _Run {
28329
28490
  value: "startedAt",
28330
28491
  configurable: true
28331
28492
  });
28332
- })(Object.getOwnPropertyDescriptor(Run.prototype, "startedAt").get, "step//@workflow/core/runtime/run@5.0.0-beta.35//Run#startedAt");
28493
+ })(Object.getOwnPropertyDescriptor(Run.prototype, "startedAt").get, "step//@workflow/core/runtime/run@5.0.0-beta.36//Run#startedAt");
28333
28494
  (function(__wf_fn, __wf_id) {
28334
28495
  var __wf_sym = /* @__PURE__ */ Symbol.for("@workflow/core//registeredSteps"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28335
28496
  __wf_reg.set(__wf_id, __wf_fn);
@@ -28338,7 +28499,7 @@ var Run = class _Run {
28338
28499
  value: "completedAt",
28339
28500
  configurable: true
28340
28501
  });
28341
- })(Object.getOwnPropertyDescriptor(Run.prototype, "completedAt").get, "step//@workflow/core/runtime/run@5.0.0-beta.35//Run#completedAt");
28502
+ })(Object.getOwnPropertyDescriptor(Run.prototype, "completedAt").get, "step//@workflow/core/runtime/run@5.0.0-beta.36//Run#completedAt");
28342
28503
  (function(__wf_cls, __wf_id) {
28343
28504
  var __wf_sym = /* @__PURE__ */ Symbol.for("workflow-class-registry"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28344
28505
  __wf_reg.set(__wf_id, __wf_cls);
@@ -28348,7 +28509,7 @@ var Run = class _Run {
28348
28509
  enumerable: false,
28349
28510
  configurable: false
28350
28511
  });
28351
- })(Run, "class//@workflow/core/runtime/run@5.0.0-beta.35//Run");
28512
+ })(Run, "class//@workflow/core/runtime/run@5.0.0-beta.36//Run");
28352
28513
 
28353
28514
  // ../workflow/dist/stdlib.js
28354
28515
  async function fetch2(...args) {
@@ -28390,6 +28551,26 @@ async function addTenWorkflow(input) {
28390
28551
  __name(addTenWorkflow, "addTenWorkflow");
28391
28552
  addTenWorkflow.workflowId = "workflow//./workflows/addition//addTenWorkflow";
28392
28553
 
28554
+ // workflows/event-limit.ts
28555
+ async function tick(i) {
28556
+ return i;
28557
+ }
28558
+ __name(tick, "tick");
28559
+ (function(__wf_fn, __wf_id) {
28560
+ var __wf_sym = /* @__PURE__ */ Symbol.for("@workflow/core//registeredSteps"), __wf_reg = globalThis[__wf_sym] || (globalThis[__wf_sym] = /* @__PURE__ */ new Map());
28561
+ __wf_reg.set(__wf_id, __wf_fn);
28562
+ __wf_fn.stepId = __wf_id;
28563
+ Object.defineProperty(__wf_fn, "name", {
28564
+ value: "tick",
28565
+ configurable: true
28566
+ });
28567
+ })(tick, "step//./workflows/event-limit//tick");
28568
+ async function runawayWorkflow() {
28569
+ throw new Error("You attempted to execute workflow runawayWorkflow function directly. To start a workflow, use start(runawayWorkflow) from workflow/api");
28570
+ }
28571
+ __name(runawayWorkflow, "runawayWorkflow");
28572
+ runawayWorkflow.workflowId = "workflow//./workflows/event-limit//runawayWorkflow";
28573
+
28393
28574
  // ../core/dist/index.js
28394
28575
  init_dist2();
28395
28576
 
@@ -0,0 +1,2 @@
1
+ export declare function eventLimit(world: string): void;
2
+ //# sourceMappingURL=event-limit.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-limit.d.mts","sourceRoot":"","sources":["../../src/event-limit.mts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,QAsCvC"}
@@ -0,0 +1,29 @@
1
+ import { expect, test, vi } from 'vitest';
2
+ import { createFetcher, startServer } from './util.mjs';
3
+ export function eventLimit(world) {
4
+ // Cover enforcement end-to-end under both configs (turbo is the production
5
+ // default). Against the local world these don't isolate the turbo run_started
6
+ // threading — a non-turbo continuation backfills the ceiling regardless — but
7
+ // they guard that a runaway run fails under each.
8
+ for (const turbo of ['1', '0']) {
9
+ test(`fails a runaway run at the server-supplied event limit (turbo=${turbo})`, { timeout: 59_000 }, async () => {
10
+ // Low ceiling to trip it fast.
11
+ const server = await startServer({
12
+ world,
13
+ env: { WORKFLOW_MAX_EVENTS: '10', WORKFLOW_TURBO: turbo },
14
+ }).then(createFetcher);
15
+ const result = await server.invoke('workflows/event-limit.ts', 'runawayWorkflow', []);
16
+ expect(result.runId).toMatch(/^wrun_.+/);
17
+ const run = await vi.waitFor(async () => {
18
+ const run = await server.getRun(result.runId);
19
+ expect(run.status).toBe('failed');
20
+ return run;
21
+ }, {
22
+ interval: 200,
23
+ timeout: 50_000,
24
+ });
25
+ expect(run.errorCode).toBe('MAX_EVENTS_EXCEEDED');
26
+ });
27
+ }
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbGltaXQubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V2ZW50LWxpbWl0Lm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFhO0lBQ3RDLDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsOEVBQThFO0lBQzlFLGtEQUFrRDtJQUNsRCxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBVSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUNGLGlFQUFpRSxLQUFLLEdBQUcsRUFDekUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQ25CLEtBQUssSUFBSSxFQUFFO1lBQ1QsK0JBQStCO1lBQy9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDO2dCQUMvQixLQUFLO2dCQUNMLEdBQUcsRUFBRSxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFO2FBQzFELENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUNoQywwQkFBMEIsRUFDMUIsaUJBQWlCLEVBQ2pCLEVBQUUsQ0FDSCxDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtnQkFDVCxNQUFNLEdBQUcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEMsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEVBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsT0FBTyxFQUFFLE1BQU07YUFDaEIsQ0FDRixDQUFDO1lBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhwZWN0LCB0ZXN0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBjcmVhdGVGZXRjaGVyLCBzdGFydFNlcnZlciB9IGZyb20gJy4vdXRpbC5tanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRMaW1pdCh3b3JsZDogc3RyaW5nKSB7XG4gIC8vIENvdmVyIGVuZm9yY2VtZW50IGVuZC10by1lbmQgdW5kZXIgYm90aCBjb25maWdzICh0dXJibyBpcyB0aGUgcHJvZHVjdGlvblxuICAvLyBkZWZhdWx0KS4gQWdhaW5zdCB0aGUgbG9jYWwgd29ybGQgdGhlc2UgZG9uJ3QgaXNvbGF0ZSB0aGUgdHVyYm8gcnVuX3N0YXJ0ZWRcbiAgLy8gdGhyZWFkaW5nIOKAlCBhIG5vbi10dXJibyBjb250aW51YXRpb24gYmFja2ZpbGxzIHRoZSBjZWlsaW5nIHJlZ2FyZGxlc3Mg4oCUIGJ1dFxuICAvLyB0aGV5IGd1YXJkIHRoYXQgYSBydW5hd2F5IHJ1biBmYWlscyB1bmRlciBlYWNoLlxuICBmb3IgKGNvbnN0IHR1cmJvIG9mIFsnMScsICcwJ10gYXMgY29uc3QpIHtcbiAgICB0ZXN0KFxuICAgICAgYGZhaWxzIGEgcnVuYXdheSBydW4gYXQgdGhlIHNlcnZlci1zdXBwbGllZCBldmVudCBsaW1pdCAodHVyYm89JHt0dXJib30pYCxcbiAgICAgIHsgdGltZW91dDogNTlfMDAwIH0sXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIExvdyBjZWlsaW5nIHRvIHRyaXAgaXQgZmFzdC5cbiAgICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoe1xuICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgIGVudjogeyBXT1JLRkxPV19NQVhfRVZFTlRTOiAnMTAnLCBXT1JLRkxPV19UVVJCTzogdHVyYm8gfSxcbiAgICAgICAgfSkudGhlbihjcmVhdGVGZXRjaGVyKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2ZXIuaW52b2tlKFxuICAgICAgICAgICd3b3JrZmxvd3MvZXZlbnQtbGltaXQudHMnLFxuICAgICAgICAgICdydW5hd2F5V29ya2Zsb3cnLFxuICAgICAgICAgIFtdXG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQucnVuSWQpLnRvTWF0Y2goL153cnVuXy4rLyk7XG5cbiAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgdmkud2FpdEZvcihcbiAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBydW4gPSBhd2FpdCBzZXJ2ZXIuZ2V0UnVuKHJlc3VsdC5ydW5JZCk7XG4gICAgICAgICAgICBleHBlY3QocnVuLnN0YXR1cykudG9CZSgnZmFpbGVkJyk7XG4gICAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW50ZXJ2YWw6IDIwMCxcbiAgICAgICAgICAgIHRpbWVvdXQ6IDUwXzAwMCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChydW4uZXJyb3JDb2RlKS50b0JlKCdNQVhfRVZFTlRTX0VYQ0VFREVEJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/world-testing",
3
- "version": "5.0.0-beta.35",
3
+ "version": "5.0.0-beta.36",
4
4
  "description": "Testing utilities and World implementation for Workflow SDK",
5
5
  "main": "dist/src/index.mjs",
6
6
  "files": [
@@ -21,12 +21,12 @@
21
21
  "hono": "4.12.25",
22
22
  "jsonlines": "0.1.1",
23
23
  "zod": "~4.3.6",
24
- "@workflow/cli": "5.0.0-beta.35",
25
- "@workflow/core": "5.0.0-beta.35",
24
+ "@workflow/cli": "5.0.0-beta.36",
25
+ "@workflow/core": "5.0.0-beta.36",
26
26
  "@workflow/utils": "5.0.0-beta.6",
27
- "@workflow/world": "5.0.0-beta.21",
28
- "@workflow/world-local": "5.0.0-beta.29",
29
- "workflow": "5.0.0-beta.35"
27
+ "@workflow/world": "5.0.0-beta.22",
28
+ "@workflow/world-local": "5.0.0-beta.30",
29
+ "workflow": "5.0.0-beta.36"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/jsonlines": "0.1.5",