@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.
- package/.turbo/turbo-build.log +4 -0
- package/README.md +31 -0
- package/dist/actors/coordinator.d.ts +114 -0
- package/dist/actors/coordinator.d.ts.map +1 -0
- package/dist/actors/coordinator.js +232 -0
- package/dist/actors/coordinator.js.map +1 -0
- package/dist/actors/db.d.ts +8 -0
- package/dist/actors/db.d.ts.map +1 -0
- package/dist/actors/db.js +282 -0
- package/dist/actors/db.js.map +1 -0
- package/dist/actors/dispatcher.d.ts +84 -0
- package/dist/actors/dispatcher.d.ts.map +1 -0
- package/dist/actors/dispatcher.js +498 -0
- package/dist/actors/dispatcher.js.map +1 -0
- package/dist/actors/hook-token.d.ts +26 -0
- package/dist/actors/hook-token.d.ts.map +1 -0
- package/dist/actors/hook-token.js +151 -0
- package/dist/actors/hook-token.js.map +1 -0
- package/dist/actors/shared.d.ts +366 -0
- package/dist/actors/shared.d.ts.map +1 -0
- package/dist/actors/shared.js +112 -0
- package/dist/actors/shared.js.map +1 -0
- package/dist/actors/streams.d.ts +26 -0
- package/dist/actors/streams.d.ts.map +1 -0
- package/dist/actors/streams.js +127 -0
- package/dist/actors/streams.js.map +1 -0
- package/dist/actors/workflow-run.d.ts +891 -0
- package/dist/actors/workflow-run.d.ts.map +1 -0
- package/dist/actors/workflow-run.js +872 -0
- package/dist/actors/workflow-run.js.map +1 -0
- package/dist/actors.d.ts +2244 -0
- package/dist/actors.d.ts.map +1 -0
- package/dist/actors.js +16 -0
- package/dist/actors.js.map +1 -0
- package/dist/codec.d.ts +4 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +27 -0
- package/dist/codec.js.map +1 -0
- package/dist/index.d.ts +843 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +567 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime.d.ts +2 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +24 -0
- package/dist/runtime.js.map +1 -0
- package/package.json +51 -0
- package/scripts/conformance/run.ts +278 -0
- package/scripts/integration/run.ts +935 -0
- package/src/actors/coordinator.ts +360 -0
- package/src/actors/db.ts +291 -0
- package/src/actors/dispatcher.ts +787 -0
- package/src/actors/hook-token.ts +239 -0
- package/src/actors/shared.ts +153 -0
- package/src/actors/streams.ts +215 -0
- package/src/actors/workflow-run.ts +1477 -0
- package/src/actors.ts +18 -0
- package/src/codec.ts +28 -0
- package/src/index.ts +788 -0
- package/src/runtime.ts +29 -0
- package/tests/conformance.test.ts +8 -0
- package/tests/helpers/db.ts +62 -0
- package/tests/helpers/dispatcher-driver.ts +71 -0
- package/tests/helpers/harness.ts +161 -0
- package/tests/integration/crash-restart.test.ts +145 -0
- package/tests/integration/dispatcher-loop.test.ts +144 -0
- package/tests/integration/hook-token.test.ts +160 -0
- package/tests/integration/hooks.test.ts +123 -0
- package/tests/integration/streams.test.ts +178 -0
- package/tests/integration/workflow-events.test.ts +326 -0
- package/tests/setup.ts +10 -0
- package/tests/unit/codec.test.ts +73 -0
- package/tests/unit/coordinator-record.test.ts +177 -0
- package/tests/unit/db-migrations.test.ts +65 -0
- package/tests/unit/dispatcher-queue.test.ts +274 -0
- package/tests/unit/logging.test.ts +49 -0
- package/tests/unit/readiness.test.ts +102 -0
- package/tests/unit/transaction.test.ts +76 -0
- package/tsconfig.build.json +13 -0
- package/tsconfig.json +12 -0
- package/vitest.config.ts +32 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { event } from "rivetkit";
|
|
2
|
+
import { decodeValue, encodeValue } from "../codec.js";
|
|
3
|
+
import { withActorTransaction } from "./shared.js";
|
|
4
|
+
function envInteger(name, fallback, min) {
|
|
5
|
+
const value = Number(process.env[name]);
|
|
6
|
+
return Number.isFinite(value) ? Math.max(min, Math.floor(value)) : fallback;
|
|
7
|
+
}
|
|
8
|
+
export const STREAM_TTL_MS = envInteger("RIVET_WORLD_RIVET_STREAM_TTL_MS", 86_400_000, 0);
|
|
9
|
+
export const streamAppended = event();
|
|
10
|
+
function assertRunKey(c, runId) {
|
|
11
|
+
if (c.key[0] !== runId)
|
|
12
|
+
throw new Error("workflowRun actor key must match runId");
|
|
13
|
+
}
|
|
14
|
+
function decodeBase64Chunk(value) {
|
|
15
|
+
return new Uint8Array(Buffer.from(value, "base64"));
|
|
16
|
+
}
|
|
17
|
+
let broadcastCounter = 0;
|
|
18
|
+
function shouldDropBroadcast(eof) {
|
|
19
|
+
if (eof)
|
|
20
|
+
return false;
|
|
21
|
+
const rate = Number(process.env.RIVET_WORLD_RIVET_INJECT_BROADCAST_DROP_RATE);
|
|
22
|
+
if (!Number.isFinite(rate) || rate <= 0)
|
|
23
|
+
return false;
|
|
24
|
+
const r = Math.min(rate, 1);
|
|
25
|
+
const n = broadcastCounter++;
|
|
26
|
+
return Math.floor((n + 1) * r) > Math.floor(n * r);
|
|
27
|
+
}
|
|
28
|
+
async function injectReadDelay() {
|
|
29
|
+
const ms = Number(process.env.RIVET_WORLD_RIVET_INJECT_STREAM_READ_DELAY_MS);
|
|
30
|
+
if (Number.isFinite(ms) && ms > 0) {
|
|
31
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function cleanupExpired(c, streamId) {
|
|
35
|
+
if (STREAM_TTL_MS === 0)
|
|
36
|
+
return 0;
|
|
37
|
+
const expired = await c.db.execute(`SELECT 1 FROM stream_chunks WHERE stream_id = ? AND eof = 1
|
|
38
|
+
AND created_at <= ? LIMIT 1`, streamId, Date.now() - STREAM_TTL_MS);
|
|
39
|
+
if (expired.length === 0)
|
|
40
|
+
return 0;
|
|
41
|
+
return (await c.db.execute("DELETE FROM stream_chunks WHERE stream_id = ? RETURNING sequence", streamId)).length;
|
|
42
|
+
}
|
|
43
|
+
export async function writeStream(c, streamId, runId, chunkBase64, eof) {
|
|
44
|
+
assertRunKey(c, runId);
|
|
45
|
+
await cleanupExpired(c, streamId);
|
|
46
|
+
const result = await withActorTransaction(c, async (tx) => {
|
|
47
|
+
const closed = await tx.db.execute("SELECT sequence FROM stream_chunks WHERE stream_id = ? AND eof = 1 LIMIT 1", streamId);
|
|
48
|
+
if (closed[0]) {
|
|
49
|
+
if (eof)
|
|
50
|
+
return { sequence: Number(closed[0].sequence), inserted: false };
|
|
51
|
+
throw new Error(`stream "${streamId}" is already closed`);
|
|
52
|
+
}
|
|
53
|
+
const next = await tx.db.execute("SELECT COALESCE(MAX(sequence), -1) + 1 AS sequence FROM stream_chunks WHERE stream_id = ?", streamId);
|
|
54
|
+
const value = Number(next[0]?.sequence ?? 0);
|
|
55
|
+
await tx.db.execute(`INSERT INTO stream_chunks (stream_id, sequence, chunk_data, eof, created_at)
|
|
56
|
+
VALUES (?, ?, ?, ?, ?)`, streamId, value, encodeValue(decodeBase64Chunk(chunkBase64)), eof ? 1 : 0, Date.now());
|
|
57
|
+
await tx.db.execute("INSERT OR IGNORE INTO run_streams (stream_id) VALUES (?)", streamId);
|
|
58
|
+
return { sequence: value, inserted: true };
|
|
59
|
+
});
|
|
60
|
+
const chunkId = String(result.sequence);
|
|
61
|
+
if (result.inserted && !shouldDropBroadcast(eof)) {
|
|
62
|
+
c.broadcast("streamAppended", { streamId, runId, chunkId, eof });
|
|
63
|
+
}
|
|
64
|
+
return { chunkId };
|
|
65
|
+
}
|
|
66
|
+
export async function getStreamChunks(c, streamId, runId, startIndex = 0, limit = 100) {
|
|
67
|
+
assertRunKey(c, runId);
|
|
68
|
+
await cleanupExpired(c, streamId);
|
|
69
|
+
const rows = await c.db.execute(`SELECT sequence, chunk_data FROM stream_chunks
|
|
70
|
+
WHERE stream_id = ? AND eof = 0 AND sequence >= ?
|
|
71
|
+
ORDER BY sequence ASC LIMIT ?`, streamId, startIndex, limit + 1);
|
|
72
|
+
const hasMore = rows.length > limit;
|
|
73
|
+
const values = rows.slice(0, limit);
|
|
74
|
+
const data = values.map((row) => ({
|
|
75
|
+
index: Number(row.sequence),
|
|
76
|
+
data: decodeValue(row.chunk_data) ?? new Uint8Array(),
|
|
77
|
+
}));
|
|
78
|
+
const closed = await c.db.execute("SELECT 1 FROM stream_chunks WHERE stream_id = ? AND eof = 1 LIMIT 1", streamId);
|
|
79
|
+
await injectReadDelay();
|
|
80
|
+
const nextSequence = values.length
|
|
81
|
+
? Number(values.at(-1)?.sequence) + 1
|
|
82
|
+
: startIndex;
|
|
83
|
+
return {
|
|
84
|
+
data,
|
|
85
|
+
cursor: hasMore
|
|
86
|
+
? Buffer.from(JSON.stringify({ i: nextSequence })).toString("base64")
|
|
87
|
+
: null,
|
|
88
|
+
hasMore,
|
|
89
|
+
done: !hasMore && closed.length > 0,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export async function getStreamInfo(c, streamId, runId) {
|
|
93
|
+
assertRunKey(c, runId);
|
|
94
|
+
await cleanupExpired(c, streamId);
|
|
95
|
+
const row = (await c.db.execute(`SELECT SUM(CASE WHEN eof = 0 THEN 1 ELSE 0 END) AS chunk_count,
|
|
96
|
+
MAX(eof) AS done FROM stream_chunks WHERE stream_id = ?`, streamId))[0];
|
|
97
|
+
const count = Number(row?.chunk_count ?? 0);
|
|
98
|
+
return { tailIndex: count - 1, done: Number(row?.done ?? 0) === 1 };
|
|
99
|
+
}
|
|
100
|
+
export async function listStreams(c, runId) {
|
|
101
|
+
assertRunKey(c, runId);
|
|
102
|
+
return (await c.db.execute(`SELECT r.stream_id FROM run_streams r
|
|
103
|
+
WHERE EXISTS (SELECT 1 FROM stream_chunks c WHERE c.stream_id = r.stream_id)
|
|
104
|
+
ORDER BY r.stream_id`)).map((row) => String(row.stream_id));
|
|
105
|
+
}
|
|
106
|
+
export async function cleanupExpiredStreams(c) {
|
|
107
|
+
if (STREAM_TTL_MS === 0)
|
|
108
|
+
return;
|
|
109
|
+
const cutoff = Date.now() - STREAM_TTL_MS;
|
|
110
|
+
const streams = await c.db.execute(`SELECT DISTINCT stream_id FROM stream_chunks
|
|
111
|
+
WHERE eof = 1 AND created_at <= ?
|
|
112
|
+
ORDER BY stream_id LIMIT 32`, cutoff);
|
|
113
|
+
for (const row of streams) {
|
|
114
|
+
const streamId = String(row.stream_id);
|
|
115
|
+
await c.db.execute("DELETE FROM stream_chunks WHERE stream_id = ?", streamId);
|
|
116
|
+
await c.db.execute("DELETE FROM run_streams WHERE stream_id = ?", streamId);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export async function expireClosedStreamForTesting(c, streamId, runId) {
|
|
120
|
+
assertRunKey(c, runId);
|
|
121
|
+
if (process.env.RIVET_WORLD_RIVET_TESTING !== "1") {
|
|
122
|
+
throw new Error("expireClosedForTesting requires test mode");
|
|
123
|
+
}
|
|
124
|
+
await c.db.execute("UPDATE stream_chunks SET created_at = ? WHERE stream_id = ? AND eof = 1", Date.now() - STREAM_TTL_MS - 1_000, streamId);
|
|
125
|
+
return { deletedChunks: await cleanupExpired(c, streamId) };
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=streams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../../src/actors/streams.ts"],"names":[],"mappings":"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"}
|