@resonatehq/sdk 0.10.4 → 0.11.0

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 (64) hide show
  1. package/README.md +60 -0
  2. package/dist/async/context.d.ts +270 -0
  3. package/dist/async/context.d.ts.map +1 -0
  4. package/dist/async/context.js +598 -0
  5. package/dist/async/context.js.map +1 -0
  6. package/dist/async/core.d.ts +61 -0
  7. package/dist/async/core.d.ts.map +1 -0
  8. package/dist/async/core.js +239 -0
  9. package/dist/async/core.js.map +1 -0
  10. package/dist/async/index.d.ts +4 -0
  11. package/dist/async/index.d.ts.map +1 -0
  12. package/dist/async/index.js +12 -0
  13. package/dist/async/index.js.map +1 -0
  14. package/dist/async/resonate.d.ts +98 -0
  15. package/dist/async/resonate.d.ts.map +1 -0
  16. package/dist/async/resonate.js +387 -0
  17. package/dist/async/resonate.js.map +1 -0
  18. package/dist/context.d.ts.map +1 -1
  19. package/dist/context.js +1 -1
  20. package/dist/context.js.map +1 -1
  21. package/dist/core.d.ts +1 -1
  22. package/dist/core.d.ts.map +1 -1
  23. package/dist/core.js +8 -2
  24. package/dist/core.js.map +1 -1
  25. package/dist/coroutine.d.ts.map +1 -1
  26. package/dist/coroutine.js +1 -1
  27. package/dist/coroutine.js.map +1 -1
  28. package/dist/heartbeat.d.ts.map +1 -1
  29. package/dist/heartbeat.js +1 -1
  30. package/dist/heartbeat.js.map +1 -1
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/network/http.d.ts +0 -20
  36. package/dist/network/http.d.ts.map +1 -1
  37. package/dist/network/http.js +5 -99
  38. package/dist/network/http.js.map +1 -1
  39. package/dist/network/local.js +1 -1
  40. package/dist/network/local.js.map +1 -1
  41. package/dist/network/nats.d.ts.map +1 -1
  42. package/dist/network/nats.js +1 -1
  43. package/dist/network/nats.js.map +1 -1
  44. package/dist/platform.d.ts +4 -0
  45. package/dist/platform.d.ts.map +1 -0
  46. package/dist/platform.js +24 -0
  47. package/dist/platform.js.map +1 -0
  48. package/dist/promises.d.ts.map +1 -1
  49. package/dist/promises.js +1 -1
  50. package/dist/promises.js.map +1 -1
  51. package/dist/resonate.d.ts.map +1 -1
  52. package/dist/resonate.js +14 -9
  53. package/dist/resonate.js.map +1 -1
  54. package/dist/schedules.d.ts.map +1 -1
  55. package/dist/schedules.js +1 -1
  56. package/dist/schedules.js.map +1 -1
  57. package/dist/trace.d.ts +11 -0
  58. package/dist/trace.d.ts.map +1 -1
  59. package/dist/trace.js +22 -0
  60. package/dist/trace.js.map +1 -1
  61. package/dist/util.d.ts.map +1 -1
  62. package/dist/util.js +1 -1
  63. package/dist/util.js.map +1 -1
  64. package/package.json +12 -1
@@ -0,0 +1,598 @@
1
+ import exceptions from "../exceptions.js";
2
+ import { delay, randomUUID } from "../platform.js";
3
+ import { Never } from "../retries.js";
4
+ import * as util from "../util.js";
5
+ /**
6
+ * The branded handle returned by every durable operation on {@link Context}
7
+ * (`run`, `rpc`, `sleep`, `detached`, `promise`). Behaves exactly like the
8
+ * user-facing promise it wraps (then/catch/finally/await, including the
9
+ * hang-on-suspend semantics) and additionally exposes the durable promise `id`.
10
+ *
11
+ * The brand marks the awaitables that are safe inside a workflow: replay
12
+ * determinism requires that `await` only ever targets durable promises —
13
+ * awaiting a timer, I/O, or a plain async-helper chain lets durable ids be
14
+ * assigned in completion order, which cross-wires them on replay.
15
+ */
16
+ export class DurablePromise {
17
+ id;
18
+ promise;
19
+ [Symbol.toStringTag] = "DurablePromise";
20
+ constructor(
21
+ /** The durable promise id (`""` when the op failed before creating one). */
22
+ id, promise) {
23
+ this.id = id;
24
+ this.promise = promise;
25
+ }
26
+ // biome-ignore lint/suspicious/noThenProperty: being awaitable is this class's purpose
27
+ then(onfulfilled, onrejected) {
28
+ return this.promise.then(onfulfilled, onrejected);
29
+ }
30
+ catch(onrejected) {
31
+ return this.promise.catch(onrejected);
32
+ }
33
+ finally(onfinally) {
34
+ return this.promise.finally(onfinally);
35
+ }
36
+ }
37
+ export class AsyncContext {
38
+ id;
39
+ originId;
40
+ prefixId;
41
+ branchId;
42
+ parentId;
43
+ func;
44
+ timeoutAt;
45
+ attempt;
46
+ version;
47
+ clock;
48
+ registry;
49
+ dependencies;
50
+ optsBuilder;
51
+ effects;
52
+ /** Lifecycle-event sink for this pass; shared with the root + every child. */
53
+ trace;
54
+ seq = 0;
55
+ /** Set once the pass is finalized (drain stable); durable ops then panic. */
56
+ closed = false;
57
+ // --- per-pass bookkeeping (owned by the pass; never escapes the pass) ---
58
+ /** Every started op's always-settling outcome; the pass drains these. */
59
+ spawnedHandles = [];
60
+ /** Resolved the first time any op observes a pending remote → ends the pass. */
61
+ suspendSignal;
62
+ _fireSuspend;
63
+ /** Resolved by ctx.panic → ends the pass; the recorded error aborts it. */
64
+ panicSignal;
65
+ _firePanic;
66
+ _panicError;
67
+ /** Tail of the creation sequencer chain (serializes promiseCreate calls). */
68
+ createTail = Promise.resolve();
69
+ constructor(cfg, effects, trace) {
70
+ this.id = cfg.id;
71
+ this.originId = cfg.oId ?? cfg.id;
72
+ this.prefixId = cfg.prId ?? cfg.id;
73
+ this.branchId = cfg.bId ?? cfg.id;
74
+ this.parentId = cfg.pId ?? cfg.id;
75
+ this.func = cfg.func;
76
+ this.clock = cfg.clock;
77
+ this.registry = cfg.registry;
78
+ this.dependencies = cfg.dependencies;
79
+ this.optsBuilder = cfg.optsBuilder;
80
+ this.timeoutAt = cfg.timeout;
81
+ this.version = cfg.version;
82
+ this.attempt = cfg.attempt ?? 1;
83
+ this.effects = effects;
84
+ this.trace = trace;
85
+ this.suspendSignal = new Promise((resolve) => {
86
+ this._fireSuspend = resolve;
87
+ });
88
+ this.panicSignal = new Promise((resolve) => {
89
+ this._firePanic = resolve;
90
+ });
91
+ }
92
+ /** The panic that aborted this pass, if any. Authoritative: set by ctx.panic
93
+ * before the throw, so it survives a user try/catch around the call. */
94
+ get panicError() {
95
+ return this._panicError;
96
+ }
97
+ /** End the pass: a durable op observed a pending remote. Idempotent. */
98
+ fireSuspend() {
99
+ this._fireSuspend();
100
+ }
101
+ /**
102
+ * Finalize the pass. Every op in `spawnedHandles` has been drained; a durable
103
+ * op started after this point comes from a continuation that outlived the pass
104
+ * (parked on a non-durable await — a timer, I/O, etc.). It would escape the
105
+ * drain and race task.suspend/fulfill as a zombie, so it panics instead.
106
+ */
107
+ close() {
108
+ this.closed = true;
109
+ }
110
+ guardOpen(op) {
111
+ if (this.closed) {
112
+ throw exceptions.PANIC("async-context", `ctx.${op} called after the pass ended (id=${this.id}). A durable operation ` +
113
+ `must not follow a non-durable await (timer, I/O, ...) in a workflow — ` +
114
+ `the pass can end while such a continuation is still parked.`);
115
+ }
116
+ }
117
+ child(cfg) {
118
+ return new AsyncContext({
119
+ id: cfg.id,
120
+ oId: this.originId,
121
+ prId: this.prefixId,
122
+ bId: this.branchId,
123
+ pId: this.id,
124
+ func: cfg.func,
125
+ clock: this.clock,
126
+ registry: this.registry,
127
+ dependencies: this.dependencies,
128
+ optsBuilder: this.optsBuilder,
129
+ timeout: cfg.timeout,
130
+ version: cfg.version,
131
+ attempt: cfg.attempt,
132
+ }, this.effects, this.trace);
133
+ }
134
+ // --- creation sequencer -------------------------------------------------
135
+ // Take the current tail as the predecessor and install a fresh tail. Called
136
+ // synchronously in the op prologue so the chain reflects source order.
137
+ claimCreateSlot() {
138
+ const ready = this.createTail;
139
+ let release;
140
+ this.createTail = new Promise((resolve) => {
141
+ release = resolve;
142
+ });
143
+ return { ready, release };
144
+ }
145
+ // Run one op's sequenced create: wait our turn in the chain, create the
146
+ // promise, then release the slot so the next op can proceed.
147
+ async createSlotted(createReq, name, slot) {
148
+ await slot.ready;
149
+ try {
150
+ return await this.effects.promiseCreate(createReq, name);
151
+ }
152
+ finally {
153
+ slot.release();
154
+ }
155
+ }
156
+ // --- durable operations -------------------------------------------------
157
+ run(funcOrName, ...args) {
158
+ this.guardOpen("run");
159
+ const [argu, opts] = util.splitArgsAndOpts(args, this.options());
160
+ const registered = this.registry.get(funcOrName, opts.version);
161
+ if (typeof funcOrName === "string" && !registered) {
162
+ // No durable promise was created (and no seq consumed) — id is empty.
163
+ return this.track("", Promise.resolve({
164
+ kind: "error",
165
+ error: exceptions.REGISTRY_FUNCTION_NOT_REGISTERED(funcOrName, opts.version),
166
+ }));
167
+ }
168
+ const idChanged = opts.id !== undefined;
169
+ const id = idChanged ? opts.id : this.seqid();
170
+ this.seq++;
171
+ const func = (registered ? registered.func : funcOrName);
172
+ const version = registered ? registered.version : 1;
173
+ const createReq = this.localCreateReq({ id, data: { func: func.name, version }, opts, breaksLineage: idChanged });
174
+ const slot = this.claimCreateSlot();
175
+ // Async functions are indistinguishable from workflows at runtime (no
176
+ // generator marker), so retries are opt-in: default Never, pass an explicit
177
+ // policy via opts to enable them.
178
+ const retryPolicy = opts.retryPolicy ?? new Never();
179
+ const nonRetryableErrors = opts.nonRetryableErrors ?? [];
180
+ const outcome = (async () => {
181
+ const rec = await this.createSlotted(createReq, func.name, slot);
182
+ // run p→q: the parent created a local child (emitted after create, before
183
+ // the spawn/dedup split, mirroring the generator coroutine).
184
+ this.trace.emit({ kind: "run", id: this.id, callee: id });
185
+ if (rec.state !== "pending") {
186
+ // Replay: the child is already settled → dedup, no spawn/return.
187
+ const state = rec.state === "resolved" ? "resolved" : "rejected";
188
+ this.trace.emit({ kind: "dedup", id, state, value: rec.value?.data });
189
+ return recordOutcome(rec);
190
+ }
191
+ // Pending: spawn the child, then execute it in-process via the recursive
192
+ // runner, retrying failed attempts per the policy (each attempt gets a fresh
193
+ // child context so durable child ids replay identically via dedup).
194
+ this.trace.emit({ kind: "spawn", id });
195
+ const childOutcome = await runWithRetry((attempt) => this.child({ id, func: func.name, timeout: rec.timeoutAt, version, attempt }), func, argu, retryPolicy, nonRetryableErrors, this.clock, rec.timeoutAt);
196
+ if (childOutcome.kind === "suspended") {
197
+ // The child has remote deps of its own and could not complete this pass.
198
+ this.trace.emit({ kind: "suspend", id });
199
+ this.fireSuspend();
200
+ return childOutcome;
201
+ }
202
+ await this.settle(id, childOutcome, func.name);
203
+ const state = childOutcome.kind === "value" ? "resolved" : "rejected";
204
+ const value = childOutcome.kind === "value" ? childOutcome.value : childOutcome.error;
205
+ this.trace.emit({ kind: "return", id, state, value });
206
+ return childOutcome;
207
+ })();
208
+ return this.track(id, outcome);
209
+ }
210
+ rpc(funcOrName, ...args) {
211
+ this.guardOpen("rpc");
212
+ const [argu, opts] = util.splitArgsAndOpts(args, this.options());
213
+ const registered = this.registry.get(funcOrName, opts.version);
214
+ if (typeof funcOrName === "function" && !registered) {
215
+ // No durable promise was created (and no seq consumed) — id is empty.
216
+ return this.track("", Promise.resolve({
217
+ kind: "error",
218
+ error: exceptions.REGISTRY_FUNCTION_NOT_REGISTERED(funcOrName.name, opts.version),
219
+ }));
220
+ }
221
+ const idChanged = opts.id !== undefined;
222
+ const id = idChanged ? opts.id : this.seqid();
223
+ this.seq++;
224
+ const func = registered ? registered.name : funcOrName;
225
+ const version = registered ? registered.version : opts.version || 1;
226
+ const data = { func, args: argu, retry: opts.retryPolicy?.encode(), version };
227
+ const createReq = this.remoteCreateReq({ id, data, opts, breaksLineage: idChanged });
228
+ const slot = this.claimCreateSlot();
229
+ return this.track(id, this.remoteOutcome(id, createReq, slot, func));
230
+ }
231
+ sleep(msOrOpts) {
232
+ this.guardOpen("sleep");
233
+ let time;
234
+ if (typeof msOrOpts === "number") {
235
+ time = this.clock.now() + msOrOpts;
236
+ }
237
+ else if (msOrOpts.for != null) {
238
+ time = this.clock.now() + msOrOpts.for;
239
+ }
240
+ else if (msOrOpts.until != null) {
241
+ time = msOrOpts.until.getTime();
242
+ }
243
+ else {
244
+ time = 0;
245
+ }
246
+ const id = this.seqid();
247
+ this.seq++;
248
+ const createReq = this.sleepCreateReq({ id, time });
249
+ const slot = this.claimCreateSlot();
250
+ return this.track(id, this.remoteOutcome(id, createReq, slot, "sleep"));
251
+ }
252
+ detached(funcOrName, ...args) {
253
+ this.guardOpen("detached");
254
+ const [argu, opts] = util.splitArgsAndOpts(args, this.options());
255
+ const registered = this.registry.get(funcOrName, opts.version);
256
+ if (typeof funcOrName === "function" && !registered) {
257
+ const errOutcome = Promise.resolve({
258
+ kind: "error",
259
+ error: exceptions.REGISTRY_FUNCTION_NOT_REGISTERED(funcOrName.name, opts.version),
260
+ });
261
+ // No durable promise was created (and no seq consumed) — id is empty.
262
+ return this.track("", errOutcome);
263
+ }
264
+ const idChanged = opts.id !== undefined;
265
+ // Detached ids are minted off the fixed id-generation prefix (NOT the grown
266
+ // id or the diverging origin), so recursive detached stays bounded at one
267
+ // segment past the prefix. Mirrors the generator engine (src/context.ts).
268
+ const id = idChanged ? opts.id : util.detachedId(this.prefixId, this.seqid());
269
+ this.seq++;
270
+ const func = registered ? registered.name : funcOrName;
271
+ const version = registered ? registered.version : opts.version || 1;
272
+ const data = { func, args: argu, retry: opts.retryPolicy?.encode(), version };
273
+ const createReq = this.detachedCreateReq({ id, data, opts });
274
+ const slot = this.claimCreateSlot();
275
+ // Fire-and-forget: the parent waits only for the durable CREATE to land
276
+ // (so the spawn survives), never for the detached workflow's result, and
277
+ // never suspends on it — the outcome is always `value`, never `suspended`.
278
+ const outcome = (async () => {
279
+ const rec = await this.createSlotted(createReq, func, slot);
280
+ // Like the generator engine, detached takes the remote path (rpc + block):
281
+ // it creates a global promise it does not run itself. It just never adds the
282
+ // child to the remote-todo set, so the parent does not suspend on it.
283
+ this.trace.emit({ kind: "rpc", id: this.id, callee: id });
284
+ if (rec.state !== "pending") {
285
+ const state = rec.state === "resolved" ? "resolved" : "rejected";
286
+ this.trace.emit({ kind: "dedup", id, state, value: rec.value?.data });
287
+ }
288
+ else {
289
+ this.trace.emit({ kind: "block", id });
290
+ }
291
+ return { kind: "value", value: { id } };
292
+ })();
293
+ return this.track(id, outcome);
294
+ }
295
+ promise({ timeout, data, tags, } = {}) {
296
+ this.guardOpen("promise");
297
+ const id = this.seqid();
298
+ this.seq++;
299
+ const createReq = this.latentCreateReq({ id, timeout, data, tags });
300
+ const slot = this.claimCreateSlot();
301
+ return this.track(id, this.remoteOutcome(id, createReq, slot, "promise"));
302
+ }
303
+ // Shared body for remote-backed ops (rpc, sleep): create the promise; if it
304
+ // is already settled resolve/reject, otherwise record the remote-todo and
305
+ // suspend (the user-facing promise will hang).
306
+ remoteOutcome(id, createReq, slot, name) {
307
+ return (async () => {
308
+ const rec = await this.createSlotted(createReq, name, slot);
309
+ // rpc p→q: the parent created a remote child (rpc / sleep / DPC promise all
310
+ // take this path — they create a global promise and block on its settle).
311
+ this.trace.emit({ kind: "rpc", id: this.id, callee: id });
312
+ if (rec.state !== "pending") {
313
+ const state = rec.state === "resolved" ? "resolved" : "rejected";
314
+ this.trace.emit({ kind: "dedup", id, state, value: rec.value?.data });
315
+ return recordOutcome(rec);
316
+ }
317
+ this.trace.emit({ kind: "block", id });
318
+ this.fireSuspend();
319
+ return { kind: "suspended", remote: [id] };
320
+ })();
321
+ }
322
+ // Register an outcome for draining and derive the branded user-facing handle.
323
+ track(id, outcome) {
324
+ this.spawnedHandles.push(outcome);
325
+ return new DurablePromise(id, this.facing(outcome));
326
+ }
327
+ // Derive the user-facing promise from an outcome: value → resolve, error →
328
+ // reject, suspended → hang forever. Does NOT register the outcome for draining
329
+ // (callers that need draining push to `spawnedHandles` themselves or via track).
330
+ facing(outcome) {
331
+ const facing = outcome.then((o) => {
332
+ if (o.kind === "value")
333
+ return o.value;
334
+ if (o.kind === "error")
335
+ return Promise.reject(o.error);
336
+ return new Promise(() => { }); // suspended → hang
337
+ });
338
+ // Suppress unhandled-rejection noise if the user ignores this handle.
339
+ facing.catch(() => { });
340
+ return facing;
341
+ }
342
+ settle(id, outcome, func) {
343
+ return this.effects.promiseSettle({
344
+ kind: "promise.settle",
345
+ head: { corrId: randomUUID(), version: util.VERSION },
346
+ data: {
347
+ id,
348
+ state: outcome.kind === "value" ? "resolved" : "rejected",
349
+ value: { headers: {}, data: outcome.kind === "value" ? outcome.value : outcome.error },
350
+ },
351
+ }, func);
352
+ }
353
+ // --- metadata / utilities ----------------------------------------------
354
+ getDependency(name) {
355
+ return this.dependencies.get(name);
356
+ }
357
+ options(opts = {}) {
358
+ return this.optsBuilder.build(opts);
359
+ }
360
+ panic(condition, msg) {
361
+ if (condition) {
362
+ const error = exceptions.PANIC(util.getCallerInfo(), msg);
363
+ // Record + signal BEFORE throwing: the abort must survive a user
364
+ // try/catch around this call (the generator's DIE is thrown by the
365
+ // driver, out of user reach — this is the async equivalent).
366
+ this._panicError = error;
367
+ this._firePanic();
368
+ throw error;
369
+ }
370
+ }
371
+ assert(condition, msg) {
372
+ this.panic(!condition, msg);
373
+ }
374
+ date = {
375
+ now: () => this.run((this.getDependency("resonate:date") ?? Date).now),
376
+ };
377
+ math = {
378
+ random: () => this.run((this.getDependency("resonate:math") ?? Math).random),
379
+ };
380
+ // --- promise-create request builders (kept identical to InnerContext) ---
381
+ // Shared promise.create envelope; each builder supplies only the clamped
382
+ // timeout, the param data, and the scope-specific tag map.
383
+ createReq(args) {
384
+ return {
385
+ kind: "promise.create",
386
+ head: { corrId: randomUUID(), version: util.VERSION },
387
+ data: {
388
+ id: args.id,
389
+ timeoutAt: args.timeoutAt,
390
+ param: { headers: {}, data: args.data },
391
+ tags: args.tags,
392
+ },
393
+ };
394
+ }
395
+ localCreateReq({ id, data, opts, breaksLineage, }) {
396
+ return this.createReq({
397
+ id,
398
+ timeoutAt: Math.min(this.clock.now() + opts.timeout, this.timeoutAt),
399
+ data,
400
+ tags: {
401
+ "resonate:scope": "local",
402
+ "resonate:branch": this.branchId,
403
+ "resonate:parent": this.id,
404
+ "resonate:origin": breaksLineage ? id : this.originId,
405
+ // Prefix is set at the top and propagates down unchanged forever,
406
+ // independent of origin (which detached/explicit-id may break).
407
+ "resonate:prefix": this.prefixId,
408
+ ...opts.tags,
409
+ },
410
+ });
411
+ }
412
+ remoteCreateReq({ id, data, opts, breaksLineage, }) {
413
+ return this.createReq({
414
+ id,
415
+ timeoutAt: Math.min(this.clock.now() + opts.timeout, this.timeoutAt),
416
+ data,
417
+ tags: {
418
+ "resonate:scope": "global",
419
+ "resonate:target": opts.target,
420
+ "resonate:branch": id,
421
+ "resonate:parent": this.id,
422
+ "resonate:origin": breaksLineage ? id : this.originId,
423
+ // Prefix is set at the top and propagates down unchanged forever,
424
+ // independent of origin (which detached/explicit-id may break).
425
+ "resonate:prefix": this.prefixId,
426
+ ...opts.tags,
427
+ },
428
+ });
429
+ }
430
+ // Detached: a globally-scoped promise with its own origin (lineage break) and
431
+ // an independent lifetime — its timeout is NOT clamped to the parent's.
432
+ detachedCreateReq({ id, data, opts }) {
433
+ return this.createReq({
434
+ id,
435
+ timeoutAt: this.clock.now() + opts.timeout,
436
+ data,
437
+ tags: {
438
+ "resonate:scope": "global",
439
+ "resonate:target": opts.target,
440
+ "resonate:branch": id,
441
+ "resonate:parent": this.id,
442
+ "resonate:origin": id,
443
+ // Prefix carries forward unchanged across the detached re-root (origin
444
+ // breaks, prefix does not) — this is what keeps recursive ids bounded.
445
+ "resonate:prefix": this.prefixId,
446
+ ...opts.tags,
447
+ },
448
+ });
449
+ }
450
+ // Latent (DPC): a globally-scoped promise with no function, resolved out of band.
451
+ latentCreateReq({ id, timeout, data, tags, }) {
452
+ return this.createReq({
453
+ id,
454
+ timeoutAt: Math.min(this.clock.now() + (timeout ?? 24 * util.HOUR), this.timeoutAt),
455
+ data,
456
+ tags: {
457
+ "resonate:scope": "global",
458
+ "resonate:branch": id,
459
+ "resonate:parent": this.id,
460
+ "resonate:origin": this.originId,
461
+ // Prefix is set at the top and propagates down unchanged forever.
462
+ "resonate:prefix": this.prefixId,
463
+ ...tags,
464
+ },
465
+ });
466
+ }
467
+ sleepCreateReq({ id, time }) {
468
+ return this.createReq({
469
+ id,
470
+ timeoutAt: Math.min(time, this.timeoutAt),
471
+ data: "",
472
+ tags: {
473
+ "resonate:scope": "global",
474
+ "resonate:branch": id,
475
+ "resonate:parent": this.id,
476
+ "resonate:origin": this.originId,
477
+ // Prefix is set at the top and propagates down unchanged forever.
478
+ "resonate:prefix": this.prefixId,
479
+ "resonate:timer": "true",
480
+ },
481
+ });
482
+ }
483
+ seqid() {
484
+ return `${this.id}.${this.seq}`;
485
+ }
486
+ }
487
+ // Map a settled durable promise record to an outcome.
488
+ function recordOutcome(rec) {
489
+ return rec.state === "resolved"
490
+ ? { kind: "value", value: rec.value?.data }
491
+ : { kind: "error", error: rec.value?.data };
492
+ }
493
+ /**
494
+ * Microtask generations the drain waits for the op set to stabilize. Bounds the
495
+ * non-durable `await` hops a continuation may take between a settled durable op
496
+ * and its next durable call while still landing inside the pass; deeper chains
497
+ * are off-contract and panic via the closed context.
498
+ */
499
+ const DRAIN_YIELDS = 16;
500
+ /**
501
+ * Run a user function to completion or suspension under `ctx`.
502
+ *
503
+ * The function may park forever on a hung `await`, so we race it against the
504
+ * suspend signal rather than waiting for it to finish. Whatever wins, we then
505
+ * drain every started op (their outcomes always settle) to collect the complete
506
+ * set of remote-todos — this is the authoritative suspend decision.
507
+ */
508
+ export async function run(ctx, func, args) {
509
+ const race = await Promise.race([
510
+ (async () => {
511
+ try {
512
+ return { tag: "returned", v: await func(ctx, ...args) };
513
+ }
514
+ catch (e) {
515
+ return { tag: "threw", e };
516
+ }
517
+ })(),
518
+ ctx.suspendSignal.then(() => ({ tag: "stuck" })),
519
+ // A panic ends the pass even if the user catches the throw and then parks
520
+ // on a non-durable await (the fn branch would never settle).
521
+ ctx.panicSignal.then(() => ({ tag: "panicked" })),
522
+ ]);
523
+ // Structured-concurrency drain. allSettled awaits every started op (so no
524
+ // unhandled rejections) and never hangs (outcomes always settle). Ops can
525
+ // start MORE ops from continuations behind an earlier op's await (a chained
526
+ // ctx.run), so a single snapshot is not enough: drain in rounds until the op
527
+ // set stops growing, then yield a bounded number of microtask generations
528
+ // before declaring the set stable — continuations may still be walking toward
529
+ // their next durable call through combinator/microtask hops (Promise.all
530
+ // resolution, `await null`). Microtask-only on purpose: the deterministic
531
+ // simulator drains the whole microtask queue per tick (so these yields are
532
+ // free in sim-time) but never fires engine timers/setImmediate. Only then is
533
+ // the pass finalized (ctx.close): a later op — a continuation parked on a
534
+ // timer or I/O — would race task.suspend/fulfill as a zombie, so it panics
535
+ // instead.
536
+ const settled = [];
537
+ drain: while (true) {
538
+ while (settled.length < ctx.spawnedHandles.length) {
539
+ settled.push(...(await Promise.allSettled(ctx.spawnedHandles.slice(settled.length))));
540
+ }
541
+ for (let k = 0; k < DRAIN_YIELDS; k++) {
542
+ await Promise.resolve();
543
+ if (settled.length < ctx.spawnedHandles.length)
544
+ continue drain;
545
+ }
546
+ break;
547
+ }
548
+ ctx.close();
549
+ // A panic aborts the whole pass — the task is released, nothing settles —
550
+ // exactly like the generator's DIE. Checked on the context, not the race,
551
+ // so a user try/catch around ctx.panic cannot suppress it; checked after
552
+ // the drain so no op is left mid-flight. It propagates: a child's panic
553
+ // rejects its outcome, and the parent's drain rethrows it below.
554
+ if (ctx.panicError)
555
+ throw ctx.panicError;
556
+ // An op whose promiseCreate/settle failed at the infra level fails the whole
557
+ // pass (the task is released and retried), rather than settling a child
558
+ // rejected. Deferred until the drain is complete so no op is left mid-flight.
559
+ const remote = [];
560
+ for (const s of settled) {
561
+ if (s.status === "rejected")
562
+ throw s.reason;
563
+ if (s.value.kind === "suspended")
564
+ remote.push(...s.value.remote);
565
+ }
566
+ const dedup = [...new Set(remote)];
567
+ if (dedup.length > 0)
568
+ return { kind: "suspended", remote: dedup };
569
+ if (race.tag === "threw")
570
+ return { kind: "error", error: race.e };
571
+ return { kind: "value", value: race.tag === "returned" ? race.v : undefined };
572
+ }
573
+ /**
574
+ * Run a user function with in-process retries (mirrors `util.executeWithRetry`
575
+ * for the generator engine). Each attempt runs under a FRESH context — so a
576
+ * function that creates durable children re-creates them with identical ids and
577
+ * replays via dedup, exactly like a cross-process replay.
578
+ *
579
+ * Only an `error` outcome is retried; `value` and `suspended` short-circuit. A
580
+ * retry is skipped (and the error returned) when the error is non-retryable, the
581
+ * policy is exhausted, or the next delay would exceed the function's timeout.
582
+ */
583
+ export async function runWithRetry(makeCtx, func, args, policy, nonRetryableErrors, clock, timeoutAt) {
584
+ let attempt = 1;
585
+ while (true) {
586
+ const outcome = await run(makeCtx(attempt), func, args);
587
+ if (outcome.kind !== "error")
588
+ return outcome;
589
+ if (nonRetryableErrors.some((Ctor) => outcome.error instanceof Ctor))
590
+ return outcome;
591
+ const retryIn = policy.next(attempt);
592
+ if (retryIn === null || clock.now() + retryIn >= timeoutAt)
593
+ return outcome;
594
+ attempt++;
595
+ await delay(retryIn);
596
+ }
597
+ }
598
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/async/context.ts"],"names":[],"mappings":"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"}