@resonatehq/sdk 0.10.2 → 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.
- package/LICENSE +1 -1
- package/README.md +60 -0
- package/dist/async/context.d.ts +270 -0
- package/dist/async/context.d.ts.map +1 -0
- package/dist/async/context.js +598 -0
- package/dist/async/context.js.map +1 -0
- package/dist/async/core.d.ts +61 -0
- package/dist/async/core.d.ts.map +1 -0
- package/dist/async/core.js +239 -0
- package/dist/async/core.js.map +1 -0
- package/dist/async/index.d.ts +4 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +12 -0
- package/dist/async/index.js.map +1 -0
- package/dist/async/resonate.d.ts +98 -0
- package/dist/async/resonate.d.ts.map +1 -0
- package/dist/async/resonate.js +387 -0
- package/dist/async/resonate.js.map +1 -0
- package/dist/computation.d.ts.map +1 -1
- package/dist/computation.js +4 -0
- package/dist/computation.js.map +1 -1
- package/dist/context.d.ts +43 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +34 -4
- package/dist/context.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +8 -2
- package/dist/core.js.map +1 -1
- package/dist/coroutine.d.ts.map +1 -1
- package/dist/coroutine.js +1 -1
- package/dist/coroutine.js.map +1 -1
- package/dist/heartbeat.d.ts.map +1 -1
- package/dist/heartbeat.js +1 -1
- package/dist/heartbeat.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/network/http.d.ts +0 -20
- package/dist/network/http.d.ts.map +1 -1
- package/dist/network/http.js +5 -99
- package/dist/network/http.js.map +1 -1
- package/dist/network/local.js +1 -1
- package/dist/network/local.js.map +1 -1
- package/dist/network/nats.d.ts +59 -0
- package/dist/network/nats.d.ts.map +1 -0
- package/dist/network/nats.js +272 -0
- package/dist/network/nats.js.map +1 -0
- package/dist/platform.d.ts +4 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +24 -0
- package/dist/platform.js.map +1 -0
- package/dist/promises.d.ts.map +1 -1
- package/dist/promises.js +1 -1
- package/dist/promises.js.map +1 -1
- package/dist/resonate.d.ts.map +1 -1
- package/dist/resonate.js +20 -9
- package/dist/resonate.js.map +1 -1
- package/dist/schedules.d.ts.map +1 -1
- package/dist/schedules.js +1 -1
- package/dist/schedules.js.map +1 -1
- package/dist/trace.d.ts +11 -0
- package/dist/trace.d.ts.map +1 -1
- package/dist/trace.js +22 -0
- package/dist/trace.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +7 -3
- package/dist/util.js.map +1 -1
- package/package.json +22 -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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"}
|