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

Commit e98e47f

Browse files
committed
chore(core): add x-rivet-endpoint header for serverless runners & cleanup severless runner setup (#1359)
Depends on rivet-dev/rivet#3077
1 parent 5f5af72 commit e98e47f

File tree

11 files changed

+147
-101
lines changed

11 files changed

+147
-101
lines changed

packages/rivetkit/scripts/dump-openapi.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import { resolve } from "node:path";
33
import { createFileSystemOrMemoryDriver } from "@/drivers/file-system/mod";
44
import type { ManagerDriver } from "@/manager/driver";
55
import { createManagerRouter } from "@/manager/router";
6-
import { type RegistryConfig, RegistryConfigSchema, setup } from "@/mod";
6+
import {
7+
createClientWithDriver,
8+
type RegistryConfig,
9+
RegistryConfigSchema,
10+
setup,
11+
} from "@/mod";
712
import { type RunnerConfig, RunnerConfigSchema } from "@/registry/run-config";
813
import { VERSION } from "@/utils";
914

@@ -34,11 +39,14 @@ function main() {
3439
getOrCreateInspectorAccessToken: unimplemented,
3540
};
3641

42+
const client = createClientWithDriver(managerDriver);
43+
3744
const { openapi } = createManagerRouter(
3845
registryConfig,
3946
driverConfig,
4047
managerDriver,
41-
undefined,
48+
driverConfig.driver!,
49+
client,
4250
);
4351

4452
const openApiDoc = openapi.getOpenAPIDocument({

packages/rivetkit/src/driver-test-suite/mod.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ import { describe } from "vitest";
66
import type { Transport } from "@/client/mod";
77
import { configureInspectorAccessToken } from "@/inspector/utils";
88
import { createManagerRouter } from "@/manager/router";
9-
import type { DriverConfig, Registry, RunConfig } from "@/mod";
9+
import {
10+
createClientWithDriver,
11+
type DriverConfig,
12+
type Registry,
13+
type RunConfig,
14+
} from "@/mod";
1015
import { RunnerConfigSchema } from "@/registry/run-config";
1116
import { getPort } from "@/test/mod";
1217
import { logger } from "./log";
@@ -210,12 +215,14 @@ export async function createTestRuntime(
210215

211216
// Create router
212217
const managerDriver = driver.manager(registry.config, config);
218+
const client = createClientWithDriver(managerDriver);
213219
configureInspectorAccessToken(config, managerDriver);
214220
const { router } = createManagerRouter(
215221
registry.config,
216222
config,
217223
managerDriver,
218-
undefined,
224+
driver,
225+
client,
219226
);
220227

221228
// Inject WebSocket

packages/rivetkit/src/drivers/default.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export function chooseDefaultDriver(runConfig: RunnerConfig): DriverConfig {
2929
msg: "using rivet engine driver",
3030
endpoint: runConfig.endpoint,
3131
});
32-
return createEngineDriver(runConfig);
32+
return createEngineDriver();
3333
}
3434

3535
loggerWithoutContext().debug({ msg: "using default file system driver" });

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

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ import {
4141
promiseWithResolvers,
4242
setLongTimeout,
4343
} from "@/utils";
44-
import type { EngineConfig } from "./config";
4544
import { KEYS } from "./kv";
4645
import { logger } from "./log";
4746

@@ -58,7 +57,6 @@ export class EngineActorDriver implements ActorDriver {
5857
#runConfig: RunnerConfig;
5958
#managerDriver: ManagerDriver;
6059
#inlineClient: Client<any>;
61-
#config: EngineConfig;
6260
#runner: Runner;
6361
#actors: Map<string, ActorHandler> = new Map();
6462
#actorRouter: ActorRouter;
@@ -73,17 +71,15 @@ export class EngineActorDriver implements ActorDriver {
7371
runConfig: RunnerConfig,
7472
managerDriver: ManagerDriver,
7573
inlineClient: Client<any>,
76-
config: EngineConfig,
7774
) {
7875
this.#registryConfig = registryConfig;
7976
this.#runConfig = runConfig;
8077
this.#managerDriver = managerDriver;
8178
this.#inlineClient = inlineClient;
82-
this.#config = config;
8379

8480
// HACK: Override inspector token (which are likely to be
8581
// removed later on) with token from x-rivet-token header
86-
const token = runConfig.token ?? config.token;
82+
const token = runConfig.token ?? runConfig.token;
8783
if (token && runConfig.inspector && runConfig.inspector.enabled) {
8884
runConfig.inspector.token = () => token;
8985
}
@@ -98,12 +94,12 @@ export class EngineActorDriver implements ActorDriver {
9894
let hasDisconnected = false;
9995
const engineRunnerConfig: EngineRunnerConfig = {
10096
version: this.#version,
101-
endpoint: getEndpoint(config),
97+
endpoint: getEndpoint(runConfig),
10298
token,
103-
namespace: runConfig.namespace ?? config.namespace,
104-
totalSlots: runConfig.totalSlots ?? config.totalSlots,
105-
runnerName: runConfig.runnerName ?? config.runnerName,
106-
runnerKey: config.runnerKey,
99+
namespace: runConfig.namespace ?? runConfig.namespace,
100+
totalSlots: runConfig.totalSlots ?? runConfig.totalSlots,
101+
runnerName: runConfig.runnerName ?? runConfig.runnerName,
102+
runnerKey: runConfig.runnerKey,
107103
metadata: {
108104
inspectorToken: this.#runConfig.inspector.token(),
109105
},
@@ -117,14 +113,14 @@ export class EngineActorDriver implements ActorDriver {
117113
if (hasDisconnected) {
118114
logger().info({
119115
msg: "runner reconnected",
120-
namespace: this.#config.namespace,
121-
runnerName: this.#config.runnerName,
116+
namespace: this.#runConfig.namespace,
117+
runnerName: this.#runConfig.runnerName,
122118
});
123119
} else {
124120
logger().debug({
125121
msg: "runner connected",
126-
namespace: this.#config.namespace,
127-
runnerName: this.#config.runnerName,
122+
namespace: this.#runConfig.namespace,
123+
runnerName: this.#runConfig.runnerName,
128124
});
129125
}
130126

@@ -133,8 +129,8 @@ export class EngineActorDriver implements ActorDriver {
133129
onDisconnected: () => {
134130
logger().warn({
135131
msg: "runner disconnected",
136-
namespace: this.#config.namespace,
137-
runnerName: this.#config.runnerName,
132+
namespace: this.#runConfig.namespace,
133+
runnerName: this.#runConfig.runnerName,
138134
});
139135
hasDisconnected = true;
140136
},
@@ -153,9 +149,9 @@ export class EngineActorDriver implements ActorDriver {
153149
this.#runner.start();
154150
logger().debug({
155151
msg: "engine runner started",
156-
endpoint: config.endpoint,
157-
namespace: config.namespace,
158-
runnerName: config.runnerName,
152+
endpoint: runConfig.endpoint,
153+
namespace: runConfig.namespace,
154+
runnerName: runConfig.runnerName,
159155
});
160156
}
161157

@@ -236,20 +232,20 @@ export class EngineActorDriver implements ActorDriver {
236232
async #runnerOnActorStart(
237233
actorId: string,
238234
generation: number,
239-
config: RunnerActorConfig,
235+
runConfig: RunnerActorConfig,
240236
): Promise<void> {
241237
logger().debug({
242238
msg: "runner actor starting",
243239
actorId,
244-
name: config.name,
245-
key: config.key,
240+
name: runConfig.name,
241+
key: runConfig.key,
246242
generation,
247243
});
248244

249245
// Deserialize input
250246
let input: any;
251-
if (config.input) {
252-
input = cbor.decode(config.input);
247+
if (runConfig.input) {
248+
input = cbor.decode(runConfig.input);
253249
}
254250

255251
// Get or create handler
@@ -262,15 +258,12 @@ export class EngineActorDriver implements ActorDriver {
262258
this.#actors.set(actorId, handler);
263259
}
264260

265-
const name = config.name as string;
266-
invariant(config.key, "actor should have a key");
267-
const key = deserializeActorKey(config.key);
261+
const name = runConfig.name as string;
262+
invariant(runConfig.key, "actor should have a key");
263+
const key = deserializeActorKey(runConfig.key);
268264

269265
// Create actor instance
270-
const definition = lookupInRegistry(
271-
this.#registryConfig,
272-
config.name as string, // TODO: Remove cast
273-
);
266+
const definition = lookupInRegistry(this.#registryConfig, runConfig.name);
274267
handler.actor = definition.instantiate();
275268

276269
// Start actor

packages/rivetkit/src/drivers/engine/mod.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,7 @@ export {
1313
EngingConfigSchema as ConfigSchema,
1414
} from "./config";
1515

16-
export function createEngineDriver(
17-
inputConfig?: EngineConfigInput,
18-
): DriverConfig {
19-
const config = EngingConfigSchema.parse(inputConfig);
20-
16+
export function createEngineDriver(): DriverConfig {
2117
return {
2218
name: "engine",
2319
manager: (_registryConfig, runConfig) => {
@@ -34,7 +30,6 @@ export function createEngineDriver(
3430
runConfig,
3531
managerDriver,
3632
inlineClient,
37-
config,
3833
);
3934
},
4035
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { z } from "zod";
2+
3+
export const ServerlessStartHeadersSchema = z.object({
4+
endpoint: z.string({ required_error: "x-rivet-endpoint header is required" }),
5+
token: z
6+
.string({ invalid_type_error: "x-rivet-token header must be a string" })
7+
.optional(),
8+
totalSlots: z.coerce
9+
.number({
10+
invalid_type_error: "x-rivet-total-slots header must be a number",
11+
})
12+
.int("x-rivet-total-slots header must be an integer")
13+
.gte(1, "x-rivet-total-slots header must be positive"),
14+
runnerName: z.string({
15+
required_error: "x-rivet-runner-name header is required",
16+
}),
17+
namespace: z.string({
18+
required_error: "x-rivet-namespace-id header is required",
19+
}),
20+
});

0 commit comments

Comments
 (0)