diff --git a/docs/concepts/cors.mdx b/docs/concepts/cors.mdx index 118e96115..4b4f0b3e4 100644 --- a/docs/concepts/cors.mdx +++ b/docs/concepts/cors.mdx @@ -18,7 +18,7 @@ import { setup } from "rivetkit"; import counter from "./counter"; const registry = setup({ - actors: { counter }, + use: { counter }, // Change this to match your frontend's origin cors: { origin: "https://yourdomain.com" } }); diff --git a/docs/concepts/overview.mdx b/docs/concepts/overview.mdx index 82101aefb..caff5e9f2 100644 --- a/docs/concepts/overview.mdx +++ b/docs/concepts/overview.mdx @@ -58,7 +58,7 @@ import chatRoom from "./chat_room"; // Create the application const registry = setup({ - actors: { chatRoom } + use: { chatRoom } }); // Start serving on default port diff --git a/docs/concepts/testing.mdx b/docs/concepts/testing.mdx index 9b8730952..1558261e5 100644 --- a/docs/concepts/testing.mdx +++ b/docs/concepts/testing.mdx @@ -59,7 +59,7 @@ const myActor = actor({ }); export const registry = setup({ - actors: { myActor } + use: { myActor } }); export type Registry = typeof registry; @@ -109,7 +109,7 @@ const counter = actor({ }); export const registry = setup({ - actors: { counter } + use: { counter } }); export type Registry = typeof registry; @@ -164,7 +164,7 @@ export const chatRoom = actor({ // Create and export the app export const registry = setup({ - actors: { chatRoom } + use: { chatRoom } }); // Export type for client type checking @@ -225,7 +225,7 @@ const scheduler = actor({ }); export const registry = setup({ - actors: { scheduler } + use: { scheduler } }); export type Registry = typeof registry; diff --git a/docs/integrations/better-auth.mdx b/docs/integrations/better-auth.mdx index 716cbdacf..0c256867e 100644 --- a/docs/integrations/better-auth.mdx +++ b/docs/integrations/better-auth.mdx @@ -81,7 +81,7 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); ``` diff --git a/docs/integrations/hono.mdx b/docs/integrations/hono.mdx index 543c91904..fb3c1cea2 100644 --- a/docs/integrations/hono.mdx +++ b/docs/integrations/hono.mdx @@ -11,7 +11,7 @@ When mounting the RivetKit router at a custom path, you **must** specify the sam ```typescript // Setup the RivetKit app const registry = setup({ - actors: { counter }, + use: { counter }, // IMPORTANT: Must specify the same basePath where your router is mounted basePath: "/my-path" }); @@ -46,7 +46,7 @@ honoApp.get("/hello", (c) => c.text("Hello, world!")); // Setup the RivetKit app const registry = setup({ - actors: { counter }, + use: { counter }, // IMPORTANT: Must specify the same basePath where your router is mounted basePath: "/my-path" }); @@ -122,7 +122,7 @@ honoApp.get("/hello", (c) => c.text("Hello, world!")); // Setup the RivetKit app const registry = setup({ - actors: { counter }, + use: { counter }, // IMPORTANT: Must specify the same basePath where your router is mounted basePath: "/my-path" }); @@ -174,7 +174,7 @@ honoApp.get("/hello", (c) => c.text("Hello, world!")); // Setup the RivetKit app const registry = setup({ - actors: { counter }, + use: { counter }, // IMPORTANT: Must specify the same basePath where your router is mounted basePath: "/my-path" }); diff --git a/docs/integrations/resend.mdx b/docs/integrations/resend.mdx index 404ea6d05..df63a3181 100644 --- a/docs/integrations/resend.mdx +++ b/docs/integrations/resend.mdx @@ -51,7 +51,7 @@ const user = actor({ }, }); -export const registry = setup({ actors: { user } }); +export const registry = setup({ use: { user } }); export type Registry = typeof registry; ``` diff --git a/docs/llm/prompt.mdx b/docs/llm/prompt.mdx index 00e9f0ec9..6a7a1aabd 100644 --- a/docs/llm/prompt.mdx +++ b/docs/llm/prompt.mdx @@ -134,7 +134,7 @@ When importing from workspace packages, always check the package's `package.json ## Actor Management -- App is configured with actors using `setup({ actors: { actorName }})` followed by `serve(registry)` +- App is configured with actors using `setup({ use: { actorName }})` followed by `serve(registry)` - Actors are accessed by client using `client.actorName.get()` - Actors can pass an ID parameter or object with `client.actorName.get(id)` or `client.actorName.get({key: value})` - Actors can be shut down with `c.shutdown()` from within the actor diff --git a/docs/snippets/setup-actor.mdx b/docs/snippets/setup-actor.mdx index 616e0755b..dd1a1b09c 100644 --- a/docs/snippets/setup-actor.mdx +++ b/docs/snippets/setup-actor.mdx @@ -15,7 +15,7 @@ const counter = actor({ // Create the application export const registry = setup({ - actors: { counter }, + use: { counter }, cors: { origin: "http://localhost:8080" } }); diff --git a/docs/snippets/step-define-actor.mdx b/docs/snippets/step-define-actor.mdx index 150dd8012..b35e1713d 100644 --- a/docs/snippets/step-define-actor.mdx +++ b/docs/snippets/step-define-actor.mdx @@ -18,7 +18,7 @@ // Create the application export const registry = setup({ - actors: { counter }, + use: { counter }, cors: { origin: "*" } // Configure CORS for your production domains in production }); diff --git a/docs/workers/actions.mdx b/docs/workers/actions.mdx index 5c764b660..ae560d102 100644 --- a/docs/workers/actions.mdx +++ b/docs/workers/actions.mdx @@ -104,7 +104,7 @@ const counter = actor({ // Create and export the app const registry = setup({ - actors: { counter } + use: { counter } }); export type Registry = typeof registry; diff --git a/docs/workers/overview.mdx b/docs/workers/overview.mdx index 8c88b6015..066f8bde9 100644 --- a/docs/workers/overview.mdx +++ b/docs/workers/overview.mdx @@ -78,7 +78,7 @@ import chatRoom from "./chat_room"; // Create the application const registry = setup({ - actors: { chatRoom } + use: { chatRoom } }); // Start serving on default port diff --git a/docs/workers/quickstart-frontend.mdx b/docs/workers/quickstart-frontend.mdx index e174780b2..5fb37a858 100644 --- a/docs/workers/quickstart-frontend.mdx +++ b/docs/workers/quickstart-frontend.mdx @@ -27,7 +27,7 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); ``` diff --git a/docs/workers/quickstart.mdx b/docs/workers/quickstart.mdx index 84394b223..6725736af 100644 --- a/docs/workers/quickstart.mdx +++ b/docs/workers/quickstart.mdx @@ -27,7 +27,7 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); ``` diff --git a/examples/better-auth/src/backend/registry.ts b/examples/better-auth/src/backend/registry.ts index 14abfe73d..910a28caf 100644 --- a/examples/better-auth/src/backend/registry.ts +++ b/examples/better-auth/src/backend/registry.ts @@ -42,7 +42,7 @@ // }); // // export const registry = setup({ -// actors: { chatRoom }, +// use: { chatRoom }, // }); // // export type Registry = typeof registry; diff --git a/examples/chat-room/src/workers/registry.ts b/examples/chat-room/src/workers/registry.ts index 16169e990..623fcbfc0 100644 --- a/examples/chat-room/src/workers/registry.ts +++ b/examples/chat-room/src/workers/registry.ts @@ -28,7 +28,7 @@ export const chatRoom = actor({ // Create and export the app export const registry = setup({ - actors: { chatRoom }, + use: { chatRoom }, }); // Export type for client type checking diff --git a/examples/cloudflare-workers/src/registry.ts b/examples/cloudflare-workers/src/registry.ts index 4c0f83a0f..a6d8a837e 100644 --- a/examples/cloudflare-workers/src/registry.ts +++ b/examples/cloudflare-workers/src/registry.ts @@ -14,7 +14,7 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); export type Registry = typeof registry; diff --git a/examples/counter/src/workers/registry.ts b/examples/counter/src/workers/registry.ts index e662d7e65..2801aecdf 100644 --- a/examples/counter/src/workers/registry.ts +++ b/examples/counter/src/workers/registry.ts @@ -15,7 +15,7 @@ const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); export type Registry = typeof registry; diff --git a/examples/drizzle/src/registry.ts b/examples/drizzle/src/registry.ts index 0398452d4..98a14f9cc 100644 --- a/examples/drizzle/src/registry.ts +++ b/examples/drizzle/src/registry.ts @@ -21,7 +21,7 @@ // }); // export const registry = setup({ -// actors: { counter }, +// use: { counter }, // }); // export type Registry = typeof registry; diff --git a/examples/elysia/src/registry.ts b/examples/elysia/src/registry.ts index 4c0f83a0f..a6d8a837e 100644 --- a/examples/elysia/src/registry.ts +++ b/examples/elysia/src/registry.ts @@ -14,7 +14,7 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); export type Registry = typeof registry; diff --git a/examples/express/src/registry.ts b/examples/express/src/registry.ts index 4c0f83a0f..a6d8a837e 100644 --- a/examples/express/src/registry.ts +++ b/examples/express/src/registry.ts @@ -14,7 +14,7 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); export type Registry = typeof registry; diff --git a/examples/hono-react/src/backend/registry.ts b/examples/hono-react/src/backend/registry.ts index 854e1bb74..56a5682c6 100644 --- a/examples/hono-react/src/backend/registry.ts +++ b/examples/hono-react/src/backend/registry.ts @@ -15,7 +15,7 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); export type Registry = typeof registry; diff --git a/examples/hono/src/registry.ts b/examples/hono/src/registry.ts index 4c0f83a0f..a6d8a837e 100644 --- a/examples/hono/src/registry.ts +++ b/examples/hono/src/registry.ts @@ -14,7 +14,7 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); export type Registry = typeof registry; diff --git a/examples/react/src/backend/registry.ts b/examples/react/src/backend/registry.ts index 854e1bb74..56a5682c6 100644 --- a/examples/react/src/backend/registry.ts +++ b/examples/react/src/backend/registry.ts @@ -15,7 +15,7 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); export type Registry = typeof registry; diff --git a/examples/rivet/package.json b/examples/rivet/package.json index 01b508ddb..69c960b16 100644 --- a/examples/rivet/package.json +++ b/examples/rivet/package.json @@ -14,7 +14,7 @@ "typescript": "^5.5.2" }, "dependencies": { - "@rivetkit/actor": "workspace:*" + "@rivetkit/actor": "https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4" }, "stableVersion": "0.8.0" } diff --git a/examples/rivet/src/server.ts b/examples/rivet/src/server.ts index 11163905a..3a1785274 100644 --- a/examples/rivet/src/server.ts +++ b/examples/rivet/src/server.ts @@ -1,3 +1,4 @@ import { registry } from "./registry"; +console.log("new version"); registry.runServer(); diff --git a/examples/trpc/src/registry.ts b/examples/trpc/src/registry.ts index 4c0f83a0f..a6d8a837e 100644 --- a/examples/trpc/src/registry.ts +++ b/examples/trpc/src/registry.ts @@ -14,7 +14,7 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); export type Registry = typeof registry; diff --git a/packages/core/fixtures/driver-test-suite/registry.ts b/packages/core/fixtures/driver-test-suite/registry.ts index 1bcbd33c6..797d71a98 100644 --- a/packages/core/fixtures/driver-test-suite/registry.ts +++ b/packages/core/fixtures/driver-test-suite/registry.ts @@ -38,7 +38,7 @@ import { // Consolidated setup with all actors export const registry = setup({ - actors: { + use: { // From counter.ts counter, // From lifecycle.ts diff --git a/packages/core/scripts/dump-openapi.ts b/packages/core/scripts/dump-openapi.ts index 9dc189d6f..6572454c7 100644 --- a/packages/core/scripts/dump-openapi.ts +++ b/packages/core/scripts/dump-openapi.ts @@ -14,7 +14,7 @@ import { VERSION } from "@/utils"; function main() { const registryConfig: RegistryConfig = RegistryConfigSchema.parse({ - actors: {}, + use: {}, }); const registry = setup(registryConfig); diff --git a/packages/core/src/client/actor-conn.ts b/packages/core/src/client/actor-conn.ts index df19644d5..5d49f869e 100644 --- a/packages/core/src/client/actor-conn.ts +++ b/packages/core/src/client/actor-conn.ts @@ -255,18 +255,18 @@ enc signal ? { signal } : undefined, ); this.#transport = { websocket: ws }; - ws.onopen = () => { + ws.addEventListener("open", () => { logger().debug("websocket open"); - }; - ws.onmessage = async (ev) => { + }); + ws.addEventListener("message", async (ev) => { this.#handleOnMessage(ev.data); - }; - ws.onclose = (ev) => { + }); + ws.addEventListener("close", (ev) => { this.#handleOnClose(ev); - }; - ws.onerror = (ev) => { + }); + ws.addEventListener("error", (ev) => { this.#handleOnError(); - }; + }); } async #connectSse({ signal }: { signal?: AbortSignal } = {}) { diff --git a/packages/core/src/drivers/rivet/ws-proxy.ts b/packages/core/src/drivers/rivet/ws-proxy.ts index 4a57fcaec..053f37138 100644 --- a/packages/core/src/drivers/rivet/ws-proxy.ts +++ b/packages/core/src/drivers/rivet/ws-proxy.ts @@ -26,7 +26,7 @@ export async function createWebSocketProxy( targetWs = new WebSocket(targetUrl, { headers }); // Set up target websocket handlers - targetWs.onopen = () => { + targetWs.addEventListener("open", () => { invariant(targetWs, "targetWs does not exist"); // Process any queued messages once connected @@ -37,13 +37,13 @@ export async function createWebSocketProxy( // Clear the queue after sending messageQueue.length = 0; } - }; + }); - targetWs.onmessage = (event: any) => { + targetWs.addEventListener("message", (event: any) => { wsContext.send(event.data as any); - }; + }); - targetWs.onclose = (event: any) => { + targetWs.addEventListener("close", (event: any) => { logger().debug("target websocket closed", { code: event.code, reason: event.reason, @@ -53,9 +53,9 @@ export async function createWebSocketProxy( // Forward the close code and reason from target to client wsContext.close(event.code, event.reason); } - }; + }); - targetWs.onerror = () => { + targetWs.addEventListener("error", () => { logger().warn("target websocket error"); if (wsContext.readyState === WebSocket.OPEN) { @@ -63,7 +63,7 @@ export async function createWebSocketProxy( // The connection was closed abnormally, e.g., without sending or receiving a Close control frame wsContext.close(1006, "Error in target connection"); } - }; + }); }, // Handle messages from client to target diff --git a/packages/core/src/inline-client-driver/fake-websocket.ts b/packages/core/src/inline-client-driver/fake-websocket.ts index eb4904b33..6b016a90a 100644 --- a/packages/core/src/inline-client-driver/fake-websocket.ts +++ b/packages/core/src/inline-client-driver/fake-websocket.ts @@ -22,50 +22,15 @@ export class FakeWebSocket { #wsContext: WSContext; #readyState: 0 | 1 | 2 | 3 = 0; // Start in CONNECTING state #queuedMessages: Array = []; - // Event buffering is needed since onopen/onmessage events can be fired - // before JavaScript has a chance to assign handlers (e.g. within the same tick) + // Event buffering is needed since events can be fired + // before JavaScript has a chance to add event listeners (e.g. within the same tick) #bufferedEvents: Array<{ - type: "open" | "close" | "error" | "message"; + type: string; event: any; }> = []; - // Event handlers with buffering - #onopen: ((ev: any) => void) | null = null; - #onclose: ((ev: any) => void) | null = null; - #onerror: ((ev: any) => void) | null = null; - #onmessage: ((ev: any) => void) | null = null; - - get onopen() { - return this.#onopen; - } - set onopen(handler: ((ev: any) => void) | null) { - this.#onopen = handler; - if (handler) this.#flushBufferedEvents("open"); - } - - get onclose() { - return this.#onclose; - } - set onclose(handler: ((ev: any) => void) | null) { - this.#onclose = handler; - if (handler) this.#flushBufferedEvents("close"); - } - - get onerror() { - return this.#onerror; - } - set onerror(handler: ((ev: any) => void) | null) { - this.#onerror = handler; - if (handler) this.#flushBufferedEvents("error"); - } - - get onmessage() { - return this.#onmessage; - } - set onmessage(handler: ((ev: any) => void) | null) { - this.#onmessage = handler; - if (handler) this.#flushBufferedEvents("message"); - } + // Event listeners with buffering + #eventListeners: Map void)[]> = new Map(); constructor(handler: ConnectWebSocketOutput) { this.#handler = handler; @@ -303,13 +268,7 @@ export class FakeWebSocket { } as unknown as MessageEvent; // Dispatch the event - if (this.onmessage) { - logger().debug("dispatching message to onmessage handler"); - this.onmessage(event); - } else { - logger().debug("no onmessage handler registered, buffering message"); - this.#bufferedEvents.push({ type: "message", event }); - } + this.#dispatchEvent("message", event); } #handleClose(code: number, reason: string): void { @@ -328,14 +287,47 @@ export class FakeWebSocket { } as unknown as CloseEvent; // Dispatch the event - if (this.onclose) { - this.onclose(event); + this.#dispatchEvent("close", event); + } + + addEventListener(type: string, listener: (ev: any) => void): void { + if (!this.#eventListeners.has(type)) { + this.#eventListeners.set(type, []); + } + this.#eventListeners.get(type)!.push(listener); + + // Flush any buffered events for this type + this.#flushBufferedEvents(type); + } + + removeEventListener(type: string, listener: (ev: any) => void): void { + const listeners = this.#eventListeners.get(type); + if (listeners) { + const index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + } + } + + #dispatchEvent(type: string, event: any): void { + const listeners = this.#eventListeners.get(type); + if (listeners && listeners.length > 0) { + logger().debug(`dispatching ${type} event to ${listeners.length} listeners`); + for (const listener of listeners) { + try { + listener(event); + } catch (err) { + logger().error(`error in ${type} event listener`, { error: err }); + } + } } else { - this.#bufferedEvents.push({ type: "close", event }); + logger().debug(`no ${type} listeners registered, buffering event`); + this.#bufferedEvents.push({ type, event }); } } - #flushBufferedEvents(type: "open" | "close" | "error" | "message"): void { + #flushBufferedEvents(type: string): void { const eventsToFlush = this.#bufferedEvents.filter( (buffered) => buffered.type === type, ); @@ -344,24 +336,7 @@ export class FakeWebSocket { ); for (const { event } of eventsToFlush) { - try { - switch (type) { - case "open": - this.#onopen?.(event); - break; - case "close": - this.#onclose?.(event); - break; - case "error": - this.#onerror?.(event); - break; - case "message": - this.#onmessage?.(event); - break; - } - } catch (err) { - logger().error(`error in buffered ${type} handler`, { error: err }); - } + this.#dispatchEvent(type, event); } } @@ -374,25 +349,17 @@ export class FakeWebSocket { currentTarget: this, } as unknown as Event; - if (this.onopen) { - this.onopen(event); - } else { - this.#bufferedEvents.push({ type: "open", event }); - } + this.#dispatchEvent("open", event); } catch (err) { - logger().error("error in onopen handler", { error: err }); + logger().error("error in open event", { error: err }); } } #fireClose(event: CloseEvent): void { try { - if (this.onclose) { - this.onclose(event); - } else { - this.#bufferedEvents.push({ type: "close", event }); - } + this.#dispatchEvent("close", event); } catch (err) { - logger().error("error in onclose handler", { error: err }); + logger().error("error in close event", { error: err }); } } @@ -407,13 +374,9 @@ export class FakeWebSocket { message: error instanceof Error ? error.message : String(error), } as unknown as Event; - if (this.onerror) { - this.onerror(event); - } else { - this.#bufferedEvents.push({ type: "error", event }); - } + this.#dispatchEvent("error", event); } catch (err) { - logger().error("error in onerror handler", { error: err }); + logger().error("error in error event", { error: err }); } // Log the error diff --git a/packages/core/src/manager/auth.ts b/packages/core/src/manager/auth.ts index 47738a42d..c4cb880d6 100644 --- a/packages/core/src/manager/auth.ts +++ b/packages/core/src/manager/auth.ts @@ -111,7 +111,7 @@ export async function authenticateEndpoint( // Get actor definition const actorName = await getActorNameFromQuery(c, driver, query); - const actorDefinition = registryConfig.actors[actorName]; + const actorDefinition = registryConfig.use[actorName]; if (!actorDefinition) { throw new errors.ActorNotFound(actorName); } diff --git a/packages/core/src/manager/router.ts b/packages/core/src/manager/router.ts index 96f4767f1..1096100b6 100644 --- a/packages/core/src/manager/router.ts +++ b/packages/core/src/manager/router.ts @@ -442,34 +442,37 @@ export function createManagerRouter( clientWs = await clientWsPromise; // Add message handler to forward messages from client to server - clientWs.onmessage = (clientEvt: MessageEvent) => { - logger().debug("test websocket connection message"); - - if (serverWs.readyState === 1) { - // OPEN - serverWs.send(clientEvt.data as any); - } - }; + clientWs.addEventListener( + "message", + (clientEvt: MessageEvent) => { + logger().debug("test websocket connection message"); + + if (serverWs.readyState === 1) { + // OPEN + serverWs.send(clientEvt.data as any); + } + }, + ); // Add close handler to close server when client closes - clientWs.onclose = (clientEvt: CloseEvent) => { + clientWs.addEventListener("close", (clientEvt: CloseEvent) => { logger().debug("test websocket connection closed"); if (serverWs.readyState !== 3) { // Not CLOSED serverWs.close(clientEvt.code, clientEvt.reason); } - }; + }); // Add error handler - clientWs.onerror = () => { + clientWs.addEventListener("error", () => { logger().debug("test websocket connection error"); if (serverWs.readyState !== 3) { // Not CLOSED serverWs.close(1011, "Error in client websocket"); } - }; + }); } catch (error) { logger().error( "failed to establish client websocket connection", diff --git a/packages/core/src/registry/config.ts b/packages/core/src/registry/config.ts index 08a6b4719..749445730 100644 --- a/packages/core/src/registry/config.ts +++ b/packages/core/src/registry/config.ts @@ -14,7 +14,7 @@ export type TestConfig = z.infer; /** Base config used for the actor config across all platforms. */ export const RegistryConfigSchema = z.object({ - actors: z.record(z.string(), z.custom()), + use: z.record(z.string(), z.custom()), // TODO: Find a better way of passing around the test config /** @@ -28,5 +28,5 @@ export const RegistryConfigSchema = z.object({ export type RegistryConfig = z.infer; export type RegistryConfigInput = Omit< z.input, - "actors" -> & { actors: A }; + "use" +> & { use: A }; diff --git a/packages/core/src/registry/run-config.ts b/packages/core/src/registry/run-config.ts index a12b07c52..61f86d6a3 100644 --- a/packages/core/src/registry/run-config.ts +++ b/packages/core/src/registry/run-config.ts @@ -2,7 +2,7 @@ import type { ActorDriver } from "@/actor/driver"; import { createMemoryDriver } from "@/drivers/memory/mod"; import type { ManagerDriver } from "@/manager/driver"; import type { CoordinateDriver } from "@/topologies/coordinate/driver"; -import type { UpgradeWebSocket } from "@/utils"; +import { createDefaultDriver, type UpgradeWebSocket } from "@/utils"; import type { Hono } from "hono"; import type { cors } from "hono/cors"; import { z } from "zod"; @@ -60,7 +60,7 @@ export type DriverConfig = z.infer; /** Base config used for the actor config across all platforms. */ export const RunConfigSchema = z .object({ - driver: DriverConfigSchema.optional().default(() => createMemoryDriver()), + driver: DriverConfigSchema.optional().default(() => createDefaultDriver()), // This is dynamic since NodeJS requires a reference to the router to initialize WebSockets getUpgradeWebSocket: z.custom().optional(), diff --git a/packages/core/src/topologies/coordinate/actor-peer.ts b/packages/core/src/topologies/coordinate/actor-peer.ts index bb64e6c3a..3ac011a59 100644 --- a/packages/core/src/topologies/coordinate/actor-peer.ts +++ b/packages/core/src/topologies/coordinate/actor-peer.ts @@ -217,7 +217,7 @@ export class ActorPeer { // Build actor const actorName = this.#actorName; - const definition = this.#registryConfig.actors[actorName]; + const definition = this.#registryConfig.use[actorName]; if (!definition) throw new Error(`no actor definition for name ${definition}`); diff --git a/packages/core/src/topologies/partition/topology.ts b/packages/core/src/topologies/partition/topology.ts index e85b00b2d..ea7fc27c0 100644 --- a/packages/core/src/topologies/partition/topology.ts +++ b/packages/core/src/topologies/partition/topology.ts @@ -339,7 +339,7 @@ export class PartitionTopologyActor { const actorDriver = this.#runConfig.driver.actor; // Find actor prototype - const definition = this.#registryConfig.actors[name]; + const definition = this.#registryConfig.use[name]; // TODO: Handle error here gracefully somehow if (!definition) throw new Error(`no actor in registry for name ${definition}`); diff --git a/packages/core/src/topologies/standalone/topology.ts b/packages/core/src/topologies/standalone/topology.ts index f5eaf634e..b14d30cae 100644 --- a/packages/core/src/topologies/standalone/topology.ts +++ b/packages/core/src/topologies/standalone/topology.ts @@ -142,7 +142,7 @@ export class StandaloneTopology { if (!actorMetadata) throw new Error(`No actor found for ID ${actorId}`); // Build actor - const definition = this.#registryConfig.actors[actorMetadata.name]; + const definition = this.#registryConfig.use[actorMetadata.name]; if (!definition) throw new Error(`no actor in registry for name ${definition}`); diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts index d8d6c0f4b..7db7488ac 100644 --- a/packages/core/src/utils.ts +++ b/packages/core/src/utils.ts @@ -37,7 +37,7 @@ export type UpgradeWebSocket = ( /** * Determines which driver to use if none is provided. */ -export function getDefaultDriver(): DriverConfig { +export function createDefaultDriver(): DriverConfig { const driver = getEnvUniversal("RIVETKIT_DRIVER"); console.log("driver", driver); if (!driver || driver === "memory") { diff --git a/packages/core/tests/rivet/deployment.test.ts.old b/packages/core/tests/rivet/deployment.test.ts.old index 83e58aab3..b10efb029 100644 --- a/packages/core/tests/rivet/deployment.test.ts.old +++ b/packages/core/tests/rivet/deployment.test.ts.old @@ -27,7 +27,7 @@ // }); // // export const registry = setup({ -// actors: { counter }, +// use: { counter }, // }); // // export type Registry = typeof registry; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32ed89e97..8e760b11f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -366,8 +366,8 @@ importers: examples/rivet: dependencies: '@rivetkit/actor': - specifier: workspace:* - version: link:../../packages/actor + specifier: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4 + version: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2) devDependencies: '@types/node': specifier: ^22.13.9 @@ -1769,6 +1769,29 @@ packages: '@rivet-gg/actor-core@25.2.0': resolution: {integrity: sha512-4K72XcDLVAz44Ae6G6GuyzWyxQZOLN8jM/W+sVKm6fHr70X8FNCSC5+/9hFIxz/OH9E6q6Wi3V/UN/k6immUBQ==} + '@rivetkit/actor@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4': + resolution: {tarball: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4} + version: 0.9.0-rc.1 + + '@rivetkit/core@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@cb1e6d4102ee4b3ab8861d46adbe33f50e7a4fd2': + resolution: {tarball: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@cb1e6d4102ee4b3ab8861d46adbe33f50e7a4fd2} + version: 0.9.0-rc.1 + engines: {node: '>=22.0.0'} + peerDependencies: + '@hono/node-server': ^1.14.0 + '@hono/node-ws': ^1.1.1 + eventsource: ^3.0.5 + ws: ^8.0.0 + peerDependenciesMeta: + '@hono/node-server': + optional: true + '@hono/node-ws': + optional: true + eventsource: + optional: true + ws: + optional: true + '@rolldown/pluginutils@1.0.0-beta.11': resolution: {integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==} @@ -4994,6 +5017,30 @@ snapshots: dependencies: zod: 3.25.67 + '@rivetkit/actor@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2)': + dependencies: + '@rivetkit/core': https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@cb1e6d4102ee4b3ab8861d46adbe33f50e7a4fd2(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2) + transitivePeerDependencies: + - '@hono/node-server' + - '@hono/node-ws' + - eventsource + - ws + + '@rivetkit/core@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@cb1e6d4102ee4b3ab8861d46adbe33f50e7a4fd2(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2)': + dependencies: + '@hono/zod-openapi': 0.19.8(hono@4.8.0)(zod@3.25.67) + cbor-x: 1.6.0 + hono: 4.8.0 + invariant: 2.2.4 + on-change: 5.0.1 + p-retry: 6.2.1 + zod: 3.25.67 + optionalDependencies: + '@hono/node-server': 1.14.4(hono@4.8.0) + '@hono/node-ws': 1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0) + eventsource: 3.0.7 + ws: 8.18.2 + '@rolldown/pluginutils@1.0.0-beta.11': {} '@rollup/pluginutils@5.2.0(rollup@4.44.0)':