@rivetkit/core
Version:
1 lines • 82.2 kB
Source Map (JSON)
{"version":3,"sources":["/home/nathan/rivetkit/packages/core/dist/chunk-OBXZ7YJ7.cjs","../src/actor/protocol/serde.ts","../src/actor/log.ts","../src/actor/utils.ts","../src/actor/connection.ts","../src/actor/generic-conn-driver.ts","../src/actor/router-endpoints.ts","../src/actor/action.ts","../src/actor/protocol/http/action.ts","../src/actor/protocol/message/mod.ts","../src/actor/protocol/message/to-server.ts","../src/manager/log.ts","../src/manager/hono-websocket-adapter.ts","../src/inspector/protocol/common.ts","../src/manager/protocol/query.ts"],"names":["message","ActorFeature"],"mappings":"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AAA;AACQ,EAAA;AACY,IAAA;AACL,IAAA;AACA,IAAA;AACf,EAAA;AACQ,EAAA;AACY,IAAA;AACL,IAAA;AACA,IAAA;AACf,EAAA;AACQ,EAAA;AACY,IAAA;AACL,IAAA;AACE,IAAA;AACjB,EAAA;AACD;AAGiD;AAKT;AACJ,EAAA;AACvB,EAAA;AACsB,EAAA;AACX,EAAA;AACY,EAAA;AACpC;AAKoC;AAC3B,EAAA;AACgB,IAAA;AACT,IAAA;AACM,IAAA;AACJ,IAAA;AACjB,EAAA;AACQ,EAAA;AACmB,IAAA;AACP,IAAA;AACC,IAAA;AACrB,EAAA;AACQ,EAAA;AACmB,IAAA;AACP,IAAA;AACH,IAAA;AACjB,EAAA;AACQ,EAAA;AACqB,IAAA;AACT,IAAA;AACH,IAAA;AACjB,EAAA;AACQ,EAAA;AACe,IAAA;AACH,IAAA;AACC,IAAA;AACJ,IAAA;AACjB,EAAA;AACD;AAE0C;AACjC,EAAA;AACK,IAAA;AACO,IAAA;AACpB,EAAA;AACF;AAK4C;AAC7B,EAAA;AACuB,EAAA;AACrC;AAGmC;AAClB,EAAA;AACF,EAAA;AACe,EAAA;AAC9B;AAG8C;AAGV;AACtB,EAAA;AACC,EAAA;AAIb,EAAA;AAE2B,IAAA;AAE3B,EAAA;AACwB,EAAA;AACM,EAAA;AACA,EAAA;AAChC;AAGgD;AAGR;AAC3B,EAAA;AACG,EAAA;AACD,EAAA;AACF,EAAA;AACb;AAGwC;AAKL;AACpB,EAAA;AACgB,EAAA;AACM,EAAA;AACrC;AAE8C;AAGL;AAC1B,EAAA;AAAA;AAEa,EAAA;AACf,EAAA;AACb;Abg4CyC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/nathan/rivetkit/packages/core/dist/chunk-OBXZ7YJ7.cjs","sourcesContent":[null,"import * as cbor from \"cbor-x\";\nimport { z } from \"zod\";\nimport * as errors from \"@/actor/errors\";\nimport { logger } from \"../log\";\nimport { assertUnreachable } from \"../utils\";\n\n/** Data that can be deserialized. */\nexport type InputData = string | Buffer | Blob | ArrayBufferLike | Uint8Array;\n\n/** Data that's been serialized. */\nexport type OutputData = string | Uint8Array;\n\nexport const EncodingSchema = z.enum([\"json\", \"cbor\"]);\n\n/**\n * Encoding used to communicate between the client & actor.\n */\nexport type Encoding = z.infer<typeof EncodingSchema>;\n\n/**\n * Helper class that helps serialize data without re-serializing for the same encoding.\n */\nexport class CachedSerializer<T> {\n\t#data: T;\n\t#cache = new Map<Encoding, OutputData>();\n\n\tconstructor(data: T) {\n\t\tthis.#data = data;\n\t}\n\n\tpublic get rawData(): T {\n\t\treturn this.#data;\n\t}\n\n\tpublic serialize(encoding: Encoding): OutputData {\n\t\tconst cached = this.#cache.get(encoding);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t} else {\n\t\t\tconst serialized = serialize(this.#data, encoding);\n\t\t\tthis.#cache.set(encoding, serialized);\n\t\t\treturn serialized;\n\t\t}\n\t}\n}\n\n/**\n * Use `CachedSerializer` if serializing the same data repeatedly.\n */\nexport function serialize<T>(value: T, encoding: Encoding): OutputData {\n\tif (encoding === \"json\") {\n\t\treturn JSON.stringify(value);\n\t} else if (encoding === \"cbor\") {\n\t\t// TODO: Remove this hack, but cbor-x can't handle anything extra in data structures\n\t\tconst cleanValue = JSON.parse(JSON.stringify(value));\n\t\treturn cbor.encode(cleanValue);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport async function deserialize(data: InputData, encoding: Encoding) {\n\tif (encoding === \"json\") {\n\t\tif (typeof data !== \"string\") {\n\t\t\tlogger().warn(\"received non-string for json parse\");\n\t\t\tthrow new errors.MalformedMessage();\n\t\t} else {\n\t\t\treturn JSON.parse(data);\n\t\t}\n\t} else if (encoding === \"cbor\") {\n\t\tif (data instanceof Blob) {\n\t\t\tconst arrayBuffer = await data.arrayBuffer();\n\t\t\treturn cbor.decode(new Uint8Array(arrayBuffer));\n\t\t} else if (data instanceof Uint8Array) {\n\t\t\treturn cbor.decode(data);\n\t\t} else if (\n\t\t\tdata instanceof ArrayBuffer ||\n\t\t\tdata instanceof SharedArrayBuffer\n\t\t) {\n\t\t\treturn cbor.decode(new Uint8Array(data));\n\t\t} else {\n\t\t\tlogger().warn(\"received non-binary type for cbor parse\");\n\t\t\tthrow new errors.MalformedMessage();\n\t\t}\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\n// TODO: Encode base 128\nfunction base64EncodeUint8Array(uint8Array: Uint8Array): string {\n\tlet binary = \"\";\n\tconst len = uint8Array.byteLength;\n\tfor (let i = 0; i < len; i++) {\n\t\tbinary += String.fromCharCode(uint8Array[i]);\n\t}\n\treturn btoa(binary);\n}\n\nfunction base64EncodeArrayBuffer(arrayBuffer: ArrayBuffer): string {\n\tconst uint8Array = new Uint8Array(arrayBuffer);\n\treturn base64EncodeUint8Array(uint8Array);\n}\n\n/** Converts data that was encoded to a string. Some formats (like SSE) don't support raw binary data. */\nexport function encodeDataToString(message: OutputData): string {\n\tif (typeof message === \"string\") {\n\t\treturn message;\n\t} else if (message instanceof ArrayBuffer) {\n\t\treturn base64EncodeArrayBuffer(message);\n\t} else if (message instanceof Uint8Array) {\n\t\treturn base64EncodeUint8Array(message);\n\t} else {\n\t\tassertUnreachable(message);\n\t}\n}\n","import { getLogger } from \"@/common//log\";\n\n/** Logger for this library. */\nexport const RUNTIME_LOGGER_NAME = \"actor-runtime\";\n\n/** Logger used for logs from the actor instance itself. */\nexport const ACTOR_LOGGER_NAME = \"actor\";\n\nexport function logger() {\n\treturn getLogger(RUNTIME_LOGGER_NAME);\n}\n\nexport function instanceLogger() {\n\treturn getLogger(ACTOR_LOGGER_NAME);\n}\n","import * as errors from \"./errors\";\nimport { logger } from \"./log\";\n\nexport function assertUnreachable(x: never): never {\n\tlogger().error(\"unreachable\", { value: `${x}`, stack: new Error().stack });\n\tthrow new errors.Unreachable(x);\n}\n\nexport const throttle = <\n\t// biome-ignore lint/suspicious/noExplicitAny: we want to allow any function\n\tFn extends (...args: any) => any,\n>(\n\tfn: Fn,\n\tdelay: number,\n) => {\n\tlet lastRan = false;\n\tlet lastArgs: Parameters<Fn> | null = null;\n\n\treturn (...args: Parameters<Fn>) => {\n\t\tif (!lastRan) {\n\t\t\tfn.apply(this, args);\n\t\t\tlastRan = true;\n\t\t\tconst timer = () =>\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tlastRan = false;\n\t\t\t\t\tif (lastArgs) {\n\t\t\t\t\t\tfn.apply(this, lastArgs);\n\t\t\t\t\t\tlastRan = true;\n\t\t\t\t\t\tlastArgs = null;\n\t\t\t\t\t\ttimer();\n\t\t\t\t\t}\n\t\t\t\t}, delay);\n\t\t\ttimer();\n\t\t} else lastArgs = args;\n\t};\n};\n\nexport class DeadlineError extends Error {\n\tconstructor() {\n\t\tsuper(\"Promise did not complete before deadline.\");\n\t}\n}\n\nexport function deadline<T>(promise: Promise<T>, timeout: number): Promise<T> {\n\tconst controller = new AbortController();\n\tconst signal = controller.signal;\n\n\t// Set a timeout to abort the operation\n\tconst timeoutId = setTimeout(() => controller.abort(), timeout);\n\n\treturn Promise.race<T>([\n\t\tpromise,\n\t\tnew Promise<T>((_, reject) => {\n\t\t\tsignal.addEventListener(\"abort\", () => reject(new DeadlineError()));\n\t\t}),\n\t]).finally(() => {\n\t\tclearTimeout(timeoutId);\n\t});\n}\n\nexport class Lock<T> {\n\tprivate _locked = false;\n\tprivate _waiting: Array<() => void> = [];\n\n\tconstructor(private _value: T) {}\n\n\tasync lock(fn: (value: T) => Promise<void>): Promise<void> {\n\t\tif (this._locked) {\n\t\t\tawait new Promise<void>((resolve) => this._waiting.push(resolve));\n\t\t}\n\t\tthis._locked = true;\n\n\t\ttry {\n\t\t\tawait fn(this._value);\n\t\t} finally {\n\t\t\tthis._locked = false;\n\t\t\tconst next = this._waiting.shift();\n\t\t\tif (next) next();\n\t\t}\n\t}\n}\n\nexport function generateSecureToken(length = 32) {\n\tconst array = new Uint8Array(length);\n\tcrypto.getRandomValues(array);\n\treturn btoa(String.fromCharCode(...array));\n}\n\nexport function generateRandomString(length = 32) {\n\tconst characters =\n\t\t\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\tlet result = \"\";\n\tfor (let i = 0; i < length; i++) {\n\t\tconst randomIndex = Math.floor(Math.random() * characters.length);\n\t\tresult += characters[randomIndex];\n\t}\n\treturn result;\n}\n","import type * as messageToClient from \"@/actor/protocol/message/to-client\";\nimport type * as wsToClient from \"@/actor/protocol/message/to-client\";\nimport type { AnyDatabaseProvider } from \"./database\";\nimport type { ConnDriver } from \"./driver\";\nimport * as errors from \"./errors\";\nimport type { ActorInstance } from \"./instance\";\nimport type { PersistedConn } from \"./persisted\";\nimport { CachedSerializer } from \"./protocol/serde\";\nimport { generateSecureToken } from \"./utils\";\n\nexport function generateConnId(): string {\n\treturn crypto.randomUUID();\n}\n\nexport function generateConnToken(): string {\n\treturn generateSecureToken(32);\n}\n\nexport type ConnId = string;\n\nexport type AnyConn = Conn<any, any, any, any, any, any, any>;\n\n/**\n * Represents a client connection to a actor.\n *\n * Manages connection-specific data and controls the connection lifecycle.\n *\n * @see {@link https://rivet.gg/docs/connections|Connection Documentation}\n */\nexport class Conn<S, CP, CS, V, I, AD, DB extends AnyDatabaseProvider> {\n\tsubscriptions: Set<string> = new Set<string>();\n\n\t#stateEnabled: boolean;\n\n\t// TODO: Remove this cyclical reference\n\t#actor: ActorInstance<S, CP, CS, V, I, AD, DB>;\n\n\t/**\n\t * The proxied state that notifies of changes automatically.\n\t *\n\t * Any data that should be stored indefinitely should be held within this object.\n\t */\n\t__persist: PersistedConn<CP, CS>;\n\n\t/**\n\t * Driver used to manage realtime connection communication.\n\t *\n\t * @protected\n\t */\n\t#driver: ConnDriver;\n\n\tpublic get params(): CP {\n\t\treturn this.__persist.p;\n\t}\n\n\tpublic get auth(): AD {\n\t\treturn this.__persist.a as AD;\n\t}\n\n\tpublic get _stateEnabled() {\n\t\treturn this.#stateEnabled;\n\t}\n\n\t/**\n\t * Gets the current state of the connection.\n\t *\n\t * Throws an error if the state is not enabled.\n\t */\n\tpublic get state(): CS {\n\t\tthis.#validateStateEnabled();\n\t\tif (!this.__persist.s) throw new Error(\"state should exists\");\n\t\treturn this.__persist.s;\n\t}\n\n\t/**\n\t * Sets the state of the connection.\n\t *\n\t * Throws an error if the state is not enabled.\n\t */\n\tpublic set state(value: CS) {\n\t\tthis.#validateStateEnabled();\n\t\tthis.__persist.s = value;\n\t}\n\n\t/**\n\t * Unique identifier for the connection.\n\t */\n\tpublic get id(): ConnId {\n\t\treturn this.__persist.i;\n\t}\n\n\t/**\n\t * Token used to authenticate this request.\n\t */\n\tpublic get _token(): string {\n\t\treturn this.__persist.t;\n\t}\n\n\t/**\n\t * Initializes a new instance of the Connection class.\n\t *\n\t * This should only be constructed by {@link Actor}.\n\t *\n\t * @protected\n\t */\n\tpublic constructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, AD, DB>,\n\t\tpersist: PersistedConn<CP, CS>,\n\t\tdriver: ConnDriver,\n\t\tstateEnabled: boolean,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.__persist = persist;\n\t\tthis.#driver = driver;\n\t\tthis.#stateEnabled = stateEnabled;\n\t}\n\n\t#validateStateEnabled() {\n\t\tif (!this.#stateEnabled) {\n\t\t\tthrow new errors.ConnStateNotEnabled();\n\t\t}\n\t}\n\n\t/**\n\t * Sends a WebSocket message to the client.\n\t *\n\t * @param message - The message to send.\n\t *\n\t * @protected\n\t */\n\tpublic _sendMessage(message: CachedSerializer<messageToClient.ToClient>) {\n\t\tthis.#driver.sendMessage?.(this.#actor, this, this.__persist.ds, message);\n\t}\n\n\t/**\n\t * Sends an event with arguments to the client.\n\t *\n\t * @param eventName - The name of the event.\n\t * @param args - The arguments for the event.\n\t * @see {@link https://rivet.gg/docs/events|Events Documentation}\n\t */\n\tpublic send(eventName: string, ...args: unknown[]) {\n\t\tthis.#actor.inspector.emitter.emit(\"eventFired\", {\n\t\t\ttype: \"event\",\n\t\t\teventName,\n\t\t\targs,\n\t\t\tconnId: this.id,\n\t\t});\n\t\tthis._sendMessage(\n\t\t\tnew CachedSerializer<wsToClient.ToClient>({\n\t\t\t\tb: {\n\t\t\t\t\tev: {\n\t\t\t\t\t\tn: eventName,\n\t\t\t\t\t\ta: args,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Disconnects the client with an optional reason.\n\t *\n\t * @param reason - The reason for disconnection.\n\t */\n\tpublic async disconnect(reason?: string) {\n\t\tawait this.#driver.disconnect(this.#actor, this, this.__persist.ds, reason);\n\t}\n}\n","import type { SSEStreamingApi } from \"hono/streaming\";\nimport type { WSContext } from \"hono/ws\";\nimport type { WebSocket } from \"ws\";\nimport type { AnyConn } from \"@/actor/connection\";\nimport type { ConnDriver } from \"@/actor/driver\";\nimport type { AnyActorInstance } from \"@/actor/instance\";\nimport type * as messageToClient from \"@/actor/protocol/message/to-client\";\nimport type { CachedSerializer, Encoding } from \"@/actor/protocol/serde\";\nimport { encodeDataToString } from \"@/actor/protocol/serde\";\nimport { dbg } from \"@/utils\";\nimport { logger } from \"./log\";\n\n// This state is different than `PersistedConn` state since the connection-specific state is persisted & must be serializable. This is also part of the connection driver, not part of the core actor.\n//\n// This holds the actual connections, which are not serializable.\n//\n// This is scoped to each actor. Do not share between multiple actors.\nexport class GenericConnGlobalState {\n\twebsockets = new Map<string, WSContext>();\n\tsseStreams = new Map<string, SSEStreamingApi>();\n}\n\n/**\n * Exposes connection drivers for platforms that support vanilla WebSocket, SSE, and HTTP.\n */\nexport function createGenericConnDrivers(\n\tglobalState: GenericConnGlobalState,\n): Record<string, ConnDriver> {\n\treturn {\n\t\t[CONN_DRIVER_GENERIC_WEBSOCKET]: createGenericWebSocketDriver(globalState),\n\t\t[CONN_DRIVER_GENERIC_SSE]: createGenericSseDriver(globalState),\n\t\t[CONN_DRIVER_GENERIC_HTTP]: createGeneircHttpDriver(),\n\t};\n}\n\n// MARK: WebSocket\nexport const CONN_DRIVER_GENERIC_WEBSOCKET = \"genericWebSocket\";\n\nexport interface GenericWebSocketDriverState {\n\tencoding: Encoding;\n}\n\nexport function createGenericWebSocketDriver(\n\tglobalState: GenericConnGlobalState,\n): ConnDriver<GenericWebSocketDriverState> {\n\treturn {\n\t\tsendMessage: (\n\t\t\tactor: AnyActorInstance,\n\t\t\tconn: AnyConn,\n\t\t\tstate: GenericWebSocketDriverState,\n\t\t\tmessage: CachedSerializer<messageToClient.ToClient>,\n\t\t) => {\n\t\t\tconst ws = globalState.websockets.get(conn.id);\n\t\t\tif (!ws) {\n\t\t\t\tlogger().warn(\"missing ws for sendMessage\", {\n\t\t\t\t\tactorId: actor.id,\n\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\ttotalCount: globalState.websockets.size,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst serialized = message.serialize(state.encoding);\n\n\t\t\tlogger().debug(\"sending websocket message\", {\n\t\t\t\tencoding: state.encoding,\n\t\t\t\tdataType: typeof serialized,\n\t\t\t\tisUint8Array: serialized instanceof Uint8Array,\n\t\t\t\tisArrayBuffer: serialized instanceof ArrayBuffer,\n\t\t\t\tdataLength:\n\t\t\t\t\t(serialized as any).byteLength || (serialized as any).length,\n\t\t\t});\n\n\t\t\t// Convert Uint8Array to ArrayBuffer for proper transmission\n\t\t\tif (serialized instanceof Uint8Array) {\n\t\t\t\tconst buffer = serialized.buffer.slice(\n\t\t\t\t\tserialized.byteOffset,\n\t\t\t\t\tserialized.byteOffset + serialized.byteLength,\n\t\t\t\t);\n\t\t\t\t// Handle SharedArrayBuffer case\n\t\t\t\tif (buffer instanceof SharedArrayBuffer) {\n\t\t\t\t\tconst arrayBuffer = new ArrayBuffer(buffer.byteLength);\n\t\t\t\t\tnew Uint8Array(arrayBuffer).set(new Uint8Array(buffer));\n\t\t\t\t\tlogger().debug(\"converted SharedArrayBuffer to ArrayBuffer\", {\n\t\t\t\t\t\tbyteLength: arrayBuffer.byteLength,\n\t\t\t\t\t});\n\t\t\t\t\tws.send(arrayBuffer);\n\t\t\t\t} else {\n\t\t\t\t\tlogger().debug(\"sending ArrayBuffer\", {\n\t\t\t\t\t\tbyteLength: buffer.byteLength,\n\t\t\t\t\t});\n\t\t\t\t\tws.send(buffer);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlogger().debug(\"sending string data\", {\n\t\t\t\t\tlength: (serialized as string).length,\n\t\t\t\t});\n\t\t\t\tws.send(serialized);\n\t\t\t}\n\t\t},\n\n\t\tdisconnect: async (\n\t\t\tactor: AnyActorInstance,\n\t\t\tconn: AnyConn,\n\t\t\t_state: GenericWebSocketDriverState,\n\t\t\treason?: string,\n\t\t) => {\n\t\t\tconst ws = globalState.websockets.get(conn.id);\n\t\t\tif (!ws) {\n\t\t\t\tlogger().warn(\"missing ws for disconnect\", {\n\t\t\t\t\tactorId: actor.id,\n\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\ttotalCount: globalState.websockets.size,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst raw = ws.raw as WebSocket;\n\t\t\tif (!raw) {\n\t\t\t\tlogger().warn(\"ws.raw does not exist\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create promise to wait for socket to close gracefully\n\t\t\tconst { promise, resolve } = Promise.withResolvers<void>();\n\t\t\traw.addEventListener(\"close\", () => resolve());\n\n\t\t\t// Close socket\n\t\t\tws.close(1000, reason);\n\n\t\t\tawait promise;\n\t\t},\n\t};\n}\n\n// MARK: SSE\nexport const CONN_DRIVER_GENERIC_SSE = \"genericSse\";\n\nexport interface GenericSseDriverState {\n\tencoding: Encoding;\n}\n\nexport function createGenericSseDriver(globalState: GenericConnGlobalState) {\n\treturn {\n\t\tsendMessage: (\n\t\t\t_actor: AnyActorInstance,\n\t\t\tconn: AnyConn,\n\t\t\tstate: GenericSseDriverState,\n\t\t\tmessage: CachedSerializer<messageToClient.ToClient>,\n\t\t) => {\n\t\t\tconst stream = globalState.sseStreams.get(conn.id);\n\t\t\tif (!stream) {\n\t\t\t\tlogger().warn(\"missing sse stream for sendMessage\", {\n\t\t\t\t\tconnId: conn.id,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstream.writeSSE({\n\t\t\t\tdata: encodeDataToString(message.serialize(state.encoding)),\n\t\t\t});\n\t\t},\n\n\t\tdisconnect: async (\n\t\t\t_actor: AnyActorInstance,\n\t\t\tconn: AnyConn,\n\t\t\t_state: GenericSseDriverState,\n\t\t\t_reason?: string,\n\t\t) => {\n\t\t\tconst stream = globalState.sseStreams.get(conn.id);\n\t\t\tif (!stream) {\n\t\t\t\tlogger().warn(\"missing sse stream for disconnect\", { connId: conn.id });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstream.close();\n\t\t},\n\t};\n}\n\n// MARK: HTTP\nexport const CONN_DRIVER_GENERIC_HTTP = \"genericHttp\";\n\nexport type GenericHttpDriverState = Record<never, never>;\n\nexport function createGeneircHttpDriver() {\n\treturn {\n\t\tdisconnect: async () => {\n\t\t\t// Noop\n\t\t},\n\t};\n}\n","import type { Context as HonoContext, HonoRequest } from \"hono\";\nimport { type SSEStreamingApi, streamSSE } from \"hono/streaming\";\nimport type { WSContext } from \"hono/ws\";\nimport { ActionContext } from \"@/actor/action\";\nimport type { AnyConn } from \"@/actor/connection\";\nimport { generateConnId, generateConnToken } from \"@/actor/connection\";\nimport * as errors from \"@/actor/errors\";\nimport type { AnyActorInstance } from \"@/actor/instance\";\nimport * as protoHttpAction from \"@/actor/protocol/http/action\";\nimport { parseMessage } from \"@/actor/protocol/message/mod\";\nimport type * as messageToServer from \"@/actor/protocol/message/to-server\";\nimport type { InputData } from \"@/actor/protocol/serde\";\nimport {\n\tdeserialize,\n\ttype Encoding,\n\tEncodingSchema,\n\tserialize,\n} from \"@/actor/protocol/serde\";\nimport type { UpgradeWebSocketArgs } from \"@/common/inline-websocket-adapter2\";\nimport { deconstructError, stringifyError } from \"@/common/utils\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { HonoWebSocketAdapter } from \"@/manager/hono-websocket-adapter\";\nimport type { RunConfig } from \"@/registry/run-config\";\nimport type { ActorDriver } from \"./driver\";\nimport {\n\tCONN_DRIVER_GENERIC_HTTP,\n\tCONN_DRIVER_GENERIC_SSE,\n\tCONN_DRIVER_GENERIC_WEBSOCKET,\n\ttype GenericHttpDriverState,\n\ttype GenericSseDriverState,\n\ttype GenericWebSocketDriverState,\n} from \"./generic-conn-driver\";\nimport { logger } from \"./log\";\nimport { assertUnreachable } from \"./utils\";\n\nexport interface ConnectWebSocketOpts {\n\treq?: HonoRequest;\n\tencoding: Encoding;\n\tactorId: string;\n\tparams: unknown;\n\tauthData: unknown;\n}\n\nexport interface ConnectWebSocketOutput {\n\tonOpen: (ws: WSContext) => void;\n\tonMessage: (message: messageToServer.ToServer) => void;\n\tonClose: () => void;\n}\n\nexport interface ConnectSseOpts {\n\treq?: HonoRequest;\n\tencoding: Encoding;\n\tparams: unknown;\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface ConnectSseOutput {\n\tonOpen: (stream: SSEStreamingApi) => void;\n\tonClose: () => Promise<void>;\n}\n\nexport interface ActionOpts {\n\treq?: HonoRequest;\n\tparams: unknown;\n\tactionName: string;\n\tactionArgs: unknown[];\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface ActionOutput {\n\toutput: unknown;\n}\n\nexport interface ConnsMessageOpts {\n\treq?: HonoRequest;\n\tconnId: string;\n\tconnToken: string;\n\tmessage: messageToServer.ToServer;\n\tactorId: string;\n}\n\nexport interface FetchOpts {\n\trequest: Request;\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface WebSocketOpts {\n\trequest: Request;\n\twebsocket: UniversalWebSocket;\n\tactorId: string;\n\tauthData: unknown;\n}\n\n/**\n * Creates a WebSocket connection handler\n */\nexport async function handleWebSocketConnect(\n\tc: HonoContext | undefined,\n\trunConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tencoding: Encoding,\n\tparameters: unknown,\n\tauthData: unknown,\n): Promise<UpgradeWebSocketArgs> {\n\tconst exposeInternalError = c ? getRequestExposeInternalError(c.req) : false;\n\n\t// Setup promise for the init handlers since all other behavior depends on this\n\tconst {\n\t\tpromise: handlersPromise,\n\t\tresolve: handlersResolve,\n\t\treject: handlersReject,\n\t} = Promise.withResolvers<{\n\t\tconn: AnyConn;\n\t\tactor: AnyActorInstance;\n\t\tconnId: string;\n\t}>();\n\n\t// Pre-load the actor to catch errors early\n\tlet actor: AnyActorInstance;\n\ttry {\n\t\tactor = await actorDriver.loadActor(actorId);\n\t} catch (error) {\n\t\t// Return handler that immediately closes with error\n\t\treturn {\n\t\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\terror,\n\t\t\t\t\tlogger(),\n\t\t\t\t\t{\n\t\t\t\t\t\twsEvent: \"open\",\n\t\t\t\t\t},\n\t\t\t\t\texposeInternalError,\n\t\t\t\t);\n\t\t\t\tws.close(1011, code);\n\t\t\t},\n\t\t\tonMessage: (_evt: { data: any }, ws: WSContext) => {\n\t\t\t\tws.close(1011, \"Actor not loaded\");\n\t\t\t},\n\t\t\tonClose: (_event: any, _ws: WSContext) => {},\n\t\t\tonError: (_error: unknown) => {},\n\t\t};\n\t}\n\n\treturn {\n\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\tlogger().debug(\"websocket open\");\n\n\t\t\t// Run async operations in background\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst connId = generateConnId();\n\t\t\t\t\tconst connToken = generateConnToken();\n\t\t\t\t\tconst connState = await actor.prepareConn(parameters, c?.req.raw);\n\n\t\t\t\t\t// Save socket\n\t\t\t\t\tconst connGlobalState =\n\t\t\t\t\t\tactorDriver.getGenericConnGlobalState(actorId);\n\t\t\t\t\tconnGlobalState.websockets.set(connId, ws);\n\t\t\t\t\tlogger().debug(\"registered websocket for conn\", {\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Create connection\n\t\t\t\t\tconst conn = await actor.createConn(\n\t\t\t\t\t\tconnId,\n\t\t\t\t\t\tconnToken,\n\t\t\t\t\t\tparameters,\n\t\t\t\t\t\tconnState,\n\t\t\t\t\t\tCONN_DRIVER_GENERIC_WEBSOCKET,\n\t\t\t\t\t\t{ encoding } satisfies GenericWebSocketDriverState,\n\t\t\t\t\t\tauthData,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Unblock other handlers\n\t\t\t\t\thandlersResolve({ conn, actor, connId });\n\t\t\t\t} catch (error) {\n\t\t\t\t\thandlersReject(error);\n\n\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tlogger(),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twsEvent: \"open\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t\tws.close(1011, code);\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\tonMessage: (evt: { data: any }, ws: WSContext) => {\n\t\t\t// Handle message asynchronously\n\t\t\thandlersPromise\n\t\t\t\t.then(({ conn, actor }) => {\n\t\t\t\t\tlogger().debug(\"received message\");\n\n\t\t\t\t\tconst value = evt.data.valueOf() as InputData;\n\t\t\t\t\tparseMessage(value, {\n\t\t\t\t\t\tencoding: encoding,\n\t\t\t\t\t\tmaxIncomingMessageSize: runConfig.maxIncomingMessageSize,\n\t\t\t\t\t})\n\t\t\t\t\t\t.then((message) => {\n\t\t\t\t\t\t\tactor.processMessage(message, conn).catch((error) => {\n\t\t\t\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\tlogger(),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tws.close(1011, code);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tlogger(),\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tws.close(1011, code);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tlogger(),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t\tws.close(1011, code);\n\t\t\t\t});\n\t\t},\n\t\tonClose: (\n\t\t\tevent: {\n\t\t\t\twasClean: boolean;\n\t\t\t\tcode: number;\n\t\t\t\treason: string;\n\t\t\t},\n\t\t\tws: WSContext,\n\t\t) => {\n\t\t\tif (event.wasClean) {\n\t\t\t\tlogger().info(\"websocket closed\", {\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\twasClean: event.wasClean,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tlogger().warn(\"websocket closed\", {\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\twasClean: event.wasClean,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state\n\t\t\t// https://github.com/cloudflare/workerd/issues/2569\n\t\t\tws.close(1000, \"hack_force_close\");\n\n\t\t\t// Handle cleanup asynchronously\n\t\t\thandlersPromise\n\t\t\t\t.then(({ conn, actor, connId }) => {\n\t\t\t\t\tconst connGlobalState =\n\t\t\t\t\t\tactorDriver.getGenericConnGlobalState(actorId);\n\t\t\t\t\tconst didDelete = connGlobalState.websockets.delete(connId);\n\t\t\t\t\tif (didDelete) {\n\t\t\t\t\t\tlogger().info(\"removing websocket for conn\", {\n\t\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger().warn(\"websocket does not exist for conn\", {\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tactor.__removeConn(conn);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tdeconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tlogger(),\n\t\t\t\t\t\t{ wsEvent: \"close\" },\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t},\n\t\tonError: (_error: unknown) => {\n\t\t\ttry {\n\t\t\t\t// Actors don't need to know about this, since it's abstracted away\n\t\t\t\tlogger().warn(\"websocket error\");\n\t\t\t} catch (error) {\n\t\t\t\tdeconstructError(\n\t\t\t\t\terror,\n\t\t\t\t\tlogger(),\n\t\t\t\t\t{ wsEvent: \"error\" },\n\t\t\t\t\texposeInternalError,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Creates an SSE connection handler\n */\nexport async function handleSseConnect(\n\tc: HonoContext,\n\trunConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tauthData: unknown,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst parameters = getRequestConnParams(c.req);\n\n\t// Return the main handler with all async work inside\n\treturn streamSSE(c, async (stream) => {\n\t\tlet actor: AnyActorInstance | undefined;\n\t\tlet connId: string | undefined;\n\t\tlet connToken: string | undefined;\n\t\tlet connState: unknown;\n\t\tlet conn: AnyConn | undefined;\n\n\t\ttry {\n\t\t\t// Do all async work inside the handler\n\t\t\tactor = await actorDriver.loadActor(actorId);\n\t\t\tconnId = generateConnId();\n\t\t\tconnToken = generateConnToken();\n\t\t\tconnState = await actor.prepareConn(parameters, c.req.raw);\n\n\t\t\tlogger().debug(\"sse open\");\n\n\t\t\t// Save stream\n\t\t\tactorDriver\n\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t.sseStreams.set(connId, stream);\n\n\t\t\t// Create connection\n\t\t\tconn = await actor.createConn(\n\t\t\t\tconnId,\n\t\t\t\tconnToken,\n\t\t\t\tparameters,\n\t\t\t\tconnState,\n\t\t\t\tCONN_DRIVER_GENERIC_SSE,\n\t\t\t\t{ encoding } satisfies GenericSseDriverState,\n\t\t\t\tauthData,\n\t\t\t);\n\n\t\t\t// HACK: This is required so the abort handler below works\n\t\t\t//\n\t\t\t// See https://github.com/honojs/hono/issues/1770#issuecomment-2461966225\n\t\t\tstream.onAbort(() => {});\n\n\t\t\t// Wait for close\n\t\t\tconst abortResolver = Promise.withResolvers();\n\t\t\tc.req.raw.signal.addEventListener(\"abort\", async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlogger().debug(\"sse shutting down\");\n\n\t\t\t\t\t// Cleanup\n\t\t\t\t\tif (connId) {\n\t\t\t\t\t\tactorDriver\n\t\t\t\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t\t\t\t.sseStreams.delete(connId);\n\t\t\t\t\t}\n\t\t\t\t\tif (conn && actor) {\n\t\t\t\t\t\tactor.__removeConn(conn);\n\t\t\t\t\t}\n\n\t\t\t\t\tabortResolver.resolve(undefined);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error(\"error closing sse connection\", { error });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// HACK: Will throw if not configured\n\t\t\ttry {\n\t\t\t\tc.executionCtx.waitUntil(abortResolver.promise);\n\t\t\t} catch {}\n\n\t\t\t// Wait until connection aborted\n\t\t\tawait abortResolver.promise;\n\t\t} catch (error) {\n\t\t\tlogger().error(\"error in sse connection\", { error });\n\n\t\t\t// Cleanup on error\n\t\t\tif (connId !== undefined) {\n\t\t\t\tactorDriver\n\t\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t\t.sseStreams.delete(connId);\n\t\t\t}\n\t\t\tif (conn && actor !== undefined) {\n\t\t\t\tactor.__removeConn(conn);\n\t\t\t}\n\n\t\t\t// Close the stream on error\n\t\t\tstream.close();\n\t\t}\n\t});\n}\n\n/**\n * Creates an action handler\n */\nexport async function handleAction(\n\tc: HonoContext,\n\trunConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactionName: string,\n\tactorId: string,\n\tauthData: unknown,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst parameters = getRequestConnParams(c.req);\n\n\tlogger().debug(\"handling action\", { actionName, encoding });\n\n\t// Validate incoming request\n\tlet body: unknown;\n\tif (encoding === \"json\") {\n\t\ttry {\n\t\t\tbody = await c.req.json();\n\t\t} catch (err) {\n\t\t\tif (err instanceof errors.InvalidActionRequest) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new errors.InvalidActionRequest(\n\t\t\t\t`Invalid JSON: ${stringifyError(err)}`,\n\t\t\t);\n\t\t}\n\t} else if (encoding === \"cbor\") {\n\t\ttry {\n\t\t\tconst value = await c.req.arrayBuffer();\n\t\t\tconst uint8Array = new Uint8Array(value);\n\t\t\tbody = await deserialize(uint8Array as unknown as InputData, encoding);\n\t\t} catch (err) {\n\t\t\tthrow new errors.InvalidActionRequest(\n\t\t\t\t`Invalid binary format: ${stringifyError(err)}`,\n\t\t\t);\n\t\t}\n\t} else {\n\t\treturn assertUnreachable(encoding);\n\t}\n\n\t// Validate using the action schema\n\tlet actionArgs: unknown[];\n\ttry {\n\t\tconst result = protoHttpAction.ActionRequestSchema.safeParse(body);\n\t\tif (!result.success) {\n\t\t\tthrow new errors.InvalidActionRequest(\"Invalid action request format\");\n\t\t}\n\n\t\tactionArgs = result.data.a;\n\t} catch (err) {\n\t\tthrow new errors.InvalidActionRequest(\n\t\t\t`Invalid schema: ${stringifyError(err)}`,\n\t\t);\n\t}\n\n\t// Invoke the action\n\tlet actor: AnyActorInstance | undefined;\n\tlet conn: AnyConn | undefined;\n\tlet output: unknown | undefined;\n\ttry {\n\t\tactor = await actorDriver.loadActor(actorId);\n\n\t\t// Create conn\n\t\tconst connState = await actor.prepareConn(parameters, c.req.raw);\n\t\tconn = await actor.createConn(\n\t\t\tgenerateConnId(),\n\t\t\tgenerateConnToken(),\n\t\t\tparameters,\n\t\t\tconnState,\n\t\t\tCONN_DRIVER_GENERIC_HTTP,\n\t\t\t{} satisfies GenericHttpDriverState,\n\t\t\tauthData,\n\t\t);\n\n\t\t// Call action\n\t\tconst ctx = new ActionContext(actor.actorContext!, conn!);\n\t\toutput = await actor.executeAction(ctx, actionName, actionArgs);\n\t} finally {\n\t\tif (conn) {\n\t\t\tactor?.__removeConn(conn);\n\t\t}\n\t}\n\n\t// Encode the response\n\tif (encoding === \"json\") {\n\t\tconst responseData = {\n\t\t\to: output, // Use the format expected by ResponseOkSchema\n\t\t};\n\t\treturn c.json(responseData);\n\t} else if (encoding === \"cbor\") {\n\t\t// Use serialize from serde.ts instead of custom encoder\n\t\tconst responseData = {\n\t\t\to: output, // Use the format expected by ResponseOkSchema\n\t\t};\n\t\tconst serialized = serialize(responseData, encoding);\n\n\t\treturn c.body(serialized as Uint8Array, 200, {\n\t\t\t\"Content-Type\": \"application/octet-stream\",\n\t\t});\n\t} else {\n\t\treturn assertUnreachable(encoding);\n\t}\n}\n\n/**\n * Create a connection message handler\n */\nexport async function handleConnectionMessage(\n\tc: HonoContext,\n\trunConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tconnId: string,\n\tconnToken: string,\n\tactorId: string,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\n\t// Validate incoming request\n\tlet message: messageToServer.ToServer;\n\tif (encoding === \"json\") {\n\t\ttry {\n\t\t\tmessage = await c.req.json();\n\t\t} catch (_err) {\n\t\t\tthrow new errors.InvalidRequest(\"Invalid JSON\");\n\t\t}\n\t} else if (encoding === \"cbor\") {\n\t\ttry {\n\t\t\tconst value = await c.req.arrayBuffer();\n\t\t\tconst uint8Array = new Uint8Array(value);\n\t\t\tmessage = await parseMessage(uint8Array as unknown as InputData, {\n\t\t\t\tencoding,\n\t\t\t\tmaxIncomingMessageSize: runConfig.maxIncomingMessageSize,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tthrow new errors.InvalidRequest(\n\t\t\t\t`Invalid binary format: ${stringifyError(err)}`,\n\t\t\t);\n\t\t}\n\t} else {\n\t\treturn assertUnreachable(encoding);\n\t}\n\n\tconst actor = await actorDriver.loadActor(actorId);\n\n\t// Find connection\n\tconst conn = actor.conns.get(connId);\n\tif (!conn) {\n\t\tthrow new errors.ConnNotFound(connId);\n\t}\n\n\t// Authenticate connection\n\tif (conn._token !== connToken) {\n\t\tthrow new errors.IncorrectConnToken();\n\t}\n\n\t// Process message\n\tawait actor.processMessage(message, conn);\n\n\treturn c.json({});\n}\n\nexport async function handleRawWebSocketHandler(\n\tc: HonoContext | undefined,\n\tpath: string,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tauthData: unknown,\n): Promise<UpgradeWebSocketArgs> {\n\tconst actor = await actorDriver.loadActor(actorId);\n\n\t// Return WebSocket event handlers\n\treturn {\n\t\tonOpen: (_evt: any, ws: any) => {\n\t\t\t// Wrap the Hono WebSocket in our adapter\n\t\t\tconst adapter = new HonoWebSocketAdapter(w