@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,282 @@
1
+ import { db } from "rivetkit/db";
2
+ import { migrations, } from "rivetkit/unstable/migrations";
3
+ const bootstrapWorkflowDb = async (database) => {
4
+ await database.execute(`
5
+ CREATE TABLE IF NOT EXISTS workflow_runs (
6
+ run_id TEXT PRIMARY KEY,
7
+ run_revision INTEGER NOT NULL DEFAULT 0,
8
+ status TEXT NOT NULL,
9
+ deployment_id TEXT NOT NULL,
10
+ workflow_name TEXT NOT NULL,
11
+ spec_version INTEGER,
12
+ execution_context BLOB,
13
+ attributes BLOB,
14
+ input BLOB,
15
+ output BLOB,
16
+ error BLOB,
17
+ expired_at INTEGER,
18
+ started_at INTEGER,
19
+ completed_at INTEGER,
20
+ created_at INTEGER NOT NULL,
21
+ updated_at INTEGER NOT NULL
22
+ )
23
+ `);
24
+ await database.execute(`
25
+ CREATE TABLE IF NOT EXISTS workflow_events (
26
+ event_id TEXT PRIMARY KEY,
27
+ run_id TEXT NOT NULL,
28
+ event_type TEXT NOT NULL,
29
+ correlation_id TEXT,
30
+ event_data BLOB,
31
+ spec_version INTEGER,
32
+ created_at INTEGER NOT NULL
33
+ )
34
+ `);
35
+ await database.execute(`
36
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_events_create_step
37
+ ON workflow_events(correlation_id)
38
+ WHERE event_type = 'step_created'
39
+ `);
40
+ await database.execute(`
41
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_events_create_hook
42
+ ON workflow_events(correlation_id)
43
+ WHERE event_type = 'hook_created'
44
+ `);
45
+ await database.execute(`
46
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_events_create_wait
47
+ ON workflow_events(correlation_id)
48
+ WHERE event_type = 'wait_created'
49
+ `);
50
+ // Creation-event dedup (SPEC §3.2). IMPORTANT: every index here is scoped to a
51
+ // SINGLE workflowRun actor's own `c.db` — there is one `workflow_events` table
52
+ // per run. `uq_events_create_run` enforces "one run_created per database",
53
+ // which is correct ONLY because each run owns its database. Do NOT move these
54
+ // tables into a shared/global database without re-scoping these indexes by
55
+ // `run_id`, or the run-singleton guarantee silently collapses.
56
+ await database.execute(`
57
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_events_create_run
58
+ ON workflow_events(event_type)
59
+ WHERE event_type = 'run_created'
60
+ `);
61
+ await database.execute(`
62
+ CREATE TABLE IF NOT EXISTS workflow_steps (
63
+ step_id TEXT PRIMARY KEY,
64
+ run_id TEXT NOT NULL,
65
+ step_name TEXT NOT NULL,
66
+ status TEXT NOT NULL,
67
+ input BLOB,
68
+ output BLOB,
69
+ error BLOB,
70
+ attempt INTEGER NOT NULL,
71
+ started_at INTEGER,
72
+ completed_at INTEGER,
73
+ created_at INTEGER NOT NULL,
74
+ updated_at INTEGER NOT NULL,
75
+ retry_after INTEGER,
76
+ spec_version INTEGER
77
+ )
78
+ `);
79
+ await database.execute(`
80
+ CREATE TABLE IF NOT EXISTS workflow_hooks (
81
+ hook_id TEXT PRIMARY KEY,
82
+ run_id TEXT NOT NULL,
83
+ token TEXT NOT NULL,
84
+ token_generation INTEGER,
85
+ owner_id TEXT NOT NULL,
86
+ project_id TEXT NOT NULL,
87
+ environment TEXT NOT NULL,
88
+ metadata BLOB,
89
+ created_at INTEGER NOT NULL,
90
+ spec_version INTEGER,
91
+ is_webhook INTEGER
92
+ )
93
+ `);
94
+ await database.execute(`
95
+ CREATE INDEX IF NOT EXISTS idx_workflow_hooks_token
96
+ ON workflow_hooks(token)
97
+ `);
98
+ await database.execute(`
99
+ CREATE TABLE IF NOT EXISTS workflow_waits (
100
+ wait_id TEXT PRIMARY KEY,
101
+ run_id TEXT NOT NULL,
102
+ status TEXT NOT NULL,
103
+ resume_at INTEGER,
104
+ runtime_url TEXT,
105
+ queue_name TEXT,
106
+ headers TEXT,
107
+ resume_enqueued_at INTEGER,
108
+ completed_at INTEGER,
109
+ created_at INTEGER NOT NULL,
110
+ updated_at INTEGER NOT NULL,
111
+ spec_version INTEGER
112
+ )
113
+ `);
114
+ await database.execute(`
115
+ CREATE INDEX IF NOT EXISTS idx_workflow_waits_due
116
+ ON workflow_waits(status, resume_at)
117
+ `);
118
+ await database.execute(`
119
+ CREATE INDEX IF NOT EXISTS idx_workflow_events_correlation
120
+ ON workflow_events(correlation_id, event_id)
121
+ `);
122
+ await database.execute(`
123
+ CREATE TABLE IF NOT EXISTS dispatcher_queue (
124
+ message_id TEXT PRIMARY KEY,
125
+ queue_name TEXT NOT NULL,
126
+ route TEXT NOT NULL,
127
+ runtime_url TEXT NOT NULL,
128
+ body TEXT NOT NULL,
129
+ headers TEXT,
130
+ idem_key TEXT,
131
+ status TEXT NOT NULL,
132
+ attempt INTEGER NOT NULL DEFAULT 0,
133
+ next_at INTEGER NOT NULL,
134
+ created_at INTEGER NOT NULL,
135
+ updated_at INTEGER NOT NULL,
136
+ started_at INTEGER,
137
+ finished_at INTEGER,
138
+ http_status INTEGER,
139
+ error TEXT
140
+ )
141
+ `);
142
+ await database.execute(`
143
+ CREATE INDEX IF NOT EXISTS idx_dispatcher_queue_ready
144
+ ON dispatcher_queue(status, next_at, created_at)
145
+ `);
146
+ await database.execute(`
147
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_dispatcher_queue_idem
148
+ ON dispatcher_queue(idem_key) WHERE idem_key IS NOT NULL
149
+ `);
150
+ await database.execute(`
151
+ CREATE TABLE IF NOT EXISTS stream_chunks (
152
+ stream_id TEXT NOT NULL,
153
+ sequence INTEGER NOT NULL,
154
+ chunk_data BLOB,
155
+ eof INTEGER NOT NULL,
156
+ created_at INTEGER NOT NULL,
157
+ PRIMARY KEY (stream_id, sequence)
158
+ )
159
+ `);
160
+ await database.execute(`
161
+ CREATE INDEX IF NOT EXISTS idx_stream_chunks_stream
162
+ ON stream_chunks(stream_id, sequence)
163
+ `);
164
+ await database.execute(`
165
+ CREATE TABLE IF NOT EXISTS run_streams (
166
+ stream_id TEXT PRIMARY KEY
167
+ )
168
+ `);
169
+ await database.execute(`
170
+ CREATE TABLE IF NOT EXISTS pending_ops (
171
+ op_id TEXT PRIMARY KEY,
172
+ op_type TEXT NOT NULL,
173
+ payload BLOB NOT NULL,
174
+ operation_revision INTEGER NOT NULL,
175
+ status TEXT NOT NULL CHECK (status IN ('ready', 'inflight')),
176
+ claim_id TEXT,
177
+ next_at INTEGER NOT NULL,
178
+ attempt INTEGER NOT NULL DEFAULT 0,
179
+ created_at INTEGER NOT NULL,
180
+ updated_at INTEGER NOT NULL
181
+ )
182
+ `);
183
+ await database.execute(`
184
+ CREATE INDEX IF NOT EXISTS idx_pending_ops_due
185
+ ON pending_ops(status, next_at, created_at)
186
+ `);
187
+ };
188
+ const bootstrapCoordinatorDb = async (database) => {
189
+ await database.execute(`
190
+ CREATE TABLE IF NOT EXISTS runs_index (
191
+ run_id TEXT PRIMARY KEY,
192
+ run_revision INTEGER NOT NULL,
193
+ status TEXT NOT NULL,
194
+ deployment_id TEXT NOT NULL,
195
+ workflow_name TEXT NOT NULL,
196
+ spec_version INTEGER,
197
+ execution_context BLOB,
198
+ attributes BLOB,
199
+ input BLOB,
200
+ output BLOB,
201
+ error BLOB,
202
+ expired_at INTEGER,
203
+ started_at INTEGER,
204
+ completed_at INTEGER,
205
+ created_at INTEGER NOT NULL,
206
+ updated_at INTEGER NOT NULL
207
+ )
208
+ `);
209
+ await database.execute(`
210
+ CREATE INDEX IF NOT EXISTS runs_index_list
211
+ ON runs_index(created_at DESC, run_id DESC)
212
+ `);
213
+ await database.execute(`
214
+ CREATE INDEX IF NOT EXISTS runs_index_name_list
215
+ ON runs_index(workflow_name, created_at DESC, run_id DESC)
216
+ `);
217
+ await database.execute(`
218
+ CREATE INDEX IF NOT EXISTS runs_index_status_list
219
+ ON runs_index(status, created_at DESC, run_id DESC)
220
+ `);
221
+ await database.execute(`
222
+ CREATE INDEX IF NOT EXISTS runs_index_name_status_list
223
+ ON runs_index(workflow_name, status, created_at DESC, run_id DESC)
224
+ `);
225
+ await database.execute(`
226
+ CREATE TABLE IF NOT EXISTS correlation_index (
227
+ correlation_id TEXT PRIMARY KEY,
228
+ run_id TEXT NOT NULL,
229
+ kind TEXT NOT NULL CHECK (kind IN ('step', 'hook', 'wait')),
230
+ run_revision INTEGER NOT NULL,
231
+ status TEXT NOT NULL CHECK (status IN ('active', 'deleted'))
232
+ )
233
+ `);
234
+ await database.execute(`
235
+ CREATE TABLE IF NOT EXISTS hooks_index (
236
+ hook_id TEXT PRIMARY KEY,
237
+ run_id TEXT NOT NULL,
238
+ run_revision INTEGER NOT NULL,
239
+ token TEXT NOT NULL,
240
+ status TEXT NOT NULL CHECK (status IN ('active', 'deleted')),
241
+ created_at INTEGER NOT NULL,
242
+ updated_at INTEGER NOT NULL
243
+ )
244
+ `);
245
+ await database.execute(`
246
+ CREATE INDEX IF NOT EXISTS hooks_index_list
247
+ ON hooks_index(status, created_at DESC, hook_id DESC)
248
+ `);
249
+ };
250
+ const bootstrapHookTokenDb = async (database) => {
251
+ await database.execute(`
252
+ CREATE TABLE IF NOT EXISTS hook_token_state (
253
+ singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
254
+ generation INTEGER NOT NULL,
255
+ run_id TEXT,
256
+ hook_id TEXT,
257
+ status TEXT NOT NULL CHECK (status IN ('empty', 'pending', 'confirmed')),
258
+ created_at INTEGER,
259
+ updated_at INTEGER NOT NULL,
260
+ expires_at INTEGER
261
+ )
262
+ `);
263
+ await database.execute(`INSERT OR IGNORE INTO hook_token_state (
264
+ singleton, generation, status, updated_at
265
+ ) VALUES (1, 0, 'empty', ?)`, Date.now());
266
+ };
267
+ export const migrateWorkflowDb = migrations({
268
+ tableName: "vercel_world_workflow_schema_version",
269
+ migrations: [{ version: 1, up: bootstrapWorkflowDb }],
270
+ });
271
+ export const migrateCoordinatorDb = migrations({
272
+ tableName: "vercel_world_coordinator_schema_version",
273
+ migrations: [{ version: 1, up: bootstrapCoordinatorDb }],
274
+ });
275
+ export const migrateHookTokenDb = migrations({
276
+ tableName: "vercel_world_hook_token_schema_version",
277
+ migrations: [{ version: 1, up: bootstrapHookTokenDb }],
278
+ });
279
+ export const workflowDb = db({ onMigrate: migrateWorkflowDb });
280
+ export const coordinatorDb = db({ onMigrate: migrateCoordinatorDb });
281
+ export const hookTokenDb = db({ onMigrate: migrateHookTokenDb });
282
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/actors/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type { Ctx } from "./shared.js";
2
+ type DispatchRow = {
3
+ message_id: string;
4
+ queue_name: string;
5
+ route: "flow" | "step";
6
+ runtime_url: string;
7
+ body: string;
8
+ headers: Record<string, string>;
9
+ attempt: number;
10
+ };
11
+ type QueueSnapshotRow = {
12
+ messageId: string;
13
+ queueName: string;
14
+ route: string;
15
+ status: string;
16
+ attempt: number;
17
+ nextAt: number;
18
+ startedAt: number | null;
19
+ finishedAt: number | null;
20
+ httpStatus: number | null;
21
+ error: string | null;
22
+ };
23
+ export type DispatcherVars = {
24
+ /** Per-actor-instance latch: at most one drain loop runs at a time. */
25
+ draining: boolean;
26
+ /** Monotonic signal used to close the enqueue-vs-idle lost-wakeup window. */
27
+ requestedGeneration: number;
28
+ /** Resolves when newly committed work should wake the active drain loop. */
29
+ drainSignal: DispatchSignal;
30
+ /** Message IDs currently being delivered by this actor process. */
31
+ activeMessageIds: Set<string>;
32
+ /** Earliest currently-armed `wake` schedule (ms epoch), or null if none. */
33
+ wakeArmedAt: number | null;
34
+ /** Serializes mutating actor actions with scheduled wake delivery. */
35
+ serialTail: Promise<void>;
36
+ };
37
+ type DispatchSignal = {
38
+ promise: Promise<void>;
39
+ resolve: () => void;
40
+ };
41
+ export type DispatchContext = Ctx & {
42
+ key: readonly string[];
43
+ vars: DispatcherVars;
44
+ keepAwake<T>(promise: Promise<T>): Promise<T>;
45
+ schedule: {
46
+ after(delayMs: number, actionName: string, ...args: unknown[]): Promise<unknown>;
47
+ at(timestampMs: number, actionName: string, ...args: unknown[]): Promise<unknown>;
48
+ };
49
+ armNextWake?: () => Promise<void>;
50
+ };
51
+ export declare const STALE_INFLIGHT_MS: number;
52
+ /**
53
+ * Structured, single-line JSON logging gated behind RIVET_WORLD_RIVET_DEBUG. A
54
+ * trace id (message id, falling back to partition/run id) ties together all log
55
+ * lines for one dispatch so a run can be followed end to end. Sensitive keys are
56
+ * redacted so the `.well-known` bearer secret can never be logged.
57
+ */
58
+ export declare function debugLog(event: string, data?: Record<string, unknown>): void;
59
+ export declare function claimNextDispatch(c: Ctx): Promise<DispatchRow | null>;
60
+ export declare function reclaimStaleInflight(c: Ctx, locallyActiveMessageIds?: ReadonlySet<string>): Promise<void>;
61
+ export declare function nextDispatchAt(c: Ctx): Promise<number | null>;
62
+ export declare function nextInflightRecoveryAt(c: Ctx, locallyActiveMessageIds?: ReadonlySet<string>): Promise<number | null>;
63
+ export declare function markDispatchDone(c: Ctx, messageId: string, attempt: number, status: number): Promise<void>;
64
+ export declare function rescheduleDispatch(c: Ctx, messageId: string, attempt: number, delayMs: number, status: number | null, error: string | null): Promise<void>;
65
+ export declare function failDispatch(c: Ctx, messageId: string, attempt: number, status: number | null, error: string): Promise<void>;
66
+ export declare function inspectQueue(c: Ctx): Promise<{
67
+ counts: Record<string, number>;
68
+ rows: QueueSnapshotRow[];
69
+ maxAttempts: number;
70
+ retryDelayMs: number;
71
+ staleInflightMs: number;
72
+ }>;
73
+ export declare function drainDispatchQueue(c: DispatchContext, partition: string): Promise<void>;
74
+ export declare function startDispatchLoop(c: DispatchContext, partition: string): void;
75
+ export declare const createDispatcherVars: () => DispatcherVars;
76
+ export declare function insertDispatch(c: Ctx, messageId: string, queueName: string, runtimeUrl: string, body: string, headers?: Record<string, string>, delaySeconds?: number, idempotencyKey?: string): Promise<{
77
+ messageId: string;
78
+ }>;
79
+ export declare function enqueueDispatch(c: DispatchContext, partition: string, messageId: string, queueName: string, runtimeUrl: string, body: string, headers?: Record<string, string>, delaySeconds?: number, idempotencyKey?: string): Promise<{
80
+ messageId: string;
81
+ }>;
82
+ export declare function forceStaleInflightForTesting(c: DispatchContext, partition: string, messageId: string, ageMs?: number): Promise<void>;
83
+ export {};
84
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/actors/dispatcher.ts"],"names":[],"mappings":"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"}