diff --git a/examples/counter-serverless/src/server.ts b/examples/counter-serverless/src/server.ts index d66d25754..01ff0b439 100644 --- a/examples/counter-serverless/src/server.ts +++ b/examples/counter-serverless/src/server.ts @@ -2,6 +2,6 @@ import { registry } from "./registry"; registry.start({ runnerKind: "serverless", - runEngine: true, - autoConfigureServerless: true, + autoConfigureServerless: { url: "http://localhost:8080" }, + endpoint: "http://localhost:6420", }); diff --git a/packages/next-js/src/log.ts b/packages/next-js/src/log.ts new file mode 100644 index 000000000..0ced37074 --- /dev/null +++ b/packages/next-js/src/log.ts @@ -0,0 +1,5 @@ +import { getLogger } from "rivetkit/log"; + +export function logger() { + return getLogger("driver-next-js"); +} diff --git a/packages/next-js/src/mod.ts b/packages/next-js/src/mod.ts index a206fadff..781908305 100644 --- a/packages/next-js/src/mod.ts +++ b/packages/next-js/src/mod.ts @@ -1,4 +1,5 @@ import type { Registry, RunConfigInput } from "rivetkit"; +import { logger } from "./log"; export const toNextHandler = ( registry: Registry, @@ -12,6 +13,10 @@ export const toNextHandler = ( // Auto-configure serverless runner if not in prod if (process.env.NODE_ENV !== "production") { + logger().debug( + "detected development environment, auto-starting engine and auto-configuring serverless", + ); + const publicUrl = process.env.NEXT_PUBLIC_SITE_URL ?? process.env.NEXT_PUBLIC_VERCEL_URL ?? @@ -21,6 +26,10 @@ export const toNextHandler = ( inputConfig.autoConfigureServerless = { url: `${publicUrl}/api/rivet/start`, }; + } else { + logger().debug( + "detected production environment, will not auto-start engine and auto-configure serverless", + ); } // Next logs this on every request diff --git a/packages/rivetkit/src/common/router.ts b/packages/rivetkit/src/common/router.ts index b88c1c8d5..b0184a0ef 100644 --- a/packages/rivetkit/src/common/router.ts +++ b/packages/rivetkit/src/common/router.ts @@ -5,6 +5,7 @@ import { getRequestEncoding, getRequestExposeInternalError, } from "@/actor/router-endpoints"; +import { buildActorNames, type RegistryConfig } from "@/registry/config"; import type { RunnerConfig } from "@/registry/run-config"; import { getEndpoint } from "@/remote-manager-driver/api-utils"; import { HttpResponseError } from "@/schemas/client-protocol/mod"; @@ -93,6 +94,7 @@ export interface MetadataResponse { | { serverless: Record } | { normal: Record }; }; + actorNames: ReturnType; /** * Endpoint that the client should connect to to access this runner. * @@ -105,7 +107,11 @@ export interface MetadataResponse { clientEndpoint?: string; } -export function handleMetadataRequest(c: HonoContext, runConfig: RunnerConfig) { +export function handleMetadataRequest( + c: HonoContext, + registryConfig: RegistryConfig, + runConfig: RunnerConfig, +) { const response: MetadataResponse = { runtime: "rivetkit", version: VERSION, @@ -115,6 +121,7 @@ export function handleMetadataRequest(c: HonoContext, runConfig: RunnerConfig) { ? { serverless: {} } : { normal: {} }, }, + actorNames: buildActorNames(registryConfig), // Do not return client endpoint if default server disabled clientEndpoint: runConfig.overrideServerAddress ?? diff --git a/packages/rivetkit/src/drivers/default.ts b/packages/rivetkit/src/drivers/default.ts index 86a491a6a..8fab1b3d6 100644 --- a/packages/rivetkit/src/drivers/default.ts +++ b/packages/rivetkit/src/drivers/default.ts @@ -18,7 +18,11 @@ export function chooseDefaultDriver(runConfig: RunnerConfig): DriverConfig { return runConfig.driver; } - if (runConfig.endpoint || runConfig.token) { + if ( + runConfig.endpoint || + runConfig.token || + runConfig.runnerKind === "serverless" + ) { loggerWithoutContext().debug({ msg: "using rivet engine driver", endpoint: runConfig.endpoint, diff --git a/packages/rivetkit/src/drivers/engine/actor-driver.ts b/packages/rivetkit/src/drivers/engine/actor-driver.ts index d08e22249..d15350688 100644 --- a/packages/rivetkit/src/drivers/engine/actor-driver.ts +++ b/packages/rivetkit/src/drivers/engine/actor-driver.ts @@ -33,7 +33,7 @@ import { type ManagerDriver, serializeEmptyPersistData, } from "@/driver-helpers/mod"; -import type { RegistryConfig } from "@/registry/config"; +import { buildActorNames, type RegistryConfig } from "@/registry/config"; import type { RunnerConfig } from "@/registry/run-config"; import { getEndpoint } from "@/remote-manager-driver/api-utils"; import { @@ -103,12 +103,7 @@ export class EngineActorDriver implements ActorDriver { metadata: { inspectorToken: this.#runConfig.inspector.token(), }, - prepopulateActorNames: Object.fromEntries( - Object.keys(this.#registryConfig.use).map((name) => [ - name, - { metadata: {} }, - ]), - ), + prepopulateActorNames: buildActorNames(registryConfig), onConnected: () => { if (hasDisconnected) { logger().info({ diff --git a/packages/rivetkit/src/manager/router.ts b/packages/rivetkit/src/manager/router.ts index 4d2e1fed0..e812a90f8 100644 --- a/packages/rivetkit/src/manager/router.ts +++ b/packages/rivetkit/src/manager/router.ts @@ -212,7 +212,9 @@ function addServerlessRoutes( router.get("/health", (c) => handleHealthRequest(c)); - router.get("/metadata", (c) => handleMetadataRequest(c, runConfig)); + router.get("/metadata", (c) => + handleMetadataRequest(c, registryConfig, runConfig), + ); } function addManagerRoutes( @@ -643,7 +645,9 @@ function addManagerRoutes( router.get("/health", (c) => handleHealthRequest(c)); - router.get("/metadata", (c) => handleMetadataRequest(c, runConfig)); + router.get("/metadata", (c) => + handleMetadataRequest(c, registryConfig, runConfig), + ); managerDriver.modifyManagerRouter?.( registryConfig, diff --git a/packages/rivetkit/src/registry/config.ts b/packages/rivetkit/src/registry/config.ts index 9a6428211..d3c023548 100644 --- a/packages/rivetkit/src/registry/config.ts +++ b/packages/rivetkit/src/registry/config.ts @@ -30,3 +30,11 @@ export type RegistryConfigInput = Omit< z.input, "use" > & { use: A }; + +export function buildActorNames( + registryConfig: RegistryConfig, +): Record }> { + return Object.fromEntries( + Object.keys(registryConfig.use).map((name) => [name, { metadata: {} }]), + ); +}