@rivetkit/cloudflare-workers 2.0.8 → 2.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mod.cjs CHANGED
@@ -236,6 +236,7 @@ var ConfigSchema = _driverhelpers.RunConfigSchema.removeDefault().omit({ driver:
236
236
 
237
237
 
238
238
 
239
+
239
240
  var _errors = require('rivetkit/errors');
240
241
 
241
242
  // src/util.ts
@@ -513,6 +514,9 @@ Response: ${await response.text()}`
513
514
  properties: {}
514
515
  };
515
516
  }
517
+ getOrCreateInspectorAccessToken() {
518
+ return _driverhelpers.generateRandomString.call(void 0, );
519
+ }
516
520
  };
517
521
 
518
522
  // src/websocket.ts
package/dist/mod.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/nathan/rivetkit/packages/cloudflare-workers/dist/mod.cjs","../src/handler.ts","../src/actor-handler-do.ts","../src/actor-driver.ts","../src/log.ts","../src/config.ts","../src/manager-driver.ts","../src/util.ts","../src/websocket.ts"],"names":["promiseWithResolvers","invariant","env","_a","ActorHandler"],"mappings":"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","file":"/Users/nathan/rivetkit/packages/cloudflare-workers/dist/mod.cjs","sourcesContent":[null,"import { env } from \"cloudflare:workers\";\nimport type { Registry, RunConfig } from \"rivetkit\";\nimport {\n\ttype ActorHandlerInterface,\n\tcreateActorDurableObject,\n\ttype DurableObjectConstructor,\n} from \"./actor-handler-do\";\nimport { ConfigSchema, type InputConfig } from \"./config\";\nimport { CloudflareActorsManagerDriver } from \"./manager-driver\";\nimport { upgradeWebSocket } from \"./websocket\";\n\n/** Cloudflare Workers env */\nexport interface Bindings {\n\tACTOR_KV: KVNamespace;\n\tACTOR_DO: DurableObjectNamespace<ActorHandlerInterface>;\n}\n\n/**\n * Stores the env for the current request. Required since some contexts like the inline client driver does not have access to the Hono context.\n *\n * Use getCloudflareAmbientEnv unless using CF_AMBIENT_ENV.run.\n */\nexport function getCloudflareAmbientEnv(): Bindings {\n\treturn env as unknown as Bindings;\n}\n\ninterface Handler {\n\thandler: ExportedHandler<Bindings>;\n\tActorHandler: DurableObjectConstructor;\n}\n\nexport function createHandler<R extends Registry<any>>(\n\tregistry: R,\n\tinputConfig?: InputConfig,\n): Handler {\n\tconst config = ConfigSchema.parse(inputConfig);\n\n\t// Create config\n\tconst runConfig = {\n\t\t...config,\n\t\tdriver: {\n\t\t\tname: \"cloudflare-workers\",\n\t\t\tmanager: () => new CloudflareActorsManagerDriver(),\n\t\t\t// HACK: We can't build the actor driver until we're inside the Durable Object\n\t\t\tactor: undefined as any,\n\t\t},\n\t\tgetUpgradeWebSocket: () => upgradeWebSocket,\n\t} satisfies RunConfig;\n\n\t// Create Durable Object\n\tconst ActorHandler = createActorDurableObject(registry, runConfig);\n\n\t// Create server\n\tconst serverOutput = registry.start(runConfig);\n\n\t// Create Cloudflare handler\n\tconst handler = {\n\t\tfetch: (request, cfEnv, ctx) => {\n\t\t\tconst url = new URL(request.url);\n\n\t\t\t// Inject Rivet env\n\t\t\tconst env = Object.assign({ RIVET: serverOutput.client }, cfEnv);\n\n\t\t\t// Mount Rivet manager API\n\t\t\tif (url.pathname.startsWith(config.managerPath)) {\n\t\t\t\tconst strippedPath = url.pathname.substring(config.managerPath.length);\n\t\t\t\turl.pathname = strippedPath;\n\t\t\t\tconst modifiedRequest = new Request(url.toString(), request);\n\t\t\t\treturn serverOutput.fetch(modifiedRequest, env, ctx);\n\t\t\t}\n\n\t\t\tif (config.fetch) {\n\t\t\t\treturn config.fetch(request, env, ctx);\n\t\t\t} else {\n\t\t\t\treturn new Response(\n\t\t\t\t\t\"This is a RivetKit server.\\n\\nLearn more at https://rivetkit.org\\n\",\n\t\t\t\t\t{ status: 200 },\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t} satisfies ExportedHandler<Bindings>;\n\n\treturn { handler, ActorHandler };\n}\n","import { DurableObject, env } from \"cloudflare:workers\";\nimport type { ExecutionContext } from \"hono\";\nimport invariant from \"invariant\";\nimport type { ActorKey, ActorRouter, Registry, RunConfig } from \"rivetkit\";\nimport { createActorRouter, createClientWithDriver } from \"rivetkit\";\nimport type { ActorDriver } from \"rivetkit/driver-helpers\";\nimport {\n\ttype ManagerDriver,\n\tserializeEmptyPersistData,\n} from \"rivetkit/driver-helpers\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\nimport {\n\tCloudflareDurableObjectGlobalState,\n\tcreateCloudflareActorsActorDriverBuilder,\n} from \"./actor-driver\";\nimport type { Bindings } from \"./handler\";\nimport { logger } from \"./log\";\n\nexport const KEYS = {\n\tNAME: \"rivetkit:name\",\n\tKEY: \"rivetkit:key\",\n\tPERSIST_DATA: \"rivetkit:data\",\n};\n\nexport interface ActorHandlerInterface extends DurableObject {\n\tinitialize(req: ActorInitRequest): Promise<void>;\n}\n\nexport interface ActorInitRequest {\n\tname: string;\n\tkey: ActorKey;\n\tinput?: unknown;\n}\n\ninterface InitializedData {\n\tname: string;\n\tkey: ActorKey;\n}\n\nexport type DurableObjectConstructor = new (\n\t...args: ConstructorParameters<typeof DurableObject<Bindings>>\n) => DurableObject<Bindings>;\n\ninterface LoadedActor {\n\tactorRouter: ActorRouter;\n\tactorDriver: ActorDriver;\n}\n\nexport function createActorDurableObject(\n\tregistry: Registry<any>,\n\trootRunConfig: RunConfig,\n): DurableObjectConstructor {\n\tconst globalState = new CloudflareDurableObjectGlobalState();\n\n\t// Configure to use the runner role instead of server role\n\tconst runConfig = Object.assign({}, rootRunConfig, { role: \"runner\" });\n\n\t/**\n\t * Startup steps:\n\t * 1. If not already created call `initialize`, otherwise check KV to ensure it's initialized\n\t * 2. Load actor\n\t * 3. Start service requests\n\t */\n\treturn class ActorHandler\n\t\textends DurableObject<Bindings>\n\t\timplements ActorHandlerInterface\n\t{\n\t\t#initialized?: InitializedData;\n\t\t#initializedPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\n\t\t#actor?: LoadedActor;\n\n\t\tasync #loadActor(): Promise<LoadedActor> {\n\t\t\t// Wait for init\n\t\t\tif (!this.#initialized) {\n\t\t\t\t// Wait for init\n\t\t\t\tif (this.#initializedPromise) {\n\t\t\t\t\tawait this.#initializedPromise.promise;\n\t\t\t\t} else {\n\t\t\t\t\tthis.#initializedPromise = promiseWithResolvers();\n\t\t\t\t\tconst res = await this.ctx.storage.get([\n\t\t\t\t\t\tKEYS.NAME,\n\t\t\t\t\t\tKEYS.KEY,\n\t\t\t\t\t\tKEYS.PERSIST_DATA,\n\t\t\t\t\t]);\n\t\t\t\t\tif (res.get(KEYS.PERSIST_DATA)) {\n\t\t\t\t\t\tconst name = res.get(KEYS.NAME) as string;\n\t\t\t\t\t\tif (!name) throw new Error(\"missing actor name\");\n\t\t\t\t\t\tconst key = res.get(KEYS.KEY) as ActorKey;\n\t\t\t\t\t\tif (!key) throw new Error(\"missing actor key\");\n\n\t\t\t\t\t\tlogger().debug({ msg: \"already initialized\", name, key });\n\n\t\t\t\t\t\tthis.#initialized = { name, key };\n\t\t\t\t\t\tthis.#initializedPromise.resolve();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger().debug(\"waiting to initialize\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check if already loaded\n\t\t\tif (this.#actor) {\n\t\t\t\treturn this.#actor;\n\t\t\t}\n\n\t\t\tif (!this.#initialized) throw new Error(\"Not initialized\");\n\n\t\t\t// Register DO with global state first\n\t\t\t// HACK: This leaks the DO context, but DO does not provide a native way\n\t\t\t// of knowing when the DO shuts down. We're making a broad assumption\n\t\t\t// that DO will boot a new isolate frequenlty enough that this is not an issue.\n\t\t\tconst actorId = this.ctx.id.toString();\n\t\t\tglobalState.setDOState(actorId, { ctx: this.ctx, env: env });\n\n\t\t\t// Configure actor driver\n\t\t\tinvariant(runConfig.driver, \"runConfig.driver\");\n\t\t\trunConfig.driver.actor =\n\t\t\t\tcreateCloudflareActorsActorDriverBuilder(globalState);\n\n\t\t\t// Create manager driver (we need this for the actor router)\n\t\t\tconst managerDriver = runConfig.driver.manager(\n\t\t\t\tregistry.config,\n\t\t\t\trunConfig,\n\t\t\t);\n\n\t\t\tconfigureInspectorAccessToken(registry.config, managerDriver);\n\n\t\t\t// Create inline client\n\t\t\tconst inlineClient = createClientWithDriver(managerDriver);\n\n\t\t\t// Create actor driver\n\t\t\tconst actorDriver = runConfig.driver.actor(\n\t\t\t\tregistry.config,\n\t\t\t\trunConfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tinlineClient,\n\t\t\t);\n\n\t\t\t// Create actor router\n\t\t\tconst actorRouter = createActorRouter(runConfig, actorDriver, false);\n\n\t\t\t// Save actor\n\t\t\tthis.#actor = {\n\t\t\t\tactorRouter,\n\t\t\t\tactorDriver,\n\t\t\t};\n\n\t\t\t// Initialize the actor instance with proper metadata\n\t\t\t// This ensures the actor driver knows about this actor\n\t\t\tawait actorDriver.loadActor(actorId);\n\n\t\t\treturn this.#actor;\n\t\t}\n\n\t\t/** RPC called by the service that creates the DO to initialize it. */\n\t\tasync initialize(req: ActorInitRequest) {\n\t\t\t// TODO: Need to add this to a core promise that needs to be resolved before start\n\n\t\t\tawait this.ctx.storage.put({\n\t\t\t\t[KEYS.NAME]: req.name,\n\t\t\t\t[KEYS.KEY]: req.key,\n\t\t\t\t[KEYS.PERSIST_DATA]: serializeEmptyPersistData(req.input),\n\t\t\t});\n\t\t\tthis.#initialized = {\n\t\t\t\tname: req.name,\n\t\t\t\tkey: req.key,\n\t\t\t};\n\n\t\t\tlogger().debug({ msg: \"initialized actor\", key: req.key });\n\n\t\t\t// Preemptively actor so the lifecycle hooks are called\n\t\t\tawait this.#loadActor();\n\t\t}\n\n\t\tasync fetch(request: Request): Promise<Response> {\n\t\t\tconst { actorRouter } = await this.#loadActor();\n\n\t\t\tconst actorId = this.ctx.id.toString();\n\t\t\treturn await actorRouter.fetch(request, {\n\t\t\t\tactorId,\n\t\t\t});\n\t\t}\n\n\t\tasync alarm(): Promise<void> {\n\t\t\tconst { actorDriver } = await this.#loadActor();\n\t\t\tconst actorId = this.ctx.id.toString();\n\n\t\t\t// Load the actor instance and trigger alarm\n\t\t\tconst actor = await actorDriver.loadActor(actorId);\n\t\t\tawait actor._onAlarm();\n\t\t}\n\t};\n}\nfunction configureInspectorAccessToken(\n\tconfig: any,\n\tmanagerDriver: ManagerDriver,\n) {\n\tthrow new Error(\"Function not implemented.\");\n}\n","import invariant from \"invariant\";\nimport type {\n\tAnyActorInstance as CoreAnyActorInstance,\n\tRegistryConfig,\n\tRunConfig,\n} from \"rivetkit\";\nimport { lookupInRegistry } from \"rivetkit\";\nimport type { Client } from \"rivetkit/client\";\nimport type {\n\tActorDriver,\n\tAnyActorInstance,\n\tManagerDriver,\n} from \"rivetkit/driver-helpers\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\nimport { KEYS } from \"./actor-handler-do\";\n\ninterface DurableObjectGlobalState {\n\tctx: DurableObjectState;\n\tenv: unknown;\n}\n\n/**\n * Cloudflare DO can have multiple DO running within the same global scope.\n *\n * This allows for storing the actor context globally and looking it up by ID in `CloudflareActorsActorDriver`.\n */\nexport class CloudflareDurableObjectGlobalState {\n\t// Single map for all actor state\n\t#dos: Map<string, DurableObjectGlobalState> = new Map();\n\n\tgetDOState(actorId: string): DurableObjectGlobalState {\n\t\tconst state = this.#dos.get(actorId);\n\t\tinvariant(state !== undefined, \"durable object state not in global state\");\n\t\treturn state;\n\t}\n\n\tsetDOState(actorId: string, state: DurableObjectGlobalState) {\n\t\tthis.#dos.set(actorId, state);\n\t}\n}\n\nexport interface DriverContext {\n\tstate: DurableObjectState;\n}\n\n// Actor handler to track running instances\nclass ActorHandler {\n\tactor?: AnyActorInstance;\n\tactorPromise?: ReturnType<typeof promiseWithResolvers<void>> =\n\t\tpromiseWithResolvers();\n}\n\nexport class CloudflareActorsActorDriver implements ActorDriver {\n\t#registryConfig: RegistryConfig;\n\t#runConfig: RunConfig;\n\t#managerDriver: ManagerDriver;\n\t#inlineClient: Client<any>;\n\t#globalState: CloudflareDurableObjectGlobalState;\n\t#actors: Map<string, ActorHandler> = new Map();\n\n\tconstructor(\n\t\tregistryConfig: RegistryConfig,\n\t\trunConfig: RunConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: Client<any>,\n\t\tglobalState: CloudflareDurableObjectGlobalState,\n\t) {\n\t\tthis.#registryConfig = registryConfig;\n\t\tthis.#runConfig = runConfig;\n\t\tthis.#managerDriver = managerDriver;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#globalState = globalState;\n\t}\n\n\t#getDOCtx(actorId: string) {\n\t\treturn this.#globalState.getDOState(actorId).ctx;\n\t}\n\n\tasync loadActor(actorId: string): Promise<AnyActorInstance> {\n\t\t// Check if actor is already loaded\n\t\tlet handler = this.#actors.get(actorId);\n\t\tif (handler) {\n\t\t\tif (handler.actorPromise) await handler.actorPromise.promise;\n\t\t\tif (!handler.actor) throw new Error(\"Actor should be loaded\");\n\t\t\treturn handler.actor;\n\t\t}\n\n\t\t// Create new actor handler\n\t\thandler = new ActorHandler();\n\t\tthis.#actors.set(actorId, handler);\n\n\t\t// Get the actor metadata from Durable Object storage\n\t\tconst doState = this.#globalState.getDOState(actorId);\n\t\tconst storage = doState.ctx.storage;\n\n\t\t// Load actor metadata\n\t\tconst [name, key] = await Promise.all([\n\t\t\tstorage.get<string>(KEYS.NAME),\n\t\t\tstorage.get<string[]>(KEYS.KEY),\n\t\t]);\n\n\t\tif (!name) {\n\t\t\tthrow new Error(`Actor ${actorId} is not initialized - missing name`);\n\t\t}\n\t\tif (!key) {\n\t\t\tthrow new Error(`Actor ${actorId} is not initialized - missing key`);\n\t\t}\n\n\t\t// Create actor instance\n\t\tconst definition = lookupInRegistry(this.#registryConfig, name);\n\t\thandler.actor = definition.instantiate();\n\n\t\t// Start actor\n\t\tawait handler.actor.start(\n\t\t\tthis,\n\t\t\tthis.#inlineClient,\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t\t\"unknown\", // TODO: Support regions in Cloudflare\n\t\t);\n\n\t\t// Finish\n\t\thandler.actorPromise?.resolve();\n\t\thandler.actorPromise = undefined;\n\n\t\treturn handler.actor;\n\t}\n\n\tgetContext(actorId: string): DriverContext {\n\t\tconst state = this.#globalState.getDOState(actorId);\n\t\treturn { state: state.ctx };\n\t}\n\n\tasync readPersistedData(actorId: string): Promise<Uint8Array | undefined> {\n\t\treturn await this.#getDOCtx(actorId).storage.get(KEYS.PERSIST_DATA);\n\t}\n\n\tasync writePersistedData(actorId: string, data: Uint8Array): Promise<void> {\n\t\tawait this.#getDOCtx(actorId).storage.put(KEYS.PERSIST_DATA, data);\n\t}\n\n\tasync setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {\n\t\tawait this.#getDOCtx(actor.id).storage.setAlarm(timestamp);\n\t}\n\n\tasync getDatabase(actorId: string): Promise<unknown | undefined> {\n\t\treturn this.#getDOCtx(actorId).storage.sql;\n\t}\n}\n\nexport function createCloudflareActorsActorDriverBuilder(\n\tglobalState: CloudflareDurableObjectGlobalState,\n) {\n\treturn (\n\t\tregistryConfig: RegistryConfig,\n\t\trunConfig: RunConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: Client<any>,\n\t) => {\n\t\treturn new CloudflareActorsActorDriver(\n\t\t\tregistryConfig,\n\t\t\trunConfig,\n\t\t\tmanagerDriver,\n\t\t\tinlineClient,\n\t\t\tglobalState,\n\t\t);\n\t};\n}\n","import { getLogger } from \"rivetkit/log\";\n\nexport function logger() {\n\treturn getLogger(\"driver-cloudflare-workers\");\n}\n","import type { Client } from \"rivetkit\";\nimport { RunConfigSchema } from \"rivetkit/driver-helpers\";\nimport { z } from \"zod\";\n\nexport const ConfigSchema = RunConfigSchema.removeDefault()\n\t.omit({ driver: true, getUpgradeWebSocket: true })\n\t.extend({\n\t\t/** Path that the Rivet manager API will be mounted. */\n\t\tmanagerPath: z.string().optional().default(\"/rivet\"),\n\n\t\tfetch: z\n\t\t\t.custom<ExportedHandlerFetchHandler<{ RIVET: Client<any> }, unknown>>()\n\t\t\t.optional(),\n\t})\n\t.default({});\nexport type InputConfig = z.input<typeof ConfigSchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\n","import type { Context as HonoContext } from \"hono\";\nimport type { Encoding, UniversalWebSocket } from \"rivetkit\";\nimport {\n\ttype ActorOutput,\n\ttype CreateInput,\n\ttype GetForIdInput,\n\ttype GetOrCreateWithKeyInput,\n\ttype GetWithKeyInput,\n\ttype ManagerDisplayInformation,\n\ttype ManagerDriver,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_ID,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_CONN_TOKEN,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_STANDARD,\n\tWS_PROTOCOL_TARGET,\n} from \"rivetkit/driver-helpers\";\nimport { ActorAlreadyExists, InternalError } from \"rivetkit/errors\";\nimport { getCloudflareAmbientEnv } from \"./handler\";\nimport { logger } from \"./log\";\nimport type { Bindings } from \"./mod\";\nimport { serializeKey, serializeNameAndKey } from \"./util\";\n\n// Actor metadata structure\ninterface ActorData {\n\tname: string;\n\tkey: string[];\n}\n\nconst KEYS = {\n\tACTOR: {\n\t\t// Combined key for actor metadata (name and key)\n\t\tmetadata: (actorId: string) => `actor:${actorId}:metadata`,\n\n\t\t// Key index function for actor lookup\n\t\tkeyIndex: (name: string, key: string[] = []) => {\n\t\t\t// Use serializeKey for consistent handling of all keys\n\t\t\treturn `actor_key:${serializeKey(key)}`;\n\t\t},\n\t},\n};\n\nconst STANDARD_WEBSOCKET_HEADERS = [\n\t\"connection\",\n\t\"upgrade\",\n\t\"sec-websocket-key\",\n\t\"sec-websocket-version\",\n\t\"sec-websocket-protocol\",\n\t\"sec-websocket-extensions\",\n];\n\nexport class CloudflareActorsManagerDriver implements ManagerDriver {\n\tasync sendRequest(actorId: string, actorRequest: Request): Promise<Response> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({\n\t\t\tmsg: \"sending request to durable object\",\n\t\t\tactorId,\n\t\t\tmethod: actorRequest.method,\n\t\t\turl: actorRequest.url,\n\t\t});\n\n\t\tconst id = env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync openWebSocket(\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t\tconnId?: string,\n\t\tconnToken?: string,\n\t): Promise<UniversalWebSocket> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({\n\t\t\tmsg: \"opening websocket to durable object\",\n\t\t\tactorId,\n\t\t\tpath,\n\t\t});\n\n\t\t// Make a fetch request to the Durable Object with WebSocket upgrade\n\t\tconst id = env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = env.ACTOR_DO.get(id);\n\n\t\tconst protocols: string[] = [];\n\t\tprotocols.push(WS_PROTOCOL_STANDARD);\n\t\tprotocols.push(`${WS_PROTOCOL_TARGET}actor`);\n\t\tprotocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);\n\t\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\t\tif (params) {\n\t\t\tprotocols.push(\n\t\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t\t);\n\t\t}\n\t\tif (connId) {\n\t\t\tprotocols.push(`${WS_PROTOCOL_CONN_ID}${connId}`);\n\t\t}\n\t\tif (connToken) {\n\t\t\tprotocols.push(`${WS_PROTOCOL_CONN_TOKEN}${connToken}`);\n\t\t}\n\n\t\tconst headers: Record<string, string> = {\n\t\t\tUpgrade: \"websocket\",\n\t\t\tConnection: \"Upgrade\",\n\t\t\t\"sec-websocket-protocol\": protocols.join(\", \"),\n\t\t};\n\n\t\t// Use the path parameter to determine the URL\n\t\tconst normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n\t\tconst url = `http://actor${normalizedPath}`;\n\n\t\tlogger().debug({ msg: \"rewriting websocket url\", from: path, to: url });\n\n\t\tconst response = await stub.fetch(url, {\n\t\t\theaders,\n\t\t});\n\t\tconst webSocket = response.webSocket;\n\n\t\tif (!webSocket) {\n\t\t\tthrow new InternalError(\n\t\t\t\t`missing websocket connection in response from DO\\n\\nStatus: ${response.status}\\nResponse: ${await response.text()}`,\n\t\t\t);\n\t\t}\n\n\t\tlogger().debug({\n\t\t\tmsg: \"durable object websocket connection open\",\n\t\t\tactorId,\n\t\t});\n\n\t\twebSocket.accept();\n\n\t\t// TODO: Is this still needed?\n\t\t// HACK: Cloudflare does not call onopen automatically, so we need\n\t\t// to call this on the next tick\n\t\tsetTimeout(() => {\n\t\t\tconst event = new Event(\"open\");\n\t\t\t(webSocket as any).onopen?.(event);\n\t\t\t(webSocket as any).dispatchEvent(event);\n\t\t}, 0);\n\n\t\treturn webSocket as unknown as UniversalWebSocket;\n\t}\n\n\tasync proxyRequest(\n\t\tc: HonoContext<{ Bindings: Bindings }>,\n\t\tactorRequest: Request,\n\t\tactorId: string,\n\t): Promise<Response> {\n\t\tlogger().debug({\n\t\t\tmsg: \"forwarding request to durable object\",\n\t\t\tactorId,\n\t\t\tmethod: actorRequest.method,\n\t\t\turl: actorRequest.url,\n\t\t});\n\n\t\tconst id = c.env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = c.env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync proxyWebSocket(\n\t\tc: HonoContext<{ Bindings: Bindings }>,\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<Response> {\n\t\tlogger().debug({\n\t\t\tmsg: \"forwarding websocket to durable object\",\n\t\t\tactorId,\n\t\t\tpath,\n\t\t});\n\n\t\t// Validate upgrade\n\t\tconst upgradeHeader = c.req.header(\"Upgrade\");\n\t\tif (!upgradeHeader || upgradeHeader !== \"websocket\") {\n\t\t\treturn new Response(\"Expected Upgrade: websocket\", {\n\t\t\t\tstatus: 426,\n\t\t\t});\n\t\t}\n\n\t\tconst newUrl = new URL(`http://actor${path}`);\n\t\tconst actorRequest = new Request(newUrl, c.req.raw);\n\n\t\tlogger().debug({\n\t\t\tmsg: \"rewriting websocket url\",\n\t\t\tfrom: c.req.url,\n\t\t\tto: actorRequest.url,\n\t\t});\n\n\t\t// Always build fresh request to prevent forwarding unwanted headers\n\t\t// HACK: Since we can't build a new request, we need to remove\n\t\t// non-standard headers manually\n\t\tconst headerKeys: string[] = [];\n\t\tactorRequest.headers.forEach((v, k) => headerKeys.push(k));\n\t\tfor (const k of headerKeys) {\n\t\t\tif (!STANDARD_WEBSOCKET_HEADERS.includes(k)) {\n\t\t\t\tactorRequest.headers.delete(k);\n\t\t\t}\n\t\t}\n\n\t\t// Build protocols for WebSocket connection\n\t\tconst protocols: string[] = [];\n\t\tprotocols.push(WS_PROTOCOL_STANDARD);\n\t\tprotocols.push(`${WS_PROTOCOL_TARGET}actor`);\n\t\tprotocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);\n\t\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\t\tif (params) {\n\t\t\tprotocols.push(\n\t\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t\t);\n\t\t}\n\t\tactorRequest.headers.set(\"sec-websocket-protocol\", protocols.join(\", \"));\n\n\t\tconst id = c.env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = c.env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync getForId({\n\t\tc,\n\t\tactorId,\n\t}: GetForIdInput<{ Bindings: Bindings }>): Promise<ActorOutput | undefined> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\t// Get actor metadata from KV (combined name and key)\n\t\tconst actorData = (await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t})) as ActorData | null;\n\n\t\t// If the actor doesn't exist, return undefined\n\t\tif (!actorData) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname: actorData.name,\n\t\t\tkey: actorData.key,\n\t\t};\n\t}\n\n\tasync getWithKey({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t}: GetWithKeyInput<{ Bindings: Bindings }>): Promise<\n\t\tActorOutput | undefined\n\t> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({ msg: \"getWithKey: searching for actor\", name, key });\n\n\t\t// Generate deterministic ID from the name and key\n\t\t// This is aligned with how createActor generates IDs\n\t\tconst nameKeyString = serializeNameAndKey(name, key);\n\t\tconst actorId = env.ACTOR_DO.idFromName(nameKeyString).toString();\n\n\t\t// Check if the actor metadata exists\n\t\tconst actorData = await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t});\n\n\t\tif (!actorData) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"getWithKey: no actor found with matching name and key\",\n\t\t\t\tname,\n\t\t\t\tkey,\n\t\t\t\tactorId,\n\t\t\t});\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlogger().debug({\n\t\t\tmsg: \"getWithKey: found actor with matching name and key\",\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t});\n\t\treturn this.#buildActorOutput(c, actorId);\n\t}\n\n\tasync getOrCreateWithKey(\n\t\tinput: GetOrCreateWithKeyInput,\n\t): Promise<ActorOutput> {\n\t\t// TODO: Prevent race condition here\n\t\tconst getOutput = await this.getWithKey(input);\n\t\tif (getOutput) {\n\t\t\treturn getOutput;\n\t\t} else {\n\t\t\treturn await this.createActor(input);\n\t\t}\n\t}\n\n\tasync createActor({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t\tinput,\n\t}: CreateInput<{ Bindings: Bindings }>): Promise<ActorOutput> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\t// Check if actor with the same name and key already exists\n\t\tconst existingActor = await this.getWithKey({ c, name, key });\n\t\tif (existingActor) {\n\t\t\tthrow new ActorAlreadyExists(name, key);\n\t\t}\n\n\t\t// Create a deterministic ID from the actor name and key\n\t\t// This ensures that actors with the same name and key will have the same ID\n\t\tconst nameKeyString = serializeNameAndKey(name, key);\n\t\tconst doId = env.ACTOR_DO.idFromName(nameKeyString);\n\t\tconst actorId = doId.toString();\n\n\t\t// Init actor\n\t\tconst actor = env.ACTOR_DO.get(doId);\n\t\tawait actor.initialize({\n\t\t\tname,\n\t\t\tkey,\n\t\t\tinput,\n\t\t});\n\n\t\t// Store combined actor metadata (name and key)\n\t\tconst actorData: ActorData = { name, key };\n\t\tawait env.ACTOR_KV.put(\n\t\t\tKEYS.ACTOR.metadata(actorId),\n\t\t\tJSON.stringify(actorData),\n\t\t);\n\n\t\t// Add to key index for lookups by name and key\n\t\tawait env.ACTOR_KV.put(KEYS.ACTOR.keyIndex(name, key), actorId);\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t};\n\t}\n\n\t// Helper method to build actor output from an ID\n\tasync #buildActorOutput(\n\t\tc: any,\n\t\tactorId: string,\n\t): Promise<ActorOutput | undefined> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tconst actorData = (await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t})) as ActorData | null;\n\n\t\tif (!actorData) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname: actorData.name,\n\t\t\tkey: actorData.key,\n\t\t};\n\t}\n\n\tdisplayInformation(): ManagerDisplayInformation {\n\t\treturn {\n\t\t\tname: \"Cloudflare Workers\",\n\t\t\tproperties: {},\n\t\t};\n\t}\n}\n","// Constants for key handling\nexport const EMPTY_KEY = \"(none)\";\nexport const KEY_SEPARATOR = \",\";\n\n/**\n * Serializes an array of key strings into a single string for use with idFromName\n *\n * @param name The actor name\n * @param key Array of key strings to serialize\n * @returns A single string containing the serialized name and key\n */\nexport function serializeNameAndKey(name: string, key: string[]): string {\n\t// Escape colons in the name\n\tconst escapedName = name.replace(/:/g, \"\\\\:\");\n\n\t// For empty keys, just return the name and a marker\n\tif (key.length === 0) {\n\t\treturn `${escapedName}:${EMPTY_KEY}`;\n\t}\n\n\t// Serialize the key array\n\tconst serializedKey = serializeKey(key);\n\n\t// Combine name and serialized key\n\treturn `${escapedName}:${serializedKey}`;\n}\n\n/**\n * Serializes an array of key strings into a single string\n *\n * @param key Array of key strings to serialize\n * @returns A single string containing the serialized key\n */\nexport function serializeKey(key: string[]): string {\n\t// Use a special marker for empty key arrays\n\tif (key.length === 0) {\n\t\treturn EMPTY_KEY;\n\t}\n\n\t// Escape each key part to handle the separator and the empty key marker\n\tconst escapedParts = key.map((part) => {\n\t\t// First check if it matches our empty key marker\n\t\tif (part === EMPTY_KEY) {\n\t\t\treturn `\\\\${EMPTY_KEY}`;\n\t\t}\n\n\t\t// Escape backslashes first, then commas\n\t\tlet escaped = part.replace(/\\\\/g, \"\\\\\\\\\");\n\t\tescaped = escaped.replace(/,/g, \"\\\\,\");\n\t\treturn escaped;\n\t});\n\n\treturn escapedParts.join(KEY_SEPARATOR);\n}\n\n/**\n * Deserializes a key string back into an array of key strings\n *\n * @param keyString The serialized key string\n * @returns Array of key strings\n */\nexport function deserializeKey(keyString: string): string[] {\n\t// Handle empty values\n\tif (!keyString) {\n\t\treturn [];\n\t}\n\n\t// Check for special empty key marker\n\tif (keyString === EMPTY_KEY) {\n\t\treturn [];\n\t}\n\n\t// Split by unescaped commas and unescape the escaped characters\n\tconst parts: string[] = [];\n\tlet currentPart = \"\";\n\tlet escaping = false;\n\n\tfor (let i = 0; i < keyString.length; i++) {\n\t\tconst char = keyString[i];\n\n\t\tif (escaping) {\n\t\t\t// This is an escaped character, add it directly\n\t\t\tcurrentPart += char;\n\t\t\tescaping = false;\n\t\t} else if (char === \"\\\\\") {\n\t\t\t// Start of an escape sequence\n\t\t\tescaping = true;\n\t\t} else if (char === KEY_SEPARATOR) {\n\t\t\t// This is a separator\n\t\t\tparts.push(currentPart);\n\t\t\tcurrentPart = \"\";\n\t\t} else {\n\t\t\t// Regular character\n\t\t\tcurrentPart += char;\n\t\t}\n\t}\n\n\t// Add the last part if it exists\n\tif (currentPart || parts.length > 0) {\n\t\tparts.push(currentPart);\n\t}\n\n\treturn parts;\n}\n","// Modified from https://github.com/honojs/hono/blob/40ea0eee58e39b31053a0246c595434f1094ad31/src/adapter/cloudflare-workers/websocket.ts#L17\n//\n// This version calls the open event by default\n\nimport type { UpgradeWebSocket, WSEvents, WSReadyState } from \"hono/ws\";\nimport { defineWebSocketHelper, WSContext } from \"hono/ws\";\nimport { WS_PROTOCOL_STANDARD } from \"rivetkit/driver-helpers\";\n\n// Based on https://github.com/honojs/hono/issues/1153#issuecomment-1767321332\nexport const upgradeWebSocket: UpgradeWebSocket<\n\tWebSocket,\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tany,\n\tWSEvents<WebSocket>\n> = defineWebSocketHelper(async (c, events) => {\n\tconst upgradeHeader = c.req.header(\"Upgrade\");\n\tif (upgradeHeader !== \"websocket\") {\n\t\treturn;\n\t}\n\n\tconst webSocketPair = new WebSocketPair();\n\tconst client: WebSocket = webSocketPair[0];\n\tconst server: WebSocket = webSocketPair[1];\n\n\tconst wsContext = new WSContext<WebSocket>({\n\t\tclose: (code, reason) => server.close(code, reason),\n\t\tget protocol() {\n\t\t\treturn server.protocol;\n\t\t},\n\t\traw: server,\n\t\tget readyState() {\n\t\t\treturn server.readyState as WSReadyState;\n\t\t},\n\t\turl: server.url ? new URL(server.url) : null,\n\t\tsend: (source) => server.send(source),\n\t});\n\n\tif (events.onClose) {\n\t\tserver.addEventListener(\"close\", (evt: CloseEvent) =>\n\t\t\tevents.onClose?.(evt, wsContext),\n\t\t);\n\t}\n\tif (events.onMessage) {\n\t\tserver.addEventListener(\"message\", (evt: MessageEvent) =>\n\t\t\tevents.onMessage?.(evt, wsContext),\n\t\t);\n\t}\n\tif (events.onError) {\n\t\tserver.addEventListener(\"error\", (evt: Event) =>\n\t\t\tevents.onError?.(evt, wsContext),\n\t\t);\n\t}\n\n\tserver.accept?.();\n\n\t// note: cloudflare actors doesn't support 'open' event, so we call it immediately with a fake event\n\t//\n\t// we have to do this after `server.accept() is called`\n\tevents.onOpen?.(new Event(\"open\"), wsContext);\n\n\t// Build response headers\n\tconst headers: Record<string, string> = {};\n\n\t// Set Sec-WebSocket-Protocol if does not exist\n\tconst protocols = c.req.header(\"Sec-WebSocket-Protocol\");\n\tif (\n\t\ttypeof protocols === \"string\" &&\n\t\tprotocols\n\t\t\t.split(\",\")\n\t\t\t.map((x) => x.trim())\n\t\t\t.includes(WS_PROTOCOL_STANDARD)\n\t) {\n\t\theaders[\"Sec-WebSocket-Protocol\"] = WS_PROTOCOL_STANDARD;\n\t}\n\n\treturn new Response(null, {\n\t\tstatus: 101,\n\t\theaders,\n\t\twebSocket: client,\n\t});\n});\n"]}
1
+ {"version":3,"sources":["/Users/nathan/rivetkit/packages/cloudflare-workers/dist/mod.cjs","../src/handler.ts","../src/actor-handler-do.ts","../src/actor-driver.ts","../src/log.ts","../src/config.ts","../src/manager-driver.ts","../src/util.ts","../src/websocket.ts"],"names":["promiseWithResolvers","invariant","env","_a","ActorHandler"],"mappings":"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","file":"/Users/nathan/rivetkit/packages/cloudflare-workers/dist/mod.cjs","sourcesContent":[null,"import { env } from \"cloudflare:workers\";\nimport type { Registry, RunConfig } from \"rivetkit\";\nimport {\n\ttype ActorHandlerInterface,\n\tcreateActorDurableObject,\n\ttype DurableObjectConstructor,\n} from \"./actor-handler-do\";\nimport { ConfigSchema, type InputConfig } from \"./config\";\nimport { CloudflareActorsManagerDriver } from \"./manager-driver\";\nimport { upgradeWebSocket } from \"./websocket\";\n\n/** Cloudflare Workers env */\nexport interface Bindings {\n\tACTOR_KV: KVNamespace;\n\tACTOR_DO: DurableObjectNamespace<ActorHandlerInterface>;\n}\n\n/**\n * Stores the env for the current request. Required since some contexts like the inline client driver does not have access to the Hono context.\n *\n * Use getCloudflareAmbientEnv unless using CF_AMBIENT_ENV.run.\n */\nexport function getCloudflareAmbientEnv(): Bindings {\n\treturn env as unknown as Bindings;\n}\n\ninterface Handler {\n\thandler: ExportedHandler<Bindings>;\n\tActorHandler: DurableObjectConstructor;\n}\n\nexport function createHandler<R extends Registry<any>>(\n\tregistry: R,\n\tinputConfig?: InputConfig,\n): Handler {\n\tconst config = ConfigSchema.parse(inputConfig);\n\n\t// Create config\n\tconst runConfig = {\n\t\t...config,\n\t\tdriver: {\n\t\t\tname: \"cloudflare-workers\",\n\t\t\tmanager: () => new CloudflareActorsManagerDriver(),\n\t\t\t// HACK: We can't build the actor driver until we're inside the Durable Object\n\t\t\tactor: undefined as any,\n\t\t},\n\t\tgetUpgradeWebSocket: () => upgradeWebSocket,\n\t} satisfies RunConfig;\n\n\t// Create Durable Object\n\tconst ActorHandler = createActorDurableObject(registry, runConfig);\n\n\t// Create server\n\tconst serverOutput = registry.start(runConfig);\n\n\t// Create Cloudflare handler\n\tconst handler = {\n\t\tfetch: (request, cfEnv, ctx) => {\n\t\t\tconst url = new URL(request.url);\n\n\t\t\t// Inject Rivet env\n\t\t\tconst env = Object.assign({ RIVET: serverOutput.client }, cfEnv);\n\n\t\t\t// Mount Rivet manager API\n\t\t\tif (url.pathname.startsWith(config.managerPath)) {\n\t\t\t\tconst strippedPath = url.pathname.substring(config.managerPath.length);\n\t\t\t\turl.pathname = strippedPath;\n\t\t\t\tconst modifiedRequest = new Request(url.toString(), request);\n\t\t\t\treturn serverOutput.fetch(modifiedRequest, env, ctx);\n\t\t\t}\n\n\t\t\tif (config.fetch) {\n\t\t\t\treturn config.fetch(request, env, ctx);\n\t\t\t} else {\n\t\t\t\treturn new Response(\n\t\t\t\t\t\"This is a RivetKit server.\\n\\nLearn more at https://rivetkit.org\\n\",\n\t\t\t\t\t{ status: 200 },\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t} satisfies ExportedHandler<Bindings>;\n\n\treturn { handler, ActorHandler };\n}\n","import { DurableObject, env } from \"cloudflare:workers\";\nimport type { ExecutionContext } from \"hono\";\nimport invariant from \"invariant\";\nimport type { ActorKey, ActorRouter, Registry, RunConfig } from \"rivetkit\";\nimport { createActorRouter, createClientWithDriver } from \"rivetkit\";\nimport type { ActorDriver } from \"rivetkit/driver-helpers\";\nimport {\n\ttype ManagerDriver,\n\tserializeEmptyPersistData,\n} from \"rivetkit/driver-helpers\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\nimport {\n\tCloudflareDurableObjectGlobalState,\n\tcreateCloudflareActorsActorDriverBuilder,\n} from \"./actor-driver\";\nimport type { Bindings } from \"./handler\";\nimport { logger } from \"./log\";\n\nexport const KEYS = {\n\tNAME: \"rivetkit:name\",\n\tKEY: \"rivetkit:key\",\n\tPERSIST_DATA: \"rivetkit:data\",\n};\n\nexport interface ActorHandlerInterface extends DurableObject {\n\tinitialize(req: ActorInitRequest): Promise<void>;\n}\n\nexport interface ActorInitRequest {\n\tname: string;\n\tkey: ActorKey;\n\tinput?: unknown;\n}\n\ninterface InitializedData {\n\tname: string;\n\tkey: ActorKey;\n}\n\nexport type DurableObjectConstructor = new (\n\t...args: ConstructorParameters<typeof DurableObject<Bindings>>\n) => DurableObject<Bindings>;\n\ninterface LoadedActor {\n\tactorRouter: ActorRouter;\n\tactorDriver: ActorDriver;\n}\n\nexport function createActorDurableObject(\n\tregistry: Registry<any>,\n\trootRunConfig: RunConfig,\n): DurableObjectConstructor {\n\tconst globalState = new CloudflareDurableObjectGlobalState();\n\n\t// Configure to use the runner role instead of server role\n\tconst runConfig = Object.assign({}, rootRunConfig, { role: \"runner\" });\n\n\t/**\n\t * Startup steps:\n\t * 1. If not already created call `initialize`, otherwise check KV to ensure it's initialized\n\t * 2. Load actor\n\t * 3. Start service requests\n\t */\n\treturn class ActorHandler\n\t\textends DurableObject<Bindings>\n\t\timplements ActorHandlerInterface\n\t{\n\t\t#initialized?: InitializedData;\n\t\t#initializedPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\n\t\t#actor?: LoadedActor;\n\n\t\tasync #loadActor(): Promise<LoadedActor> {\n\t\t\t// Wait for init\n\t\t\tif (!this.#initialized) {\n\t\t\t\t// Wait for init\n\t\t\t\tif (this.#initializedPromise) {\n\t\t\t\t\tawait this.#initializedPromise.promise;\n\t\t\t\t} else {\n\t\t\t\t\tthis.#initializedPromise = promiseWithResolvers();\n\t\t\t\t\tconst res = await this.ctx.storage.get([\n\t\t\t\t\t\tKEYS.NAME,\n\t\t\t\t\t\tKEYS.KEY,\n\t\t\t\t\t\tKEYS.PERSIST_DATA,\n\t\t\t\t\t]);\n\t\t\t\t\tif (res.get(KEYS.PERSIST_DATA)) {\n\t\t\t\t\t\tconst name = res.get(KEYS.NAME) as string;\n\t\t\t\t\t\tif (!name) throw new Error(\"missing actor name\");\n\t\t\t\t\t\tconst key = res.get(KEYS.KEY) as ActorKey;\n\t\t\t\t\t\tif (!key) throw new Error(\"missing actor key\");\n\n\t\t\t\t\t\tlogger().debug({ msg: \"already initialized\", name, key });\n\n\t\t\t\t\t\tthis.#initialized = { name, key };\n\t\t\t\t\t\tthis.#initializedPromise.resolve();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger().debug(\"waiting to initialize\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check if already loaded\n\t\t\tif (this.#actor) {\n\t\t\t\treturn this.#actor;\n\t\t\t}\n\n\t\t\tif (!this.#initialized) throw new Error(\"Not initialized\");\n\n\t\t\t// Register DO with global state first\n\t\t\t// HACK: This leaks the DO context, but DO does not provide a native way\n\t\t\t// of knowing when the DO shuts down. We're making a broad assumption\n\t\t\t// that DO will boot a new isolate frequenlty enough that this is not an issue.\n\t\t\tconst actorId = this.ctx.id.toString();\n\t\t\tglobalState.setDOState(actorId, { ctx: this.ctx, env: env });\n\n\t\t\t// Configure actor driver\n\t\t\tinvariant(runConfig.driver, \"runConfig.driver\");\n\t\t\trunConfig.driver.actor =\n\t\t\t\tcreateCloudflareActorsActorDriverBuilder(globalState);\n\n\t\t\t// Create manager driver (we need this for the actor router)\n\t\t\tconst managerDriver = runConfig.driver.manager(\n\t\t\t\tregistry.config,\n\t\t\t\trunConfig,\n\t\t\t);\n\n\t\t\tconfigureInspectorAccessToken(registry.config, managerDriver);\n\n\t\t\t// Create inline client\n\t\t\tconst inlineClient = createClientWithDriver(managerDriver);\n\n\t\t\t// Create actor driver\n\t\t\tconst actorDriver = runConfig.driver.actor(\n\t\t\t\tregistry.config,\n\t\t\t\trunConfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tinlineClient,\n\t\t\t);\n\n\t\t\t// Create actor router\n\t\t\tconst actorRouter = createActorRouter(runConfig, actorDriver, false);\n\n\t\t\t// Save actor\n\t\t\tthis.#actor = {\n\t\t\t\tactorRouter,\n\t\t\t\tactorDriver,\n\t\t\t};\n\n\t\t\t// Initialize the actor instance with proper metadata\n\t\t\t// This ensures the actor driver knows about this actor\n\t\t\tawait actorDriver.loadActor(actorId);\n\n\t\t\treturn this.#actor;\n\t\t}\n\n\t\t/** RPC called by the service that creates the DO to initialize it. */\n\t\tasync initialize(req: ActorInitRequest) {\n\t\t\t// TODO: Need to add this to a core promise that needs to be resolved before start\n\n\t\t\tawait this.ctx.storage.put({\n\t\t\t\t[KEYS.NAME]: req.name,\n\t\t\t\t[KEYS.KEY]: req.key,\n\t\t\t\t[KEYS.PERSIST_DATA]: serializeEmptyPersistData(req.input),\n\t\t\t});\n\t\t\tthis.#initialized = {\n\t\t\t\tname: req.name,\n\t\t\t\tkey: req.key,\n\t\t\t};\n\n\t\t\tlogger().debug({ msg: \"initialized actor\", key: req.key });\n\n\t\t\t// Preemptively actor so the lifecycle hooks are called\n\t\t\tawait this.#loadActor();\n\t\t}\n\n\t\tasync fetch(request: Request): Promise<Response> {\n\t\t\tconst { actorRouter } = await this.#loadActor();\n\n\t\t\tconst actorId = this.ctx.id.toString();\n\t\t\treturn await actorRouter.fetch(request, {\n\t\t\t\tactorId,\n\t\t\t});\n\t\t}\n\n\t\tasync alarm(): Promise<void> {\n\t\t\tconst { actorDriver } = await this.#loadActor();\n\t\t\tconst actorId = this.ctx.id.toString();\n\n\t\t\t// Load the actor instance and trigger alarm\n\t\t\tconst actor = await actorDriver.loadActor(actorId);\n\t\t\tawait actor._onAlarm();\n\t\t}\n\t};\n}\nfunction configureInspectorAccessToken(\n\tconfig: any,\n\tmanagerDriver: ManagerDriver,\n) {\n\tthrow new Error(\"Function not implemented.\");\n}\n","import invariant from \"invariant\";\nimport type {\n\tAnyActorInstance as CoreAnyActorInstance,\n\tRegistryConfig,\n\tRunConfig,\n} from \"rivetkit\";\nimport { lookupInRegistry } from \"rivetkit\";\nimport type { Client } from \"rivetkit/client\";\nimport type {\n\tActorDriver,\n\tAnyActorInstance,\n\tManagerDriver,\n} from \"rivetkit/driver-helpers\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\nimport { KEYS } from \"./actor-handler-do\";\n\ninterface DurableObjectGlobalState {\n\tctx: DurableObjectState;\n\tenv: unknown;\n}\n\n/**\n * Cloudflare DO can have multiple DO running within the same global scope.\n *\n * This allows for storing the actor context globally and looking it up by ID in `CloudflareActorsActorDriver`.\n */\nexport class CloudflareDurableObjectGlobalState {\n\t// Single map for all actor state\n\t#dos: Map<string, DurableObjectGlobalState> = new Map();\n\n\tgetDOState(actorId: string): DurableObjectGlobalState {\n\t\tconst state = this.#dos.get(actorId);\n\t\tinvariant(state !== undefined, \"durable object state not in global state\");\n\t\treturn state;\n\t}\n\n\tsetDOState(actorId: string, state: DurableObjectGlobalState) {\n\t\tthis.#dos.set(actorId, state);\n\t}\n}\n\nexport interface DriverContext {\n\tstate: DurableObjectState;\n}\n\n// Actor handler to track running instances\nclass ActorHandler {\n\tactor?: AnyActorInstance;\n\tactorPromise?: ReturnType<typeof promiseWithResolvers<void>> =\n\t\tpromiseWithResolvers();\n}\n\nexport class CloudflareActorsActorDriver implements ActorDriver {\n\t#registryConfig: RegistryConfig;\n\t#runConfig: RunConfig;\n\t#managerDriver: ManagerDriver;\n\t#inlineClient: Client<any>;\n\t#globalState: CloudflareDurableObjectGlobalState;\n\t#actors: Map<string, ActorHandler> = new Map();\n\n\tconstructor(\n\t\tregistryConfig: RegistryConfig,\n\t\trunConfig: RunConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: Client<any>,\n\t\tglobalState: CloudflareDurableObjectGlobalState,\n\t) {\n\t\tthis.#registryConfig = registryConfig;\n\t\tthis.#runConfig = runConfig;\n\t\tthis.#managerDriver = managerDriver;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#globalState = globalState;\n\t}\n\n\t#getDOCtx(actorId: string) {\n\t\treturn this.#globalState.getDOState(actorId).ctx;\n\t}\n\n\tasync loadActor(actorId: string): Promise<AnyActorInstance> {\n\t\t// Check if actor is already loaded\n\t\tlet handler = this.#actors.get(actorId);\n\t\tif (handler) {\n\t\t\tif (handler.actorPromise) await handler.actorPromise.promise;\n\t\t\tif (!handler.actor) throw new Error(\"Actor should be loaded\");\n\t\t\treturn handler.actor;\n\t\t}\n\n\t\t// Create new actor handler\n\t\thandler = new ActorHandler();\n\t\tthis.#actors.set(actorId, handler);\n\n\t\t// Get the actor metadata from Durable Object storage\n\t\tconst doState = this.#globalState.getDOState(actorId);\n\t\tconst storage = doState.ctx.storage;\n\n\t\t// Load actor metadata\n\t\tconst [name, key] = await Promise.all([\n\t\t\tstorage.get<string>(KEYS.NAME),\n\t\t\tstorage.get<string[]>(KEYS.KEY),\n\t\t]);\n\n\t\tif (!name) {\n\t\t\tthrow new Error(`Actor ${actorId} is not initialized - missing name`);\n\t\t}\n\t\tif (!key) {\n\t\t\tthrow new Error(`Actor ${actorId} is not initialized - missing key`);\n\t\t}\n\n\t\t// Create actor instance\n\t\tconst definition = lookupInRegistry(this.#registryConfig, name);\n\t\thandler.actor = definition.instantiate();\n\n\t\t// Start actor\n\t\tawait handler.actor.start(\n\t\t\tthis,\n\t\t\tthis.#inlineClient,\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t\t\"unknown\", // TODO: Support regions in Cloudflare\n\t\t);\n\n\t\t// Finish\n\t\thandler.actorPromise?.resolve();\n\t\thandler.actorPromise = undefined;\n\n\t\treturn handler.actor;\n\t}\n\n\tgetContext(actorId: string): DriverContext {\n\t\tconst state = this.#globalState.getDOState(actorId);\n\t\treturn { state: state.ctx };\n\t}\n\n\tasync readPersistedData(actorId: string): Promise<Uint8Array | undefined> {\n\t\treturn await this.#getDOCtx(actorId).storage.get(KEYS.PERSIST_DATA);\n\t}\n\n\tasync writePersistedData(actorId: string, data: Uint8Array): Promise<void> {\n\t\tawait this.#getDOCtx(actorId).storage.put(KEYS.PERSIST_DATA, data);\n\t}\n\n\tasync setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {\n\t\tawait this.#getDOCtx(actor.id).storage.setAlarm(timestamp);\n\t}\n\n\tasync getDatabase(actorId: string): Promise<unknown | undefined> {\n\t\treturn this.#getDOCtx(actorId).storage.sql;\n\t}\n}\n\nexport function createCloudflareActorsActorDriverBuilder(\n\tglobalState: CloudflareDurableObjectGlobalState,\n) {\n\treturn (\n\t\tregistryConfig: RegistryConfig,\n\t\trunConfig: RunConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: Client<any>,\n\t) => {\n\t\treturn new CloudflareActorsActorDriver(\n\t\t\tregistryConfig,\n\t\t\trunConfig,\n\t\t\tmanagerDriver,\n\t\t\tinlineClient,\n\t\t\tglobalState,\n\t\t);\n\t};\n}\n","import { getLogger } from \"rivetkit/log\";\n\nexport function logger() {\n\treturn getLogger(\"driver-cloudflare-workers\");\n}\n","import type { Client } from \"rivetkit\";\nimport { RunConfigSchema } from \"rivetkit/driver-helpers\";\nimport { z } from \"zod\";\n\nexport const ConfigSchema = RunConfigSchema.removeDefault()\n\t.omit({ driver: true, getUpgradeWebSocket: true })\n\t.extend({\n\t\t/** Path that the Rivet manager API will be mounted. */\n\t\tmanagerPath: z.string().optional().default(\"/rivet\"),\n\n\t\tfetch: z\n\t\t\t.custom<ExportedHandlerFetchHandler<{ RIVET: Client<any> }, unknown>>()\n\t\t\t.optional(),\n\t})\n\t.default({});\nexport type InputConfig = z.input<typeof ConfigSchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\n","import type { Context as HonoContext } from \"hono\";\nimport type { Encoding, UniversalWebSocket } from \"rivetkit\";\nimport {\n\ttype ActorOutput,\n\ttype CreateInput,\n\ttype GetForIdInput,\n\ttype GetOrCreateWithKeyInput,\n\ttype GetWithKeyInput,\n\tgenerateRandomString,\n\ttype ManagerDisplayInformation,\n\ttype ManagerDriver,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_ID,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_CONN_TOKEN,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_STANDARD,\n\tWS_PROTOCOL_TARGET,\n} from \"rivetkit/driver-helpers\";\nimport { ActorAlreadyExists, InternalError } from \"rivetkit/errors\";\nimport { getCloudflareAmbientEnv } from \"./handler\";\nimport { logger } from \"./log\";\nimport type { Bindings } from \"./mod\";\nimport { serializeKey, serializeNameAndKey } from \"./util\";\n\n// Actor metadata structure\ninterface ActorData {\n\tname: string;\n\tkey: string[];\n}\n\nconst KEYS = {\n\tACTOR: {\n\t\t// Combined key for actor metadata (name and key)\n\t\tmetadata: (actorId: string) => `actor:${actorId}:metadata`,\n\n\t\t// Key index function for actor lookup\n\t\tkeyIndex: (name: string, key: string[] = []) => {\n\t\t\t// Use serializeKey for consistent handling of all keys\n\t\t\treturn `actor_key:${serializeKey(key)}`;\n\t\t},\n\t},\n};\n\nconst STANDARD_WEBSOCKET_HEADERS = [\n\t\"connection\",\n\t\"upgrade\",\n\t\"sec-websocket-key\",\n\t\"sec-websocket-version\",\n\t\"sec-websocket-protocol\",\n\t\"sec-websocket-extensions\",\n];\n\nexport class CloudflareActorsManagerDriver implements ManagerDriver {\n\tasync sendRequest(actorId: string, actorRequest: Request): Promise<Response> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({\n\t\t\tmsg: \"sending request to durable object\",\n\t\t\tactorId,\n\t\t\tmethod: actorRequest.method,\n\t\t\turl: actorRequest.url,\n\t\t});\n\n\t\tconst id = env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync openWebSocket(\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t\tconnId?: string,\n\t\tconnToken?: string,\n\t): Promise<UniversalWebSocket> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({\n\t\t\tmsg: \"opening websocket to durable object\",\n\t\t\tactorId,\n\t\t\tpath,\n\t\t});\n\n\t\t// Make a fetch request to the Durable Object with WebSocket upgrade\n\t\tconst id = env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = env.ACTOR_DO.get(id);\n\n\t\tconst protocols: string[] = [];\n\t\tprotocols.push(WS_PROTOCOL_STANDARD);\n\t\tprotocols.push(`${WS_PROTOCOL_TARGET}actor`);\n\t\tprotocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);\n\t\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\t\tif (params) {\n\t\t\tprotocols.push(\n\t\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t\t);\n\t\t}\n\t\tif (connId) {\n\t\t\tprotocols.push(`${WS_PROTOCOL_CONN_ID}${connId}`);\n\t\t}\n\t\tif (connToken) {\n\t\t\tprotocols.push(`${WS_PROTOCOL_CONN_TOKEN}${connToken}`);\n\t\t}\n\n\t\tconst headers: Record<string, string> = {\n\t\t\tUpgrade: \"websocket\",\n\t\t\tConnection: \"Upgrade\",\n\t\t\t\"sec-websocket-protocol\": protocols.join(\", \"),\n\t\t};\n\n\t\t// Use the path parameter to determine the URL\n\t\tconst normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n\t\tconst url = `http://actor${normalizedPath}`;\n\n\t\tlogger().debug({ msg: \"rewriting websocket url\", from: path, to: url });\n\n\t\tconst response = await stub.fetch(url, {\n\t\t\theaders,\n\t\t});\n\t\tconst webSocket = response.webSocket;\n\n\t\tif (!webSocket) {\n\t\t\tthrow new InternalError(\n\t\t\t\t`missing websocket connection in response from DO\\n\\nStatus: ${response.status}\\nResponse: ${await response.text()}`,\n\t\t\t);\n\t\t}\n\n\t\tlogger().debug({\n\t\t\tmsg: \"durable object websocket connection open\",\n\t\t\tactorId,\n\t\t});\n\n\t\twebSocket.accept();\n\n\t\t// TODO: Is this still needed?\n\t\t// HACK: Cloudflare does not call onopen automatically, so we need\n\t\t// to call this on the next tick\n\t\tsetTimeout(() => {\n\t\t\tconst event = new Event(\"open\");\n\t\t\t(webSocket as any).onopen?.(event);\n\t\t\t(webSocket as any).dispatchEvent(event);\n\t\t}, 0);\n\n\t\treturn webSocket as unknown as UniversalWebSocket;\n\t}\n\n\tasync proxyRequest(\n\t\tc: HonoContext<{ Bindings: Bindings }>,\n\t\tactorRequest: Request,\n\t\tactorId: string,\n\t): Promise<Response> {\n\t\tlogger().debug({\n\t\t\tmsg: \"forwarding request to durable object\",\n\t\t\tactorId,\n\t\t\tmethod: actorRequest.method,\n\t\t\turl: actorRequest.url,\n\t\t});\n\n\t\tconst id = c.env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = c.env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync proxyWebSocket(\n\t\tc: HonoContext<{ Bindings: Bindings }>,\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<Response> {\n\t\tlogger().debug({\n\t\t\tmsg: \"forwarding websocket to durable object\",\n\t\t\tactorId,\n\t\t\tpath,\n\t\t});\n\n\t\t// Validate upgrade\n\t\tconst upgradeHeader = c.req.header(\"Upgrade\");\n\t\tif (!upgradeHeader || upgradeHeader !== \"websocket\") {\n\t\t\treturn new Response(\"Expected Upgrade: websocket\", {\n\t\t\t\tstatus: 426,\n\t\t\t});\n\t\t}\n\n\t\tconst newUrl = new URL(`http://actor${path}`);\n\t\tconst actorRequest = new Request(newUrl, c.req.raw);\n\n\t\tlogger().debug({\n\t\t\tmsg: \"rewriting websocket url\",\n\t\t\tfrom: c.req.url,\n\t\t\tto: actorRequest.url,\n\t\t});\n\n\t\t// Always build fresh request to prevent forwarding unwanted headers\n\t\t// HACK: Since we can't build a new request, we need to remove\n\t\t// non-standard headers manually\n\t\tconst headerKeys: string[] = [];\n\t\tactorRequest.headers.forEach((v, k) => headerKeys.push(k));\n\t\tfor (const k of headerKeys) {\n\t\t\tif (!STANDARD_WEBSOCKET_HEADERS.includes(k)) {\n\t\t\t\tactorRequest.headers.delete(k);\n\t\t\t}\n\t\t}\n\n\t\t// Build protocols for WebSocket connection\n\t\tconst protocols: string[] = [];\n\t\tprotocols.push(WS_PROTOCOL_STANDARD);\n\t\tprotocols.push(`${WS_PROTOCOL_TARGET}actor`);\n\t\tprotocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);\n\t\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\t\tif (params) {\n\t\t\tprotocols.push(\n\t\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t\t);\n\t\t}\n\t\tactorRequest.headers.set(\"sec-websocket-protocol\", protocols.join(\", \"));\n\n\t\tconst id = c.env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = c.env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync getForId({\n\t\tc,\n\t\tactorId,\n\t}: GetForIdInput<{ Bindings: Bindings }>): Promise<ActorOutput | undefined> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\t// Get actor metadata from KV (combined name and key)\n\t\tconst actorData = (await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t})) as ActorData | null;\n\n\t\t// If the actor doesn't exist, return undefined\n\t\tif (!actorData) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname: actorData.name,\n\t\t\tkey: actorData.key,\n\t\t};\n\t}\n\n\tasync getWithKey({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t}: GetWithKeyInput<{ Bindings: Bindings }>): Promise<\n\t\tActorOutput | undefined\n\t> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({ msg: \"getWithKey: searching for actor\", name, key });\n\n\t\t// Generate deterministic ID from the name and key\n\t\t// This is aligned with how createActor generates IDs\n\t\tconst nameKeyString = serializeNameAndKey(name, key);\n\t\tconst actorId = env.ACTOR_DO.idFromName(nameKeyString).toString();\n\n\t\t// Check if the actor metadata exists\n\t\tconst actorData = await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t});\n\n\t\tif (!actorData) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"getWithKey: no actor found with matching name and key\",\n\t\t\t\tname,\n\t\t\t\tkey,\n\t\t\t\tactorId,\n\t\t\t});\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlogger().debug({\n\t\t\tmsg: \"getWithKey: found actor with matching name and key\",\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t});\n\t\treturn this.#buildActorOutput(c, actorId);\n\t}\n\n\tasync getOrCreateWithKey(\n\t\tinput: GetOrCreateWithKeyInput,\n\t): Promise<ActorOutput> {\n\t\t// TODO: Prevent race condition here\n\t\tconst getOutput = await this.getWithKey(input);\n\t\tif (getOutput) {\n\t\t\treturn getOutput;\n\t\t} else {\n\t\t\treturn await this.createActor(input);\n\t\t}\n\t}\n\n\tasync createActor({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t\tinput,\n\t}: CreateInput<{ Bindings: Bindings }>): Promise<ActorOutput> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\t// Check if actor with the same name and key already exists\n\t\tconst existingActor = await this.getWithKey({ c, name, key });\n\t\tif (existingActor) {\n\t\t\tthrow new ActorAlreadyExists(name, key);\n\t\t}\n\n\t\t// Create a deterministic ID from the actor name and key\n\t\t// This ensures that actors with the same name and key will have the same ID\n\t\tconst nameKeyString = serializeNameAndKey(name, key);\n\t\tconst doId = env.ACTOR_DO.idFromName(nameKeyString);\n\t\tconst actorId = doId.toString();\n\n\t\t// Init actor\n\t\tconst actor = env.ACTOR_DO.get(doId);\n\t\tawait actor.initialize({\n\t\t\tname,\n\t\t\tkey,\n\t\t\tinput,\n\t\t});\n\n\t\t// Store combined actor metadata (name and key)\n\t\tconst actorData: ActorData = { name, key };\n\t\tawait env.ACTOR_KV.put(\n\t\t\tKEYS.ACTOR.metadata(actorId),\n\t\t\tJSON.stringify(actorData),\n\t\t);\n\n\t\t// Add to key index for lookups by name and key\n\t\tawait env.ACTOR_KV.put(KEYS.ACTOR.keyIndex(name, key), actorId);\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t};\n\t}\n\n\t// Helper method to build actor output from an ID\n\tasync #buildActorOutput(\n\t\tc: any,\n\t\tactorId: string,\n\t): Promise<ActorOutput | undefined> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tconst actorData = (await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t})) as ActorData | null;\n\n\t\tif (!actorData) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname: actorData.name,\n\t\t\tkey: actorData.key,\n\t\t};\n\t}\n\n\tdisplayInformation(): ManagerDisplayInformation {\n\t\treturn {\n\t\t\tname: \"Cloudflare Workers\",\n\t\t\tproperties: {},\n\t\t};\n\t}\n\n\tgetOrCreateInspectorAccessToken() {\n\t\treturn generateRandomString();\n\t}\n}\n","// Constants for key handling\nexport const EMPTY_KEY = \"(none)\";\nexport const KEY_SEPARATOR = \",\";\n\n/**\n * Serializes an array of key strings into a single string for use with idFromName\n *\n * @param name The actor name\n * @param key Array of key strings to serialize\n * @returns A single string containing the serialized name and key\n */\nexport function serializeNameAndKey(name: string, key: string[]): string {\n\t// Escape colons in the name\n\tconst escapedName = name.replace(/:/g, \"\\\\:\");\n\n\t// For empty keys, just return the name and a marker\n\tif (key.length === 0) {\n\t\treturn `${escapedName}:${EMPTY_KEY}`;\n\t}\n\n\t// Serialize the key array\n\tconst serializedKey = serializeKey(key);\n\n\t// Combine name and serialized key\n\treturn `${escapedName}:${serializedKey}`;\n}\n\n/**\n * Serializes an array of key strings into a single string\n *\n * @param key Array of key strings to serialize\n * @returns A single string containing the serialized key\n */\nexport function serializeKey(key: string[]): string {\n\t// Use a special marker for empty key arrays\n\tif (key.length === 0) {\n\t\treturn EMPTY_KEY;\n\t}\n\n\t// Escape each key part to handle the separator and the empty key marker\n\tconst escapedParts = key.map((part) => {\n\t\t// First check if it matches our empty key marker\n\t\tif (part === EMPTY_KEY) {\n\t\t\treturn `\\\\${EMPTY_KEY}`;\n\t\t}\n\n\t\t// Escape backslashes first, then commas\n\t\tlet escaped = part.replace(/\\\\/g, \"\\\\\\\\\");\n\t\tescaped = escaped.replace(/,/g, \"\\\\,\");\n\t\treturn escaped;\n\t});\n\n\treturn escapedParts.join(KEY_SEPARATOR);\n}\n\n/**\n * Deserializes a key string back into an array of key strings\n *\n * @param keyString The serialized key string\n * @returns Array of key strings\n */\nexport function deserializeKey(keyString: string): string[] {\n\t// Handle empty values\n\tif (!keyString) {\n\t\treturn [];\n\t}\n\n\t// Check for special empty key marker\n\tif (keyString === EMPTY_KEY) {\n\t\treturn [];\n\t}\n\n\t// Split by unescaped commas and unescape the escaped characters\n\tconst parts: string[] = [];\n\tlet currentPart = \"\";\n\tlet escaping = false;\n\n\tfor (let i = 0; i < keyString.length; i++) {\n\t\tconst char = keyString[i];\n\n\t\tif (escaping) {\n\t\t\t// This is an escaped character, add it directly\n\t\t\tcurrentPart += char;\n\t\t\tescaping = false;\n\t\t} else if (char === \"\\\\\") {\n\t\t\t// Start of an escape sequence\n\t\t\tescaping = true;\n\t\t} else if (char === KEY_SEPARATOR) {\n\t\t\t// This is a separator\n\t\t\tparts.push(currentPart);\n\t\t\tcurrentPart = \"\";\n\t\t} else {\n\t\t\t// Regular character\n\t\t\tcurrentPart += char;\n\t\t}\n\t}\n\n\t// Add the last part if it exists\n\tif (currentPart || parts.length > 0) {\n\t\tparts.push(currentPart);\n\t}\n\n\treturn parts;\n}\n","// Modified from https://github.com/honojs/hono/blob/40ea0eee58e39b31053a0246c595434f1094ad31/src/adapter/cloudflare-workers/websocket.ts#L17\n//\n// This version calls the open event by default\n\nimport type { UpgradeWebSocket, WSEvents, WSReadyState } from \"hono/ws\";\nimport { defineWebSocketHelper, WSContext } from \"hono/ws\";\nimport { WS_PROTOCOL_STANDARD } from \"rivetkit/driver-helpers\";\n\n// Based on https://github.com/honojs/hono/issues/1153#issuecomment-1767321332\nexport const upgradeWebSocket: UpgradeWebSocket<\n\tWebSocket,\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tany,\n\tWSEvents<WebSocket>\n> = defineWebSocketHelper(async (c, events) => {\n\tconst upgradeHeader = c.req.header(\"Upgrade\");\n\tif (upgradeHeader !== \"websocket\") {\n\t\treturn;\n\t}\n\n\tconst webSocketPair = new WebSocketPair();\n\tconst client: WebSocket = webSocketPair[0];\n\tconst server: WebSocket = webSocketPair[1];\n\n\tconst wsContext = new WSContext<WebSocket>({\n\t\tclose: (code, reason) => server.close(code, reason),\n\t\tget protocol() {\n\t\t\treturn server.protocol;\n\t\t},\n\t\traw: server,\n\t\tget readyState() {\n\t\t\treturn server.readyState as WSReadyState;\n\t\t},\n\t\turl: server.url ? new URL(server.url) : null,\n\t\tsend: (source) => server.send(source),\n\t});\n\n\tif (events.onClose) {\n\t\tserver.addEventListener(\"close\", (evt: CloseEvent) =>\n\t\t\tevents.onClose?.(evt, wsContext),\n\t\t);\n\t}\n\tif (events.onMessage) {\n\t\tserver.addEventListener(\"message\", (evt: MessageEvent) =>\n\t\t\tevents.onMessage?.(evt, wsContext),\n\t\t);\n\t}\n\tif (events.onError) {\n\t\tserver.addEventListener(\"error\", (evt: Event) =>\n\t\t\tevents.onError?.(evt, wsContext),\n\t\t);\n\t}\n\n\tserver.accept?.();\n\n\t// note: cloudflare actors doesn't support 'open' event, so we call it immediately with a fake event\n\t//\n\t// we have to do this after `server.accept() is called`\n\tevents.onOpen?.(new Event(\"open\"), wsContext);\n\n\t// Build response headers\n\tconst headers: Record<string, string> = {};\n\n\t// Set Sec-WebSocket-Protocol if does not exist\n\tconst protocols = c.req.header(\"Sec-WebSocket-Protocol\");\n\tif (\n\t\ttypeof protocols === \"string\" &&\n\t\tprotocols\n\t\t\t.split(\",\")\n\t\t\t.map((x) => x.trim())\n\t\t\t.includes(WS_PROTOCOL_STANDARD)\n\t) {\n\t\theaders[\"Sec-WebSocket-Protocol\"] = WS_PROTOCOL_STANDARD;\n\t}\n\n\treturn new Response(null, {\n\t\tstatus: 101,\n\t\theaders,\n\t\twebSocket: client,\n\t});\n});\n"]}
package/dist/mod.d.cts CHANGED
@@ -1,10 +1,10 @@
1
1
  import * as rivetkit from 'rivetkit';
2
2
  import { Client, ActorKey, Registry } from 'rivetkit';
3
3
  export { Client } from 'rivetkit';
4
+ import * as rivetkit_utils from 'rivetkit/utils';
4
5
  import * as rivetkit_log from 'rivetkit/log';
5
6
  import * as hono from 'hono';
6
7
  import * as rivetkit_driver_helpers from 'rivetkit/driver-helpers';
7
- import * as rivetkit_utils from 'rivetkit/utils';
8
8
  import { z } from 'zod';
9
9
  import { DurableObject } from 'cloudflare:workers';
10
10
 
@@ -13,26 +13,6 @@ interface DriverContext {
13
13
  }
14
14
 
15
15
  declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
16
- api: z.ZodDefault<z.ZodObject<{
17
- host: z.ZodDefault<z.ZodString>;
18
- port: z.ZodDefault<z.ZodNumber>;
19
- }, "strip", z.ZodTypeAny, {
20
- host: string;
21
- port: number;
22
- }, {
23
- host?: string | undefined;
24
- port?: number | undefined;
25
- }>>;
26
- token: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
27
- totalSlots: z.ZodOptional<z.ZodNumber>;
28
- headers: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
29
- endpoint: z.ZodDefault<z.ZodNullable<z.ZodString>>;
30
- namespace: z.ZodDefault<z.ZodString>;
31
- runnerName: z.ZodDefault<z.ZodString>;
32
- encoding: z.ZodDefault<z.ZodEnum<["json", "cbor", "bare"]>>;
33
- transport: z.ZodDefault<z.ZodEnum<["websocket", "sse"]>>;
34
- getUpgradeWebSocket: z.ZodOptional<z.ZodType<() => rivetkit_utils.UpgradeWebSocket, z.ZodTypeDef, () => rivetkit_utils.UpgradeWebSocket>>;
35
- } & {
36
16
  driver: z.ZodOptional<z.ZodObject<{
37
17
  name: z.ZodString;
38
18
  manager: z.ZodType<(registryConfig: rivetkit.RegistryConfig, runConfig: rivetkit.RunConfig) => rivetkit_driver_helpers.ManagerDriver, z.ZodTypeDef, (registryConfig: rivetkit.RegistryConfig, runConfig: rivetkit.RunConfig) => rivetkit_driver_helpers.ManagerDriver>;
@@ -121,8 +101,13 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
121
101
  token?: ((...args: unknown[]) => string) | undefined;
122
102
  defaultEndpoint?: string | undefined;
123
103
  }>>>;
124
- disableServer: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
104
+ disableDefaultServer: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
105
+ defaultServerPort: z.ZodDefault<z.ZodNumber>;
106
+ runEngine: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
107
+ runEngineVersion: z.ZodDefault<z.ZodOptional<z.ZodString>>;
108
+ overrideServerAddress: z.ZodOptional<z.ZodString>;
125
109
  disableActorDriver: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
110
+ runnerKind: z.ZodDefault<z.ZodOptional<z.ZodEnum<["serverless", "normal"]>>>;
126
111
  basePath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
127
112
  noWelcome: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
128
113
  logging: z.ZodDefault<z.ZodOptional<z.ZodObject<{
@@ -135,7 +120,43 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
135
120
  level?: "error" | "trace" | "fatal" | "warn" | "info" | "debug" | "silent" | undefined;
136
121
  baseLogger?: rivetkit_log.Logger | undefined;
137
122
  }>>>;
138
- }, "getUpgradeWebSocket" | "driver"> & {
123
+ autoConfigureServerless: z.ZodOptional<z.ZodUnion<[z.ZodBoolean, z.ZodObject<{
124
+ url: z.ZodOptional<z.ZodString>;
125
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
126
+ maxRunners: z.ZodOptional<z.ZodNumber>;
127
+ minRunners: z.ZodOptional<z.ZodNumber>;
128
+ requestLifespan: z.ZodOptional<z.ZodNumber>;
129
+ runnersMargin: z.ZodOptional<z.ZodNumber>;
130
+ slotsPerRunner: z.ZodOptional<z.ZodNumber>;
131
+ }, "strip", z.ZodTypeAny, {
132
+ headers?: Record<string, string> | undefined;
133
+ url?: string | undefined;
134
+ maxRunners?: number | undefined;
135
+ minRunners?: number | undefined;
136
+ requestLifespan?: number | undefined;
137
+ runnersMargin?: number | undefined;
138
+ slotsPerRunner?: number | undefined;
139
+ }, {
140
+ headers?: Record<string, string> | undefined;
141
+ url?: string | undefined;
142
+ maxRunners?: number | undefined;
143
+ minRunners?: number | undefined;
144
+ requestLifespan?: number | undefined;
145
+ runnersMargin?: number | undefined;
146
+ slotsPerRunner?: number | undefined;
147
+ }>]>>;
148
+ } & {
149
+ runnerKey: z.ZodDefault<z.ZodString>;
150
+ totalSlots: z.ZodDefault<z.ZodNumber>;
151
+ endpoint: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
152
+ token: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
153
+ namespace: z.ZodDefault<z.ZodString>;
154
+ runnerName: z.ZodDefault<z.ZodString>;
155
+ encoding: z.ZodDefault<z.ZodEnum<["json", "cbor", "bare"]>>;
156
+ transport: z.ZodDefault<z.ZodEnum<["websocket", "sse"]>>;
157
+ headers: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
158
+ getUpgradeWebSocket: z.ZodOptional<z.ZodType<rivetkit_utils.GetUpgradeWebSocket, z.ZodTypeDef, rivetkit_utils.GetUpgradeWebSocket>>;
159
+ }, "driver" | "getUpgradeWebSocket"> & {
139
160
  /** Path that the Rivet manager API will be mounted. */
140
161
  managerPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
141
162
  fetch: z.ZodOptional<z.ZodType<ExportedHandlerFetchHandler<{
@@ -144,16 +165,6 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
144
165
  RIVET: Client<any>;
145
166
  }, unknown>>>;
146
167
  }, "strip", z.ZodTypeAny, {
147
- api: {
148
- host: string;
149
- port: number;
150
- };
151
- headers: Record<string, string>;
152
- endpoint: string | null;
153
- namespace: string;
154
- runnerName: string;
155
- encoding: "json" | "cbor" | "bare";
156
- transport: "websocket" | "sse";
157
168
  maxIncomingMessageSize: number;
158
169
  inspector: {
159
170
  enabled: boolean | {
@@ -171,17 +182,26 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
171
182
  token: (...args: unknown[]) => string;
172
183
  defaultEndpoint?: string | undefined;
173
184
  };
174
- disableServer: boolean;
185
+ disableDefaultServer: boolean;
186
+ defaultServerPort: number;
187
+ runEngine: boolean;
188
+ runEngineVersion: string;
175
189
  disableActorDriver: boolean;
190
+ runnerKind: "serverless" | "normal";
176
191
  basePath: string;
177
192
  noWelcome: boolean;
178
193
  logging: {
179
194
  level?: "error" | "trace" | "fatal" | "warn" | "info" | "debug" | "silent" | undefined;
180
195
  baseLogger?: rivetkit_log.Logger | undefined;
181
196
  };
197
+ runnerKey: string;
198
+ totalSlots: number;
199
+ namespace: string;
200
+ runnerName: string;
201
+ encoding: "json" | "cbor" | "bare";
202
+ transport: "websocket" | "sse";
203
+ headers: Record<string, string>;
182
204
  managerPath: string;
183
- token?: string | undefined;
184
- totalSlots?: number | undefined;
185
205
  cors?: {
186
206
  origin: string | string[] | ((origin: string, c: hono.Context) => Promise<string | undefined | null> | string | undefined | null);
187
207
  allowMethods?: string[] | ((origin: string, c: hono.Context) => Promise<string[]> | string[]);
@@ -190,22 +210,22 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
190
210
  credentials?: boolean;
191
211
  exposeHeaders?: string[];
192
212
  } | undefined;
213
+ overrideServerAddress?: string | undefined;
214
+ autoConfigureServerless?: boolean | {
215
+ headers?: Record<string, string> | undefined;
216
+ url?: string | undefined;
217
+ maxRunners?: number | undefined;
218
+ minRunners?: number | undefined;
219
+ requestLifespan?: number | undefined;
220
+ runnersMargin?: number | undefined;
221
+ slotsPerRunner?: number | undefined;
222
+ } | undefined;
223
+ endpoint?: string | undefined;
224
+ token?: string | undefined;
193
225
  fetch?: ExportedHandlerFetchHandler<{
194
226
  RIVET: Client<any>;
195
227
  }, unknown> | undefined;
196
228
  }, {
197
- api?: {
198
- host?: string | undefined;
199
- port?: number | undefined;
200
- } | undefined;
201
- token?: string | undefined;
202
- totalSlots?: number | undefined;
203
- headers?: Record<string, string> | undefined;
204
- endpoint?: string | null | undefined;
205
- namespace?: string | undefined;
206
- runnerName?: string | undefined;
207
- encoding?: "json" | "cbor" | "bare" | undefined;
208
- transport?: "websocket" | "sse" | undefined;
209
229
  cors?: {
210
230
  origin: string | string[] | ((origin: string, c: hono.Context) => Promise<string | undefined | null> | string | undefined | null);
211
231
  allowMethods?: string[] | ((origin: string, c: hono.Context) => Promise<string[]> | string[]);
@@ -231,14 +251,37 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
231
251
  token?: ((...args: unknown[]) => string) | undefined;
232
252
  defaultEndpoint?: string | undefined;
233
253
  } | undefined;
234
- disableServer?: boolean | undefined;
254
+ disableDefaultServer?: boolean | undefined;
255
+ defaultServerPort?: number | undefined;
256
+ runEngine?: boolean | undefined;
257
+ runEngineVersion?: string | undefined;
258
+ overrideServerAddress?: string | undefined;
235
259
  disableActorDriver?: boolean | undefined;
260
+ runnerKind?: "serverless" | "normal" | undefined;
236
261
  basePath?: string | undefined;
237
262
  noWelcome?: boolean | undefined;
238
263
  logging?: {
239
264
  level?: "error" | "trace" | "fatal" | "warn" | "info" | "debug" | "silent" | undefined;
240
265
  baseLogger?: rivetkit_log.Logger | undefined;
241
266
  } | undefined;
267
+ autoConfigureServerless?: boolean | {
268
+ headers?: Record<string, string> | undefined;
269
+ url?: string | undefined;
270
+ maxRunners?: number | undefined;
271
+ minRunners?: number | undefined;
272
+ requestLifespan?: number | undefined;
273
+ runnersMargin?: number | undefined;
274
+ slotsPerRunner?: number | undefined;
275
+ } | undefined;
276
+ runnerKey?: string | undefined;
277
+ totalSlots?: number | undefined;
278
+ endpoint?: string | undefined;
279
+ token?: string | undefined;
280
+ namespace?: string | undefined;
281
+ runnerName?: string | undefined;
282
+ encoding?: "json" | "cbor" | "bare" | undefined;
283
+ transport?: "websocket" | "sse" | undefined;
284
+ headers?: Record<string, string> | undefined;
242
285
  managerPath?: string | undefined;
243
286
  fetch?: ExportedHandlerFetchHandler<{
244
287
  RIVET: Client<any>;
package/dist/mod.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import * as rivetkit from 'rivetkit';
2
2
  import { Client, ActorKey, Registry } from 'rivetkit';
3
3
  export { Client } from 'rivetkit';
4
+ import * as rivetkit_utils from 'rivetkit/utils';
4
5
  import * as rivetkit_log from 'rivetkit/log';
5
6
  import * as hono from 'hono';
6
7
  import * as rivetkit_driver_helpers from 'rivetkit/driver-helpers';
7
- import * as rivetkit_utils from 'rivetkit/utils';
8
8
  import { z } from 'zod';
9
9
  import { DurableObject } from 'cloudflare:workers';
10
10
 
@@ -13,26 +13,6 @@ interface DriverContext {
13
13
  }
14
14
 
15
15
  declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
16
- api: z.ZodDefault<z.ZodObject<{
17
- host: z.ZodDefault<z.ZodString>;
18
- port: z.ZodDefault<z.ZodNumber>;
19
- }, "strip", z.ZodTypeAny, {
20
- host: string;
21
- port: number;
22
- }, {
23
- host?: string | undefined;
24
- port?: number | undefined;
25
- }>>;
26
- token: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
27
- totalSlots: z.ZodOptional<z.ZodNumber>;
28
- headers: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
29
- endpoint: z.ZodDefault<z.ZodNullable<z.ZodString>>;
30
- namespace: z.ZodDefault<z.ZodString>;
31
- runnerName: z.ZodDefault<z.ZodString>;
32
- encoding: z.ZodDefault<z.ZodEnum<["json", "cbor", "bare"]>>;
33
- transport: z.ZodDefault<z.ZodEnum<["websocket", "sse"]>>;
34
- getUpgradeWebSocket: z.ZodOptional<z.ZodType<() => rivetkit_utils.UpgradeWebSocket, z.ZodTypeDef, () => rivetkit_utils.UpgradeWebSocket>>;
35
- } & {
36
16
  driver: z.ZodOptional<z.ZodObject<{
37
17
  name: z.ZodString;
38
18
  manager: z.ZodType<(registryConfig: rivetkit.RegistryConfig, runConfig: rivetkit.RunConfig) => rivetkit_driver_helpers.ManagerDriver, z.ZodTypeDef, (registryConfig: rivetkit.RegistryConfig, runConfig: rivetkit.RunConfig) => rivetkit_driver_helpers.ManagerDriver>;
@@ -121,8 +101,13 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
121
101
  token?: ((...args: unknown[]) => string) | undefined;
122
102
  defaultEndpoint?: string | undefined;
123
103
  }>>>;
124
- disableServer: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
104
+ disableDefaultServer: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
105
+ defaultServerPort: z.ZodDefault<z.ZodNumber>;
106
+ runEngine: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
107
+ runEngineVersion: z.ZodDefault<z.ZodOptional<z.ZodString>>;
108
+ overrideServerAddress: z.ZodOptional<z.ZodString>;
125
109
  disableActorDriver: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
110
+ runnerKind: z.ZodDefault<z.ZodOptional<z.ZodEnum<["serverless", "normal"]>>>;
126
111
  basePath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
127
112
  noWelcome: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
128
113
  logging: z.ZodDefault<z.ZodOptional<z.ZodObject<{
@@ -135,7 +120,43 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
135
120
  level?: "error" | "trace" | "fatal" | "warn" | "info" | "debug" | "silent" | undefined;
136
121
  baseLogger?: rivetkit_log.Logger | undefined;
137
122
  }>>>;
138
- }, "getUpgradeWebSocket" | "driver"> & {
123
+ autoConfigureServerless: z.ZodOptional<z.ZodUnion<[z.ZodBoolean, z.ZodObject<{
124
+ url: z.ZodOptional<z.ZodString>;
125
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
126
+ maxRunners: z.ZodOptional<z.ZodNumber>;
127
+ minRunners: z.ZodOptional<z.ZodNumber>;
128
+ requestLifespan: z.ZodOptional<z.ZodNumber>;
129
+ runnersMargin: z.ZodOptional<z.ZodNumber>;
130
+ slotsPerRunner: z.ZodOptional<z.ZodNumber>;
131
+ }, "strip", z.ZodTypeAny, {
132
+ headers?: Record<string, string> | undefined;
133
+ url?: string | undefined;
134
+ maxRunners?: number | undefined;
135
+ minRunners?: number | undefined;
136
+ requestLifespan?: number | undefined;
137
+ runnersMargin?: number | undefined;
138
+ slotsPerRunner?: number | undefined;
139
+ }, {
140
+ headers?: Record<string, string> | undefined;
141
+ url?: string | undefined;
142
+ maxRunners?: number | undefined;
143
+ minRunners?: number | undefined;
144
+ requestLifespan?: number | undefined;
145
+ runnersMargin?: number | undefined;
146
+ slotsPerRunner?: number | undefined;
147
+ }>]>>;
148
+ } & {
149
+ runnerKey: z.ZodDefault<z.ZodString>;
150
+ totalSlots: z.ZodDefault<z.ZodNumber>;
151
+ endpoint: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
152
+ token: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
153
+ namespace: z.ZodDefault<z.ZodString>;
154
+ runnerName: z.ZodDefault<z.ZodString>;
155
+ encoding: z.ZodDefault<z.ZodEnum<["json", "cbor", "bare"]>>;
156
+ transport: z.ZodDefault<z.ZodEnum<["websocket", "sse"]>>;
157
+ headers: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
158
+ getUpgradeWebSocket: z.ZodOptional<z.ZodType<rivetkit_utils.GetUpgradeWebSocket, z.ZodTypeDef, rivetkit_utils.GetUpgradeWebSocket>>;
159
+ }, "driver" | "getUpgradeWebSocket"> & {
139
160
  /** Path that the Rivet manager API will be mounted. */
140
161
  managerPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
141
162
  fetch: z.ZodOptional<z.ZodType<ExportedHandlerFetchHandler<{
@@ -144,16 +165,6 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
144
165
  RIVET: Client<any>;
145
166
  }, unknown>>>;
146
167
  }, "strip", z.ZodTypeAny, {
147
- api: {
148
- host: string;
149
- port: number;
150
- };
151
- headers: Record<string, string>;
152
- endpoint: string | null;
153
- namespace: string;
154
- runnerName: string;
155
- encoding: "json" | "cbor" | "bare";
156
- transport: "websocket" | "sse";
157
168
  maxIncomingMessageSize: number;
158
169
  inspector: {
159
170
  enabled: boolean | {
@@ -171,17 +182,26 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
171
182
  token: (...args: unknown[]) => string;
172
183
  defaultEndpoint?: string | undefined;
173
184
  };
174
- disableServer: boolean;
185
+ disableDefaultServer: boolean;
186
+ defaultServerPort: number;
187
+ runEngine: boolean;
188
+ runEngineVersion: string;
175
189
  disableActorDriver: boolean;
190
+ runnerKind: "serverless" | "normal";
176
191
  basePath: string;
177
192
  noWelcome: boolean;
178
193
  logging: {
179
194
  level?: "error" | "trace" | "fatal" | "warn" | "info" | "debug" | "silent" | undefined;
180
195
  baseLogger?: rivetkit_log.Logger | undefined;
181
196
  };
197
+ runnerKey: string;
198
+ totalSlots: number;
199
+ namespace: string;
200
+ runnerName: string;
201
+ encoding: "json" | "cbor" | "bare";
202
+ transport: "websocket" | "sse";
203
+ headers: Record<string, string>;
182
204
  managerPath: string;
183
- token?: string | undefined;
184
- totalSlots?: number | undefined;
185
205
  cors?: {
186
206
  origin: string | string[] | ((origin: string, c: hono.Context) => Promise<string | undefined | null> | string | undefined | null);
187
207
  allowMethods?: string[] | ((origin: string, c: hono.Context) => Promise<string[]> | string[]);
@@ -190,22 +210,22 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
190
210
  credentials?: boolean;
191
211
  exposeHeaders?: string[];
192
212
  } | undefined;
213
+ overrideServerAddress?: string | undefined;
214
+ autoConfigureServerless?: boolean | {
215
+ headers?: Record<string, string> | undefined;
216
+ url?: string | undefined;
217
+ maxRunners?: number | undefined;
218
+ minRunners?: number | undefined;
219
+ requestLifespan?: number | undefined;
220
+ runnersMargin?: number | undefined;
221
+ slotsPerRunner?: number | undefined;
222
+ } | undefined;
223
+ endpoint?: string | undefined;
224
+ token?: string | undefined;
193
225
  fetch?: ExportedHandlerFetchHandler<{
194
226
  RIVET: Client<any>;
195
227
  }, unknown> | undefined;
196
228
  }, {
197
- api?: {
198
- host?: string | undefined;
199
- port?: number | undefined;
200
- } | undefined;
201
- token?: string | undefined;
202
- totalSlots?: number | undefined;
203
- headers?: Record<string, string> | undefined;
204
- endpoint?: string | null | undefined;
205
- namespace?: string | undefined;
206
- runnerName?: string | undefined;
207
- encoding?: "json" | "cbor" | "bare" | undefined;
208
- transport?: "websocket" | "sse" | undefined;
209
229
  cors?: {
210
230
  origin: string | string[] | ((origin: string, c: hono.Context) => Promise<string | undefined | null> | string | undefined | null);
211
231
  allowMethods?: string[] | ((origin: string, c: hono.Context) => Promise<string[]> | string[]);
@@ -231,14 +251,37 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
231
251
  token?: ((...args: unknown[]) => string) | undefined;
232
252
  defaultEndpoint?: string | undefined;
233
253
  } | undefined;
234
- disableServer?: boolean | undefined;
254
+ disableDefaultServer?: boolean | undefined;
255
+ defaultServerPort?: number | undefined;
256
+ runEngine?: boolean | undefined;
257
+ runEngineVersion?: string | undefined;
258
+ overrideServerAddress?: string | undefined;
235
259
  disableActorDriver?: boolean | undefined;
260
+ runnerKind?: "serverless" | "normal" | undefined;
236
261
  basePath?: string | undefined;
237
262
  noWelcome?: boolean | undefined;
238
263
  logging?: {
239
264
  level?: "error" | "trace" | "fatal" | "warn" | "info" | "debug" | "silent" | undefined;
240
265
  baseLogger?: rivetkit_log.Logger | undefined;
241
266
  } | undefined;
267
+ autoConfigureServerless?: boolean | {
268
+ headers?: Record<string, string> | undefined;
269
+ url?: string | undefined;
270
+ maxRunners?: number | undefined;
271
+ minRunners?: number | undefined;
272
+ requestLifespan?: number | undefined;
273
+ runnersMargin?: number | undefined;
274
+ slotsPerRunner?: number | undefined;
275
+ } | undefined;
276
+ runnerKey?: string | undefined;
277
+ totalSlots?: number | undefined;
278
+ endpoint?: string | undefined;
279
+ token?: string | undefined;
280
+ namespace?: string | undefined;
281
+ runnerName?: string | undefined;
282
+ encoding?: "json" | "cbor" | "bare" | undefined;
283
+ transport?: "websocket" | "sse" | undefined;
284
+ headers?: Record<string, string> | undefined;
242
285
  managerPath?: string | undefined;
243
286
  fetch?: ExportedHandlerFetchHandler<{
244
287
  RIVET: Client<any>;
package/dist/mod.js CHANGED
@@ -228,6 +228,7 @@ var ConfigSchema = RunConfigSchema.removeDefault().omit({ driver: true, getUpgra
228
228
 
229
229
  // src/manager-driver.ts
230
230
  import {
231
+ generateRandomString,
231
232
  WS_PROTOCOL_ACTOR,
232
233
  WS_PROTOCOL_CONN_ID,
233
234
  WS_PROTOCOL_CONN_PARAMS,
@@ -513,6 +514,9 @@ Response: ${await response.text()}`
513
514
  properties: {}
514
515
  };
515
516
  }
517
+ getOrCreateInspectorAccessToken() {
518
+ return generateRandomString();
519
+ }
516
520
  };
517
521
 
518
522
  // src/websocket.ts
package/dist/mod.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/handler.ts","../src/actor-handler-do.ts","../src/actor-driver.ts","../src/log.ts","../src/config.ts","../src/manager-driver.ts","../src/util.ts","../src/websocket.ts"],"sourcesContent":["import { env } from \"cloudflare:workers\";\nimport type { Registry, RunConfig } from \"rivetkit\";\nimport {\n\ttype ActorHandlerInterface,\n\tcreateActorDurableObject,\n\ttype DurableObjectConstructor,\n} from \"./actor-handler-do\";\nimport { ConfigSchema, type InputConfig } from \"./config\";\nimport { CloudflareActorsManagerDriver } from \"./manager-driver\";\nimport { upgradeWebSocket } from \"./websocket\";\n\n/** Cloudflare Workers env */\nexport interface Bindings {\n\tACTOR_KV: KVNamespace;\n\tACTOR_DO: DurableObjectNamespace<ActorHandlerInterface>;\n}\n\n/**\n * Stores the env for the current request. Required since some contexts like the inline client driver does not have access to the Hono context.\n *\n * Use getCloudflareAmbientEnv unless using CF_AMBIENT_ENV.run.\n */\nexport function getCloudflareAmbientEnv(): Bindings {\n\treturn env as unknown as Bindings;\n}\n\ninterface Handler {\n\thandler: ExportedHandler<Bindings>;\n\tActorHandler: DurableObjectConstructor;\n}\n\nexport function createHandler<R extends Registry<any>>(\n\tregistry: R,\n\tinputConfig?: InputConfig,\n): Handler {\n\tconst config = ConfigSchema.parse(inputConfig);\n\n\t// Create config\n\tconst runConfig = {\n\t\t...config,\n\t\tdriver: {\n\t\t\tname: \"cloudflare-workers\",\n\t\t\tmanager: () => new CloudflareActorsManagerDriver(),\n\t\t\t// HACK: We can't build the actor driver until we're inside the Durable Object\n\t\t\tactor: undefined as any,\n\t\t},\n\t\tgetUpgradeWebSocket: () => upgradeWebSocket,\n\t} satisfies RunConfig;\n\n\t// Create Durable Object\n\tconst ActorHandler = createActorDurableObject(registry, runConfig);\n\n\t// Create server\n\tconst serverOutput = registry.start(runConfig);\n\n\t// Create Cloudflare handler\n\tconst handler = {\n\t\tfetch: (request, cfEnv, ctx) => {\n\t\t\tconst url = new URL(request.url);\n\n\t\t\t// Inject Rivet env\n\t\t\tconst env = Object.assign({ RIVET: serverOutput.client }, cfEnv);\n\n\t\t\t// Mount Rivet manager API\n\t\t\tif (url.pathname.startsWith(config.managerPath)) {\n\t\t\t\tconst strippedPath = url.pathname.substring(config.managerPath.length);\n\t\t\t\turl.pathname = strippedPath;\n\t\t\t\tconst modifiedRequest = new Request(url.toString(), request);\n\t\t\t\treturn serverOutput.fetch(modifiedRequest, env, ctx);\n\t\t\t}\n\n\t\t\tif (config.fetch) {\n\t\t\t\treturn config.fetch(request, env, ctx);\n\t\t\t} else {\n\t\t\t\treturn new Response(\n\t\t\t\t\t\"This is a RivetKit server.\\n\\nLearn more at https://rivetkit.org\\n\",\n\t\t\t\t\t{ status: 200 },\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t} satisfies ExportedHandler<Bindings>;\n\n\treturn { handler, ActorHandler };\n}\n","import { DurableObject, env } from \"cloudflare:workers\";\nimport type { ExecutionContext } from \"hono\";\nimport invariant from \"invariant\";\nimport type { ActorKey, ActorRouter, Registry, RunConfig } from \"rivetkit\";\nimport { createActorRouter, createClientWithDriver } from \"rivetkit\";\nimport type { ActorDriver } from \"rivetkit/driver-helpers\";\nimport {\n\ttype ManagerDriver,\n\tserializeEmptyPersistData,\n} from \"rivetkit/driver-helpers\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\nimport {\n\tCloudflareDurableObjectGlobalState,\n\tcreateCloudflareActorsActorDriverBuilder,\n} from \"./actor-driver\";\nimport type { Bindings } from \"./handler\";\nimport { logger } from \"./log\";\n\nexport const KEYS = {\n\tNAME: \"rivetkit:name\",\n\tKEY: \"rivetkit:key\",\n\tPERSIST_DATA: \"rivetkit:data\",\n};\n\nexport interface ActorHandlerInterface extends DurableObject {\n\tinitialize(req: ActorInitRequest): Promise<void>;\n}\n\nexport interface ActorInitRequest {\n\tname: string;\n\tkey: ActorKey;\n\tinput?: unknown;\n}\n\ninterface InitializedData {\n\tname: string;\n\tkey: ActorKey;\n}\n\nexport type DurableObjectConstructor = new (\n\t...args: ConstructorParameters<typeof DurableObject<Bindings>>\n) => DurableObject<Bindings>;\n\ninterface LoadedActor {\n\tactorRouter: ActorRouter;\n\tactorDriver: ActorDriver;\n}\n\nexport function createActorDurableObject(\n\tregistry: Registry<any>,\n\trootRunConfig: RunConfig,\n): DurableObjectConstructor {\n\tconst globalState = new CloudflareDurableObjectGlobalState();\n\n\t// Configure to use the runner role instead of server role\n\tconst runConfig = Object.assign({}, rootRunConfig, { role: \"runner\" });\n\n\t/**\n\t * Startup steps:\n\t * 1. If not already created call `initialize`, otherwise check KV to ensure it's initialized\n\t * 2. Load actor\n\t * 3. Start service requests\n\t */\n\treturn class ActorHandler\n\t\textends DurableObject<Bindings>\n\t\timplements ActorHandlerInterface\n\t{\n\t\t#initialized?: InitializedData;\n\t\t#initializedPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\n\t\t#actor?: LoadedActor;\n\n\t\tasync #loadActor(): Promise<LoadedActor> {\n\t\t\t// Wait for init\n\t\t\tif (!this.#initialized) {\n\t\t\t\t// Wait for init\n\t\t\t\tif (this.#initializedPromise) {\n\t\t\t\t\tawait this.#initializedPromise.promise;\n\t\t\t\t} else {\n\t\t\t\t\tthis.#initializedPromise = promiseWithResolvers();\n\t\t\t\t\tconst res = await this.ctx.storage.get([\n\t\t\t\t\t\tKEYS.NAME,\n\t\t\t\t\t\tKEYS.KEY,\n\t\t\t\t\t\tKEYS.PERSIST_DATA,\n\t\t\t\t\t]);\n\t\t\t\t\tif (res.get(KEYS.PERSIST_DATA)) {\n\t\t\t\t\t\tconst name = res.get(KEYS.NAME) as string;\n\t\t\t\t\t\tif (!name) throw new Error(\"missing actor name\");\n\t\t\t\t\t\tconst key = res.get(KEYS.KEY) as ActorKey;\n\t\t\t\t\t\tif (!key) throw new Error(\"missing actor key\");\n\n\t\t\t\t\t\tlogger().debug({ msg: \"already initialized\", name, key });\n\n\t\t\t\t\t\tthis.#initialized = { name, key };\n\t\t\t\t\t\tthis.#initializedPromise.resolve();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger().debug(\"waiting to initialize\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check if already loaded\n\t\t\tif (this.#actor) {\n\t\t\t\treturn this.#actor;\n\t\t\t}\n\n\t\t\tif (!this.#initialized) throw new Error(\"Not initialized\");\n\n\t\t\t// Register DO with global state first\n\t\t\t// HACK: This leaks the DO context, but DO does not provide a native way\n\t\t\t// of knowing when the DO shuts down. We're making a broad assumption\n\t\t\t// that DO will boot a new isolate frequenlty enough that this is not an issue.\n\t\t\tconst actorId = this.ctx.id.toString();\n\t\t\tglobalState.setDOState(actorId, { ctx: this.ctx, env: env });\n\n\t\t\t// Configure actor driver\n\t\t\tinvariant(runConfig.driver, \"runConfig.driver\");\n\t\t\trunConfig.driver.actor =\n\t\t\t\tcreateCloudflareActorsActorDriverBuilder(globalState);\n\n\t\t\t// Create manager driver (we need this for the actor router)\n\t\t\tconst managerDriver = runConfig.driver.manager(\n\t\t\t\tregistry.config,\n\t\t\t\trunConfig,\n\t\t\t);\n\n\t\t\tconfigureInspectorAccessToken(registry.config, managerDriver);\n\n\t\t\t// Create inline client\n\t\t\tconst inlineClient = createClientWithDriver(managerDriver);\n\n\t\t\t// Create actor driver\n\t\t\tconst actorDriver = runConfig.driver.actor(\n\t\t\t\tregistry.config,\n\t\t\t\trunConfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tinlineClient,\n\t\t\t);\n\n\t\t\t// Create actor router\n\t\t\tconst actorRouter = createActorRouter(runConfig, actorDriver, false);\n\n\t\t\t// Save actor\n\t\t\tthis.#actor = {\n\t\t\t\tactorRouter,\n\t\t\t\tactorDriver,\n\t\t\t};\n\n\t\t\t// Initialize the actor instance with proper metadata\n\t\t\t// This ensures the actor driver knows about this actor\n\t\t\tawait actorDriver.loadActor(actorId);\n\n\t\t\treturn this.#actor;\n\t\t}\n\n\t\t/** RPC called by the service that creates the DO to initialize it. */\n\t\tasync initialize(req: ActorInitRequest) {\n\t\t\t// TODO: Need to add this to a core promise that needs to be resolved before start\n\n\t\t\tawait this.ctx.storage.put({\n\t\t\t\t[KEYS.NAME]: req.name,\n\t\t\t\t[KEYS.KEY]: req.key,\n\t\t\t\t[KEYS.PERSIST_DATA]: serializeEmptyPersistData(req.input),\n\t\t\t});\n\t\t\tthis.#initialized = {\n\t\t\t\tname: req.name,\n\t\t\t\tkey: req.key,\n\t\t\t};\n\n\t\t\tlogger().debug({ msg: \"initialized actor\", key: req.key });\n\n\t\t\t// Preemptively actor so the lifecycle hooks are called\n\t\t\tawait this.#loadActor();\n\t\t}\n\n\t\tasync fetch(request: Request): Promise<Response> {\n\t\t\tconst { actorRouter } = await this.#loadActor();\n\n\t\t\tconst actorId = this.ctx.id.toString();\n\t\t\treturn await actorRouter.fetch(request, {\n\t\t\t\tactorId,\n\t\t\t});\n\t\t}\n\n\t\tasync alarm(): Promise<void> {\n\t\t\tconst { actorDriver } = await this.#loadActor();\n\t\t\tconst actorId = this.ctx.id.toString();\n\n\t\t\t// Load the actor instance and trigger alarm\n\t\t\tconst actor = await actorDriver.loadActor(actorId);\n\t\t\tawait actor._onAlarm();\n\t\t}\n\t};\n}\nfunction configureInspectorAccessToken(\n\tconfig: any,\n\tmanagerDriver: ManagerDriver,\n) {\n\tthrow new Error(\"Function not implemented.\");\n}\n","import invariant from \"invariant\";\nimport type {\n\tAnyActorInstance as CoreAnyActorInstance,\n\tRegistryConfig,\n\tRunConfig,\n} from \"rivetkit\";\nimport { lookupInRegistry } from \"rivetkit\";\nimport type { Client } from \"rivetkit/client\";\nimport type {\n\tActorDriver,\n\tAnyActorInstance,\n\tManagerDriver,\n} from \"rivetkit/driver-helpers\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\nimport { KEYS } from \"./actor-handler-do\";\n\ninterface DurableObjectGlobalState {\n\tctx: DurableObjectState;\n\tenv: unknown;\n}\n\n/**\n * Cloudflare DO can have multiple DO running within the same global scope.\n *\n * This allows for storing the actor context globally and looking it up by ID in `CloudflareActorsActorDriver`.\n */\nexport class CloudflareDurableObjectGlobalState {\n\t// Single map for all actor state\n\t#dos: Map<string, DurableObjectGlobalState> = new Map();\n\n\tgetDOState(actorId: string): DurableObjectGlobalState {\n\t\tconst state = this.#dos.get(actorId);\n\t\tinvariant(state !== undefined, \"durable object state not in global state\");\n\t\treturn state;\n\t}\n\n\tsetDOState(actorId: string, state: DurableObjectGlobalState) {\n\t\tthis.#dos.set(actorId, state);\n\t}\n}\n\nexport interface DriverContext {\n\tstate: DurableObjectState;\n}\n\n// Actor handler to track running instances\nclass ActorHandler {\n\tactor?: AnyActorInstance;\n\tactorPromise?: ReturnType<typeof promiseWithResolvers<void>> =\n\t\tpromiseWithResolvers();\n}\n\nexport class CloudflareActorsActorDriver implements ActorDriver {\n\t#registryConfig: RegistryConfig;\n\t#runConfig: RunConfig;\n\t#managerDriver: ManagerDriver;\n\t#inlineClient: Client<any>;\n\t#globalState: CloudflareDurableObjectGlobalState;\n\t#actors: Map<string, ActorHandler> = new Map();\n\n\tconstructor(\n\t\tregistryConfig: RegistryConfig,\n\t\trunConfig: RunConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: Client<any>,\n\t\tglobalState: CloudflareDurableObjectGlobalState,\n\t) {\n\t\tthis.#registryConfig = registryConfig;\n\t\tthis.#runConfig = runConfig;\n\t\tthis.#managerDriver = managerDriver;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#globalState = globalState;\n\t}\n\n\t#getDOCtx(actorId: string) {\n\t\treturn this.#globalState.getDOState(actorId).ctx;\n\t}\n\n\tasync loadActor(actorId: string): Promise<AnyActorInstance> {\n\t\t// Check if actor is already loaded\n\t\tlet handler = this.#actors.get(actorId);\n\t\tif (handler) {\n\t\t\tif (handler.actorPromise) await handler.actorPromise.promise;\n\t\t\tif (!handler.actor) throw new Error(\"Actor should be loaded\");\n\t\t\treturn handler.actor;\n\t\t}\n\n\t\t// Create new actor handler\n\t\thandler = new ActorHandler();\n\t\tthis.#actors.set(actorId, handler);\n\n\t\t// Get the actor metadata from Durable Object storage\n\t\tconst doState = this.#globalState.getDOState(actorId);\n\t\tconst storage = doState.ctx.storage;\n\n\t\t// Load actor metadata\n\t\tconst [name, key] = await Promise.all([\n\t\t\tstorage.get<string>(KEYS.NAME),\n\t\t\tstorage.get<string[]>(KEYS.KEY),\n\t\t]);\n\n\t\tif (!name) {\n\t\t\tthrow new Error(`Actor ${actorId} is not initialized - missing name`);\n\t\t}\n\t\tif (!key) {\n\t\t\tthrow new Error(`Actor ${actorId} is not initialized - missing key`);\n\t\t}\n\n\t\t// Create actor instance\n\t\tconst definition = lookupInRegistry(this.#registryConfig, name);\n\t\thandler.actor = definition.instantiate();\n\n\t\t// Start actor\n\t\tawait handler.actor.start(\n\t\t\tthis,\n\t\t\tthis.#inlineClient,\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t\t\"unknown\", // TODO: Support regions in Cloudflare\n\t\t);\n\n\t\t// Finish\n\t\thandler.actorPromise?.resolve();\n\t\thandler.actorPromise = undefined;\n\n\t\treturn handler.actor;\n\t}\n\n\tgetContext(actorId: string): DriverContext {\n\t\tconst state = this.#globalState.getDOState(actorId);\n\t\treturn { state: state.ctx };\n\t}\n\n\tasync readPersistedData(actorId: string): Promise<Uint8Array | undefined> {\n\t\treturn await this.#getDOCtx(actorId).storage.get(KEYS.PERSIST_DATA);\n\t}\n\n\tasync writePersistedData(actorId: string, data: Uint8Array): Promise<void> {\n\t\tawait this.#getDOCtx(actorId).storage.put(KEYS.PERSIST_DATA, data);\n\t}\n\n\tasync setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {\n\t\tawait this.#getDOCtx(actor.id).storage.setAlarm(timestamp);\n\t}\n\n\tasync getDatabase(actorId: string): Promise<unknown | undefined> {\n\t\treturn this.#getDOCtx(actorId).storage.sql;\n\t}\n}\n\nexport function createCloudflareActorsActorDriverBuilder(\n\tglobalState: CloudflareDurableObjectGlobalState,\n) {\n\treturn (\n\t\tregistryConfig: RegistryConfig,\n\t\trunConfig: RunConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: Client<any>,\n\t) => {\n\t\treturn new CloudflareActorsActorDriver(\n\t\t\tregistryConfig,\n\t\t\trunConfig,\n\t\t\tmanagerDriver,\n\t\t\tinlineClient,\n\t\t\tglobalState,\n\t\t);\n\t};\n}\n","import { getLogger } from \"rivetkit/log\";\n\nexport function logger() {\n\treturn getLogger(\"driver-cloudflare-workers\");\n}\n","import type { Client } from \"rivetkit\";\nimport { RunConfigSchema } from \"rivetkit/driver-helpers\";\nimport { z } from \"zod\";\n\nexport const ConfigSchema = RunConfigSchema.removeDefault()\n\t.omit({ driver: true, getUpgradeWebSocket: true })\n\t.extend({\n\t\t/** Path that the Rivet manager API will be mounted. */\n\t\tmanagerPath: z.string().optional().default(\"/rivet\"),\n\n\t\tfetch: z\n\t\t\t.custom<ExportedHandlerFetchHandler<{ RIVET: Client<any> }, unknown>>()\n\t\t\t.optional(),\n\t})\n\t.default({});\nexport type InputConfig = z.input<typeof ConfigSchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\n","import type { Context as HonoContext } from \"hono\";\nimport type { Encoding, UniversalWebSocket } from \"rivetkit\";\nimport {\n\ttype ActorOutput,\n\ttype CreateInput,\n\ttype GetForIdInput,\n\ttype GetOrCreateWithKeyInput,\n\ttype GetWithKeyInput,\n\ttype ManagerDisplayInformation,\n\ttype ManagerDriver,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_ID,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_CONN_TOKEN,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_STANDARD,\n\tWS_PROTOCOL_TARGET,\n} from \"rivetkit/driver-helpers\";\nimport { ActorAlreadyExists, InternalError } from \"rivetkit/errors\";\nimport { getCloudflareAmbientEnv } from \"./handler\";\nimport { logger } from \"./log\";\nimport type { Bindings } from \"./mod\";\nimport { serializeKey, serializeNameAndKey } from \"./util\";\n\n// Actor metadata structure\ninterface ActorData {\n\tname: string;\n\tkey: string[];\n}\n\nconst KEYS = {\n\tACTOR: {\n\t\t// Combined key for actor metadata (name and key)\n\t\tmetadata: (actorId: string) => `actor:${actorId}:metadata`,\n\n\t\t// Key index function for actor lookup\n\t\tkeyIndex: (name: string, key: string[] = []) => {\n\t\t\t// Use serializeKey for consistent handling of all keys\n\t\t\treturn `actor_key:${serializeKey(key)}`;\n\t\t},\n\t},\n};\n\nconst STANDARD_WEBSOCKET_HEADERS = [\n\t\"connection\",\n\t\"upgrade\",\n\t\"sec-websocket-key\",\n\t\"sec-websocket-version\",\n\t\"sec-websocket-protocol\",\n\t\"sec-websocket-extensions\",\n];\n\nexport class CloudflareActorsManagerDriver implements ManagerDriver {\n\tasync sendRequest(actorId: string, actorRequest: Request): Promise<Response> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({\n\t\t\tmsg: \"sending request to durable object\",\n\t\t\tactorId,\n\t\t\tmethod: actorRequest.method,\n\t\t\turl: actorRequest.url,\n\t\t});\n\n\t\tconst id = env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync openWebSocket(\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t\tconnId?: string,\n\t\tconnToken?: string,\n\t): Promise<UniversalWebSocket> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({\n\t\t\tmsg: \"opening websocket to durable object\",\n\t\t\tactorId,\n\t\t\tpath,\n\t\t});\n\n\t\t// Make a fetch request to the Durable Object with WebSocket upgrade\n\t\tconst id = env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = env.ACTOR_DO.get(id);\n\n\t\tconst protocols: string[] = [];\n\t\tprotocols.push(WS_PROTOCOL_STANDARD);\n\t\tprotocols.push(`${WS_PROTOCOL_TARGET}actor`);\n\t\tprotocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);\n\t\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\t\tif (params) {\n\t\t\tprotocols.push(\n\t\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t\t);\n\t\t}\n\t\tif (connId) {\n\t\t\tprotocols.push(`${WS_PROTOCOL_CONN_ID}${connId}`);\n\t\t}\n\t\tif (connToken) {\n\t\t\tprotocols.push(`${WS_PROTOCOL_CONN_TOKEN}${connToken}`);\n\t\t}\n\n\t\tconst headers: Record<string, string> = {\n\t\t\tUpgrade: \"websocket\",\n\t\t\tConnection: \"Upgrade\",\n\t\t\t\"sec-websocket-protocol\": protocols.join(\", \"),\n\t\t};\n\n\t\t// Use the path parameter to determine the URL\n\t\tconst normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n\t\tconst url = `http://actor${normalizedPath}`;\n\n\t\tlogger().debug({ msg: \"rewriting websocket url\", from: path, to: url });\n\n\t\tconst response = await stub.fetch(url, {\n\t\t\theaders,\n\t\t});\n\t\tconst webSocket = response.webSocket;\n\n\t\tif (!webSocket) {\n\t\t\tthrow new InternalError(\n\t\t\t\t`missing websocket connection in response from DO\\n\\nStatus: ${response.status}\\nResponse: ${await response.text()}`,\n\t\t\t);\n\t\t}\n\n\t\tlogger().debug({\n\t\t\tmsg: \"durable object websocket connection open\",\n\t\t\tactorId,\n\t\t});\n\n\t\twebSocket.accept();\n\n\t\t// TODO: Is this still needed?\n\t\t// HACK: Cloudflare does not call onopen automatically, so we need\n\t\t// to call this on the next tick\n\t\tsetTimeout(() => {\n\t\t\tconst event = new Event(\"open\");\n\t\t\t(webSocket as any).onopen?.(event);\n\t\t\t(webSocket as any).dispatchEvent(event);\n\t\t}, 0);\n\n\t\treturn webSocket as unknown as UniversalWebSocket;\n\t}\n\n\tasync proxyRequest(\n\t\tc: HonoContext<{ Bindings: Bindings }>,\n\t\tactorRequest: Request,\n\t\tactorId: string,\n\t): Promise<Response> {\n\t\tlogger().debug({\n\t\t\tmsg: \"forwarding request to durable object\",\n\t\t\tactorId,\n\t\t\tmethod: actorRequest.method,\n\t\t\turl: actorRequest.url,\n\t\t});\n\n\t\tconst id = c.env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = c.env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync proxyWebSocket(\n\t\tc: HonoContext<{ Bindings: Bindings }>,\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<Response> {\n\t\tlogger().debug({\n\t\t\tmsg: \"forwarding websocket to durable object\",\n\t\t\tactorId,\n\t\t\tpath,\n\t\t});\n\n\t\t// Validate upgrade\n\t\tconst upgradeHeader = c.req.header(\"Upgrade\");\n\t\tif (!upgradeHeader || upgradeHeader !== \"websocket\") {\n\t\t\treturn new Response(\"Expected Upgrade: websocket\", {\n\t\t\t\tstatus: 426,\n\t\t\t});\n\t\t}\n\n\t\tconst newUrl = new URL(`http://actor${path}`);\n\t\tconst actorRequest = new Request(newUrl, c.req.raw);\n\n\t\tlogger().debug({\n\t\t\tmsg: \"rewriting websocket url\",\n\t\t\tfrom: c.req.url,\n\t\t\tto: actorRequest.url,\n\t\t});\n\n\t\t// Always build fresh request to prevent forwarding unwanted headers\n\t\t// HACK: Since we can't build a new request, we need to remove\n\t\t// non-standard headers manually\n\t\tconst headerKeys: string[] = [];\n\t\tactorRequest.headers.forEach((v, k) => headerKeys.push(k));\n\t\tfor (const k of headerKeys) {\n\t\t\tif (!STANDARD_WEBSOCKET_HEADERS.includes(k)) {\n\t\t\t\tactorRequest.headers.delete(k);\n\t\t\t}\n\t\t}\n\n\t\t// Build protocols for WebSocket connection\n\t\tconst protocols: string[] = [];\n\t\tprotocols.push(WS_PROTOCOL_STANDARD);\n\t\tprotocols.push(`${WS_PROTOCOL_TARGET}actor`);\n\t\tprotocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);\n\t\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\t\tif (params) {\n\t\t\tprotocols.push(\n\t\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t\t);\n\t\t}\n\t\tactorRequest.headers.set(\"sec-websocket-protocol\", protocols.join(\", \"));\n\n\t\tconst id = c.env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = c.env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync getForId({\n\t\tc,\n\t\tactorId,\n\t}: GetForIdInput<{ Bindings: Bindings }>): Promise<ActorOutput | undefined> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\t// Get actor metadata from KV (combined name and key)\n\t\tconst actorData = (await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t})) as ActorData | null;\n\n\t\t// If the actor doesn't exist, return undefined\n\t\tif (!actorData) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname: actorData.name,\n\t\t\tkey: actorData.key,\n\t\t};\n\t}\n\n\tasync getWithKey({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t}: GetWithKeyInput<{ Bindings: Bindings }>): Promise<\n\t\tActorOutput | undefined\n\t> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({ msg: \"getWithKey: searching for actor\", name, key });\n\n\t\t// Generate deterministic ID from the name and key\n\t\t// This is aligned with how createActor generates IDs\n\t\tconst nameKeyString = serializeNameAndKey(name, key);\n\t\tconst actorId = env.ACTOR_DO.idFromName(nameKeyString).toString();\n\n\t\t// Check if the actor metadata exists\n\t\tconst actorData = await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t});\n\n\t\tif (!actorData) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"getWithKey: no actor found with matching name and key\",\n\t\t\t\tname,\n\t\t\t\tkey,\n\t\t\t\tactorId,\n\t\t\t});\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlogger().debug({\n\t\t\tmsg: \"getWithKey: found actor with matching name and key\",\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t});\n\t\treturn this.#buildActorOutput(c, actorId);\n\t}\n\n\tasync getOrCreateWithKey(\n\t\tinput: GetOrCreateWithKeyInput,\n\t): Promise<ActorOutput> {\n\t\t// TODO: Prevent race condition here\n\t\tconst getOutput = await this.getWithKey(input);\n\t\tif (getOutput) {\n\t\t\treturn getOutput;\n\t\t} else {\n\t\t\treturn await this.createActor(input);\n\t\t}\n\t}\n\n\tasync createActor({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t\tinput,\n\t}: CreateInput<{ Bindings: Bindings }>): Promise<ActorOutput> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\t// Check if actor with the same name and key already exists\n\t\tconst existingActor = await this.getWithKey({ c, name, key });\n\t\tif (existingActor) {\n\t\t\tthrow new ActorAlreadyExists(name, key);\n\t\t}\n\n\t\t// Create a deterministic ID from the actor name and key\n\t\t// This ensures that actors with the same name and key will have the same ID\n\t\tconst nameKeyString = serializeNameAndKey(name, key);\n\t\tconst doId = env.ACTOR_DO.idFromName(nameKeyString);\n\t\tconst actorId = doId.toString();\n\n\t\t// Init actor\n\t\tconst actor = env.ACTOR_DO.get(doId);\n\t\tawait actor.initialize({\n\t\t\tname,\n\t\t\tkey,\n\t\t\tinput,\n\t\t});\n\n\t\t// Store combined actor metadata (name and key)\n\t\tconst actorData: ActorData = { name, key };\n\t\tawait env.ACTOR_KV.put(\n\t\t\tKEYS.ACTOR.metadata(actorId),\n\t\t\tJSON.stringify(actorData),\n\t\t);\n\n\t\t// Add to key index for lookups by name and key\n\t\tawait env.ACTOR_KV.put(KEYS.ACTOR.keyIndex(name, key), actorId);\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t};\n\t}\n\n\t// Helper method to build actor output from an ID\n\tasync #buildActorOutput(\n\t\tc: any,\n\t\tactorId: string,\n\t): Promise<ActorOutput | undefined> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tconst actorData = (await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t})) as ActorData | null;\n\n\t\tif (!actorData) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname: actorData.name,\n\t\t\tkey: actorData.key,\n\t\t};\n\t}\n\n\tdisplayInformation(): ManagerDisplayInformation {\n\t\treturn {\n\t\t\tname: \"Cloudflare Workers\",\n\t\t\tproperties: {},\n\t\t};\n\t}\n}\n","// Constants for key handling\nexport const EMPTY_KEY = \"(none)\";\nexport const KEY_SEPARATOR = \",\";\n\n/**\n * Serializes an array of key strings into a single string for use with idFromName\n *\n * @param name The actor name\n * @param key Array of key strings to serialize\n * @returns A single string containing the serialized name and key\n */\nexport function serializeNameAndKey(name: string, key: string[]): string {\n\t// Escape colons in the name\n\tconst escapedName = name.replace(/:/g, \"\\\\:\");\n\n\t// For empty keys, just return the name and a marker\n\tif (key.length === 0) {\n\t\treturn `${escapedName}:${EMPTY_KEY}`;\n\t}\n\n\t// Serialize the key array\n\tconst serializedKey = serializeKey(key);\n\n\t// Combine name and serialized key\n\treturn `${escapedName}:${serializedKey}`;\n}\n\n/**\n * Serializes an array of key strings into a single string\n *\n * @param key Array of key strings to serialize\n * @returns A single string containing the serialized key\n */\nexport function serializeKey(key: string[]): string {\n\t// Use a special marker for empty key arrays\n\tif (key.length === 0) {\n\t\treturn EMPTY_KEY;\n\t}\n\n\t// Escape each key part to handle the separator and the empty key marker\n\tconst escapedParts = key.map((part) => {\n\t\t// First check if it matches our empty key marker\n\t\tif (part === EMPTY_KEY) {\n\t\t\treturn `\\\\${EMPTY_KEY}`;\n\t\t}\n\n\t\t// Escape backslashes first, then commas\n\t\tlet escaped = part.replace(/\\\\/g, \"\\\\\\\\\");\n\t\tescaped = escaped.replace(/,/g, \"\\\\,\");\n\t\treturn escaped;\n\t});\n\n\treturn escapedParts.join(KEY_SEPARATOR);\n}\n\n/**\n * Deserializes a key string back into an array of key strings\n *\n * @param keyString The serialized key string\n * @returns Array of key strings\n */\nexport function deserializeKey(keyString: string): string[] {\n\t// Handle empty values\n\tif (!keyString) {\n\t\treturn [];\n\t}\n\n\t// Check for special empty key marker\n\tif (keyString === EMPTY_KEY) {\n\t\treturn [];\n\t}\n\n\t// Split by unescaped commas and unescape the escaped characters\n\tconst parts: string[] = [];\n\tlet currentPart = \"\";\n\tlet escaping = false;\n\n\tfor (let i = 0; i < keyString.length; i++) {\n\t\tconst char = keyString[i];\n\n\t\tif (escaping) {\n\t\t\t// This is an escaped character, add it directly\n\t\t\tcurrentPart += char;\n\t\t\tescaping = false;\n\t\t} else if (char === \"\\\\\") {\n\t\t\t// Start of an escape sequence\n\t\t\tescaping = true;\n\t\t} else if (char === KEY_SEPARATOR) {\n\t\t\t// This is a separator\n\t\t\tparts.push(currentPart);\n\t\t\tcurrentPart = \"\";\n\t\t} else {\n\t\t\t// Regular character\n\t\t\tcurrentPart += char;\n\t\t}\n\t}\n\n\t// Add the last part if it exists\n\tif (currentPart || parts.length > 0) {\n\t\tparts.push(currentPart);\n\t}\n\n\treturn parts;\n}\n","// Modified from https://github.com/honojs/hono/blob/40ea0eee58e39b31053a0246c595434f1094ad31/src/adapter/cloudflare-workers/websocket.ts#L17\n//\n// This version calls the open event by default\n\nimport type { UpgradeWebSocket, WSEvents, WSReadyState } from \"hono/ws\";\nimport { defineWebSocketHelper, WSContext } from \"hono/ws\";\nimport { WS_PROTOCOL_STANDARD } from \"rivetkit/driver-helpers\";\n\n// Based on https://github.com/honojs/hono/issues/1153#issuecomment-1767321332\nexport const upgradeWebSocket: UpgradeWebSocket<\n\tWebSocket,\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tany,\n\tWSEvents<WebSocket>\n> = defineWebSocketHelper(async (c, events) => {\n\tconst upgradeHeader = c.req.header(\"Upgrade\");\n\tif (upgradeHeader !== \"websocket\") {\n\t\treturn;\n\t}\n\n\tconst webSocketPair = new WebSocketPair();\n\tconst client: WebSocket = webSocketPair[0];\n\tconst server: WebSocket = webSocketPair[1];\n\n\tconst wsContext = new WSContext<WebSocket>({\n\t\tclose: (code, reason) => server.close(code, reason),\n\t\tget protocol() {\n\t\t\treturn server.protocol;\n\t\t},\n\t\traw: server,\n\t\tget readyState() {\n\t\t\treturn server.readyState as WSReadyState;\n\t\t},\n\t\turl: server.url ? new URL(server.url) : null,\n\t\tsend: (source) => server.send(source),\n\t});\n\n\tif (events.onClose) {\n\t\tserver.addEventListener(\"close\", (evt: CloseEvent) =>\n\t\t\tevents.onClose?.(evt, wsContext),\n\t\t);\n\t}\n\tif (events.onMessage) {\n\t\tserver.addEventListener(\"message\", (evt: MessageEvent) =>\n\t\t\tevents.onMessage?.(evt, wsContext),\n\t\t);\n\t}\n\tif (events.onError) {\n\t\tserver.addEventListener(\"error\", (evt: Event) =>\n\t\t\tevents.onError?.(evt, wsContext),\n\t\t);\n\t}\n\n\tserver.accept?.();\n\n\t// note: cloudflare actors doesn't support 'open' event, so we call it immediately with a fake event\n\t//\n\t// we have to do this after `server.accept() is called`\n\tevents.onOpen?.(new Event(\"open\"), wsContext);\n\n\t// Build response headers\n\tconst headers: Record<string, string> = {};\n\n\t// Set Sec-WebSocket-Protocol if does not exist\n\tconst protocols = c.req.header(\"Sec-WebSocket-Protocol\");\n\tif (\n\t\ttypeof protocols === \"string\" &&\n\t\tprotocols\n\t\t\t.split(\",\")\n\t\t\t.map((x) => x.trim())\n\t\t\t.includes(WS_PROTOCOL_STANDARD)\n\t) {\n\t\theaders[\"Sec-WebSocket-Protocol\"] = WS_PROTOCOL_STANDARD;\n\t}\n\n\treturn new Response(null, {\n\t\tstatus: 101,\n\t\theaders,\n\t\twebSocket: client,\n\t});\n});\n"],"mappings":"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","names":["env","invariant","promiseWithResolvers","promiseWithResolvers","invariant","KEYS","env","WS_PROTOCOL_STANDARD","_a","env","ActorHandler"]}
1
+ {"version":3,"sources":["../src/handler.ts","../src/actor-handler-do.ts","../src/actor-driver.ts","../src/log.ts","../src/config.ts","../src/manager-driver.ts","../src/util.ts","../src/websocket.ts"],"sourcesContent":["import { env } from \"cloudflare:workers\";\nimport type { Registry, RunConfig } from \"rivetkit\";\nimport {\n\ttype ActorHandlerInterface,\n\tcreateActorDurableObject,\n\ttype DurableObjectConstructor,\n} from \"./actor-handler-do\";\nimport { ConfigSchema, type InputConfig } from \"./config\";\nimport { CloudflareActorsManagerDriver } from \"./manager-driver\";\nimport { upgradeWebSocket } from \"./websocket\";\n\n/** Cloudflare Workers env */\nexport interface Bindings {\n\tACTOR_KV: KVNamespace;\n\tACTOR_DO: DurableObjectNamespace<ActorHandlerInterface>;\n}\n\n/**\n * Stores the env for the current request. Required since some contexts like the inline client driver does not have access to the Hono context.\n *\n * Use getCloudflareAmbientEnv unless using CF_AMBIENT_ENV.run.\n */\nexport function getCloudflareAmbientEnv(): Bindings {\n\treturn env as unknown as Bindings;\n}\n\ninterface Handler {\n\thandler: ExportedHandler<Bindings>;\n\tActorHandler: DurableObjectConstructor;\n}\n\nexport function createHandler<R extends Registry<any>>(\n\tregistry: R,\n\tinputConfig?: InputConfig,\n): Handler {\n\tconst config = ConfigSchema.parse(inputConfig);\n\n\t// Create config\n\tconst runConfig = {\n\t\t...config,\n\t\tdriver: {\n\t\t\tname: \"cloudflare-workers\",\n\t\t\tmanager: () => new CloudflareActorsManagerDriver(),\n\t\t\t// HACK: We can't build the actor driver until we're inside the Durable Object\n\t\t\tactor: undefined as any,\n\t\t},\n\t\tgetUpgradeWebSocket: () => upgradeWebSocket,\n\t} satisfies RunConfig;\n\n\t// Create Durable Object\n\tconst ActorHandler = createActorDurableObject(registry, runConfig);\n\n\t// Create server\n\tconst serverOutput = registry.start(runConfig);\n\n\t// Create Cloudflare handler\n\tconst handler = {\n\t\tfetch: (request, cfEnv, ctx) => {\n\t\t\tconst url = new URL(request.url);\n\n\t\t\t// Inject Rivet env\n\t\t\tconst env = Object.assign({ RIVET: serverOutput.client }, cfEnv);\n\n\t\t\t// Mount Rivet manager API\n\t\t\tif (url.pathname.startsWith(config.managerPath)) {\n\t\t\t\tconst strippedPath = url.pathname.substring(config.managerPath.length);\n\t\t\t\turl.pathname = strippedPath;\n\t\t\t\tconst modifiedRequest = new Request(url.toString(), request);\n\t\t\t\treturn serverOutput.fetch(modifiedRequest, env, ctx);\n\t\t\t}\n\n\t\t\tif (config.fetch) {\n\t\t\t\treturn config.fetch(request, env, ctx);\n\t\t\t} else {\n\t\t\t\treturn new Response(\n\t\t\t\t\t\"This is a RivetKit server.\\n\\nLearn more at https://rivetkit.org\\n\",\n\t\t\t\t\t{ status: 200 },\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t} satisfies ExportedHandler<Bindings>;\n\n\treturn { handler, ActorHandler };\n}\n","import { DurableObject, env } from \"cloudflare:workers\";\nimport type { ExecutionContext } from \"hono\";\nimport invariant from \"invariant\";\nimport type { ActorKey, ActorRouter, Registry, RunConfig } from \"rivetkit\";\nimport { createActorRouter, createClientWithDriver } from \"rivetkit\";\nimport type { ActorDriver } from \"rivetkit/driver-helpers\";\nimport {\n\ttype ManagerDriver,\n\tserializeEmptyPersistData,\n} from \"rivetkit/driver-helpers\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\nimport {\n\tCloudflareDurableObjectGlobalState,\n\tcreateCloudflareActorsActorDriverBuilder,\n} from \"./actor-driver\";\nimport type { Bindings } from \"./handler\";\nimport { logger } from \"./log\";\n\nexport const KEYS = {\n\tNAME: \"rivetkit:name\",\n\tKEY: \"rivetkit:key\",\n\tPERSIST_DATA: \"rivetkit:data\",\n};\n\nexport interface ActorHandlerInterface extends DurableObject {\n\tinitialize(req: ActorInitRequest): Promise<void>;\n}\n\nexport interface ActorInitRequest {\n\tname: string;\n\tkey: ActorKey;\n\tinput?: unknown;\n}\n\ninterface InitializedData {\n\tname: string;\n\tkey: ActorKey;\n}\n\nexport type DurableObjectConstructor = new (\n\t...args: ConstructorParameters<typeof DurableObject<Bindings>>\n) => DurableObject<Bindings>;\n\ninterface LoadedActor {\n\tactorRouter: ActorRouter;\n\tactorDriver: ActorDriver;\n}\n\nexport function createActorDurableObject(\n\tregistry: Registry<any>,\n\trootRunConfig: RunConfig,\n): DurableObjectConstructor {\n\tconst globalState = new CloudflareDurableObjectGlobalState();\n\n\t// Configure to use the runner role instead of server role\n\tconst runConfig = Object.assign({}, rootRunConfig, { role: \"runner\" });\n\n\t/**\n\t * Startup steps:\n\t * 1. If not already created call `initialize`, otherwise check KV to ensure it's initialized\n\t * 2. Load actor\n\t * 3. Start service requests\n\t */\n\treturn class ActorHandler\n\t\textends DurableObject<Bindings>\n\t\timplements ActorHandlerInterface\n\t{\n\t\t#initialized?: InitializedData;\n\t\t#initializedPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\n\t\t#actor?: LoadedActor;\n\n\t\tasync #loadActor(): Promise<LoadedActor> {\n\t\t\t// Wait for init\n\t\t\tif (!this.#initialized) {\n\t\t\t\t// Wait for init\n\t\t\t\tif (this.#initializedPromise) {\n\t\t\t\t\tawait this.#initializedPromise.promise;\n\t\t\t\t} else {\n\t\t\t\t\tthis.#initializedPromise = promiseWithResolvers();\n\t\t\t\t\tconst res = await this.ctx.storage.get([\n\t\t\t\t\t\tKEYS.NAME,\n\t\t\t\t\t\tKEYS.KEY,\n\t\t\t\t\t\tKEYS.PERSIST_DATA,\n\t\t\t\t\t]);\n\t\t\t\t\tif (res.get(KEYS.PERSIST_DATA)) {\n\t\t\t\t\t\tconst name = res.get(KEYS.NAME) as string;\n\t\t\t\t\t\tif (!name) throw new Error(\"missing actor name\");\n\t\t\t\t\t\tconst key = res.get(KEYS.KEY) as ActorKey;\n\t\t\t\t\t\tif (!key) throw new Error(\"missing actor key\");\n\n\t\t\t\t\t\tlogger().debug({ msg: \"already initialized\", name, key });\n\n\t\t\t\t\t\tthis.#initialized = { name, key };\n\t\t\t\t\t\tthis.#initializedPromise.resolve();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger().debug(\"waiting to initialize\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check if already loaded\n\t\t\tif (this.#actor) {\n\t\t\t\treturn this.#actor;\n\t\t\t}\n\n\t\t\tif (!this.#initialized) throw new Error(\"Not initialized\");\n\n\t\t\t// Register DO with global state first\n\t\t\t// HACK: This leaks the DO context, but DO does not provide a native way\n\t\t\t// of knowing when the DO shuts down. We're making a broad assumption\n\t\t\t// that DO will boot a new isolate frequenlty enough that this is not an issue.\n\t\t\tconst actorId = this.ctx.id.toString();\n\t\t\tglobalState.setDOState(actorId, { ctx: this.ctx, env: env });\n\n\t\t\t// Configure actor driver\n\t\t\tinvariant(runConfig.driver, \"runConfig.driver\");\n\t\t\trunConfig.driver.actor =\n\t\t\t\tcreateCloudflareActorsActorDriverBuilder(globalState);\n\n\t\t\t// Create manager driver (we need this for the actor router)\n\t\t\tconst managerDriver = runConfig.driver.manager(\n\t\t\t\tregistry.config,\n\t\t\t\trunConfig,\n\t\t\t);\n\n\t\t\tconfigureInspectorAccessToken(registry.config, managerDriver);\n\n\t\t\t// Create inline client\n\t\t\tconst inlineClient = createClientWithDriver(managerDriver);\n\n\t\t\t// Create actor driver\n\t\t\tconst actorDriver = runConfig.driver.actor(\n\t\t\t\tregistry.config,\n\t\t\t\trunConfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tinlineClient,\n\t\t\t);\n\n\t\t\t// Create actor router\n\t\t\tconst actorRouter = createActorRouter(runConfig, actorDriver, false);\n\n\t\t\t// Save actor\n\t\t\tthis.#actor = {\n\t\t\t\tactorRouter,\n\t\t\t\tactorDriver,\n\t\t\t};\n\n\t\t\t// Initialize the actor instance with proper metadata\n\t\t\t// This ensures the actor driver knows about this actor\n\t\t\tawait actorDriver.loadActor(actorId);\n\n\t\t\treturn this.#actor;\n\t\t}\n\n\t\t/** RPC called by the service that creates the DO to initialize it. */\n\t\tasync initialize(req: ActorInitRequest) {\n\t\t\t// TODO: Need to add this to a core promise that needs to be resolved before start\n\n\t\t\tawait this.ctx.storage.put({\n\t\t\t\t[KEYS.NAME]: req.name,\n\t\t\t\t[KEYS.KEY]: req.key,\n\t\t\t\t[KEYS.PERSIST_DATA]: serializeEmptyPersistData(req.input),\n\t\t\t});\n\t\t\tthis.#initialized = {\n\t\t\t\tname: req.name,\n\t\t\t\tkey: req.key,\n\t\t\t};\n\n\t\t\tlogger().debug({ msg: \"initialized actor\", key: req.key });\n\n\t\t\t// Preemptively actor so the lifecycle hooks are called\n\t\t\tawait this.#loadActor();\n\t\t}\n\n\t\tasync fetch(request: Request): Promise<Response> {\n\t\t\tconst { actorRouter } = await this.#loadActor();\n\n\t\t\tconst actorId = this.ctx.id.toString();\n\t\t\treturn await actorRouter.fetch(request, {\n\t\t\t\tactorId,\n\t\t\t});\n\t\t}\n\n\t\tasync alarm(): Promise<void> {\n\t\t\tconst { actorDriver } = await this.#loadActor();\n\t\t\tconst actorId = this.ctx.id.toString();\n\n\t\t\t// Load the actor instance and trigger alarm\n\t\t\tconst actor = await actorDriver.loadActor(actorId);\n\t\t\tawait actor._onAlarm();\n\t\t}\n\t};\n}\nfunction configureInspectorAccessToken(\n\tconfig: any,\n\tmanagerDriver: ManagerDriver,\n) {\n\tthrow new Error(\"Function not implemented.\");\n}\n","import invariant from \"invariant\";\nimport type {\n\tAnyActorInstance as CoreAnyActorInstance,\n\tRegistryConfig,\n\tRunConfig,\n} from \"rivetkit\";\nimport { lookupInRegistry } from \"rivetkit\";\nimport type { Client } from \"rivetkit/client\";\nimport type {\n\tActorDriver,\n\tAnyActorInstance,\n\tManagerDriver,\n} from \"rivetkit/driver-helpers\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\nimport { KEYS } from \"./actor-handler-do\";\n\ninterface DurableObjectGlobalState {\n\tctx: DurableObjectState;\n\tenv: unknown;\n}\n\n/**\n * Cloudflare DO can have multiple DO running within the same global scope.\n *\n * This allows for storing the actor context globally and looking it up by ID in `CloudflareActorsActorDriver`.\n */\nexport class CloudflareDurableObjectGlobalState {\n\t// Single map for all actor state\n\t#dos: Map<string, DurableObjectGlobalState> = new Map();\n\n\tgetDOState(actorId: string): DurableObjectGlobalState {\n\t\tconst state = this.#dos.get(actorId);\n\t\tinvariant(state !== undefined, \"durable object state not in global state\");\n\t\treturn state;\n\t}\n\n\tsetDOState(actorId: string, state: DurableObjectGlobalState) {\n\t\tthis.#dos.set(actorId, state);\n\t}\n}\n\nexport interface DriverContext {\n\tstate: DurableObjectState;\n}\n\n// Actor handler to track running instances\nclass ActorHandler {\n\tactor?: AnyActorInstance;\n\tactorPromise?: ReturnType<typeof promiseWithResolvers<void>> =\n\t\tpromiseWithResolvers();\n}\n\nexport class CloudflareActorsActorDriver implements ActorDriver {\n\t#registryConfig: RegistryConfig;\n\t#runConfig: RunConfig;\n\t#managerDriver: ManagerDriver;\n\t#inlineClient: Client<any>;\n\t#globalState: CloudflareDurableObjectGlobalState;\n\t#actors: Map<string, ActorHandler> = new Map();\n\n\tconstructor(\n\t\tregistryConfig: RegistryConfig,\n\t\trunConfig: RunConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: Client<any>,\n\t\tglobalState: CloudflareDurableObjectGlobalState,\n\t) {\n\t\tthis.#registryConfig = registryConfig;\n\t\tthis.#runConfig = runConfig;\n\t\tthis.#managerDriver = managerDriver;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#globalState = globalState;\n\t}\n\n\t#getDOCtx(actorId: string) {\n\t\treturn this.#globalState.getDOState(actorId).ctx;\n\t}\n\n\tasync loadActor(actorId: string): Promise<AnyActorInstance> {\n\t\t// Check if actor is already loaded\n\t\tlet handler = this.#actors.get(actorId);\n\t\tif (handler) {\n\t\t\tif (handler.actorPromise) await handler.actorPromise.promise;\n\t\t\tif (!handler.actor) throw new Error(\"Actor should be loaded\");\n\t\t\treturn handler.actor;\n\t\t}\n\n\t\t// Create new actor handler\n\t\thandler = new ActorHandler();\n\t\tthis.#actors.set(actorId, handler);\n\n\t\t// Get the actor metadata from Durable Object storage\n\t\tconst doState = this.#globalState.getDOState(actorId);\n\t\tconst storage = doState.ctx.storage;\n\n\t\t// Load actor metadata\n\t\tconst [name, key] = await Promise.all([\n\t\t\tstorage.get<string>(KEYS.NAME),\n\t\t\tstorage.get<string[]>(KEYS.KEY),\n\t\t]);\n\n\t\tif (!name) {\n\t\t\tthrow new Error(`Actor ${actorId} is not initialized - missing name`);\n\t\t}\n\t\tif (!key) {\n\t\t\tthrow new Error(`Actor ${actorId} is not initialized - missing key`);\n\t\t}\n\n\t\t// Create actor instance\n\t\tconst definition = lookupInRegistry(this.#registryConfig, name);\n\t\thandler.actor = definition.instantiate();\n\n\t\t// Start actor\n\t\tawait handler.actor.start(\n\t\t\tthis,\n\t\t\tthis.#inlineClient,\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t\t\"unknown\", // TODO: Support regions in Cloudflare\n\t\t);\n\n\t\t// Finish\n\t\thandler.actorPromise?.resolve();\n\t\thandler.actorPromise = undefined;\n\n\t\treturn handler.actor;\n\t}\n\n\tgetContext(actorId: string): DriverContext {\n\t\tconst state = this.#globalState.getDOState(actorId);\n\t\treturn { state: state.ctx };\n\t}\n\n\tasync readPersistedData(actorId: string): Promise<Uint8Array | undefined> {\n\t\treturn await this.#getDOCtx(actorId).storage.get(KEYS.PERSIST_DATA);\n\t}\n\n\tasync writePersistedData(actorId: string, data: Uint8Array): Promise<void> {\n\t\tawait this.#getDOCtx(actorId).storage.put(KEYS.PERSIST_DATA, data);\n\t}\n\n\tasync setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {\n\t\tawait this.#getDOCtx(actor.id).storage.setAlarm(timestamp);\n\t}\n\n\tasync getDatabase(actorId: string): Promise<unknown | undefined> {\n\t\treturn this.#getDOCtx(actorId).storage.sql;\n\t}\n}\n\nexport function createCloudflareActorsActorDriverBuilder(\n\tglobalState: CloudflareDurableObjectGlobalState,\n) {\n\treturn (\n\t\tregistryConfig: RegistryConfig,\n\t\trunConfig: RunConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: Client<any>,\n\t) => {\n\t\treturn new CloudflareActorsActorDriver(\n\t\t\tregistryConfig,\n\t\t\trunConfig,\n\t\t\tmanagerDriver,\n\t\t\tinlineClient,\n\t\t\tglobalState,\n\t\t);\n\t};\n}\n","import { getLogger } from \"rivetkit/log\";\n\nexport function logger() {\n\treturn getLogger(\"driver-cloudflare-workers\");\n}\n","import type { Client } from \"rivetkit\";\nimport { RunConfigSchema } from \"rivetkit/driver-helpers\";\nimport { z } from \"zod\";\n\nexport const ConfigSchema = RunConfigSchema.removeDefault()\n\t.omit({ driver: true, getUpgradeWebSocket: true })\n\t.extend({\n\t\t/** Path that the Rivet manager API will be mounted. */\n\t\tmanagerPath: z.string().optional().default(\"/rivet\"),\n\n\t\tfetch: z\n\t\t\t.custom<ExportedHandlerFetchHandler<{ RIVET: Client<any> }, unknown>>()\n\t\t\t.optional(),\n\t})\n\t.default({});\nexport type InputConfig = z.input<typeof ConfigSchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\n","import type { Context as HonoContext } from \"hono\";\nimport type { Encoding, UniversalWebSocket } from \"rivetkit\";\nimport {\n\ttype ActorOutput,\n\ttype CreateInput,\n\ttype GetForIdInput,\n\ttype GetOrCreateWithKeyInput,\n\ttype GetWithKeyInput,\n\tgenerateRandomString,\n\ttype ManagerDisplayInformation,\n\ttype ManagerDriver,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_ID,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_CONN_TOKEN,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_STANDARD,\n\tWS_PROTOCOL_TARGET,\n} from \"rivetkit/driver-helpers\";\nimport { ActorAlreadyExists, InternalError } from \"rivetkit/errors\";\nimport { getCloudflareAmbientEnv } from \"./handler\";\nimport { logger } from \"./log\";\nimport type { Bindings } from \"./mod\";\nimport { serializeKey, serializeNameAndKey } from \"./util\";\n\n// Actor metadata structure\ninterface ActorData {\n\tname: string;\n\tkey: string[];\n}\n\nconst KEYS = {\n\tACTOR: {\n\t\t// Combined key for actor metadata (name and key)\n\t\tmetadata: (actorId: string) => `actor:${actorId}:metadata`,\n\n\t\t// Key index function for actor lookup\n\t\tkeyIndex: (name: string, key: string[] = []) => {\n\t\t\t// Use serializeKey for consistent handling of all keys\n\t\t\treturn `actor_key:${serializeKey(key)}`;\n\t\t},\n\t},\n};\n\nconst STANDARD_WEBSOCKET_HEADERS = [\n\t\"connection\",\n\t\"upgrade\",\n\t\"sec-websocket-key\",\n\t\"sec-websocket-version\",\n\t\"sec-websocket-protocol\",\n\t\"sec-websocket-extensions\",\n];\n\nexport class CloudflareActorsManagerDriver implements ManagerDriver {\n\tasync sendRequest(actorId: string, actorRequest: Request): Promise<Response> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({\n\t\t\tmsg: \"sending request to durable object\",\n\t\t\tactorId,\n\t\t\tmethod: actorRequest.method,\n\t\t\turl: actorRequest.url,\n\t\t});\n\n\t\tconst id = env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync openWebSocket(\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t\tconnId?: string,\n\t\tconnToken?: string,\n\t): Promise<UniversalWebSocket> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({\n\t\t\tmsg: \"opening websocket to durable object\",\n\t\t\tactorId,\n\t\t\tpath,\n\t\t});\n\n\t\t// Make a fetch request to the Durable Object with WebSocket upgrade\n\t\tconst id = env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = env.ACTOR_DO.get(id);\n\n\t\tconst protocols: string[] = [];\n\t\tprotocols.push(WS_PROTOCOL_STANDARD);\n\t\tprotocols.push(`${WS_PROTOCOL_TARGET}actor`);\n\t\tprotocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);\n\t\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\t\tif (params) {\n\t\t\tprotocols.push(\n\t\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t\t);\n\t\t}\n\t\tif (connId) {\n\t\t\tprotocols.push(`${WS_PROTOCOL_CONN_ID}${connId}`);\n\t\t}\n\t\tif (connToken) {\n\t\t\tprotocols.push(`${WS_PROTOCOL_CONN_TOKEN}${connToken}`);\n\t\t}\n\n\t\tconst headers: Record<string, string> = {\n\t\t\tUpgrade: \"websocket\",\n\t\t\tConnection: \"Upgrade\",\n\t\t\t\"sec-websocket-protocol\": protocols.join(\", \"),\n\t\t};\n\n\t\t// Use the path parameter to determine the URL\n\t\tconst normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n\t\tconst url = `http://actor${normalizedPath}`;\n\n\t\tlogger().debug({ msg: \"rewriting websocket url\", from: path, to: url });\n\n\t\tconst response = await stub.fetch(url, {\n\t\t\theaders,\n\t\t});\n\t\tconst webSocket = response.webSocket;\n\n\t\tif (!webSocket) {\n\t\t\tthrow new InternalError(\n\t\t\t\t`missing websocket connection in response from DO\\n\\nStatus: ${response.status}\\nResponse: ${await response.text()}`,\n\t\t\t);\n\t\t}\n\n\t\tlogger().debug({\n\t\t\tmsg: \"durable object websocket connection open\",\n\t\t\tactorId,\n\t\t});\n\n\t\twebSocket.accept();\n\n\t\t// TODO: Is this still needed?\n\t\t// HACK: Cloudflare does not call onopen automatically, so we need\n\t\t// to call this on the next tick\n\t\tsetTimeout(() => {\n\t\t\tconst event = new Event(\"open\");\n\t\t\t(webSocket as any).onopen?.(event);\n\t\t\t(webSocket as any).dispatchEvent(event);\n\t\t}, 0);\n\n\t\treturn webSocket as unknown as UniversalWebSocket;\n\t}\n\n\tasync proxyRequest(\n\t\tc: HonoContext<{ Bindings: Bindings }>,\n\t\tactorRequest: Request,\n\t\tactorId: string,\n\t): Promise<Response> {\n\t\tlogger().debug({\n\t\t\tmsg: \"forwarding request to durable object\",\n\t\t\tactorId,\n\t\t\tmethod: actorRequest.method,\n\t\t\turl: actorRequest.url,\n\t\t});\n\n\t\tconst id = c.env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = c.env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync proxyWebSocket(\n\t\tc: HonoContext<{ Bindings: Bindings }>,\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<Response> {\n\t\tlogger().debug({\n\t\t\tmsg: \"forwarding websocket to durable object\",\n\t\t\tactorId,\n\t\t\tpath,\n\t\t});\n\n\t\t// Validate upgrade\n\t\tconst upgradeHeader = c.req.header(\"Upgrade\");\n\t\tif (!upgradeHeader || upgradeHeader !== \"websocket\") {\n\t\t\treturn new Response(\"Expected Upgrade: websocket\", {\n\t\t\t\tstatus: 426,\n\t\t\t});\n\t\t}\n\n\t\tconst newUrl = new URL(`http://actor${path}`);\n\t\tconst actorRequest = new Request(newUrl, c.req.raw);\n\n\t\tlogger().debug({\n\t\t\tmsg: \"rewriting websocket url\",\n\t\t\tfrom: c.req.url,\n\t\t\tto: actorRequest.url,\n\t\t});\n\n\t\t// Always build fresh request to prevent forwarding unwanted headers\n\t\t// HACK: Since we can't build a new request, we need to remove\n\t\t// non-standard headers manually\n\t\tconst headerKeys: string[] = [];\n\t\tactorRequest.headers.forEach((v, k) => headerKeys.push(k));\n\t\tfor (const k of headerKeys) {\n\t\t\tif (!STANDARD_WEBSOCKET_HEADERS.includes(k)) {\n\t\t\t\tactorRequest.headers.delete(k);\n\t\t\t}\n\t\t}\n\n\t\t// Build protocols for WebSocket connection\n\t\tconst protocols: string[] = [];\n\t\tprotocols.push(WS_PROTOCOL_STANDARD);\n\t\tprotocols.push(`${WS_PROTOCOL_TARGET}actor`);\n\t\tprotocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);\n\t\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\t\tif (params) {\n\t\t\tprotocols.push(\n\t\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t\t);\n\t\t}\n\t\tactorRequest.headers.set(\"sec-websocket-protocol\", protocols.join(\", \"));\n\n\t\tconst id = c.env.ACTOR_DO.idFromString(actorId);\n\t\tconst stub = c.env.ACTOR_DO.get(id);\n\n\t\treturn await stub.fetch(actorRequest);\n\t}\n\n\tasync getForId({\n\t\tc,\n\t\tactorId,\n\t}: GetForIdInput<{ Bindings: Bindings }>): Promise<ActorOutput | undefined> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\t// Get actor metadata from KV (combined name and key)\n\t\tconst actorData = (await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t})) as ActorData | null;\n\n\t\t// If the actor doesn't exist, return undefined\n\t\tif (!actorData) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname: actorData.name,\n\t\t\tkey: actorData.key,\n\t\t};\n\t}\n\n\tasync getWithKey({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t}: GetWithKeyInput<{ Bindings: Bindings }>): Promise<\n\t\tActorOutput | undefined\n\t> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tlogger().debug({ msg: \"getWithKey: searching for actor\", name, key });\n\n\t\t// Generate deterministic ID from the name and key\n\t\t// This is aligned with how createActor generates IDs\n\t\tconst nameKeyString = serializeNameAndKey(name, key);\n\t\tconst actorId = env.ACTOR_DO.idFromName(nameKeyString).toString();\n\n\t\t// Check if the actor metadata exists\n\t\tconst actorData = await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t});\n\n\t\tif (!actorData) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"getWithKey: no actor found with matching name and key\",\n\t\t\t\tname,\n\t\t\t\tkey,\n\t\t\t\tactorId,\n\t\t\t});\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlogger().debug({\n\t\t\tmsg: \"getWithKey: found actor with matching name and key\",\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t});\n\t\treturn this.#buildActorOutput(c, actorId);\n\t}\n\n\tasync getOrCreateWithKey(\n\t\tinput: GetOrCreateWithKeyInput,\n\t): Promise<ActorOutput> {\n\t\t// TODO: Prevent race condition here\n\t\tconst getOutput = await this.getWithKey(input);\n\t\tif (getOutput) {\n\t\t\treturn getOutput;\n\t\t} else {\n\t\t\treturn await this.createActor(input);\n\t\t}\n\t}\n\n\tasync createActor({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t\tinput,\n\t}: CreateInput<{ Bindings: Bindings }>): Promise<ActorOutput> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\t// Check if actor with the same name and key already exists\n\t\tconst existingActor = await this.getWithKey({ c, name, key });\n\t\tif (existingActor) {\n\t\t\tthrow new ActorAlreadyExists(name, key);\n\t\t}\n\n\t\t// Create a deterministic ID from the actor name and key\n\t\t// This ensures that actors with the same name and key will have the same ID\n\t\tconst nameKeyString = serializeNameAndKey(name, key);\n\t\tconst doId = env.ACTOR_DO.idFromName(nameKeyString);\n\t\tconst actorId = doId.toString();\n\n\t\t// Init actor\n\t\tconst actor = env.ACTOR_DO.get(doId);\n\t\tawait actor.initialize({\n\t\t\tname,\n\t\t\tkey,\n\t\t\tinput,\n\t\t});\n\n\t\t// Store combined actor metadata (name and key)\n\t\tconst actorData: ActorData = { name, key };\n\t\tawait env.ACTOR_KV.put(\n\t\t\tKEYS.ACTOR.metadata(actorId),\n\t\t\tJSON.stringify(actorData),\n\t\t);\n\n\t\t// Add to key index for lookups by name and key\n\t\tawait env.ACTOR_KV.put(KEYS.ACTOR.keyIndex(name, key), actorId);\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t};\n\t}\n\n\t// Helper method to build actor output from an ID\n\tasync #buildActorOutput(\n\t\tc: any,\n\t\tactorId: string,\n\t): Promise<ActorOutput | undefined> {\n\t\tconst env = getCloudflareAmbientEnv();\n\n\t\tconst actorData = (await env.ACTOR_KV.get(KEYS.ACTOR.metadata(actorId), {\n\t\t\ttype: \"json\",\n\t\t})) as ActorData | null;\n\n\t\tif (!actorData) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname: actorData.name,\n\t\t\tkey: actorData.key,\n\t\t};\n\t}\n\n\tdisplayInformation(): ManagerDisplayInformation {\n\t\treturn {\n\t\t\tname: \"Cloudflare Workers\",\n\t\t\tproperties: {},\n\t\t};\n\t}\n\n\tgetOrCreateInspectorAccessToken() {\n\t\treturn generateRandomString();\n\t}\n}\n","// Constants for key handling\nexport const EMPTY_KEY = \"(none)\";\nexport const KEY_SEPARATOR = \",\";\n\n/**\n * Serializes an array of key strings into a single string for use with idFromName\n *\n * @param name The actor name\n * @param key Array of key strings to serialize\n * @returns A single string containing the serialized name and key\n */\nexport function serializeNameAndKey(name: string, key: string[]): string {\n\t// Escape colons in the name\n\tconst escapedName = name.replace(/:/g, \"\\\\:\");\n\n\t// For empty keys, just return the name and a marker\n\tif (key.length === 0) {\n\t\treturn `${escapedName}:${EMPTY_KEY}`;\n\t}\n\n\t// Serialize the key array\n\tconst serializedKey = serializeKey(key);\n\n\t// Combine name and serialized key\n\treturn `${escapedName}:${serializedKey}`;\n}\n\n/**\n * Serializes an array of key strings into a single string\n *\n * @param key Array of key strings to serialize\n * @returns A single string containing the serialized key\n */\nexport function serializeKey(key: string[]): string {\n\t// Use a special marker for empty key arrays\n\tif (key.length === 0) {\n\t\treturn EMPTY_KEY;\n\t}\n\n\t// Escape each key part to handle the separator and the empty key marker\n\tconst escapedParts = key.map((part) => {\n\t\t// First check if it matches our empty key marker\n\t\tif (part === EMPTY_KEY) {\n\t\t\treturn `\\\\${EMPTY_KEY}`;\n\t\t}\n\n\t\t// Escape backslashes first, then commas\n\t\tlet escaped = part.replace(/\\\\/g, \"\\\\\\\\\");\n\t\tescaped = escaped.replace(/,/g, \"\\\\,\");\n\t\treturn escaped;\n\t});\n\n\treturn escapedParts.join(KEY_SEPARATOR);\n}\n\n/**\n * Deserializes a key string back into an array of key strings\n *\n * @param keyString The serialized key string\n * @returns Array of key strings\n */\nexport function deserializeKey(keyString: string): string[] {\n\t// Handle empty values\n\tif (!keyString) {\n\t\treturn [];\n\t}\n\n\t// Check for special empty key marker\n\tif (keyString === EMPTY_KEY) {\n\t\treturn [];\n\t}\n\n\t// Split by unescaped commas and unescape the escaped characters\n\tconst parts: string[] = [];\n\tlet currentPart = \"\";\n\tlet escaping = false;\n\n\tfor (let i = 0; i < keyString.length; i++) {\n\t\tconst char = keyString[i];\n\n\t\tif (escaping) {\n\t\t\t// This is an escaped character, add it directly\n\t\t\tcurrentPart += char;\n\t\t\tescaping = false;\n\t\t} else if (char === \"\\\\\") {\n\t\t\t// Start of an escape sequence\n\t\t\tescaping = true;\n\t\t} else if (char === KEY_SEPARATOR) {\n\t\t\t// This is a separator\n\t\t\tparts.push(currentPart);\n\t\t\tcurrentPart = \"\";\n\t\t} else {\n\t\t\t// Regular character\n\t\t\tcurrentPart += char;\n\t\t}\n\t}\n\n\t// Add the last part if it exists\n\tif (currentPart || parts.length > 0) {\n\t\tparts.push(currentPart);\n\t}\n\n\treturn parts;\n}\n","// Modified from https://github.com/honojs/hono/blob/40ea0eee58e39b31053a0246c595434f1094ad31/src/adapter/cloudflare-workers/websocket.ts#L17\n//\n// This version calls the open event by default\n\nimport type { UpgradeWebSocket, WSEvents, WSReadyState } from \"hono/ws\";\nimport { defineWebSocketHelper, WSContext } from \"hono/ws\";\nimport { WS_PROTOCOL_STANDARD } from \"rivetkit/driver-helpers\";\n\n// Based on https://github.com/honojs/hono/issues/1153#issuecomment-1767321332\nexport const upgradeWebSocket: UpgradeWebSocket<\n\tWebSocket,\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tany,\n\tWSEvents<WebSocket>\n> = defineWebSocketHelper(async (c, events) => {\n\tconst upgradeHeader = c.req.header(\"Upgrade\");\n\tif (upgradeHeader !== \"websocket\") {\n\t\treturn;\n\t}\n\n\tconst webSocketPair = new WebSocketPair();\n\tconst client: WebSocket = webSocketPair[0];\n\tconst server: WebSocket = webSocketPair[1];\n\n\tconst wsContext = new WSContext<WebSocket>({\n\t\tclose: (code, reason) => server.close(code, reason),\n\t\tget protocol() {\n\t\t\treturn server.protocol;\n\t\t},\n\t\traw: server,\n\t\tget readyState() {\n\t\t\treturn server.readyState as WSReadyState;\n\t\t},\n\t\turl: server.url ? new URL(server.url) : null,\n\t\tsend: (source) => server.send(source),\n\t});\n\n\tif (events.onClose) {\n\t\tserver.addEventListener(\"close\", (evt: CloseEvent) =>\n\t\t\tevents.onClose?.(evt, wsContext),\n\t\t);\n\t}\n\tif (events.onMessage) {\n\t\tserver.addEventListener(\"message\", (evt: MessageEvent) =>\n\t\t\tevents.onMessage?.(evt, wsContext),\n\t\t);\n\t}\n\tif (events.onError) {\n\t\tserver.addEventListener(\"error\", (evt: Event) =>\n\t\t\tevents.onError?.(evt, wsContext),\n\t\t);\n\t}\n\n\tserver.accept?.();\n\n\t// note: cloudflare actors doesn't support 'open' event, so we call it immediately with a fake event\n\t//\n\t// we have to do this after `server.accept() is called`\n\tevents.onOpen?.(new Event(\"open\"), wsContext);\n\n\t// Build response headers\n\tconst headers: Record<string, string> = {};\n\n\t// Set Sec-WebSocket-Protocol if does not exist\n\tconst protocols = c.req.header(\"Sec-WebSocket-Protocol\");\n\tif (\n\t\ttypeof protocols === \"string\" &&\n\t\tprotocols\n\t\t\t.split(\",\")\n\t\t\t.map((x) => x.trim())\n\t\t\t.includes(WS_PROTOCOL_STANDARD)\n\t) {\n\t\theaders[\"Sec-WebSocket-Protocol\"] = WS_PROTOCOL_STANDARD;\n\t}\n\n\treturn new Response(null, {\n\t\tstatus: 101,\n\t\theaders,\n\t\twebSocket: client,\n\t});\n});\n"],"mappings":"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","names":["env","invariant","promiseWithResolvers","promiseWithResolvers","invariant","KEYS","env","WS_PROTOCOL_STANDARD","_a","env","ActorHandler"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rivetkit/cloudflare-workers",
3
- "version": "2.0.8",
3
+ "version": "2.0.10",
4
4
  "description": "Cloudflare Workers adapter for RivetKit actors",
5
5
  "keywords": [
6
6
  "rivetkit",
@@ -46,7 +46,7 @@
46
46
  "invariant": "^2.2.4",
47
47
  "zod": "^3.25.76",
48
48
  "hono": "4.8.3",
49
- "rivetkit": "2.0.8"
49
+ "rivetkit": "2.0.10"
50
50
  },
51
51
  "stableVersion": "0.8.0",
52
52
  "scripts": {
@@ -6,6 +6,7 @@ import {
6
6
  type GetForIdInput,
7
7
  type GetOrCreateWithKeyInput,
8
8
  type GetWithKeyInput,
9
+ generateRandomString,
9
10
  type ManagerDisplayInformation,
10
11
  type ManagerDriver,
11
12
  WS_PROTOCOL_ACTOR,
@@ -372,4 +373,8 @@ export class CloudflareActorsManagerDriver implements ManagerDriver {
372
373
  properties: {},
373
374
  };
374
375
  }
376
+
377
+ getOrCreateInspectorAccessToken() {
378
+ return generateRandomString();
379
+ }
375
380
  }