Skip to content
This repository was archived by the owner on Oct 22, 2025. It is now read-only.

Commit a531feb

Browse files
committed
fix: fix serverless config req, handle serverless sse close (#1368)
1 parent e7eb14a commit a531feb

File tree

5 files changed

+60
-7
lines changed

5 files changed

+60
-7
lines changed

examples/smoke-test/scripts/connect.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,24 @@ async function main() {
1515
await new Promise((resolve) => setTimeout(resolve, 1000));
1616
}
1717

18-
await new Promise((resolve) => setTimeout(resolve, 10000));
18+
await new Promise((resolve) => setTimeout(resolve, 2000));
1919
await counter.dispose();
20+
21+
await new Promise((resolve) => setTimeout(resolve, 200));
22+
23+
const counter2 = client.counter.getOrCreate().connect();
24+
25+
counter2.on("newCount", (count: number) => console.log("Event:", count));
26+
27+
for (let i = 0; i < 5; i++) {
28+
const out = await counter2.increment(5);
29+
console.log("RPC:", out);
30+
31+
await new Promise((resolve) => setTimeout(resolve, 1000));
32+
}
33+
34+
await new Promise((resolve) => setTimeout(resolve, 2000));
35+
await counter2.dispose();
2036
}
2137

2238
main();
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
import { registry } from "./registry";
22

3-
registry.start();
3+
registry.start({
4+
// defaultServerPort: 8080,
5+
// runnerKind: "serverless",
6+
// autoConfigureServerless: true,
7+
});

examples/smoke-test/src/smoke-test/spawn-actor.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,19 @@ export async function spawnActor({
3737
await counter.increment(1);
3838
await counter.dispose();
3939

40-
// Wait for actor to sleep
41-
await new Promise(res => setTimeout(res, 1000));
42-
40+
// Immediately reconnect
4341
const counter2 = client.counter.getOrCreate(key).connect();
4442
await counter2.increment(1);
4543
await counter2.dispose();
4644

45+
// Wait for actor to sleep
46+
await new Promise(res => setTimeout(res, 1000));
47+
48+
// Reconnect after sleep
49+
const counter3 = client.counter.getOrCreate(key).connect();
50+
await counter3.increment(1);
51+
await counter3.dispose();
52+
4753
succeeded = true;
4854
onSuccess();
4955
} catch (error) {

packages/rivetkit/src/drivers/engine/actor-driver.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,8 @@ export class EngineActorDriver implements ActorDriver {
411411
await this.#runnerStarted.promise;
412412

413413
return streamSSE(c, async (stream) => {
414+
stream.onAbort(() => this.shutdown(true));
415+
414416
// Runner id should be set if the runner started
415417
const payload = this.#runner.getServerlessInitPacket();
416418
invariant(payload, "runnerId not set");

packages/rivetkit/src/registry/mod.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export class Registry<A extends RegistryActors> {
9292
if (config.runnerKind === "serverless") {
9393
config.defaultServerPort = 8080;
9494
config.overrideServerAddress = config.endpoint;
95+
config.disableActorDriver = true;
9596
}
9697

9798
// Configure logger
@@ -230,8 +231,31 @@ async function configureServerlessRunner(config: RunnerConfig): Promise<void> {
230231
? config.autoConfigureServerless
231232
: {};
232233

234+
// Make the request to fetch all datacenters
235+
const dcsUrl = `${config.endpoint}/datacenters`;
236+
237+
logger().debug({
238+
msg: "fetching datacenters",
239+
url: dcsUrl,
240+
});
241+
242+
const dcsResponse = await fetch(dcsUrl, {
243+
headers: {
244+
...(config.token ? { Authorization: `Bearer ${config.token}` } : {}),
245+
},
246+
});
247+
248+
if (!dcsResponse.ok) {
249+
const errorText = await dcsResponse.text();
250+
throw new Error(
251+
`failed to configure serverless runner: ${dcsResponse.status} ${dcsResponse.statusText} - ${errorText}`,
252+
);
253+
}
254+
255+
let dcsRes = await dcsResponse.json() as { datacenters: { name: string }[] };
256+
233257
// Build the request body
234-
const requestBody = {
258+
const serverlessConfig = {
235259
serverless: {
236260
url:
237261
customConfig.url ||
@@ -245,14 +269,15 @@ async function configureServerlessRunner(config: RunnerConfig): Promise<void> {
245269
customConfig.slotsPerRunner ?? config.totalSlots ?? 1000,
246270
},
247271
};
272+
const requestBody = Object.fromEntries(dcsRes.datacenters.map(dc => [dc.name, serverlessConfig]));
248273

249274
// Make the request to configure the serverless runner
250275
const configUrl = `${config.endpoint}/runner-configs/${config.runnerName}?namespace=${config.namespace}`;
251276

252277
logger().debug({
253278
msg: "configuring serverless runner",
254279
url: configUrl,
255-
config: requestBody.serverless,
280+
config: serverlessConfig.serverless,
256281
});
257282

258283
const response = await fetch(configUrl, {

0 commit comments

Comments
 (0)