Skip to content

Commit b084261

Browse files
committed
feat: US-019 - Make platform fixtures match public docs code
1 parent 175942b commit b084261

7 files changed

Lines changed: 196 additions & 383 deletions

File tree

rivetkit-typescript/packages/rivetkit/tests/platforms/CLAUDE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- Generated platform apps should import `actor`, `setup`, and `@rivetkit/rivetkit-wasm` through public package exports.
66
- Keep shared helpers for process setup, temporary files, ports, and assertions, not for hiding the public RivetKit runtime API.
77
- Cloudflare Workers, Supabase Functions, and Deno fixtures should share the same docs-shaped SQLite counter actor source with only platform bootstrapping differences.
8+
- Use `buildPlatformSqliteCounterRegistrySource(...)` when generated apps need the shared docs-shaped SQLite counter registry.
89
- Do not use hidden globals, lower-level registry builders, private generated wasm paths, or repo-local `pkg*` imports in platform app code.
910
- Raw `ctx.sql` platform fixtures still need a `db` provider so runtime SQLite is enabled.
1011
- Cloudflare Workers fixtures need a fetch-upgrade `WebSocket` shim for wasm envoy connections.

rivetkit-typescript/packages/rivetkit/tests/platforms/cloudflare-workers.test.ts

Lines changed: 9 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { fileURLToPath } from "node:url";
44
import getPort from "get-port";
55
import { describe, expect, test } from "vitest";
66
import {
7+
buildPlatformSqliteCounterRegistrySource,
78
createPlatformServerlessRunner,
89
createPlatformSqliteCounterClient,
910
createTempPlatformApp,
@@ -75,18 +76,14 @@ RIVET_POOL = "${runnerName}"
7576
RIVET_TOKEN = "${token}"
7677
`,
7778
);
79+
app.writeFile(
80+
"src/registry.ts",
81+
buildPlatformSqliteCounterRegistrySource("cloudflare-module-import"),
82+
);
7883
app.writeFile(
7984
"src/index.ts",
8085
`
81-
import { actor, setup } from "rivetkit";
82-
import * as wasmBindings from "@rivetkit/rivetkit-wasm";
83-
import wasmModule from "@rivetkit/rivetkit-wasm/rivetkit_wasm_bg.wasm";
84-
85-
interface SqliteDatabase {
86-
run(sql: string, params?: unknown[]): Promise<void>;
87-
query(sql: string, params?: unknown[]): Promise<{ rows: unknown[][] }>;
88-
writeMode<T>(callback: () => Promise<T>): Promise<T>;
89-
}
86+
import { createRegistry } from "./registry";
9087
9188
interface Env {
9289
RIVET_ENDPOINT: string;
@@ -181,127 +178,14 @@ class FetchWebSocket {
181178
(globalThis as unknown as { WebSocket: typeof WebSocket }).WebSocket =
182179
FetchWebSocket as unknown as typeof WebSocket;
183180
184-
const COUNTER_ID = 1;
185-
186-
const rawSqlDatabaseProvider = {
187-
createClient: async () => ({
188-
execute: async () => [],
189-
close: async () => {},
190-
}),
191-
onMigrate: async () => {},
192-
};
193-
194-
async function ensureCounterTable(db: SqliteDatabase) {
195-
await db.writeMode(async () => {
196-
await db.run(
197-
"CREATE TABLE IF NOT EXISTS platform_counter (id INTEGER PRIMARY KEY CHECK (id = 1), count INTEGER NOT NULL)",
198-
);
199-
});
200-
}
201-
202-
async function ensureLifecycleTable(db: SqliteDatabase) {
203-
await db.writeMode(async () => {
204-
await db.run(
205-
"CREATE TABLE IF NOT EXISTS platform_counter_lifecycle (event TEXT PRIMARY KEY, count INTEGER NOT NULL)",
206-
);
207-
});
208-
}
209-
210-
async function recordLifecycleEvent(db: SqliteDatabase, event: string) {
211-
await ensureLifecycleTable(db);
212-
await db.writeMode(async () => {
213-
await db.run(
214-
"INSERT INTO platform_counter_lifecycle (event, count) VALUES (?, 1) ON CONFLICT(event) DO UPDATE SET count = count + 1",
215-
[event],
216-
);
217-
});
218-
}
219-
220-
async function readCounter(db: SqliteDatabase): Promise<number> {
221-
const result = await db.query(
222-
"SELECT count FROM platform_counter WHERE id = ?",
223-
[COUNTER_ID],
224-
);
225-
226-
return Number(result.rows[0]?.[0] ?? 0);
227-
}
228-
229-
async function readLifecycleCounts(db: SqliteDatabase): Promise<{
230-
wakeCount: number;
231-
sleepCount: number;
232-
}> {
233-
await ensureLifecycleTable(db);
234-
const result = await db.query(
235-
"SELECT event, count FROM platform_counter_lifecycle",
236-
);
237-
const counts = new Map(
238-
result.rows.map((row) => [String(row[0]), Number(row[1])]),
239-
);
240-
241-
return {
242-
wakeCount: counts.get("wake") ?? 0,
243-
sleepCount: counts.get("sleep") ?? 0,
244-
};
245-
}
246-
247-
const sqliteCounter = actor({
248-
db: rawSqlDatabaseProvider,
249-
onWake: async (ctx) => {
250-
await recordLifecycleEvent(ctx.sql as SqliteDatabase, "wake");
251-
},
252-
onSleep: async (ctx) => {
253-
await recordLifecycleEvent(ctx.sql as SqliteDatabase, "sleep");
254-
},
255-
actions: {
256-
increment: async (ctx, amount = 1) => {
257-
const db = ctx.sql as SqliteDatabase;
258-
await ensureCounterTable(db);
259-
await db.writeMode(async () => {
260-
await db.run(
261-
"INSERT INTO platform_counter (id, count) VALUES (?, ?) ON CONFLICT(id) DO UPDATE SET count = count + excluded.count",
262-
[COUNTER_ID, amount],
263-
);
264-
});
265-
266-
return await readCounter(db);
267-
},
268-
getCount: async (ctx) => {
269-
const db = ctx.sql as SqliteDatabase;
270-
await ensureCounterTable(db);
271-
272-
return await readCounter(db);
273-
},
274-
getLifecycleCounts: async (ctx) => {
275-
return await readLifecycleCounts(ctx.sql as SqliteDatabase);
276-
},
277-
triggerSleep: (ctx) => {
278-
ctx.sleep();
279-
},
280-
},
281-
options: {
282-
sleepTimeout: 100,
283-
},
284-
});
285-
286-
const use = { sqliteCounter };
287-
let registry: { handler(request: Request): Promise<Response> } | undefined;
181+
let registry: ReturnType<typeof createRegistry> | undefined;
288182
289183
function getRegistry(env: Env) {
290-
registry ??= setup({
291-
runtime: "wasm",
292-
sqlite: "remote",
293-
wasm: {
294-
bindings: wasmBindings,
295-
initInput: wasmModule,
296-
},
297-
use,
184+
registry ??= createRegistry({
298185
endpoint: env.RIVET_ENDPOINT,
299186
namespace: env.RIVET_NAMESPACE,
300187
token: env.RIVET_TOKEN,
301-
envoy: {
302-
poolName: env.RIVET_POOL,
303-
},
304-
noWelcome: true,
188+
runnerName: env.RIVET_POOL,
305189
});
306190
307191
return registry;

rivetkit-typescript/packages/rivetkit/tests/platforms/deno.test.ts

Lines changed: 8 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { fileURLToPath } from "node:url";
44
import getPort from "get-port";
55
import { describe, expect, test } from "vitest";
66
import {
7+
buildPlatformSqliteCounterRegistrySource,
78
createPlatformServerlessRunner,
89
createPlatformSqliteCounterClient,
910
createTempPlatformApp,
@@ -57,138 +58,20 @@ function writeDenoApp(
5758
2,
5859
),
5960
);
61+
app.writeFile(
62+
"src/registry.ts",
63+
buildPlatformSqliteCounterRegistrySource("deno-read-file"),
64+
);
6065
app.writeFile(
6166
"src/index.ts",
6267
`
63-
import { actor, setup } from "rivetkit";
64-
import * as wasmBindings from "@rivetkit/rivetkit-wasm";
65-
66-
interface SqliteDatabase {
67-
run(sql: string, params?: unknown[]): Promise<void>;
68-
query(sql: string, params?: unknown[]): Promise<{ rows: unknown[][] }>;
69-
writeMode<T>(callback: () => Promise<T>): Promise<T>;
70-
}
71-
72-
const COUNTER_ID = 1;
73-
const wasmModule = await Deno.readFile(
74-
new URL(import.meta.resolve("@rivetkit/rivetkit-wasm/rivetkit_wasm_bg.wasm")),
75-
);
76-
77-
const rawSqlDatabaseProvider = {
78-
createClient: async () => ({
79-
execute: async () => [],
80-
close: async () => {},
81-
}),
82-
onMigrate: async () => {},
83-
};
84-
85-
async function ensureCounterTable(db: SqliteDatabase) {
86-
await db.writeMode(async () => {
87-
await db.run(
88-
"CREATE TABLE IF NOT EXISTS platform_counter (id INTEGER PRIMARY KEY CHECK (id = 1), count INTEGER NOT NULL)",
89-
);
90-
});
91-
}
92-
93-
async function ensureLifecycleTable(db: SqliteDatabase) {
94-
await db.writeMode(async () => {
95-
await db.run(
96-
"CREATE TABLE IF NOT EXISTS platform_counter_lifecycle (event TEXT PRIMARY KEY, count INTEGER NOT NULL)",
97-
);
98-
});
99-
}
100-
101-
async function recordLifecycleEvent(db: SqliteDatabase, event: string) {
102-
await ensureLifecycleTable(db);
103-
await db.writeMode(async () => {
104-
await db.run(
105-
"INSERT INTO platform_counter_lifecycle (event, count) VALUES (?, 1) ON CONFLICT(event) DO UPDATE SET count = count + 1",
106-
[event],
107-
);
108-
});
109-
}
110-
111-
async function readCounter(db: SqliteDatabase): Promise<number> {
112-
const result = await db.query(
113-
"SELECT count FROM platform_counter WHERE id = ?",
114-
[COUNTER_ID],
115-
);
116-
117-
return Number(result.rows[0]?.[0] ?? 0);
118-
}
68+
import { createRegistry } from "./registry.ts";
11969
120-
async function readLifecycleCounts(db: SqliteDatabase): Promise<{
121-
wakeCount: number;
122-
sleepCount: number;
123-
}> {
124-
await ensureLifecycleTable(db);
125-
const result = await db.query(
126-
"SELECT event, count FROM platform_counter_lifecycle",
127-
);
128-
const counts = new Map(
129-
result.rows.map((row) => [String(row[0]), Number(row[1])]),
130-
);
131-
132-
return {
133-
wakeCount: counts.get("wake") ?? 0,
134-
sleepCount: counts.get("sleep") ?? 0,
135-
};
136-
}
137-
138-
const sqliteCounter = actor({
139-
db: rawSqlDatabaseProvider,
140-
onWake: async (ctx) => {
141-
await recordLifecycleEvent(ctx.sql as SqliteDatabase, "wake");
142-
},
143-
onSleep: async (ctx) => {
144-
await recordLifecycleEvent(ctx.sql as SqliteDatabase, "sleep");
145-
},
146-
actions: {
147-
increment: async (ctx, amount = 1) => {
148-
const db = ctx.sql as SqliteDatabase;
149-
await ensureCounterTable(db);
150-
await db.writeMode(async () => {
151-
await db.run(
152-
"INSERT INTO platform_counter (id, count) VALUES (?, ?) ON CONFLICT(id) DO UPDATE SET count = count + excluded.count",
153-
[COUNTER_ID, amount],
154-
);
155-
});
156-
157-
return await readCounter(db);
158-
},
159-
getCount: async (ctx) => {
160-
const db = ctx.sql as SqliteDatabase;
161-
await ensureCounterTable(db);
162-
163-
return await readCounter(db);
164-
},
165-
getLifecycleCounts: async (ctx) => {
166-
return await readLifecycleCounts(ctx.sql as SqliteDatabase);
167-
},
168-
triggerSleep: (ctx) => {
169-
ctx.sleep();
170-
},
171-
},
172-
options: {
173-
sleepTimeout: 100,
174-
},
175-
});
176-
177-
const registry = setup({
178-
runtime: "wasm",
179-
sqlite: "remote",
180-
wasm: {
181-
bindings: wasmBindings,
182-
initInput: wasmModule,
183-
},
184-
use: { sqliteCounter },
70+
const registry = createRegistry({
18571
endpoint: "${endpoint}",
18672
namespace: "${namespace}",
18773
token: "${token}",
188-
envoy: {
189-
poolName: "${runnerName}",
190-
},
191-
noWelcome: true,
74+
runnerName: "${runnerName}",
19275
});
19376
19477
Deno.serve(

0 commit comments

Comments
 (0)