diff --git a/packages/rivetkit/scripts/dump-openapi.ts b/packages/rivetkit/scripts/dump-openapi.ts index 834b1072d..e2aa85414 100644 --- a/packages/rivetkit/scripts/dump-openapi.ts +++ b/packages/rivetkit/scripts/dump-openapi.ts @@ -4,7 +4,7 @@ import { createFileSystemOrMemoryDriver } from "@/drivers/file-system/mod"; import type { ManagerDriver } from "@/manager/driver"; import { createManagerRouter } from "@/manager/router"; import { type RegistryConfig, RegistryConfigSchema, setup } from "@/mod"; -import { type RunConfig, RunConfigSchema } from "@/registry/run-config"; +import { type RunnerConfig, RunnerConfigSchema } from "@/registry/run-config"; import { VERSION } from "@/utils"; function main() { @@ -13,7 +13,7 @@ function main() { }); const registry = setup(registryConfig); - const driverConfig: RunConfig = RunConfigSchema.parse({ + const driverConfig: RunnerConfig = RunnerConfigSchema.parse({ driver: createFileSystemOrMemoryDriver(false), getUpgradeWebSocket: () => () => unimplemented(), inspector: { diff --git a/packages/rivetkit/src/actor/driver.ts b/packages/rivetkit/src/actor/driver.ts index a175b3ece..5b732f5ba 100644 --- a/packages/rivetkit/src/actor/driver.ts +++ b/packages/rivetkit/src/actor/driver.ts @@ -2,12 +2,12 @@ import type { Context as HonoContext } from "hono"; import type { AnyClient } from "@/client/client"; import type { ManagerDriver } from "@/manager/driver"; import type { RegistryConfig } from "@/registry/config"; -import type { RunConfig } from "@/registry/run-config"; +import type { RunnerConfig } from "@/registry/run-config"; import type { AnyActorInstance } from "./instance"; export type ActorDriverBuilder = ( registryConfig: RegistryConfig, - runConfig: RunConfig, + runConfig: RunnerConfig, managerDriver: ManagerDriver, inlineClient: AnyClient, ) => ActorDriver; diff --git a/packages/rivetkit/src/actor/router-endpoints.ts b/packages/rivetkit/src/actor/router-endpoints.ts index 9f8e145ec..3b60119f5 100644 --- a/packages/rivetkit/src/actor/router-endpoints.ts +++ b/packages/rivetkit/src/actor/router-endpoints.ts @@ -26,7 +26,7 @@ import type { UpgradeWebSocketArgs } from "@/common/inline-websocket-adapter2"; import { deconstructError, stringifyError } from "@/common/utils"; import type { UniversalWebSocket } from "@/common/websocket-interface"; import { HonoWebSocketAdapter } from "@/manager/hono-websocket-adapter"; -import type { RunConfig } from "@/registry/run-config"; +import type { RunnerConfig } from "@/registry/run-config"; import type * as protocol from "@/schemas/client-protocol/mod"; import { HTTP_ACTION_REQUEST_VERSIONED, @@ -106,7 +106,7 @@ export interface WebSocketOpts { */ export async function handleWebSocketConnect( req: Request | undefined, - runConfig: RunConfig, + runConfig: RunnerConfig, actorDriver: ActorDriver, actorId: string, encoding: Encoding, @@ -325,7 +325,7 @@ export async function handleWebSocketConnect( */ export async function handleSseConnect( c: HonoContext, - _runConfig: RunConfig, + _runConfig: RunnerConfig, actorDriver: ActorDriver, actorId: string, ) { @@ -437,7 +437,7 @@ export async function handleSseConnect( */ export async function handleAction( c: HonoContext, - _runConfig: RunConfig, + _runConfig: RunnerConfig, actorDriver: ActorDriver, actionName: string, actorId: string, @@ -505,7 +505,7 @@ export async function handleAction( */ export async function handleConnectionMessage( c: HonoContext, - _runConfig: RunConfig, + _runConfig: RunnerConfig, actorDriver: ActorDriver, connId: string, connToken: string, @@ -542,7 +542,7 @@ export async function handleConnectionMessage( export async function handleConnectionClose( c: HonoContext, - _runConfig: RunConfig, + _runConfig: RunnerConfig, actorDriver: ActorDriver, connId: string, connToken: string, diff --git a/packages/rivetkit/src/actor/router.ts b/packages/rivetkit/src/actor/router.ts index 6089bad19..db63a15cb 100644 --- a/packages/rivetkit/src/actor/router.ts +++ b/packages/rivetkit/src/actor/router.ts @@ -41,7 +41,7 @@ import { createActorInspectorRouter, } from "@/inspector/actor"; import { isInspectorEnabled, secureInspector } from "@/inspector/utils"; -import type { RunConfig } from "@/registry/run-config"; +import type { RunnerConfig } from "@/registry/run-config"; import { ConnDriverKind } from "./conn-drivers"; import type { ActorDriver } from "./driver"; import { InternalError } from "./errors"; @@ -67,7 +67,7 @@ export type ActorRouter = Hono<{ Bindings: ActorRouterBindings }>; * Creates a router that runs on the partitioned instance. */ export function createActorRouter( - runConfig: RunConfig, + runConfig: RunnerConfig, actorDriver: ActorDriver, isTest: boolean, ): ActorRouter { diff --git a/packages/rivetkit/src/client/config.ts b/packages/rivetkit/src/client/config.ts index 379ba4e5a..4f4226996 100644 --- a/packages/rivetkit/src/client/config.ts +++ b/packages/rivetkit/src/client/config.ts @@ -1,41 +1,32 @@ import z from "zod"; import { TransportSchema } from "@/actor/protocol/old"; import { EncodingSchema } from "@/actor/protocol/serde"; -import { getEnvUniversal, type UpgradeWebSocket } from "@/utils"; - -export type GetUpgradeWebSocket = () => UpgradeWebSocket; +import { type GetUpgradeWebSocket, getEnvUniversal } from "@/utils"; export const ClientConfigSchema = z.object({ - /** Configure serving the API */ - api: z - .object({ - host: z.string().default("127.0.0.1"), - port: z.number().default(6420), - }) - .default({}), + /** Endpoint to connect to for Rivet Engine or RivetKit manager API. */ + endpoint: z + .string() + .optional() + .transform( + (x) => + x ?? + getEnvUniversal("RIVET_ENGINE") ?? + getEnvUniversal("RIVET_ENDPOINT"), + ), + /** Token to use to authenticate with the API. */ token: z .string() .optional() .transform((x) => x ?? getEnvUniversal("RIVET_TOKEN")), - headers: z.record(z.string()).optional().default({}), - - /** Endpoint to connect to the Rivet engine. Can be configured via RIVET_ENGINE env var. */ - endpoint: z - .string() - .nullable() - .default( - () => - getEnvUniversal("RIVET_ENGINE") ?? - getEnvUniversal("RIVET_ENDPOINT") ?? - null, - ), - + /** Namespace to connect to. */ namespace: z .string() .default(() => getEnvUniversal("RIVET_NAMESPACE") ?? "default"), + /** Name of the runner. This is used to group together runners in to different pools. */ runnerName: z .string() .default(() => getEnvUniversal("RIVET_RUNNER") ?? "rivetkit"), @@ -44,10 +35,9 @@ export const ClientConfigSchema = z.object({ transport: TransportSchema.default("websocket"), - // This is a function to allow for lazy configuration of upgradeWebSocket on the - // fly. This is required since the dependencies that upgradeWebSocket - // (specifically Node.js) can sometimes only be specified after the router is - // created or must be imported async using `await import(...)` + headers: z.record(z.string()).optional().default({}), + + // See RunConfig.getUpgradeWebSocket getUpgradeWebSocket: z.custom().optional(), }); diff --git a/packages/rivetkit/src/driver-helpers/mod.ts b/packages/rivetkit/src/driver-helpers/mod.ts index e98c899fa..05754cfd4 100644 --- a/packages/rivetkit/src/driver-helpers/mod.ts +++ b/packages/rivetkit/src/driver-helpers/mod.ts @@ -32,5 +32,8 @@ export type { ManagerDisplayInformation, ManagerDriver, } from "@/manager/driver"; -export { DriverConfigSchema, RunConfigSchema } from "@/registry/run-config"; +export { + DriverConfigSchema, + RunnerConfigSchema as RunConfigSchema, +} from "@/registry/run-config"; export { serializeEmptyPersistData } from "./utils"; diff --git a/packages/rivetkit/src/driver-test-suite/mod.ts b/packages/rivetkit/src/driver-test-suite/mod.ts index 4dfa265c8..5042188d5 100644 --- a/packages/rivetkit/src/driver-test-suite/mod.ts +++ b/packages/rivetkit/src/driver-test-suite/mod.ts @@ -7,7 +7,7 @@ import type { Transport } from "@/client/mod"; import { configureInspectorAccessToken } from "@/inspector/utils"; import { createManagerRouter } from "@/manager/router"; import type { DriverConfig, Registry, RunConfig } from "@/mod"; -import { RunConfigSchema } from "@/registry/run-config"; +import { RunnerConfigSchema } from "@/registry/run-config"; import { getPort } from "@/test/mod"; import { logger } from "./log"; import { runActionFeaturesTests } from "./tests/action-features"; @@ -199,7 +199,7 @@ export async function createTestRuntime( // Build driver config // biome-ignore lint/style/useConst: Assigned later let upgradeWebSocket: any; - const config: RunConfig = RunConfigSchema.parse({ + const config: RunConfig = RunnerConfigSchema.parse({ driver, getUpgradeWebSocket: () => upgradeWebSocket!, inspector: { diff --git a/packages/rivetkit/src/drivers/default.ts b/packages/rivetkit/src/drivers/default.ts index 15d7a8132..c94e86b59 100644 --- a/packages/rivetkit/src/drivers/default.ts +++ b/packages/rivetkit/src/drivers/default.ts @@ -2,12 +2,12 @@ import { UserError } from "@/actor/errors"; import { loggerWithoutContext } from "@/actor/log"; import { createEngineDriver } from "@/drivers/engine/mod"; import { createFileSystemOrMemoryDriver } from "@/drivers/file-system/mod"; -import type { DriverConfig, RunConfig } from "@/registry/run-config"; +import type { DriverConfig, RunnerConfig } from "@/registry/run-config"; /** * Chooses the appropriate driver based on the run configuration. */ -export function chooseDefaultDriver(runConfig: RunConfig): DriverConfig { +export function chooseDefaultDriver(runConfig: RunnerConfig): DriverConfig { if (runConfig.endpoint && runConfig.driver) { throw new UserError( "Cannot specify both 'endpoint' and 'driver' in configuration", @@ -24,16 +24,12 @@ export function chooseDefaultDriver(runConfig: RunConfig): DriverConfig { return runConfig.driver; } - if (runConfig.endpoint) { + if (runConfig.endpoint || runConfig.token) { loggerWithoutContext().debug({ msg: "using rivet engine driver", endpoint: runConfig.endpoint, }); - // TODO: Add all properties from config - return createEngineDriver({ - endpoint: runConfig.endpoint, - token: runConfig.token, - }); + return createEngineDriver(runConfig); } loggerWithoutContext().debug({ msg: "using default file system driver" }); diff --git a/packages/rivetkit/src/drivers/engine/actor-driver.ts b/packages/rivetkit/src/drivers/engine/actor-driver.ts index 6565fbfa1..e7a044a85 100644 --- a/packages/rivetkit/src/drivers/engine/actor-driver.ts +++ b/packages/rivetkit/src/drivers/engine/actor-driver.ts @@ -1,6 +1,6 @@ import type { + RunnerConfig as EngineRunnerConfig, ActorConfig as RunnerActorConfig, - RunnerConfig, } from "@rivetkit/engine-runner"; import { Runner } from "@rivetkit/engine-runner"; import * as cbor from "cbor-x"; @@ -34,13 +34,14 @@ import { serializeEmptyPersistData, } from "@/driver-helpers/mod"; import type { RegistryConfig } from "@/registry/config"; -import type { RunConfig } from "@/registry/run-config"; +import type { RunnerConfig } from "@/registry/run-config"; +import { getEndpoint } from "@/remote-manager-driver/api-utils"; import { type LongTimeoutHandle, promiseWithResolvers, setLongTimeout, } from "@/utils"; -import type { Config } from "./config"; +import type { EngineConfig } from "./config"; import { KEYS } from "./kv"; import { logger } from "./log"; @@ -54,10 +55,10 @@ export type DriverContext = {}; export class EngineActorDriver implements ActorDriver { #registryConfig: RegistryConfig; - #runConfig: RunConfig; + #runConfig: RunnerConfig; #managerDriver: ManagerDriver; #inlineClient: Client; - #config: Config; + #config: EngineConfig; #runner: Runner; #actors: Map = new Map(); #actorRouter: ActorRouter; @@ -69,10 +70,10 @@ export class EngineActorDriver implements ActorDriver { constructor( registryConfig: RegistryConfig, - runConfig: RunConfig, + runConfig: RunnerConfig, managerDriver: ManagerDriver, inlineClient: Client, - config: Config, + config: EngineConfig, ) { this.#registryConfig = registryConfig; this.#runConfig = runConfig; @@ -95,11 +96,10 @@ export class EngineActorDriver implements ActorDriver { // Create runner configuration let hasDisconnected = false; - const runnerConfig: RunnerConfig = { + const engineRunnerConfig: EngineRunnerConfig = { version: this.#version, - endpoint: config.endpoint, + endpoint: getEndpoint(config), token, - pegboardEndpoint: config.pegboardEndpoint, namespace: runConfig.namespace ?? config.namespace, totalSlots: runConfig.totalSlots ?? config.totalSlots, runnerName: runConfig.runnerName ?? config.runnerName, @@ -149,7 +149,7 @@ export class EngineActorDriver implements ActorDriver { }; // Create and start runner - this.#runner = new Runner(runnerConfig); + this.#runner = new Runner(engineRunnerConfig); this.#runner.start(); logger().debug({ msg: "engine runner started", diff --git a/packages/rivetkit/src/drivers/engine/config.ts b/packages/rivetkit/src/drivers/engine/config.ts index 824978f90..81edde1d5 100644 --- a/packages/rivetkit/src/drivers/engine/config.ts +++ b/packages/rivetkit/src/drivers/engine/config.ts @@ -1,38 +1,22 @@ -import type { Hono } from "hono"; import { z } from "zod"; +import { ClientConfigSchema } from "@/client/config"; import { getEnvUniversal } from "@/utils"; -export const ConfigSchema = z +export const EngingConfigSchema = z .object({ - app: z.custom().optional(), - endpoint: z - .string() - .default( - () => - getEnvUniversal("RIVET_ENGINE") ?? - getEnvUniversal("RIVET_ENDPOINT") ?? - "http://localhost:6420", - ), - token: z - .string() - .optional() - .transform((val) => val ?? getEnvUniversal("RIVET_TOKEN")), - pegboardEndpoint: z.string().optional(), - namespace: z - .string() - .default(() => getEnvUniversal("RIVET_NAMESPACE") ?? "default"), - runnerName: z - .string() - .default(() => getEnvUniversal("RIVET_RUNNER") ?? "rivetkit"), - // TODO: Automatically attempt to determine key by common env vars (e.g. k8s pod name) + /** Unique key for this runner. Runners connecting a given key will replace any other runner connected with the same key. */ runnerKey: z .string() .default( () => getEnvUniversal("RIVET_RUNNER_KEY") ?? crypto.randomUUID(), ), + + /** How many actors this runner can run. */ totalSlots: z.number().default(100_000), }) + // We include the client config since this includes the common properties like endpoint, namespace, etc. + .merge(ClientConfigSchema) .default({}); -export type InputConfig = z.input; -export type Config = z.infer; +export type EngineConfig = z.infer; +export type EngineConfigInput = z.input; diff --git a/packages/rivetkit/src/drivers/engine/mod.ts b/packages/rivetkit/src/drivers/engine/mod.ts index a282f4de7..59b232701 100644 --- a/packages/rivetkit/src/drivers/engine/mod.ts +++ b/packages/rivetkit/src/drivers/engine/mod.ts @@ -1,16 +1,22 @@ import type { Client } from "@/client/client"; import type { ManagerDriver } from "@/manager/driver"; import type { RegistryConfig } from "@/registry/config"; -import type { DriverConfig, RunConfig } from "@/registry/run-config"; +import type { DriverConfig, RunnerConfig } from "@/registry/run-config"; import { RemoteManagerDriver } from "@/remote-manager-driver/mod"; import { EngineActorDriver } from "./actor-driver"; -import { ConfigSchema, type InputConfig } from "./config"; +import { type EngineConfigInput, EngingConfigSchema } from "./config"; export { EngineActorDriver } from "./actor-driver"; -export { type Config, ConfigSchema, type InputConfig } from "./config"; +export { + type EngineConfig as Config, + type EngineConfigInput as InputConfig, + EngingConfigSchema as ConfigSchema, +} from "./config"; -export function createEngineDriver(inputConfig?: InputConfig): DriverConfig { - const config = ConfigSchema.parse(inputConfig); +export function createEngineDriver( + inputConfig?: EngineConfigInput, +): DriverConfig { + const config = EngingConfigSchema.parse(inputConfig); return { name: "engine", @@ -19,7 +25,7 @@ export function createEngineDriver(inputConfig?: InputConfig): DriverConfig { }, actor: ( registryConfig: RegistryConfig, - runConfig: RunConfig, + runConfig: RunnerConfig, managerDriver: ManagerDriver, inlineClient: Client, ) => { diff --git a/packages/rivetkit/src/drivers/file-system/global-state.ts b/packages/rivetkit/src/drivers/file-system/global-state.ts index 4f8e42ee1..53da7e682 100644 --- a/packages/rivetkit/src/drivers/file-system/global-state.ts +++ b/packages/rivetkit/src/drivers/file-system/global-state.ts @@ -14,7 +14,7 @@ import { serializeEmptyPersistData, } from "@/driver-helpers/mod"; import type { RegistryConfig } from "@/registry/config"; -import type { RunConfig } from "@/registry/run-config"; +import type { RunnerConfig } from "@/registry/run-config"; import type * as schema from "@/schemas/file-system-driver/mod"; import { ACTOR_ALARM_VERSIONED, @@ -73,7 +73,7 @@ export class FileSystemGlobalState { #runnerParams?: { registryConfig: RegistryConfig; - runConfig: RunConfig; + runConfig: RunnerConfig; inlineClient: AnyClient; actorDriver: ActorDriver; }; @@ -410,7 +410,7 @@ export class FileSystemGlobalState { */ onRunnerStart( registryConfig: RegistryConfig, - runConfig: RunConfig, + runConfig: RunnerConfig, inlineClient: AnyClient, actorDriver: ActorDriver, ) { @@ -436,7 +436,7 @@ export class FileSystemGlobalState { async startActor( registryConfig: RegistryConfig, - runConfig: RunConfig, + runConfig: RunnerConfig, inlineClient: AnyClient, actorDriver: ActorDriver, actorId: string, diff --git a/packages/rivetkit/src/inspector/utils.ts b/packages/rivetkit/src/inspector/utils.ts index e125640eb..ddcd9cc59 100644 --- a/packages/rivetkit/src/inspector/utils.ts +++ b/packages/rivetkit/src/inspector/utils.ts @@ -2,7 +2,7 @@ import crypto from "node:crypto"; import { createMiddleware } from "hono/factory"; import type { ManagerDriver } from "@/driver-helpers/mod"; import type { RunConfig } from "@/mod"; -import type { RunConfigInput } from "@/registry/run-config"; +import type { RunnerConfigInput } from "@/registry/run-config"; import { inspectorLogger } from "./log"; export function compareSecrets(providedSecret: string, validSecret: string) { @@ -47,7 +47,7 @@ export const secureInspector = (runConfig: RunConfig) => await next(); }); -export function getInspectorUrl(runConfig: RunConfigInput | undefined) { +export function getInspectorUrl(runConfig: RunnerConfigInput | undefined) { if (!runConfig?.inspector?.enabled) { return "disabled"; } diff --git a/packages/rivetkit/src/manager/driver.ts b/packages/rivetkit/src/manager/driver.ts index 4c72ad004..48797ce4f 100644 --- a/packages/rivetkit/src/manager/driver.ts +++ b/packages/rivetkit/src/manager/driver.ts @@ -2,11 +2,11 @@ import type { Env, Hono, Context as HonoContext } from "hono"; import type { ActorKey, Encoding, UniversalWebSocket } from "@/actor/mod"; import type { ManagerInspector } from "@/inspector/manager"; import type { RegistryConfig } from "@/registry/config"; -import type { RunConfig } from "@/registry/run-config"; +import type { RunnerConfig } from "@/registry/run-config"; export type ManagerDriverBuilder = ( registryConfig: RegistryConfig, - runConfig: RunConfig, + runConfig: RunnerConfig, ) => ManagerDriver; export interface ManagerDriver { diff --git a/packages/rivetkit/src/manager/gateway.ts b/packages/rivetkit/src/manager/gateway.ts index 443e4f499..4ce5d5c8f 100644 --- a/packages/rivetkit/src/manager/gateway.ts +++ b/packages/rivetkit/src/manager/gateway.ts @@ -14,7 +14,7 @@ import { } from "@/common/actor-router-consts"; import { deconstructError, noopNext } from "@/common/utils"; import type { UniversalWebSocket, UpgradeWebSocketArgs } from "@/mod"; -import type { RunConfig } from "@/registry/run-config"; +import type { RunnerConfig } from "@/registry/run-config"; import { promiseWithResolvers, stringifyError } from "@/utils"; import type { ManagerDriver } from "./driver"; import { logger } from "./log"; @@ -27,7 +27,7 @@ import { logger } from "./log"; * - HTTP requests: Uses x-rivet-target and x-rivet-actor headers for routing */ export async function actorGateway( - runConfig: RunConfig, + runConfig: RunnerConfig, managerDriver: ManagerDriver, c: HonoContext, next: Next, @@ -65,7 +65,7 @@ export async function actorGateway( * Handle WebSocket requests using sec-websocket-protocol for routing */ async function handleWebSocketGateway( - runConfig: RunConfig, + runConfig: RunnerConfig, managerDriver: ManagerDriver, c: HonoContext, strippedPath: string, diff --git a/packages/rivetkit/src/manager/router.ts b/packages/rivetkit/src/manager/router.ts index 8fbeb94af..b788dccc6 100644 --- a/packages/rivetkit/src/manager/router.ts +++ b/packages/rivetkit/src/manager/router.ts @@ -52,7 +52,7 @@ import { import { RivetIdSchema } from "@/manager-api/common"; import type { ServerlessActorDriverBuilder } from "@/mod"; import type { RegistryConfig } from "@/registry/config"; -import type { RunConfig } from "@/registry/run-config"; +import type { RunnerConfig } from "@/registry/run-config"; import type { ActorOutput, ManagerDriver } from "./driver"; import { actorGateway, createTestWebSocketProxy } from "./gateway"; import { logger } from "./log"; @@ -78,7 +78,7 @@ function buildOpenApiResponses(schema: T) { export function createManagerRouter( registryConfig: RegistryConfig, - runConfig: RunConfig, + runConfig: RunnerConfig, managerDriver: ManagerDriver, serverlessActorDriverBuilder: ServerlessActorDriverBuilder | undefined, ): { router: Hono; openapi: OpenAPIHono } { @@ -121,7 +121,7 @@ export function createManagerRouter( } function addServerlessRoutes( - runConfig: RunConfig, + runConfig: RunnerConfig, serverlessActorDriverBuilder: ServerlessActorDriverBuilder, router: OpenAPIHono, ) { @@ -165,7 +165,7 @@ function addServerlessRoutes( function addManagerRoutes( registryConfig: RegistryConfig, - runConfig: RunConfig, + runConfig: RunnerConfig, managerDriver: ManagerDriver, router: OpenAPIHono, ) { diff --git a/packages/rivetkit/src/registry/mod.ts b/packages/rivetkit/src/registry/mod.ts index 60ce1723b..561e8ed6a 100644 --- a/packages/rivetkit/src/registry/mod.ts +++ b/packages/rivetkit/src/registry/mod.ts @@ -18,9 +18,9 @@ import { import { logger } from "./log"; import { type DriverConfig, - type RunConfig, - type RunConfigInput, - RunConfigSchema, + type RunnerConfig, + type RunnerConfigInput, + RunnerConfigSchema, } from "./run-config"; import { crossPlatformServe } from "./serve"; @@ -52,8 +52,8 @@ export class Registry { /** * Runs the registry for a server. */ - public start(inputConfig?: RunConfigInput): ServerOutput { - const config = RunConfigSchema.parse(inputConfig); + public start(inputConfig?: RunnerConfigInput): ServerOutput { + const config = RunnerConfigSchema.parse(inputConfig); // Configure logger if (config.logging?.baseLogger) { @@ -189,8 +189,8 @@ export function setup( export type { RegistryConfig, RegistryActors, - RunConfig, - RunConfigInput, + RunnerConfig as RunConfig, + RunnerConfigInput as RunConfigInput, DriverConfig, }; export { RegistryConfigSchema }; diff --git a/packages/rivetkit/src/registry/run-config.ts b/packages/rivetkit/src/registry/run-config.ts index d370f8d66..8eeb14a74 100644 --- a/packages/rivetkit/src/registry/run-config.ts +++ b/packages/rivetkit/src/registry/run-config.ts @@ -2,10 +2,11 @@ import type { cors } from "hono/cors"; import type { Logger } from "pino"; import { z } from "zod"; import type { ActorDriverBuilder } from "@/actor/driver"; -import { ClientConfigSchema } from "@/client/config"; import { LogLevelSchema } from "@/common/log"; +import { EngingConfigSchema as EngineConfigSchema } from "@/drivers/engine/config"; import { InspectorConfigSchema } from "@/inspector/config"; import type { ManagerDriverBuilder } from "@/manager/driver"; +import type { GetUpgradeWebSocket } from "@/utils"; import { getEnvUniversal } from "@/utils"; type CorsOptions = NonNullable[0]>; @@ -20,68 +21,79 @@ export const DriverConfigSchema = z.object({ export type DriverConfig = z.infer; /** Base config used for the actor config across all platforms. */ -export const RunConfigSchema = ClientConfigSchema.extend({ - driver: DriverConfigSchema.optional(), - - /** CORS configuration for the router. Uses Hono's CORS middleware options. */ - cors: z.custom().optional(), - - maxIncomingMessageSize: z.number().optional().default(65_536), - - inspector: InspectorConfigSchema, - - /** @experimental */ - disableDefaultServer: z.boolean().optional().default(false), - - /** @experimental */ - overrideServerAddress: z.string().optional(), - - /** @experimental */ - disableActorDriver: z.boolean().optional().default(false), - - /** - * @experimental - * - * Whether to run runners normally or have them managed - * serverlessly (by the Rivet Engine for example). - */ - runnerKind: z - .enum(["serverless", "normal"]) - .optional() - .default(() => - getEnvUniversal("RIVET_RUNNER_KIND") === "serverless" - ? "serverless" - : "normal", - ), - totalSlots: z.number().optional(), - - /** - * @experimental - * - * Base path for the router. This is used to prefix all routes. - * For example, if the base path is `/api`, then the route `/actors` will be - * available at `/api/actors`. - */ - basePath: z.string().optional().default("/"), - - /** - * @experimental - * - * Disable welcome message. - * */ - noWelcome: z.boolean().optional().default(false), - - /** - * @experimental - * */ - logging: z - .object({ - baseLogger: z.custom().optional(), - level: LogLevelSchema.optional(), - }) - .optional() - .default({}), -}).default({}); - -export type RunConfig = z.infer; -export type RunConfigInput = z.input; +export const RunnerConfigSchema = z + .object({ + driver: DriverConfigSchema.optional(), + + /** CORS configuration for the router. Uses Hono's CORS middleware options. */ + cors: z.custom().optional(), + + /** @experimental */ + maxIncomingMessageSize: z.number().optional().default(65_536), + + /** @experimental */ + inspector: InspectorConfigSchema, + + /** @experimental */ + disableDefaultServer: z.boolean().optional().default(false), + + /** @experimental */ + overrideServerAddress: z.string().optional(), + + /** @experimental */ + disableActorDriver: z.boolean().optional().default(false), + + /** + * @experimental + * + * Whether to run runners normally or have them managed + * serverlessly (by the Rivet Engine for example). + */ + runnerKind: z + .enum(["serverless", "normal"]) + .optional() + .default(() => + getEnvUniversal("RIVET_RUNNER_KIND") === "serverless" + ? "serverless" + : "normal", + ), + totalSlots: z.number().optional(), + + /** + * @experimental + * + * Base path for the router. This is used to prefix all routes. + * For example, if the base path is `/api`, then the route `/actors` will be + * available at `/api/actors`. + */ + basePath: z.string().optional().default("/"), + + /** + * @experimental + * + * Disable welcome message. + * */ + noWelcome: z.boolean().optional().default(false), + + /** + * @experimental + * */ + logging: z + .object({ + baseLogger: z.custom().optional(), + level: LogLevelSchema.optional(), + }) + .optional() + .default({}), + + // This is a function to allow for lazy configuration of upgradeWebSocket on the + // fly. This is required since the dependencies that upgradeWebSocket + // (specifically Node.js) can sometimes only be specified after the router is + // created or must be imported async using `await import(...)` + getUpgradeWebSocket: z.custom().optional(), + }) + .merge(EngineConfigSchema.removeDefault()) + .default({}); + +export type RunnerConfig = z.infer; +export type RunnerConfigInput = z.input; diff --git a/packages/rivetkit/src/remote-manager-driver/api-utils.ts b/packages/rivetkit/src/remote-manager-driver/api-utils.ts index 196627050..00a790bfc 100644 --- a/packages/rivetkit/src/remote-manager-driver/api-utils.ts +++ b/packages/rivetkit/src/remote-manager-driver/api-utils.ts @@ -16,7 +16,7 @@ export class EngineApiError extends Error { } export function getEndpoint(config: ClientConfig) { - return config.endpoint ?? "http://127.0.0.1:6420"; + return config.endpoint ?? "http://localhost:6420"; } // Helper function for making API calls diff --git a/packages/rivetkit/src/test/config.ts b/packages/rivetkit/src/test/config.ts index 9269b21a6..f4553f11e 100644 --- a/packages/rivetkit/src/test/config.ts +++ b/packages/rivetkit/src/test/config.ts @@ -1,7 +1,7 @@ import { z } from "zod"; -import { RunConfigSchema } from "@/registry/run-config"; +import { RunnerConfigSchema } from "@/registry/run-config"; -export const ConfigSchema = RunConfigSchema.removeDefault() +export const ConfigSchema = RunnerConfigSchema.removeDefault() .extend({ hostname: z .string() diff --git a/packages/rivetkit/src/test/mod.ts b/packages/rivetkit/src/test/mod.ts index 791f899e3..5f3f308b9 100644 --- a/packages/rivetkit/src/test/mod.ts +++ b/packages/rivetkit/src/test/mod.ts @@ -11,7 +11,7 @@ import { } from "@/inspector/utils"; import { createManagerRouter } from "@/manager/router"; import type { Registry } from "@/registry/mod"; -import { RunConfigSchema } from "@/registry/run-config"; +import { RunnerConfigSchema } from "@/registry/run-config"; import { ConfigSchema, type InputConfig } from "./config"; import { logger } from "./log"; @@ -27,7 +27,7 @@ function serve(registry: Registry, inputConfig?: InputConfig): ServerType { } // Create router - const runConfig = RunConfigSchema.parse(inputConfig); + const runConfig = RunnerConfigSchema.parse(inputConfig); const driver = inputConfig.driver ?? createFileSystemOrMemoryDriver(false); const managerDriver = driver.manager(registry.config, config); configureInspectorAccessToken(config, managerDriver); diff --git a/packages/rivetkit/src/utils.ts b/packages/rivetkit/src/utils.ts index fe390597c..6cc07917d 100644 --- a/packages/rivetkit/src/utils.ts +++ b/packages/rivetkit/src/utils.ts @@ -31,6 +31,8 @@ export type UpgradeWebSocket = ( createEvents: (c: HonoContext) => any, ) => HonoHandler; +export type GetUpgradeWebSocket = () => UpgradeWebSocket; + export function getEnvUniversal(key: string): string | undefined { if (typeof Deno !== "undefined") { return Deno.env.get(key); diff --git a/packages/rivetkit/tests/driver-engine.test.ts b/packages/rivetkit/tests/driver-engine.test.ts index bfc729a6a..4cd382547 100644 --- a/packages/rivetkit/tests/driver-engine.test.ts +++ b/packages/rivetkit/tests/driver-engine.test.ts @@ -2,7 +2,7 @@ import { join } from "node:path"; import { createClientWithDriver } from "@/client/client"; import { createTestRuntime, runDriverTests } from "@/driver-test-suite/mod"; import { createEngineDriver } from "@/drivers/engine/mod"; -import { RunConfigSchema } from "@/registry/run-config"; +import { RunnerConfigSchema } from "@/registry/run-config"; runDriverTests({ // Use real timers for engine-runner tests @@ -48,7 +48,7 @@ runDriverTests({ }); // Start the actor driver - const runConfig = RunConfigSchema.parse({ + const runConfig = RunnerConfigSchema.parse({ driver: driverConfig, getUpgradeWebSocket: () => undefined, });