@rivet-dev/vercel-world 0.0.0-http-body-streaming.064e07d

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 (81) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/README.md +31 -0
  3. package/dist/actors/coordinator.d.ts +114 -0
  4. package/dist/actors/coordinator.d.ts.map +1 -0
  5. package/dist/actors/coordinator.js +232 -0
  6. package/dist/actors/coordinator.js.map +1 -0
  7. package/dist/actors/db.d.ts +8 -0
  8. package/dist/actors/db.d.ts.map +1 -0
  9. package/dist/actors/db.js +282 -0
  10. package/dist/actors/db.js.map +1 -0
  11. package/dist/actors/dispatcher.d.ts +84 -0
  12. package/dist/actors/dispatcher.d.ts.map +1 -0
  13. package/dist/actors/dispatcher.js +498 -0
  14. package/dist/actors/dispatcher.js.map +1 -0
  15. package/dist/actors/hook-token.d.ts +26 -0
  16. package/dist/actors/hook-token.d.ts.map +1 -0
  17. package/dist/actors/hook-token.js +151 -0
  18. package/dist/actors/hook-token.js.map +1 -0
  19. package/dist/actors/shared.d.ts +366 -0
  20. package/dist/actors/shared.d.ts.map +1 -0
  21. package/dist/actors/shared.js +112 -0
  22. package/dist/actors/shared.js.map +1 -0
  23. package/dist/actors/streams.d.ts +26 -0
  24. package/dist/actors/streams.d.ts.map +1 -0
  25. package/dist/actors/streams.js +127 -0
  26. package/dist/actors/streams.js.map +1 -0
  27. package/dist/actors/workflow-run.d.ts +891 -0
  28. package/dist/actors/workflow-run.d.ts.map +1 -0
  29. package/dist/actors/workflow-run.js +872 -0
  30. package/dist/actors/workflow-run.js.map +1 -0
  31. package/dist/actors.d.ts +2244 -0
  32. package/dist/actors.d.ts.map +1 -0
  33. package/dist/actors.js +16 -0
  34. package/dist/actors.js.map +1 -0
  35. package/dist/codec.d.ts +4 -0
  36. package/dist/codec.d.ts.map +1 -0
  37. package/dist/codec.js +27 -0
  38. package/dist/codec.js.map +1 -0
  39. package/dist/index.d.ts +843 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +567 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/runtime.d.ts +2 -0
  44. package/dist/runtime.d.ts.map +1 -0
  45. package/dist/runtime.js +24 -0
  46. package/dist/runtime.js.map +1 -0
  47. package/package.json +51 -0
  48. package/scripts/conformance/run.ts +278 -0
  49. package/scripts/integration/run.ts +935 -0
  50. package/src/actors/coordinator.ts +360 -0
  51. package/src/actors/db.ts +291 -0
  52. package/src/actors/dispatcher.ts +787 -0
  53. package/src/actors/hook-token.ts +239 -0
  54. package/src/actors/shared.ts +153 -0
  55. package/src/actors/streams.ts +215 -0
  56. package/src/actors/workflow-run.ts +1477 -0
  57. package/src/actors.ts +18 -0
  58. package/src/codec.ts +28 -0
  59. package/src/index.ts +788 -0
  60. package/src/runtime.ts +29 -0
  61. package/tests/conformance.test.ts +8 -0
  62. package/tests/helpers/db.ts +62 -0
  63. package/tests/helpers/dispatcher-driver.ts +71 -0
  64. package/tests/helpers/harness.ts +161 -0
  65. package/tests/integration/crash-restart.test.ts +145 -0
  66. package/tests/integration/dispatcher-loop.test.ts +144 -0
  67. package/tests/integration/hook-token.test.ts +160 -0
  68. package/tests/integration/hooks.test.ts +123 -0
  69. package/tests/integration/streams.test.ts +178 -0
  70. package/tests/integration/workflow-events.test.ts +326 -0
  71. package/tests/setup.ts +10 -0
  72. package/tests/unit/codec.test.ts +73 -0
  73. package/tests/unit/coordinator-record.test.ts +177 -0
  74. package/tests/unit/db-migrations.test.ts +65 -0
  75. package/tests/unit/dispatcher-queue.test.ts +274 -0
  76. package/tests/unit/logging.test.ts +49 -0
  77. package/tests/unit/readiness.test.ts +102 -0
  78. package/tests/unit/transaction.test.ts +76 -0
  79. package/tsconfig.build.json +13 -0
  80. package/tsconfig.json +12 -0
  81. package/vitest.config.ts +32 -0
@@ -0,0 +1,498 @@
1
+ import { MessageId, QueuePayloadSchema, parseQueueName } from "@workflow/world";
2
+ function createDispatchSignal() {
3
+ let resolve;
4
+ const promise = new Promise((resolvePromise) => {
5
+ resolve = resolvePromise;
6
+ });
7
+ return { promise, resolve };
8
+ }
9
+ function signalDispatch(vars) {
10
+ vars.requestedGeneration++;
11
+ vars.drainSignal.resolve();
12
+ vars.drainSignal = createDispatchSignal();
13
+ }
14
+ function assertPartitionKey(c, partition) {
15
+ const actorPartition = c.key[0];
16
+ if (!actorPartition || actorPartition !== partition) {
17
+ throw new Error(`workflowRun actor key mismatch: expected ${actorPartition ?? "<missing>"}, received ${partition}`);
18
+ }
19
+ }
20
+ function envInteger(name, fallback, min) {
21
+ const value = Number(process.env[name]);
22
+ if (!Number.isFinite(value))
23
+ return fallback;
24
+ return Math.max(min, Math.floor(value));
25
+ }
26
+ const MAX_DISPATCH_ATTEMPTS = envInteger("RIVET_WORLD_RIVET_MAX_DISPATCH_ATTEMPTS", 256, 1);
27
+ const RETRY_DELAY_MS = envInteger("RIVET_WORLD_RIVET_RETRY_DELAY_MS", 5_000, 0);
28
+ export const STALE_INFLIGHT_MS = envInteger("RIVET_WORLD_RIVET_STALE_INFLIGHT_MS", 60_000, 1);
29
+ const configuredDispatchTimeoutMs = Number(process.env.RIVET_WORLD_RIVET_DISPATCH_TIMEOUT_MS);
30
+ const DISPATCH_TIMEOUT_MS = Number.isFinite(configuredDispatchTimeoutMs)
31
+ ? Math.max(1, Math.floor(configuredDispatchTimeoutMs))
32
+ : null;
33
+ const MAX_TIMER_MS = 2_147_483_647;
34
+ const MAX_CONCURRENT_DISPATCHES = 32;
35
+ // Field names that must never reach the log (defense-in-depth — the call sites
36
+ // already avoid passing the bearer secret, but redact by key in case a future
37
+ // call site passes headers/tokens through).
38
+ const REDACTED_LOG_KEYS = new Set([
39
+ "authorization",
40
+ "secret",
41
+ "token",
42
+ "headers",
43
+ "password",
44
+ ]);
45
+ /**
46
+ * Structured, single-line JSON logging gated behind RIVET_WORLD_RIVET_DEBUG. A
47
+ * trace id (message id, falling back to partition/run id) ties together all log
48
+ * lines for one dispatch so a run can be followed end to end. Sensitive keys are
49
+ * redacted so the `.well-known` bearer secret can never be logged.
50
+ */
51
+ export function debugLog(event, data) {
52
+ if (process.env.RIVET_WORLD_RIVET_DEBUG !== "1")
53
+ return;
54
+ const safe = {};
55
+ for (const [key, value] of Object.entries(data ?? {})) {
56
+ safe[key] = REDACTED_LOG_KEYS.has(key.toLowerCase()) ? "[redacted]" : value;
57
+ }
58
+ const traceId = data?.messageId ?? data?.partition ?? data?.runId;
59
+ console.error(JSON.stringify({
60
+ scope: "@rivet-dev/vercel-world",
61
+ event,
62
+ ...(traceId == null ? {} : { traceId }),
63
+ ...safe,
64
+ }));
65
+ }
66
+ function normalizeRuntimeUrl(value) {
67
+ return value.replace(/\/+$/, "");
68
+ }
69
+ function queueRoute(queueName) {
70
+ return parseQueueName(queueName).kind === "workflow" ? "flow" : "step";
71
+ }
72
+ export async function claimNextDispatch(c) {
73
+ const now = Date.now();
74
+ const rows = await c.db.execute(`
75
+ UPDATE dispatcher_queue
76
+ SET status = 'inflight',
77
+ attempt = attempt + 1,
78
+ started_at = ?,
79
+ finished_at = NULL,
80
+ http_status = NULL,
81
+ error = NULL,
82
+ updated_at = ?
83
+ WHERE message_id = (
84
+ SELECT message_id
85
+ FROM dispatcher_queue
86
+ WHERE status = 'ready' AND next_at <= ?
87
+ ORDER BY created_at ASC
88
+ LIMIT 1
89
+ )
90
+ RETURNING message_id, queue_name, route, runtime_url, body, headers, attempt
91
+ `, now, now, now);
92
+ const row = rows[0];
93
+ if (!row)
94
+ return null;
95
+ debugLog("dispatcher.claim", {
96
+ messageId: row.message_id,
97
+ queueName: row.queue_name,
98
+ attempt: row.attempt,
99
+ });
100
+ return {
101
+ message_id: String(row.message_id),
102
+ queue_name: String(row.queue_name),
103
+ route: row.route === "step" ? "step" : "flow",
104
+ runtime_url: String(row.runtime_url),
105
+ body: String(row.body),
106
+ headers: row.headers == null
107
+ ? {}
108
+ : JSON.parse(String(row.headers)),
109
+ attempt: Number(row.attempt),
110
+ };
111
+ }
112
+ export async function reclaimStaleInflight(c, locallyActiveMessageIds = new Set()) {
113
+ const now = Date.now();
114
+ const locallyActive = [...locallyActiveMessageIds];
115
+ const excludeLocallyActive = locallyActive.length === 0
116
+ ? ""
117
+ : `AND message_id NOT IN (${locallyActive.map(() => "?").join(", ")})`;
118
+ // Transient reclaim: the row is going back to 'ready' for redelivery, so it
119
+ // is NOT finished — leave finished_at NULL and don't stamp a terminal error.
120
+ await c.db.execute(`
121
+ UPDATE dispatcher_queue
122
+ SET status = 'ready',
123
+ next_at = ?,
124
+ updated_at = ?
125
+ WHERE status = 'inflight'
126
+ AND started_at IS NOT NULL
127
+ AND started_at <= ?
128
+ AND attempt < ?
129
+ ${excludeLocallyActive}
130
+ `, now, now, now - STALE_INFLIGHT_MS, MAX_DISPATCH_ATTEMPTS, ...locallyActive);
131
+ await c.db.execute(`
132
+ UPDATE dispatcher_queue
133
+ SET status = 'failed',
134
+ finished_at = ?,
135
+ error = 'stale inflight exceeded max attempts',
136
+ updated_at = ?
137
+ WHERE status = 'inflight'
138
+ AND started_at IS NOT NULL
139
+ AND started_at <= ?
140
+ AND attempt >= ?
141
+ ${excludeLocallyActive}
142
+ `, now, now, now - STALE_INFLIGHT_MS, MAX_DISPATCH_ATTEMPTS, ...locallyActive);
143
+ }
144
+ export async function nextDispatchAt(c) {
145
+ const row = (await c.db.execute(`
146
+ SELECT next_at
147
+ FROM dispatcher_queue
148
+ WHERE status = 'ready'
149
+ ORDER BY next_at ASC
150
+ LIMIT 1
151
+ `))[0];
152
+ return row?.next_at == null ? null : Number(row.next_at);
153
+ }
154
+ export async function nextInflightRecoveryAt(c, locallyActiveMessageIds = new Set()) {
155
+ const locallyActive = [...locallyActiveMessageIds];
156
+ const excludeLocallyActive = locallyActive.length === 0
157
+ ? ""
158
+ : `AND message_id NOT IN (${locallyActive.map(() => "?").join(", ")})`;
159
+ const row = (await c.db.execute(`
160
+ SELECT MIN(started_at) AS started_at
161
+ FROM dispatcher_queue
162
+ WHERE status = 'inflight' AND started_at IS NOT NULL
163
+ ${excludeLocallyActive}
164
+ `, ...locallyActive))[0];
165
+ const persistedRecoveryAt = row?.started_at == null
166
+ ? null
167
+ : Number(row.started_at) + STALE_INFLIGHT_MS;
168
+ // Keep a durable recovery alarm while a request is active, but move it into
169
+ // the future after each check so a legitimate long request cannot hot-loop
170
+ // immediate actor wakes. After a crash this in-memory set disappears, and the
171
+ // next alarm reclaims the persisted inflight row at its original stale time.
172
+ const localRecoveryAt = locallyActive.length > 0
173
+ ? Date.now() + STALE_INFLIGHT_MS
174
+ : null;
175
+ return persistedRecoveryAt == null
176
+ ? localRecoveryAt
177
+ : localRecoveryAt == null
178
+ ? persistedRecoveryAt
179
+ : Math.min(persistedRecoveryAt, localRecoveryAt);
180
+ }
181
+ export async function markDispatchDone(c, messageId, attempt, status) {
182
+ await c.db.execute(`
183
+ UPDATE dispatcher_queue
184
+ SET status = 'done',
185
+ finished_at = ?,
186
+ http_status = ?,
187
+ error = NULL,
188
+ updated_at = ?
189
+ WHERE message_id = ? AND status = 'inflight' AND attempt = ?
190
+ `, Date.now(), status, Date.now(), messageId, attempt);
191
+ }
192
+ export async function rescheduleDispatch(c, messageId, attempt, delayMs, status, error) {
193
+ const now = Date.now();
194
+ await c.db.execute(`
195
+ UPDATE dispatcher_queue
196
+ SET status = 'ready',
197
+ next_at = ?,
198
+ finished_at = ?,
199
+ http_status = ?,
200
+ error = ?,
201
+ updated_at = ?
202
+ WHERE message_id = ? AND status = 'inflight' AND attempt = ?
203
+ `, now + Math.max(0, delayMs), now, status, error, now, messageId, attempt);
204
+ }
205
+ export async function failDispatch(c, messageId, attempt, status, error) {
206
+ const now = Date.now();
207
+ await c.db.execute(`
208
+ UPDATE dispatcher_queue
209
+ SET status = 'failed',
210
+ finished_at = ?,
211
+ http_status = ?,
212
+ error = ?,
213
+ updated_at = ?
214
+ WHERE message_id = ? AND status = 'inflight' AND attempt = ?
215
+ `, now, status, error, now, messageId, attempt);
216
+ }
217
+ export async function inspectQueue(c) {
218
+ const countRows = await c.db.execute(`
219
+ SELECT status, COUNT(*) AS count
220
+ FROM dispatcher_queue
221
+ GROUP BY status
222
+ `);
223
+ const rowRows = await c.db.execute(`
224
+ SELECT message_id, queue_name, route, status, attempt, next_at,
225
+ started_at, finished_at, http_status, error
226
+ FROM dispatcher_queue
227
+ ORDER BY created_at ASC
228
+ LIMIT 100
229
+ `);
230
+ const counts = {};
231
+ for (const row of countRows) {
232
+ counts[String(row.status)] = Number(row.count);
233
+ }
234
+ const rows = rowRows.map((row) => ({
235
+ messageId: String(row.message_id),
236
+ queueName: String(row.queue_name),
237
+ route: String(row.route),
238
+ status: String(row.status),
239
+ attempt: Number(row.attempt),
240
+ nextAt: Number(row.next_at),
241
+ startedAt: row.started_at == null ? null : Number(row.started_at),
242
+ finishedAt: row.finished_at == null ? null : Number(row.finished_at),
243
+ httpStatus: row.http_status == null ? null : Number(row.http_status),
244
+ error: row.error == null ? null : String(row.error),
245
+ }));
246
+ return {
247
+ counts,
248
+ rows,
249
+ maxAttempts: MAX_DISPATCH_ATTEMPTS,
250
+ retryDelayMs: RETRY_DELAY_MS,
251
+ staleInflightMs: STALE_INFLIGHT_MS,
252
+ };
253
+ }
254
+ async function deliverDispatch(c, partition, row) {
255
+ debugLog("dispatcher.deliver", {
256
+ messageId: row.message_id,
257
+ route: row.route,
258
+ runtimeUrl: row.runtime_url,
259
+ attempt: row.attempt,
260
+ });
261
+ const response = await fetch(`${normalizeRuntimeUrl(row.runtime_url)}/.well-known/workflow/v1/${row.route}`, {
262
+ method: "POST",
263
+ // Workflow handlers may legitimately hold this request for the entire
264
+ // duration of a long-running step. Keep it open by default; operators can
265
+ // opt into a transport timeout when their runtime has a known upper bound.
266
+ ...(DISPATCH_TIMEOUT_MS == null
267
+ ? {}
268
+ : { signal: AbortSignal.timeout(DISPATCH_TIMEOUT_MS) }),
269
+ duplex: "half",
270
+ headers: {
271
+ ...row.headers,
272
+ "content-type": "application/json",
273
+ "x-vqs-queue-name": row.queue_name,
274
+ "x-vqs-message-id": row.message_id,
275
+ "x-vqs-message-attempt": String(row.attempt),
276
+ },
277
+ body: row.body,
278
+ });
279
+ const text = await response.text();
280
+ debugLog("dispatcher.response", {
281
+ messageId: row.message_id,
282
+ status: response.status,
283
+ body: text.slice(0, 500),
284
+ });
285
+ if (response.ok) {
286
+ let parsed;
287
+ let parseOk = false;
288
+ try {
289
+ parsed = JSON.parse(text);
290
+ parseOk = true;
291
+ }
292
+ catch { }
293
+ if (parseOk &&
294
+ parsed != null &&
295
+ typeof parsed === "object" &&
296
+ "timeoutSeconds" in parsed) {
297
+ const timeoutSeconds = Number(parsed.timeoutSeconds);
298
+ if (Number.isFinite(timeoutSeconds) && timeoutSeconds >= 0) {
299
+ const delayMs = Math.min(timeoutSeconds * 1000, MAX_TIMER_MS);
300
+ await rescheduleDispatch(c, row.message_id, row.attempt, delayMs, response.status, null);
301
+ await scheduleDispatchWake(c, partition, delayMs);
302
+ return;
303
+ }
304
+ // A `timeoutSeconds` field that isn't a valid delay is a malformed
305
+ // runtime response — retry rather than silently acking the message.
306
+ if (row.attempt >= MAX_DISPATCH_ATTEMPTS) {
307
+ await failDispatch(c, row.message_id, row.attempt, response.status, `malformed timeoutSeconds: ${text.slice(0, 200)}`);
308
+ return;
309
+ }
310
+ await rescheduleDispatch(c, row.message_id, row.attempt, RETRY_DELAY_MS, response.status, `malformed timeoutSeconds: ${text.slice(0, 200)}`);
311
+ await scheduleDispatchWake(c, partition, RETRY_DELAY_MS);
312
+ return;
313
+ }
314
+ // A 2xx means the runtime accepted this delivery, but a crash before this
315
+ // durable update causes redelivery. This is intentional at-least-once
316
+ // delivery: Workflow requires the same message id across attempts for
317
+ // replay ownership recovery. It does not promise exactly-once external
318
+ // side effects; steps must use their stable step id as an idempotency key.
319
+ await markDispatchDone(c, row.message_id, row.attempt, response.status);
320
+ return;
321
+ }
322
+ if (row.attempt >= MAX_DISPATCH_ATTEMPTS) {
323
+ await failDispatch(c, row.message_id, row.attempt, response.status, `HTTP ${response.status}: ${text}`);
324
+ return;
325
+ }
326
+ await rescheduleDispatch(c, row.message_id, row.attempt, RETRY_DELAY_MS, response.status, `HTTP ${response.status}: ${text}`);
327
+ await scheduleDispatchWake(c, partition, RETRY_DELAY_MS);
328
+ }
329
+ async function scheduleDispatchWake(c, partition, delayMs) {
330
+ if (c.armNextWake) {
331
+ await c.armNextWake();
332
+ return;
333
+ }
334
+ const clampedDelayMs = Math.min(Math.max(0, delayMs), MAX_TIMER_MS);
335
+ debugLog("dispatcher.schedule", { partition, delayMs: clampedDelayMs });
336
+ if (clampedDelayMs === 0) {
337
+ startDispatchLoop(c, partition);
338
+ return;
339
+ }
340
+ // Coalesce superseded wakes: `c.schedule` has no cancel, so we avoid arming a
341
+ // redundant later-or-equal wake when one is already pending (it will re-scan
342
+ // and re-arm). This bounds schedule growth.
343
+ const target = Date.now() + clampedDelayMs;
344
+ if (c.vars.wakeArmedAt != null && c.vars.wakeArmedAt <= target)
345
+ return;
346
+ await c.schedule.after(clampedDelayMs, "wake");
347
+ c.vars.wakeArmedAt = target;
348
+ }
349
+ export async function drainDispatchQueue(c, partition) {
350
+ // NOTE: do not gate this loop on the originating action's `c.aborted`. The
351
+ // loop is launched via `c.keepAwake(...)` from whatever action (enqueue /
352
+ // wake / onWake) first observed work, but it must outlive that action: the
353
+ // action's context aborts as soon as it returns its response, which would
354
+ // otherwise strand any rows enqueued after the first delivery. `keepAwake`
355
+ // keeps the *actor* alive for the promise; genuine actor shutdown surfaces as
356
+ // a thrown db error that unwinds the loop and clears the latch.
357
+ const active = new Set();
358
+ while (true) {
359
+ if (active.size >= MAX_CONCURRENT_DISPATCHES) {
360
+ await Promise.race(active);
361
+ continue;
362
+ }
363
+ await reclaimStaleInflight(c, c.vars.activeMessageIds);
364
+ const drainSignal = c.vars.drainSignal.promise;
365
+ const row = await claimNextDispatch(c);
366
+ if (!row) {
367
+ if (active.size > 0) {
368
+ // Workflow turns can enqueue their continuations before the current HTTP
369
+ // delivery returns. Wake on either event so those continuations can run
370
+ // concurrently instead of head-of-line blocking the active turn.
371
+ await Promise.race([drainSignal, Promise.race(active)]);
372
+ continue;
373
+ }
374
+ const [nextReadyAt, nextRecoveryAt] = await Promise.all([
375
+ nextDispatchAt(c),
376
+ nextInflightRecoveryAt(c, c.vars.activeMessageIds),
377
+ ]);
378
+ const nextAt = nextReadyAt == null
379
+ ? nextRecoveryAt
380
+ : nextRecoveryAt == null
381
+ ? nextReadyAt
382
+ : Math.min(nextReadyAt, nextRecoveryAt);
383
+ debugLog("dispatcher.loop.idle", { partition, nextAt });
384
+ if (nextAt == null)
385
+ return;
386
+ if (nextAt <= Date.now())
387
+ continue;
388
+ await scheduleDispatchWake(c, partition, nextAt - Date.now());
389
+ return;
390
+ }
391
+ // A claimed row must always have a durable future wake before external I/O.
392
+ // If the process dies during fetch, that wake reclaims the expired claim.
393
+ await scheduleDispatchWake(c, partition, STALE_INFLIGHT_MS);
394
+ let delivery;
395
+ c.vars.activeMessageIds.add(row.message_id);
396
+ delivery = (async () => {
397
+ try {
398
+ await deliverDispatch(c, partition, row);
399
+ }
400
+ catch (error) {
401
+ const message = error instanceof Error ? error.message : String(error);
402
+ if (row.attempt >= MAX_DISPATCH_ATTEMPTS) {
403
+ await failDispatch(c, row.message_id, row.attempt, null, message);
404
+ }
405
+ else {
406
+ await rescheduleDispatch(c, row.message_id, row.attempt, RETRY_DELAY_MS, null, message);
407
+ await scheduleDispatchWake(c, partition, RETRY_DELAY_MS);
408
+ }
409
+ }
410
+ finally {
411
+ active.delete(delivery);
412
+ c.vars.activeMessageIds.delete(row.message_id);
413
+ }
414
+ })();
415
+ active.add(delivery);
416
+ }
417
+ }
418
+ export function startDispatchLoop(c, partition) {
419
+ signalDispatch(c.vars);
420
+ // Single-consumer latch (SPEC §3.3/§5): actions run concurrently per actor
421
+ // (Fact 1a), so concurrent enqueue/wake calls must not each spawn a drain
422
+ // loop — that would create competing claim loops. One loop may keep multiple
423
+ // claimed HTTP deliveries in flight because Workflow continuations can depend
424
+ // on another delivery for the same run. The
425
+ // check-and-set below has no `await` between read and write, so it is atomic
426
+ // across concurrent JS turns; losers no-op and rely on the running loop to
427
+ // pick up the rows they enqueued.
428
+ if (c.vars.draining) {
429
+ debugLog("dispatcher.start.latched", { partition });
430
+ return;
431
+ }
432
+ const launch = () => {
433
+ const generation = c.vars.requestedGeneration;
434
+ c.vars.draining = true;
435
+ debugLog("dispatcher.start", { partition, generation });
436
+ void c
437
+ .keepAwake((async () => {
438
+ try {
439
+ await drainDispatchQueue(c, partition);
440
+ }
441
+ finally {
442
+ c.vars.draining = false;
443
+ // An enqueue can commit after the drain's final empty query but
444
+ // before the latch clears. A newer generation forces one more pass.
445
+ if (c.vars.requestedGeneration !== generation)
446
+ launch();
447
+ }
448
+ })())
449
+ .catch((error) => {
450
+ debugLog("dispatcher.loop.error", {
451
+ partition,
452
+ error: error instanceof Error ? error.message : String(error),
453
+ });
454
+ });
455
+ };
456
+ launch();
457
+ }
458
+ export const createDispatcherVars = () => ({
459
+ draining: false,
460
+ requestedGeneration: 0,
461
+ drainSignal: createDispatchSignal(),
462
+ activeMessageIds: new Set(),
463
+ wakeArmedAt: null,
464
+ serialTail: Promise.resolve(),
465
+ });
466
+ export async function insertDispatch(c, messageId, queueName, runtimeUrl, body, headers, delaySeconds, idempotencyKey) {
467
+ MessageId.parse(messageId);
468
+ QueuePayloadSchema.parse(JSON.parse(body));
469
+ const now = Date.now();
470
+ await c.db.execute(`INSERT OR IGNORE INTO dispatcher_queue (
471
+ message_id, queue_name, route, runtime_url, body, headers,
472
+ idem_key, status, attempt, next_at, created_at, updated_at
473
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 'ready', 0, ?, ?, ?)`, messageId, queueName, queueRoute(queueName), normalizeRuntimeUrl(runtimeUrl), body, headers == null ? null : JSON.stringify(headers), idempotencyKey ?? null, now + Math.max(0, delaySeconds ?? 0) * 1000, now, now);
474
+ const stored = await c.db.execute(`SELECT message_id FROM dispatcher_queue
475
+ WHERE message_id = ? OR (? IS NOT NULL AND idem_key = ?) LIMIT 1`, messageId, idempotencyKey ?? null, idempotencyKey ?? null);
476
+ return { messageId: String(stored[0]?.message_id ?? messageId) };
477
+ }
478
+ export async function enqueueDispatch(c, partition, messageId, queueName, runtimeUrl, body, headers, delaySeconds, idempotencyKey) {
479
+ assertPartitionKey(c, partition);
480
+ // Pre-arm before the durable insert. If the process dies after the insert but
481
+ // before the normal drain starts, the actor wake still discovers the row.
482
+ await c.schedule.after(0, "wake");
483
+ const stored = await insertDispatch(c, messageId, queueName, runtimeUrl, body, headers, delaySeconds, idempotencyKey);
484
+ startDispatchLoop(c, partition);
485
+ return stored;
486
+ }
487
+ export async function forceStaleInflightForTesting(c, partition, messageId, ageMs = STALE_INFLIGHT_MS + 1_000) {
488
+ assertPartitionKey(c, partition);
489
+ if (process.env.RIVET_WORLD_RIVET_TESTING !== "1") {
490
+ throw new Error("forceStaleInflightForTesting requires test mode");
491
+ }
492
+ const now = Date.now();
493
+ await c.db.execute(`UPDATE dispatcher_queue SET status = 'inflight', started_at = ?,
494
+ finished_at = NULL, updated_at = ? WHERE message_id = ?`, now - Math.max(0, ageMs), now, messageId);
495
+ await reclaimStaleInflight(c);
496
+ startDispatchLoop(c, partition);
497
+ }
498
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/actors/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare const PENDING_RESERVATION_TTL_MS = 60000;
2
+ export declare const hookToken: import("rivetkit").ActorDefinition<unknown, unknown, unknown, unknown, unknown, import("rivetkit/db").DatabaseProvider<import("rivetkit/db").RawAccess>, Record<never, never>, Record<never, never>, {
3
+ reserve: (c: import("rivetkit").ActionContext<unknown, unknown, unknown, unknown, unknown, import("rivetkit/db").DatabaseProvider<import("rivetkit/db").RawAccess>, Record<never, never>, Record<never, never>>, token: string, runId: string, hookId: string) => Promise<{
4
+ ok: boolean;
5
+ generation: number;
6
+ runId?: undefined;
7
+ hookId?: undefined;
8
+ } | {
9
+ ok: boolean;
10
+ generation: number;
11
+ runId: string | undefined;
12
+ hookId: string | undefined;
13
+ }>;
14
+ confirm: (c: import("rivetkit").ActionContext<unknown, unknown, unknown, unknown, unknown, import("rivetkit/db").DatabaseProvider<import("rivetkit/db").RawAccess>, Record<never, never>, Record<never, never>>, token: string, generation: number, runId: string, hookId: string) => Promise<{
15
+ ok: boolean;
16
+ }>;
17
+ get: (c: import("rivetkit").ActionContext<unknown, unknown, unknown, unknown, unknown, import("rivetkit/db").DatabaseProvider<import("rivetkit/db").RawAccess>, Record<never, never>, Record<never, never>>, token: string) => Promise<{
18
+ runId: string;
19
+ hookId: string;
20
+ generation: number;
21
+ } | null>;
22
+ release: (c: import("rivetkit").ActionContext<unknown, unknown, unknown, unknown, unknown, import("rivetkit/db").DatabaseProvider<import("rivetkit/db").RawAccess>, Record<never, never>, Record<never, never>>, token: string, generation: number, runId: string, hookId?: string) => Promise<{
23
+ ok: boolean;
24
+ }>;
25
+ }>;
26
+ //# sourceMappingURL=hook-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-token.d.ts","sourceRoot":"","sources":["../../src/actors/hook-token.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,0BAA0B,QAAS,CAAC;AA+GjD,eAAO,MAAM,SAAS;4NAGM,MAAM,SAAS,MAAM,UAAU,MAAM;;;;;;;;;;;4NAmDvD,MAAM,cACD,MAAM,SACX,MAAM,UACL,MAAM;;;wNAuBO,MAAM;eAUJ,MAAM;gBACJ,MAAM;;;4NAMxB,MAAM,cACD,MAAM,SACX,MAAM,WACJ,MAAM;;;EAuBhB,CAAC"}