rivetkit 2.1.2 → 2.1.3

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.
Files changed (84) hide show
  1. package/dist/browser/client.js +1 -1
  2. package/dist/browser/client.js.map +1 -1
  3. package/dist/browser/inspector/client.js +1 -1
  4. package/dist/browser/inspector/client.js.map +1 -1
  5. package/dist/inspector.tar.gz +0 -0
  6. package/dist/tsup/{chunk-NXEHFUDB.cjs → chunk-5AZ6UPEF.cjs} +24 -21
  7. package/dist/tsup/chunk-5AZ6UPEF.cjs.map +1 -0
  8. package/dist/tsup/{chunk-YQ5P6KMN.js → chunk-6LHZQSWJ.js} +8 -5
  9. package/dist/tsup/{chunk-YQ5P6KMN.js.map → chunk-6LHZQSWJ.js.map} +1 -1
  10. package/dist/tsup/{chunk-BFI4LYS2.js → chunk-6T3WSP5M.js} +4 -4
  11. package/dist/tsup/{chunk-772NPMTY.cjs → chunk-BMNB6YRQ.cjs} +160 -103
  12. package/dist/tsup/chunk-BMNB6YRQ.cjs.map +1 -0
  13. package/dist/tsup/{chunk-GVQAVU7R.cjs → chunk-DADGS67O.cjs} +4 -4
  14. package/dist/tsup/{chunk-GVQAVU7R.cjs.map → chunk-DADGS67O.cjs.map} +1 -1
  15. package/dist/tsup/{chunk-RHUII57M.js → chunk-GNGRMP5E.js} +10 -6
  16. package/dist/tsup/chunk-GNGRMP5E.js.map +1 -0
  17. package/dist/tsup/{chunk-PZAV6PP2.cjs → chunk-HPAX7L72.cjs} +152 -152
  18. package/dist/tsup/{chunk-PZAV6PP2.cjs.map → chunk-HPAX7L72.cjs.map} +1 -1
  19. package/dist/tsup/{chunk-UZV7NXC6.cjs → chunk-IJAGZS57.cjs} +30 -30
  20. package/dist/tsup/{chunk-UZV7NXC6.cjs.map → chunk-IJAGZS57.cjs.map} +1 -1
  21. package/dist/tsup/{chunk-HFWRHT5T.cjs → chunk-KSZZRTOD.cjs} +3 -3
  22. package/dist/tsup/{chunk-HFWRHT5T.cjs.map → chunk-KSZZRTOD.cjs.map} +1 -1
  23. package/dist/tsup/{chunk-PSUVV4HM.js → chunk-MAXIXG56.js} +2 -2
  24. package/dist/tsup/{chunk-HB4RGGMC.js → chunk-N7ASEZ2Y.js} +5 -5
  25. package/dist/tsup/{chunk-PW3YONDJ.js → chunk-OAOF23ZY.js} +2 -2
  26. package/dist/tsup/{chunk-TDFDR7AO.js → chunk-POUBQA6Z.js} +2 -2
  27. package/dist/tsup/{chunk-VMX4I4MP.js → chunk-QUDLEWGD.js} +3 -3
  28. package/dist/tsup/{chunk-MNS5LY6M.cjs → chunk-R64EFI6F.cjs} +74 -74
  29. package/dist/tsup/{chunk-MNS5LY6M.cjs.map → chunk-R64EFI6F.cjs.map} +1 -1
  30. package/dist/tsup/{chunk-QABDKI3W.cjs → chunk-T6MM5RTW.cjs} +248 -244
  31. package/dist/tsup/chunk-T6MM5RTW.cjs.map +1 -0
  32. package/dist/tsup/{chunk-ZHQDRRMY.cjs → chunk-U6VWVHVW.cjs} +3 -3
  33. package/dist/tsup/{chunk-ZHQDRRMY.cjs.map → chunk-U6VWVHVW.cjs.map} +1 -1
  34. package/dist/tsup/{chunk-WUXR722E.js → chunk-YET3IZD6.js} +2 -2
  35. package/dist/tsup/{chunk-WUXR722E.js.map → chunk-YET3IZD6.js.map} +1 -1
  36. package/dist/tsup/{chunk-BSIJG3LG.js → chunk-YLDDENCZ.js} +69 -12
  37. package/dist/tsup/chunk-YLDDENCZ.js.map +1 -0
  38. package/dist/tsup/{chunk-RMJJE43B.cjs → chunk-ZSJ2OTY4.cjs} +2 -2
  39. package/dist/tsup/{chunk-RMJJE43B.cjs.map → chunk-ZSJ2OTY4.cjs.map} +1 -1
  40. package/dist/tsup/client/mod.cjs +6 -6
  41. package/dist/tsup/client/mod.js +5 -5
  42. package/dist/tsup/common/log.cjs +2 -2
  43. package/dist/tsup/common/log.js +1 -1
  44. package/dist/tsup/common/websocket.cjs +3 -3
  45. package/dist/tsup/common/websocket.js +2 -2
  46. package/dist/tsup/driver-helpers/mod.cjs +4 -4
  47. package/dist/tsup/driver-helpers/mod.js +3 -3
  48. package/dist/tsup/driver-test-suite/mod.cjs +425 -338
  49. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  50. package/dist/tsup/driver-test-suite/mod.js +376 -289
  51. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  52. package/dist/tsup/inspector/mod.cjs +3 -3
  53. package/dist/tsup/inspector/mod.js +2 -2
  54. package/dist/tsup/mod.cjs +8 -8
  55. package/dist/tsup/mod.js +7 -7
  56. package/dist/tsup/serve-test-suite/mod.cjs +111 -99
  57. package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
  58. package/dist/tsup/serve-test-suite/mod.js +22 -10
  59. package/dist/tsup/serve-test-suite/mod.js.map +1 -1
  60. package/dist/tsup/test/mod.cjs +10 -10
  61. package/dist/tsup/test/mod.js +6 -6
  62. package/dist/tsup/utils.cjs +2 -2
  63. package/dist/tsup/utils.js +1 -1
  64. package/dist/tsup/workflow/mod.cjs +5 -5
  65. package/dist/tsup/workflow/mod.js +4 -4
  66. package/package.json +5 -5
  67. package/src/actor/instance/mod.ts +13 -2
  68. package/src/driver-test-suite/tests/actor-db.ts +299 -216
  69. package/src/driver-test-suite/tests/actor-queue.ts +10 -9
  70. package/src/driver-test-suite/tests/actor-workflow.ts +12 -2
  71. package/src/driver-test-suite/utils.ts +8 -8
  72. package/src/drivers/engine/actor-driver.ts +77 -7
  73. package/src/workflow/driver.ts +4 -1
  74. package/dist/tsup/chunk-772NPMTY.cjs.map +0 -1
  75. package/dist/tsup/chunk-BSIJG3LG.js.map +0 -1
  76. package/dist/tsup/chunk-NXEHFUDB.cjs.map +0 -1
  77. package/dist/tsup/chunk-QABDKI3W.cjs.map +0 -1
  78. package/dist/tsup/chunk-RHUII57M.js.map +0 -1
  79. /package/dist/tsup/{chunk-BFI4LYS2.js.map → chunk-6T3WSP5M.js.map} +0 -0
  80. /package/dist/tsup/{chunk-PSUVV4HM.js.map → chunk-MAXIXG56.js.map} +0 -0
  81. /package/dist/tsup/{chunk-HB4RGGMC.js.map → chunk-N7ASEZ2Y.js.map} +0 -0
  82. /package/dist/tsup/{chunk-PW3YONDJ.js.map → chunk-OAOF23ZY.js.map} +0 -0
  83. /package/dist/tsup/{chunk-TDFDR7AO.js.map → chunk-POUBQA6Z.js.map} +0 -0
  84. /package/dist/tsup/{chunk-VMX4I4MP.js.map → chunk-QUDLEWGD.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-MNS5LY6M.cjs","../../src/common/actor-router-consts.ts","../../src/manager/router.ts","../../src/actor/keys.ts","../../src/common/router.ts","../../src/actor/router-endpoints.ts","../../src/actor/contexts/base/conn.ts","../../src/actor/contexts/action.ts","../../src/actor/contexts/base/conn-init.ts","../../src/actor/contexts/before-connect.ts","../../src/actor/contexts/connect.ts","../../src/actor/contexts/create-conn-state.ts","../../src/actor/contexts/request.ts","../../src/actor/contexts/websocket.ts","../../src/actor/protocol/serde.ts","../../src/serde.ts","../../src/schemas/client-protocol/versioned.ts","../schemas/client-protocol/v1.ts","../schemas/client-protocol/v2.ts","../schemas/client-protocol/v3.ts","../../src/schemas/client-protocol-zod/mod.ts","../../src/actor/conn/drivers/http.ts","../../src/actor/conn/drivers/raw-request.ts","../../src/registry/config/index.ts","../../src/engine-process/constants.ts","../../src/inspector/config.ts","../../src/utils/endpoint-parser.ts","../../src/registry/config/driver.ts","../../src/registry/config/runner.ts","../../src/registry/config/serverless.ts","../../src/inspector/serve-ui.ts","../../src/utils/node.ts","../../src/manager-api/actors.ts","../../src/manager-api/common.ts","../../src/utils/crypto.ts","../../src/utils/router.ts","../../src/common/cors.ts","../../src/manager/gateway.ts","../../src/actor/router-websocket-endpoints.ts","../../src/inspector/handler.ts","../../src/inspector/log.ts","../../src/actor/conn/drivers/raw-websocket.ts","../../src/actor/conn/drivers/websocket.ts","../../src/actor/protocol/old.ts","../../src/actor/conn/mod.ts","../../src/actor/conn/state-manager.ts","../../src/manager/log.ts","../../src/driver-helpers/utils.ts","../../src/schemas/actor-persist/versioned.ts","../schemas/actor-persist/v1.ts","../schemas/actor-persist/v2.ts","../schemas/actor-persist/v3.ts","../schemas/actor-persist/v4.ts"],"names":["readActionResponse","config","readActionRequest","readSubscriptionRequest","encodeHttpActionRequest","encodeHttpActionResponse","encodeHttpResponseError","encodeHttpResolveResponse","CURRENT_VERSION","TO_CLIENT_VERSIONED","TO_SERVER_VERSIONED","bare","message","invariant","c","createVersionedDataHandler"],"mappings":"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AAC9C,IAAA;AACD,EAAA;AACoD,EAAA;AACF,EAAA;AAClD;AAGgD;AACzC,EAAA;AACR;AAEiD;AACzC,EAAA;AACR;AAEkE;AACzB,EAAA;AACtB,IAAA;AACX,MAAA;AACsB,QAAA;AACtB,MAAA;AACsB,QAAA;AAC3B,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AACqC,EAAA;AACnB,IAAA;AACX,MAAA;AACgC,QAAA;AAChC,MAAA;AACgC,QAAA;AACrC,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AACwC,EAAA;AACF,EAAA;AACtC;AAGAc;AACyC,EAAA;AACtB,IAAA;AACX,MAAA;AAC+B,QAAA;AACpC,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AACqC,EAAA;AACnB,IAAA;AACX,MAAA;AACkD,QAAA;AACvD,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AAC8B,EAAA;AACF,EAAA;AAC5B;AAGDA;AACyC,EAAA;AACtB,IAAA;AACX,MAAA;AAC8B,QAAA;AACnC,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AACqC,EAAA;AACnB,IAAA;AACX,MAAA;AACgD,QAAA;AACrD,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AAC8B,EAAA;AACF,EAAA;AAC5B;AhDkpLsD;AACA;A+Ch2LmB;AACjC,EAAA;AAGX,IAAA;AAEb,IAAA;AACiC,IAAA;AAC/B,IAAA;AACnB,EAAA;AACuB,EAAA;AACtB,IAAA;AACAP,IAAAA;AACD,EAAA;AACD;AAQ8B;AACsB,EAAA;AACX,EAAA;AACzC;AAa4D;AACL,EAAA;AACnB,EAAA;AACd,EAAA;AACtB;A/C40LwD;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;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/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-MNS5LY6M.cjs","sourcesContent":[null,"// NOTE: This is in a separate file from the router since it needs to be shared between the client & the server. If this was in the router file, the client would end up importing the *entire* actor router and tree shaking would not work.\n\n// MARK: Paths\nexport const PATH_CONNECT = \"/connect\";\nexport const PATH_WEBSOCKET_BASE = \"/websocket\";\nexport const PATH_WEBSOCKET_PREFIX = \"/websocket/\";\nexport const PATH_INSPECTOR_CONNECT = \"/inspector/connect\";\n\n// MARK: Headers\nexport const HEADER_ACTOR_QUERY = \"x-rivet-query\";\n\nexport const HEADER_ENCODING = \"x-rivet-encoding\";\n\n// IMPORTANT: Params must be in headers or in an E2EE part of the request (i.e. NOT the URL or query string) in order to ensure that tokens can be securely passed in params.\nexport const HEADER_CONN_PARAMS = \"x-rivet-conn-params\";\n\nexport const HEADER_ACTOR_ID = \"x-rivet-actor\";\n\nexport const HEADER_RIVET_TOKEN = \"x-rivet-token\";\n\n// MARK: Manager Gateway Headers\nexport const HEADER_RIVET_TARGET = \"x-rivet-target\";\nexport const HEADER_RIVET_ACTOR = \"x-rivet-actor\";\nexport const HEADER_RIVET_NAMESPACE = \"x-rivet-namespace\";\n\n// MARK: WebSocket Protocol Prefixes\n/** Some servers (such as node-ws & Cloudflare) require explicitly match a certain WebSocket protocol. This gives us a static protocol to match against. */\nexport const WS_PROTOCOL_STANDARD = \"rivet\";\nexport const WS_PROTOCOL_TARGET = \"rivet_target.\";\nexport const WS_PROTOCOL_ACTOR = \"rivet_actor.\";\nexport const WS_PROTOCOL_ENCODING = \"rivet_encoding.\";\nexport const WS_PROTOCOL_CONN_PARAMS = \"rivet_conn_params.\";\nexport const WS_PROTOCOL_TOKEN = \"rivet_token.\";\n/**\n * Used to pass an inspector token for connecting to the inspector.\n * Only used internally by Rivet.\n */\nexport const WS_PROTOCOL_INSPECTOR_TOKEN = \"rivet_inspector_token.\";\n\n// MARK: WebSocket Inline Test Protocol Prefixes\nexport const WS_TEST_PROTOCOL_PATH = \"test_path.\";\n\n/**\n * Headers that publics can send from public clients.\n *\n * Used for CORS.\n **/\nexport const ALLOWED_PUBLIC_HEADERS = [\n\t\"Content-Type\",\n\t\"User-Agent\",\n\tHEADER_ACTOR_QUERY,\n\tHEADER_ENCODING,\n\tHEADER_CONN_PARAMS,\n\tHEADER_ACTOR_ID,\n\tHEADER_RIVET_TARGET,\n\tHEADER_RIVET_ACTOR,\n\tHEADER_RIVET_NAMESPACE,\n\tHEADER_RIVET_TOKEN,\n];\n","import { serveStatic } from \"@hono/node-server/serve-static\";\nimport { createRoute } from \"@hono/zod-openapi\";\nimport * as cbor from \"cbor-x\";\nimport type { Hono } from \"hono\";\nimport invariant from \"invariant\";\nimport { z } from \"zod/v4\";\nimport { Forbidden, RestrictedFeature } from \"@/actor/errors\";\nimport { deserializeActorKey, serializeActorKey } from \"@/actor/keys\";\nimport type { Encoding } from \"@/client/mod\";\nimport {\n\tHEADER_RIVET_TOKEN,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_TEST_PROTOCOL_PATH,\n} from \"@/common/actor-router-consts\";\nimport { handleHealthRequest, handleMetadataRequest } from \"@/common/router\";\nimport { deconstructError, noopNext, stringifyError } from \"@/common/utils\";\nimport { HEADER_ACTOR_ID } from \"@/driver-helpers/mod\";\nimport type {\n\tTestInlineDriverCallRequest,\n\tTestInlineDriverCallResponse,\n} from \"@/driver-test-suite/test-inline-client-driver\";\nimport { getInspectorDir } from \"@/inspector/serve-ui\";\nimport {\n\tActorsCreateRequestSchema,\n\ttype ActorsCreateResponse,\n\tActorsCreateResponseSchema,\n\tActorsGetOrCreateRequestSchema,\n\ttype ActorsGetOrCreateResponse,\n\tActorsGetOrCreateResponseSchema,\n\ttype ActorsKvGetResponse,\n\tActorsKvGetResponseSchema,\n\ttype ActorsListNamesResponse,\n\tActorsListNamesResponseSchema,\n\ttype ActorsListResponse,\n\tActorsListResponseSchema,\n\ttype Actor as ApiActor,\n} from \"@/manager-api/actors\";\nimport { buildActorNames, type RegistryConfig } from \"@/registry/config\";\nimport type { GetUpgradeWebSocket } from \"@/utils\";\nimport { timingSafeEqual } from \"@/utils/crypto\";\nimport { getNodeEnv } from \"@/utils/env-vars\";\nimport {\n\tbuildOpenApiRequestBody,\n\tbuildOpenApiResponses,\n\tcreateRouter,\n} from \"@/utils/router\";\nimport type { ActorOutput, ManagerDriver } from \"./driver\";\nimport { actorGateway, createTestWebSocketProxy } from \"./gateway\";\nimport { logger } from \"./log\";\n\nexport function buildManagerRouter(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n) {\n\treturn createRouter(config.managerBasePath, (router) => {\n\t\t// Actor gateway\n\t\trouter.use(\n\t\t\t\"*\",\n\t\t\tactorGateway.bind(\n\t\t\t\tundefined,\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tgetUpgradeWebSocket,\n\t\t\t),\n\t\t);\n\n\t\t// GET /\n\t\trouter.get(\"/\", (c) => {\n\t\t\treturn c.text(\n\t\t\t\t\"This is a RivetKit server.\\n\\nLearn more at https://rivet.dev\",\n\t\t\t);\n\t\t});\n\n\t\t// GET /actors\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"get\",\n\t\t\t\tpath: \"/actors\",\n\t\t\t\trequest: {\n\t\t\t\t\tquery: z.object({\n\t\t\t\t\t\tname: z.string().optional(),\n\t\t\t\t\t\tactor_ids: z.string().optional(),\n\t\t\t\t\t\tkey: z.string().optional(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsListResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst { name, actor_ids, key } = c.req.valid(\"query\");\n\n\t\t\t\tconst actorIdsParsed = actor_ids\n\t\t\t\t\t? actor_ids\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((id) => id.trim())\n\t\t\t\t\t\t.filter((id) => id.length > 0)\n\t\t\t\t\t: undefined;\n\n\t\t\t\tconst actors: ActorOutput[] = [];\n\n\t\t\t\t// Validate: cannot provide both actor_ids and (name or key)\n\t\t\t\tif (actorIdsParsed && (name || key)) {\n\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: \"Cannot provide both actor_ids and (name + key). Use either actor_ids or (name + key).\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Validate: when key is provided, name must also be provided\n\t\t\t\tif (key && !name) {\n\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: \"Name is required when key is provided.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (actorIdsParsed) {\n\t\t\t\t\tif (actorIdsParsed.length > 32) {\n\t\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terror: `Too many actor IDs. Maximum is 32, got ${actorIdsParsed.length}.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t400,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (actorIdsParsed.length === 0) {\n\t\t\t\t\t\treturn c.json<ActorsListResponse>({\n\t\t\t\t\t\t\tactors: [],\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fetch actors by ID\n\t\t\t\t\tfor (const actorId of actorIdsParsed) {\n\t\t\t\t\t\tif (name) {\n\t\t\t\t\t\t\t// If name is provided, use it directly\n\t\t\t\t\t\t\tconst actorOutput = await managerDriver.getForId({\n\t\t\t\t\t\t\t\tc,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (actorOutput) {\n\t\t\t\t\t\t\t\tactors.push(actorOutput);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// If no name is provided, try all registered actor types\n\t\t\t\t\t\t\t// Actor IDs are globally unique, so we'll find it in one of them\n\t\t\t\t\t\t\tfor (const actorName of Object.keys(config.use)) {\n\t\t\t\t\t\t\t\tconst actorOutput =\n\t\t\t\t\t\t\t\t\tawait managerDriver.getForId({\n\t\t\t\t\t\t\t\t\t\tc,\n\t\t\t\t\t\t\t\t\t\tname: actorName,\n\t\t\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (actorOutput) {\n\t\t\t\t\t\t\t\t\tactors.push(actorOutput);\n\t\t\t\t\t\t\t\t\tbreak; // Found the actor, no need to check other names\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (key && name) {\n\t\t\t\t\tconst actorOutput = await managerDriver.getWithKey({\n\t\t\t\t\t\tc,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tkey: deserializeActorKey(key),\n\t\t\t\t\t});\n\t\t\t\t\tif (actorOutput) {\n\t\t\t\t\t\tactors.push(actorOutput);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!name) {\n\t\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terror: \"Name is required when not using actor_ids.\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t400,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// List all actors with the given name\n\t\t\t\t\tconst actorOutputs = await managerDriver.listActors({\n\t\t\t\t\t\tc,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tincludeDestroyed: false,\n\t\t\t\t\t});\n\t\t\t\t\tactors.push(...actorOutputs);\n\t\t\t\t}\n\n\t\t\t\treturn c.json<ActorsListResponse>({\n\t\t\t\t\tactors: actors.map((actor) => createApiActor(actor)),\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// GET /actors/names\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"get\",\n\t\t\t\tpath: \"/actors/names\",\n\t\t\t\trequest: {\n\t\t\t\t\tquery: z.object({\n\t\t\t\t\t\tnamespace: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsListNamesResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst names = buildActorNames(config);\n\t\t\t\treturn c.json<ActorsListNamesResponse>({\n\t\t\t\t\tnames,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// PUT /actors\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"put\",\n\t\t\t\tpath: \"/actors\",\n\t\t\t\trequest: {\n\t\t\t\t\tbody: buildOpenApiRequestBody(\n\t\t\t\t\t\tActorsGetOrCreateRequestSchema,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(\n\t\t\t\t\tActorsGetOrCreateResponseSchema,\n\t\t\t\t),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst body = c.req.valid(\"json\");\n\n\t\t\t\t// Check if actor already exists\n\t\t\t\tconst existingActor = await managerDriver.getWithKey({\n\t\t\t\t\tc,\n\t\t\t\t\tname: body.name,\n\t\t\t\t\tkey: deserializeActorKey(body.key),\n\t\t\t\t});\n\n\t\t\t\tif (existingActor) {\n\t\t\t\t\treturn c.json<ActorsGetOrCreateResponse>({\n\t\t\t\t\t\tactor: createApiActor(existingActor),\n\t\t\t\t\t\tcreated: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Create new actor\n\t\t\t\tconst newActor = await managerDriver.getOrCreateWithKey({\n\t\t\t\t\tc,\n\t\t\t\t\tname: body.name,\n\t\t\t\t\tkey: deserializeActorKey(body.key),\n\t\t\t\t\tinput: body.input\n\t\t\t\t\t\t? cbor.decode(Buffer.from(body.input, \"base64\"))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tregion: undefined, // Not provided in the request schema\n\t\t\t\t});\n\n\t\t\t\treturn c.json<ActorsGetOrCreateResponse>({\n\t\t\t\t\tactor: createApiActor(newActor),\n\t\t\t\t\tcreated: true,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// POST /actors\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"post\",\n\t\t\t\tpath: \"/actors\",\n\t\t\t\trequest: {\n\t\t\t\t\tbody: buildOpenApiRequestBody(ActorsCreateRequestSchema),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsCreateResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst body = c.req.valid(\"json\");\n\n\t\t\t\t// Create actor using the driver\n\t\t\t\tconst actorOutput = await managerDriver.createActor({\n\t\t\t\t\tc,\n\t\t\t\t\tname: body.name,\n\t\t\t\t\tkey: deserializeActorKey(body.key || crypto.randomUUID()),\n\t\t\t\t\tinput: body.input\n\t\t\t\t\t\t? cbor.decode(Buffer.from(body.input, \"base64\"))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tregion: undefined, // Not provided in the request schema\n\t\t\t\t});\n\n\t\t\t\t// Transform ActorOutput to match ActorSchema\n\t\t\t\tconst actor = createApiActor(actorOutput);\n\n\t\t\t\treturn c.json<ActorsCreateResponse>({ actor });\n\t\t\t});\n\t\t}\n\n\t\t// GET /actors/{actor_id}/kv/keys/{key}\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"get\",\n\t\t\t\tpath: \"/actors/{actor_id}/kv/keys/{key}\",\n\t\t\t\trequest: {\n\t\t\t\t\tparams: z.object({\n\t\t\t\t\t\tactor_id: z.string(),\n\t\t\t\t\t\tkey: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsKvGetResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tif (getNodeEnv() === \"development\" && !config.token) {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"RIVET_TOKEN is not set, skipping KV store access checks in development mode. This endpoint will be disabled in production, unless you set the token.\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (getNodeEnv() !== \"development\") {\n\t\t\t\t\tif (!config.token) {\n\t\t\t\t\t\tthrow new RestrictedFeature(\"KV store access\");\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\ttimingSafeEqual(\n\t\t\t\t\t\t\tconfig.token,\n\t\t\t\t\t\t\tc.req.header(HEADER_RIVET_TOKEN) || \"\",\n\t\t\t\t\t\t) === false\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Forbidden();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst { actor_id: actorId, key } = c.req.valid(\"param\");\n\n\t\t\t\tconst response = await managerDriver.kvGet(\n\t\t\t\t\tactorId,\n\t\t\t\t\tBuffer.from(key, \"base64\"),\n\t\t\t\t);\n\n\t\t\t\treturn c.json<ActorsKvGetResponse>({\n\t\t\t\t\tvalue: response\n\t\t\t\t\t\t? Buffer.from(response).toString(\"base64\")\n\t\t\t\t\t\t: null,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// TODO:\n\t\t// // DELETE /actors/{actor_id}\n\t\t// {\n\t\t// \tconst route = createRoute({\n\t\t// \t\tmethod: \"delete\",\n\t\t// \t\tpath: \"/actors/{actor_id}\",\n\t\t// \t\trequest: {\n\t\t// \t\t\tparams: z.object({\n\t\t// \t\t\t\tactor_id: RivetIdSchema,\n\t\t// \t\t\t}),\n\t\t// \t\t},\n\t\t// \t\tresponses: buildOpenApiResponses(\n\t\t// \t\t\tActorsDeleteResponseSchema,\n\t\t// \t\t\tvalidateBody,\n\t\t// \t\t),\n\t\t// \t});\n\t\t//\n\t\t// \trouter.openapi(route, async (c) => {\n\t\t// \t\tconst { actor_id } = c.req.valid(\"param\");\n\t\t//\n\t\t// \t});\n\t\t// }\n\n\t\tif (config.test.enabled) {\n\t\t\t// Add HTTP endpoint to test the inline client\n\t\t\t//\n\t\t\t// We have to do this in a router since this needs to run in the same server as the RivetKit registry. Some test contexts to not run in the same server.\n\t\t\trouter.post(\".test/inline-driver/call\", async (c) => {\n\t\t\t\t// TODO: use openapi instead\n\t\t\t\tconst buffer = await c.req.arrayBuffer();\n\t\t\t\tconst { encoding, method, args }: TestInlineDriverCallRequest =\n\t\t\t\t\tcbor.decode(new Uint8Array(buffer));\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"received inline request\",\n\t\t\t\t\tencoding,\n\t\t\t\t\tmethod,\n\t\t\t\t\targs,\n\t\t\t\t});\n\n\t\t\t\t// Forward inline driver request\n\t\t\t\tlet response: TestInlineDriverCallResponse<unknown>;\n\t\t\t\ttry {\n\t\t\t\t\tconst output = await (\n\t\t\t\t\t\t(managerDriver as any)[method] as any\n\t\t\t\t\t)(...args);\n\t\t\t\t\tresponse = { ok: output };\n\t\t\t\t} catch (rawErr) {\n\t\t\t\t\tconst err = deconstructError(rawErr, logger(), {}, true);\n\t\t\t\t\tresponse = { err };\n\t\t\t\t}\n\n\t\t\t\t// TODO: Remove any\n\t\t\t\treturn c.body(cbor.encode(response) as any);\n\t\t\t});\n\n\t\t\trouter.get(\".test/inline-driver/connect-websocket/*\", async (c) => {\n\t\t\t\tconst upgradeWebSocket = getUpgradeWebSocket?.();\n\t\t\t\tinvariant(\n\t\t\t\t\tupgradeWebSocket,\n\t\t\t\t\t\"websockets not supported on this platform\",\n\t\t\t\t);\n\n\t\t\t\treturn upgradeWebSocket(async (c: any) => {\n\t\t\t\t\t// Extract information from sec-websocket-protocol header\n\t\t\t\t\tconst protocolHeader =\n\t\t\t\t\t\tc.req.header(\"sec-websocket-protocol\") || \"\";\n\t\t\t\t\tconst protocols = protocolHeader.split(/,\\s*/);\n\n\t\t\t\t\t// Parse protocols to extract connection info\n\t\t\t\t\tlet actorId = \"\";\n\t\t\t\t\tlet encoding: Encoding = \"bare\";\n\t\t\t\t\tlet path = \"\";\n\t\t\t\t\tlet params: unknown;\n\n\t\t\t\t\tfor (const protocol of protocols) {\n\t\t\t\t\t\tif (protocol.startsWith(WS_PROTOCOL_ACTOR)) {\n\t\t\t\t\t\t\tactorId = decodeURIComponent(\n\t\t\t\t\t\t\t\tprotocol.substring(WS_PROTOCOL_ACTOR.length),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (protocol.startsWith(WS_PROTOCOL_ENCODING)) {\n\t\t\t\t\t\t\tencoding = protocol.substring(\n\t\t\t\t\t\t\t\tWS_PROTOCOL_ENCODING.length,\n\t\t\t\t\t\t\t) as Encoding;\n\t\t\t\t\t\t} else if (protocol.startsWith(WS_TEST_PROTOCOL_PATH)) {\n\t\t\t\t\t\t\tpath = decodeURIComponent(\n\t\t\t\t\t\t\t\tprotocol.substring(\n\t\t\t\t\t\t\t\t\tWS_TEST_PROTOCOL_PATH.length,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tprotocol.startsWith(WS_PROTOCOL_CONN_PARAMS)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst paramsRaw = decodeURIComponent(\n\t\t\t\t\t\t\t\tprotocol.substring(\n\t\t\t\t\t\t\t\t\tWS_PROTOCOL_CONN_PARAMS.length,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tparams = JSON.parse(paramsRaw);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"received test inline driver websocket\",\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tencodingKind: encoding,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Connect to the actor using the inline client driver - this returns a Promise<WebSocket>\n\t\t\t\t\tconst clientToProxyWsPromise = managerDriver.openWebSocket(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tencoding,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn await createTestWebSocketProxy(\n\t\t\t\t\t\tclientToProxyWsPromise,\n\t\t\t\t\t);\n\t\t\t\t})(c, noopNext());\n\t\t\t});\n\n\t\t\trouter.all(\".test/inline-driver/send-request/*\", async (c) => {\n\t\t\t\t// Extract parameters from headers\n\t\t\t\tconst actorId = c.req.header(HEADER_ACTOR_ID);\n\n\t\t\t\tif (!actorId) {\n\t\t\t\t\treturn c.text(\"Missing required headers\", 400);\n\t\t\t\t}\n\n\t\t\t\t// Extract the path after /send-request/\n\t\t\t\tconst pathOnly =\n\t\t\t\t\tc.req.path.split(\"/.test/inline-driver/send-request/\")[1] ||\n\t\t\t\t\t\"\";\n\n\t\t\t\t// Include query string\n\t\t\t\tconst url = new URL(c.req.url);\n\t\t\t\tconst pathWithQuery = pathOnly + url.search;\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"received test inline driver raw http\",\n\t\t\t\t\tactorId,\n\t\t\t\t\tpath: pathWithQuery,\n\t\t\t\t\tmethod: c.req.method,\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\t// Forward the request using the inline client driver\n\t\t\t\t\tconst response = await managerDriver.sendRequest(\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tnew Request(`http://actor/${pathWithQuery}`, {\n\t\t\t\t\t\t\tmethod: c.req.method,\n\t\t\t\t\t\t\theaders: c.req.raw.headers,\n\t\t\t\t\t\t\tbody: c.req.raw.body,\n\t\t\t\t\t\t\tduplex: \"half\",\n\t\t\t\t\t\t} as RequestInit),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Return the response directly\n\t\t\t\t\treturn response;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error in test inline raw http\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\n\t\t\t\t\t// Return error response\n\t\t\t\t\tconst err = deconstructError(error, logger(), {}, true);\n\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\t\tcode: err.code,\n\t\t\t\t\t\t\t\tmessage: err.message,\n\t\t\t\t\t\t\t\tmetadata: err.metadata,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr.statusCode,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Test endpoint to force disconnect a connection non-cleanly\n\t\t\trouter.post(\"/.test/force-disconnect\", async (c) => {\n\t\t\t\tconst actorId = c.req.query(\"actor\");\n\t\t\t\tconst connId = c.req.query(\"conn\");\n\n\t\t\t\tif (!actorId || !connId) {\n\t\t\t\t\treturn c.text(\n\t\t\t\t\t\t\"Missing actor or conn query parameters\",\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"forcing unclean disconnect\",\n\t\t\t\t\tactorId,\n\t\t\t\t\tconnId,\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\t// Send a special request to the actor to force disconnect the connection\n\t\t\t\t\tconst response = await managerDriver.sendRequest(\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tnew Request(\n\t\t\t\t\t\t\t`http://actor/.test/force-disconnect?conn=${connId}`,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tconst text = await response.text();\n\t\t\t\t\t\treturn c.text(\n\t\t\t\t\t\t\t`Failed to force disconnect: ${text}`,\n\t\t\t\t\t\t\tresponse.status as any,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn c.json({ success: true });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error forcing disconnect\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t\treturn c.text(`Error: ${error}`, 500);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (config.inspector.enabled) {\n\t\t\tlet inspectorRoot: string | undefined;\n\n\n\t\t\trouter.get(\"/ui/*\", async (c, next) => {\n\t\t\t\tif (!inspectorRoot) {\n\t\t\t\t\tinspectorRoot = await getInspectorDir();\n\t\t\t\t}\n\t\t\t\tconst root = inspectorRoot;\n\t\t\t\tconst rewrite = (path: string) =>\n\t\t\t\t\tpath.replace(/^\\/ui/, \"\") || \"/\";\n\n\t\t\t\treturn serveStatic({\n\t\t\t\t\troot,\n\t\t\t\t\trewriteRequestPath: rewrite,\n\t\t\t\t\tonNotFound: async (_path, c) => {\n\t\t\t\t\t\tawait serveStatic({ root, path: \"index.html\" })(\n\t\t\t\t\t\t\tc,\n\t\t\t\t\t\t\tnext,\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t})(c, next);\n\t\t\t});\n\n\t\t\trouter.get(\"/ui\", (c) => c.redirect(\"/ui/\"));\n\t\t}\n\n\t\trouter.get(\"/health\", (c) => handleHealthRequest(c));\n\n\t\trouter.get(\"/metadata\", (c) =>\n\t\t\thandleMetadataRequest(\n\t\t\t\tc,\n\t\t\t\tconfig,\n\t\t\t\t{ normal: {} },\n\t\t\t\tconfig.publicEndpoint,\n\t\t\t\tconfig.publicNamespace,\n\t\t\t\tconfig.publicToken,\n\t\t\t),\n\t\t);\n\n\t\tmanagerDriver.modifyManagerRouter?.(config, router as unknown as Hono);\n\t});\n}\n\nfunction createApiActor(actor: ActorOutput): ApiActor {\n\treturn {\n\t\tactor_id: actor.actorId,\n\t\tname: actor.name,\n\t\tkey: serializeActorKey(actor.key),\n\t\tnamespace_id: \"default\", // Assert default namespace\n\t\trunner_name_selector: \"default\",\n\t\tcreate_ts: actor.createTs ?? Date.now(),\n\t\tconnectable_ts: actor.connectableTs ?? null,\n\t\tdestroy_ts: actor.destroyTs ?? null,\n\t\tsleep_ts: actor.sleepTs ?? null,\n\t\tstart_ts: actor.startTs ?? null,\n\t};\n}\n","import type { ActorKey } from \"@/mod\";\n\nexport const EMPTY_KEY = \"/\";\nexport const KEY_SEPARATOR = \"/\";\n\nexport function serializeActorKey(key: ActorKey): 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// Handle empty strings by using a special marker\n\t\tif (part === \"\") {\n\t\t\treturn \"\\\\0\"; // Use \\0 as a marker for empty strings\n\t\t}\n\n\t\t// Escape backslashes first to avoid conflicts with our markers\n\t\tlet escaped = part.replace(/\\\\/g, \"\\\\\\\\\");\n\n\t\t// Then escape separators\n\t\tescaped = escaped.replace(/\\//g, `\\\\${KEY_SEPARATOR}`);\n\n\t\treturn escaped;\n\t});\n\n\treturn escapedParts.join(KEY_SEPARATOR);\n}\n\nexport function deserializeActorKey(keyString: string | undefined): ActorKey {\n\t// Check for special empty key marker\n\tif (\n\t\tkeyString === undefined ||\n\t\tkeyString === null ||\n\t\tkeyString === EMPTY_KEY\n\t) {\n\t\treturn [];\n\t}\n\n\t// Split by unescaped separators and unescape the escaped characters\n\tconst parts: string[] = [];\n\tlet currentPart = \"\";\n\tlet escaping = false;\n\tlet isEmptyStringMarker = 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// Handle special escape sequences\n\t\t\tif (char === \"0\") {\n\t\t\t\t// \\0 represents an empty string marker\n\t\t\t\tisEmptyStringMarker = true;\n\t\t\t} else {\n\t\t\t\t// This is an escaped character, add it directly\n\t\t\t\tcurrentPart += char;\n\t\t\t}\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\tif (isEmptyStringMarker) {\n\t\t\t\tparts.push(\"\");\n\t\t\t\tisEmptyStringMarker = false;\n\t\t\t} else {\n\t\t\t\tparts.push(currentPart);\n\t\t\t}\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\n\tif (escaping) {\n\t\t// Incomplete escape at the end - treat as literal backslash\n\t\tparts.push(currentPart + \"\\\\\");\n\t} else if (isEmptyStringMarker) {\n\t\tparts.push(\"\");\n\t} else if (currentPart !== \"\" || parts.length > 0) {\n\t\tparts.push(currentPart);\n\t}\n\n\treturn parts;\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext, Next } from \"hono\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport {\n\tgetRequestEncoding,\n\tgetRequestExposeInternalError,\n} from \"@/actor/router-endpoints\";\nimport {\n\tbuildActorNames,\n\ttype RegistryConfig,\n} from \"@/registry/config\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tHTTP_RESPONSE_ERROR_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype HttpResponseError as HttpResponseErrorJson,\n\tHttpResponseErrorSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { encodingIsBinary, serializeWithEncoding } from \"@/serde\";\nimport { bufferToArrayBuffer, VERSION } from \"@/utils\";\nimport { getLogHeaders } from \"@/utils/env-vars\";\nimport { getLogger, type Logger } from \"./log\";\nimport { deconstructError, stringifyError } from \"./utils\";\n\nexport function logger() {\n\treturn getLogger(\"router\");\n}\n\nexport function loggerMiddleware(logger: Logger) {\n\treturn async (c: HonoContext, next: Next) => {\n\t\tconst method = c.req.method;\n\t\tconst path = c.req.path;\n\t\tconst startTime = Date.now();\n\n\t\tawait next();\n\n\t\tconst duration = Date.now() - startTime;\n\t\tlogger.debug({\n\t\t\tmsg: \"http request\",\n\t\t\tmethod,\n\t\t\tpath,\n\t\t\tstatus: c.res.status,\n\t\t\tdt: `${duration}ms`,\n\t\t\treqSize: c.req.header(\"content-length\"),\n\t\t\tresSize: c.res.headers.get(\"content-length\"),\n\t\t\tuserAgent: c.req.header(\"user-agent\"),\n\t\t\t...(getLogHeaders()\n\t\t\t\t? { allHeaders: JSON.stringify(c.req.header()) }\n\t\t\t\t: {}),\n\t\t});\n\t};\n}\n\nexport function handleRouteNotFound(c: HonoContext) {\n\treturn c.text(\"Not Found (RivetKit)\", 404);\n}\n\nexport function handleRouteError(error: unknown, c: HonoContext) {\n\tconst exposeInternalError = getRequestExposeInternalError(c.req.raw);\n\n\tconst { statusCode, group, code, message, metadata } = deconstructError(\n\t\terror,\n\t\tlogger(),\n\t\t{\n\t\t\tmethod: c.req.method,\n\t\t\tpath: c.req.path,\n\t\t},\n\t\texposeInternalError,\n\t);\n\n\tlet encoding: Encoding;\n\ttry {\n\t\tencoding = getRequestEncoding(c.req);\n\t} catch (_) {\n\t\tencoding = \"json\";\n\t}\n\n\tconst errorData = { group, code, message, metadata };\n\tconst output = serializeWithEncoding(\n\t\tencoding,\n\t\terrorData,\n\t\tHTTP_RESPONSE_ERROR_VERSIONED,\n\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\tHttpResponseErrorSchema,\n\t\t// JSON: metadata is the raw value (will be serialized by jsonStringifyCompat)\n\t\t(value): HttpResponseErrorJson => ({\n\t\t\tgroup: value.group,\n\t\t\tcode: value.code,\n\t\t\tmessage: value.message,\n\t\t\tmetadata: value.metadata,\n\t\t}),\n\t\t// BARE/CBOR: metadata needs to be CBOR-encoded to ArrayBuffer\n\t\t(value): protocol.HttpResponseError => ({\n\t\t\tgroup: value.group,\n\t\t\tcode: value.code,\n\t\t\tmessage: value.message,\n\t\t\tmetadata: value.metadata\n\t\t\t\t? bufferToArrayBuffer(cbor.encode(value.metadata))\n\t\t\t\t: null,\n\t\t}),\n\t);\n\n\t// TODO: Remove any\n\treturn c.body(output as any, { status: statusCode });\n}\n\nexport type MetadataRunnerKind =\n\t| { serverless: Record<never, never> }\n\t| { normal: Record<never, never> };\n\n/**\n * Metadata response interface for the /metadata endpoint\n */\nexport interface MetadataResponse {\n\truntime: string;\n\tversion: string;\n\trunner?: {\n\t\tkind: MetadataRunnerKind;\n\t\tversion?: number;\n\t};\n\tactorNames: ReturnType<typeof buildActorNames>;\n\t/**\n\t * Endpoint that the client should connect to to access this runner.\n\t *\n\t * If defined, will override the endpoint the user has configured on startup.\n\t *\n\t * This is helpful if attempting to connect to a serverless runner, so the serverless runner can define where the main endpoint lives.\n\t *\n\t * This is also helpful for setting up clean redirects as needed.\n\t **/\n\tclientEndpoint?: string;\n\t/**\n\t * Namespace that the client should use when connecting.\n\t **/\n\tclientNamespace?: string;\n\t/**\n\t * Token that the client should use when connecting.\n\t **/\n\tclientToken?: string;\n}\n\nexport function handleMetadataRequest(\n\tc: HonoContext,\n\tconfig: RegistryConfig,\n\trunnerKind: MetadataRunnerKind,\n\tclientEndpoint: string | undefined,\n\tclientNamespace: string | undefined,\n\tclientToken: string | undefined,\n) {\n\tconst response: MetadataResponse = {\n\t\truntime: \"rivetkit\",\n\t\tversion: VERSION,\n\t\trunner: {\n\t\t\tkind: runnerKind,\n\t\t\tversion: config.runner.version,\n\t\t},\n\t\tactorNames: buildActorNames(config),\n\t\tclientEndpoint,\n\t\tclientNamespace,\n\t\tclientToken,\n\t};\n\n\treturn c.json(response);\n}\n\nexport function handleHealthRequest(c: HonoContext) {\n\treturn c.json({\n\t\tstatus: \"ok\",\n\t\truntime: \"rivetkit\",\n\t\tversion: VERSION,\n\t});\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext, HonoRequest } from \"hono\";\nimport type { AnyConn } from \"@/actor/conn/mod\";\nimport { ActionContext } from \"@/actor/contexts\";\nimport * as errors from \"@/actor/errors\";\nimport type { AnyActorInstance } from \"@/actor/instance/mod\";\nimport { type Encoding, EncodingSchema } from \"@/actor/protocol/serde\";\nimport { hasSchemaConfigKey } from \"@/actor/schema\";\nimport {\n\tHEADER_ACTOR_QUERY,\n\tHEADER_CONN_PARAMS,\n\tHEADER_ENCODING,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n} from \"@/common/actor-router-consts\";\nimport { stringifyError } from \"@/common/utils\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tHTTP_ACTION_REQUEST_VERSIONED,\n\tHTTP_ACTION_RESPONSE_VERSIONED,\n\tHTTP_QUEUE_SEND_REQUEST_VERSIONED,\n\tHTTP_QUEUE_SEND_RESPONSE_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype HttpActionRequest as HttpActionRequestJson,\n\tHttpActionRequestSchema,\n\ttype HttpActionResponse as HttpActionResponseJson,\n\tHttpActionResponseSchema,\n\ttype HttpQueueSendRequest as HttpQueueSendRequestJson,\n\tHttpQueueSendRequestSchema,\n\ttype HttpQueueSendResponse as HttpQueueSendResponseJson,\n\tHttpQueueSendResponseSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport {\n\tcontentTypeForEncoding,\n\tdeserializeWithEncoding,\n\tserializeWithEncoding,\n} from \"@/serde\";\nimport { bufferToArrayBuffer, getEnvUniversal } from \"@/utils\";\nimport { createHttpDriver } from \"./conn/drivers/http\";\nimport { createRawRequestDriver } from \"./conn/drivers/raw-request\";\nimport type { ActorDriver } from \"./driver\";\nimport { loggerWithoutContext } from \"./log\";\n\nexport interface ActionOpts {\n\treq?: HonoRequest;\n\tparams: unknown;\n\tactionName: string;\n\tactionArgs: unknown[];\n\tactorId: string;\n}\n\nexport interface ActionOutput {\n\toutput: unknown;\n}\n\nexport interface ConnsMessageOpts {\n\treq?: HonoRequest;\n\tconnId: string;\n\tmessage: protocol.ToServer;\n\tactorId: string;\n}\n\nexport interface FetchOpts {\n\trequest: Request;\n\tactorId: string;\n}\n\nexport interface QueueSendOpts {\n\treq?: HonoRequest;\n\tname: string;\n\tbody: unknown;\n\twait?: boolean;\n\ttimeout?: number;\n\tactorId: string;\n}\n\n/**\n * Creates an action handler\n */\nexport async function handleAction(\n\tc: HonoContext,\n\tconfig: RegistryConfig,\n\tactorDriver: ActorDriver,\n\tactionName: string,\n\tactorId: string,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst parameters = getRequestConnParams(c.req);\n\n\t// Validate incoming request\n\tconst arrayBuffer = await c.req.arrayBuffer();\n\n\t// Check message size\n\tif (arrayBuffer.byteLength > config.maxIncomingMessageSize) {\n\t\tthrow new errors.IncomingMessageTooLong();\n\t}\n\n\tconst request = deserializeWithEncoding(\n\t\tencoding,\n\t\tnew Uint8Array(arrayBuffer),\n\t\tHTTP_ACTION_REQUEST_VERSIONED,\n\t\tHttpActionRequestSchema,\n\t\t// JSON: args is already the decoded value (raw object/array)\n\t\t(json: HttpActionRequestJson) => json.args,\n\t\t// BARE/CBOR: args is ArrayBuffer that needs CBOR-decoding\n\t\t(bare: protocol.HttpActionRequest) =>\n\t\t\tcbor.decode(new Uint8Array(bare.args)),\n\t);\n\tconst actionArgs = request;\n\n\t// Invoke the action\n\tlet output: unknown | undefined;\n\tlet outputReady = false;\n\tconst maxAttempts = 3;\n\tfor (let attempt = 0; attempt < maxAttempts; attempt++) {\n\t\tlet actor: AnyActorInstance | undefined;\n\t\tlet conn: AnyConn | undefined;\n\t\ttry {\n\t\t\tactor = await actorDriver.loadActor(actorId);\n\n\t\t\tactor.rLog.debug({ msg: \"handling action\", actionName, encoding });\n\n\t\t\t// Create conn\n\t\t\tconn = await actor.connectionManager.prepareAndConnectConn(\n\t\t\t\tcreateHttpDriver(),\n\t\t\t\tparameters,\n\t\t\t\tc.req.raw,\n\t\t\t\tc.req.path,\n\t\t\t\tc.req.header(),\n\t\t\t);\n\n\t\t\t// Call action\n\t\t\tconst ctx = new ActionContext(actor, conn);\n\t\t\toutput = await actor.executeAction(ctx, actionName, actionArgs);\n\t\t\toutputReady = true;\n\t\t\tbreak;\n\t\t} catch (error) {\n\t\t\tconst shouldRetry =\n\t\t\t\terror instanceof errors.InternalError &&\n\t\t\t\terror.message === \"Actor is stopping\" &&\n\t\t\t\tattempt < maxAttempts - 1;\n\t\t\tif (shouldRetry) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 25));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (conn) {\n\t\t\t\tconn.disconnect();\n\t\t\t}\n\t\t}\n\t}\n\tif (!outputReady) {\n\t\tthrow new errors.InternalError(\"Action did not complete\");\n\t}\n\n\t// Send response\n\tconst serialized = serializeWithEncoding(\n\t\tencoding,\n\t\toutput,\n\t\tHTTP_ACTION_RESPONSE_VERSIONED,\n\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\tHttpActionResponseSchema,\n\t\t// JSON: output is the raw value (will be serialized by jsonStringifyCompat)\n\t\t(value): HttpActionResponseJson => ({ output: value }),\n\t\t// BARE/CBOR: output needs to be CBOR-encoded to ArrayBuffer\n\t\t(value): protocol.HttpActionResponse => ({\n\t\t\toutput: bufferToArrayBuffer(cbor.encode(value)),\n\t\t}),\n\t);\n\n\t// Check outgoing message size\n\tconst messageSize =\n\t\tserialized instanceof Uint8Array\n\t\t\t? serialized.byteLength\n\t\t\t: serialized.length;\n\tif (messageSize > config.maxOutgoingMessageSize) {\n\t\tthrow new errors.OutgoingMessageTooLong();\n\t}\n\n\t// TODO: Remove any, Hono is being a dumbass\n\treturn c.body(serialized as Uint8Array as any, 200, {\n\t\t\"Content-Type\": contentTypeForEncoding(encoding),\n\t});\n}\n\nexport async function handleQueueSend(\n\tc: HonoContext,\n\tconfig: RegistryConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tqueueName?: string,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst params = getRequestConnParams(c.req);\n\tconst arrayBuffer = await c.req.arrayBuffer();\n\n\tif (arrayBuffer.byteLength > config.maxIncomingMessageSize) {\n\t\tthrow new errors.IncomingMessageTooLong();\n\t}\n\n\tconst request = deserializeWithEncoding(\n\t\tencoding,\n\t\tnew Uint8Array(arrayBuffer),\n\t\tHTTP_QUEUE_SEND_REQUEST_VERSIONED,\n\t\tHttpQueueSendRequestSchema,\n\t\t(json: HttpQueueSendRequestJson) => json,\n\t\t(bare: protocol.HttpQueueSendRequest) => ({\n\t\t\tname: bare.name ?? undefined,\n\t\t\tbody: cbor.decode(new Uint8Array(bare.body)),\n\t\t\twait: bare.wait ?? undefined,\n\t\t\ttimeout:\n\t\t\t\tbare.timeout !== null && bare.timeout !== undefined\n\t\t\t\t\t? Number(bare.timeout)\n\t\t\t\t\t: undefined,\n\t\t}),\n\t);\n\n\tconst name = queueName ?? request.name;\n\tif (!name) {\n\t\tthrow new errors.InvalidRequest(\"missing queue name\");\n\t}\n\n\tconst actor = await actorDriver.loadActor(actorId);\n\tif (!hasSchemaConfigKey(actor.config.queues, name)) {\n\t\tactor.rLog.warn({\n\t\t\tmsg: \"ignoring incoming queue message for undefined queue\",\n\t\t\tqueueName: name,\n\t\t\thasQueueConfig: actor.config.queues !== undefined,\n\t\t});\n\t\tconst ignoredResponse = serializeWithEncoding(\n\t\t\tencoding,\n\t\t\t{ status: \"completed\" as const, response: undefined },\n\t\t\tHTTP_QUEUE_SEND_RESPONSE_VERSIONED,\n\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\tHttpQueueSendResponseSchema,\n\t\t\t(value): HttpQueueSendResponseJson => ({\n\t\t\t\tstatus: value.status,\n\t\t\t\tresponse: value.response,\n\t\t\t}),\n\t\t\t(value): protocol.HttpQueueSendResponse => ({\n\t\t\t\tstatus: value.status,\n\t\t\t\tresponse:\n\t\t\t\t\tvalue.response !== undefined\n\t\t\t\t\t\t? bufferToArrayBuffer(cbor.encode(value.response))\n\t\t\t\t\t\t: null,\n\t\t\t}),\n\t\t);\n\t\treturn c.body(ignoredResponse as Uint8Array as any, 200, {\n\t\t\t\"Content-Type\": contentTypeForEncoding(encoding),\n\t\t});\n\t}\n\n\tconst conn = await actor.connectionManager.prepareAndConnectConn(\n\t\tcreateHttpDriver(),\n\t\tparams,\n\t\tc.req.raw,\n\t\tc.req.path,\n\t\tc.req.header(),\n\t);\n\tlet result: { status: \"completed\" | \"timedOut\"; response?: unknown } = {\n\t\tstatus: \"completed\",\n\t};\n\ttry {\n\t\tconst ctx = new ActionContext(actor, conn);\n\t\tawait actor.assertCanPublish(ctx, name);\n\n\t\tif (request.wait) {\n\t\t\tresult = await actor.queueManager.enqueueAndWait(\n\t\t\t\tname,\n\t\t\t\trequest.body,\n\t\t\t\trequest.timeout,\n\t\t\t);\n\t\t} else {\n\t\t\tawait actor.queueManager.enqueue(name, request.body);\n\t\t}\n\t} finally {\n\t\tconn.disconnect();\n\t}\n\n\tconst response = serializeWithEncoding(\n\t\tencoding,\n\t\tresult,\n\t\tHTTP_QUEUE_SEND_RESPONSE_VERSIONED,\n\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\tHttpQueueSendResponseSchema,\n\t\t(value): HttpQueueSendResponseJson => ({\n\t\t\tstatus: value.status,\n\t\t\tresponse: value.response,\n\t\t}),\n\t\t(value): protocol.HttpQueueSendResponse => ({\n\t\t\tstatus: value.status,\n\t\t\tresponse:\n\t\t\t\tvalue.response !== undefined\n\t\t\t\t\t? bufferToArrayBuffer(cbor.encode(value.response))\n\t\t\t\t\t: null,\n\t\t}),\n\t);\n\n\treturn c.body(response as Uint8Array as any, 200, {\n\t\t\"Content-Type\": contentTypeForEncoding(encoding),\n\t});\n}\n\nexport async function handleRawRequest(\n\tc: HonoContext,\n\treq: Request,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n): Promise<Response> {\n\tconst actor = await actorDriver.loadActor(actorId);\n\tconst parameters = getRequestConnParams(c.req);\n\n\t// Track connection outside of scope for cleanup\n\tlet createdConn: AnyConn | undefined;\n\n\ttry {\n\t\tconst conn = await actor.connectionManager.prepareAndConnectConn(\n\t\t\tcreateRawRequestDriver(),\n\t\t\tparameters,\n\t\t\treq,\n\t\t\tc.req.path,\n\t\t\tc.req.header(),\n\t\t);\n\n\t\tcreatedConn = conn;\n\n\t\treturn await actor.handleRawRequest(conn, req);\n\t} finally {\n\t\t// Clean up the connection after the request completes\n\t\tif (createdConn) {\n\t\t\tcreatedConn.disconnect();\n\t\t}\n\t}\n}\n\n// Helper to get the connection encoding from a request\n//\n// Defaults to JSON if not provided so we can support vanilla curl requests easily.\nexport function getRequestEncoding(req: HonoRequest): Encoding {\n\tconst encodingParam = req.header(HEADER_ENCODING);\n\tif (!encodingParam) {\n\t\treturn \"json\";\n\t}\n\n\tconst result = EncodingSchema.safeParse(encodingParam);\n\tif (!result.success) {\n\t\tthrow new errors.InvalidEncoding(encodingParam as string);\n\t}\n\n\treturn result.data;\n}\n\n/**\n * Determines whether internal errors should be exposed to the client.\n * Returns true if RIVET_EXPOSE_ERRORS=1 or NODE_ENV=development.\n */\nexport function getRequestExposeInternalError(_req: Request): boolean {\n\treturn (\n\t\tgetEnvUniversal(\"RIVET_EXPOSE_ERRORS\") === \"1\" ||\n\t\tgetEnvUniversal(\"NODE_ENV\") === \"development\"\n\t);\n}\n\nexport function getRequestQuery(c: HonoContext): unknown {\n\t// Get query parameters for actor lookup\n\tconst queryParam = c.req.header(HEADER_ACTOR_QUERY);\n\tif (!queryParam) {\n\t\tloggerWithoutContext().error({ msg: \"missing query parameter\" });\n\t\tthrow new errors.InvalidRequest(\"missing query\");\n\t}\n\n\t// Parse the query JSON and validate with schema\n\ttry {\n\t\tconst parsed = JSON.parse(queryParam);\n\t\treturn parsed;\n\t} catch (error) {\n\t\tloggerWithoutContext().error({ msg: \"invalid query json\", error });\n\t\tthrow new errors.InvalidQueryJSON(error);\n\t}\n}\n\n// Helper to get connection parameters for the request\nexport function getRequestConnParams(req: HonoRequest): unknown {\n\tconst paramsParam = req.header(HEADER_CONN_PARAMS);\n\tif (!paramsParam) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\treturn JSON.parse(paramsParam);\n\t} catch (err) {\n\t\tthrow new errors.InvalidParams(\n\t\t\t`Invalid params JSON: ${stringifyError(err)}`,\n\t\t);\n\t}\n}\n","import type { Conn } from \"../../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../../definition\";\nimport type { ActorInstance } from \"../../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../../schema\";\nimport { ActorContext } from \"./actor\";\n\n/**\n * Base context for connection-based handlers.\n * Extends ActorContext with connection-specific functionality.\n */\nexport abstract class ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ActorContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tpublic readonly conn: Conn<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t) {\n\t\tsuper(actor);\n\t}\n}\n\nexport type ConnContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? ConnContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type { Conn } from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnContext } from \"./base/conn\";\n\n/**\n * Context for a remote procedure call.\n */\nexport class ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {}\n\n/**\n * Extracts the ActionContext type from an ActorDefinition.\n */\nexport type ActionContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? ActionContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type { AnyDatabaseProvider } from \"../../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../../definition\";\nimport type { ActorInstance } from \"../../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../../schema\";\nimport { ActorContext } from \"./actor\";\n\n/**\n * Base context for connection initialization handlers.\n * Extends ActorContext with request-specific functionality for connection lifecycle events.\n */\nexport abstract class ConnInitContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ActorContext<\n\tTState,\n\tnever,\n\tnever,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {\n\t/**\n\t * The incoming request that initiated the connection.\n\t * May be undefined for connections initiated without a direct HTTP request.\n\t */\n\tpublic readonly request: Request | undefined;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tany,\n\t\t\tany,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\trequest: Request | undefined,\n\t) {\n\t\tsuper(actor as any);\n\t\tthis.request = request;\n\t}\n}\n\nexport type ConnInitContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tany,\n\t\tany,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? ConnInitContext<S, V, I, DB, E, Q>\n\t\t: never;\n","import type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnInitContext } from \"./base/conn-init\";\n\n/**\n * Context for the onBeforeConnect lifecycle hook.\n */\nexport class BeforeConnectContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnInitContext<TState, TVars, TInput, TDatabase, TEvents, TQueues> {}\n\nexport type BeforeConnectContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tany,\n\t\tany,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? BeforeConnectContext<S, V, I, DB, E, Q>\n\t\t: never;\n","import type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnContext } from \"./base/conn\";\n\n/**\n * Context for the onConnect lifecycle hook.\n */\nexport class ConnectContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {}\n\nexport type ConnectContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? ConnectContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnInitContext } from \"./base/conn-init\";\n\n/**\n * Context for the createConnState lifecycle hook.\n * Called to initialize connection-specific state when a connection is created.\n */\nexport class CreateConnStateContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnInitContext<TState, TVars, TInput, TDatabase, TEvents, TQueues> {}\n\nexport type CreateConnStateContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tany,\n\t\tany,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? CreateConnStateContext<S, V, I, DB, E, Q>\n\t\t: never;\n","import type { Conn } from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnContext } from \"./base/conn\";\n\n/**\n * Context for raw HTTP request handlers (onRequest).\n */\nexport class RequestContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {\n\t/**\n\t * The incoming HTTP request.\n\t * May be undefined for request contexts initiated without a direct HTTP request.\n\t */\n\tpublic readonly request: Request | undefined;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tconn: Conn<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\trequest?: Request,\n\t) {\n\t\tsuper(actor, conn);\n\t\tthis.request = request;\n\t}\n}\n\nexport type RequestContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? RequestContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type { Conn } from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnContext } from \"./base/conn\";\n\n/**\n * Context for raw WebSocket handlers (onWebSocket).\n */\nexport class WebSocketContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {\n\t/**\n\t * The incoming HTTP request that initiated the WebSocket upgrade.\n\t * May be undefined for WebSocket connections initiated without a direct HTTP request.\n\t */\n\tpublic readonly request: Request | undefined;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tconn: Conn<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\trequest?: Request,\n\t) {\n\t\tsuper(actor, conn);\n\t\tthis.request = request;\n\t}\n}\n\nexport type WebSocketContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? WebSocketContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import * as cbor from \"cbor-x\";\nimport type { VersionedDataHandler } from \"vbare\";\nimport { z } from \"zod/v4\";\nimport * as errors from \"@/actor/errors\";\nimport { serializeWithEncoding } from \"@/serde\";\nimport { loggerWithoutContext } 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\", \"bare\"]);\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<TBare, TJson, T = TBare> {\n\t#data: T;\n\t#cache = new Map<Encoding, OutputData>();\n\t#versionedDataHandler: VersionedDataHandler<TBare>;\n\t#version: number;\n\t#zodSchema: z.ZodType<TJson>;\n\t#toJson: (value: T) => TJson;\n\t#toBare: (value: T) => TBare;\n\n\tconstructor(\n\t\tdata: T,\n\t\tversionedDataHandler: VersionedDataHandler<TBare>,\n\t\tversion: number,\n\t\tzodSchema: z.ZodType<TJson>,\n\t\ttoJson: (value: T) => TJson,\n\t\ttoBare: (value: T) => TBare,\n\t) {\n\t\tthis.#data = data;\n\t\tthis.#versionedDataHandler = versionedDataHandler;\n\t\tthis.#version = version;\n\t\tthis.#zodSchema = zodSchema;\n\t\tthis.#toJson = toJson;\n\t\tthis.#toBare = toBare;\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 = serializeWithEncoding(\n\t\t\t\tencoding,\n\t\t\t\tthis.#data,\n\t\t\t\tthis.#versionedDataHandler,\n\t\t\t\tthis.#version,\n\t\t\t\tthis.#zodSchema,\n\t\t\t\tthis.#toJson,\n\t\t\t\tthis.#toBare,\n\t\t\t);\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// */\n//export 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//\n//export 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\nfunction base64DecodeToUint8Array(base64: string): Uint8Array {\n\t// Check if Buffer is available (Node.js)\n\tif (typeof Buffer !== \"undefined\") {\n\t\treturn new Uint8Array(Buffer.from(base64, \"base64\"));\n\t}\n\n\t// Browser environment - use atob\n\tconst binary = atob(base64);\n\tconst len = binary.length;\n\tconst bytes = new Uint8Array(len);\n\tfor (let i = 0; i < len; i++) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\nfunction base64DecodeToArrayBuffer(base64: string): ArrayBuffer {\n\treturn base64DecodeToUint8Array(base64).buffer as ArrayBuffer;\n}\n\n/** Stringifies with compat for values that BARE & CBOR supports. */\nexport function jsonStringifyCompat(input: any): string {\n\treturn JSON.stringify(input, (_key, value) => {\n\t\tif (typeof value === \"bigint\") {\n\t\t\treturn [\"$BigInt\", value.toString()];\n\t\t} else if (value instanceof ArrayBuffer) {\n\t\t\treturn [\"$ArrayBuffer\", base64EncodeArrayBuffer(value)];\n\t\t} else if (value instanceof Uint8Array) {\n\t\t\treturn [\"$Uint8Array\", base64EncodeUint8Array(value)];\n\t\t}\n\n\t\t// Escape user arrays that start with $ by prepending another $\n\t\tif (\n\t\t\tArray.isArray(value) &&\n\t\t\tvalue.length === 2 &&\n\t\t\ttypeof value[0] === \"string\" &&\n\t\t\tvalue[0].startsWith(\"$\")\n\t\t) {\n\t\t\treturn [\"$\" + value[0], value[1]];\n\t\t}\n\n\t\treturn value;\n\t});\n}\n\n/** Parses JSON with compat for values that BARE & CBOR supports. */\nexport function jsonParseCompat(input: string): any {\n\treturn JSON.parse(input, (_key, value) => {\n\t\t// Handle arrays with $ prefix\n\t\tif (\n\t\t\tArray.isArray(value) &&\n\t\t\tvalue.length === 2 &&\n\t\t\ttypeof value[0] === \"string\" &&\n\t\t\tvalue[0].startsWith(\"$\")\n\t\t) {\n\t\t\t// Known special types\n\t\t\tif (value[0] === \"$BigInt\") {\n\t\t\t\treturn BigInt(value[1]);\n\t\t\t} else if (value[0] === \"$ArrayBuffer\") {\n\t\t\t\treturn base64DecodeToArrayBuffer(value[1]);\n\t\t\t} else if (value[0] === \"$Uint8Array\") {\n\t\t\t\treturn base64DecodeToUint8Array(value[1]);\n\t\t\t}\n\n\t\t\t// Unescape user arrays that started with $ ($$foo -> $foo)\n\t\t\tif (value[0].startsWith(\"$$\")) {\n\t\t\t\treturn [value[0].substring(1), value[1]];\n\t\t\t}\n\n\t\t\t// Unknown type starting with $ - this is an error\n\t\t\tthrow new Error(\n\t\t\t\t`Unknown JSON encoding type: ${value[0]}. This may indicate corrupted data or a version mismatch.`,\n\t\t\t);\n\t\t}\n\n\t\treturn value;\n\t});\n}\n","import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport type { VersionedDataHandler } from \"vbare\";\nimport type { z } from \"zod/v4\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport type { Encoding } from \"@/mod\";\nimport { jsonParseCompat, jsonStringifyCompat } from \"./actor/protocol/serde\";\n\nexport function uint8ArrayToBase64(uint8Array: Uint8Array): string {\n\t// Check if Buffer is available (Node.js)\n\tif (typeof Buffer !== \"undefined\") {\n\t\treturn Buffer.from(uint8Array).toString(\"base64\");\n\t}\n\n\t// Browser environment - use btoa\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\nexport function encodingIsBinary(encoding: Encoding): boolean {\n\tif (encoding === \"json\") {\n\t\treturn false;\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn true;\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function contentTypeForEncoding(encoding: Encoding): string {\n\tif (encoding === \"json\") {\n\t\treturn \"application/json\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"application/octet-stream\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function wsBinaryTypeForEncoding(\n\tencoding: Encoding,\n): \"arraybuffer\" | \"blob\" {\n\tif (encoding === \"json\") {\n\t\treturn \"blob\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"arraybuffer\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function serializeWithEncoding<TBare, TJson, T = TBare>(\n\tencoding: Encoding,\n\tvalue: T,\n\tversionedDataHandler: VersionedDataHandler<TBare> | undefined,\n\tversion: number | undefined,\n\tzodSchema: z.ZodType<TJson>,\n\ttoJson: (value: T) => TJson,\n\ttoBare: (value: T) => TBare,\n): Uint8Array | string {\n\tif (encoding === \"json\") {\n\t\tconst jsonValue = toJson(value);\n\t\tconst validated = zodSchema.parse(jsonValue);\n\t\treturn jsonStringifyCompat(validated);\n\t} else if (encoding === \"cbor\") {\n\t\tconst jsonValue = toJson(value);\n\t\tconst validated = zodSchema.parse(jsonValue);\n\t\treturn cbor.encode(validated);\n\t} else if (encoding === \"bare\") {\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\n\t\t\t\t\"VersionedDataHandler is required for 'bare' encoding\",\n\t\t\t);\n\t\t}\n\t\tif (version === undefined) {\n\t\t\tthrow new Error(\"version is required for 'bare' encoding\");\n\t\t}\n\t\tconst bareValue = toBare(value);\n\t\treturn versionedDataHandler.serializeWithEmbeddedVersion(\n\t\t\tbareValue,\n\t\t\tversion,\n\t\t);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function deserializeWithEncoding<TBare, TJson, T = TBare>(\n\tencoding: Encoding,\n\tbuffer: Uint8Array | string,\n\tversionedDataHandler: VersionedDataHandler<TBare> | undefined,\n\tzodSchema: z.ZodType<TJson>,\n\tfromJson: (value: TJson) => T,\n\tfromBare: (value: TBare) => T,\n): T {\n\tif (encoding === \"json\") {\n\t\tlet parsed: unknown;\n\t\tif (typeof buffer === \"string\") {\n\t\t\tparsed = jsonParseCompat(buffer);\n\t\t} else {\n\t\t\tconst decoder = new TextDecoder(\"utf-8\");\n\t\t\tconst jsonString = decoder.decode(buffer);\n\t\t\tparsed = jsonParseCompat(jsonString);\n\t\t}\n\t\tconst validated = zodSchema.parse(parsed);\n\t\treturn fromJson(validated);\n\t} else if (encoding === \"cbor\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for cbor encoding\",\n\t\t);\n\t\t// Decode CBOR to get JavaScript values (similar to JSON.parse)\n\t\tconst decoded: unknown = cbor.decode(buffer);\n\t\t// Validate with Zod schema (CBOR produces same structure as JSON)\n\t\tconst validated = zodSchema.parse(decoded);\n\t\t// CBOR decoding produces JS objects, use fromJson\n\t\treturn fromJson(validated);\n\t} else if (encoding === \"bare\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for bare encoding\",\n\t\t);\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\n\t\t\t\t\"VersionedDataHandler is required for 'bare' encoding\",\n\t\t\t);\n\t\t}\n\t\tconst bareValue =\n\t\t\tversionedDataHandler.deserializeWithEmbeddedVersion(buffer);\n\t\treturn fromBare(bareValue);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n","import { createVersionedDataHandler } from \"vbare\";\nimport * as v1 from \"../../../dist/schemas/client-protocol/v1\";\nimport * as v2 from \"../../../dist/schemas/client-protocol/v2\";\nimport * as v3 from \"../../../dist/schemas/client-protocol/v3\";\n\nexport const CURRENT_VERSION = 3;\n\n// Converter from v1 to v2: Remove connectionToken from Init message\nconst v1ToV2 = (v1Data: v1.ToClient): v2.ToClient => {\n\t// Handle Init message specifically to remove connectionToken\n\tif (v1Data.body.tag === \"Init\") {\n\t\tconst { actorId, connectionId } = v1Data.body.val as v1.Init;\n\t\treturn {\n\t\t\tbody: {\n\t\t\t\ttag: \"Init\",\n\t\t\t\tval: {\n\t\t\t\t\tactorId,\n\t\t\t\t\tconnectionId,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\t// All other messages are unchanged\n\treturn v1Data as unknown as v2.ToClient;\n};\n\n// Converter from v2 to v1: Add empty connectionToken to Init message\nconst v2ToV1 = (v2Data: v2.ToClient): v1.ToClient => {\n\t// Handle Init message specifically to add connectionToken\n\tif (v2Data.body.tag === \"Init\") {\n\t\tconst { actorId, connectionId } = v2Data.body.val;\n\t\treturn {\n\t\t\tbody: {\n\t\t\t\ttag: \"Init\",\n\t\t\t\tval: {\n\t\t\t\t\tactorId,\n\t\t\t\t\tconnectionId,\n\t\t\t\t\tconnectionToken: \"\", // Add empty connectionToken for v1 compatibility\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\t// All other messages are unchanged\n\treturn v2Data as unknown as v1.ToClient;\n};\n\n// Converter from v2 to v3: No changes needed for ToClient\nconst v2ToV3 = (v2Data: v2.ToClient): v3.ToClient => {\n\treturn v2Data as unknown as v3.ToClient;\n};\n\n// Converter from v3 to v2: No changes needed for ToClient\nconst v3ToV2 = (v3Data: v3.ToClient): v2.ToClient => {\n\treturn v3Data as unknown as v2.ToClient;\n};\n\n// ToServer identity converters (ToServer is identical across v1, v2, and v3)\nconst v1ToServerV2 = (v1Data: v1.ToServer): v2.ToServer => {\n\treturn v1Data as unknown as v2.ToServer;\n};\n\nconst v2ToServerV3 = (v2Data: v2.ToServer): v3.ToServer => {\n\treturn v2Data as unknown as v3.ToServer;\n};\n\nconst v3ToServerV2 = (v3Data: v3.ToServer): v2.ToServer => {\n\treturn v3Data as unknown as v2.ToServer;\n};\n\nconst v2ToServerV1 = (v2Data: v2.ToServer): v1.ToServer => {\n\treturn v2Data as unknown as v1.ToServer;\n};\n\nexport const TO_SERVER_VERSIONED = createVersionedDataHandler<v3.ToServer>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.decodeToServer(bytes);\n\t\t\tcase 2:\n\t\t\t\treturn v2.decodeToServer(bytes);\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeToServer(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.encodeToServer(data as v1.ToServer);\n\t\t\tcase 2:\n\t\t\t\treturn v2.encodeToServer(data as v2.ToServer);\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeToServer(data as v3.ToServer);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tdeserializeConverters: () => [v1ToServerV2, v2ToServerV3],\n\tserializeConverters: () => [v3ToServerV2, v2ToServerV1],\n});\n\nexport const TO_CLIENT_VERSIONED = createVersionedDataHandler<v3.ToClient>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.decodeToClient(bytes);\n\t\t\tcase 2:\n\t\t\t\treturn v2.decodeToClient(bytes);\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeToClient(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.encodeToClient(data as v1.ToClient);\n\t\t\tcase 2:\n\t\t\t\treturn v2.encodeToClient(data as v2.ToClient);\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeToClient(data as v3.ToClient);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tdeserializeConverters: () => [v1ToV2, v2ToV3],\n\tserializeConverters: () => [v3ToV2, v2ToV1],\n});\n\nexport const HTTP_ACTION_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpActionRequest>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.decodeHttpActionRequest(bytes);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.decodeHttpActionRequest(bytes);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpActionRequest(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.encodeHttpActionRequest(\n\t\t\t\t\t\tdata as v1.HttpActionRequest,\n\t\t\t\t\t);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.encodeHttpActionRequest(\n\t\t\t\t\t\tdata as v2.HttpActionRequest,\n\t\t\t\t\t);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpActionRequest(\n\t\t\t\t\t\tdata as v3.HttpActionRequest,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const HTTP_ACTION_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpActionResponse>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.decodeHttpActionResponse(bytes);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.decodeHttpActionResponse(bytes);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpActionResponse(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.encodeHttpActionResponse(\n\t\t\t\t\t\tdata as v1.HttpActionResponse,\n\t\t\t\t\t);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.encodeHttpActionResponse(\n\t\t\t\t\t\tdata as v2.HttpActionResponse,\n\t\t\t\t\t);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpActionResponse(\n\t\t\t\t\t\tdata as v3.HttpActionResponse,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const HTTP_QUEUE_SEND_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpQueueSendRequest>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpQueueSendRequest(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`HttpQueueSendRequest only exists in version 3+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpQueueSendRequest(\n\t\t\t\t\t\tdata as v3.HttpQueueSendRequest,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`HttpQueueSendRequest only exists in version 3+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const HTTP_QUEUE_SEND_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpQueueSendResponse>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpQueueSendResponse(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`HttpQueueSendResponse only exists in version 3+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpQueueSendResponse(\n\t\t\t\t\t\tdata as v3.HttpQueueSendResponse,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`HttpQueueSendResponse only exists in version 3+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const HTTP_RESPONSE_ERROR_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpResponseError>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.decodeHttpResponseError(bytes);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.decodeHttpResponseError(bytes);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpResponseError(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.encodeHttpResponseError(\n\t\t\t\t\t\tdata as v1.HttpResponseError,\n\t\t\t\t\t);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.encodeHttpResponseError(\n\t\t\t\t\t\tdata as v2.HttpResponseError,\n\t\t\t\t\t);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpResponseError(\n\t\t\t\t\t\tdata as v3.HttpResponseError,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const HTTP_RESOLVE_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpResolveResponse>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.decodeHttpResolveResponse(bytes);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.decodeHttpResolveResponse(bytes);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpResolveResponse(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.encodeHttpResolveResponse(\n\t\t\t\t\t\tdata as v1.HttpResolveResponse,\n\t\t\t\t\t);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.encodeHttpResolveResponse(\n\t\t\t\t\t\tdata as v2.HttpResolveResponse,\n\t\t\t\t\t);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpResolveResponse(\n\t\t\t\t\t\tdata as v3.HttpResolveResponse,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type uint = bigint\n\nexport type Init = {\n readonly actorId: string,\n readonly connectionId: string,\n readonly connectionToken: string,\n}\n\nexport function readInit(bc: bare.ByteCursor): Init {\n return {\n actorId: bare.readString(bc),\n connectionId: bare.readString(bc),\n connectionToken: bare.readString(bc),\n }\n}\n\nexport function writeInit(bc: bare.ByteCursor, x: Init): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.connectionId)\n bare.writeString(bc, x.connectionToken)\n}\n\nfunction read0(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write0(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nfunction read1(bc: bare.ByteCursor): uint | null {\n return bare.readBool(bc)\n ? bare.readUint(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: uint | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeUint(bc, x)\n }\n}\n\nexport type Error = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n readonly actionId: uint | null,\n}\n\nexport function readError(bc: bare.ByteCursor): Error {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n actionId: read1(bc),\n }\n}\n\nexport function writeError(bc: bare.ByteCursor, x: Error): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n write1(bc, x.actionId)\n}\n\nexport type ActionResponse = {\n readonly id: uint,\n readonly output: ArrayBuffer,\n}\n\nexport function readActionResponse(bc: bare.ByteCursor): ActionResponse {\n return {\n id: bare.readUint(bc),\n output: bare.readData(bc),\n }\n}\n\nexport function writeActionResponse(bc: bare.ByteCursor, x: ActionResponse): void {\n bare.writeUint(bc, x.id)\n bare.writeData(bc, x.output)\n}\n\nexport type Event = {\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readEvent(bc: bare.ByteCursor): Event {\n return {\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeEvent(bc: bare.ByteCursor, x: Event): void {\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type ToClientBody =\n | { readonly tag: \"Init\", readonly val: Init }\n | { readonly tag: \"Error\", readonly val: Error }\n | { readonly tag: \"ActionResponse\", readonly val: ActionResponse }\n | { readonly tag: \"Event\", readonly val: Event }\n\nexport function readToClientBody(bc: bare.ByteCursor): ToClientBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"Init\", val: readInit(bc) }\n case 1:\n return { tag: \"Error\", val: readError(bc) }\n case 2:\n return { tag: \"ActionResponse\", val: readActionResponse(bc) }\n case 3:\n return { tag: \"Event\", val: readEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToClientBody(bc: bare.ByteCursor, x: ToClientBody): void {\n switch (x.tag) {\n case \"Init\": {\n bare.writeU8(bc, 0)\n writeInit(bc, x.val)\n break\n }\n case \"Error\": {\n bare.writeU8(bc, 1)\n writeError(bc, x.val)\n break\n }\n case \"ActionResponse\": {\n bare.writeU8(bc, 2)\n writeActionResponse(bc, x.val)\n break\n }\n case \"Event\": {\n bare.writeU8(bc, 3)\n writeEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type ToClient = {\n readonly body: ToClientBody,\n}\n\nexport function readToClient(bc: bare.ByteCursor): ToClient {\n return {\n body: readToClientBody(bc),\n }\n}\n\nexport function writeToClient(bc: bare.ByteCursor, x: ToClient): void {\n writeToClientBody(bc, x.body)\n}\n\nexport function encodeToClient(x: ToClient): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToClient(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToClient(bytes: Uint8Array): ToClient {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToClient(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActionRequest = {\n readonly id: uint,\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readActionRequest(bc: bare.ByteCursor): ActionRequest {\n return {\n id: bare.readUint(bc),\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeActionRequest(bc: bare.ByteCursor, x: ActionRequest): void {\n bare.writeUint(bc, x.id)\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type SubscriptionRequest = {\n readonly eventName: string,\n readonly subscribe: boolean,\n}\n\nexport function readSubscriptionRequest(bc: bare.ByteCursor): SubscriptionRequest {\n return {\n eventName: bare.readString(bc),\n subscribe: bare.readBool(bc),\n }\n}\n\nexport function writeSubscriptionRequest(bc: bare.ByteCursor, x: SubscriptionRequest): void {\n bare.writeString(bc, x.eventName)\n bare.writeBool(bc, x.subscribe)\n}\n\nexport type ToServerBody =\n | { readonly tag: \"ActionRequest\", readonly val: ActionRequest }\n | { readonly tag: \"SubscriptionRequest\", readonly val: SubscriptionRequest }\n\nexport function readToServerBody(bc: bare.ByteCursor): ToServerBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"ActionRequest\", val: readActionRequest(bc) }\n case 1:\n return { tag: \"SubscriptionRequest\", val: readSubscriptionRequest(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToServerBody(bc: bare.ByteCursor, x: ToServerBody): void {\n switch (x.tag) {\n case \"ActionRequest\": {\n bare.writeU8(bc, 0)\n writeActionRequest(bc, x.val)\n break\n }\n case \"SubscriptionRequest\": {\n bare.writeU8(bc, 1)\n writeSubscriptionRequest(bc, x.val)\n break\n }\n }\n}\n\nexport type ToServer = {\n readonly body: ToServerBody,\n}\n\nexport function readToServer(bc: bare.ByteCursor): ToServer {\n return {\n body: readToServerBody(bc),\n }\n}\n\nexport function writeToServer(bc: bare.ByteCursor, x: ToServer): void {\n writeToServerBody(bc, x.body)\n}\n\nexport function encodeToServer(x: ToServer): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToServer(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToServer(bytes: Uint8Array): ToServer {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToServer(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionRequest = {\n readonly args: ArrayBuffer,\n}\n\nexport function readHttpActionRequest(bc: bare.ByteCursor): HttpActionRequest {\n return {\n args: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionRequest(bc: bare.ByteCursor, x: HttpActionRequest): void {\n bare.writeData(bc, x.args)\n}\n\nexport function encodeHttpActionRequest(x: HttpActionRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionRequest(bytes: Uint8Array): HttpActionRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionResponse = {\n readonly output: ArrayBuffer,\n}\n\nexport function readHttpActionResponse(bc: bare.ByteCursor): HttpActionResponse {\n return {\n output: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionResponse(bc: bare.ByteCursor, x: HttpActionResponse): void {\n bare.writeData(bc, x.output)\n}\n\nexport function encodeHttpActionResponse(x: HttpActionResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionResponse(bytes: Uint8Array): HttpActionResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResponseError = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n}\n\nexport function readHttpResponseError(bc: bare.ByteCursor): HttpResponseError {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n }\n}\n\nexport function writeHttpResponseError(bc: bare.ByteCursor, x: HttpResponseError): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n}\n\nexport function encodeHttpResponseError(x: HttpResponseError): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResponseError(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResponseError(bytes: Uint8Array): HttpResponseError {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResponseError(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResolveRequest = null\n\nexport type HttpResolveResponse = {\n readonly actorId: string,\n}\n\nexport function readHttpResolveResponse(bc: bare.ByteCursor): HttpResolveResponse {\n return {\n actorId: bare.readString(bc),\n }\n}\n\nexport function writeHttpResolveResponse(bc: bare.ByteCursor, x: HttpResolveResponse): void {\n bare.writeString(bc, x.actorId)\n}\n\nexport function encodeHttpResolveResponse(x: HttpResolveResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResolveResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResolveResponse(bytes: Uint8Array): HttpResolveResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResolveResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type uint = bigint\n\nexport type Init = {\n readonly actorId: string,\n readonly connectionId: string,\n}\n\nexport function readInit(bc: bare.ByteCursor): Init {\n return {\n actorId: bare.readString(bc),\n connectionId: bare.readString(bc),\n }\n}\n\nexport function writeInit(bc: bare.ByteCursor, x: Init): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.connectionId)\n}\n\nfunction read0(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write0(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nfunction read1(bc: bare.ByteCursor): uint | null {\n return bare.readBool(bc)\n ? bare.readUint(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: uint | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeUint(bc, x)\n }\n}\n\nexport type Error = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n readonly actionId: uint | null,\n}\n\nexport function readError(bc: bare.ByteCursor): Error {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n actionId: read1(bc),\n }\n}\n\nexport function writeError(bc: bare.ByteCursor, x: Error): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n write1(bc, x.actionId)\n}\n\nexport type ActionResponse = {\n readonly id: uint,\n readonly output: ArrayBuffer,\n}\n\nexport function readActionResponse(bc: bare.ByteCursor): ActionResponse {\n return {\n id: bare.readUint(bc),\n output: bare.readData(bc),\n }\n}\n\nexport function writeActionResponse(bc: bare.ByteCursor, x: ActionResponse): void {\n bare.writeUint(bc, x.id)\n bare.writeData(bc, x.output)\n}\n\nexport type Event = {\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readEvent(bc: bare.ByteCursor): Event {\n return {\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeEvent(bc: bare.ByteCursor, x: Event): void {\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type ToClientBody =\n | { readonly tag: \"Init\", readonly val: Init }\n | { readonly tag: \"Error\", readonly val: Error }\n | { readonly tag: \"ActionResponse\", readonly val: ActionResponse }\n | { readonly tag: \"Event\", readonly val: Event }\n\nexport function readToClientBody(bc: bare.ByteCursor): ToClientBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"Init\", val: readInit(bc) }\n case 1:\n return { tag: \"Error\", val: readError(bc) }\n case 2:\n return { tag: \"ActionResponse\", val: readActionResponse(bc) }\n case 3:\n return { tag: \"Event\", val: readEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToClientBody(bc: bare.ByteCursor, x: ToClientBody): void {\n switch (x.tag) {\n case \"Init\": {\n bare.writeU8(bc, 0)\n writeInit(bc, x.val)\n break\n }\n case \"Error\": {\n bare.writeU8(bc, 1)\n writeError(bc, x.val)\n break\n }\n case \"ActionResponse\": {\n bare.writeU8(bc, 2)\n writeActionResponse(bc, x.val)\n break\n }\n case \"Event\": {\n bare.writeU8(bc, 3)\n writeEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type ToClient = {\n readonly body: ToClientBody,\n}\n\nexport function readToClient(bc: bare.ByteCursor): ToClient {\n return {\n body: readToClientBody(bc),\n }\n}\n\nexport function writeToClient(bc: bare.ByteCursor, x: ToClient): void {\n writeToClientBody(bc, x.body)\n}\n\nexport function encodeToClient(x: ToClient): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToClient(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToClient(bytes: Uint8Array): ToClient {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToClient(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActionRequest = {\n readonly id: uint,\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readActionRequest(bc: bare.ByteCursor): ActionRequest {\n return {\n id: bare.readUint(bc),\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeActionRequest(bc: bare.ByteCursor, x: ActionRequest): void {\n bare.writeUint(bc, x.id)\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type SubscriptionRequest = {\n readonly eventName: string,\n readonly subscribe: boolean,\n}\n\nexport function readSubscriptionRequest(bc: bare.ByteCursor): SubscriptionRequest {\n return {\n eventName: bare.readString(bc),\n subscribe: bare.readBool(bc),\n }\n}\n\nexport function writeSubscriptionRequest(bc: bare.ByteCursor, x: SubscriptionRequest): void {\n bare.writeString(bc, x.eventName)\n bare.writeBool(bc, x.subscribe)\n}\n\nexport type ToServerBody =\n | { readonly tag: \"ActionRequest\", readonly val: ActionRequest }\n | { readonly tag: \"SubscriptionRequest\", readonly val: SubscriptionRequest }\n\nexport function readToServerBody(bc: bare.ByteCursor): ToServerBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"ActionRequest\", val: readActionRequest(bc) }\n case 1:\n return { tag: \"SubscriptionRequest\", val: readSubscriptionRequest(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToServerBody(bc: bare.ByteCursor, x: ToServerBody): void {\n switch (x.tag) {\n case \"ActionRequest\": {\n bare.writeU8(bc, 0)\n writeActionRequest(bc, x.val)\n break\n }\n case \"SubscriptionRequest\": {\n bare.writeU8(bc, 1)\n writeSubscriptionRequest(bc, x.val)\n break\n }\n }\n}\n\nexport type ToServer = {\n readonly body: ToServerBody,\n}\n\nexport function readToServer(bc: bare.ByteCursor): ToServer {\n return {\n body: readToServerBody(bc),\n }\n}\n\nexport function writeToServer(bc: bare.ByteCursor, x: ToServer): void {\n writeToServerBody(bc, x.body)\n}\n\nexport function encodeToServer(x: ToServer): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToServer(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToServer(bytes: Uint8Array): ToServer {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToServer(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionRequest = {\n readonly args: ArrayBuffer,\n}\n\nexport function readHttpActionRequest(bc: bare.ByteCursor): HttpActionRequest {\n return {\n args: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionRequest(bc: bare.ByteCursor, x: HttpActionRequest): void {\n bare.writeData(bc, x.args)\n}\n\nexport function encodeHttpActionRequest(x: HttpActionRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionRequest(bytes: Uint8Array): HttpActionRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionResponse = {\n readonly output: ArrayBuffer,\n}\n\nexport function readHttpActionResponse(bc: bare.ByteCursor): HttpActionResponse {\n return {\n output: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionResponse(bc: bare.ByteCursor, x: HttpActionResponse): void {\n bare.writeData(bc, x.output)\n}\n\nexport function encodeHttpActionResponse(x: HttpActionResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionResponse(bytes: Uint8Array): HttpActionResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResponseError = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n}\n\nexport function readHttpResponseError(bc: bare.ByteCursor): HttpResponseError {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n }\n}\n\nexport function writeHttpResponseError(bc: bare.ByteCursor, x: HttpResponseError): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n}\n\nexport function encodeHttpResponseError(x: HttpResponseError): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResponseError(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResponseError(bytes: Uint8Array): HttpResponseError {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResponseError(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResolveRequest = null\n\nexport type HttpResolveResponse = {\n readonly actorId: string,\n}\n\nexport function readHttpResolveResponse(bc: bare.ByteCursor): HttpResolveResponse {\n return {\n actorId: bare.readString(bc),\n }\n}\n\nexport function writeHttpResolveResponse(bc: bare.ByteCursor, x: HttpResolveResponse): void {\n bare.writeString(bc, x.actorId)\n}\n\nexport function encodeHttpResolveResponse(x: HttpResolveResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResolveResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResolveResponse(bytes: Uint8Array): HttpResolveResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResolveResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type u64 = bigint\nexport type uint = bigint\n\nexport type Init = {\n readonly actorId: string,\n readonly connectionId: string,\n}\n\nexport function readInit(bc: bare.ByteCursor): Init {\n return {\n actorId: bare.readString(bc),\n connectionId: bare.readString(bc),\n }\n}\n\nexport function writeInit(bc: bare.ByteCursor, x: Init): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.connectionId)\n}\n\nfunction read0(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write0(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nfunction read1(bc: bare.ByteCursor): uint | null {\n return bare.readBool(bc)\n ? bare.readUint(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: uint | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeUint(bc, x)\n }\n}\n\nexport type Error = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n readonly actionId: uint | null,\n}\n\nexport function readError(bc: bare.ByteCursor): Error {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n actionId: read1(bc),\n }\n}\n\nexport function writeError(bc: bare.ByteCursor, x: Error): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n write1(bc, x.actionId)\n}\n\nexport type ActionResponse = {\n readonly id: uint,\n readonly output: ArrayBuffer,\n}\n\nexport function readActionResponse(bc: bare.ByteCursor): ActionResponse {\n return {\n id: bare.readUint(bc),\n output: bare.readData(bc),\n }\n}\n\nexport function writeActionResponse(bc: bare.ByteCursor, x: ActionResponse): void {\n bare.writeUint(bc, x.id)\n bare.writeData(bc, x.output)\n}\n\nexport type Event = {\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readEvent(bc: bare.ByteCursor): Event {\n return {\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeEvent(bc: bare.ByteCursor, x: Event): void {\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type ToClientBody =\n | { readonly tag: \"Init\", readonly val: Init }\n | { readonly tag: \"Error\", readonly val: Error }\n | { readonly tag: \"ActionResponse\", readonly val: ActionResponse }\n | { readonly tag: \"Event\", readonly val: Event }\n\nexport function readToClientBody(bc: bare.ByteCursor): ToClientBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"Init\", val: readInit(bc) }\n case 1:\n return { tag: \"Error\", val: readError(bc) }\n case 2:\n return { tag: \"ActionResponse\", val: readActionResponse(bc) }\n case 3:\n return { tag: \"Event\", val: readEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToClientBody(bc: bare.ByteCursor, x: ToClientBody): void {\n switch (x.tag) {\n case \"Init\": {\n bare.writeU8(bc, 0)\n writeInit(bc, x.val)\n break\n }\n case \"Error\": {\n bare.writeU8(bc, 1)\n writeError(bc, x.val)\n break\n }\n case \"ActionResponse\": {\n bare.writeU8(bc, 2)\n writeActionResponse(bc, x.val)\n break\n }\n case \"Event\": {\n bare.writeU8(bc, 3)\n writeEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type ToClient = {\n readonly body: ToClientBody,\n}\n\nexport function readToClient(bc: bare.ByteCursor): ToClient {\n return {\n body: readToClientBody(bc),\n }\n}\n\nexport function writeToClient(bc: bare.ByteCursor, x: ToClient): void {\n writeToClientBody(bc, x.body)\n}\n\nexport function encodeToClient(x: ToClient): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToClient(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToClient(bytes: Uint8Array): ToClient {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToClient(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActionRequest = {\n readonly id: uint,\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readActionRequest(bc: bare.ByteCursor): ActionRequest {\n return {\n id: bare.readUint(bc),\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeActionRequest(bc: bare.ByteCursor, x: ActionRequest): void {\n bare.writeUint(bc, x.id)\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type SubscriptionRequest = {\n readonly eventName: string,\n readonly subscribe: boolean,\n}\n\nexport function readSubscriptionRequest(bc: bare.ByteCursor): SubscriptionRequest {\n return {\n eventName: bare.readString(bc),\n subscribe: bare.readBool(bc),\n }\n}\n\nexport function writeSubscriptionRequest(bc: bare.ByteCursor, x: SubscriptionRequest): void {\n bare.writeString(bc, x.eventName)\n bare.writeBool(bc, x.subscribe)\n}\n\nexport type ToServerBody =\n | { readonly tag: \"ActionRequest\", readonly val: ActionRequest }\n | { readonly tag: \"SubscriptionRequest\", readonly val: SubscriptionRequest }\n\nexport function readToServerBody(bc: bare.ByteCursor): ToServerBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"ActionRequest\", val: readActionRequest(bc) }\n case 1:\n return { tag: \"SubscriptionRequest\", val: readSubscriptionRequest(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToServerBody(bc: bare.ByteCursor, x: ToServerBody): void {\n switch (x.tag) {\n case \"ActionRequest\": {\n bare.writeU8(bc, 0)\n writeActionRequest(bc, x.val)\n break\n }\n case \"SubscriptionRequest\": {\n bare.writeU8(bc, 1)\n writeSubscriptionRequest(bc, x.val)\n break\n }\n }\n}\n\nexport type ToServer = {\n readonly body: ToServerBody,\n}\n\nexport function readToServer(bc: bare.ByteCursor): ToServer {\n return {\n body: readToServerBody(bc),\n }\n}\n\nexport function writeToServer(bc: bare.ByteCursor, x: ToServer): void {\n writeToServerBody(bc, x.body)\n}\n\nexport function encodeToServer(x: ToServer): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToServer(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToServer(bytes: Uint8Array): ToServer {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToServer(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionRequest = {\n readonly args: ArrayBuffer,\n}\n\nexport function readHttpActionRequest(bc: bare.ByteCursor): HttpActionRequest {\n return {\n args: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionRequest(bc: bare.ByteCursor, x: HttpActionRequest): void {\n bare.writeData(bc, x.args)\n}\n\nexport function encodeHttpActionRequest(x: HttpActionRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionRequest(bytes: Uint8Array): HttpActionRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionResponse = {\n readonly output: ArrayBuffer,\n}\n\nexport function readHttpActionResponse(bc: bare.ByteCursor): HttpActionResponse {\n return {\n output: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionResponse(bc: bare.ByteCursor, x: HttpActionResponse): void {\n bare.writeData(bc, x.output)\n}\n\nexport function encodeHttpActionResponse(x: HttpActionResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionResponse(bytes: Uint8Array): HttpActionResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nfunction read2(bc: bare.ByteCursor): string | null {\n return bare.readBool(bc)\n ? bare.readString(bc)\n : null\n}\n\nfunction write2(bc: bare.ByteCursor, x: string | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeString(bc, x)\n }\n}\n\nfunction read3(bc: bare.ByteCursor): boolean | null {\n return bare.readBool(bc)\n ? bare.readBool(bc)\n : null\n}\n\nfunction write3(bc: bare.ByteCursor, x: boolean | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeBool(bc, x)\n }\n}\n\nfunction read4(bc: bare.ByteCursor): u64 | null {\n return bare.readBool(bc)\n ? bare.readU64(bc)\n : null\n}\n\nfunction write4(bc: bare.ByteCursor, x: u64 | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeU64(bc, x)\n }\n}\n\nexport type HttpQueueSendRequest = {\n readonly body: ArrayBuffer,\n readonly name: string | null,\n readonly wait: boolean | null,\n readonly timeout: u64 | null,\n}\n\nexport function readHttpQueueSendRequest(bc: bare.ByteCursor): HttpQueueSendRequest {\n return {\n body: bare.readData(bc),\n name: read2(bc),\n wait: read3(bc),\n timeout: read4(bc),\n }\n}\n\nexport function writeHttpQueueSendRequest(bc: bare.ByteCursor, x: HttpQueueSendRequest): void {\n bare.writeData(bc, x.body)\n write2(bc, x.name)\n write3(bc, x.wait)\n write4(bc, x.timeout)\n}\n\nexport function encodeHttpQueueSendRequest(x: HttpQueueSendRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpQueueSendRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpQueueSendRequest(bytes: Uint8Array): HttpQueueSendRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpQueueSendRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpQueueSendResponse = {\n readonly status: string,\n readonly response: ArrayBuffer | null,\n}\n\nexport function readHttpQueueSendResponse(bc: bare.ByteCursor): HttpQueueSendResponse {\n return {\n status: bare.readString(bc),\n response: read0(bc),\n }\n}\n\nexport function writeHttpQueueSendResponse(bc: bare.ByteCursor, x: HttpQueueSendResponse): void {\n bare.writeString(bc, x.status)\n write0(bc, x.response)\n}\n\nexport function encodeHttpQueueSendResponse(x: HttpQueueSendResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpQueueSendResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpQueueSendResponse(bytes: Uint8Array): HttpQueueSendResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpQueueSendResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResponseError = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n}\n\nexport function readHttpResponseError(bc: bare.ByteCursor): HttpResponseError {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n }\n}\n\nexport function writeHttpResponseError(bc: bare.ByteCursor, x: HttpResponseError): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n}\n\nexport function encodeHttpResponseError(x: HttpResponseError): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResponseError(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResponseError(bytes: Uint8Array): HttpResponseError {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResponseError(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResolveRequest = null\n\nexport type HttpResolveResponse = {\n readonly actorId: string,\n}\n\nexport function readHttpResolveResponse(bc: bare.ByteCursor): HttpResolveResponse {\n return {\n actorId: bare.readString(bc),\n }\n}\n\nexport function writeHttpResolveResponse(bc: bare.ByteCursor, x: HttpResolveResponse): void {\n bare.writeString(bc, x.actorId)\n}\n\nexport function encodeHttpResolveResponse(x: HttpResolveResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResolveResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResolveResponse(bytes: Uint8Array): HttpResolveResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResolveResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","import { z } from \"zod/v4\";\n\n// Helper schemas\nconst UintSchema = z.bigint();\nconst OptionalUintSchema = UintSchema.nullable();\n\n// MARK: Message To Client\nexport const InitSchema = z.object({\n\tactorId: z.string(),\n\tconnectionId: z.string(),\n});\nexport type Init = z.infer<typeof InitSchema>;\n\nexport const ErrorSchema = z.object({\n\tgroup: z.string(),\n\tcode: z.string(),\n\tmessage: z.string(),\n\tmetadata: z.unknown().optional(),\n\tactionId: OptionalUintSchema,\n});\nexport type Error = z.infer<typeof ErrorSchema>;\n\nexport const ActionResponseSchema = z.object({\n\tid: UintSchema,\n\toutput: z.unknown(),\n});\nexport type ActionResponse = z.infer<typeof ActionResponseSchema>;\n\nexport const EventSchema = z.object({\n\tname: z.string(),\n\targs: z.unknown(),\n});\nexport type Event = z.infer<typeof EventSchema>;\n\nexport const ToClientBodySchema = z.discriminatedUnion(\"tag\", [\n\tz.object({ tag: z.literal(\"Init\"), val: InitSchema }),\n\tz.object({ tag: z.literal(\"Error\"), val: ErrorSchema }),\n\tz.object({ tag: z.literal(\"ActionResponse\"), val: ActionResponseSchema }),\n\tz.object({ tag: z.literal(\"Event\"), val: EventSchema }),\n]);\nexport type ToClientBody = z.infer<typeof ToClientBodySchema>;\n\nexport const ToClientSchema = z.object({\n\tbody: ToClientBodySchema,\n});\nexport type ToClient = z.infer<typeof ToClientSchema>;\n\n// MARK: Message To Server\nexport const ActionRequestSchema = z.object({\n\tid: UintSchema,\n\tname: z.string(),\n\targs: z.unknown(),\n});\nexport type ActionRequest = z.infer<typeof ActionRequestSchema>;\n\nexport const SubscriptionRequestSchema = z.object({\n\teventName: z.string(),\n\tsubscribe: z.boolean(),\n});\nexport type SubscriptionRequest = z.infer<typeof SubscriptionRequestSchema>;\n\nexport const ToServerBodySchema = z.discriminatedUnion(\"tag\", [\n\tz.object({ tag: z.literal(\"ActionRequest\"), val: ActionRequestSchema }),\n\tz.object({\n\t\ttag: z.literal(\"SubscriptionRequest\"),\n\t\tval: SubscriptionRequestSchema,\n\t}),\n]);\nexport type ToServerBody = z.infer<typeof ToServerBodySchema>;\n\nexport const ToServerSchema = z.object({\n\tbody: ToServerBodySchema,\n});\nexport type ToServer = z.infer<typeof ToServerSchema>;\n\n// MARK: HTTP Action\nexport const HttpActionRequestSchema = z.object({\n\targs: z.unknown(),\n});\nexport type HttpActionRequest = z.infer<typeof HttpActionRequestSchema>;\n\nexport const HttpActionResponseSchema = z.object({\n\toutput: z.unknown(),\n});\nexport type HttpActionResponse = z.infer<typeof HttpActionResponseSchema>;\n\n// MARK: HTTP Queue\nexport const HttpQueueSendRequestSchema = z.object({\n\tbody: z.unknown(),\n\tname: z.string().optional(),\n\twait: z.boolean().optional(),\n\ttimeout: z.number().optional(),\n});\nexport type HttpQueueSendRequest = z.infer<typeof HttpQueueSendRequestSchema>;\n\nexport const HttpQueueSendResponseSchema = z.object({\n\tstatus: z.enum([\"completed\", \"timedOut\"]),\n\tresponse: z.unknown().optional(),\n});\nexport type HttpQueueSendResponse = z.infer<typeof HttpQueueSendResponseSchema>;\n\n// MARK: HTTP Error\nexport const HttpResponseErrorSchema = z.object({\n\tgroup: z.string(),\n\tcode: z.string(),\n\tmessage: z.string(),\n\tmetadata: z.unknown().optional(),\n});\nexport type HttpResponseError = z.infer<typeof HttpResponseErrorSchema>;\n\n// MARK: HTTP Resolve\nexport const HttpResolveRequestSchema = z.null();\nexport type HttpResolveRequest = z.infer<typeof HttpResolveRequestSchema>;\n\nexport const HttpResolveResponseSchema = z.object({\n\tactorId: z.string(),\n});\nexport type HttpResolveResponse = z.infer<typeof HttpResolveResponseSchema>;\n","import { type ConnDriver, DriverReadyState } from \"../driver\";\n\nexport type ConnHttpState = Record<never, never>;\n\nexport function createHttpDriver(): ConnDriver {\n\treturn {\n\t\ttype: \"http\",\n\t\tgetConnectionReadyState(_actor, _conn) {\n\t\t\t// TODO: This might not be the correct logic\n\t\t\treturn DriverReadyState.OPEN;\n\t\t},\n\t\tdisconnect: async () => {\n\t\t\t// Noop\n\t\t\t// TODO: Configure with abort signals to abort the request\n\t\t},\n\t};\n}\n","import type { ConnDriver } from \"../driver\";\nimport { DriverReadyState } from \"../driver\";\n\n/**\n * Creates a raw HTTP connection driver.\n *\n * This driver is used for raw HTTP connections that don't use the RivetKit protocol.\n * Unlike the standard HTTP driver, this provides connection lifecycle management\n * for tracking the HTTP request through the actor's onRequest handler.\n */\nexport function createRawRequestDriver(): ConnDriver {\n\treturn {\n\t\ttype: \"raw-request\",\n\n\t\tdisconnect: async () => {\n\t\t\t// Noop\n\t\t},\n\n\t\tgetConnectionReadyState: (): DriverReadyState | undefined => {\n\t\t\t// HTTP connections are always considered open until the request completes\n\t\t\treturn DriverReadyState.OPEN;\n\t\t},\n\t};\n}\n","import { z } from \"zod\";\nimport { getRunMetadata } from \"@/actor/config\";\nimport type { ActorDefinition, AnyActorDefinition } from \"@/actor/definition\";\nimport { type Logger, LogLevelSchema } from \"@/common/log\";\nimport { ENGINE_ENDPOINT } from \"@/engine-process/constants\";\nimport { InspectorConfigSchema } from \"@/inspector/config\";\nimport { DeepReadonly } from \"@/utils\";\nimport { tryParseEndpoint } from \"@/utils/endpoint-parser\";\nimport {\n\tgetRivetEndpoint,\n\tgetRivetEngine,\n\tgetRivetkitStoragePath,\n\tgetRivetNamespace,\n\tgetRivetToken,\n\tisDev,\n} from \"@/utils/env-vars\";\nimport { type DriverConfig, DriverConfigSchema } from \"./driver\";\nimport { RunnerConfigSchema } from \"./runner\";\nimport { ServerlessConfigSchema } from \"./serverless\";\n\nexport { DriverConfigSchema, type DriverConfig };\n\nexport const ActorsSchema = z.record(\n\tz.string(),\n\tz.custom<ActorDefinition<any, any, any, any, any, any, any, any, any>>(),\n);\nexport type RegistryActors = z.infer<typeof ActorsSchema>;\n\nexport const TestConfigSchema = z.object({ enabled: z.boolean() });\nexport type TestConfig = z.infer<typeof TestConfigSchema>;\n\n// TODO: Add sane defaults for NODE_ENV=development\nexport const RegistryConfigSchema = z\n\t.object({\n\t\t// MARK: Actors\n\t\tuse: z.record(z.string(), z.custom<AnyActorDefinition>()),\n\n\t\t// TODO: Find a better way of passing around the test config\n\t\t/**\n\t\t * Test configuration.\n\t\t *\n\t\t * DO NOT MANUALLY ENABLE. THIS IS USED INTERNALLY.\n\t\t * @internal\n\t\t **/\n\t\ttest: TestConfigSchema.optional().default({ enabled: false }),\n\n\t\t// MARK: Driver\n\t\tdriver: DriverConfigSchema.optional(),\n\t\t/**\n\t\t * Storage path for RivetKit file-system state when using the default driver.\n\t\t *\n\t\t * If not set, RivetKit uses the platform default data location.\n\t\t *\n\t\t * Can also be set via RIVETKIT_STORAGE_PATH.\n\t\t */\n\t\tstoragePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetkitStoragePath()),\n\n\t\t// MARK: Networking\n\t\t/** @experimental */\n\t\tmaxIncomingMessageSize: z.number().optional().default(65_536),\n\n\t\t/** @experimental */\n\t\tmaxOutgoingMessageSize: z.number().optional().default(1_048_576),\n\n\t\t// MARK: Runtime\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Disable welcome message.\n\t\t * */\n\t\tnoWelcome: z.boolean().optional().default(false),\n\n\t\t/**\n\t\t * @experimental\n\t\t * */\n\t\tlogging: z\n\t\t\t.object({\n\t\t\t\tbaseLogger: z.custom<Logger>().optional(),\n\t\t\t\tlevel: LogLevelSchema.optional(),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.default(() => ({})),\n\n\t\t// MARK: Routing\n\t\t// // This is a function to allow for lazy configuration of upgradeWebSocket on the\n\t\t// // fly. This is required since the dependencies that upgradeWebSocket\n\t\t// // (specifically Node.js) can sometimes only be specified after the router is\n\t\t// // created or must be imported async using `await import(...)`\n\t\t// getUpgradeWebSocket: z.custom<GetUpgradeWebSocket>().optional(),\n\n\t\t// MARK: Runner Configuration\n\t\t/**\n\t\t * Endpoint to connect to for Rivet Engine.\n\t\t *\n\t\t * Supports URL auth syntax for namespace and token:\n\t\t * - `https://namespace:token@api.rivet.dev`\n\t\t * - `https://namespace@api.rivet.dev`\n\t\t *\n\t\t * Can also be set via RIVET_ENDPOINT environment variables.\n\t\t */\n\t\tendpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetEngine() ?? getRivetEndpoint()),\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetToken()),\n\t\tnamespace: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetNamespace()),\n\t\theaders: z.record(z.string(), z.string()).optional().default({}),\n\n\t\t// MARK: Client\n\t\t// TODO:\n\t\t// client: ClientConfigSchema.optional(),\n\n\t\t// MARK: Manager\n\t\t/**\n\t\t * Whether to start the local manager server.\n\t\t * Auto-determined based on endpoint and NODE_ENV if not specified.\n\t\t */\n\t\tserveManager: z.boolean().optional(),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Base path for the manager API. This is used to prefix all routes.\n\t\t * For example, if the base path is `/foo`, then the route `/actors`\n\t\t * will be available at `/foo/actors`.\n\t\t */\n\t\tmanagerBasePath: z.string().optional().default(\"/\"),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * What port to run the manager on.\n\t\t */\n\t\tmanagerPort: z.number().optional().default(6420),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * What host to bind the manager server to.\n\t\t */\n\t\tmanagerHost: z.string().optional(),\n\n\t\t/** @experimental */\n\t\tinspector: InspectorConfigSchema,\n\n\t\t// MARK: Runtime-specific\n\t\tserverless: ServerlessConfigSchema.optional().default(() =>\n\t\t\tServerlessConfigSchema.parse({}),\n\t\t),\n\t\trunner: RunnerConfigSchema.optional().default(() =>\n\t\t\tRunnerConfigSchema.parse({}),\n\t\t),\n\t})\n\t.transform((config, ctx) => {\n\t\tconst isDevEnv = isDev();\n\n\t\t// Parse endpoint string (env var fallback is applied via transform above)\n\t\tconst parsedEndpoint = config.endpoint\n\t\t\t? tryParseEndpoint(ctx, {\n\t\t\t\t\tendpoint: config.endpoint,\n\t\t\t\t\tpath: [\"endpoint\"],\n\t\t\t\t\tnamespace: config.namespace,\n\t\t\t\t\ttoken: config.token,\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\tif (parsedEndpoint && config.serveManager) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"cannot specify both endpoint and serveManager\",\n\t\t\t});\n\t\t}\n\n\t\t// Can't spawn engine AND connect to remote endpoint\n\t\tif (config.serverless.spawnEngine && parsedEndpoint) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"cannot specify both spawnEngine and endpoint\",\n\t\t\t});\n\t\t}\n\n\t\t// configureRunnerPool requires an engine (via endpoint or spawnEngine)\n\t\tif (\n\t\t\tconfig.serverless.configureRunnerPool &&\n\t\t\t!parsedEndpoint &&\n\t\t\t!config.serverless.spawnEngine\n\t\t) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"configureRunnerPool requires either endpoint or spawnEngine\",\n\t\t\t});\n\t\t}\n\n\t\t// Flatten the endpoint and apply defaults for namespace/token\n\t\t// If spawnEngine is enabled, set endpoint to the engine endpoint\n\t\tconst endpoint = config.serverless.spawnEngine\n\t\t\t? ENGINE_ENDPOINT\n\t\t\t: parsedEndpoint?.endpoint;\n\t\t// Namespace priority: parsed from endpoint URL > config value (includes env var) > \"default\"\n\t\tconst namespace =\n\t\t\tparsedEndpoint?.namespace ?? config.namespace ?? \"default\";\n\t\t// Token priority: parsed from endpoint URL > config value (includes env var)\n\t\tconst token = parsedEndpoint?.token ?? config.token;\n\n\t\t// Parse publicEndpoint string (env var fallback is applied via transform in serverless schema)\n\t\tconst parsedPublicEndpoint = config.serverless.publicEndpoint\n\t\t\t? tryParseEndpoint(ctx, {\n\t\t\t\t\tendpoint: config.serverless.publicEndpoint,\n\t\t\t\t\tpath: [\"serverless\", \"publicEndpoint\"],\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\t// Validate that publicEndpoint namespace matches backend namespace if specified\n\t\tif (\n\t\t\tparsedPublicEndpoint?.namespace &&\n\t\t\tparsedPublicEndpoint.namespace !== namespace\n\t\t) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: `publicEndpoint namespace \"${parsedPublicEndpoint.namespace}\" must match backend namespace \"${namespace}\"`,\n\t\t\t\tpath: [\"serverless\", \"publicEndpoint\"],\n\t\t\t});\n\t\t}\n\n\t\t// Determine serveManager: default to true in dev mode without endpoint, false otherwise\n\t\tconst serveManager = config.serveManager ?? (isDevEnv && !endpoint);\n\n\t\t// In dev mode, fall back to 127.0.0.1 if serving manager\n\t\tconst publicEndpoint =\n\t\t\tparsedPublicEndpoint?.endpoint ??\n\t\t\t(isDevEnv && (serveManager || config.serverless.spawnEngine)\n\t\t\t\t? `http://127.0.0.1:${config.managerPort}`\n\t\t\t\t: undefined);\n\t\t// We extract publicNamespace to validate that it matches the backend\n\t\t// namespace (see validation above), not for functional use.\n\t\tconst publicNamespace = parsedPublicEndpoint?.namespace;\n\t\tconst publicToken =\n\t\t\tparsedPublicEndpoint?.token ?? config.serverless.publicToken;\n\n\t\t// If endpoint is set or spawning engine, we'll use engine driver - disable manager inspector\n\t\tconst willUseEngine = !!endpoint || config.serverless.spawnEngine;\n\t\tconst inspector = willUseEngine\n\t\t\t? {\n\t\t\t\t\t...config.inspector,\n\t\t\t\t\tenabled: { manager: false, actor: true },\n\t\t\t\t}\n\t\t\t: config.inspector;\n\n\t\treturn {\n\t\t\t...config,\n\t\t\tendpoint,\n\t\t\tnamespace,\n\t\t\ttoken,\n\t\t\tserveManager,\n\t\t\tpublicEndpoint,\n\t\t\tpublicNamespace,\n\t\t\tpublicToken,\n\t\t\tinspector,\n\t\t\tserverless: {\n\t\t\t\t...config.serverless,\n\t\t\t\tpublicEndpoint,\n\t\t\t},\n\t\t};\n\t});\n\nexport type RegistryConfig = z.infer<typeof RegistryConfigSchema>;\nexport type RegistryConfigInput<A extends RegistryActors> = Omit<\n\tz.input<typeof RegistryConfigSchema>,\n\t\"use\"\n> & { use: A };\n\nexport function buildActorNames(\n\tconfig: RegistryConfig,\n): Record<string, { metadata: Record<string, unknown> }> {\n\treturn Object.fromEntries(\n\t\tObject.keys(config.use).map((actorName) => {\n\t\t\tconst definition = config.use[actorName];\n\t\t\tconst options = definition.config.options ?? {};\n\t\t\tconst runMeta = getRunMetadata(definition.config.run);\n\t\t\tconst metadata: Record<string, unknown> = {};\n\t\t\t// Actor options take precedence over run metadata\n\t\t\tmetadata.icon = options.icon ?? runMeta.icon;\n\t\t\tmetadata.name = options.name ?? runMeta.name;\n\t\t\t// Remove undefined values\n\t\t\tif (!metadata.icon) delete metadata.icon;\n\t\t\tif (!metadata.name) delete metadata.name;\n\t\t\treturn [actorName, { metadata }];\n\t\t}),\n\t);\n}\n\n// MARK: Documentation Schemas\n// These schemas are JSON-serializable versions used for documentation generation.\n// They exclude runtime-only fields (transforms, custom types, Logger instances).\n\nexport const DocInspectorConfigSchema = z\n\t.object({\n\t\tenabled: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Whether to enable the Rivet Inspector. Defaults to true in development mode.\",\n\t\t\t),\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Token used to access the Inspector.\"),\n\t\tdefaultEndpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Default RivetKit server endpoint for Rivet Inspector to connect to.\",\n\t\t\t),\n\t})\n\t.optional()\n\t.describe(\"Inspector configuration for debugging and development.\");\n\nexport const DocConfigureRunnerPoolSchema = z\n\t.object({\n\t\tname: z.string().optional().describe(\"Name of the runner pool.\"),\n\t\turl: z\n\t\t\t.string()\n\t\t\t.describe(\"URL of the serverless platform to configure runners.\"),\n\t\theaders: z\n\t\t\t.record(z.string(), z.string())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Headers to include in requests to the serverless platform.\",\n\t\t\t),\n\t\tmaxRunners: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Maximum number of runners in the pool.\"),\n\t\tminRunners: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Minimum number of runners to keep warm.\"),\n\t\trequestLifespan: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Maximum lifespan of a request in milliseconds.\"),\n\t\trunnersMargin: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Buffer margin for scaling runners.\"),\n\t\tslotsPerRunner: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Number of actor slots per runner.\"),\n\t\tmetadata: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Additional metadata to pass to the serverless platform.\",\n\t\t\t),\n\t\tmetadataPollInterval: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Interval in milliseconds between metadata polls from the engine. Defaults to 10000 milliseconds (10 seconds).\",\n\t\t\t),\n\t})\n\t.optional();\n\nexport const DocServerlessConfigSchema = z\n\t.object({\n\t\tspawnEngine: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Downloads and starts the full Rust engine process. Auto-enabled in development mode when no endpoint is provided. Default: false\",\n\t\t\t),\n\t\tengineVersion: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Version of the engine to download. Defaults to the current RivetKit version.\",\n\t\t\t),\n\t\tconfigureRunnerPool: DocConfigureRunnerPoolSchema.describe(\n\t\t\t\"Automatically configure serverless runners in the engine.\",\n\t\t),\n\t\tbasePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Base path for serverless API routes. Default: '/api/rivet'\",\n\t\t\t),\n\t\tpublicEndpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"The endpoint that clients should connect to. Supports URL auth syntax: https://namespace:token@api.rivet.dev\",\n\t\t\t),\n\t\tpublicToken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Token that clients should use when connecting via the public endpoint.\",\n\t\t\t),\n\t})\n\t.describe(\"Configuration for serverless deployment mode.\");\n\nexport const DocRunnerConfigSchema = z\n\t.object({\n\t\ttotalSlots: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Total number of actor slots available. Default: 100000\"),\n\t\trunnerName: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Name of this runner. Default: 'default'\"),\n\t\trunnerKey: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Authentication key for the runner.\"),\n\t\tversion: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Version number of this runner. Default: 1\"),\n\t})\n\t.describe(\"Configuration for runner mode.\");\n\nexport const DocRegistryConfigSchema = z\n\t.object({\n\t\tuse: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.describe(\n\t\t\t\t\"Actor definitions. Keys are actor names, values are actor definitions.\",\n\t\t\t),\n\t\tstoragePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Storage path for RivetKit file-system state when using the default driver. Can also be set via RIVETKIT_STORAGE_PATH.\",\n\t\t\t),\n\t\tmaxIncomingMessageSize: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Maximum size of incoming WebSocket messages in bytes. Default: 65536\",\n\t\t\t),\n\t\tmaxOutgoingMessageSize: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Maximum size of outgoing WebSocket messages in bytes. Default: 1048576\",\n\t\t\t),\n\t\tnoWelcome: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\"Disable the welcome message on startup. Default: false\"),\n\t\tlogging: z\n\t\t\t.object({\n\t\t\t\tlevel: LogLevelSchema.optional().describe(\n\t\t\t\t\t\"Log level for RivetKit. Default: 'warn'\",\n\t\t\t\t),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.describe(\"Logging configuration.\"),\n\t\tendpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Endpoint URL to connect to Rivet Engine. Supports URL auth syntax: https://namespace:token@api.rivet.dev. Can also be set via RIVET_ENDPOINT environment variable.\",\n\t\t\t),\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Authentication token for Rivet Engine. Can also be set via RIVET_TOKEN environment variable.\",\n\t\t\t),\n\t\tnamespace: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Namespace to use. Default: 'default'. Can also be set via RIVET_NAMESPACE environment variable.\",\n\t\t\t),\n\t\theaders: z\n\t\t\t.record(z.string(), z.string())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Additional headers to include in requests to Rivet Engine.\",\n\t\t\t),\n\t\tserveManager: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Whether to start the local manager server. Auto-determined based on endpoint and NODE_ENV if not specified.\",\n\t\t\t),\n\t\tmanagerBasePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Base path for the manager API. Default: '/'\"),\n\t\tmanagerPort: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Port to run the manager on. Default: 6420\"),\n\t\tinspector: DocInspectorConfigSchema,\n\t\tserverless: DocServerlessConfigSchema.optional(),\n\t\trunner: DocRunnerConfigSchema.optional(),\n\t})\n\t.describe(\"RivetKit registry configuration.\");\n","export const ENGINE_PORT = 6420;\nexport const ENGINE_ENDPOINT = `http://127.0.0.1:${ENGINE_PORT}`;\n","import { z } from \"zod/v4\";\nimport {\n\tgetRivetkitInspectorToken,\n\tisDev,\n\tgetRivetkitInspectorDisable,\n} from \"@/utils/env-vars\";\n\nconst defaultTokenFn = () => {\n\tconst envToken = getRivetkitInspectorToken();\n\n\tif (envToken) {\n\t\treturn envToken;\n\t}\n\n\treturn \"\";\n};\n\nconst defaultEnabled = () => {\n\treturn (\n\t\tisDev() ||\n\t\t!getRivetkitInspectorDisable()\n\t);\n};\n\nexport const InspectorConfigSchema = z\n\t.object({\n\t\tenabled: z.boolean().default(defaultEnabled),\n\n\t\t/**\n\t\t * Token used to access the Inspector.\n\t\t */\n\t\ttoken: z\n\t\t\t.custom<() => string>()\n\t\t\t.optional()\n\t\t\t.default(() => defaultTokenFn),\n\n\t\t/**\n\t\t * Default RivetKit server endpoint for Rivet Inspector to connect to. This should be the same endpoint as what you use for your Rivet client to connect to RivetKit.\n\t\t *\n\t\t * This is a convenience property just for printing out the inspector URL.\n\t\t */\n\t\tdefaultEndpoint: z.string().optional(),\n\t})\n\t.optional()\n\t.default(() => ({\n\t\tenabled: defaultEnabled(),\n\t\ttoken: defaultTokenFn,\n\t}));\nexport type InspectorConfig = z.infer<typeof InspectorConfigSchema>;\n","import { z } from \"zod/v4\";\n\nexport interface ParsedEndpoint {\n\tendpoint: string;\n\tnamespace: string | undefined;\n\ttoken: string | undefined;\n}\n\nexport interface TryParseEndpointOptions {\n\t/** The endpoint URL string to parse */\n\tendpoint: string;\n\t/** Path prefix for error messages (default: [\"endpoint\"]) */\n\tpath?: (string | number)[];\n\t/** Namespace from config, to check for duplicate specification */\n\tnamespace?: string;\n\t/** Token from config, to check for duplicate specification */\n\ttoken?: string;\n}\n\n/**\n * Parses an endpoint URL that may contain auth syntax for namespace and token.\n *\n * Uses ctx.addIssue for clean error reporting in Zod transforms.\n *\n * Supports formats like:\n * - `https://namespace:token@api.rivet.dev`\n * - `https://namespace@api.rivet.dev` (namespace only, no token)\n * - `https://api.rivet.dev` (no auth)\n * - `https://namespace:token@api.rivet.dev/path` (with path)\n *\n * Query strings and fragments are not allowed as they may conflict with\n * runtime parameters.\n *\n * @param ctx - Zod refinement context for error reporting\n * @param options - Parsing options including endpoint, path, and config values\n * @returns ParsedEndpoint on success, undefined on error (after adding issues to ctx)\n */\nexport function tryParseEndpoint(\n\tctx: z.RefinementCtx,\n\toptions: TryParseEndpointOptions,\n): ParsedEndpoint | undefined {\n\tconst { endpoint, path = [\"endpoint\"], namespace: configNamespace, token: configToken } = options;\n\t// Parse the URL\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(endpoint);\n\t} catch {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: `invalid URL: ${endpoint}`,\n\t\t\tpath,\n\t\t});\n\t\treturn undefined;\n\t}\n\n\t// Reject query strings\n\tif (url.search) {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: \"endpoint cannot contain a query string\",\n\t\t\tpath,\n\t\t});\n\t\treturn undefined;\n\t}\n\n\t// Reject fragments\n\tif (url.hash) {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: \"endpoint cannot contain a fragment\",\n\t\t\tpath,\n\t\t});\n\t\treturn undefined;\n\t}\n\n\t// Extract namespace and token from username and password\n\t// URL stores these as percent-encoded, so we need to decode them\n\tconst namespace = url.username\n\t\t? decodeURIComponent(url.username)\n\t\t: undefined;\n\tconst token = url.password ? decodeURIComponent(url.password) : undefined;\n\n\t// Reject token without namespace (e.g., https://:token@api.rivet.dev)\n\tif (token && !namespace) {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: \"endpoint cannot have a token without a namespace\",\n\t\t\tpath,\n\t\t});\n\t\treturn undefined;\n\t}\n\n\t// Check for duplicate credentials (specified both in URL and config)\n\tif (namespace && configNamespace) {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage:\n\t\t\t\t\"cannot specify namespace both in endpoint URL and as a separate config option\",\n\t\t\tpath: [\"namespace\"],\n\t\t});\n\t}\n\tif (token && configToken) {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage:\n\t\t\t\t\"cannot specify token both in endpoint URL and as a separate config option\",\n\t\t\tpath: [\"token\"],\n\t\t});\n\t}\n\n\t// Strip auth from the URL by clearing username and password\n\turl.username = \"\";\n\turl.password = \"\";\n\n\t// Get the cleaned endpoint without auth\n\tconst cleanedEndpoint = url.toString();\n\n\treturn {\n\t\tendpoint: cleanedEndpoint,\n\t\tnamespace,\n\t\ttoken,\n\t};\n}\n\n","import { z } from \"zod/v4\";\nimport { ActorDriverBuilder } from \"@/actor/driver\";\nimport { ManagerDriverBuilder } from \"@/manager/driver\";\n\nexport const DriverConfigSchema = z.object({\n\t/** Machine-readable name to identify this driver by. */\n\tname: z.string(),\n\tdisplayName: z.string(),\n\tmanager: z.custom<ManagerDriverBuilder>(),\n\tactor: z.custom<ActorDriverBuilder>(),\n\t/**\n\t * Start actor driver immediately or if this is started separately.\n\t *\n\t * For example:\n\t * - Engine driver needs this to start immediately since this starts the Runner that connects to the engine\n\t * - Cloudflare Workers should not start it automatically, since the actor only runs in the DO\n\t * */\n\tautoStartActorDriver: z.boolean(),\n});\n\nexport type DriverConfig = z.infer<typeof DriverConfigSchema>;\n","import { z } from \"zod/v4\";\nimport {\n\tisDev,\n\tgetRivetTotalSlots,\n\tgetRivetRunner,\n\tgetRivetRunnerKey,\n\tgetRivetRunnerVersion,\n} from \"@/utils/env-vars\";\n\nexport const RunnerConfigSchema = z.object({\n\t// MARK: Runner\n\ttotalSlots: z.number().default(() => getRivetTotalSlots() ?? 100000),\n\trunnerName: z.string().default(() => getRivetRunner() ?? \"default\"),\n\trunnerKey: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((x) => x ?? getRivetRunnerKey()),\n\tversion: z.number().default(() => getRivetRunnerVersion() ?? 1),\n});\nexport type RunnerConfigInput = z.input<typeof RunnerConfigSchema>;\nexport type RunnerConfig = z.infer<typeof RunnerConfigSchema>;\n","import { z } from \"zod/v4\";\nimport { VERSION } from \"@/utils\";\nimport {\n\tgetRivetRunEngineVersion,\n\tgetRivetRunEngine,\n\tgetRivetPublicEndpoint,\n\tgetRivetPublicToken,\n} from \"@/utils/env-vars\";\n\nexport const ConfigureRunnerPoolSchema = z\n\t.object({\n\t\tname: z.string().optional(),\n\t\turl: z.string(),\n\t\theaders: z.record(z.string(), z.string()).optional(),\n\t\tmaxRunners: z.number().optional(),\n\t\tminRunners: z.number().optional(),\n\t\trequestLifespan: z.number().optional(),\n\t\trunnersMargin: z.number().optional(),\n\t\tslotsPerRunner: z.number().optional(),\n\t\tmetadata: z.record(z.string(), z.unknown()).optional(),\n\t\tmetadataPollInterval: z.number().optional(),\n\t\tdrainOnVersionUpgrade: z.boolean().optional(),\n\t})\n\t.optional();\n\nexport const ServerlessConfigSchema = z.object({\n\t// MARK: Run Engine\n\t/**\n\t * @experimental\n\t *\n\t * Downloads and starts the full Rust engine process.\n\t * Auto-enabled in development mode when no endpoint is provided.\n\t */\n\tspawnEngine: z.boolean().default(() => getRivetRunEngine()),\n\n\t/** @experimental */\n\tengineVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.default(() => getRivetRunEngineVersion() ?? VERSION),\n\n\t/**\n\t * @experimental\n\t *\n\t * Automatically configure serverless runners in the engine.\n\t * Can only be used when runnerKind is \"serverless\".\n\t * If true, uses default configuration. Can also provide custom configuration.\n\t */\n\tconfigureRunnerPool: ConfigureRunnerPoolSchema.optional(),\n\n\t// MARK: Routing\n\t// TODO: serverlessBasePath? better naming?\n\tbasePath: z.string().optional().default(\"/api/rivet\"),\n\n\t// MARK: Public Endpoint Configuration\n\t/**\n\t * The endpoint that clients should connect to.\n\t *\n\t * This is useful if clients connect to serverless directly\n\t * (e.g. `http://localhost:3000/api/rivet`), they will fetch\n\t * `http://localhost:3000/api/rivet/metadata` and be redirected to\n\t * the public endpoint.\n\t *\n\t * Supports URL auth syntax for namespace and token:\n\t * - `https://namespace:token@api.rivet.dev`\n\t * - `https://namespace@api.rivet.dev`\n\t *\n\t * Auto-determined based on endpoint and NODE_ENV if not specified.\n\t *\n\t * Can also be set via RIVET_PUBLIC_ENDPOINT environment variable.\n\t */\n\tpublicEndpoint: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetPublicEndpoint()),\n\n\t/**\n\t * Token that clients should use when connecting via the public endpoint.\n\t *\n\t * Can also be set via RIVET_PUBLIC_TOKEN environment variable.\n\t *\n\t * Can also be specified in the publicEndpoint URL as `https://namespace:token@host`.\n\t */\n\tpublicToken: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetPublicToken()),\n\n\t// There is no publicNamespace config option because the frontend and backend\n\t// cannot use different namespaces. The namespace is extracted from the\n\t// publicEndpoint URL auth syntax if provided.\n});\nexport type ServerlessConfigInput = z.input<typeof ServerlessConfigSchema>;\nexport type ServerlessConfig = z.infer<typeof ServerlessConfigSchema>;\n","\nimport { extract } from \"tar\";\nimport { getNodeFs, getNodeOs, getNodePath, getNodeUrl } from \"@/utils/node\";\n\nlet extractedDir: string | undefined;\nlet extractionPromise: Promise<string> | undefined;\n\nexport async function getInspectorDir(): Promise<string> {\n\tif (extractedDir !== undefined) return extractedDir;\n\tif (extractionPromise !== undefined) return extractionPromise;\n\n\tconst nodeFs = getNodeFs();\n\tconst os = getNodeOs();\n\tconst url = getNodeUrl();\n\tconst path = getNodePath();\n\n\textractionPromise = (async () => {\n\t\tconst tarball = path.join(\n\t\t\tpath.dirname(url.fileURLToPath(import.meta.url)),\n\t\t\t\"../../dist/inspector.tar.gz\",\n\t\t);\n\n\t\ttry {\n\t\t\tawait nodeFs.access(tarball);\n\t\t} catch {\n\t\t\tthrow new Error(\n\t\t\t\t`Inspector tarball not found at ${tarball}. Run 'pnpm build:pack-inspector' first.`,\n\t\t\t);\n\t\t}\n\n\t\tconst dest = path.join(os.tmpdir(), \"rivetkit-inspector\");\n\t\tawait nodeFs.mkdir(dest, { recursive: true });\n\t\tawait extract({ file: tarball, cwd: dest });\n\n\t\textractedDir = dest;\n\t\treturn dest;\n\t})();\n\n\treturn extractionPromise;\n}\n","import { createRequire } from \"node:module\";\n\n// Global variables for Node.js modules.\n//\n// We use synchronous require() instead of async import() for Node.js module loading because:\n// 1. These modules are only needed in Node.js environments (not browser/edge)\n// 2. registry.start() cannot be async and needs immediate access to Node modules\n// 3. The setup process must be synchronous to avoid breaking the API\n//\n// Biome only allows imports of node modules in this file in order to ensure\n// we're forcing the use of dynamic imports.\nlet nodeCrypto: typeof import(\"node:crypto\") | undefined;\nlet nodeFsSync: typeof import(\"node:fs\") | undefined;\nlet nodeFs: typeof import(\"node:fs/promises\") | undefined;\nlet nodePath: typeof import(\"node:path\") | undefined;\nlet nodeOs: typeof import(\"node:os\") | undefined;\nlet nodeChildProcess: typeof import(\"node:child_process\") | undefined;\nlet nodeStream: typeof import(\"node:stream/promises\") | undefined;\nlet nodeUrl: typeof import(\"node:url\") | undefined;\n\nlet hasImportedDependencies = false;\n\n// Helper to get a require function that works in both CommonJS and ESM.\n// We use require() instead of await import() because registry.start() cannot\n// be async and needs immediate access to Node.js modules during setup.\nexport function getRequireFn() {\n\t// TODO: This causes issues in tsup\n\t// CommonJS context - use global require\n\t// if (typeof require !== \"undefined\") {\n\t// \tconsole.log(\"existing require\");\n\t// \treturn require;\n\t// }\n\n\t// ESM context - use createRequire with import.meta.url\n\treturn createRequire(import.meta.url);\n}\n\n/**\n * Dynamically imports all required Node.js dependencies. We do this early in a\n * single function call in order to surface errors early.\n *\n * This function is idempotent and will only import once.\n *\n * @throws Error if Node.js modules are not available (e.g., in browser/edge environments)\n */\nexport function importNodeDependencies(): void {\n\t// Check if already loaded\n\tif (hasImportedDependencies) return;\n\n\ttry {\n\t\t// Get a require function that works in both CommonJS and ESM\n\t\tconst requireFn = getRequireFn();\n\n\t\t// Use requireFn with webpack ignore comment to prevent bundling\n\t\tnodeCrypto = requireFn(/* webpackIgnore: true */ \"node:crypto\");\n\t\tnodeFsSync = requireFn(/* webpackIgnore: true */ \"node:fs\");\n\t\tnodeFs = requireFn(/* webpackIgnore: true */ \"node:fs/promises\");\n\t\tnodePath = requireFn(/* webpackIgnore: true */ \"node:path\");\n\t\tnodeOs = requireFn(/* webpackIgnore: true */ \"node:os\");\n\t\tnodeChildProcess = requireFn(\n\t\t\t/* webpackIgnore: true */ \"node:child_process\",\n\t\t);\n\t\tnodeStream = requireFn(\n\t\t\t/* webpackIgnore: true */ \"node:stream/promises\",\n\t\t);\n\t\tnodeUrl = requireFn(/* webpackIgnore: true */ \"node:url\");\n\t\thasImportedDependencies = true;\n\t} catch (err) {\n\t\tconsole.warn(\n\t\t\t\"Node.js modules not available, file system driver will not work\",\n\t\t\terr,\n\t\t);\n\t\tthrow err;\n\t}\n}\n\n/**\n * Gets the Node.js crypto module.\n * @throws Error if crypto module is not loaded\n */\nexport function getNodeCrypto(): typeof import(\"node:crypto\") {\n\tif (!nodeCrypto) {\n\t\tthrow new Error(\n\t\t\t\"Node crypto module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeCrypto;\n}\n\n/**\n * Gets the Node.js fs module.\n * @throws Error if fs module is not loaded\n */\nexport function getNodeFsSync(): typeof import(\"node:fs\") {\n\tif (!nodeFsSync) {\n\t\tthrow new Error(\n\t\t\t\"Node fs module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeFsSync;\n}\n\n/**\n * Gets the Node.js fs/promises module.\n * @throws Error if fs/promises module is not loaded\n */\nexport function getNodeFs(): typeof import(\"node:fs/promises\") {\n\tif (!nodeFs) {\n\t\tthrow new Error(\n\t\t\t\"Node fs/promises module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeFs;\n}\n\n/**\n * Gets the Node.js path module.\n * @throws Error if path module is not loaded\n */\nexport function getNodePath(): typeof import(\"node:path\") {\n\tif (!nodePath) {\n\t\tthrow new Error(\n\t\t\t\"Node path module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodePath;\n}\n\n/**\n * Gets the Node.js os module.\n * @throws Error if os module is not loaded\n */\nexport function getNodeOs(): typeof import(\"node:os\") {\n\tif (!nodeOs) {\n\t\tthrow new Error(\n\t\t\t\"Node os module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeOs;\n}\n\n/**\n * Gets the Node.js child_process module.\n * @throws Error if child_process module is not loaded\n */\nexport function getNodeChildProcess(): typeof import(\"node:child_process\") {\n\tif (!nodeChildProcess) {\n\t\tthrow new Error(\n\t\t\t\"Node child_process module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeChildProcess;\n}\n\n/**\n * Gets the Node.js stream/promises module.\n * @throws Error if stream/promises module is not loaded\n */\nexport function getNodeStream(): typeof import(\"node:stream/promises\") {\n\tif (!nodeStream) {\n\t\tthrow new Error(\n\t\t\t\"Node stream/promises module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeStream;\n}\n\n/**\n * Gets the Node.js url module lazily.\n */\nexport function getNodeUrl(): typeof import(\"node:url\") {\n\tif (!nodeUrl) {\n\t\tthrow new Error(\n\t\t\t\"Node url module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeUrl;\n}","import { z } from \"zod/v4\";\nimport { RivetIdSchema } from \"./common\";\n\nexport const ActorSchema = z.object({\n\tactor_id: RivetIdSchema,\n\tname: z.string(),\n\tkey: z.string(),\n\tnamespace_id: RivetIdSchema,\n\trunner_name_selector: z.string(),\n\tcreate_ts: z.number(),\n\tconnectable_ts: z.number().nullable().optional(),\n\tdestroy_ts: z.number().nullable().optional(),\n\tsleep_ts: z.number().nullable().optional(),\n\tstart_ts: z.number().nullable().optional(),\n\terror: z.unknown().nullable().optional(),\n});\nexport type Actor = z.infer<typeof ActorSchema>;\n\nexport const ActorNameSchema = z.object({\n\tmetadata: z.record(z.string(), z.unknown()),\n});\nexport type ActorName = z.infer<typeof ActorNameSchema>;\n\n// MARK: GET /actors\nexport const ActorsListResponseSchema = z.object({\n\tactors: z.array(ActorSchema),\n});\nexport type ActorsListResponse = z.infer<typeof ActorsListResponseSchema>;\n\n// MARK: POST /actors\nexport const ActorsCreateRequestSchema = z.object({\n\tdatacenter: z.string().optional(),\n\tname: z.string(),\n\trunner_name_selector: z.string(),\n\tcrash_policy: z.string(),\n\tkey: z.string().nullable().optional(),\n\tinput: z.string().nullable().optional(),\n});\nexport type ActorsCreateRequest = z.infer<typeof ActorsCreateRequestSchema>;\n\nexport const ActorsCreateResponseSchema = z.object({\n\tactor: ActorSchema,\n});\nexport type ActorsCreateResponse = z.infer<typeof ActorsCreateResponseSchema>;\n\n// MARK: PUT /actors\nexport const ActorsGetOrCreateRequestSchema = z.object({\n\tdatacenter: z.string().optional(),\n\tname: z.string(),\n\tkey: z.string(),\n\trunner_name_selector: z.string(),\n\tcrash_policy: z.string(),\n\tinput: z.string().nullable().optional(),\n});\nexport type ActorsGetOrCreateRequest = z.infer<\n\ttypeof ActorsGetOrCreateRequestSchema\n>;\n\nexport const ActorsGetOrCreateResponseSchema = z.object({\n\tactor: ActorSchema,\n\tcreated: z.boolean(),\n});\nexport type ActorsGetOrCreateResponse = z.infer<\n\ttypeof ActorsGetOrCreateResponseSchema\n>;\n\n// MARK: DELETE /actors/{}\nexport const ActorsDeleteResponseSchema = z.object({});\nexport type ActorsDeleteResponse = z.infer<typeof ActorsDeleteResponseSchema>;\n\n// MARK: GET /actors/names\nexport const ActorsListNamesResponseSchema = z.object({\n\tnames: z.record(z.string(), ActorNameSchema),\n});\nexport type ActorsListNamesResponse = z.infer<\n\ttypeof ActorsListNamesResponseSchema\n>;\n\n// MARK: GET /actors/{actor_id}/kv/keys/{key}\nexport const ActorsKvGetResponseSchema = z.object({\n\tvalue: z.string().nullable(),\n});\nexport type ActorsKvGetResponse = z.infer<typeof ActorsKvGetResponseSchema>;\n","import { z } from \"zod/v4\";\n\nexport const RivetIdSchema = z.string();\nexport type RivetId = z.infer<typeof RivetIdSchema>;\n","/**\n * Timing-safe comparison of two Uint8Arrays or strings.\n * This prevents timing attacks by always comparing all bytes.\n */\nexport function timingSafeEqual(\n\ta: Uint8Array | string,\n\tb: Uint8Array | string,\n): boolean {\n\tconst encoder = new TextEncoder();\n\tconst bufferA = typeof a === \"string\" ? encoder.encode(a) : a;\n\tconst bufferB = typeof b === \"string\" ? encoder.encode(b) : b;\n\n\t// Pad to max length to avoid leaking length information\n\tconst maxLength = Math.max(bufferA.byteLength, bufferB.byteLength);\n\tlet result = bufferA.byteLength ^ bufferB.byteLength;\n\n\tfor (let i = 0; i < maxLength; i++) {\n\t\tconst byteA = i < bufferA.byteLength ? bufferA[i] : 0;\n\t\tconst byteB = i < bufferB.byteLength ? bufferB[i] : 0;\n\t\tresult |= byteA ^ byteB;\n\t}\n\n\treturn result === 0;\n}\n","import { OpenAPIHono } from \"@hono/zod-openapi\";\nimport type { Hono } from \"hono\";\nimport { createMiddleware } from \"hono/factory\";\nimport { cors } from \"@/common/cors\";\nimport {\n\thandleRouteError,\n\thandleRouteNotFound,\n\tloggerMiddleware,\n} from \"@/common/router\";\nimport { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"router\");\n}\n\nexport function createRouter(\n\tbasePath: string,\n\tbuilder: (app: OpenAPIHono) => void,\n): {\n\trouter: Hono;\n\topenapi: OpenAPIHono;\n} {\n\tconst router = new OpenAPIHono({ strict: false }).basePath(basePath);\n\n\trouter.use(\"*\", loggerMiddleware(logger()), cors());\n\n\t// HACK: Add Sec-WebSocket-Protocol header to fix KIT-339\n\t//\n\t// Some Deno WebSocket providers do not auto-set the protocol, which\n\t// will cause some WebSocket clients to fail\n\trouter.use(\n\t\t\"*\",\n\t\tcreateMiddleware(async (c, next) => {\n\t\t\tconst upgrade = c.req.header(\"upgrade\");\n\t\t\tconst isWebSocket = upgrade?.toLowerCase() === \"websocket\";\n\t\t\tconst isGet = c.req.method === \"GET\";\n\n\t\t\tif (isGet && isWebSocket) {\n\t\t\t\tc.header(\"Sec-WebSocket-Protocol\", \"rivet\");\n\t\t\t}\n\n\t\t\tawait next();\n\t\t}),\n\t);\n\n\tbuilder(router);\n\n\t// Error handling\n\trouter.notFound(handleRouteNotFound);\n\trouter.onError(handleRouteError);\n\n\treturn { router: router as Hono, openapi: router };\n}\n\nexport function buildOpenApiResponses<T>(schema: T) {\n\treturn {\n\t\t200: {\n\t\t\tdescription: \"Success\",\n\t\t\tcontent: {\n\t\t\t\t\"application/json\": {\n\t\t\t\t\tschema,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t400: {\n\t\t\tdescription: \"User error\",\n\t\t},\n\t\t500: {\n\t\t\tdescription: \"Internal error\",\n\t\t},\n\t};\n}\n\nexport function buildOpenApiRequestBody<T>(schema: T) {\n\treturn {\n\t\trequired: true,\n\t\tcontent: {\n\t\t\t\"application/json\": {\n\t\t\t\tschema,\n\t\t\t},\n\t\t},\n\t};\n}\n","import type { MiddlewareHandler } from \"hono\";\n\n/**\n * Simple CORS middleware that matches the gateway behavior.\n *\n * - Echoes back the Origin header from the request\n * - Echoes back the Access-Control-Request-Headers from preflight\n * - Supports credentials\n * - Allows common HTTP methods\n * - Caches preflight for 24 hours\n * - Adds Vary header to prevent cache poisoning\n */\nexport const cors = (): MiddlewareHandler => {\n\treturn async (c, next) => {\n\t\t// Extract origin from request\n\t\tconst origin = c.req.header(\"origin\") || \"*\";\n\n\t\t// Handle preflight OPTIONS request\n\t\tif (c.req.method === \"OPTIONS\") {\n\t\t\tconst requestHeaders =\n\t\t\t\tc.req.header(\"access-control-request-headers\") || \"*\";\n\n\t\t\tc.header(\"access-control-allow-origin\", origin);\n\t\t\tc.header(\"access-control-allow-credentials\", \"true\");\n\t\t\tc.header(\n\t\t\t\t\"access-control-allow-methods\",\n\t\t\t\t\"GET, POST, PUT, DELETE, OPTIONS, PATCH\",\n\t\t\t);\n\t\t\tc.header(\"access-control-allow-headers\", requestHeaders);\n\t\t\tc.header(\"access-control-expose-headers\", \"*\");\n\t\t\tc.header(\"access-control-max-age\", \"86400\");\n\n\t\t\t// Add Vary header to prevent cache poisoning when echoing origin\n\t\t\tif (origin !== \"*\") {\n\t\t\t\tc.header(\"vary\", \"Origin\");\n\t\t\t}\n\n\t\t\t// Remove content headers from preflight response\n\t\t\tc.res.headers.delete(\"content-length\");\n\t\t\tc.res.headers.delete(\"content-type\");\n\n\t\t\treturn c.body(null, 204);\n\t\t}\n\n\t\tawait next();\n\n\t\t// Add CORS headers to actual request\n\t\tc.header(\"access-control-allow-origin\", origin);\n\t\tc.header(\"access-control-allow-credentials\", \"true\");\n\t\tc.header(\"access-control-expose-headers\", \"*\");\n\n\t\t// Add Vary header to prevent cache poisoning when echoing origin\n\t\tif (origin !== \"*\") {\n\t\t\tc.header(\"vary\", \"Origin\");\n\t\t}\n\t};\n};\n","import type { Context as HonoContext, Next } from \"hono\";\nimport type { WSContext } from \"hono/ws\";\nimport invariant from \"invariant\";\nimport { MissingActorHeader, WebSocketsNotEnabled } from \"@/actor/errors\";\nimport {\n\tparseWebSocketProtocols,\n\ttype UpgradeWebSocketArgs,\n} from \"@/actor/router-websocket-endpoints\";\nimport {\n\tHEADER_RIVET_ACTOR,\n\tHEADER_RIVET_TARGET,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_TARGET,\n} from \"@/common/actor-router-consts\";\nimport type { UniversalWebSocket } from \"@/mod\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { type GetUpgradeWebSocket, promiseWithResolvers } from \"@/utils\";\nimport type { ManagerDriver } from \"./driver\";\nimport { logger } from \"./log\";\n\ninterface ActorPathInfo {\n\tactorId: string;\n\ttoken?: string;\n\tremainingPath: string;\n}\n\n/**\n * Handle path-based WebSocket routing\n */\nasync function handleWebSocketGatewayPathBased(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tc: HonoContext,\n\tactorPathInfo: ActorPathInfo,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n): Promise<Response> {\n\tconst upgradeWebSocket = getUpgradeWebSocket?.();\n\tif (!upgradeWebSocket) {\n\t\tthrow new WebSocketsNotEnabled();\n\t}\n\n\t// NOTE: Token validation implemented in EE\n\n\t// Parse additional configuration from Sec-WebSocket-Protocol header\n\tconst { encoding, connParams } = parseWebSocketProtocols(\n\t\tc.req.header(\"sec-websocket-protocol\"),\n\t);\n\n\tlogger().debug({\n\t\tmsg: \"proxying websocket to actor via path-based routing\",\n\t\tactorId: actorPathInfo.actorId,\n\t\tpath: actorPathInfo.remainingPath,\n\t\tencoding,\n\t});\n\n\treturn await managerDriver.proxyWebSocket(\n\t\tc,\n\t\tactorPathInfo.remainingPath,\n\t\tactorPathInfo.actorId,\n\t\tencoding as any, // Will be validated by driver\n\t\tconnParams,\n\t);\n}\n\n/**\n * Handle path-based HTTP routing\n */\nasync function handleHttpGatewayPathBased(\n\tmanagerDriver: ManagerDriver,\n\tc: HonoContext,\n\tactorPathInfo: ActorPathInfo,\n): Promise<Response> {\n\t// NOTE: Token validation implemented in EE\n\n\tlogger().debug({\n\t\tmsg: \"proxying request to actor via path-based routing\",\n\t\tactorId: actorPathInfo.actorId,\n\t\tpath: actorPathInfo.remainingPath,\n\t\tmethod: c.req.method,\n\t});\n\n\t// Preserve all headers\n\tconst proxyHeaders = new Headers(c.req.raw.headers);\n\n\t// Build the proxy request with the actor URL format\n\tconst proxyUrl = new URL(`http://actor${actorPathInfo.remainingPath}`);\n\n\tconst proxyRequest = new Request(proxyUrl, {\n\t\tmethod: c.req.raw.method,\n\t\theaders: proxyHeaders,\n\t\tbody: c.req.raw.body,\n\t\tsignal: c.req.raw.signal,\n\t\tduplex: \"half\",\n\t} as RequestInit);\n\n\treturn await managerDriver.proxyRequest(\n\t\tc,\n\t\tproxyRequest,\n\t\tactorPathInfo.actorId,\n\t);\n}\n\n/**\n * Provides an endpoint to connect to individual actors.\n *\n * Routes requests using either path-based routing or header-based routing:\n *\n * Path-based routing (checked first):\n * - /gateway/{actor_id}/{...path}\n * - /gateway/{actor_id}@{token}/{...path}\n *\n * Header-based routing (fallback):\n * - WebSocket requests: Uses sec-websocket-protocol for routing (target.actor, actor.{id})\n * - HTTP requests: Uses x-rivet-target and x-rivet-actor headers for routing\n */\nexport async function actorGateway(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n\tc: HonoContext,\n\tnext: Next,\n) {\n\n\t// Skip test routes - let them be handled by their specific handlers\n\tif (c.req.path.startsWith(\"/.test/\")) {\n\t\treturn next();\n\t}\n\n\t// Strip basePath from the request path\n\tlet strippedPath = c.req.path;\n\tif (\n\t\tconfig.managerBasePath &&\n\t\tstrippedPath.startsWith(config.managerBasePath)\n\t) {\n\t\tstrippedPath = strippedPath.slice(config.managerBasePath.length);\n\t\t// Ensure the path starts with /\n\t\tif (!strippedPath.startsWith(\"/\")) {\n\t\t\tstrippedPath = \"/\" + strippedPath;\n\t\t}\n\t}\n\n\t// Include query string if present (needed for parseActorPath to preserve query params)\n\tconst pathWithQuery = c.req.url.includes(\"?\")\n\t\t? strippedPath + c.req.url.substring(c.req.url.indexOf(\"?\"))\n\t\t: strippedPath;\n\n\t// First, check if this is an actor path-based route\n\tconst actorPathInfo = parseActorPath(pathWithQuery);\n\tif (actorPathInfo) {\n\t\tlogger().debug({\n\t\t\tmsg: \"routing using path-based actor routing\",\n\t\t\tactorPathInfo,\n\t\t});\n\n\t\t// Check if this is a WebSocket upgrade request\n\t\tconst isWebSocket = c.req.header(\"upgrade\") === \"websocket\";\n\n\t\tif (isWebSocket) {\n\t\t\treturn await handleWebSocketGatewayPathBased(\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tc,\n\t\t\t\tactorPathInfo,\n\t\t\t\tgetUpgradeWebSocket,\n\t\t\t);\n\t\t}\n\n\t\t// Handle regular HTTP requests\n\t\treturn await handleHttpGatewayPathBased(\n\t\t\tmanagerDriver,\n\t\t\tc,\n\t\t\tactorPathInfo,\n\t\t);\n\t}\n\n\t// Fallback to header-based routing\n\t// Check if this is a WebSocket upgrade request\n\tif (c.req.header(\"upgrade\") === \"websocket\") {\n\t\treturn await handleWebSocketGateway(\n\t\t\tconfig,\n\t\t\tmanagerDriver,\n\t\t\tgetUpgradeWebSocket,\n\t\t\tc,\n\t\t\tstrippedPath,\n\t\t);\n\t}\n\n\t// Handle regular HTTP requests\n\treturn await handleHttpGateway(managerDriver, c, next, strippedPath);\n}\n\n/**\n * Handle WebSocket requests using sec-websocket-protocol for routing\n */\nasync function handleWebSocketGateway(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n\tc: HonoContext,\n\tstrippedPath: string,\n) {\n\tconst upgradeWebSocket = getUpgradeWebSocket?.();\n\tif (!upgradeWebSocket) {\n\t\tthrow new WebSocketsNotEnabled();\n\t}\n\n\tlet target: string | undefined;\n\tlet actorId: string | undefined;\n\n\t// Parse configuration from Sec-WebSocket-Protocol header\n\tconst { encoding, connParams } = parseWebSocketProtocols(\n\t\tc.req.header(\"sec-websocket-protocol\"),\n\t);\n\n\tif (target !== \"actor\") {\n\t\treturn c.text(\"WebSocket upgrade requires target.actor protocol\", 400);\n\t}\n\n\tif (!actorId) {\n\t\tthrow new MissingActorHeader();\n\t}\n\n\tlogger().debug({\n\t\tmsg: \"proxying websocket to actor\",\n\t\tactorId,\n\t\tpath: strippedPath,\n\t\tencoding,\n\t});\n\n\t// Include query string if present\n\tconst pathWithQuery = c.req.url.includes(\"?\")\n\t\t? strippedPath + c.req.url.substring(c.req.url.indexOf(\"?\"))\n\t\t: strippedPath;\n\n\treturn await managerDriver.proxyWebSocket(\n\t\tc,\n\t\tpathWithQuery,\n\t\tactorId,\n\t\tencoding,\n\t\tconnParams,\n\t);\n}\n\n/**\n * Handle HTTP requests using x-rivet headers for routing\n */\nasync function handleHttpGateway(\n\tmanagerDriver: ManagerDriver,\n\tc: HonoContext,\n\tnext: Next,\n\tstrippedPath: string,\n) {\n\tconst target = c.req.header(HEADER_RIVET_TARGET);\n\tconst actorId = c.req.header(HEADER_RIVET_ACTOR);\n\n\tif (target !== \"actor\") {\n\t\treturn next();\n\t}\n\n\tif (!actorId) {\n\t\tthrow new MissingActorHeader();\n\t}\n\n\tlogger().debug({\n\t\tmsg: \"proxying request to actor\",\n\t\tactorId,\n\t\tpath: strippedPath,\n\t\tmethod: c.req.method,\n\t});\n\n\t// Preserve all headers except the routing headers\n\tconst proxyHeaders = new Headers(c.req.raw.headers);\n\tproxyHeaders.delete(HEADER_RIVET_TARGET);\n\tproxyHeaders.delete(HEADER_RIVET_ACTOR);\n\n\t// Build the proxy request with the actor URL format\n\tconst url = new URL(c.req.url);\n\tconst proxyUrl = new URL(`http://actor${strippedPath}${url.search}`);\n\n\tconst proxyRequest = new Request(proxyUrl, {\n\t\tmethod: c.req.raw.method,\n\t\theaders: proxyHeaders,\n\t\tbody: c.req.raw.body,\n\t\tsignal: c.req.raw.signal,\n\t\tduplex: \"half\",\n\t} as RequestInit);\n\n\treturn await managerDriver.proxyRequest(c, proxyRequest, actorId);\n}\n\n/**\n * Parse actor routing information from path\n * Matches patterns:\n * - /gateway/{actor_id}/{...path}\n * - /gateway/{actor_id}@{token}/{...path}\n */\nexport function parseActorPath(path: string): ActorPathInfo | null {\n\t// Find query string position (everything from ? onwards, but before fragment)\n\tconst queryPos = path.indexOf(\"?\");\n\tconst fragmentPos = path.indexOf(\"#\");\n\n\t// Extract query string (excluding fragment)\n\tlet queryString = \"\";\n\tif (queryPos !== -1) {\n\t\tif (fragmentPos !== -1 && queryPos < fragmentPos) {\n\t\t\tqueryString = path.slice(queryPos, fragmentPos);\n\t\t} else {\n\t\t\tqueryString = path.slice(queryPos);\n\t\t}\n\t}\n\n\t// Extract base path (before query and fragment)\n\tlet basePath = path;\n\tif (queryPos !== -1) {\n\t\tbasePath = path.slice(0, queryPos);\n\t} else if (fragmentPos !== -1) {\n\t\tbasePath = path.slice(0, fragmentPos);\n\t}\n\n\t// Check for double slashes (invalid path)\n\tif (basePath.includes(\"//\")) {\n\t\treturn null;\n\t}\n\n\t// Split the path into segments\n\tconst segments = basePath.split(\"/\").filter((s) => s.length > 0);\n\n\t// Check minimum required segments: gateway, {actor_id}\n\tif (segments.length < 2) {\n\t\treturn null;\n\t}\n\n\t// Verify the first segment is \"gateway\"\n\tif (segments[0] !== \"gateway\") {\n\t\treturn null;\n\t}\n\n\t// Extract actor_id segment (may contain @token)\n\tconst actorSegment = segments[1];\n\n\t// Check for empty actor segment\n\tif (actorSegment.length === 0) {\n\t\treturn null;\n\t}\n\n\t// Parse actor_id and optional token from the segment\n\tlet actorId: string;\n\tlet token: string | undefined;\n\n\tconst atPos = actorSegment.indexOf(\"@\");\n\tif (atPos !== -1) {\n\t\t// Pattern: /gateway/{actor_id}@{token}/{...path}\n\t\tconst rawActorId = actorSegment.slice(0, atPos);\n\t\tconst rawToken = actorSegment.slice(atPos + 1);\n\n\t\t// Check for empty actor_id or token\n\t\tif (rawActorId.length === 0 || rawToken.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// URL-decode both actor_id and token\n\t\ttry {\n\t\t\tactorId = decodeURIComponent(rawActorId);\n\t\t\ttoken = decodeURIComponent(rawToken);\n\t\t} catch (e) {\n\t\t\t// Invalid URL encoding\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\t// Pattern: /gateway/{actor_id}/{...path}\n\t\t// URL-decode actor_id\n\t\ttry {\n\t\t\tactorId = decodeURIComponent(actorSegment);\n\t\t} catch (e) {\n\t\t\t// Invalid URL encoding\n\t\t\treturn null;\n\t\t}\n\t\ttoken = undefined;\n\t}\n\n\t// Calculate remaining path\n\t// The remaining path starts after /gateway/{actor_id[@token]}/\n\tlet prefixLen = 0;\n\tfor (let i = 0; i < 2; i++) {\n\t\tprefixLen += 1 + segments[i].length; // +1 for the slash\n\t}\n\n\t// Extract the remaining path preserving trailing slashes\n\tlet remainingBase: string;\n\tif (prefixLen < basePath.length) {\n\t\tremainingBase = basePath.slice(prefixLen);\n\t} else {\n\t\tremainingBase = \"/\";\n\t}\n\n\t// Ensure remaining path starts with /\n\tlet remainingPath: string;\n\tif (remainingBase.length === 0 || !remainingBase.startsWith(\"/\")) {\n\t\tremainingPath = `/${remainingBase}${queryString}`;\n\t} else {\n\t\tremainingPath = `${remainingBase}${queryString}`;\n\t}\n\n\treturn {\n\t\tactorId,\n\t\ttoken,\n\t\tremainingPath,\n\t};\n}\n\n/**\n * Creates a WebSocket proxy for test endpoints that forwards messages between server and client WebSockets\n *\n * clientToProxyWs = the websocket from the client -> the proxy\n * proxyToActorWs = the websocket from the proxy -> the actor\n */\nexport async function createTestWebSocketProxy(\n\tproxyToActorWsPromise: Promise<UniversalWebSocket>,\n): Promise<UpgradeWebSocketArgs> {\n\t// Store a reference to the resolved WebSocket\n\tlet proxyToActorWs: UniversalWebSocket | null = null;\n\tconst {\n\t\tpromise: clientToProxyWsPromise,\n\t\tresolve: clientToProxyWsResolve,\n\t\treject: clientToProxyWsReject,\n\t} = promiseWithResolvers<WSContext>((reason) => logger().warn({ msg: \"unhandled client websocket promise rejection\", reason }));\n\ttry {\n\t\t// Resolve the client WebSocket promise\n\t\tlogger().debug({ msg: \"awaiting client websocket promise\" });\n\t\tproxyToActorWs = await proxyToActorWsPromise;\n\t\tlogger().debug({\n\t\t\tmsg: \"client websocket promise resolved\",\n\t\t\tconstructor: proxyToActorWs?.constructor.name,\n\t\t});\n\n\t\t// Wait for ws to open\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tinvariant(proxyToActorWs, \"missing proxyToActorWs\");\n\n\t\t\tconst onOpen = () => {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"test websocket connection to actor opened\",\n\t\t\t\t});\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst onError = (error: any) => {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"test websocket connection failed\",\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`Failed to open WebSocket: ${error.message || error}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tclientToProxyWsReject();\n\t\t\t};\n\n\t\t\tproxyToActorWs.addEventListener(\"open\", onOpen);\n\n\t\t\tproxyToActorWs.addEventListener(\"error\", onError);\n\n\t\t\tproxyToActorWs.addEventListener(\n\t\t\t\t\"message\",\n\t\t\t\tasync (clientEvt: MessageEvent) => {\n\t\t\t\t\tconst clientToProxyWs = await clientToProxyWsPromise;\n\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: `test websocket connection message from client`,\n\t\t\t\t\t\tdataType: typeof clientEvt.data,\n\t\t\t\t\t\tisBlob: clientEvt.data instanceof Blob,\n\t\t\t\t\t\tisArrayBuffer: clientEvt.data instanceof ArrayBuffer,\n\t\t\t\t\t\tdataConstructor: clientEvt.data?.constructor?.name,\n\t\t\t\t\t\tdataStr:\n\t\t\t\t\t\t\ttypeof clientEvt.data === \"string\"\n\t\t\t\t\t\t\t\t? clientEvt.data.substring(0, 100)\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (clientToProxyWs.readyState === 1) {\n\t\t\t\t\t\t// OPEN\n\t\t\t\t\t\t// Handle Blob data\n\t\t\t\t\t\tif (clientEvt.data instanceof Blob) {\n\t\t\t\t\t\t\tclientEvt.data\n\t\t\t\t\t\t\t\t.arrayBuffer()\n\t\t\t\t\t\t\t\t.then((buffer) => {\n\t\t\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\t\t\tmsg: \"converted client blob to arraybuffer, sending to server\",\n\t\t\t\t\t\t\t\t\t\tbufferSize: buffer.byteLength,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tclientToProxyWs.send(buffer as any);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\t\t\tmsg: \"failed to convert blob to arraybuffer\",\n\t\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\tmsg: \"sending client data directly to server\",\n\t\t\t\t\t\t\t\tdataType: typeof clientEvt.data,\n\t\t\t\t\t\t\t\tdataLength:\n\t\t\t\t\t\t\t\t\ttypeof clientEvt.data === \"string\"\n\t\t\t\t\t\t\t\t\t\t? clientEvt.data.length\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tclientToProxyWs.send(clientEvt.data as any);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tproxyToActorWs.addEventListener(\"close\", async (clientEvt: any) => {\n\t\t\t\tconst clientToProxyWs = await clientToProxyWsPromise;\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: `test websocket connection closed`,\n\t\t\t\t});\n\n\t\t\t\tif (clientToProxyWs.readyState !== 3) {\n\t\t\t\t\t// Not CLOSED\n\t\t\t\t\tclientToProxyWs.close(clientEvt.code, clientEvt.reason);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tproxyToActorWs.addEventListener(\"error\", async () => {\n\t\t\t\tconst clientToProxyWs = await clientToProxyWsPromise;\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: `test websocket connection error`,\n\t\t\t\t});\n\n\t\t\t\tif (clientToProxyWs.readyState !== 3) {\n\t\t\t\t\t// Not CLOSED\n\t\t\t\t\tclientToProxyWs.close(1011, \"Error in client websocket\");\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\tlogger().error({\n\t\t\tmsg: `failed to establish client websocket connection`,\n\t\t\terror,\n\t\t});\n\t\treturn {\n\t\t\tonOpen: (_evt, clientToProxyWs) => {\n\t\t\t\tclientToProxyWs.close(1011, \"Failed to establish connection\");\n\t\t\t},\n\t\t\tonMessage: () => {},\n\t\t\tonError: () => {},\n\t\t\tonClose: () => {},\n\t\t};\n\t}\n\n\t// Create WebSocket proxy handlers to relay messages between client and server\n\treturn {\n\t\tonOpen: (_evt: any, clientToProxyWs: WSContext) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: `test websocket connection from client opened`,\n\t\t\t});\n\n\t\t\t// Check WebSocket type\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"proxyToActorWs info\",\n\t\t\t\tconstructor: proxyToActorWs.constructor.name,\n\t\t\t\thasAddEventListener:\n\t\t\t\t\ttypeof proxyToActorWs.addEventListener === \"function\",\n\t\t\t\treadyState: proxyToActorWs.readyState,\n\t\t\t});\n\n\t\t\tclientToProxyWsResolve(clientToProxyWs);\n\t\t},\n\t\tonMessage: (evt: { data: any }) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"received message from server\",\n\t\t\t\tdataType: typeof evt.data,\n\t\t\t\tisBlob: evt.data instanceof Blob,\n\t\t\t\tisArrayBuffer: evt.data instanceof ArrayBuffer,\n\t\t\t\tdataConstructor: evt.data?.constructor?.name,\n\t\t\t\tdataStr:\n\t\t\t\t\ttypeof evt.data === \"string\"\n\t\t\t\t\t\t? evt.data.substring(0, 100)\n\t\t\t\t\t\t: undefined,\n\t\t\t});\n\n\t\t\t// Forward messages from server websocket to client websocket\n\t\t\tif (proxyToActorWs.readyState === 1) {\n\t\t\t\t// OPEN\n\t\t\t\t// Handle Blob data\n\t\t\t\tif (evt.data instanceof Blob) {\n\t\t\t\t\tevt.data\n\t\t\t\t\t\t.arrayBuffer()\n\t\t\t\t\t\t.then((buffer) => {\n\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\tmsg: \"converted blob to arraybuffer, sending\",\n\t\t\t\t\t\t\t\tbufferSize: buffer.byteLength,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tproxyToActorWs.send(buffer);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\tmsg: \"failed to convert blob to arraybuffer\",\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"sending data directly\",\n\t\t\t\t\t\tdataType: typeof evt.data,\n\t\t\t\t\t\tdataLength:\n\t\t\t\t\t\t\ttypeof evt.data === \"string\"\n\t\t\t\t\t\t\t\t? evt.data.length\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t});\n\t\t\t\t\tproxyToActorWs.send(evt.data);\n\t\t\t\t}\n\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\tclientToProxyWs: WSContext,\n\t\t) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: `server websocket closed`,\n\t\t\t\twasClean: event.wasClean,\n\t\t\t\tcode: event.code,\n\t\t\t\treason: event.reason,\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\tclientToProxyWs.close(1000, \"hack_force_close\");\n\n\t\t\t// Close the client websocket when the server websocket closes\n\t\t\tif (\n\t\t\t\tproxyToActorWs &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSED &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSING\n\t\t\t) {\n\t\t\t\t// Don't pass code/message since this may affect how close events are triggered\n\t\t\t\tproxyToActorWs.close(1000, event.reason);\n\t\t\t}\n\t\t},\n\t\tonError: (error: unknown) => {\n\t\t\tlogger().error({\n\t\t\t\tmsg: `error in server websocket`,\n\t\t\t\terror,\n\t\t\t});\n\n\t\t\t// Close the client websocket on error\n\t\t\tif (\n\t\t\t\tproxyToActorWs &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSED &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSING\n\t\t\t) {\n\t\t\t\tproxyToActorWs.close(1011, \"Error in server websocket\");\n\t\t\t}\n\n\t\t\tclientToProxyWsReject();\n\t\t},\n\t};\n}\n","import type { WSContext } from \"hono/ws\";\nimport invariant from \"invariant\";\nimport type { AnyConn } from \"@/actor/conn/mod\";\nimport type { AnyActorInstance } from \"@/actor/instance/mod\";\nimport type { InputData } from \"@/actor/protocol/serde\";\nimport { type Encoding, EncodingSchema } from \"@/actor/protocol/serde\";\nimport {\n\tPATH_CONNECT,\n\tPATH_INSPECTOR_CONNECT,\n\tPATH_WEBSOCKET_BASE,\n\tPATH_WEBSOCKET_PREFIX,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_INSPECTOR_TOKEN,\n} from \"@/common/actor-router-consts\";\nimport { deconstructError } from \"@/common/utils\";\nimport type {\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nimport { handleWebSocketInspectorConnect } from \"@/inspector/handler\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { promiseWithResolvers } from \"@/utils\";\nimport { timingSafeEqual } from \"@/utils/crypto\";\nimport type { ConnDriver } from \"./conn/driver\";\nimport { createRawWebSocketDriver } from \"./conn/drivers/raw-websocket\";\nimport { createWebSocketDriver } from \"./conn/drivers/websocket\";\nimport type { ActorDriver } from \"./driver\";\nimport { loggerWithoutContext } from \"./log\";\nimport { parseMessage } from \"./protocol/old\";\nimport { getRequestExposeInternalError } from \"./router-endpoints\";\n\n// TODO: Merge with ConnectWebSocketOutput interface\nexport interface UpgradeWebSocketArgs {\n\tconn?: AnyConn;\n\tactor?: AnyActorInstance;\n\tonRestore?: (ws: WSContext) => void;\n\tonOpen: (event: any, ws: WSContext) => void;\n\tonMessage: (event: any, ws: WSContext) => void;\n\tonClose: (event: any, ws: WSContext) => void;\n\tonError: (error: any, ws: WSContext) => void;\n}\n\ninterface WebSocketHandlerOpts {\n\tconfig: RegistryConfig;\n\trequest: Request | undefined;\n\tencoding: Encoding;\n\tactor: AnyActorInstance;\n\tclosePromiseResolvers: ReturnType<typeof promiseWithResolvers<void>>;\n\tconn: AnyConn;\n\texposeInternalError: boolean;\n}\n\n/** Handler for a specific WebSocket route. Used in routeWebSocket. */\ntype WebSocketHandler = (\n\topts: WebSocketHandlerOpts,\n) => Promise<UpgradeWebSocketArgs>;\n\nexport async function routeWebSocket(\n\trequest: Request | undefined,\n\trequestPath: string,\n\trequestHeaders: Record<string, string>,\n\tconfig: RegistryConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tencoding: Encoding,\n\tparameters: unknown,\n\tgatewayId: ArrayBuffer | undefined,\n\trequestId: ArrayBuffer | undefined,\n\tisHibernatable: boolean,\n\tisRestoringHibernatable: boolean,\n): Promise<UpgradeWebSocketArgs> {\n\tconst exposeInternalError = request\n\t\t? getRequestExposeInternalError(request)\n\t\t: false;\n\n\tlet createdConn: AnyConn | undefined;\n\ttry {\n\t\tconst actor = await actorDriver.loadActor(actorId);\n\n\t\tactor.rLog.debug({\n\t\t\tmsg: \"new websocket connection\",\n\t\t\tactorId,\n\t\t\trequestPath,\n\t\t\tisHibernatable,\n\t\t});\n\n\t\t// Promise used to wait for the websocket close in `disconnect`\n\t\tconst closePromiseResolvers = promiseWithResolvers<void>((reason) => loggerWithoutContext().warn({ msg: \"unhandled websocket close promise rejection\", reason }));\n\n\t\t// Strip query parameters from requestPath for routing purposes.\n\t\t// This handles paths like \"/websocket?query=value\" which should route\n\t\t// to the raw websocket handler.\n\t\tconst requestPathWithoutQuery = requestPath.split(\"?\")[0];\n\n\t\t// Route WebSocket & create driver\n\t\tlet handler: WebSocketHandler;\n\t\tlet connDriver: ConnDriver;\n\t\tif (requestPathWithoutQuery === PATH_CONNECT) {\n\t\t\tconst { driver, setWebSocket } = createWebSocketDriver(\n\t\t\t\tisHibernatable\n\t\t\t\t\t? { gatewayId: gatewayId!, requestId: requestId! }\n\t\t\t\t\t: undefined,\n\t\t\t\tencoding,\n\t\t\t\tclosePromiseResolvers.promise,\n\t\t\t\tconfig,\n\t\t\t);\n\t\t\thandler = handleWebSocketConnect.bind(undefined, setWebSocket);\n\t\t\tconnDriver = driver;\n\t\t} else if (\n\t\t\trequestPathWithoutQuery === PATH_WEBSOCKET_BASE ||\n\t\t\trequestPathWithoutQuery.startsWith(PATH_WEBSOCKET_PREFIX)\n\t\t) {\n\t\t\tconst { driver, setWebSocket } = createRawWebSocketDriver(\n\t\t\t\tisHibernatable\n\t\t\t\t\t? { gatewayId: gatewayId!, requestId: requestId! }\n\t\t\t\t\t: undefined,\n\t\t\t\tclosePromiseResolvers.promise,\n\t\t\t);\n\t\t\thandler = handleRawWebSocket.bind(undefined, setWebSocket);\n\t\t\tconnDriver = driver;\n\t\t} else if (requestPathWithoutQuery === PATH_INSPECTOR_CONNECT) {\n\t\t\tif (!actor.inspectorToken) {\n\t\t\t\tthrow \"WebSocket Inspector Unauthorized: actor does not provide inspector access\";\n\t\t\t}\n\n\t\t\tconst inspectorToken = requestHeaders[\"sec-websocket-protocol\"]\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((p) => p.trim())\n\t\t\t\t.find((protocol) =>\n\t\t\t\t\tprotocol.startsWith(WS_PROTOCOL_INSPECTOR_TOKEN),\n\t\t\t\t)\n\t\t\t\t// skip token prefix\n\t\t\t\t?.split(\".\")[1];\n\n\t\t\tif (\n\t\t\t\t!inspectorToken ||\n\t\t\t\t!timingSafeEqual(actor.inspectorToken, inspectorToken)\n\t\t\t) {\n\t\t\t\tthrow \"WebSocket Inspector Unauthorized: invalid token\";\n\t\t\t}\n\t\t\t// This returns raw UpgradeWebSocketArgs instead of accepting a\n\t\t\t// Conn since this does not need a Conn\n\t\t\treturn await handleWebSocketInspectorConnect({ actor });\n\t\t} else {\n\t\t\tthrow `WebSocket Path Not Found: ${requestPath}`;\n\t\t}\n\n\t\t// Prepare connection\n\t\tconst conn = await actor.connectionManager.prepareConn(\n\t\t\tconnDriver,\n\t\t\tparameters,\n\t\t\trequest,\n\t\t\trequestPath,\n\t\t\trequestHeaders,\n\t\t\tisHibernatable,\n\t\t\tisRestoringHibernatable,\n\t\t);\n\t\tcreatedConn = conn;\n\n\t\t// Create handler\n\t\t//\n\t\t// This must call actor.connectionManager.connectConn in onOpen.\n\t\treturn await handler({\n\t\t\tconfig: config,\n\t\t\trequest,\n\t\t\tencoding,\n\t\t\tactor,\n\t\t\tclosePromiseResolvers,\n\t\t\tconn,\n\t\t\texposeInternalError,\n\t\t});\n\t} catch (error) {\n\t\tconst { group, code } = deconstructError(\n\t\t\terror,\n\t\t\tloggerWithoutContext(),\n\t\t\t{},\n\t\t\texposeInternalError,\n\t\t);\n\n\t\t// Clean up connection\n\t\tif (createdConn) {\n\t\t\tcreatedConn.disconnect(`${group}.${code}`);\n\t\t}\n\n\t\t// Return handler that immediately closes with error\n\t\t// Note: createdConn should always exist here, but we use a type assertion for safety\n\t\treturn {\n\t\t\tconn: createdConn!,\n\t\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\t\tws.close(1011, `${group}.${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\n/**\n * Creates a WebSocket connection handler\n */\nexport async function handleWebSocketConnect(\n\tsetWebSocket: (ws: WSContext) => void,\n\t{\n\t\tconfig: runConfig,\n\t\tencoding,\n\t\tactor,\n\t\tclosePromiseResolvers,\n\t\tconn,\n\t\texposeInternalError,\n\t}: WebSocketHandlerOpts,\n): Promise<UpgradeWebSocketArgs> {\n\t// Process WS messages in order to avoid races between subscription updates\n\t// and subsequent action requests.\n\tlet pendingMessage = Promise.resolve();\n\n\treturn {\n\t\tconn,\n\t\tactor,\n\t\tonRestore: (ws: WSContext) => {\n\t\t\tsetWebSocket(ws);\n\t\t},\n\t\t// NOTE: onOpen cannot be async since this messes up the open event listener order\n\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\tactor.rLog.debug(\"actor websocket open\");\n\n\t\t\tsetWebSocket(ws);\n\n\t\t\t// This will not be called by restoring hibernatable\n\t\t\t// connections. All restoration is done in prepareConn.\n\t\t\tactor.connectionManager.connectConn(conn);\n\t\t},\n\t\tonMessage: (evt: RivetMessageEvent, ws: WSContext) => {\n\t\t\tactor.rLog.debug({ msg: \"received message\" });\n\t\t\tconst value = evt.data.valueOf() as InputData;\n\t\t\tpendingMessage = pendingMessage\n\t\t\t\t.then(async () => {\n\t\t\t\t\tconst message = await parseMessage(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\tawait actor.processMessage(message, conn);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconst { group, code } = deconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tactor.rLog,\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, `${group}.${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\tclosePromiseResolvers.resolve();\n\n\t\t\tif (event.wasClean) {\n\t\t\t\tactor.rLog.info({\n\t\t\t\t\tmsg: \"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\tactor.rLog.warn({\n\t\t\t\t\tmsg: \"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// Wait for actor.createConn to finish before removing the connection\n\t\t\tconn.disconnect(event?.reason);\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\tactor.rLog.warn({ msg: \"websocket error\" });\n\t\t\t} catch (error) {\n\t\t\t\tdeconstructError(\n\t\t\t\t\terror,\n\t\t\t\t\tactor.rLog,\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\nexport async function handleRawWebSocket(\n\tsetWebSocket: (ws: UniversalWebSocket) => void,\n\t{ request, actor, closePromiseResolvers, conn }: WebSocketHandlerOpts,\n): Promise<UpgradeWebSocketArgs> {\n\treturn {\n\t\tconn,\n\t\tactor,\n\t\tonRestore: (wsContext: WSContext) => {\n\t\t\tconst ws = wsContext.raw as UniversalWebSocket;\n\t\t\tinvariant(ws, \"missing wsContext.raw\");\n\n\t\t\tsetWebSocket(ws);\n\t\t},\n\t\t// NOTE: onOpen cannot be async since this will cause the client's open\n\t\t// event to be called before this completes. Do all async work in\n\t\t// handleRawWebSocket root.\n\t\tonOpen: (_evt: any, wsContext: WSContext) => {\n\t\t\tconst ws = wsContext.raw as UniversalWebSocket;\n\t\t\tinvariant(ws, \"missing wsContext.raw\");\n\n\t\t\tsetWebSocket(ws);\n\n\t\t\t// This will not be called by restoring hibernatable\n\t\t\t// connections. All restoration is done in prepareConn.\n\t\t\tactor.connectionManager.connectConn(conn);\n\n\t\t\t// Call the actor's onWebSocket handler with the adapted WebSocket\n\t\t\t//\n\t\t\t// NOTE: onWebSocket is called inside this function. Make sure\n\t\t\t// this is called synchronously within onOpen.\n\t\t\tactor.handleRawWebSocket(conn, ws, request);\n\t\t},\n\t\t// Raw websocket messages are handled directly by the actor's event\n\t\t// listeners on the WebSocket object, not through this callback\n\t\tonMessage: (_evt: any, _ws: any) => { },\n\t\tonClose: (evt: any, ws: any) => {\n\t\t\t// Resolve the close promise\n\t\t\tclosePromiseResolvers.resolve();\n\n\t\t\t// Clean up the connection\n\t\t\tconn.disconnect(evt?.reason);\n\t\t},\n\t\tonError: (error: any, ws: any) => { },\n\t};\n}\n\nexport interface WebSocketCustomProtocols {\n\tencoding: Encoding;\n\tconnParams: unknown;\n}\n\n/**\n * Parse encoding and connection parameters from WebSocket Sec-WebSocket-Protocol header\n */\nexport function parseWebSocketProtocols(\n\tprotocols: string | null | undefined,\n): WebSocketCustomProtocols {\n\tlet encodingRaw: string | undefined;\n\tlet connParamsRaw: string | undefined;\n\n\tif (protocols) {\n\t\tconst protocolList = protocols.split(\",\").map((p) => p.trim());\n\t\tfor (const protocol of protocolList) {\n\t\t\tif (protocol.startsWith(WS_PROTOCOL_ENCODING)) {\n\t\t\t\tencodingRaw = protocol.substring(WS_PROTOCOL_ENCODING.length);\n\t\t\t} else if (protocol.startsWith(WS_PROTOCOL_CONN_PARAMS)) {\n\t\t\t\tconnParamsRaw = decodeURIComponent(\n\t\t\t\t\tprotocol.substring(WS_PROTOCOL_CONN_PARAMS.length),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Default to \"json\" encoding for raw WebSocket connections without subprotocols\n\tconst encoding = EncodingSchema.parse(encodingRaw ?? \"json\");\n\tconst connParams = connParamsRaw ? JSON.parse(connParamsRaw) : undefined;\n\n\treturn { encoding, connParams };\n}\n\n/**\n * Truncase the PATH_WEBSOCKET_PREFIX path prefix in order to pass a clean\n * path to the onWebSocket handler.\n *\n * Example:\n * - `/websocket/foo` -> `/foo`\n * - `/websocket` -> `/`\n */\nexport function truncateRawWebSocketPathPrefix(path: string): string {\n\t// Extract the path after prefix and preserve query parameters\n\t// Use URL API for cleaner parsing\n\tconst url = new URL(path, \"http://actor\");\n\tconst pathname = url.pathname.replace(/^\\/websocket\\/?/, \"\") || \"/\";\n\tconst normalizedPath =\n\t\t(pathname.startsWith(\"/\") ? pathname : `/${pathname}`) + url.search;\n\n\treturn normalizedPath;\n}\n","import type { WSContext } from \"hono/ws\";\nimport type { Unsubscribe } from \"nanoevents\";\nimport type { UpgradeWebSocketArgs } from \"@/actor/router-websocket-endpoints\";\nimport type { AnyActorInstance, RivetMessageEvent } from \"@/mod\";\nimport type { ToClient } from \"@/schemas/actor-inspector/mod\";\nimport { encodeReadRangeWire } from \"@rivetkit/traces/encoding\";\nimport {\n\tCURRENT_VERSION as INSPECTOR_CURRENT_VERSION,\n\tTO_CLIENT_VERSIONED as toClient,\n\tTO_SERVER_VERSIONED as toServer,\n} from \"@/schemas/actor-inspector/versioned\";\nimport { assertUnreachable, bufferToArrayBuffer } from \"@/utils\";\nimport { inspectorLogger } from \"./log\";\n\nexport async function handleWebSocketInspectorConnect({\n\tactor,\n}: {\n\tactor: AnyActorInstance;\n}): Promise<UpgradeWebSocketArgs> {\n\tconst inspector = actor.inspector;\n\tconst maxQueueStatusLimit = 200;\n\n\tconst listeners: Unsubscribe[] = [];\n\treturn {\n\t\t// NOTE: onOpen cannot be async since this messes up the open event listener order\n\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\tsendMessage(ws, {\n\t\t\t\tbody: {\n\t\t\t\t\ttag: \"Init\",\n\t\t\t\t\tval: {\n\t\t\t\t\t\tconnections: inspector.getConnections(),\n\t\t\t\t\t\trpcs: inspector.getRpcs(),\n\t\t\t\t\t\tstate: inspector.isStateEnabled()\n\t\t\t\t\t\t\t? inspector.getState()\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tisStateEnabled: inspector.isStateEnabled(),\n\t\t\t\t\t\tisDatabaseEnabled: inspector.isDatabaseEnabled(),\n\t\t\t\t\t\tqueueSize: BigInt(inspector.getQueueSize()),\n\t\t\t\t\t\tworkflowHistory: inspector.getWorkflowHistory(),\n\t\t\t\t\t\tisWorkflowEnabled: inspector.isWorkflowEnabled(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tlisteners.push(\n\t\t\t\tinspector.emitter.on(\"stateUpdated\", () => {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"StateUpdated\",\n\t\t\t\t\t\t\tval: { state: inspector.getState() },\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tinspector.emitter.on(\"connectionsUpdated\", () => {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ConnectionsUpdated\",\n\t\t\t\t\t\t\tval: { connections: inspector.getConnections() },\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tinspector.emitter.on(\"queueUpdated\", () => {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"QueueUpdated\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tqueueSize: BigInt(inspector.getQueueSize()),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tinspector.emitter.on(\"workflowHistoryUpdated\", (history) => {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"WorkflowHistoryUpdated\",\n\t\t\t\t\t\t\tval: { history },\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tonMessage: async (evt: RivetMessageEvent, ws: WSContext) => {\n\t\t\ttry {\n\t\t\t\tconst message = receiveMessage(evt.data);\n\n\t\t\t\tif (message.body.tag === \"PatchStateRequest\") {\n\t\t\t\t\tconst { state } = message.body.val;\n\t\t\t\t\tinspector.setState(state);\n\t\t\t\t\treturn;\n\t\t\t\t} else if (message.body.tag === \"ActionRequest\") {\n\t\t\t\t\tconst { name, args, id } = message.body.val;\n\t\t\t\t\tconst result = await inspector.executeAction(name, args);\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ActionResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: id,\n\t\t\t\t\t\t\t\toutput: result,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"StateRequest\") {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"StateResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: message.body.val.id,\n\t\t\t\t\t\t\t\tstate: inspector.isStateEnabled()\n\t\t\t\t\t\t\t\t\t? inspector.getState()\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\tisStateEnabled: inspector.isStateEnabled(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"ConnectionsRequest\") {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ConnectionsResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: message.body.val.id,\n\t\t\t\t\t\t\t\tconnections: inspector.getConnections(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"RpcsListRequest\") {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"RpcsListResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: message.body.val.id,\n\t\t\t\t\t\t\t\trpcs: inspector.getRpcs(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"TraceQueryRequest\") {\n\t\t\t\t\tconst { id, startMs, endMs, limit } = message.body.val;\n\t\t\t\t\tconst wire = await actor.traces.readRangeWire({\n\t\t\t\t\t\tstartMs: Number(startMs),\n\t\t\t\t\t\tendMs: Number(endMs),\n\t\t\t\t\t\tlimit: Number(limit),\n\t\t\t\t\t});\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"TraceQueryResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: id,\n\t\t\t\t\t\t\t\tpayload: bufferToArrayBuffer(\n\t\t\t\t\t\t\t\t\tencodeReadRangeWire(wire),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"QueueRequest\") {\n\t\t\t\t\tconst { id, limit } = message.body.val;\n\t\t\t\t\tconst status = await inspector.getQueueStatus(\n\t\t\t\t\t\tMath.min(Number(limit), maxQueueStatusLimit),\n\t\t\t\t\t);\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"QueueResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: id,\n\t\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"WorkflowHistoryRequest\") {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"WorkflowHistoryResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: message.body.val.id,\n\t\t\t\t\t\t\t\thistory: inspector.getWorkflowHistory(),\n\t\t\t\t\t\t\t\tisWorkflowEnabled:\n\t\t\t\t\t\t\t\t\tinspector.isWorkflowEnabled(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"DatabaseSchemaRequest\") {\n\t\t\t\t\tconst { id } = message.body.val;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst schema = await inspector.getDatabaseSchema();\n\t\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\ttag: \"DatabaseSchemaResponse\",\n\t\t\t\t\t\t\t\tval: { rid: id, schema },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tinspectorLogger().warn(\n\t\t\t\t\t\t\t{ error },\n\t\t\t\t\t\t\t\"Failed to get database schema\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\ttag: \"Error\",\n\t\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\t\tmessage: `Failed to get database schema: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (message.body.tag === \"DatabaseTableRowsRequest\") {\n\t\t\t\t\tconst { id, table, limit, offset } = message.body.val;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await inspector.getDatabaseTableRows(\n\t\t\t\t\t\t\ttable,\n\t\t\t\t\t\t\tNumber(limit),\n\t\t\t\t\t\t\tNumber(offset),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\ttag: \"DatabaseTableRowsResponse\",\n\t\t\t\t\t\t\t\tval: { rid: id, result },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tinspectorLogger().warn(\n\t\t\t\t\t\t\t{ error },\n\t\t\t\t\t\t\t\"Failed to get database table rows\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\ttag: \"Error\",\n\t\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\t\tmessage: `Failed to get database rows: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tassertUnreachable(message.body);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tinspectorLogger().warn(\n\t\t\t\t\t{ error },\n\t\t\t\t\t\"Failed to handle inspector WS message\",\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tonClose: (\n\t\t\t_event: {\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\t_ws: WSContext,\n\t\t) => {\n\t\t\tfor (const unsubscribe of listeners) {\n\t\t\t\tunsubscribe();\n\t\t\t}\n\t\t},\n\t\tonError: (_error: unknown) => {\n\t\t\tinspectorLogger().warn(\n\t\t\t\t{ error: _error },\n\t\t\t\t\"WebSocket inspector connection error\",\n\t\t\t);\n\t\t},\n\t};\n}\n\nfunction sendMessage(ws: WSContext, message: ToClient) {\n\tws.send(\n\t\ttoClient.serializeWithEmbeddedVersion(\n\t\t\tmessage,\n\t\t\tINSPECTOR_CURRENT_VERSION,\n\t\t) as unknown as ArrayBuffer,\n\t);\n}\n\nfunction receiveMessage(data: ArrayBuffer) {\n\treturn toServer.deserializeWithEmbeddedVersion(new Uint8Array(data));\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function inspectorLogger() {\n\treturn getLogger(\"inspector\");\n}\n","import type { AnyConn } from \"@/actor/conn/mod\";\nimport type { AnyActorInstance } from \"@/actor/instance/mod\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { loggerWithoutContext } from \"../../log\";\nimport { type ConnDriver, DriverReadyState } from \"../driver\";\n\n/**\n * Creates a raw WebSocket connection driver.\n *\n * This driver is used for raw WebSocket connections that don't use the RivetKit protocol.\n * Unlike the standard WebSocket driver, this doesn't have sendMessage since raw WebSockets\n * don't handle messages from the RivetKit protocol - they handle messages directly in the\n * actor's onWebSocket handler.\n */\nexport function createRawWebSocketDriver(\n\thibernatable: ConnDriver[\"hibernatable\"],\n\tclosePromise: Promise<void>,\n): { driver: ConnDriver; setWebSocket(ws: UniversalWebSocket): void } {\n\tlet websocket: UniversalWebSocket | undefined;\n\n\tconst driver: ConnDriver = {\n\t\ttype: \"raw-websocket\",\n\t\thibernatable,\n\n\t\t// No sendMessage implementation since this is a raw WebSocket that doesn't\n\t\t// handle messages from the RivetKit protocol\n\n\t\tdisconnect: async (\n\t\t\t_actor: AnyActorInstance,\n\t\t\t_conn: AnyConn,\n\t\t\treason?: string,\n\t\t) => {\n\t\t\tif (!websocket) {\n\t\t\t\tloggerWithoutContext().warn(\n\t\t\t\t\t\"disconnecting raw ws without websocket\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Close socket\n\t\t\twebsocket.close(1000, reason);\n\n\t\t\t// Wait for socket to close gracefully\n\t\t\tawait closePromise;\n\t\t},\n\n\t\tterminate: () => {\n\t\t\t(websocket as any)?.terminate?.();\n\t\t},\n\n\t\tgetConnectionReadyState: (\n\t\t\t_actor: AnyActorInstance,\n\t\t\t_conn: AnyConn,\n\t\t): DriverReadyState | undefined => {\n\t\t\treturn websocket?.readyState ?? DriverReadyState.CONNECTING;\n\t\t},\n\t};\n\n\treturn {\n\t\tdriver,\n\t\tsetWebSocket(ws) {\n\t\t\twebsocket = ws;\n\t\t},\n\t};\n}\n","import type { WSContext } from \"hono/ws\";\nimport type { AnyConn } from \"@/actor/conn/mod\";\nimport type { AnyActorInstance } from \"@/actor/instance/mod\";\nimport type { CachedSerializer, Encoding } from \"@/actor/protocol/serde\";\nimport * as errors from \"@/actor/errors\";\nimport { loggerWithoutContext } from \"../../log\";\nimport { type ConnDriver, DriverReadyState } from \"../driver\";\nimport { RegistryConfig } from \"@/registry/config\";\n\nexport type ConnDriverWebSocketState = Record<never, never>;\n\nexport function createWebSocketDriver(\n\thibernatable: ConnDriver[\"hibernatable\"],\n\tencoding: Encoding,\n\tclosePromise: Promise<void>,\n\tconfig: RegistryConfig,\n): { driver: ConnDriver; setWebSocket(ws: WSContext): void } {\n\tloggerWithoutContext().debug({\n\t\tmsg: \"createWebSocketDriver creating driver\",\n\t\thibernatable,\n\t});\n\t// Wait for WS to open\n\tlet websocket: WSContext | undefined;\n\n\tconst driver: ConnDriver = {\n\t\ttype: \"websocket\",\n\t\thibernatable,\n\t\trivetKitProtocol: {\n\t\t\tsendMessage: (\n\t\t\t\tactor: AnyActorInstance,\n\t\t\t\tconn: AnyConn,\n\t\t\t\tmessage: CachedSerializer<any, any, any>,\n\t\t\t) => {\n\t\t\t\tif (!websocket) {\n\t\t\t\t\tactor.rLog.warn({\n\t\t\t\t\t\tmsg: \"websocket not open\",\n\t\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (websocket.readyState !== DriverReadyState.OPEN) {\n\t\t\t\t\tactor.rLog.warn({\n\t\t\t\t\t\tmsg: \"attempting to send message to closed websocket, this is likely a bug in RivetKit\",\n\t\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\t\twsReadyState: websocket.readyState,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst serialized = message.serialize(encoding);\n\n\t\t\t\tactor.rLog.debug({\n\t\t\t\t\tmsg: \"sending websocket message\",\n\t\t\t\t\tencoding: encoding,\n\t\t\t\t\tdataType: typeof serialized,\n\t\t\t\t\tisUint8Array: serialized instanceof Uint8Array,\n\t\t\t\t\tisArrayBuffer: serialized instanceof ArrayBuffer,\n\t\t\t\t\tdataLength:\n\t\t\t\t\t\t(serialized as any).byteLength ||\n\t\t\t\t\t\t(serialized as any).length,\n\t\t\t\t});\n\n\t\t\t\t// Check outgoing message size\n\t\t\t\tconst messageSize =\n\t\t\t\t\t(serialized as any).byteLength || (serialized as any).length;\n\t\t\t\tif (messageSize > config.maxOutgoingMessageSize) {\n\t\t\t\t\tactor.rLog.error({\n\t\t\t\t\t\tmsg: \"outgoing message exceeds maxOutgoingMessageSize\",\n\t\t\t\t\t\tmessageSize,\n\t\t\t\t\t\tmaxOutgoingMessageSize: config.maxOutgoingMessageSize,\n\t\t\t\t\t});\n\t\t\t\t\tthrow new errors.OutgoingMessageTooLong();\n\t\t\t\t}\n\n\t\t\t\t// Convert Uint8Array to ArrayBuffer for proper transmission\n\t\t\t\tif (serialized instanceof Uint8Array) {\n\t\t\t\t\tconst buffer = serialized.buffer.slice(\n\t\t\t\t\t\tserialized.byteOffset,\n\t\t\t\t\t\tserialized.byteOffset + serialized.byteLength,\n\t\t\t\t\t);\n\t\t\t\t\t// Handle SharedArrayBuffer case\n\t\t\t\t\tif (buffer instanceof SharedArrayBuffer) {\n\t\t\t\t\t\tconst arrayBuffer = new ArrayBuffer(buffer.byteLength);\n\t\t\t\t\t\tnew Uint8Array(arrayBuffer).set(new Uint8Array(buffer));\n\t\t\t\t\t\tactor.rLog.debug({\n\t\t\t\t\t\t\tmsg: \"converted SharedArrayBuffer to ArrayBuffer\",\n\t\t\t\t\t\t\tbyteLength: arrayBuffer.byteLength,\n\t\t\t\t\t\t});\n\t\t\t\t\t\twebsocket.send(arrayBuffer);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tactor.rLog.debug({\n\t\t\t\t\t\t\tmsg: \"sending ArrayBuffer\",\n\t\t\t\t\t\t\tbyteLength: buffer.byteLength,\n\t\t\t\t\t\t});\n\t\t\t\t\t\twebsocket.send(buffer);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tactor.rLog.debug({\n\t\t\t\t\t\tmsg: \"sending string data\",\n\t\t\t\t\t\tlength: (serialized as string).length,\n\t\t\t\t\t});\n\t\t\t\t\twebsocket.send(serialized);\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\tdisconnect: async (\n\t\t\t_actor: AnyActorInstance,\n\t\t\t_conn: AnyConn,\n\t\t\treason?: string,\n\t\t) => {\n\t\t\tif (!websocket) {\n\t\t\t\tloggerWithoutContext().warn(\n\t\t\t\t\t\"disconnecting ws without websocket\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Close socket\n\t\t\twebsocket.close(1000, reason);\n\n\t\t\t// Create promise to wait for socket to close gracefully\n\t\t\tawait closePromise;\n\t\t},\n\n\t\tterminate: () => {\n\t\t\t(websocket as any).terminate();\n\t\t},\n\n\t\tgetConnectionReadyState: (\n\t\t\t_actor: AnyActorInstance,\n\t\t\t_conn: AnyConn,\n\t\t): DriverReadyState | undefined => {\n\t\t\treturn websocket?.readyState ?? DriverReadyState.CONNECTING;\n\t\t},\n\t};\n\n\treturn {\n\t\tdriver,\n\t\tsetWebSocket(ws) {\n\t\t\twebsocket = ws;\n\t\t},\n\t};\n}\n","import * as cbor from \"cbor-x\";\nimport { z } from \"zod/v4\";\nimport type { AnyDatabaseProvider } from \"@/actor/database\";\nimport * as errors from \"@/actor/errors\";\nimport {\n\tCachedSerializer,\n\ttype Encoding,\n\ttype InputData,\n} from \"@/actor/protocol/serde\";\nimport { deconstructError } from \"@/common/utils\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tTO_CLIENT_VERSIONED,\n\tTO_SERVER_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype ToClient as ToClientJson,\n\tToClientSchema,\n\ttype ToServer as ToServerJson,\n\tToServerSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { deserializeWithEncoding } from \"@/serde\";\nimport {\n\tassertUnreachable,\n\tbufferToArrayBuffer,\n\tgetEnvUniversal,\n} from \"../../utils\";\nimport { CONN_SEND_MESSAGE_SYMBOL, type Conn } from \"../conn/mod\";\nimport { ActionContext } from \"../contexts\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\n\ninterface MessageEventOpts {\n\tencoding: Encoding;\n\tmaxIncomingMessageSize: number;\n}\n\nexport function getValueLength(value: InputData): number {\n\tif (typeof value === \"string\") {\n\t\treturn value.length;\n\t} else if (value instanceof Blob) {\n\t\treturn value.size;\n\t} else if (\n\t\tvalue instanceof ArrayBuffer ||\n\t\tvalue instanceof SharedArrayBuffer ||\n\t\tvalue instanceof Uint8Array\n\t) {\n\t\treturn value.byteLength;\n\t} else {\n\t\tassertUnreachable(value);\n\t}\n}\n\nexport async function inputDataToBuffer(\n\tdata: InputData,\n): Promise<Uint8Array | string> {\n\tif (typeof data === \"string\") {\n\t\treturn data;\n\t} else if (data instanceof Blob) {\n\t\tconst arrayBuffer = await data.arrayBuffer();\n\t\treturn new Uint8Array(arrayBuffer);\n\t} else if (data instanceof Uint8Array) {\n\t\treturn data;\n\t} else if (\n\t\tdata instanceof ArrayBuffer ||\n\t\tdata instanceof SharedArrayBuffer\n\t) {\n\t\treturn new Uint8Array(data);\n\t} else {\n\t\tthrow new errors.MalformedMessage();\n\t}\n}\n\nexport async function parseMessage(\n\tvalue: InputData,\n\topts: MessageEventOpts,\n): Promise<{\n\tbody:\n\t\t| {\n\t\t\t\ttag: \"ActionRequest\";\n\t\t\t\tval: { id: bigint; name: string; args: unknown };\n\t\t }\n\t\t| {\n\t\t\t\ttag: \"SubscriptionRequest\";\n\t\t\t\tval: { eventName: string; subscribe: boolean };\n\t\t };\n}> {\n\t// Validate value length\n\tconst length = getValueLength(value);\n\tif (length > opts.maxIncomingMessageSize) {\n\t\tthrow new errors.IncomingMessageTooLong();\n\t}\n\n\t// Convert value\n\tlet buffer = await inputDataToBuffer(value);\n\n\t// HACK: For some reason, the output buffer needs to be cloned when using BARE encoding\n\t//\n\t// THis is likely because the input data is of type `Buffer` and there is an inconsistency in implementation that I am not aware of\n\tif (buffer instanceof Buffer) {\n\t\tbuffer = new Uint8Array(buffer);\n\t}\n\n\t// Deserialize message\n\treturn deserializeWithEncoding(\n\t\topts.encoding,\n\t\tbuffer,\n\t\tTO_SERVER_VERSIONED,\n\t\tToServerSchema,\n\t\t// JSON: values are already the correct type\n\t\t(json: ToServerJson): any => json,\n\t\t// BARE: need to decode ArrayBuffer fields back to unknown\n\t\t(bare: protocol.ToServer): any => {\n\t\t\tif (bare.body.tag === \"ActionRequest\") {\n\t\t\t\treturn {\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"ActionRequest\",\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tid: bare.body.val.id,\n\t\t\t\t\t\t\tname: bare.body.val.name,\n\t\t\t\t\t\t\targs: cbor.decode(\n\t\t\t\t\t\t\t\tnew Uint8Array(bare.body.val.args),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t// SubscriptionRequest has no ArrayBuffer fields\n\t\t\t\treturn bare;\n\t\t\t}\n\t\t},\n\t);\n}\n\nexport interface ProcessMessageHandler<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig,\n\tQ extends QueueSchemaConfig,\n> {\n\tonExecuteAction?: (\n\t\tctx: ActionContext<S, CP, CS, V, I, DB, E, Q>,\n\t\tname: string,\n\t\targs: unknown[],\n\t) => Promise<unknown>;\n\tonSubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t) => Promise<void>;\n\tonUnsubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t) => Promise<void>;\n}\n\nexport async function processMessage<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig,\n\tQ extends QueueSchemaConfig,\n>(\n\tmessage: {\n\t\tbody:\n\t\t\t| {\n\t\t\t\t\ttag: \"ActionRequest\";\n\t\t\t\t\tval: { id: bigint; name: string; args: unknown };\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\ttag: \"SubscriptionRequest\";\n\t\t\t\t\tval: { eventName: string; subscribe: boolean };\n\t\t\t };\n\t},\n\tactor: ActorInstance<S, CP, CS, V, I, DB, E, Q>,\n\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\thandler: ProcessMessageHandler<S, CP, CS, V, I, DB, E, Q>,\n) {\n\tlet actionId: bigint | undefined;\n\tlet actionName: string | undefined;\n\n\ttry {\n\t\tif (message.body.tag === \"ActionRequest\") {\n\t\t\t// Action request\n\n\t\t\tif (handler.onExecuteAction === undefined) {\n\t\t\t\tthrow new errors.Unsupported(\"Action\");\n\t\t\t}\n\n\t\t\tconst { id, name, args } = message.body.val;\n\t\t\tactionId = id;\n\t\t\tactionName = name;\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"processing action request\",\n\t\t\t\tactionId: id,\n\t\t\t\tactionName: name,\n\t\t\t});\n\n\t\t\tconst ctx = new ActionContext<S, CP, CS, V, I, DB, E, Q>(\n\t\t\t\tactor,\n\t\t\t\tconn,\n\t\t\t);\n\n\t\t\t// Process the action request and wait for the result\n\t\t\t// This will wait for async actions to complete\n\t\t\tconst output = await handler.onExecuteAction(\n\t\t\t\tctx,\n\t\t\t\tname,\n\t\t\t\targs as unknown[],\n\t\t\t);\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"sending action response\",\n\t\t\t\tactionId: id,\n\t\t\t\tactionName: name,\n\t\t\t\toutputType: typeof output,\n\t\t\t\tisPromise: output instanceof Promise,\n\t\t\t});\n\n\t\t\t// Send the response back to the client\n\t\t\tconn[CONN_SEND_MESSAGE_SYMBOL](\n\t\t\t\tnew CachedSerializer(\n\t\t\t\t\toutput,\n\t\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\t\tToClientSchema,\n\t\t\t\t\t// JSON: output is the raw value\n\t\t\t\t\t(value): ToClientJson => ({\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ActionResponse\" as const,\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\toutput: value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\t// BARE/CBOR: output needs to be CBOR-encoded to ArrayBuffer\n\t\t\t\t\t(value): protocol.ToClient => ({\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ActionResponse\" as const,\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\toutput: bufferToArrayBuffer(cbor.encode(value)),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tactor.rLog.debug({ msg: \"action response sent\", id, name: name });\n\t\t} else if (message.body.tag === \"SubscriptionRequest\") {\n\t\t\t// Subscription request\n\n\t\t\tif (\n\t\t\t\thandler.onSubscribe === undefined ||\n\t\t\t\thandler.onUnsubscribe === undefined\n\t\t\t) {\n\t\t\t\tthrow new errors.Unsupported(\"Subscriptions\");\n\t\t\t}\n\n\t\t\tconst { eventName, subscribe } = message.body.val;\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"processing subscription request\",\n\t\t\t\teventName,\n\t\t\t\tsubscribe,\n\t\t\t});\n\n\t\t\t\tif (subscribe) {\n\t\t\t\t\tawait actor.assertCanSubscribe(\n\t\t\t\t\t\tnew ActionContext<S, CP, CS, V, I, DB, E, Q>(\n\t\t\t\t\t\t\tactor,\n\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t),\n\t\t\t\t\t\teventName,\n\t\t\t\t\t);\n\t\t\t\t\tawait handler.onSubscribe(eventName, conn);\n\t\t\t\t} else {\n\t\t\t\t\tawait handler.onUnsubscribe(eventName, conn);\n\t\t\t\t}\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"subscription request completed\",\n\t\t\t\teventName,\n\t\t\t\tsubscribe,\n\t\t\t});\n\t\t} else {\n\t\t\tassertUnreachable(message.body);\n\t\t}\n\t} catch (error) {\n\t\tconst { group, code, message, metadata } = deconstructError(\n\t\t\terror,\n\t\t\tactor.rLog,\n\t\t\t{\n\t\t\t\tconnectionId: conn.id,\n\t\t\t\tactionId,\n\t\t\t\tactionName,\n\t\t\t},\n\t\t\tgetEnvUniversal(\"RIVET_EXPOSE_ERRORS\") === \"1\" ||\n\t\t\t\tgetEnvUniversal(\"NODE_ENV\") === \"development\",\n\t\t);\n\n\t\tactor.rLog.debug({\n\t\t\tmsg: \"sending error response\",\n\t\t\tactionId,\n\t\t\tactionName,\n\t\t\tcode,\n\t\t\tmessage,\n\t\t});\n\n\t\t// Build response\n\t\tconst errorData = { group, code, message, metadata, actionId };\n\t\tconn[CONN_SEND_MESSAGE_SYMBOL](\n\t\t\tnew CachedSerializer(\n\t\t\t\terrorData,\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\tToClientSchema,\n\t\t\t\t// JSON: metadata is the raw value (keep as undefined if not present)\n\t\t\t\t(value): ToClientJson => {\n\t\t\t\t\tconst val: any = {\n\t\t\t\t\t\tgroup: value.group,\n\t\t\t\t\t\tcode: value.code,\n\t\t\t\t\t\tmessage: value.message,\n\t\t\t\t\t\tactionId:\n\t\t\t\t\t\t\tvalue.actionId !== undefined\n\t\t\t\t\t\t\t\t? value.actionId\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t};\n\t\t\t\t\tif (value.metadata !== undefined) {\n\t\t\t\t\t\tval.metadata = value.metadata;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Error\" as const,\n\t\t\t\t\t\t\tval,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\t// BARE/CBOR: metadata needs to be CBOR-encoded to ArrayBuffer\n\t\t\t\t// Note: protocol.Error expects `| null` for optional fields (BARE protocol)\n\t\t\t\t(value): protocol.ToClient => ({\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Error\" as const,\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tgroup: value.group,\n\t\t\t\t\t\t\tcode: value.code,\n\t\t\t\t\t\t\tmessage: value.message,\n\t\t\t\t\t\t\tmetadata: value.metadata\n\t\t\t\t\t\t\t\t? bufferToArrayBuffer(\n\t\t\t\t\t\t\t\t\t\tcbor.encode(value.metadata),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tactionId:\n\t\t\t\t\t\t\t\tvalue.actionId !== undefined\n\t\t\t\t\t\t\t\t\t? value.actionId\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\n\t\tactor.rLog.debug({ msg: \"error response sent\", actionId, actionName });\n\t}\n}\n\n///**\n// * Use `CachedSerializer` if serializing the same data repeatedly.\n// */\n//export 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//\n//export async function deserialize(data: InputData, encoding: Encoding) {\n//\tif (encoding === \"json\") {\n//\t\tif (typeof data !== \"string\") {\n//\t\t\tactor.rLog.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\tactor.rLog.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","import * as cbor from \"cbor-x\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tTO_CLIENT_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype ToClient as ToClientJson,\n\tToClientSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport { EventPayloadInvalid, InternalError } from \"../errors\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport { CachedSerializer } from \"../protocol/serde\";\nimport {\n\ttype EventSchemaConfig,\n\thasSchemaConfigKey,\n\ttype InferEventArgs,\n\ttype InferSchemaMap,\n\ttype QueueSchemaConfig,\n\tvalidateSchemaSync,\n} from \"../schema\";\nimport type { ConnDriver } from \"./driver\";\nimport { type ConnDataInput, StateManager } from \"./state-manager\";\n\nexport type ConnId = string;\n\nexport type AnyConn = Conn<any, any, any, any, any, any, any, any>;\n\nexport const CONN_CONNECTED_SYMBOL = Symbol(\"connected\");\nexport const CONN_SPEAKS_RIVETKIT_SYMBOL = Symbol(\"speaksRivetKit\");\nexport const CONN_DRIVER_SYMBOL = Symbol(\"driver\");\nexport const CONN_ACTOR_SYMBOL = Symbol(\"actor\");\nexport const CONN_STATE_MANAGER_SYMBOL = Symbol(\"stateManager\");\nexport const CONN_SEND_MESSAGE_SYMBOL = Symbol(\"sendMessage\");\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.dev/docs/connections|Connection Documentation}\n */\nexport class Conn<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;\n\n\tget [CONN_ACTOR_SYMBOL](): ActorInstance<S, CP, CS, V, I, DB, E, Q> {\n\t\treturn this.#actor;\n\t}\n\n\t#stateManager!: StateManager<CP, CS>;\n\n\tget [CONN_STATE_MANAGER_SYMBOL]() {\n\t\treturn this.#stateManager;\n\t}\n\n\t/**\n\t * Connections exist before being connected to an actor. If true, this\n\t * connection has been connected.\n\t **/\n\t[CONN_CONNECTED_SYMBOL] = false;\n\n\t/**\n\t * If undefined, then no socket is connected to this conn\n\t */\n\t[CONN_DRIVER_SYMBOL]?: ConnDriver;\n\n\t/**\n\t * If this connection is speaking the RivetKit protocol. If false, this is\n\t * a raw connection for WebSocket or fetch or inspector.\n\t **/\n\tget [CONN_SPEAKS_RIVETKIT_SYMBOL](): boolean {\n\t\treturn this[CONN_DRIVER_SYMBOL]?.rivetKitProtocol !== undefined;\n\t}\n\n\tsubscriptions: Set<string> = new Set<string>();\n\n\t#assertConnected() {\n\t\tif (!this[CONN_CONNECTED_SYMBOL])\n\t\t\tthrow new InternalError(\n\t\t\t\t\"Connection not connected yet. This happens when trying to use the connection in onBeforeConnect or createConnState.\",\n\t\t\t);\n\t}\n\n\t// MARK: - Public Getters\n\tget params(): CP {\n\t\treturn this.#stateManager.ephemeralData.parameters;\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\tget state(): CS {\n\t\treturn this.#stateManager.state;\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\tset state(value: CS) {\n\t\tthis.#stateManager.state = value;\n\t}\n\n\t/**\n\t * Unique identifier for the connection.\n\t */\n\tget id(): ConnId {\n\t\treturn this.#stateManager.ephemeralData.id;\n\t}\n\n\t/**\n\t * @experimental\n\t *\n\t * If the underlying connection can hibernate.\n\t */\n\tget isHibernatable(): boolean {\n\t\treturn this.#stateManager.hibernatableDataRaw !== undefined;\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\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, DB, E, Q>,\n\t\tdata: ConnDataInput<CP, CS>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#stateManager = new StateManager(this, data);\n\t}\n\n\t/**\n\t * Sends a raw message to the underlying connection.\n\t */\n\t[CONN_SEND_MESSAGE_SYMBOL](message: CachedSerializer<any, any, any>) {\n\t\tif (this[CONN_DRIVER_SYMBOL]) {\n\t\t\tconst driver = this[CONN_DRIVER_SYMBOL];\n\n\t\t\tif (driver.rivetKitProtocol) {\n\t\t\t\tdriver.rivetKitProtocol.sendMessage(this.#actor, this, message);\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.warn({\n\t\t\t\t\tmsg: \"attempting to send RivetKit protocol message to connection that does not support it\",\n\t\t\t\t\tconn: this.id,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"missing connection driver state for send message\",\n\t\t\t\tconn: this.id,\n\t\t\t});\n\t\t}\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.dev/docs/events|Events Documentation}\n\t */\n\tsend<K extends keyof E & string>(\n\t\teventName: K,\n\t\t...args: InferEventArgs<InferSchemaMap<E>[K]>\n\t): void;\n\tsend(\n\t\teventName: keyof E extends never ? string : never,\n\t\t...args: unknown[]\n\t): void;\n\tsend(eventName: string, ...args: unknown[]) {\n\t\tthis.#assertConnected();\n\t\tif (!this[CONN_SPEAKS_RIVETKIT_SYMBOL]) {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"cannot send messages to this connection type\",\n\t\t\t\tconnId: this.id,\n\t\t\t\tconnType: this[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tthis.#actor.config.events !== undefined &&\n\t\t\t!hasSchemaConfigKey(this.#actor.config.events, eventName)\n\t\t) {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"sending event not defined in actor events config\",\n\t\t\t\teventName,\n\t\t\t\tconnId: this.id,\n\t\t\t});\n\t\t}\n\n\t\tconst payload = args.length === 1 ? args[0] : args;\n\t\tconst result = validateSchemaSync(\n\t\t\tthis.#actor.config.events,\n\t\t\teventName as keyof E & string,\n\t\t\tpayload,\n\t\t);\n\t\tif (!result.success) {\n\t\t\tthrow new EventPayloadInvalid(eventName, result.issues);\n\t\t}\n\t\tconst eventArgs =\n\t\t\targs.length === 1\n\t\t\t\t? [result.data]\n\t\t\t\t: Array.isArray(result.data)\n\t\t\t\t\t? (result.data as unknown[])\n\t\t\t\t\t: args;\n\t\tthis.#actor.emitTraceEvent(\"message.send\", {\n\t\t\t\"rivet.event.name\": eventName,\n\t\t\t\"rivet.conn.id\": this.id,\n\t\t});\n\t\tconst eventData = { name: eventName, args: eventArgs };\n\t\tthis[CONN_SEND_MESSAGE_SYMBOL](\n\t\t\tnew CachedSerializer(\n\t\t\t\teventData,\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\tToClientSchema,\n\t\t\t\t// JSON: args is the raw value (array of arguments)\n\t\t\t\t(value): ToClientJson => ({\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\t\targs: value.args,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\t// BARE/CBOR: args needs to be CBOR-encoded to ArrayBuffer\n\t\t\t\t(value): protocol.ToClient => ({\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(value.args)),\n\t\t\t\t\t\t},\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\tasync disconnect(reason?: string) {\n\t\tif (this[CONN_DRIVER_SYMBOL]) {\n\t\t\tconst driver = this[CONN_DRIVER_SYMBOL];\n\t\t\tif (driver.disconnect) {\n\t\t\t\tdriver.disconnect(this.#actor, this, reason);\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.debug({\n\t\t\t\t\tmsg: \"no disconnect handler for conn driver\",\n\t\t\t\t\tconn: this.id,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait this.#actor.connectionManager.connDisconnected(this);\n\t\t\t} finally {\n\t\t\t\tthis[CONN_DRIVER_SYMBOL] = undefined;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"missing connection driver state for disconnect\",\n\t\t\t\tconn: this.id,\n\t\t\t});\n\t\t\tthis[CONN_DRIVER_SYMBOL] = undefined;\n\t\t}\n\t}\n}\n","import type { HibernatingWebSocketMetadata } from \"@rivetkit/engine-runner\";\nimport onChange from \"@rivetkit/on-change\";\nimport * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport { isCborSerializable } from \"@/common/utils\";\nimport * as errors from \"../errors\";\nimport { assertUnreachable } from \"../utils\";\nimport { CONN_ACTOR_SYMBOL, type Conn } from \"./mod\";\nimport type { PersistedConn } from \"./persisted\";\n\n/** Pick a subset of persisted data used to represent ephemeral connections */\nexport type EphemeralConn<CP, CS> = Pick<\n\tPersistedConn<CP, CS>,\n\t\"id\" | \"parameters\" | \"state\"\n>;\n\nexport type ConnDataInput<CP, CS> =\n\t| { ephemeral: EphemeralConn<CP, CS> }\n\t| { hibernatable: PersistedConn<CP, CS> };\n\nexport type ConnData<CP, CS> =\n\t| {\n\t\t\tephemeral: {\n\t\t\t\t/** In-memory data representing this connection */\n\t\t\t\tdata: EphemeralConn<CP, CS>;\n\t\t\t};\n\t }\n\t| {\n\t\t\thibernatable: {\n\t\t\t\t/** Persisted data with on-change proxy */\n\t\t\t\tdata: PersistedConn<CP, CS>;\n\t\t\t\t/** Raw persisted data without proxy */\n\t\t\t\tdataRaw: PersistedConn<CP, CS>;\n\t\t\t};\n\t };\n\n/**\n * Manages connection state persistence, proxying, and change tracking.\n * Handles automatic state change detection for connection-specific state.\n */\nexport class StateManager<CP, CS> {\n\t#conn: Conn<any, CP, CS, any, any, any, any, any>;\n\n\t/**\n\t * Data representing this connection.\n\t *\n\t * This is stored as a struct for both ephemeral and hibernatable conns in\n\t * order to keep the separation clear between the two.\n\t */\n\t#data!: ConnData<CP, CS>;\n\n\tconstructor(\n\t\tconn: Conn<any, CP, CS, any, any, any, any, any>,\n\t\tdata: ConnDataInput<CP, CS>,\n\t) {\n\t\tthis.#conn = conn;\n\n\t\tif (\"ephemeral\" in data) {\n\t\t\tthis.#data = { ephemeral: { data: data.ephemeral } };\n\t\t} else if (\"hibernatable\" in data) {\n\t\t\t// Listen for changes to the object\n\t\t\tconst persistRaw = data.hibernatable;\n\t\t\tconst persist = onChange(\n\t\t\t\tpersistRaw,\n\t\t\t\t(\n\t\t\t\t\tpath: string,\n\t\t\t\t\tvalue: any,\n\t\t\t\t\t_previousValue: any,\n\t\t\t\t\t_applyData: any,\n\t\t\t\t) => {\n\t\t\t\t\tthis.#handleChange(path, value);\n\t\t\t\t},\n\t\t\t\t{ ignoreDetached: true },\n\t\t\t);\n\t\t\tthis.#data = {\n\t\t\t\thibernatable: { data: persist, dataRaw: persistRaw },\n\t\t\t};\n\t\t} else {\n\t\t\tassertUnreachable(data);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the ephemeral or persisted data for this connectioned.\n\t *\n\t * This property is used to be able to treat both memory & persist conns\n\t * identical by looking up the correct underlying data structure.\n\t */\n\tget ephemeralData(): EphemeralConn<CP, CS> {\n\t\tif (\"hibernatable\" in this.#data) {\n\t\t\treturn this.#data.hibernatable.data;\n\t\t} else if (\"ephemeral\" in this.#data) {\n\t\t\treturn this.#data.ephemeral.data;\n\t\t} else {\n\t\t\treturn assertUnreachable(this.#data);\n\t\t}\n\t}\n\n\tget hibernatableData(): PersistedConn<CP, CS> | undefined {\n\t\tif (\"hibernatable\" in this.#data) {\n\t\t\treturn this.#data.hibernatable.data;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\thibernatableDataOrError(): PersistedConn<CP, CS> {\n\t\tconst hibernatable = this.hibernatableData;\n\t\tinvariant(hibernatable, \"missing hibernatable data\");\n\t\treturn hibernatable;\n\t}\n\n\tget hibernatableDataRaw(): PersistedConn<CP, CS> | undefined {\n\t\tif (\"hibernatable\" in this.#data) {\n\t\t\treturn this.#data.hibernatable.dataRaw;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tget stateEnabled(): boolean {\n\t\treturn this.#conn[CONN_ACTOR_SYMBOL].connStateEnabled;\n\t}\n\n\tget state(): CS {\n\t\tthis.#validateStateEnabled();\n\t\tconst state = this.ephemeralData.state;\n\t\tif (!state) throw new Error(\"state should exists\");\n\t\treturn state;\n\t}\n\n\tset state(value: CS) {\n\t\tthis.#validateStateEnabled();\n\t\tthis.ephemeralData.state = value;\n\t}\n\n\t#validateStateEnabled() {\n\t\tif (!this.#conn[CONN_ACTOR_SYMBOL].connStateEnabled) {\n\t\t\tthrow new errors.ConnStateNotEnabled();\n\t\t}\n\t}\n\n\t#handleChange(path: string, value: any) {\n\t\t// NOTE: This will only be called for hibernatable conns since only\n\t\t// hibernatable conns have the on-change proxy\n\n\t\t// Validate CBOR serializability for state changes\n\t\tif (path.startsWith(\"state\")) {\n\t\t\tlet invalidPath = \"\";\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\tvalue,\n\t\t\t\t\t(invalidPathPart: string) => {\n\t\t\t\t\t\tinvalidPath = invalidPathPart;\n\t\t\t\t\t},\n\t\t\t\t\t\"\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new errors.InvalidStateType({\n\t\t\t\t\tpath: path + (invalidPath ? `.${invalidPath}` : \"\"),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.#conn[CONN_ACTOR_SYMBOL].rLog.debug({\n\t\t\tmsg: \"conn onChange triggered\",\n\t\t\tconnId: this.#conn.id,\n\t\t\tpath,\n\t\t});\n\n\t\t// Notify actor that this connection has changed\n\t\tthis.#conn[\n\t\t\tCONN_ACTOR_SYMBOL\n\t\t].connectionManager.markConnWithPersistChanged(this.#conn);\n\t}\n\n\taddSubscription({ eventName }: { eventName: string }) {\n\t\tconst hibernatable = this.hibernatableData;\n\t\tif (!hibernatable) return;\n\t\thibernatable.subscriptions.push({\n\t\t\teventName,\n\t\t});\n\t}\n\n\tremoveSubscription({ eventName }: { eventName: string }) {\n\t\tconst hibernatable = this.hibernatableData;\n\t\tif (!hibernatable) return;\n\t\tconst subIdx = hibernatable.subscriptions.findIndex(\n\t\t\t(s) => s.eventName === eventName,\n\t\t);\n\t\tif (subIdx !== -1) {\n\t\t\thibernatable.subscriptions.splice(subIdx, 1);\n\t\t}\n\t\treturn subIdx !== -1;\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"actor-manager\");\n}\n","import * as cbor from \"cbor-x\";\nimport { KEYS } from \"@/actor/instance/keys\";\nimport type * as persistSchema from \"@/schemas/actor-persist/mod\";\nimport {\n\tACTOR_VERSIONED,\n\tCURRENT_VERSION,\n} from \"@/schemas/actor-persist/versioned\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { ActorDriver } from \"./mod\";\nimport type { SqliteVfs } from \"@rivetkit/sqlite-vfs\";\n\nfunction serializeEmptyPersistData(input: unknown | undefined): Uint8Array {\n\tconst persistData: persistSchema.Actor = {\n\t\tinput:\n\t\t\tinput !== undefined\n\t\t\t\t? bufferToArrayBuffer(cbor.encode(input))\n\t\t\t\t: null,\n\t\thasInitialized: false,\n\t\tstate: bufferToArrayBuffer(cbor.encode(undefined)),\n\t\tscheduledEvents: [],\n\t};\n\treturn ACTOR_VERSIONED.serializeWithEmbeddedVersion(\n\t\tpersistData,\n\t\tCURRENT_VERSION,\n\t);\n}\n\n/**\n * Returns the initial KV state for a new actor. This is ued by the drivers to\n * write the initial state in to KV storage before starting the actor.\n */\nexport function getInitialActorKvState(\n\tinput: unknown | undefined,\n): [Uint8Array, Uint8Array][] {\n\tconst persistData = serializeEmptyPersistData(input);\n\treturn [[KEYS.PERSIST_DATA, persistData]];\n}\n\n/**\n * Dynamically import @rivetkit/sqlite-vfs and return a fresh SqliteVfs instance.\n *\n * The module specifier is built with Array.join() so that bundlers (esbuild, tsup,\n * Turbopack) cannot statically analyze or constant-fold the import path. This\n * prevents them from tracing into the WASM dependency tree, which would cause\n * errors in environments that don't support .wasm imports (e.g. Turbopack).\n *\n * Each call returns a new instance so that actors get independent SQLite modules,\n * avoiding cross-actor re-entry on the non-reentrant async build.\n */\nexport async function importSqliteVfs(): Promise<SqliteVfs> {\n\tconst specifier = [\"@rivetkit\", \"sqlite-vfs\"].join(\"/\");\n\tconst { SqliteVfs } = await import(specifier);\n\treturn new SqliteVfs();\n}\n","import { createVersionedDataHandler } from \"vbare\";\nimport * as v1 from \"../../../dist/schemas/actor-persist/v1\";\nimport * as v2 from \"../../../dist/schemas/actor-persist/v2\";\nimport * as v3 from \"../../../dist/schemas/actor-persist/v3\";\nimport * as v4 from \"../../../dist/schemas/actor-persist/v4\";\n\nexport const CURRENT_VERSION = 4;\n\n// Converter from v1 to v2\nconst v1ToV2 = (v1Data: v1.PersistedActor): v2.PersistedActor => ({\n\t...v1Data,\n\tconnections: v1Data.connections.map((conn) => ({\n\t\t...conn,\n\t\thibernatableRequestId: null,\n\t})),\n\thibernatableWebSockets: [],\n});\n\n// Converter from v2 to v3\nconst v2ToV3 = (v2Data: v2.PersistedActor): v3.Actor => {\n\t// Transform scheduled events from nested structure to flat structure\n\tconst scheduledEvents: v3.ScheduleEvent[] = v2Data.scheduledEvents.map(\n\t\t(event) => {\n\t\t\t// Extract action and args from the kind wrapper\n\t\t\tif (event.kind.tag === \"GenericPersistedScheduleEvent\") {\n\t\t\t\treturn {\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\ttimestamp: event.timestamp,\n\t\t\t\t\taction: event.kind.val.action,\n\t\t\t\t\targs: event.kind.val.args,\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Fallback for unknown kinds\n\t\t\tthrow new Error(`Unknown schedule event kind: ${event.kind.tag}`);\n\t\t},\n\t);\n\n\treturn {\n\t\tinput: v2Data.input,\n\t\thasInitialized: v2Data.hasInitialized,\n\t\tstate: v2Data.state,\n\t\tscheduledEvents,\n\t};\n};\n\n// Converter from v3 to v4: No changes to Actor structure\nconst v3ToV4 = (v3Data: v3.Actor): v4.Actor => {\n\treturn v3Data as unknown as v4.Actor;\n};\n\n// Converter from v4 to v3: No changes to Actor structure\nconst v4ToV3 = (v4Data: v4.Actor): v3.Actor => {\n\treturn v4Data as unknown as v3.Actor;\n};\n\n// Converter from v3 to v2\nconst v3ToV2 = (v3Data: v3.Actor): v2.PersistedActor => {\n\t// Transform scheduled events from flat structure back to nested structure\n\tconst scheduledEvents: v2.PersistedScheduleEvent[] =\n\t\tv3Data.scheduledEvents.map((event) => ({\n\t\t\teventId: event.eventId,\n\t\t\ttimestamp: event.timestamp,\n\t\t\tkind: {\n\t\t\t\ttag: \"GenericPersistedScheduleEvent\" as const,\n\t\t\t\tval: {\n\t\t\t\t\taction: event.action,\n\t\t\t\t\targs: event.args,\n\t\t\t\t},\n\t\t\t},\n\t\t}));\n\n\treturn {\n\t\tinput: v3Data.input,\n\t\thasInitialized: v3Data.hasInitialized,\n\t\tstate: v3Data.state,\n\t\tscheduledEvents,\n\t\tconnections: [],\n\t\thibernatableWebSockets: [],\n\t};\n};\n\n// Converter from v2 to v1\nconst v2ToV1 = (v2Data: v2.PersistedActor): v1.PersistedActor => {\n\treturn {\n\t\tinput: v2Data.input,\n\t\thasInitialized: v2Data.hasInitialized,\n\t\tstate: v2Data.state,\n\t\tscheduledEvents: v2Data.scheduledEvents,\n\t\tconnections: v2Data.connections.map((conn) => {\n\t\t\tconst { hibernatableRequestId, ...rest } = conn;\n\t\t\treturn rest;\n\t\t}),\n\t};\n};\n\nexport const ACTOR_VERSIONED = createVersionedDataHandler<v4.Actor>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.decodePersistedActor(bytes);\n\t\t\tcase 2:\n\t\t\t\treturn v2.decodePersistedActor(bytes);\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeActor(bytes);\n\t\t\tcase 4:\n\t\t\t\treturn v4.decodeActor(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.encodePersistedActor(data as v1.PersistedActor);\n\t\t\tcase 2:\n\t\t\t\treturn v2.encodePersistedActor(data as v2.PersistedActor);\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeActor(data as v3.Actor);\n\t\t\tcase 4:\n\t\t\t\treturn v4.encodeActor(data as v4.Actor);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tdeserializeConverters: () => [v1ToV2, v2ToV3, v3ToV4],\n\tserializeConverters: () => [v4ToV3, v3ToV2, v2ToV1],\n});\n\n// Conn identity converters (Conn is identical between v3 and v4)\nconst v3ConnToV4 = (v3Data: v3.Conn): v4.Conn => {\n\treturn v3Data as unknown as v4.Conn;\n};\n\nconst v4ConnToV3 = (v4Data: v4.Conn): v3.Conn => {\n\treturn v4Data as unknown as v3.Conn;\n};\n\nexport const CONN_VERSIONED = createVersionedDataHandler<v4.Conn>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeConn(bytes);\n\t\t\tcase 4:\n\t\t\t\treturn v4.decodeConn(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Conn type only exists in version 3+, got version ${version}`,\n\t\t\t\t);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeConn(data as v3.Conn);\n\t\t\tcase 4:\n\t\t\t\treturn v4.encodeConn(data as v4.Conn);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Conn type only exists in version 3+, got version ${version}`,\n\t\t\t\t);\n\t\t}\n\t},\n\tdeserializeConverters: () => [v3ConnToV4],\n\tserializeConverters: () => [v4ConnToV3],\n});\n\nexport const QUEUE_METADATA_VERSIONED =\n\tcreateVersionedDataHandler<v4.QueueMetadata>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 4:\n\t\t\t\t\treturn v4.decodeQueueMetadata(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`QueueMetadata type only exists in version 4+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 4:\n\t\t\t\t\treturn v4.encodeQueueMetadata(data as v4.QueueMetadata);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`QueueMetadata type only exists in version 4+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const QUEUE_MESSAGE_VERSIONED =\n\tcreateVersionedDataHandler<v4.QueueMessage>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 4:\n\t\t\t\t\treturn v4.decodeQueueMessage(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`QueueMessage type only exists in version 4+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 4:\n\t\t\t\t\treturn v4.encodeQueueMessage(data as v4.QueueMessage);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`QueueMessage type only exists in version 4+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type u64 = bigint\n\nexport type PersistedSubscription = {\n readonly eventName: string,\n}\n\nexport function readPersistedSubscription(bc: bare.ByteCursor): PersistedSubscription {\n return {\n eventName: bare.readString(bc),\n }\n}\n\nexport function writePersistedSubscription(bc: bare.ByteCursor, x: PersistedSubscription): void {\n bare.writeString(bc, x.eventName)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly PersistedSubscription[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedSubscription(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedSubscription(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly PersistedSubscription[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedSubscription(bc, x[i])\n }\n}\n\nexport type PersistedConnection = {\n readonly id: string,\n readonly token: string,\n readonly parameters: ArrayBuffer,\n readonly state: ArrayBuffer,\n readonly subscriptions: readonly PersistedSubscription[],\n readonly lastSeen: u64,\n}\n\nexport function readPersistedConnection(bc: bare.ByteCursor): PersistedConnection {\n return {\n id: bare.readString(bc),\n token: bare.readString(bc),\n parameters: bare.readData(bc),\n state: bare.readData(bc),\n subscriptions: read0(bc),\n lastSeen: bare.readU64(bc),\n }\n}\n\nexport function writePersistedConnection(bc: bare.ByteCursor, x: PersistedConnection): void {\n bare.writeString(bc, x.id)\n bare.writeString(bc, x.token)\n bare.writeData(bc, x.parameters)\n bare.writeData(bc, x.state)\n write0(bc, x.subscriptions)\n bare.writeU64(bc, x.lastSeen)\n}\n\nfunction read1(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nexport type GenericPersistedScheduleEvent = {\n readonly action: string,\n readonly args: ArrayBuffer | null,\n}\n\nexport function readGenericPersistedScheduleEvent(bc: bare.ByteCursor): GenericPersistedScheduleEvent {\n return {\n action: bare.readString(bc),\n args: read1(bc),\n }\n}\n\nexport function writeGenericPersistedScheduleEvent(bc: bare.ByteCursor, x: GenericPersistedScheduleEvent): void {\n bare.writeString(bc, x.action)\n write1(bc, x.args)\n}\n\nexport type PersistedScheduleEventKind =\n | { readonly tag: \"GenericPersistedScheduleEvent\", readonly val: GenericPersistedScheduleEvent }\n\nexport function readPersistedScheduleEventKind(bc: bare.ByteCursor): PersistedScheduleEventKind {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"GenericPersistedScheduleEvent\", val: readGenericPersistedScheduleEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writePersistedScheduleEventKind(bc: bare.ByteCursor, x: PersistedScheduleEventKind): void {\n switch (x.tag) {\n case \"GenericPersistedScheduleEvent\": {\n bare.writeU8(bc, 0)\n writeGenericPersistedScheduleEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type PersistedScheduleEvent = {\n readonly eventId: string,\n readonly timestamp: u64,\n readonly kind: PersistedScheduleEventKind,\n}\n\nexport function readPersistedScheduleEvent(bc: bare.ByteCursor): PersistedScheduleEvent {\n return {\n eventId: bare.readString(bc),\n timestamp: bare.readU64(bc),\n kind: readPersistedScheduleEventKind(bc),\n }\n}\n\nexport function writePersistedScheduleEvent(bc: bare.ByteCursor, x: PersistedScheduleEvent): void {\n bare.writeString(bc, x.eventId)\n bare.writeU64(bc, x.timestamp)\n writePersistedScheduleEventKind(bc, x.kind)\n}\n\nfunction read2(bc: bare.ByteCursor): readonly PersistedConnection[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedConnection(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedConnection(bc)\n }\n return result\n}\n\nfunction write2(bc: bare.ByteCursor, x: readonly PersistedConnection[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedConnection(bc, x[i])\n }\n}\n\nfunction read3(bc: bare.ByteCursor): readonly PersistedScheduleEvent[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedScheduleEvent(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedScheduleEvent(bc)\n }\n return result\n}\n\nfunction write3(bc: bare.ByteCursor, x: readonly PersistedScheduleEvent[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedScheduleEvent(bc, x[i])\n }\n}\n\nexport type PersistedActor = {\n readonly input: ArrayBuffer | null,\n readonly hasInitialized: boolean,\n readonly state: ArrayBuffer,\n readonly connections: readonly PersistedConnection[],\n readonly scheduledEvents: readonly PersistedScheduleEvent[],\n}\n\nexport function readPersistedActor(bc: bare.ByteCursor): PersistedActor {\n return {\n input: read1(bc),\n hasInitialized: bare.readBool(bc),\n state: bare.readData(bc),\n connections: read2(bc),\n scheduledEvents: read3(bc),\n }\n}\n\nexport function writePersistedActor(bc: bare.ByteCursor, x: PersistedActor): void {\n write1(bc, x.input)\n bare.writeBool(bc, x.hasInitialized)\n bare.writeData(bc, x.state)\n write2(bc, x.connections)\n write3(bc, x.scheduledEvents)\n}\n\nexport function encodePersistedActor(x: PersistedActor): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writePersistedActor(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodePersistedActor(bytes: Uint8Array): PersistedActor {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readPersistedActor(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type i64 = bigint\n\nexport type PersistedSubscription = {\n readonly eventName: string,\n}\n\nexport function readPersistedSubscription(bc: bare.ByteCursor): PersistedSubscription {\n return {\n eventName: bare.readString(bc),\n }\n}\n\nexport function writePersistedSubscription(bc: bare.ByteCursor, x: PersistedSubscription): void {\n bare.writeString(bc, x.eventName)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly PersistedSubscription[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedSubscription(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedSubscription(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly PersistedSubscription[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedSubscription(bc, x[i])\n }\n}\n\nfunction read1(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nexport type PersistedConnection = {\n readonly id: string,\n readonly token: string,\n readonly parameters: ArrayBuffer,\n readonly state: ArrayBuffer,\n readonly subscriptions: readonly PersistedSubscription[],\n readonly lastSeen: i64,\n readonly hibernatableRequestId: ArrayBuffer | null,\n}\n\nexport function readPersistedConnection(bc: bare.ByteCursor): PersistedConnection {\n return {\n id: bare.readString(bc),\n token: bare.readString(bc),\n parameters: bare.readData(bc),\n state: bare.readData(bc),\n subscriptions: read0(bc),\n lastSeen: bare.readI64(bc),\n hibernatableRequestId: read1(bc),\n }\n}\n\nexport function writePersistedConnection(bc: bare.ByteCursor, x: PersistedConnection): void {\n bare.writeString(bc, x.id)\n bare.writeString(bc, x.token)\n bare.writeData(bc, x.parameters)\n bare.writeData(bc, x.state)\n write0(bc, x.subscriptions)\n bare.writeI64(bc, x.lastSeen)\n write1(bc, x.hibernatableRequestId)\n}\n\nexport type GenericPersistedScheduleEvent = {\n readonly action: string,\n readonly args: ArrayBuffer | null,\n}\n\nexport function readGenericPersistedScheduleEvent(bc: bare.ByteCursor): GenericPersistedScheduleEvent {\n return {\n action: bare.readString(bc),\n args: read1(bc),\n }\n}\n\nexport function writeGenericPersistedScheduleEvent(bc: bare.ByteCursor, x: GenericPersistedScheduleEvent): void {\n bare.writeString(bc, x.action)\n write1(bc, x.args)\n}\n\nexport type PersistedScheduleEventKind =\n | { readonly tag: \"GenericPersistedScheduleEvent\", readonly val: GenericPersistedScheduleEvent }\n\nexport function readPersistedScheduleEventKind(bc: bare.ByteCursor): PersistedScheduleEventKind {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"GenericPersistedScheduleEvent\", val: readGenericPersistedScheduleEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writePersistedScheduleEventKind(bc: bare.ByteCursor, x: PersistedScheduleEventKind): void {\n switch (x.tag) {\n case \"GenericPersistedScheduleEvent\": {\n bare.writeU8(bc, 0)\n writeGenericPersistedScheduleEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type PersistedScheduleEvent = {\n readonly eventId: string,\n readonly timestamp: i64,\n readonly kind: PersistedScheduleEventKind,\n}\n\nexport function readPersistedScheduleEvent(bc: bare.ByteCursor): PersistedScheduleEvent {\n return {\n eventId: bare.readString(bc),\n timestamp: bare.readI64(bc),\n kind: readPersistedScheduleEventKind(bc),\n }\n}\n\nexport function writePersistedScheduleEvent(bc: bare.ByteCursor, x: PersistedScheduleEvent): void {\n bare.writeString(bc, x.eventId)\n bare.writeI64(bc, x.timestamp)\n writePersistedScheduleEventKind(bc, x.kind)\n}\n\nexport type PersistedHibernatableWebSocket = {\n readonly requestId: ArrayBuffer,\n readonly lastSeenTimestamp: i64,\n readonly msgIndex: i64,\n}\n\nexport function readPersistedHibernatableWebSocket(bc: bare.ByteCursor): PersistedHibernatableWebSocket {\n return {\n requestId: bare.readData(bc),\n lastSeenTimestamp: bare.readI64(bc),\n msgIndex: bare.readI64(bc),\n }\n}\n\nexport function writePersistedHibernatableWebSocket(bc: bare.ByteCursor, x: PersistedHibernatableWebSocket): void {\n bare.writeData(bc, x.requestId)\n bare.writeI64(bc, x.lastSeenTimestamp)\n bare.writeI64(bc, x.msgIndex)\n}\n\nfunction read2(bc: bare.ByteCursor): readonly PersistedConnection[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedConnection(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedConnection(bc)\n }\n return result\n}\n\nfunction write2(bc: bare.ByteCursor, x: readonly PersistedConnection[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedConnection(bc, x[i])\n }\n}\n\nfunction read3(bc: bare.ByteCursor): readonly PersistedScheduleEvent[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedScheduleEvent(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedScheduleEvent(bc)\n }\n return result\n}\n\nfunction write3(bc: bare.ByteCursor, x: readonly PersistedScheduleEvent[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedScheduleEvent(bc, x[i])\n }\n}\n\nfunction read4(bc: bare.ByteCursor): readonly PersistedHibernatableWebSocket[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedHibernatableWebSocket(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedHibernatableWebSocket(bc)\n }\n return result\n}\n\nfunction write4(bc: bare.ByteCursor, x: readonly PersistedHibernatableWebSocket[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedHibernatableWebSocket(bc, x[i])\n }\n}\n\nexport type PersistedActor = {\n readonly input: ArrayBuffer | null,\n readonly hasInitialized: boolean,\n readonly state: ArrayBuffer,\n readonly connections: readonly PersistedConnection[],\n readonly scheduledEvents: readonly PersistedScheduleEvent[],\n readonly hibernatableWebSockets: readonly PersistedHibernatableWebSocket[],\n}\n\nexport function readPersistedActor(bc: bare.ByteCursor): PersistedActor {\n return {\n input: read1(bc),\n hasInitialized: bare.readBool(bc),\n state: bare.readData(bc),\n connections: read2(bc),\n scheduledEvents: read3(bc),\n hibernatableWebSockets: read4(bc),\n }\n}\n\nexport function writePersistedActor(bc: bare.ByteCursor, x: PersistedActor): void {\n write1(bc, x.input)\n bare.writeBool(bc, x.hasInitialized)\n bare.writeData(bc, x.state)\n write2(bc, x.connections)\n write3(bc, x.scheduledEvents)\n write4(bc, x.hibernatableWebSockets)\n}\n\nexport function encodePersistedActor(x: PersistedActor): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writePersistedActor(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodePersistedActor(bytes: Uint8Array): PersistedActor {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readPersistedActor(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\n\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type i64 = bigint\nexport type u16 = number\n\nexport type GatewayId = ArrayBuffer\n\nexport function readGatewayId(bc: bare.ByteCursor): GatewayId {\n return bare.readFixedData(bc, 4)\n}\n\nexport function writeGatewayId(bc: bare.ByteCursor, x: GatewayId): void {\n assert(x.byteLength === 4)\n bare.writeFixedData(bc, x)\n}\n\nexport type RequestId = ArrayBuffer\n\nexport function readRequestId(bc: bare.ByteCursor): RequestId {\n return bare.readFixedData(bc, 4)\n}\n\nexport function writeRequestId(bc: bare.ByteCursor, x: RequestId): void {\n assert(x.byteLength === 4)\n bare.writeFixedData(bc, x)\n}\n\nexport type MessageIndex = u16\n\nexport function readMessageIndex(bc: bare.ByteCursor): MessageIndex {\n return bare.readU16(bc)\n}\n\nexport function writeMessageIndex(bc: bare.ByteCursor, x: MessageIndex): void {\n bare.writeU16(bc, x)\n}\n\nexport function encodeMessageIndex(x: MessageIndex): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeMessageIndex(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeMessageIndex(bytes: Uint8Array): MessageIndex {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readMessageIndex(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type Cbor = ArrayBuffer\n\nexport function readCbor(bc: bare.ByteCursor): Cbor {\n return bare.readData(bc)\n}\n\nexport function writeCbor(bc: bare.ByteCursor, x: Cbor): void {\n bare.writeData(bc, x)\n}\n\nexport type Subscription = {\n readonly eventName: string,\n}\n\nexport function readSubscription(bc: bare.ByteCursor): Subscription {\n return {\n eventName: bare.readString(bc),\n }\n}\n\nexport function writeSubscription(bc: bare.ByteCursor, x: Subscription): void {\n bare.writeString(bc, x.eventName)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly Subscription[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readSubscription(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readSubscription(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly Subscription[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeSubscription(bc, x[i])\n }\n}\n\nfunction read1(bc: bare.ByteCursor): ReadonlyMap<string, string> {\n const len = bare.readUintSafe(bc)\n const result = new Map<string, string>()\n for (let i = 0; i < len; i++) {\n const offset = bc.offset\n const key = bare.readString(bc)\n if (result.has(key)) {\n bc.offset = offset\n throw new bare.BareError(offset, \"duplicated key\")\n }\n result.set(key, bare.readString(bc))\n }\n return result\n}\n\nfunction write1(bc: bare.ByteCursor, x: ReadonlyMap<string, string>): void {\n bare.writeUintSafe(bc, x.size)\n for(const kv of x) {\n bare.writeString(bc, kv[0])\n bare.writeString(bc, kv[1])\n }\n}\n\nexport type Conn = {\n readonly id: string,\n readonly parameters: Cbor,\n readonly state: Cbor,\n readonly subscriptions: readonly Subscription[],\n readonly gatewayId: GatewayId,\n readonly requestId: RequestId,\n readonly serverMessageIndex: u16,\n readonly clientMessageIndex: u16,\n readonly requestPath: string,\n readonly requestHeaders: ReadonlyMap<string, string>,\n}\n\nexport function readConn(bc: bare.ByteCursor): Conn {\n return {\n id: bare.readString(bc),\n parameters: readCbor(bc),\n state: readCbor(bc),\n subscriptions: read0(bc),\n gatewayId: readGatewayId(bc),\n requestId: readRequestId(bc),\n serverMessageIndex: bare.readU16(bc),\n clientMessageIndex: bare.readU16(bc),\n requestPath: bare.readString(bc),\n requestHeaders: read1(bc),\n }\n}\n\nexport function writeConn(bc: bare.ByteCursor, x: Conn): void {\n bare.writeString(bc, x.id)\n writeCbor(bc, x.parameters)\n writeCbor(bc, x.state)\n write0(bc, x.subscriptions)\n writeGatewayId(bc, x.gatewayId)\n writeRequestId(bc, x.requestId)\n bare.writeU16(bc, x.serverMessageIndex)\n bare.writeU16(bc, x.clientMessageIndex)\n bare.writeString(bc, x.requestPath)\n write1(bc, x.requestHeaders)\n}\n\nexport function encodeConn(x: Conn): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeConn(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeConn(bytes: Uint8Array): Conn {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readConn(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nfunction read2(bc: bare.ByteCursor): Cbor | null {\n return bare.readBool(bc)\n ? readCbor(bc)\n : null\n}\n\nfunction write2(bc: bare.ByteCursor, x: Cbor | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n writeCbor(bc, x)\n }\n}\n\nexport type ScheduleEvent = {\n readonly eventId: string,\n readonly timestamp: i64,\n readonly action: string,\n readonly args: Cbor | null,\n}\n\nexport function readScheduleEvent(bc: bare.ByteCursor): ScheduleEvent {\n return {\n eventId: bare.readString(bc),\n timestamp: bare.readI64(bc),\n action: bare.readString(bc),\n args: read2(bc),\n }\n}\n\nexport function writeScheduleEvent(bc: bare.ByteCursor, x: ScheduleEvent): void {\n bare.writeString(bc, x.eventId)\n bare.writeI64(bc, x.timestamp)\n bare.writeString(bc, x.action)\n write2(bc, x.args)\n}\n\nfunction read3(bc: bare.ByteCursor): readonly ScheduleEvent[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readScheduleEvent(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readScheduleEvent(bc)\n }\n return result\n}\n\nfunction write3(bc: bare.ByteCursor, x: readonly ScheduleEvent[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeScheduleEvent(bc, x[i])\n }\n}\n\nexport type Actor = {\n readonly input: Cbor | null,\n readonly hasInitialized: boolean,\n readonly state: Cbor,\n readonly scheduledEvents: readonly ScheduleEvent[],\n}\n\nexport function readActor(bc: bare.ByteCursor): Actor {\n return {\n input: read2(bc),\n hasInitialized: bare.readBool(bc),\n state: readCbor(bc),\n scheduledEvents: read3(bc),\n }\n}\n\nexport function writeActor(bc: bare.ByteCursor, x: Actor): void {\n write2(bc, x.input)\n bare.writeBool(bc, x.hasInitialized)\n writeCbor(bc, x.state)\n write3(bc, x.scheduledEvents)\n}\n\nexport function encodeActor(x: Actor): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActor(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActor(bytes: Uint8Array): Actor {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActor(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\n\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type i64 = bigint\nexport type u16 = number\nexport type u32 = number\nexport type u64 = bigint\n\nexport type GatewayId = ArrayBuffer\n\nexport function readGatewayId(bc: bare.ByteCursor): GatewayId {\n return bare.readFixedData(bc, 4)\n}\n\nexport function writeGatewayId(bc: bare.ByteCursor, x: GatewayId): void {\n assert(x.byteLength === 4)\n bare.writeFixedData(bc, x)\n}\n\nexport type RequestId = ArrayBuffer\n\nexport function readRequestId(bc: bare.ByteCursor): RequestId {\n return bare.readFixedData(bc, 4)\n}\n\nexport function writeRequestId(bc: bare.ByteCursor, x: RequestId): void {\n assert(x.byteLength === 4)\n bare.writeFixedData(bc, x)\n}\n\nexport type MessageIndex = u16\n\nexport function readMessageIndex(bc: bare.ByteCursor): MessageIndex {\n return bare.readU16(bc)\n}\n\nexport function writeMessageIndex(bc: bare.ByteCursor, x: MessageIndex): void {\n bare.writeU16(bc, x)\n}\n\nexport function encodeMessageIndex(x: MessageIndex): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeMessageIndex(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeMessageIndex(bytes: Uint8Array): MessageIndex {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readMessageIndex(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type Cbor = ArrayBuffer\n\nexport function readCbor(bc: bare.ByteCursor): Cbor {\n return bare.readData(bc)\n}\n\nexport function writeCbor(bc: bare.ByteCursor, x: Cbor): void {\n bare.writeData(bc, x)\n}\n\nexport type Subscription = {\n readonly eventName: string,\n}\n\nexport function readSubscription(bc: bare.ByteCursor): Subscription {\n return {\n eventName: bare.readString(bc),\n }\n}\n\nexport function writeSubscription(bc: bare.ByteCursor, x: Subscription): void {\n bare.writeString(bc, x.eventName)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly Subscription[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readSubscription(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readSubscription(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly Subscription[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeSubscription(bc, x[i])\n }\n}\n\nfunction read1(bc: bare.ByteCursor): ReadonlyMap<string, string> {\n const len = bare.readUintSafe(bc)\n const result = new Map<string, string>()\n for (let i = 0; i < len; i++) {\n const offset = bc.offset\n const key = bare.readString(bc)\n if (result.has(key)) {\n bc.offset = offset\n throw new bare.BareError(offset, \"duplicated key\")\n }\n result.set(key, bare.readString(bc))\n }\n return result\n}\n\nfunction write1(bc: bare.ByteCursor, x: ReadonlyMap<string, string>): void {\n bare.writeUintSafe(bc, x.size)\n for(const kv of x) {\n bare.writeString(bc, kv[0])\n bare.writeString(bc, kv[1])\n }\n}\n\nexport type Conn = {\n readonly id: string,\n readonly parameters: Cbor,\n readonly state: Cbor,\n readonly subscriptions: readonly Subscription[],\n readonly gatewayId: GatewayId,\n readonly requestId: RequestId,\n readonly serverMessageIndex: u16,\n readonly clientMessageIndex: u16,\n readonly requestPath: string,\n readonly requestHeaders: ReadonlyMap<string, string>,\n}\n\nexport function readConn(bc: bare.ByteCursor): Conn {\n return {\n id: bare.readString(bc),\n parameters: readCbor(bc),\n state: readCbor(bc),\n subscriptions: read0(bc),\n gatewayId: readGatewayId(bc),\n requestId: readRequestId(bc),\n serverMessageIndex: bare.readU16(bc),\n clientMessageIndex: bare.readU16(bc),\n requestPath: bare.readString(bc),\n requestHeaders: read1(bc),\n }\n}\n\nexport function writeConn(bc: bare.ByteCursor, x: Conn): void {\n bare.writeString(bc, x.id)\n writeCbor(bc, x.parameters)\n writeCbor(bc, x.state)\n write0(bc, x.subscriptions)\n writeGatewayId(bc, x.gatewayId)\n writeRequestId(bc, x.requestId)\n bare.writeU16(bc, x.serverMessageIndex)\n bare.writeU16(bc, x.clientMessageIndex)\n bare.writeString(bc, x.requestPath)\n write1(bc, x.requestHeaders)\n}\n\nexport function encodeConn(x: Conn): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeConn(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeConn(bytes: Uint8Array): Conn {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readConn(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nfunction read2(bc: bare.ByteCursor): Cbor | null {\n return bare.readBool(bc)\n ? readCbor(bc)\n : null\n}\n\nfunction write2(bc: bare.ByteCursor, x: Cbor | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n writeCbor(bc, x)\n }\n}\n\nexport type ScheduleEvent = {\n readonly eventId: string,\n readonly timestamp: i64,\n readonly action: string,\n readonly args: Cbor | null,\n}\n\nexport function readScheduleEvent(bc: bare.ByteCursor): ScheduleEvent {\n return {\n eventId: bare.readString(bc),\n timestamp: bare.readI64(bc),\n action: bare.readString(bc),\n args: read2(bc),\n }\n}\n\nexport function writeScheduleEvent(bc: bare.ByteCursor, x: ScheduleEvent): void {\n bare.writeString(bc, x.eventId)\n bare.writeI64(bc, x.timestamp)\n bare.writeString(bc, x.action)\n write2(bc, x.args)\n}\n\nfunction read3(bc: bare.ByteCursor): readonly ScheduleEvent[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readScheduleEvent(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readScheduleEvent(bc)\n }\n return result\n}\n\nfunction write3(bc: bare.ByteCursor, x: readonly ScheduleEvent[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeScheduleEvent(bc, x[i])\n }\n}\n\nexport type Actor = {\n readonly input: Cbor | null,\n readonly hasInitialized: boolean,\n readonly state: Cbor,\n readonly scheduledEvents: readonly ScheduleEvent[],\n}\n\nexport function readActor(bc: bare.ByteCursor): Actor {\n return {\n input: read2(bc),\n hasInitialized: bare.readBool(bc),\n state: readCbor(bc),\n scheduledEvents: read3(bc),\n }\n}\n\nexport function writeActor(bc: bare.ByteCursor, x: Actor): void {\n write2(bc, x.input)\n bare.writeBool(bc, x.hasInitialized)\n writeCbor(bc, x.state)\n write3(bc, x.scheduledEvents)\n}\n\nexport function encodeActor(x: Actor): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActor(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActor(bytes: Uint8Array): Actor {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActor(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type QueueMetadata = {\n readonly nextId: u64,\n readonly size: u32,\n}\n\nexport function readQueueMetadata(bc: bare.ByteCursor): QueueMetadata {\n return {\n nextId: bare.readU64(bc),\n size: bare.readU32(bc),\n }\n}\n\nexport function writeQueueMetadata(bc: bare.ByteCursor, x: QueueMetadata): void {\n bare.writeU64(bc, x.nextId)\n bare.writeU32(bc, x.size)\n}\n\nexport function encodeQueueMetadata(x: QueueMetadata): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeQueueMetadata(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeQueueMetadata(bytes: Uint8Array): QueueMetadata {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readQueueMetadata(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nfunction read4(bc: bare.ByteCursor): u32 | null {\n return bare.readBool(bc)\n ? bare.readU32(bc)\n : null\n}\n\nfunction write4(bc: bare.ByteCursor, x: u32 | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeU32(bc, x)\n }\n}\n\nfunction read5(bc: bare.ByteCursor): i64 | null {\n return bare.readBool(bc)\n ? bare.readI64(bc)\n : null\n}\n\nfunction write5(bc: bare.ByteCursor, x: i64 | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeI64(bc, x)\n }\n}\n\nfunction read6(bc: bare.ByteCursor): boolean | null {\n return bare.readBool(bc)\n ? bare.readBool(bc)\n : null\n}\n\nfunction write6(bc: bare.ByteCursor, x: boolean | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeBool(bc, x)\n }\n}\n\nexport type QueueMessage = {\n readonly name: string,\n readonly body: Cbor,\n readonly createdAt: i64,\n readonly failureCount: u32 | null,\n readonly availableAt: i64 | null,\n readonly inFlight: boolean | null,\n readonly inFlightAt: i64 | null,\n}\n\nexport function readQueueMessage(bc: bare.ByteCursor): QueueMessage {\n return {\n name: bare.readString(bc),\n body: readCbor(bc),\n createdAt: bare.readI64(bc),\n failureCount: read4(bc),\n availableAt: read5(bc),\n inFlight: read6(bc),\n inFlightAt: read5(bc),\n }\n}\n\nexport function writeQueueMessage(bc: bare.ByteCursor, x: QueueMessage): void {\n bare.writeString(bc, x.name)\n writeCbor(bc, x.body)\n bare.writeI64(bc, x.createdAt)\n write4(bc, x.failureCount)\n write5(bc, x.availableAt)\n write6(bc, x.inFlight)\n write5(bc, x.inFlightAt)\n}\n\nexport function encodeQueueMessage(x: QueueMessage): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeQueueMessage(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeQueueMessage(bytes: Uint8Array): QueueMessage {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readQueueMessage(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-R64EFI6F.cjs","../../src/common/actor-router-consts.ts","../../src/manager/router.ts","../../src/actor/keys.ts","../../src/common/router.ts","../../src/actor/router-endpoints.ts","../../src/actor/contexts/base/conn.ts","../../src/actor/contexts/action.ts","../../src/actor/contexts/base/conn-init.ts","../../src/actor/contexts/before-connect.ts","../../src/actor/contexts/connect.ts","../../src/actor/contexts/create-conn-state.ts","../../src/actor/contexts/request.ts","../../src/actor/contexts/websocket.ts","../../src/actor/protocol/serde.ts","../../src/serde.ts","../../src/schemas/client-protocol/versioned.ts","../schemas/client-protocol/v1.ts","../schemas/client-protocol/v2.ts","../schemas/client-protocol/v3.ts","../../src/schemas/client-protocol-zod/mod.ts","../../src/actor/conn/drivers/http.ts","../../src/actor/conn/drivers/raw-request.ts","../../src/registry/config/index.ts","../../src/engine-process/constants.ts","../../src/inspector/config.ts","../../src/utils/endpoint-parser.ts","../../src/registry/config/driver.ts","../../src/registry/config/runner.ts","../../src/registry/config/serverless.ts","../../src/inspector/serve-ui.ts","../../src/utils/node.ts","../../src/manager-api/actors.ts","../../src/manager-api/common.ts","../../src/utils/crypto.ts","../../src/utils/router.ts","../../src/common/cors.ts","../../src/manager/gateway.ts","../../src/actor/router-websocket-endpoints.ts","../../src/inspector/handler.ts","../../src/inspector/log.ts","../../src/actor/conn/drivers/raw-websocket.ts","../../src/actor/conn/drivers/websocket.ts","../../src/actor/protocol/old.ts","../../src/actor/conn/mod.ts","../../src/actor/conn/state-manager.ts","../../src/manager/log.ts","../../src/driver-helpers/utils.ts","../../src/schemas/actor-persist/versioned.ts","../schemas/actor-persist/v1.ts","../schemas/actor-persist/v2.ts","../schemas/actor-persist/v3.ts","../schemas/actor-persist/v4.ts"],"names":["readActionResponse","config","readActionRequest","readSubscriptionRequest","encodeHttpActionRequest","encodeHttpActionResponse","encodeHttpResponseError","encodeHttpResolveResponse","CURRENT_VERSION","TO_CLIENT_VERSIONED","TO_SERVER_VERSIONED","bare","message","invariant","c","createVersionedDataHandler"],"mappings":"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AAC9C,IAAA;AACD,EAAA;AACoD,EAAA;AACF,EAAA;AAClD;AAGgD;AACzC,EAAA;AACR;AAEiD;AACzC,EAAA;AACR;AAEkE;AACzB,EAAA;AACtB,IAAA;AACX,MAAA;AACsB,QAAA;AACtB,MAAA;AACsB,QAAA;AAC3B,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AACqC,EAAA;AACnB,IAAA;AACX,MAAA;AACgC,QAAA;AAChC,MAAA;AACgC,QAAA;AACrC,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AACwC,EAAA;AACF,EAAA;AACtC;AAGAc;AACyC,EAAA;AACtB,IAAA;AACX,MAAA;AAC+B,QAAA;AACpC,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AACqC,EAAA;AACnB,IAAA;AACX,MAAA;AACkD,QAAA;AACvD,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AAC8B,EAAA;AACF,EAAA;AAC5B;AAGDA;AACyC,EAAA;AACtB,IAAA;AACX,MAAA;AAC8B,QAAA;AACnC,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AACqC,EAAA;AACnB,IAAA;AACX,MAAA;AACgD,QAAA;AACrD,MAAA;AACW,QAAA;AACT,UAAA;AACD,QAAA;AACF,IAAA;AACD,EAAA;AAC8B,EAAA;AACF,EAAA;AAC5B;AhDkpLsD;AACA;A+Ch2LmB;AACjC,EAAA;AAGX,IAAA;AAEb,IAAA;AACiC,IAAA;AAC/B,IAAA;AACnB,EAAA;AACuB,EAAA;AACtB,IAAA;AACAP,IAAAA;AACD,EAAA;AACD;AAQ8B;AACsB,EAAA;AACX,EAAA;AACzC;AAa4D;AACL,EAAA;AACnB,EAAA;AACd,EAAA;AACtB;A/C40LwD;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;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/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-R64EFI6F.cjs","sourcesContent":[null,"// NOTE: This is in a separate file from the router since it needs to be shared between the client & the server. If this was in the router file, the client would end up importing the *entire* actor router and tree shaking would not work.\n\n// MARK: Paths\nexport const PATH_CONNECT = \"/connect\";\nexport const PATH_WEBSOCKET_BASE = \"/websocket\";\nexport const PATH_WEBSOCKET_PREFIX = \"/websocket/\";\nexport const PATH_INSPECTOR_CONNECT = \"/inspector/connect\";\n\n// MARK: Headers\nexport const HEADER_ACTOR_QUERY = \"x-rivet-query\";\n\nexport const HEADER_ENCODING = \"x-rivet-encoding\";\n\n// IMPORTANT: Params must be in headers or in an E2EE part of the request (i.e. NOT the URL or query string) in order to ensure that tokens can be securely passed in params.\nexport const HEADER_CONN_PARAMS = \"x-rivet-conn-params\";\n\nexport const HEADER_ACTOR_ID = \"x-rivet-actor\";\n\nexport const HEADER_RIVET_TOKEN = \"x-rivet-token\";\n\n// MARK: Manager Gateway Headers\nexport const HEADER_RIVET_TARGET = \"x-rivet-target\";\nexport const HEADER_RIVET_ACTOR = \"x-rivet-actor\";\nexport const HEADER_RIVET_NAMESPACE = \"x-rivet-namespace\";\n\n// MARK: WebSocket Protocol Prefixes\n/** Some servers (such as node-ws & Cloudflare) require explicitly match a certain WebSocket protocol. This gives us a static protocol to match against. */\nexport const WS_PROTOCOL_STANDARD = \"rivet\";\nexport const WS_PROTOCOL_TARGET = \"rivet_target.\";\nexport const WS_PROTOCOL_ACTOR = \"rivet_actor.\";\nexport const WS_PROTOCOL_ENCODING = \"rivet_encoding.\";\nexport const WS_PROTOCOL_CONN_PARAMS = \"rivet_conn_params.\";\nexport const WS_PROTOCOL_TOKEN = \"rivet_token.\";\n/**\n * Used to pass an inspector token for connecting to the inspector.\n * Only used internally by Rivet.\n */\nexport const WS_PROTOCOL_INSPECTOR_TOKEN = \"rivet_inspector_token.\";\n\n// MARK: WebSocket Inline Test Protocol Prefixes\nexport const WS_TEST_PROTOCOL_PATH = \"test_path.\";\n\n/**\n * Headers that publics can send from public clients.\n *\n * Used for CORS.\n **/\nexport const ALLOWED_PUBLIC_HEADERS = [\n\t\"Content-Type\",\n\t\"User-Agent\",\n\tHEADER_ACTOR_QUERY,\n\tHEADER_ENCODING,\n\tHEADER_CONN_PARAMS,\n\tHEADER_ACTOR_ID,\n\tHEADER_RIVET_TARGET,\n\tHEADER_RIVET_ACTOR,\n\tHEADER_RIVET_NAMESPACE,\n\tHEADER_RIVET_TOKEN,\n];\n","import { serveStatic } from \"@hono/node-server/serve-static\";\nimport { createRoute } from \"@hono/zod-openapi\";\nimport * as cbor from \"cbor-x\";\nimport type { Hono } from \"hono\";\nimport invariant from \"invariant\";\nimport { z } from \"zod/v4\";\nimport { Forbidden, RestrictedFeature } from \"@/actor/errors\";\nimport { deserializeActorKey, serializeActorKey } from \"@/actor/keys\";\nimport type { Encoding } from \"@/client/mod\";\nimport {\n\tHEADER_RIVET_TOKEN,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_TEST_PROTOCOL_PATH,\n} from \"@/common/actor-router-consts\";\nimport { handleHealthRequest, handleMetadataRequest } from \"@/common/router\";\nimport { deconstructError, noopNext, stringifyError } from \"@/common/utils\";\nimport { HEADER_ACTOR_ID } from \"@/driver-helpers/mod\";\nimport type {\n\tTestInlineDriverCallRequest,\n\tTestInlineDriverCallResponse,\n} from \"@/driver-test-suite/test-inline-client-driver\";\nimport { getInspectorDir } from \"@/inspector/serve-ui\";\nimport {\n\tActorsCreateRequestSchema,\n\ttype ActorsCreateResponse,\n\tActorsCreateResponseSchema,\n\tActorsGetOrCreateRequestSchema,\n\ttype ActorsGetOrCreateResponse,\n\tActorsGetOrCreateResponseSchema,\n\ttype ActorsKvGetResponse,\n\tActorsKvGetResponseSchema,\n\ttype ActorsListNamesResponse,\n\tActorsListNamesResponseSchema,\n\ttype ActorsListResponse,\n\tActorsListResponseSchema,\n\ttype Actor as ApiActor,\n} from \"@/manager-api/actors\";\nimport { buildActorNames, type RegistryConfig } from \"@/registry/config\";\nimport type { GetUpgradeWebSocket } from \"@/utils\";\nimport { timingSafeEqual } from \"@/utils/crypto\";\nimport { getNodeEnv } from \"@/utils/env-vars\";\nimport {\n\tbuildOpenApiRequestBody,\n\tbuildOpenApiResponses,\n\tcreateRouter,\n} from \"@/utils/router\";\nimport type { ActorOutput, ManagerDriver } from \"./driver\";\nimport { actorGateway, createTestWebSocketProxy } from \"./gateway\";\nimport { logger } from \"./log\";\n\nexport function buildManagerRouter(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n) {\n\treturn createRouter(config.managerBasePath, (router) => {\n\t\t// Actor gateway\n\t\trouter.use(\n\t\t\t\"*\",\n\t\t\tactorGateway.bind(\n\t\t\t\tundefined,\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tgetUpgradeWebSocket,\n\t\t\t),\n\t\t);\n\n\t\t// GET /\n\t\trouter.get(\"/\", (c) => {\n\t\t\treturn c.text(\n\t\t\t\t\"This is a RivetKit server.\\n\\nLearn more at https://rivet.dev\",\n\t\t\t);\n\t\t});\n\n\t\t// GET /actors\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"get\",\n\t\t\t\tpath: \"/actors\",\n\t\t\t\trequest: {\n\t\t\t\t\tquery: z.object({\n\t\t\t\t\t\tname: z.string().optional(),\n\t\t\t\t\t\tactor_ids: z.string().optional(),\n\t\t\t\t\t\tkey: z.string().optional(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsListResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst { name, actor_ids, key } = c.req.valid(\"query\");\n\n\t\t\t\tconst actorIdsParsed = actor_ids\n\t\t\t\t\t? actor_ids\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((id) => id.trim())\n\t\t\t\t\t\t.filter((id) => id.length > 0)\n\t\t\t\t\t: undefined;\n\n\t\t\t\tconst actors: ActorOutput[] = [];\n\n\t\t\t\t// Validate: cannot provide both actor_ids and (name or key)\n\t\t\t\tif (actorIdsParsed && (name || key)) {\n\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: \"Cannot provide both actor_ids and (name + key). Use either actor_ids or (name + key).\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Validate: when key is provided, name must also be provided\n\t\t\t\tif (key && !name) {\n\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: \"Name is required when key is provided.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (actorIdsParsed) {\n\t\t\t\t\tif (actorIdsParsed.length > 32) {\n\t\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terror: `Too many actor IDs. Maximum is 32, got ${actorIdsParsed.length}.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t400,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (actorIdsParsed.length === 0) {\n\t\t\t\t\t\treturn c.json<ActorsListResponse>({\n\t\t\t\t\t\t\tactors: [],\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fetch actors by ID\n\t\t\t\t\tfor (const actorId of actorIdsParsed) {\n\t\t\t\t\t\tif (name) {\n\t\t\t\t\t\t\t// If name is provided, use it directly\n\t\t\t\t\t\t\tconst actorOutput = await managerDriver.getForId({\n\t\t\t\t\t\t\t\tc,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (actorOutput) {\n\t\t\t\t\t\t\t\tactors.push(actorOutput);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// If no name is provided, try all registered actor types\n\t\t\t\t\t\t\t// Actor IDs are globally unique, so we'll find it in one of them\n\t\t\t\t\t\t\tfor (const actorName of Object.keys(config.use)) {\n\t\t\t\t\t\t\t\tconst actorOutput =\n\t\t\t\t\t\t\t\t\tawait managerDriver.getForId({\n\t\t\t\t\t\t\t\t\t\tc,\n\t\t\t\t\t\t\t\t\t\tname: actorName,\n\t\t\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (actorOutput) {\n\t\t\t\t\t\t\t\t\tactors.push(actorOutput);\n\t\t\t\t\t\t\t\t\tbreak; // Found the actor, no need to check other names\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (key && name) {\n\t\t\t\t\tconst actorOutput = await managerDriver.getWithKey({\n\t\t\t\t\t\tc,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tkey: deserializeActorKey(key),\n\t\t\t\t\t});\n\t\t\t\t\tif (actorOutput) {\n\t\t\t\t\t\tactors.push(actorOutput);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!name) {\n\t\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terror: \"Name is required when not using actor_ids.\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t400,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// List all actors with the given name\n\t\t\t\t\tconst actorOutputs = await managerDriver.listActors({\n\t\t\t\t\t\tc,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tincludeDestroyed: false,\n\t\t\t\t\t});\n\t\t\t\t\tactors.push(...actorOutputs);\n\t\t\t\t}\n\n\t\t\t\treturn c.json<ActorsListResponse>({\n\t\t\t\t\tactors: actors.map((actor) => createApiActor(actor)),\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// GET /actors/names\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"get\",\n\t\t\t\tpath: \"/actors/names\",\n\t\t\t\trequest: {\n\t\t\t\t\tquery: z.object({\n\t\t\t\t\t\tnamespace: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsListNamesResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst names = buildActorNames(config);\n\t\t\t\treturn c.json<ActorsListNamesResponse>({\n\t\t\t\t\tnames,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// PUT /actors\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"put\",\n\t\t\t\tpath: \"/actors\",\n\t\t\t\trequest: {\n\t\t\t\t\tbody: buildOpenApiRequestBody(\n\t\t\t\t\t\tActorsGetOrCreateRequestSchema,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(\n\t\t\t\t\tActorsGetOrCreateResponseSchema,\n\t\t\t\t),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst body = c.req.valid(\"json\");\n\n\t\t\t\t// Check if actor already exists\n\t\t\t\tconst existingActor = await managerDriver.getWithKey({\n\t\t\t\t\tc,\n\t\t\t\t\tname: body.name,\n\t\t\t\t\tkey: deserializeActorKey(body.key),\n\t\t\t\t});\n\n\t\t\t\tif (existingActor) {\n\t\t\t\t\treturn c.json<ActorsGetOrCreateResponse>({\n\t\t\t\t\t\tactor: createApiActor(existingActor),\n\t\t\t\t\t\tcreated: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Create new actor\n\t\t\t\tconst newActor = await managerDriver.getOrCreateWithKey({\n\t\t\t\t\tc,\n\t\t\t\t\tname: body.name,\n\t\t\t\t\tkey: deserializeActorKey(body.key),\n\t\t\t\t\tinput: body.input\n\t\t\t\t\t\t? cbor.decode(Buffer.from(body.input, \"base64\"))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tregion: undefined, // Not provided in the request schema\n\t\t\t\t});\n\n\t\t\t\treturn c.json<ActorsGetOrCreateResponse>({\n\t\t\t\t\tactor: createApiActor(newActor),\n\t\t\t\t\tcreated: true,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// POST /actors\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"post\",\n\t\t\t\tpath: \"/actors\",\n\t\t\t\trequest: {\n\t\t\t\t\tbody: buildOpenApiRequestBody(ActorsCreateRequestSchema),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsCreateResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst body = c.req.valid(\"json\");\n\n\t\t\t\t// Create actor using the driver\n\t\t\t\tconst actorOutput = await managerDriver.createActor({\n\t\t\t\t\tc,\n\t\t\t\t\tname: body.name,\n\t\t\t\t\tkey: deserializeActorKey(body.key || crypto.randomUUID()),\n\t\t\t\t\tinput: body.input\n\t\t\t\t\t\t? cbor.decode(Buffer.from(body.input, \"base64\"))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tregion: undefined, // Not provided in the request schema\n\t\t\t\t});\n\n\t\t\t\t// Transform ActorOutput to match ActorSchema\n\t\t\t\tconst actor = createApiActor(actorOutput);\n\n\t\t\t\treturn c.json<ActorsCreateResponse>({ actor });\n\t\t\t});\n\t\t}\n\n\t\t// GET /actors/{actor_id}/kv/keys/{key}\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"get\",\n\t\t\t\tpath: \"/actors/{actor_id}/kv/keys/{key}\",\n\t\t\t\trequest: {\n\t\t\t\t\tparams: z.object({\n\t\t\t\t\t\tactor_id: z.string(),\n\t\t\t\t\t\tkey: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsKvGetResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tif (getNodeEnv() === \"development\" && !config.token) {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"RIVET_TOKEN is not set, skipping KV store access checks in development mode. This endpoint will be disabled in production, unless you set the token.\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (getNodeEnv() !== \"development\") {\n\t\t\t\t\tif (!config.token) {\n\t\t\t\t\t\tthrow new RestrictedFeature(\"KV store access\");\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\ttimingSafeEqual(\n\t\t\t\t\t\t\tconfig.token,\n\t\t\t\t\t\t\tc.req.header(HEADER_RIVET_TOKEN) || \"\",\n\t\t\t\t\t\t) === false\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Forbidden();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst { actor_id: actorId, key } = c.req.valid(\"param\");\n\n\t\t\t\tconst response = await managerDriver.kvGet(\n\t\t\t\t\tactorId,\n\t\t\t\t\tBuffer.from(key, \"base64\"),\n\t\t\t\t);\n\n\t\t\t\treturn c.json<ActorsKvGetResponse>({\n\t\t\t\t\tvalue: response\n\t\t\t\t\t\t? Buffer.from(response).toString(\"base64\")\n\t\t\t\t\t\t: null,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// TODO:\n\t\t// // DELETE /actors/{actor_id}\n\t\t// {\n\t\t// \tconst route = createRoute({\n\t\t// \t\tmethod: \"delete\",\n\t\t// \t\tpath: \"/actors/{actor_id}\",\n\t\t// \t\trequest: {\n\t\t// \t\t\tparams: z.object({\n\t\t// \t\t\t\tactor_id: RivetIdSchema,\n\t\t// \t\t\t}),\n\t\t// \t\t},\n\t\t// \t\tresponses: buildOpenApiResponses(\n\t\t// \t\t\tActorsDeleteResponseSchema,\n\t\t// \t\t\tvalidateBody,\n\t\t// \t\t),\n\t\t// \t});\n\t\t//\n\t\t// \trouter.openapi(route, async (c) => {\n\t\t// \t\tconst { actor_id } = c.req.valid(\"param\");\n\t\t//\n\t\t// \t});\n\t\t// }\n\n\t\tif (config.test.enabled) {\n\t\t\t// Add HTTP endpoint to test the inline client\n\t\t\t//\n\t\t\t// We have to do this in a router since this needs to run in the same server as the RivetKit registry. Some test contexts to not run in the same server.\n\t\t\trouter.post(\".test/inline-driver/call\", async (c) => {\n\t\t\t\t// TODO: use openapi instead\n\t\t\t\tconst buffer = await c.req.arrayBuffer();\n\t\t\t\tconst { encoding, method, args }: TestInlineDriverCallRequest =\n\t\t\t\t\tcbor.decode(new Uint8Array(buffer));\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"received inline request\",\n\t\t\t\t\tencoding,\n\t\t\t\t\tmethod,\n\t\t\t\t\targs,\n\t\t\t\t});\n\n\t\t\t\t// Forward inline driver request\n\t\t\t\tlet response: TestInlineDriverCallResponse<unknown>;\n\t\t\t\ttry {\n\t\t\t\t\tconst output = await (\n\t\t\t\t\t\t(managerDriver as any)[method] as any\n\t\t\t\t\t)(...args);\n\t\t\t\t\tresponse = { ok: output };\n\t\t\t\t} catch (rawErr) {\n\t\t\t\t\tconst err = deconstructError(rawErr, logger(), {}, true);\n\t\t\t\t\tresponse = { err };\n\t\t\t\t}\n\n\t\t\t\t// TODO: Remove any\n\t\t\t\treturn c.body(cbor.encode(response) as any);\n\t\t\t});\n\n\t\t\trouter.get(\".test/inline-driver/connect-websocket/*\", async (c) => {\n\t\t\t\tconst upgradeWebSocket = getUpgradeWebSocket?.();\n\t\t\t\tinvariant(\n\t\t\t\t\tupgradeWebSocket,\n\t\t\t\t\t\"websockets not supported on this platform\",\n\t\t\t\t);\n\n\t\t\t\treturn upgradeWebSocket(async (c: any) => {\n\t\t\t\t\t// Extract information from sec-websocket-protocol header\n\t\t\t\t\tconst protocolHeader =\n\t\t\t\t\t\tc.req.header(\"sec-websocket-protocol\") || \"\";\n\t\t\t\t\tconst protocols = protocolHeader.split(/,\\s*/);\n\n\t\t\t\t\t// Parse protocols to extract connection info\n\t\t\t\t\tlet actorId = \"\";\n\t\t\t\t\tlet encoding: Encoding = \"bare\";\n\t\t\t\t\tlet path = \"\";\n\t\t\t\t\tlet params: unknown;\n\n\t\t\t\t\tfor (const protocol of protocols) {\n\t\t\t\t\t\tif (protocol.startsWith(WS_PROTOCOL_ACTOR)) {\n\t\t\t\t\t\t\tactorId = decodeURIComponent(\n\t\t\t\t\t\t\t\tprotocol.substring(WS_PROTOCOL_ACTOR.length),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (protocol.startsWith(WS_PROTOCOL_ENCODING)) {\n\t\t\t\t\t\t\tencoding = protocol.substring(\n\t\t\t\t\t\t\t\tWS_PROTOCOL_ENCODING.length,\n\t\t\t\t\t\t\t) as Encoding;\n\t\t\t\t\t\t} else if (protocol.startsWith(WS_TEST_PROTOCOL_PATH)) {\n\t\t\t\t\t\t\tpath = decodeURIComponent(\n\t\t\t\t\t\t\t\tprotocol.substring(\n\t\t\t\t\t\t\t\t\tWS_TEST_PROTOCOL_PATH.length,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tprotocol.startsWith(WS_PROTOCOL_CONN_PARAMS)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst paramsRaw = decodeURIComponent(\n\t\t\t\t\t\t\t\tprotocol.substring(\n\t\t\t\t\t\t\t\t\tWS_PROTOCOL_CONN_PARAMS.length,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tparams = JSON.parse(paramsRaw);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"received test inline driver websocket\",\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tencodingKind: encoding,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Connect to the actor using the inline client driver - this returns a Promise<WebSocket>\n\t\t\t\t\tconst clientToProxyWsPromise = managerDriver.openWebSocket(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tencoding,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn await createTestWebSocketProxy(\n\t\t\t\t\t\tclientToProxyWsPromise,\n\t\t\t\t\t);\n\t\t\t\t})(c, noopNext());\n\t\t\t});\n\n\t\t\trouter.all(\".test/inline-driver/send-request/*\", async (c) => {\n\t\t\t\t// Extract parameters from headers\n\t\t\t\tconst actorId = c.req.header(HEADER_ACTOR_ID);\n\n\t\t\t\tif (!actorId) {\n\t\t\t\t\treturn c.text(\"Missing required headers\", 400);\n\t\t\t\t}\n\n\t\t\t\t// Extract the path after /send-request/\n\t\t\t\tconst pathOnly =\n\t\t\t\t\tc.req.path.split(\"/.test/inline-driver/send-request/\")[1] ||\n\t\t\t\t\t\"\";\n\n\t\t\t\t// Include query string\n\t\t\t\tconst url = new URL(c.req.url);\n\t\t\t\tconst pathWithQuery = pathOnly + url.search;\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"received test inline driver raw http\",\n\t\t\t\t\tactorId,\n\t\t\t\t\tpath: pathWithQuery,\n\t\t\t\t\tmethod: c.req.method,\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\t// Forward the request using the inline client driver\n\t\t\t\t\tconst response = await managerDriver.sendRequest(\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tnew Request(`http://actor/${pathWithQuery}`, {\n\t\t\t\t\t\t\tmethod: c.req.method,\n\t\t\t\t\t\t\theaders: c.req.raw.headers,\n\t\t\t\t\t\t\tbody: c.req.raw.body,\n\t\t\t\t\t\t\tduplex: \"half\",\n\t\t\t\t\t\t} as RequestInit),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Return the response directly\n\t\t\t\t\treturn response;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error in test inline raw http\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\n\t\t\t\t\t// Return error response\n\t\t\t\t\tconst err = deconstructError(error, logger(), {}, true);\n\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\t\tcode: err.code,\n\t\t\t\t\t\t\t\tmessage: err.message,\n\t\t\t\t\t\t\t\tmetadata: err.metadata,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr.statusCode,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Test endpoint to force disconnect a connection non-cleanly\n\t\t\trouter.post(\"/.test/force-disconnect\", async (c) => {\n\t\t\t\tconst actorId = c.req.query(\"actor\");\n\t\t\t\tconst connId = c.req.query(\"conn\");\n\n\t\t\t\tif (!actorId || !connId) {\n\t\t\t\t\treturn c.text(\n\t\t\t\t\t\t\"Missing actor or conn query parameters\",\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"forcing unclean disconnect\",\n\t\t\t\t\tactorId,\n\t\t\t\t\tconnId,\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\t// Send a special request to the actor to force disconnect the connection\n\t\t\t\t\tconst response = await managerDriver.sendRequest(\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tnew Request(\n\t\t\t\t\t\t\t`http://actor/.test/force-disconnect?conn=${connId}`,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tconst text = await response.text();\n\t\t\t\t\t\treturn c.text(\n\t\t\t\t\t\t\t`Failed to force disconnect: ${text}`,\n\t\t\t\t\t\t\tresponse.status as any,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn c.json({ success: true });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error forcing disconnect\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t\treturn c.text(`Error: ${error}`, 500);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (config.inspector.enabled) {\n\t\t\tlet inspectorRoot: string | undefined;\n\n\n\t\t\trouter.get(\"/ui/*\", async (c, next) => {\n\t\t\t\tif (!inspectorRoot) {\n\t\t\t\t\tinspectorRoot = await getInspectorDir();\n\t\t\t\t}\n\t\t\t\tconst root = inspectorRoot;\n\t\t\t\tconst rewrite = (path: string) =>\n\t\t\t\t\tpath.replace(/^\\/ui/, \"\") || \"/\";\n\n\t\t\t\treturn serveStatic({\n\t\t\t\t\troot,\n\t\t\t\t\trewriteRequestPath: rewrite,\n\t\t\t\t\tonNotFound: async (_path, c) => {\n\t\t\t\t\t\tawait serveStatic({ root, path: \"index.html\" })(\n\t\t\t\t\t\t\tc,\n\t\t\t\t\t\t\tnext,\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t})(c, next);\n\t\t\t});\n\n\t\t\trouter.get(\"/ui\", (c) => c.redirect(\"/ui/\"));\n\t\t}\n\n\t\trouter.get(\"/health\", (c) => handleHealthRequest(c));\n\n\t\trouter.get(\"/metadata\", (c) =>\n\t\t\thandleMetadataRequest(\n\t\t\t\tc,\n\t\t\t\tconfig,\n\t\t\t\t{ normal: {} },\n\t\t\t\tconfig.publicEndpoint,\n\t\t\t\tconfig.publicNamespace,\n\t\t\t\tconfig.publicToken,\n\t\t\t),\n\t\t);\n\n\t\tmanagerDriver.modifyManagerRouter?.(config, router as unknown as Hono);\n\t});\n}\n\nfunction createApiActor(actor: ActorOutput): ApiActor {\n\treturn {\n\t\tactor_id: actor.actorId,\n\t\tname: actor.name,\n\t\tkey: serializeActorKey(actor.key),\n\t\tnamespace_id: \"default\", // Assert default namespace\n\t\trunner_name_selector: \"default\",\n\t\tcreate_ts: actor.createTs ?? Date.now(),\n\t\tconnectable_ts: actor.connectableTs ?? null,\n\t\tdestroy_ts: actor.destroyTs ?? null,\n\t\tsleep_ts: actor.sleepTs ?? null,\n\t\tstart_ts: actor.startTs ?? null,\n\t};\n}\n","import type { ActorKey } from \"@/mod\";\n\nexport const EMPTY_KEY = \"/\";\nexport const KEY_SEPARATOR = \"/\";\n\nexport function serializeActorKey(key: ActorKey): 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// Handle empty strings by using a special marker\n\t\tif (part === \"\") {\n\t\t\treturn \"\\\\0\"; // Use \\0 as a marker for empty strings\n\t\t}\n\n\t\t// Escape backslashes first to avoid conflicts with our markers\n\t\tlet escaped = part.replace(/\\\\/g, \"\\\\\\\\\");\n\n\t\t// Then escape separators\n\t\tescaped = escaped.replace(/\\//g, `\\\\${KEY_SEPARATOR}`);\n\n\t\treturn escaped;\n\t});\n\n\treturn escapedParts.join(KEY_SEPARATOR);\n}\n\nexport function deserializeActorKey(keyString: string | undefined): ActorKey {\n\t// Check for special empty key marker\n\tif (\n\t\tkeyString === undefined ||\n\t\tkeyString === null ||\n\t\tkeyString === EMPTY_KEY\n\t) {\n\t\treturn [];\n\t}\n\n\t// Split by unescaped separators and unescape the escaped characters\n\tconst parts: string[] = [];\n\tlet currentPart = \"\";\n\tlet escaping = false;\n\tlet isEmptyStringMarker = 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// Handle special escape sequences\n\t\t\tif (char === \"0\") {\n\t\t\t\t// \\0 represents an empty string marker\n\t\t\t\tisEmptyStringMarker = true;\n\t\t\t} else {\n\t\t\t\t// This is an escaped character, add it directly\n\t\t\t\tcurrentPart += char;\n\t\t\t}\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\tif (isEmptyStringMarker) {\n\t\t\t\tparts.push(\"\");\n\t\t\t\tisEmptyStringMarker = false;\n\t\t\t} else {\n\t\t\t\tparts.push(currentPart);\n\t\t\t}\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\n\tif (escaping) {\n\t\t// Incomplete escape at the end - treat as literal backslash\n\t\tparts.push(currentPart + \"\\\\\");\n\t} else if (isEmptyStringMarker) {\n\t\tparts.push(\"\");\n\t} else if (currentPart !== \"\" || parts.length > 0) {\n\t\tparts.push(currentPart);\n\t}\n\n\treturn parts;\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext, Next } from \"hono\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport {\n\tgetRequestEncoding,\n\tgetRequestExposeInternalError,\n} from \"@/actor/router-endpoints\";\nimport {\n\tbuildActorNames,\n\ttype RegistryConfig,\n} from \"@/registry/config\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tHTTP_RESPONSE_ERROR_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype HttpResponseError as HttpResponseErrorJson,\n\tHttpResponseErrorSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { encodingIsBinary, serializeWithEncoding } from \"@/serde\";\nimport { bufferToArrayBuffer, VERSION } from \"@/utils\";\nimport { getLogHeaders } from \"@/utils/env-vars\";\nimport { getLogger, type Logger } from \"./log\";\nimport { deconstructError, stringifyError } from \"./utils\";\n\nexport function logger() {\n\treturn getLogger(\"router\");\n}\n\nexport function loggerMiddleware(logger: Logger) {\n\treturn async (c: HonoContext, next: Next) => {\n\t\tconst method = c.req.method;\n\t\tconst path = c.req.path;\n\t\tconst startTime = Date.now();\n\n\t\tawait next();\n\n\t\tconst duration = Date.now() - startTime;\n\t\tlogger.debug({\n\t\t\tmsg: \"http request\",\n\t\t\tmethod,\n\t\t\tpath,\n\t\t\tstatus: c.res.status,\n\t\t\tdt: `${duration}ms`,\n\t\t\treqSize: c.req.header(\"content-length\"),\n\t\t\tresSize: c.res.headers.get(\"content-length\"),\n\t\t\tuserAgent: c.req.header(\"user-agent\"),\n\t\t\t...(getLogHeaders()\n\t\t\t\t? { allHeaders: JSON.stringify(c.req.header()) }\n\t\t\t\t: {}),\n\t\t});\n\t};\n}\n\nexport function handleRouteNotFound(c: HonoContext) {\n\treturn c.text(\"Not Found (RivetKit)\", 404);\n}\n\nexport function handleRouteError(error: unknown, c: HonoContext) {\n\tconst exposeInternalError = getRequestExposeInternalError(c.req.raw);\n\n\tconst { statusCode, group, code, message, metadata } = deconstructError(\n\t\terror,\n\t\tlogger(),\n\t\t{\n\t\t\tmethod: c.req.method,\n\t\t\tpath: c.req.path,\n\t\t},\n\t\texposeInternalError,\n\t);\n\n\tlet encoding: Encoding;\n\ttry {\n\t\tencoding = getRequestEncoding(c.req);\n\t} catch (_) {\n\t\tencoding = \"json\";\n\t}\n\n\tconst errorData = { group, code, message, metadata };\n\tconst output = serializeWithEncoding(\n\t\tencoding,\n\t\terrorData,\n\t\tHTTP_RESPONSE_ERROR_VERSIONED,\n\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\tHttpResponseErrorSchema,\n\t\t// JSON: metadata is the raw value (will be serialized by jsonStringifyCompat)\n\t\t(value): HttpResponseErrorJson => ({\n\t\t\tgroup: value.group,\n\t\t\tcode: value.code,\n\t\t\tmessage: value.message,\n\t\t\tmetadata: value.metadata,\n\t\t}),\n\t\t// BARE/CBOR: metadata needs to be CBOR-encoded to ArrayBuffer\n\t\t(value): protocol.HttpResponseError => ({\n\t\t\tgroup: value.group,\n\t\t\tcode: value.code,\n\t\t\tmessage: value.message,\n\t\t\tmetadata: value.metadata\n\t\t\t\t? bufferToArrayBuffer(cbor.encode(value.metadata))\n\t\t\t\t: null,\n\t\t}),\n\t);\n\n\t// TODO: Remove any\n\treturn c.body(output as any, { status: statusCode });\n}\n\nexport type MetadataRunnerKind =\n\t| { serverless: Record<never, never> }\n\t| { normal: Record<never, never> };\n\n/**\n * Metadata response interface for the /metadata endpoint\n */\nexport interface MetadataResponse {\n\truntime: string;\n\tversion: string;\n\trunner?: {\n\t\tkind: MetadataRunnerKind;\n\t\tversion?: number;\n\t};\n\tactorNames: ReturnType<typeof buildActorNames>;\n\t/**\n\t * Endpoint that the client should connect to to access this runner.\n\t *\n\t * If defined, will override the endpoint the user has configured on startup.\n\t *\n\t * This is helpful if attempting to connect to a serverless runner, so the serverless runner can define where the main endpoint lives.\n\t *\n\t * This is also helpful for setting up clean redirects as needed.\n\t **/\n\tclientEndpoint?: string;\n\t/**\n\t * Namespace that the client should use when connecting.\n\t **/\n\tclientNamespace?: string;\n\t/**\n\t * Token that the client should use when connecting.\n\t **/\n\tclientToken?: string;\n}\n\nexport function handleMetadataRequest(\n\tc: HonoContext,\n\tconfig: RegistryConfig,\n\trunnerKind: MetadataRunnerKind,\n\tclientEndpoint: string | undefined,\n\tclientNamespace: string | undefined,\n\tclientToken: string | undefined,\n) {\n\tconst response: MetadataResponse = {\n\t\truntime: \"rivetkit\",\n\t\tversion: VERSION,\n\t\trunner: {\n\t\t\tkind: runnerKind,\n\t\t\tversion: config.runner.version,\n\t\t},\n\t\tactorNames: buildActorNames(config),\n\t\tclientEndpoint,\n\t\tclientNamespace,\n\t\tclientToken,\n\t};\n\n\treturn c.json(response);\n}\n\nexport function handleHealthRequest(c: HonoContext) {\n\treturn c.json({\n\t\tstatus: \"ok\",\n\t\truntime: \"rivetkit\",\n\t\tversion: VERSION,\n\t});\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext, HonoRequest } from \"hono\";\nimport type { AnyConn } from \"@/actor/conn/mod\";\nimport { ActionContext } from \"@/actor/contexts\";\nimport * as errors from \"@/actor/errors\";\nimport type { AnyActorInstance } from \"@/actor/instance/mod\";\nimport { type Encoding, EncodingSchema } from \"@/actor/protocol/serde\";\nimport { hasSchemaConfigKey } from \"@/actor/schema\";\nimport {\n\tHEADER_ACTOR_QUERY,\n\tHEADER_CONN_PARAMS,\n\tHEADER_ENCODING,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n} from \"@/common/actor-router-consts\";\nimport { stringifyError } from \"@/common/utils\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tHTTP_ACTION_REQUEST_VERSIONED,\n\tHTTP_ACTION_RESPONSE_VERSIONED,\n\tHTTP_QUEUE_SEND_REQUEST_VERSIONED,\n\tHTTP_QUEUE_SEND_RESPONSE_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype HttpActionRequest as HttpActionRequestJson,\n\tHttpActionRequestSchema,\n\ttype HttpActionResponse as HttpActionResponseJson,\n\tHttpActionResponseSchema,\n\ttype HttpQueueSendRequest as HttpQueueSendRequestJson,\n\tHttpQueueSendRequestSchema,\n\ttype HttpQueueSendResponse as HttpQueueSendResponseJson,\n\tHttpQueueSendResponseSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport {\n\tcontentTypeForEncoding,\n\tdeserializeWithEncoding,\n\tserializeWithEncoding,\n} from \"@/serde\";\nimport { bufferToArrayBuffer, getEnvUniversal } from \"@/utils\";\nimport { createHttpDriver } from \"./conn/drivers/http\";\nimport { createRawRequestDriver } from \"./conn/drivers/raw-request\";\nimport type { ActorDriver } from \"./driver\";\nimport { loggerWithoutContext } from \"./log\";\n\nexport interface ActionOpts {\n\treq?: HonoRequest;\n\tparams: unknown;\n\tactionName: string;\n\tactionArgs: unknown[];\n\tactorId: string;\n}\n\nexport interface ActionOutput {\n\toutput: unknown;\n}\n\nexport interface ConnsMessageOpts {\n\treq?: HonoRequest;\n\tconnId: string;\n\tmessage: protocol.ToServer;\n\tactorId: string;\n}\n\nexport interface FetchOpts {\n\trequest: Request;\n\tactorId: string;\n}\n\nexport interface QueueSendOpts {\n\treq?: HonoRequest;\n\tname: string;\n\tbody: unknown;\n\twait?: boolean;\n\ttimeout?: number;\n\tactorId: string;\n}\n\n/**\n * Creates an action handler\n */\nexport async function handleAction(\n\tc: HonoContext,\n\tconfig: RegistryConfig,\n\tactorDriver: ActorDriver,\n\tactionName: string,\n\tactorId: string,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst parameters = getRequestConnParams(c.req);\n\n\t// Validate incoming request\n\tconst arrayBuffer = await c.req.arrayBuffer();\n\n\t// Check message size\n\tif (arrayBuffer.byteLength > config.maxIncomingMessageSize) {\n\t\tthrow new errors.IncomingMessageTooLong();\n\t}\n\n\tconst request = deserializeWithEncoding(\n\t\tencoding,\n\t\tnew Uint8Array(arrayBuffer),\n\t\tHTTP_ACTION_REQUEST_VERSIONED,\n\t\tHttpActionRequestSchema,\n\t\t// JSON: args is already the decoded value (raw object/array)\n\t\t(json: HttpActionRequestJson) => json.args,\n\t\t// BARE/CBOR: args is ArrayBuffer that needs CBOR-decoding\n\t\t(bare: protocol.HttpActionRequest) =>\n\t\t\tcbor.decode(new Uint8Array(bare.args)),\n\t);\n\tconst actionArgs = request;\n\n\t// Invoke the action\n\tlet output: unknown | undefined;\n\tlet outputReady = false;\n\tconst maxAttempts = 3;\n\tfor (let attempt = 0; attempt < maxAttempts; attempt++) {\n\t\tlet actor: AnyActorInstance | undefined;\n\t\tlet conn: AnyConn | undefined;\n\t\ttry {\n\t\t\tactor = await actorDriver.loadActor(actorId);\n\n\t\t\tactor.rLog.debug({ msg: \"handling action\", actionName, encoding });\n\n\t\t\t// Create conn\n\t\t\tconn = await actor.connectionManager.prepareAndConnectConn(\n\t\t\t\tcreateHttpDriver(),\n\t\t\t\tparameters,\n\t\t\t\tc.req.raw,\n\t\t\t\tc.req.path,\n\t\t\t\tc.req.header(),\n\t\t\t);\n\n\t\t\t// Call action\n\t\t\tconst ctx = new ActionContext(actor, conn);\n\t\t\toutput = await actor.executeAction(ctx, actionName, actionArgs);\n\t\t\toutputReady = true;\n\t\t\tbreak;\n\t\t} catch (error) {\n\t\t\tconst shouldRetry =\n\t\t\t\terror instanceof errors.InternalError &&\n\t\t\t\terror.message === \"Actor is stopping\" &&\n\t\t\t\tattempt < maxAttempts - 1;\n\t\t\tif (shouldRetry) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 25));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (conn) {\n\t\t\t\tconn.disconnect();\n\t\t\t}\n\t\t}\n\t}\n\tif (!outputReady) {\n\t\tthrow new errors.InternalError(\"Action did not complete\");\n\t}\n\n\t// Send response\n\tconst serialized = serializeWithEncoding(\n\t\tencoding,\n\t\toutput,\n\t\tHTTP_ACTION_RESPONSE_VERSIONED,\n\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\tHttpActionResponseSchema,\n\t\t// JSON: output is the raw value (will be serialized by jsonStringifyCompat)\n\t\t(value): HttpActionResponseJson => ({ output: value }),\n\t\t// BARE/CBOR: output needs to be CBOR-encoded to ArrayBuffer\n\t\t(value): protocol.HttpActionResponse => ({\n\t\t\toutput: bufferToArrayBuffer(cbor.encode(value)),\n\t\t}),\n\t);\n\n\t// Check outgoing message size\n\tconst messageSize =\n\t\tserialized instanceof Uint8Array\n\t\t\t? serialized.byteLength\n\t\t\t: serialized.length;\n\tif (messageSize > config.maxOutgoingMessageSize) {\n\t\tthrow new errors.OutgoingMessageTooLong();\n\t}\n\n\t// TODO: Remove any, Hono is being a dumbass\n\treturn c.body(serialized as Uint8Array as any, 200, {\n\t\t\"Content-Type\": contentTypeForEncoding(encoding),\n\t});\n}\n\nexport async function handleQueueSend(\n\tc: HonoContext,\n\tconfig: RegistryConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tqueueName?: string,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst params = getRequestConnParams(c.req);\n\tconst arrayBuffer = await c.req.arrayBuffer();\n\n\tif (arrayBuffer.byteLength > config.maxIncomingMessageSize) {\n\t\tthrow new errors.IncomingMessageTooLong();\n\t}\n\n\tconst request = deserializeWithEncoding(\n\t\tencoding,\n\t\tnew Uint8Array(arrayBuffer),\n\t\tHTTP_QUEUE_SEND_REQUEST_VERSIONED,\n\t\tHttpQueueSendRequestSchema,\n\t\t(json: HttpQueueSendRequestJson) => json,\n\t\t(bare: protocol.HttpQueueSendRequest) => ({\n\t\t\tname: bare.name ?? undefined,\n\t\t\tbody: cbor.decode(new Uint8Array(bare.body)),\n\t\t\twait: bare.wait ?? undefined,\n\t\t\ttimeout:\n\t\t\t\tbare.timeout !== null && bare.timeout !== undefined\n\t\t\t\t\t? Number(bare.timeout)\n\t\t\t\t\t: undefined,\n\t\t}),\n\t);\n\n\tconst name = queueName ?? request.name;\n\tif (!name) {\n\t\tthrow new errors.InvalidRequest(\"missing queue name\");\n\t}\n\n\tconst actor = await actorDriver.loadActor(actorId);\n\tif (!hasSchemaConfigKey(actor.config.queues, name)) {\n\t\tactor.rLog.warn({\n\t\t\tmsg: \"ignoring incoming queue message for undefined queue\",\n\t\t\tqueueName: name,\n\t\t\thasQueueConfig: actor.config.queues !== undefined,\n\t\t});\n\t\tconst ignoredResponse = serializeWithEncoding(\n\t\t\tencoding,\n\t\t\t{ status: \"completed\" as const, response: undefined },\n\t\t\tHTTP_QUEUE_SEND_RESPONSE_VERSIONED,\n\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\tHttpQueueSendResponseSchema,\n\t\t\t(value): HttpQueueSendResponseJson => ({\n\t\t\t\tstatus: value.status,\n\t\t\t\tresponse: value.response,\n\t\t\t}),\n\t\t\t(value): protocol.HttpQueueSendResponse => ({\n\t\t\t\tstatus: value.status,\n\t\t\t\tresponse:\n\t\t\t\t\tvalue.response !== undefined\n\t\t\t\t\t\t? bufferToArrayBuffer(cbor.encode(value.response))\n\t\t\t\t\t\t: null,\n\t\t\t}),\n\t\t);\n\t\treturn c.body(ignoredResponse as Uint8Array as any, 200, {\n\t\t\t\"Content-Type\": contentTypeForEncoding(encoding),\n\t\t});\n\t}\n\n\tconst conn = await actor.connectionManager.prepareAndConnectConn(\n\t\tcreateHttpDriver(),\n\t\tparams,\n\t\tc.req.raw,\n\t\tc.req.path,\n\t\tc.req.header(),\n\t);\n\tlet result: { status: \"completed\" | \"timedOut\"; response?: unknown } = {\n\t\tstatus: \"completed\",\n\t};\n\ttry {\n\t\tconst ctx = new ActionContext(actor, conn);\n\t\tawait actor.assertCanPublish(ctx, name);\n\n\t\tif (request.wait) {\n\t\t\tresult = await actor.queueManager.enqueueAndWait(\n\t\t\t\tname,\n\t\t\t\trequest.body,\n\t\t\t\trequest.timeout,\n\t\t\t);\n\t\t} else {\n\t\t\tawait actor.queueManager.enqueue(name, request.body);\n\t\t}\n\t} finally {\n\t\tconn.disconnect();\n\t}\n\n\tconst response = serializeWithEncoding(\n\t\tencoding,\n\t\tresult,\n\t\tHTTP_QUEUE_SEND_RESPONSE_VERSIONED,\n\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\tHttpQueueSendResponseSchema,\n\t\t(value): HttpQueueSendResponseJson => ({\n\t\t\tstatus: value.status,\n\t\t\tresponse: value.response,\n\t\t}),\n\t\t(value): protocol.HttpQueueSendResponse => ({\n\t\t\tstatus: value.status,\n\t\t\tresponse:\n\t\t\t\tvalue.response !== undefined\n\t\t\t\t\t? bufferToArrayBuffer(cbor.encode(value.response))\n\t\t\t\t\t: null,\n\t\t}),\n\t);\n\n\treturn c.body(response as Uint8Array as any, 200, {\n\t\t\"Content-Type\": contentTypeForEncoding(encoding),\n\t});\n}\n\nexport async function handleRawRequest(\n\tc: HonoContext,\n\treq: Request,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n): Promise<Response> {\n\tconst actor = await actorDriver.loadActor(actorId);\n\tconst parameters = getRequestConnParams(c.req);\n\n\t// Track connection outside of scope for cleanup\n\tlet createdConn: AnyConn | undefined;\n\n\ttry {\n\t\tconst conn = await actor.connectionManager.prepareAndConnectConn(\n\t\t\tcreateRawRequestDriver(),\n\t\t\tparameters,\n\t\t\treq,\n\t\t\tc.req.path,\n\t\t\tc.req.header(),\n\t\t);\n\n\t\tcreatedConn = conn;\n\n\t\treturn await actor.handleRawRequest(conn, req);\n\t} finally {\n\t\t// Clean up the connection after the request completes\n\t\tif (createdConn) {\n\t\t\tcreatedConn.disconnect();\n\t\t}\n\t}\n}\n\n// Helper to get the connection encoding from a request\n//\n// Defaults to JSON if not provided so we can support vanilla curl requests easily.\nexport function getRequestEncoding(req: HonoRequest): Encoding {\n\tconst encodingParam = req.header(HEADER_ENCODING);\n\tif (!encodingParam) {\n\t\treturn \"json\";\n\t}\n\n\tconst result = EncodingSchema.safeParse(encodingParam);\n\tif (!result.success) {\n\t\tthrow new errors.InvalidEncoding(encodingParam as string);\n\t}\n\n\treturn result.data;\n}\n\n/**\n * Determines whether internal errors should be exposed to the client.\n * Returns true if RIVET_EXPOSE_ERRORS=1 or NODE_ENV=development.\n */\nexport function getRequestExposeInternalError(_req: Request): boolean {\n\treturn (\n\t\tgetEnvUniversal(\"RIVET_EXPOSE_ERRORS\") === \"1\" ||\n\t\tgetEnvUniversal(\"NODE_ENV\") === \"development\"\n\t);\n}\n\nexport function getRequestQuery(c: HonoContext): unknown {\n\t// Get query parameters for actor lookup\n\tconst queryParam = c.req.header(HEADER_ACTOR_QUERY);\n\tif (!queryParam) {\n\t\tloggerWithoutContext().error({ msg: \"missing query parameter\" });\n\t\tthrow new errors.InvalidRequest(\"missing query\");\n\t}\n\n\t// Parse the query JSON and validate with schema\n\ttry {\n\t\tconst parsed = JSON.parse(queryParam);\n\t\treturn parsed;\n\t} catch (error) {\n\t\tloggerWithoutContext().error({ msg: \"invalid query json\", error });\n\t\tthrow new errors.InvalidQueryJSON(error);\n\t}\n}\n\n// Helper to get connection parameters for the request\nexport function getRequestConnParams(req: HonoRequest): unknown {\n\tconst paramsParam = req.header(HEADER_CONN_PARAMS);\n\tif (!paramsParam) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\treturn JSON.parse(paramsParam);\n\t} catch (err) {\n\t\tthrow new errors.InvalidParams(\n\t\t\t`Invalid params JSON: ${stringifyError(err)}`,\n\t\t);\n\t}\n}\n","import type { Conn } from \"../../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../../definition\";\nimport type { ActorInstance } from \"../../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../../schema\";\nimport { ActorContext } from \"./actor\";\n\n/**\n * Base context for connection-based handlers.\n * Extends ActorContext with connection-specific functionality.\n */\nexport abstract class ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ActorContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tpublic readonly conn: Conn<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t) {\n\t\tsuper(actor);\n\t}\n}\n\nexport type ConnContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? ConnContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type { Conn } from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnContext } from \"./base/conn\";\n\n/**\n * Context for a remote procedure call.\n */\nexport class ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {}\n\n/**\n * Extracts the ActionContext type from an ActorDefinition.\n */\nexport type ActionContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? ActionContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type { AnyDatabaseProvider } from \"../../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../../definition\";\nimport type { ActorInstance } from \"../../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../../schema\";\nimport { ActorContext } from \"./actor\";\n\n/**\n * Base context for connection initialization handlers.\n * Extends ActorContext with request-specific functionality for connection lifecycle events.\n */\nexport abstract class ConnInitContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ActorContext<\n\tTState,\n\tnever,\n\tnever,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {\n\t/**\n\t * The incoming request that initiated the connection.\n\t * May be undefined for connections initiated without a direct HTTP request.\n\t */\n\tpublic readonly request: Request | undefined;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tany,\n\t\t\tany,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\trequest: Request | undefined,\n\t) {\n\t\tsuper(actor as any);\n\t\tthis.request = request;\n\t}\n}\n\nexport type ConnInitContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tany,\n\t\tany,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? ConnInitContext<S, V, I, DB, E, Q>\n\t\t: never;\n","import type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnInitContext } from \"./base/conn-init\";\n\n/**\n * Context for the onBeforeConnect lifecycle hook.\n */\nexport class BeforeConnectContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnInitContext<TState, TVars, TInput, TDatabase, TEvents, TQueues> {}\n\nexport type BeforeConnectContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tany,\n\t\tany,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? BeforeConnectContext<S, V, I, DB, E, Q>\n\t\t: never;\n","import type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnContext } from \"./base/conn\";\n\n/**\n * Context for the onConnect lifecycle hook.\n */\nexport class ConnectContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {}\n\nexport type ConnectContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? ConnectContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnInitContext } from \"./base/conn-init\";\n\n/**\n * Context for the createConnState lifecycle hook.\n * Called to initialize connection-specific state when a connection is created.\n */\nexport class CreateConnStateContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnInitContext<TState, TVars, TInput, TDatabase, TEvents, TQueues> {}\n\nexport type CreateConnStateContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tany,\n\t\tany,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? CreateConnStateContext<S, V, I, DB, E, Q>\n\t\t: never;\n","import type { Conn } from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnContext } from \"./base/conn\";\n\n/**\n * Context for raw HTTP request handlers (onRequest).\n */\nexport class RequestContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {\n\t/**\n\t * The incoming HTTP request.\n\t * May be undefined for request contexts initiated without a direct HTTP request.\n\t */\n\tpublic readonly request: Request | undefined;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tconn: Conn<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\trequest?: Request,\n\t) {\n\t\tsuper(actor, conn);\n\t\tthis.request = request;\n\t}\n}\n\nexport type RequestContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? RequestContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type { Conn } from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDefinition, AnyActorDefinition } from \"../definition\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { ConnContext } from \"./base/conn\";\n\n/**\n * Context for raw WebSocket handlers (onWebSocket).\n */\nexport class WebSocketContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTEvents,\n\tTQueues\n> {\n\t/**\n\t * The incoming HTTP request that initiated the WebSocket upgrade.\n\t * May be undefined for WebSocket connections initiated without a direct HTTP request.\n\t */\n\tpublic readonly request: Request | undefined;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tconn: Conn<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\trequest?: Request,\n\t) {\n\t\tsuper(actor, conn);\n\t\tthis.request = request;\n\t}\n}\n\nexport type WebSocketContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? WebSocketContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import * as cbor from \"cbor-x\";\nimport type { VersionedDataHandler } from \"vbare\";\nimport { z } from \"zod/v4\";\nimport * as errors from \"@/actor/errors\";\nimport { serializeWithEncoding } from \"@/serde\";\nimport { loggerWithoutContext } 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\", \"bare\"]);\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<TBare, TJson, T = TBare> {\n\t#data: T;\n\t#cache = new Map<Encoding, OutputData>();\n\t#versionedDataHandler: VersionedDataHandler<TBare>;\n\t#version: number;\n\t#zodSchema: z.ZodType<TJson>;\n\t#toJson: (value: T) => TJson;\n\t#toBare: (value: T) => TBare;\n\n\tconstructor(\n\t\tdata: T,\n\t\tversionedDataHandler: VersionedDataHandler<TBare>,\n\t\tversion: number,\n\t\tzodSchema: z.ZodType<TJson>,\n\t\ttoJson: (value: T) => TJson,\n\t\ttoBare: (value: T) => TBare,\n\t) {\n\t\tthis.#data = data;\n\t\tthis.#versionedDataHandler = versionedDataHandler;\n\t\tthis.#version = version;\n\t\tthis.#zodSchema = zodSchema;\n\t\tthis.#toJson = toJson;\n\t\tthis.#toBare = toBare;\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 = serializeWithEncoding(\n\t\t\t\tencoding,\n\t\t\t\tthis.#data,\n\t\t\t\tthis.#versionedDataHandler,\n\t\t\t\tthis.#version,\n\t\t\t\tthis.#zodSchema,\n\t\t\t\tthis.#toJson,\n\t\t\t\tthis.#toBare,\n\t\t\t);\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// */\n//export 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//\n//export 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\nfunction base64DecodeToUint8Array(base64: string): Uint8Array {\n\t// Check if Buffer is available (Node.js)\n\tif (typeof Buffer !== \"undefined\") {\n\t\treturn new Uint8Array(Buffer.from(base64, \"base64\"));\n\t}\n\n\t// Browser environment - use atob\n\tconst binary = atob(base64);\n\tconst len = binary.length;\n\tconst bytes = new Uint8Array(len);\n\tfor (let i = 0; i < len; i++) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\nfunction base64DecodeToArrayBuffer(base64: string): ArrayBuffer {\n\treturn base64DecodeToUint8Array(base64).buffer as ArrayBuffer;\n}\n\n/** Stringifies with compat for values that BARE & CBOR supports. */\nexport function jsonStringifyCompat(input: any): string {\n\treturn JSON.stringify(input, (_key, value) => {\n\t\tif (typeof value === \"bigint\") {\n\t\t\treturn [\"$BigInt\", value.toString()];\n\t\t} else if (value instanceof ArrayBuffer) {\n\t\t\treturn [\"$ArrayBuffer\", base64EncodeArrayBuffer(value)];\n\t\t} else if (value instanceof Uint8Array) {\n\t\t\treturn [\"$Uint8Array\", base64EncodeUint8Array(value)];\n\t\t}\n\n\t\t// Escape user arrays that start with $ by prepending another $\n\t\tif (\n\t\t\tArray.isArray(value) &&\n\t\t\tvalue.length === 2 &&\n\t\t\ttypeof value[0] === \"string\" &&\n\t\t\tvalue[0].startsWith(\"$\")\n\t\t) {\n\t\t\treturn [\"$\" + value[0], value[1]];\n\t\t}\n\n\t\treturn value;\n\t});\n}\n\n/** Parses JSON with compat for values that BARE & CBOR supports. */\nexport function jsonParseCompat(input: string): any {\n\treturn JSON.parse(input, (_key, value) => {\n\t\t// Handle arrays with $ prefix\n\t\tif (\n\t\t\tArray.isArray(value) &&\n\t\t\tvalue.length === 2 &&\n\t\t\ttypeof value[0] === \"string\" &&\n\t\t\tvalue[0].startsWith(\"$\")\n\t\t) {\n\t\t\t// Known special types\n\t\t\tif (value[0] === \"$BigInt\") {\n\t\t\t\treturn BigInt(value[1]);\n\t\t\t} else if (value[0] === \"$ArrayBuffer\") {\n\t\t\t\treturn base64DecodeToArrayBuffer(value[1]);\n\t\t\t} else if (value[0] === \"$Uint8Array\") {\n\t\t\t\treturn base64DecodeToUint8Array(value[1]);\n\t\t\t}\n\n\t\t\t// Unescape user arrays that started with $ ($$foo -> $foo)\n\t\t\tif (value[0].startsWith(\"$$\")) {\n\t\t\t\treturn [value[0].substring(1), value[1]];\n\t\t\t}\n\n\t\t\t// Unknown type starting with $ - this is an error\n\t\t\tthrow new Error(\n\t\t\t\t`Unknown JSON encoding type: ${value[0]}. This may indicate corrupted data or a version mismatch.`,\n\t\t\t);\n\t\t}\n\n\t\treturn value;\n\t});\n}\n","import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport type { VersionedDataHandler } from \"vbare\";\nimport type { z } from \"zod/v4\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport type { Encoding } from \"@/mod\";\nimport { jsonParseCompat, jsonStringifyCompat } from \"./actor/protocol/serde\";\n\nexport function uint8ArrayToBase64(uint8Array: Uint8Array): string {\n\t// Check if Buffer is available (Node.js)\n\tif (typeof Buffer !== \"undefined\") {\n\t\treturn Buffer.from(uint8Array).toString(\"base64\");\n\t}\n\n\t// Browser environment - use btoa\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\nexport function encodingIsBinary(encoding: Encoding): boolean {\n\tif (encoding === \"json\") {\n\t\treturn false;\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn true;\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function contentTypeForEncoding(encoding: Encoding): string {\n\tif (encoding === \"json\") {\n\t\treturn \"application/json\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"application/octet-stream\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function wsBinaryTypeForEncoding(\n\tencoding: Encoding,\n): \"arraybuffer\" | \"blob\" {\n\tif (encoding === \"json\") {\n\t\treturn \"blob\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"arraybuffer\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function serializeWithEncoding<TBare, TJson, T = TBare>(\n\tencoding: Encoding,\n\tvalue: T,\n\tversionedDataHandler: VersionedDataHandler<TBare> | undefined,\n\tversion: number | undefined,\n\tzodSchema: z.ZodType<TJson>,\n\ttoJson: (value: T) => TJson,\n\ttoBare: (value: T) => TBare,\n): Uint8Array | string {\n\tif (encoding === \"json\") {\n\t\tconst jsonValue = toJson(value);\n\t\tconst validated = zodSchema.parse(jsonValue);\n\t\treturn jsonStringifyCompat(validated);\n\t} else if (encoding === \"cbor\") {\n\t\tconst jsonValue = toJson(value);\n\t\tconst validated = zodSchema.parse(jsonValue);\n\t\treturn cbor.encode(validated);\n\t} else if (encoding === \"bare\") {\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\n\t\t\t\t\"VersionedDataHandler is required for 'bare' encoding\",\n\t\t\t);\n\t\t}\n\t\tif (version === undefined) {\n\t\t\tthrow new Error(\"version is required for 'bare' encoding\");\n\t\t}\n\t\tconst bareValue = toBare(value);\n\t\treturn versionedDataHandler.serializeWithEmbeddedVersion(\n\t\t\tbareValue,\n\t\t\tversion,\n\t\t);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function deserializeWithEncoding<TBare, TJson, T = TBare>(\n\tencoding: Encoding,\n\tbuffer: Uint8Array | string,\n\tversionedDataHandler: VersionedDataHandler<TBare> | undefined,\n\tzodSchema: z.ZodType<TJson>,\n\tfromJson: (value: TJson) => T,\n\tfromBare: (value: TBare) => T,\n): T {\n\tif (encoding === \"json\") {\n\t\tlet parsed: unknown;\n\t\tif (typeof buffer === \"string\") {\n\t\t\tparsed = jsonParseCompat(buffer);\n\t\t} else {\n\t\t\tconst decoder = new TextDecoder(\"utf-8\");\n\t\t\tconst jsonString = decoder.decode(buffer);\n\t\t\tparsed = jsonParseCompat(jsonString);\n\t\t}\n\t\tconst validated = zodSchema.parse(parsed);\n\t\treturn fromJson(validated);\n\t} else if (encoding === \"cbor\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for cbor encoding\",\n\t\t);\n\t\t// Decode CBOR to get JavaScript values (similar to JSON.parse)\n\t\tconst decoded: unknown = cbor.decode(buffer);\n\t\t// Validate with Zod schema (CBOR produces same structure as JSON)\n\t\tconst validated = zodSchema.parse(decoded);\n\t\t// CBOR decoding produces JS objects, use fromJson\n\t\treturn fromJson(validated);\n\t} else if (encoding === \"bare\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for bare encoding\",\n\t\t);\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\n\t\t\t\t\"VersionedDataHandler is required for 'bare' encoding\",\n\t\t\t);\n\t\t}\n\t\tconst bareValue =\n\t\t\tversionedDataHandler.deserializeWithEmbeddedVersion(buffer);\n\t\treturn fromBare(bareValue);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n","import { createVersionedDataHandler } from \"vbare\";\nimport * as v1 from \"../../../dist/schemas/client-protocol/v1\";\nimport * as v2 from \"../../../dist/schemas/client-protocol/v2\";\nimport * as v3 from \"../../../dist/schemas/client-protocol/v3\";\n\nexport const CURRENT_VERSION = 3;\n\n// Converter from v1 to v2: Remove connectionToken from Init message\nconst v1ToV2 = (v1Data: v1.ToClient): v2.ToClient => {\n\t// Handle Init message specifically to remove connectionToken\n\tif (v1Data.body.tag === \"Init\") {\n\t\tconst { actorId, connectionId } = v1Data.body.val as v1.Init;\n\t\treturn {\n\t\t\tbody: {\n\t\t\t\ttag: \"Init\",\n\t\t\t\tval: {\n\t\t\t\t\tactorId,\n\t\t\t\t\tconnectionId,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\t// All other messages are unchanged\n\treturn v1Data as unknown as v2.ToClient;\n};\n\n// Converter from v2 to v1: Add empty connectionToken to Init message\nconst v2ToV1 = (v2Data: v2.ToClient): v1.ToClient => {\n\t// Handle Init message specifically to add connectionToken\n\tif (v2Data.body.tag === \"Init\") {\n\t\tconst { actorId, connectionId } = v2Data.body.val;\n\t\treturn {\n\t\t\tbody: {\n\t\t\t\ttag: \"Init\",\n\t\t\t\tval: {\n\t\t\t\t\tactorId,\n\t\t\t\t\tconnectionId,\n\t\t\t\t\tconnectionToken: \"\", // Add empty connectionToken for v1 compatibility\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\t// All other messages are unchanged\n\treturn v2Data as unknown as v1.ToClient;\n};\n\n// Converter from v2 to v3: No changes needed for ToClient\nconst v2ToV3 = (v2Data: v2.ToClient): v3.ToClient => {\n\treturn v2Data as unknown as v3.ToClient;\n};\n\n// Converter from v3 to v2: No changes needed for ToClient\nconst v3ToV2 = (v3Data: v3.ToClient): v2.ToClient => {\n\treturn v3Data as unknown as v2.ToClient;\n};\n\n// ToServer identity converters (ToServer is identical across v1, v2, and v3)\nconst v1ToServerV2 = (v1Data: v1.ToServer): v2.ToServer => {\n\treturn v1Data as unknown as v2.ToServer;\n};\n\nconst v2ToServerV3 = (v2Data: v2.ToServer): v3.ToServer => {\n\treturn v2Data as unknown as v3.ToServer;\n};\n\nconst v3ToServerV2 = (v3Data: v3.ToServer): v2.ToServer => {\n\treturn v3Data as unknown as v2.ToServer;\n};\n\nconst v2ToServerV1 = (v2Data: v2.ToServer): v1.ToServer => {\n\treturn v2Data as unknown as v1.ToServer;\n};\n\nexport const TO_SERVER_VERSIONED = createVersionedDataHandler<v3.ToServer>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.decodeToServer(bytes);\n\t\t\tcase 2:\n\t\t\t\treturn v2.decodeToServer(bytes);\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeToServer(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.encodeToServer(data as v1.ToServer);\n\t\t\tcase 2:\n\t\t\t\treturn v2.encodeToServer(data as v2.ToServer);\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeToServer(data as v3.ToServer);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tdeserializeConverters: () => [v1ToServerV2, v2ToServerV3],\n\tserializeConverters: () => [v3ToServerV2, v2ToServerV1],\n});\n\nexport const TO_CLIENT_VERSIONED = createVersionedDataHandler<v3.ToClient>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.decodeToClient(bytes);\n\t\t\tcase 2:\n\t\t\t\treturn v2.decodeToClient(bytes);\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeToClient(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.encodeToClient(data as v1.ToClient);\n\t\t\tcase 2:\n\t\t\t\treturn v2.encodeToClient(data as v2.ToClient);\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeToClient(data as v3.ToClient);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tdeserializeConverters: () => [v1ToV2, v2ToV3],\n\tserializeConverters: () => [v3ToV2, v2ToV1],\n});\n\nexport const HTTP_ACTION_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpActionRequest>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.decodeHttpActionRequest(bytes);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.decodeHttpActionRequest(bytes);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpActionRequest(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.encodeHttpActionRequest(\n\t\t\t\t\t\tdata as v1.HttpActionRequest,\n\t\t\t\t\t);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.encodeHttpActionRequest(\n\t\t\t\t\t\tdata as v2.HttpActionRequest,\n\t\t\t\t\t);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpActionRequest(\n\t\t\t\t\t\tdata as v3.HttpActionRequest,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const HTTP_ACTION_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpActionResponse>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.decodeHttpActionResponse(bytes);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.decodeHttpActionResponse(bytes);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpActionResponse(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.encodeHttpActionResponse(\n\t\t\t\t\t\tdata as v1.HttpActionResponse,\n\t\t\t\t\t);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.encodeHttpActionResponse(\n\t\t\t\t\t\tdata as v2.HttpActionResponse,\n\t\t\t\t\t);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpActionResponse(\n\t\t\t\t\t\tdata as v3.HttpActionResponse,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const HTTP_QUEUE_SEND_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpQueueSendRequest>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpQueueSendRequest(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`HttpQueueSendRequest only exists in version 3+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpQueueSendRequest(\n\t\t\t\t\t\tdata as v3.HttpQueueSendRequest,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`HttpQueueSendRequest only exists in version 3+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const HTTP_QUEUE_SEND_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpQueueSendResponse>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpQueueSendResponse(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`HttpQueueSendResponse only exists in version 3+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpQueueSendResponse(\n\t\t\t\t\t\tdata as v3.HttpQueueSendResponse,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`HttpQueueSendResponse only exists in version 3+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const HTTP_RESPONSE_ERROR_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpResponseError>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.decodeHttpResponseError(bytes);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.decodeHttpResponseError(bytes);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpResponseError(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.encodeHttpResponseError(\n\t\t\t\t\t\tdata as v1.HttpResponseError,\n\t\t\t\t\t);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.encodeHttpResponseError(\n\t\t\t\t\t\tdata as v2.HttpResponseError,\n\t\t\t\t\t);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpResponseError(\n\t\t\t\t\t\tdata as v3.HttpResponseError,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const HTTP_RESOLVE_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v3.HttpResolveResponse>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.decodeHttpResolveResponse(bytes);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.decodeHttpResolveResponse(bytes);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.decodeHttpResolveResponse(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn v1.encodeHttpResolveResponse(\n\t\t\t\t\t\tdata as v1.HttpResolveResponse,\n\t\t\t\t\t);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn v2.encodeHttpResolveResponse(\n\t\t\t\t\t\tdata as v2.HttpResolveResponse,\n\t\t\t\t\t);\n\t\t\t\tcase 3:\n\t\t\t\t\treturn v3.encodeHttpResolveResponse(\n\t\t\t\t\t\tdata as v3.HttpResolveResponse,\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type uint = bigint\n\nexport type Init = {\n readonly actorId: string,\n readonly connectionId: string,\n readonly connectionToken: string,\n}\n\nexport function readInit(bc: bare.ByteCursor): Init {\n return {\n actorId: bare.readString(bc),\n connectionId: bare.readString(bc),\n connectionToken: bare.readString(bc),\n }\n}\n\nexport function writeInit(bc: bare.ByteCursor, x: Init): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.connectionId)\n bare.writeString(bc, x.connectionToken)\n}\n\nfunction read0(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write0(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nfunction read1(bc: bare.ByteCursor): uint | null {\n return bare.readBool(bc)\n ? bare.readUint(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: uint | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeUint(bc, x)\n }\n}\n\nexport type Error = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n readonly actionId: uint | null,\n}\n\nexport function readError(bc: bare.ByteCursor): Error {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n actionId: read1(bc),\n }\n}\n\nexport function writeError(bc: bare.ByteCursor, x: Error): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n write1(bc, x.actionId)\n}\n\nexport type ActionResponse = {\n readonly id: uint,\n readonly output: ArrayBuffer,\n}\n\nexport function readActionResponse(bc: bare.ByteCursor): ActionResponse {\n return {\n id: bare.readUint(bc),\n output: bare.readData(bc),\n }\n}\n\nexport function writeActionResponse(bc: bare.ByteCursor, x: ActionResponse): void {\n bare.writeUint(bc, x.id)\n bare.writeData(bc, x.output)\n}\n\nexport type Event = {\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readEvent(bc: bare.ByteCursor): Event {\n return {\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeEvent(bc: bare.ByteCursor, x: Event): void {\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type ToClientBody =\n | { readonly tag: \"Init\", readonly val: Init }\n | { readonly tag: \"Error\", readonly val: Error }\n | { readonly tag: \"ActionResponse\", readonly val: ActionResponse }\n | { readonly tag: \"Event\", readonly val: Event }\n\nexport function readToClientBody(bc: bare.ByteCursor): ToClientBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"Init\", val: readInit(bc) }\n case 1:\n return { tag: \"Error\", val: readError(bc) }\n case 2:\n return { tag: \"ActionResponse\", val: readActionResponse(bc) }\n case 3:\n return { tag: \"Event\", val: readEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToClientBody(bc: bare.ByteCursor, x: ToClientBody): void {\n switch (x.tag) {\n case \"Init\": {\n bare.writeU8(bc, 0)\n writeInit(bc, x.val)\n break\n }\n case \"Error\": {\n bare.writeU8(bc, 1)\n writeError(bc, x.val)\n break\n }\n case \"ActionResponse\": {\n bare.writeU8(bc, 2)\n writeActionResponse(bc, x.val)\n break\n }\n case \"Event\": {\n bare.writeU8(bc, 3)\n writeEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type ToClient = {\n readonly body: ToClientBody,\n}\n\nexport function readToClient(bc: bare.ByteCursor): ToClient {\n return {\n body: readToClientBody(bc),\n }\n}\n\nexport function writeToClient(bc: bare.ByteCursor, x: ToClient): void {\n writeToClientBody(bc, x.body)\n}\n\nexport function encodeToClient(x: ToClient): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToClient(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToClient(bytes: Uint8Array): ToClient {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToClient(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActionRequest = {\n readonly id: uint,\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readActionRequest(bc: bare.ByteCursor): ActionRequest {\n return {\n id: bare.readUint(bc),\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeActionRequest(bc: bare.ByteCursor, x: ActionRequest): void {\n bare.writeUint(bc, x.id)\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type SubscriptionRequest = {\n readonly eventName: string,\n readonly subscribe: boolean,\n}\n\nexport function readSubscriptionRequest(bc: bare.ByteCursor): SubscriptionRequest {\n return {\n eventName: bare.readString(bc),\n subscribe: bare.readBool(bc),\n }\n}\n\nexport function writeSubscriptionRequest(bc: bare.ByteCursor, x: SubscriptionRequest): void {\n bare.writeString(bc, x.eventName)\n bare.writeBool(bc, x.subscribe)\n}\n\nexport type ToServerBody =\n | { readonly tag: \"ActionRequest\", readonly val: ActionRequest }\n | { readonly tag: \"SubscriptionRequest\", readonly val: SubscriptionRequest }\n\nexport function readToServerBody(bc: bare.ByteCursor): ToServerBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"ActionRequest\", val: readActionRequest(bc) }\n case 1:\n return { tag: \"SubscriptionRequest\", val: readSubscriptionRequest(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToServerBody(bc: bare.ByteCursor, x: ToServerBody): void {\n switch (x.tag) {\n case \"ActionRequest\": {\n bare.writeU8(bc, 0)\n writeActionRequest(bc, x.val)\n break\n }\n case \"SubscriptionRequest\": {\n bare.writeU8(bc, 1)\n writeSubscriptionRequest(bc, x.val)\n break\n }\n }\n}\n\nexport type ToServer = {\n readonly body: ToServerBody,\n}\n\nexport function readToServer(bc: bare.ByteCursor): ToServer {\n return {\n body: readToServerBody(bc),\n }\n}\n\nexport function writeToServer(bc: bare.ByteCursor, x: ToServer): void {\n writeToServerBody(bc, x.body)\n}\n\nexport function encodeToServer(x: ToServer): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToServer(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToServer(bytes: Uint8Array): ToServer {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToServer(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionRequest = {\n readonly args: ArrayBuffer,\n}\n\nexport function readHttpActionRequest(bc: bare.ByteCursor): HttpActionRequest {\n return {\n args: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionRequest(bc: bare.ByteCursor, x: HttpActionRequest): void {\n bare.writeData(bc, x.args)\n}\n\nexport function encodeHttpActionRequest(x: HttpActionRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionRequest(bytes: Uint8Array): HttpActionRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionResponse = {\n readonly output: ArrayBuffer,\n}\n\nexport function readHttpActionResponse(bc: bare.ByteCursor): HttpActionResponse {\n return {\n output: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionResponse(bc: bare.ByteCursor, x: HttpActionResponse): void {\n bare.writeData(bc, x.output)\n}\n\nexport function encodeHttpActionResponse(x: HttpActionResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionResponse(bytes: Uint8Array): HttpActionResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResponseError = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n}\n\nexport function readHttpResponseError(bc: bare.ByteCursor): HttpResponseError {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n }\n}\n\nexport function writeHttpResponseError(bc: bare.ByteCursor, x: HttpResponseError): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n}\n\nexport function encodeHttpResponseError(x: HttpResponseError): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResponseError(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResponseError(bytes: Uint8Array): HttpResponseError {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResponseError(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResolveRequest = null\n\nexport type HttpResolveResponse = {\n readonly actorId: string,\n}\n\nexport function readHttpResolveResponse(bc: bare.ByteCursor): HttpResolveResponse {\n return {\n actorId: bare.readString(bc),\n }\n}\n\nexport function writeHttpResolveResponse(bc: bare.ByteCursor, x: HttpResolveResponse): void {\n bare.writeString(bc, x.actorId)\n}\n\nexport function encodeHttpResolveResponse(x: HttpResolveResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResolveResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResolveResponse(bytes: Uint8Array): HttpResolveResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResolveResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type uint = bigint\n\nexport type Init = {\n readonly actorId: string,\n readonly connectionId: string,\n}\n\nexport function readInit(bc: bare.ByteCursor): Init {\n return {\n actorId: bare.readString(bc),\n connectionId: bare.readString(bc),\n }\n}\n\nexport function writeInit(bc: bare.ByteCursor, x: Init): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.connectionId)\n}\n\nfunction read0(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write0(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nfunction read1(bc: bare.ByteCursor): uint | null {\n return bare.readBool(bc)\n ? bare.readUint(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: uint | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeUint(bc, x)\n }\n}\n\nexport type Error = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n readonly actionId: uint | null,\n}\n\nexport function readError(bc: bare.ByteCursor): Error {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n actionId: read1(bc),\n }\n}\n\nexport function writeError(bc: bare.ByteCursor, x: Error): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n write1(bc, x.actionId)\n}\n\nexport type ActionResponse = {\n readonly id: uint,\n readonly output: ArrayBuffer,\n}\n\nexport function readActionResponse(bc: bare.ByteCursor): ActionResponse {\n return {\n id: bare.readUint(bc),\n output: bare.readData(bc),\n }\n}\n\nexport function writeActionResponse(bc: bare.ByteCursor, x: ActionResponse): void {\n bare.writeUint(bc, x.id)\n bare.writeData(bc, x.output)\n}\n\nexport type Event = {\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readEvent(bc: bare.ByteCursor): Event {\n return {\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeEvent(bc: bare.ByteCursor, x: Event): void {\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type ToClientBody =\n | { readonly tag: \"Init\", readonly val: Init }\n | { readonly tag: \"Error\", readonly val: Error }\n | { readonly tag: \"ActionResponse\", readonly val: ActionResponse }\n | { readonly tag: \"Event\", readonly val: Event }\n\nexport function readToClientBody(bc: bare.ByteCursor): ToClientBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"Init\", val: readInit(bc) }\n case 1:\n return { tag: \"Error\", val: readError(bc) }\n case 2:\n return { tag: \"ActionResponse\", val: readActionResponse(bc) }\n case 3:\n return { tag: \"Event\", val: readEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToClientBody(bc: bare.ByteCursor, x: ToClientBody): void {\n switch (x.tag) {\n case \"Init\": {\n bare.writeU8(bc, 0)\n writeInit(bc, x.val)\n break\n }\n case \"Error\": {\n bare.writeU8(bc, 1)\n writeError(bc, x.val)\n break\n }\n case \"ActionResponse\": {\n bare.writeU8(bc, 2)\n writeActionResponse(bc, x.val)\n break\n }\n case \"Event\": {\n bare.writeU8(bc, 3)\n writeEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type ToClient = {\n readonly body: ToClientBody,\n}\n\nexport function readToClient(bc: bare.ByteCursor): ToClient {\n return {\n body: readToClientBody(bc),\n }\n}\n\nexport function writeToClient(bc: bare.ByteCursor, x: ToClient): void {\n writeToClientBody(bc, x.body)\n}\n\nexport function encodeToClient(x: ToClient): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToClient(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToClient(bytes: Uint8Array): ToClient {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToClient(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActionRequest = {\n readonly id: uint,\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readActionRequest(bc: bare.ByteCursor): ActionRequest {\n return {\n id: bare.readUint(bc),\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeActionRequest(bc: bare.ByteCursor, x: ActionRequest): void {\n bare.writeUint(bc, x.id)\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type SubscriptionRequest = {\n readonly eventName: string,\n readonly subscribe: boolean,\n}\n\nexport function readSubscriptionRequest(bc: bare.ByteCursor): SubscriptionRequest {\n return {\n eventName: bare.readString(bc),\n subscribe: bare.readBool(bc),\n }\n}\n\nexport function writeSubscriptionRequest(bc: bare.ByteCursor, x: SubscriptionRequest): void {\n bare.writeString(bc, x.eventName)\n bare.writeBool(bc, x.subscribe)\n}\n\nexport type ToServerBody =\n | { readonly tag: \"ActionRequest\", readonly val: ActionRequest }\n | { readonly tag: \"SubscriptionRequest\", readonly val: SubscriptionRequest }\n\nexport function readToServerBody(bc: bare.ByteCursor): ToServerBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"ActionRequest\", val: readActionRequest(bc) }\n case 1:\n return { tag: \"SubscriptionRequest\", val: readSubscriptionRequest(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToServerBody(bc: bare.ByteCursor, x: ToServerBody): void {\n switch (x.tag) {\n case \"ActionRequest\": {\n bare.writeU8(bc, 0)\n writeActionRequest(bc, x.val)\n break\n }\n case \"SubscriptionRequest\": {\n bare.writeU8(bc, 1)\n writeSubscriptionRequest(bc, x.val)\n break\n }\n }\n}\n\nexport type ToServer = {\n readonly body: ToServerBody,\n}\n\nexport function readToServer(bc: bare.ByteCursor): ToServer {\n return {\n body: readToServerBody(bc),\n }\n}\n\nexport function writeToServer(bc: bare.ByteCursor, x: ToServer): void {\n writeToServerBody(bc, x.body)\n}\n\nexport function encodeToServer(x: ToServer): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToServer(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToServer(bytes: Uint8Array): ToServer {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToServer(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionRequest = {\n readonly args: ArrayBuffer,\n}\n\nexport function readHttpActionRequest(bc: bare.ByteCursor): HttpActionRequest {\n return {\n args: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionRequest(bc: bare.ByteCursor, x: HttpActionRequest): void {\n bare.writeData(bc, x.args)\n}\n\nexport function encodeHttpActionRequest(x: HttpActionRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionRequest(bytes: Uint8Array): HttpActionRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionResponse = {\n readonly output: ArrayBuffer,\n}\n\nexport function readHttpActionResponse(bc: bare.ByteCursor): HttpActionResponse {\n return {\n output: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionResponse(bc: bare.ByteCursor, x: HttpActionResponse): void {\n bare.writeData(bc, x.output)\n}\n\nexport function encodeHttpActionResponse(x: HttpActionResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionResponse(bytes: Uint8Array): HttpActionResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResponseError = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n}\n\nexport function readHttpResponseError(bc: bare.ByteCursor): HttpResponseError {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n }\n}\n\nexport function writeHttpResponseError(bc: bare.ByteCursor, x: HttpResponseError): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n}\n\nexport function encodeHttpResponseError(x: HttpResponseError): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResponseError(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResponseError(bytes: Uint8Array): HttpResponseError {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResponseError(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResolveRequest = null\n\nexport type HttpResolveResponse = {\n readonly actorId: string,\n}\n\nexport function readHttpResolveResponse(bc: bare.ByteCursor): HttpResolveResponse {\n return {\n actorId: bare.readString(bc),\n }\n}\n\nexport function writeHttpResolveResponse(bc: bare.ByteCursor, x: HttpResolveResponse): void {\n bare.writeString(bc, x.actorId)\n}\n\nexport function encodeHttpResolveResponse(x: HttpResolveResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResolveResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResolveResponse(bytes: Uint8Array): HttpResolveResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResolveResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type u64 = bigint\nexport type uint = bigint\n\nexport type Init = {\n readonly actorId: string,\n readonly connectionId: string,\n}\n\nexport function readInit(bc: bare.ByteCursor): Init {\n return {\n actorId: bare.readString(bc),\n connectionId: bare.readString(bc),\n }\n}\n\nexport function writeInit(bc: bare.ByteCursor, x: Init): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.connectionId)\n}\n\nfunction read0(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write0(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nfunction read1(bc: bare.ByteCursor): uint | null {\n return bare.readBool(bc)\n ? bare.readUint(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: uint | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeUint(bc, x)\n }\n}\n\nexport type Error = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n readonly actionId: uint | null,\n}\n\nexport function readError(bc: bare.ByteCursor): Error {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n actionId: read1(bc),\n }\n}\n\nexport function writeError(bc: bare.ByteCursor, x: Error): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n write1(bc, x.actionId)\n}\n\nexport type ActionResponse = {\n readonly id: uint,\n readonly output: ArrayBuffer,\n}\n\nexport function readActionResponse(bc: bare.ByteCursor): ActionResponse {\n return {\n id: bare.readUint(bc),\n output: bare.readData(bc),\n }\n}\n\nexport function writeActionResponse(bc: bare.ByteCursor, x: ActionResponse): void {\n bare.writeUint(bc, x.id)\n bare.writeData(bc, x.output)\n}\n\nexport type Event = {\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readEvent(bc: bare.ByteCursor): Event {\n return {\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeEvent(bc: bare.ByteCursor, x: Event): void {\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type ToClientBody =\n | { readonly tag: \"Init\", readonly val: Init }\n | { readonly tag: \"Error\", readonly val: Error }\n | { readonly tag: \"ActionResponse\", readonly val: ActionResponse }\n | { readonly tag: \"Event\", readonly val: Event }\n\nexport function readToClientBody(bc: bare.ByteCursor): ToClientBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"Init\", val: readInit(bc) }\n case 1:\n return { tag: \"Error\", val: readError(bc) }\n case 2:\n return { tag: \"ActionResponse\", val: readActionResponse(bc) }\n case 3:\n return { tag: \"Event\", val: readEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToClientBody(bc: bare.ByteCursor, x: ToClientBody): void {\n switch (x.tag) {\n case \"Init\": {\n bare.writeU8(bc, 0)\n writeInit(bc, x.val)\n break\n }\n case \"Error\": {\n bare.writeU8(bc, 1)\n writeError(bc, x.val)\n break\n }\n case \"ActionResponse\": {\n bare.writeU8(bc, 2)\n writeActionResponse(bc, x.val)\n break\n }\n case \"Event\": {\n bare.writeU8(bc, 3)\n writeEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type ToClient = {\n readonly body: ToClientBody,\n}\n\nexport function readToClient(bc: bare.ByteCursor): ToClient {\n return {\n body: readToClientBody(bc),\n }\n}\n\nexport function writeToClient(bc: bare.ByteCursor, x: ToClient): void {\n writeToClientBody(bc, x.body)\n}\n\nexport function encodeToClient(x: ToClient): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToClient(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToClient(bytes: Uint8Array): ToClient {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToClient(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActionRequest = {\n readonly id: uint,\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readActionRequest(bc: bare.ByteCursor): ActionRequest {\n return {\n id: bare.readUint(bc),\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeActionRequest(bc: bare.ByteCursor, x: ActionRequest): void {\n bare.writeUint(bc, x.id)\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type SubscriptionRequest = {\n readonly eventName: string,\n readonly subscribe: boolean,\n}\n\nexport function readSubscriptionRequest(bc: bare.ByteCursor): SubscriptionRequest {\n return {\n eventName: bare.readString(bc),\n subscribe: bare.readBool(bc),\n }\n}\n\nexport function writeSubscriptionRequest(bc: bare.ByteCursor, x: SubscriptionRequest): void {\n bare.writeString(bc, x.eventName)\n bare.writeBool(bc, x.subscribe)\n}\n\nexport type ToServerBody =\n | { readonly tag: \"ActionRequest\", readonly val: ActionRequest }\n | { readonly tag: \"SubscriptionRequest\", readonly val: SubscriptionRequest }\n\nexport function readToServerBody(bc: bare.ByteCursor): ToServerBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"ActionRequest\", val: readActionRequest(bc) }\n case 1:\n return { tag: \"SubscriptionRequest\", val: readSubscriptionRequest(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToServerBody(bc: bare.ByteCursor, x: ToServerBody): void {\n switch (x.tag) {\n case \"ActionRequest\": {\n bare.writeU8(bc, 0)\n writeActionRequest(bc, x.val)\n break\n }\n case \"SubscriptionRequest\": {\n bare.writeU8(bc, 1)\n writeSubscriptionRequest(bc, x.val)\n break\n }\n }\n}\n\nexport type ToServer = {\n readonly body: ToServerBody,\n}\n\nexport function readToServer(bc: bare.ByteCursor): ToServer {\n return {\n body: readToServerBody(bc),\n }\n}\n\nexport function writeToServer(bc: bare.ByteCursor, x: ToServer): void {\n writeToServerBody(bc, x.body)\n}\n\nexport function encodeToServer(x: ToServer): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToServer(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToServer(bytes: Uint8Array): ToServer {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToServer(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionRequest = {\n readonly args: ArrayBuffer,\n}\n\nexport function readHttpActionRequest(bc: bare.ByteCursor): HttpActionRequest {\n return {\n args: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionRequest(bc: bare.ByteCursor, x: HttpActionRequest): void {\n bare.writeData(bc, x.args)\n}\n\nexport function encodeHttpActionRequest(x: HttpActionRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionRequest(bytes: Uint8Array): HttpActionRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionResponse = {\n readonly output: ArrayBuffer,\n}\n\nexport function readHttpActionResponse(bc: bare.ByteCursor): HttpActionResponse {\n return {\n output: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionResponse(bc: bare.ByteCursor, x: HttpActionResponse): void {\n bare.writeData(bc, x.output)\n}\n\nexport function encodeHttpActionResponse(x: HttpActionResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionResponse(bytes: Uint8Array): HttpActionResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nfunction read2(bc: bare.ByteCursor): string | null {\n return bare.readBool(bc)\n ? bare.readString(bc)\n : null\n}\n\nfunction write2(bc: bare.ByteCursor, x: string | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeString(bc, x)\n }\n}\n\nfunction read3(bc: bare.ByteCursor): boolean | null {\n return bare.readBool(bc)\n ? bare.readBool(bc)\n : null\n}\n\nfunction write3(bc: bare.ByteCursor, x: boolean | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeBool(bc, x)\n }\n}\n\nfunction read4(bc: bare.ByteCursor): u64 | null {\n return bare.readBool(bc)\n ? bare.readU64(bc)\n : null\n}\n\nfunction write4(bc: bare.ByteCursor, x: u64 | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeU64(bc, x)\n }\n}\n\nexport type HttpQueueSendRequest = {\n readonly body: ArrayBuffer,\n readonly name: string | null,\n readonly wait: boolean | null,\n readonly timeout: u64 | null,\n}\n\nexport function readHttpQueueSendRequest(bc: bare.ByteCursor): HttpQueueSendRequest {\n return {\n body: bare.readData(bc),\n name: read2(bc),\n wait: read3(bc),\n timeout: read4(bc),\n }\n}\n\nexport function writeHttpQueueSendRequest(bc: bare.ByteCursor, x: HttpQueueSendRequest): void {\n bare.writeData(bc, x.body)\n write2(bc, x.name)\n write3(bc, x.wait)\n write4(bc, x.timeout)\n}\n\nexport function encodeHttpQueueSendRequest(x: HttpQueueSendRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpQueueSendRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpQueueSendRequest(bytes: Uint8Array): HttpQueueSendRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpQueueSendRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpQueueSendResponse = {\n readonly status: string,\n readonly response: ArrayBuffer | null,\n}\n\nexport function readHttpQueueSendResponse(bc: bare.ByteCursor): HttpQueueSendResponse {\n return {\n status: bare.readString(bc),\n response: read0(bc),\n }\n}\n\nexport function writeHttpQueueSendResponse(bc: bare.ByteCursor, x: HttpQueueSendResponse): void {\n bare.writeString(bc, x.status)\n write0(bc, x.response)\n}\n\nexport function encodeHttpQueueSendResponse(x: HttpQueueSendResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpQueueSendResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpQueueSendResponse(bytes: Uint8Array): HttpQueueSendResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpQueueSendResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResponseError = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n}\n\nexport function readHttpResponseError(bc: bare.ByteCursor): HttpResponseError {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n }\n}\n\nexport function writeHttpResponseError(bc: bare.ByteCursor, x: HttpResponseError): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n}\n\nexport function encodeHttpResponseError(x: HttpResponseError): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResponseError(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResponseError(bytes: Uint8Array): HttpResponseError {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResponseError(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResolveRequest = null\n\nexport type HttpResolveResponse = {\n readonly actorId: string,\n}\n\nexport function readHttpResolveResponse(bc: bare.ByteCursor): HttpResolveResponse {\n return {\n actorId: bare.readString(bc),\n }\n}\n\nexport function writeHttpResolveResponse(bc: bare.ByteCursor, x: HttpResolveResponse): void {\n bare.writeString(bc, x.actorId)\n}\n\nexport function encodeHttpResolveResponse(x: HttpResolveResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResolveResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResolveResponse(bytes: Uint8Array): HttpResolveResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResolveResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","import { z } from \"zod/v4\";\n\n// Helper schemas\nconst UintSchema = z.bigint();\nconst OptionalUintSchema = UintSchema.nullable();\n\n// MARK: Message To Client\nexport const InitSchema = z.object({\n\tactorId: z.string(),\n\tconnectionId: z.string(),\n});\nexport type Init = z.infer<typeof InitSchema>;\n\nexport const ErrorSchema = z.object({\n\tgroup: z.string(),\n\tcode: z.string(),\n\tmessage: z.string(),\n\tmetadata: z.unknown().optional(),\n\tactionId: OptionalUintSchema,\n});\nexport type Error = z.infer<typeof ErrorSchema>;\n\nexport const ActionResponseSchema = z.object({\n\tid: UintSchema,\n\toutput: z.unknown(),\n});\nexport type ActionResponse = z.infer<typeof ActionResponseSchema>;\n\nexport const EventSchema = z.object({\n\tname: z.string(),\n\targs: z.unknown(),\n});\nexport type Event = z.infer<typeof EventSchema>;\n\nexport const ToClientBodySchema = z.discriminatedUnion(\"tag\", [\n\tz.object({ tag: z.literal(\"Init\"), val: InitSchema }),\n\tz.object({ tag: z.literal(\"Error\"), val: ErrorSchema }),\n\tz.object({ tag: z.literal(\"ActionResponse\"), val: ActionResponseSchema }),\n\tz.object({ tag: z.literal(\"Event\"), val: EventSchema }),\n]);\nexport type ToClientBody = z.infer<typeof ToClientBodySchema>;\n\nexport const ToClientSchema = z.object({\n\tbody: ToClientBodySchema,\n});\nexport type ToClient = z.infer<typeof ToClientSchema>;\n\n// MARK: Message To Server\nexport const ActionRequestSchema = z.object({\n\tid: UintSchema,\n\tname: z.string(),\n\targs: z.unknown(),\n});\nexport type ActionRequest = z.infer<typeof ActionRequestSchema>;\n\nexport const SubscriptionRequestSchema = z.object({\n\teventName: z.string(),\n\tsubscribe: z.boolean(),\n});\nexport type SubscriptionRequest = z.infer<typeof SubscriptionRequestSchema>;\n\nexport const ToServerBodySchema = z.discriminatedUnion(\"tag\", [\n\tz.object({ tag: z.literal(\"ActionRequest\"), val: ActionRequestSchema }),\n\tz.object({\n\t\ttag: z.literal(\"SubscriptionRequest\"),\n\t\tval: SubscriptionRequestSchema,\n\t}),\n]);\nexport type ToServerBody = z.infer<typeof ToServerBodySchema>;\n\nexport const ToServerSchema = z.object({\n\tbody: ToServerBodySchema,\n});\nexport type ToServer = z.infer<typeof ToServerSchema>;\n\n// MARK: HTTP Action\nexport const HttpActionRequestSchema = z.object({\n\targs: z.unknown(),\n});\nexport type HttpActionRequest = z.infer<typeof HttpActionRequestSchema>;\n\nexport const HttpActionResponseSchema = z.object({\n\toutput: z.unknown(),\n});\nexport type HttpActionResponse = z.infer<typeof HttpActionResponseSchema>;\n\n// MARK: HTTP Queue\nexport const HttpQueueSendRequestSchema = z.object({\n\tbody: z.unknown(),\n\tname: z.string().optional(),\n\twait: z.boolean().optional(),\n\ttimeout: z.number().optional(),\n});\nexport type HttpQueueSendRequest = z.infer<typeof HttpQueueSendRequestSchema>;\n\nexport const HttpQueueSendResponseSchema = z.object({\n\tstatus: z.enum([\"completed\", \"timedOut\"]),\n\tresponse: z.unknown().optional(),\n});\nexport type HttpQueueSendResponse = z.infer<typeof HttpQueueSendResponseSchema>;\n\n// MARK: HTTP Error\nexport const HttpResponseErrorSchema = z.object({\n\tgroup: z.string(),\n\tcode: z.string(),\n\tmessage: z.string(),\n\tmetadata: z.unknown().optional(),\n});\nexport type HttpResponseError = z.infer<typeof HttpResponseErrorSchema>;\n\n// MARK: HTTP Resolve\nexport const HttpResolveRequestSchema = z.null();\nexport type HttpResolveRequest = z.infer<typeof HttpResolveRequestSchema>;\n\nexport const HttpResolveResponseSchema = z.object({\n\tactorId: z.string(),\n});\nexport type HttpResolveResponse = z.infer<typeof HttpResolveResponseSchema>;\n","import { type ConnDriver, DriverReadyState } from \"../driver\";\n\nexport type ConnHttpState = Record<never, never>;\n\nexport function createHttpDriver(): ConnDriver {\n\treturn {\n\t\ttype: \"http\",\n\t\tgetConnectionReadyState(_actor, _conn) {\n\t\t\t// TODO: This might not be the correct logic\n\t\t\treturn DriverReadyState.OPEN;\n\t\t},\n\t\tdisconnect: async () => {\n\t\t\t// Noop\n\t\t\t// TODO: Configure with abort signals to abort the request\n\t\t},\n\t};\n}\n","import type { ConnDriver } from \"../driver\";\nimport { DriverReadyState } from \"../driver\";\n\n/**\n * Creates a raw HTTP connection driver.\n *\n * This driver is used for raw HTTP connections that don't use the RivetKit protocol.\n * Unlike the standard HTTP driver, this provides connection lifecycle management\n * for tracking the HTTP request through the actor's onRequest handler.\n */\nexport function createRawRequestDriver(): ConnDriver {\n\treturn {\n\t\ttype: \"raw-request\",\n\n\t\tdisconnect: async () => {\n\t\t\t// Noop\n\t\t},\n\n\t\tgetConnectionReadyState: (): DriverReadyState | undefined => {\n\t\t\t// HTTP connections are always considered open until the request completes\n\t\t\treturn DriverReadyState.OPEN;\n\t\t},\n\t};\n}\n","import { z } from \"zod\";\nimport { getRunMetadata } from \"@/actor/config\";\nimport type { ActorDefinition, AnyActorDefinition } from \"@/actor/definition\";\nimport { type Logger, LogLevelSchema } from \"@/common/log\";\nimport { ENGINE_ENDPOINT } from \"@/engine-process/constants\";\nimport { InspectorConfigSchema } from \"@/inspector/config\";\nimport { DeepReadonly } from \"@/utils\";\nimport { tryParseEndpoint } from \"@/utils/endpoint-parser\";\nimport {\n\tgetRivetEndpoint,\n\tgetRivetEngine,\n\tgetRivetkitStoragePath,\n\tgetRivetNamespace,\n\tgetRivetToken,\n\tisDev,\n} from \"@/utils/env-vars\";\nimport { type DriverConfig, DriverConfigSchema } from \"./driver\";\nimport { RunnerConfigSchema } from \"./runner\";\nimport { ServerlessConfigSchema } from \"./serverless\";\n\nexport { DriverConfigSchema, type DriverConfig };\n\nexport const ActorsSchema = z.record(\n\tz.string(),\n\tz.custom<ActorDefinition<any, any, any, any, any, any, any, any, any>>(),\n);\nexport type RegistryActors = z.infer<typeof ActorsSchema>;\n\nexport const TestConfigSchema = z.object({ enabled: z.boolean() });\nexport type TestConfig = z.infer<typeof TestConfigSchema>;\n\n// TODO: Add sane defaults for NODE_ENV=development\nexport const RegistryConfigSchema = z\n\t.object({\n\t\t// MARK: Actors\n\t\tuse: z.record(z.string(), z.custom<AnyActorDefinition>()),\n\n\t\t// TODO: Find a better way of passing around the test config\n\t\t/**\n\t\t * Test configuration.\n\t\t *\n\t\t * DO NOT MANUALLY ENABLE. THIS IS USED INTERNALLY.\n\t\t * @internal\n\t\t **/\n\t\ttest: TestConfigSchema.optional().default({ enabled: false }),\n\n\t\t// MARK: Driver\n\t\tdriver: DriverConfigSchema.optional(),\n\t\t/**\n\t\t * Storage path for RivetKit file-system state when using the default driver.\n\t\t *\n\t\t * If not set, RivetKit uses the platform default data location.\n\t\t *\n\t\t * Can also be set via RIVETKIT_STORAGE_PATH.\n\t\t */\n\t\tstoragePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetkitStoragePath()),\n\n\t\t// MARK: Networking\n\t\t/** @experimental */\n\t\tmaxIncomingMessageSize: z.number().optional().default(65_536),\n\n\t\t/** @experimental */\n\t\tmaxOutgoingMessageSize: z.number().optional().default(1_048_576),\n\n\t\t// MARK: Runtime\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Disable welcome message.\n\t\t * */\n\t\tnoWelcome: z.boolean().optional().default(false),\n\n\t\t/**\n\t\t * @experimental\n\t\t * */\n\t\tlogging: z\n\t\t\t.object({\n\t\t\t\tbaseLogger: z.custom<Logger>().optional(),\n\t\t\t\tlevel: LogLevelSchema.optional(),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.default(() => ({})),\n\n\t\t// MARK: Routing\n\t\t// // This is a function to allow for lazy configuration of upgradeWebSocket on the\n\t\t// // fly. This is required since the dependencies that upgradeWebSocket\n\t\t// // (specifically Node.js) can sometimes only be specified after the router is\n\t\t// // created or must be imported async using `await import(...)`\n\t\t// getUpgradeWebSocket: z.custom<GetUpgradeWebSocket>().optional(),\n\n\t\t// MARK: Runner Configuration\n\t\t/**\n\t\t * Endpoint to connect to for Rivet Engine.\n\t\t *\n\t\t * Supports URL auth syntax for namespace and token:\n\t\t * - `https://namespace:token@api.rivet.dev`\n\t\t * - `https://namespace@api.rivet.dev`\n\t\t *\n\t\t * Can also be set via RIVET_ENDPOINT environment variables.\n\t\t */\n\t\tendpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetEngine() ?? getRivetEndpoint()),\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetToken()),\n\t\tnamespace: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((val) => val ?? getRivetNamespace()),\n\t\theaders: z.record(z.string(), z.string()).optional().default({}),\n\n\t\t// MARK: Client\n\t\t// TODO:\n\t\t// client: ClientConfigSchema.optional(),\n\n\t\t// MARK: Manager\n\t\t/**\n\t\t * Whether to start the local manager server.\n\t\t * Auto-determined based on endpoint and NODE_ENV if not specified.\n\t\t */\n\t\tserveManager: z.boolean().optional(),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Base path for the manager API. This is used to prefix all routes.\n\t\t * For example, if the base path is `/foo`, then the route `/actors`\n\t\t * will be available at `/foo/actors`.\n\t\t */\n\t\tmanagerBasePath: z.string().optional().default(\"/\"),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * What port to run the manager on.\n\t\t */\n\t\tmanagerPort: z.number().optional().default(6420),\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * What host to bind the manager server to.\n\t\t */\n\t\tmanagerHost: z.string().optional(),\n\n\t\t/** @experimental */\n\t\tinspector: InspectorConfigSchema,\n\n\t\t// MARK: Runtime-specific\n\t\tserverless: ServerlessConfigSchema.optional().default(() =>\n\t\t\tServerlessConfigSchema.parse({}),\n\t\t),\n\t\trunner: RunnerConfigSchema.optional().default(() =>\n\t\t\tRunnerConfigSchema.parse({}),\n\t\t),\n\t})\n\t.transform((config, ctx) => {\n\t\tconst isDevEnv = isDev();\n\n\t\t// Parse endpoint string (env var fallback is applied via transform above)\n\t\tconst parsedEndpoint = config.endpoint\n\t\t\t? tryParseEndpoint(ctx, {\n\t\t\t\t\tendpoint: config.endpoint,\n\t\t\t\t\tpath: [\"endpoint\"],\n\t\t\t\t\tnamespace: config.namespace,\n\t\t\t\t\ttoken: config.token,\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\tif (parsedEndpoint && config.serveManager) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"cannot specify both endpoint and serveManager\",\n\t\t\t});\n\t\t}\n\n\t\t// Can't spawn engine AND connect to remote endpoint\n\t\tif (config.serverless.spawnEngine && parsedEndpoint) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: \"cannot specify both spawnEngine and endpoint\",\n\t\t\t});\n\t\t}\n\n\t\t// configureRunnerPool requires an engine (via endpoint or spawnEngine)\n\t\tif (\n\t\t\tconfig.serverless.configureRunnerPool &&\n\t\t\t!parsedEndpoint &&\n\t\t\t!config.serverless.spawnEngine\n\t\t) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"configureRunnerPool requires either endpoint or spawnEngine\",\n\t\t\t});\n\t\t}\n\n\t\t// Flatten the endpoint and apply defaults for namespace/token\n\t\t// If spawnEngine is enabled, set endpoint to the engine endpoint\n\t\tconst endpoint = config.serverless.spawnEngine\n\t\t\t? ENGINE_ENDPOINT\n\t\t\t: parsedEndpoint?.endpoint;\n\t\t// Namespace priority: parsed from endpoint URL > config value (includes env var) > \"default\"\n\t\tconst namespace =\n\t\t\tparsedEndpoint?.namespace ?? config.namespace ?? \"default\";\n\t\t// Token priority: parsed from endpoint URL > config value (includes env var)\n\t\tconst token = parsedEndpoint?.token ?? config.token;\n\n\t\t// Parse publicEndpoint string (env var fallback is applied via transform in serverless schema)\n\t\tconst parsedPublicEndpoint = config.serverless.publicEndpoint\n\t\t\t? tryParseEndpoint(ctx, {\n\t\t\t\t\tendpoint: config.serverless.publicEndpoint,\n\t\t\t\t\tpath: [\"serverless\", \"publicEndpoint\"],\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\t// Validate that publicEndpoint namespace matches backend namespace if specified\n\t\tif (\n\t\t\tparsedPublicEndpoint?.namespace &&\n\t\t\tparsedPublicEndpoint.namespace !== namespace\n\t\t) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tmessage: `publicEndpoint namespace \"${parsedPublicEndpoint.namespace}\" must match backend namespace \"${namespace}\"`,\n\t\t\t\tpath: [\"serverless\", \"publicEndpoint\"],\n\t\t\t});\n\t\t}\n\n\t\t// Determine serveManager: default to true in dev mode without endpoint, false otherwise\n\t\tconst serveManager = config.serveManager ?? (isDevEnv && !endpoint);\n\n\t\t// In dev mode, fall back to 127.0.0.1 if serving manager\n\t\tconst publicEndpoint =\n\t\t\tparsedPublicEndpoint?.endpoint ??\n\t\t\t(isDevEnv && (serveManager || config.serverless.spawnEngine)\n\t\t\t\t? `http://127.0.0.1:${config.managerPort}`\n\t\t\t\t: undefined);\n\t\t// We extract publicNamespace to validate that it matches the backend\n\t\t// namespace (see validation above), not for functional use.\n\t\tconst publicNamespace = parsedPublicEndpoint?.namespace;\n\t\tconst publicToken =\n\t\t\tparsedPublicEndpoint?.token ?? config.serverless.publicToken;\n\n\t\t// If endpoint is set or spawning engine, we'll use engine driver - disable manager inspector\n\t\tconst willUseEngine = !!endpoint || config.serverless.spawnEngine;\n\t\tconst inspector = willUseEngine\n\t\t\t? {\n\t\t\t\t\t...config.inspector,\n\t\t\t\t\tenabled: { manager: false, actor: true },\n\t\t\t\t}\n\t\t\t: config.inspector;\n\n\t\treturn {\n\t\t\t...config,\n\t\t\tendpoint,\n\t\t\tnamespace,\n\t\t\ttoken,\n\t\t\tserveManager,\n\t\t\tpublicEndpoint,\n\t\t\tpublicNamespace,\n\t\t\tpublicToken,\n\t\t\tinspector,\n\t\t\tserverless: {\n\t\t\t\t...config.serverless,\n\t\t\t\tpublicEndpoint,\n\t\t\t},\n\t\t};\n\t});\n\nexport type RegistryConfig = z.infer<typeof RegistryConfigSchema>;\nexport type RegistryConfigInput<A extends RegistryActors> = Omit<\n\tz.input<typeof RegistryConfigSchema>,\n\t\"use\"\n> & { use: A };\n\nexport function buildActorNames(\n\tconfig: RegistryConfig,\n): Record<string, { metadata: Record<string, unknown> }> {\n\treturn Object.fromEntries(\n\t\tObject.keys(config.use).map((actorName) => {\n\t\t\tconst definition = config.use[actorName];\n\t\t\tconst options = definition.config.options ?? {};\n\t\t\tconst runMeta = getRunMetadata(definition.config.run);\n\t\t\tconst metadata: Record<string, unknown> = {};\n\t\t\t// Actor options take precedence over run metadata\n\t\t\tmetadata.icon = options.icon ?? runMeta.icon;\n\t\t\tmetadata.name = options.name ?? runMeta.name;\n\t\t\t// Remove undefined values\n\t\t\tif (!metadata.icon) delete metadata.icon;\n\t\t\tif (!metadata.name) delete metadata.name;\n\t\t\treturn [actorName, { metadata }];\n\t\t}),\n\t);\n}\n\n// MARK: Documentation Schemas\n// These schemas are JSON-serializable versions used for documentation generation.\n// They exclude runtime-only fields (transforms, custom types, Logger instances).\n\nexport const DocInspectorConfigSchema = z\n\t.object({\n\t\tenabled: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Whether to enable the Rivet Inspector. Defaults to true in development mode.\",\n\t\t\t),\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Token used to access the Inspector.\"),\n\t\tdefaultEndpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Default RivetKit server endpoint for Rivet Inspector to connect to.\",\n\t\t\t),\n\t})\n\t.optional()\n\t.describe(\"Inspector configuration for debugging and development.\");\n\nexport const DocConfigureRunnerPoolSchema = z\n\t.object({\n\t\tname: z.string().optional().describe(\"Name of the runner pool.\"),\n\t\turl: z\n\t\t\t.string()\n\t\t\t.describe(\"URL of the serverless platform to configure runners.\"),\n\t\theaders: z\n\t\t\t.record(z.string(), z.string())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Headers to include in requests to the serverless platform.\",\n\t\t\t),\n\t\tmaxRunners: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Maximum number of runners in the pool.\"),\n\t\tminRunners: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Minimum number of runners to keep warm.\"),\n\t\trequestLifespan: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Maximum lifespan of a request in milliseconds.\"),\n\t\trunnersMargin: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Buffer margin for scaling runners.\"),\n\t\tslotsPerRunner: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Number of actor slots per runner.\"),\n\t\tmetadata: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Additional metadata to pass to the serverless platform.\",\n\t\t\t),\n\t\tmetadataPollInterval: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Interval in milliseconds between metadata polls from the engine. Defaults to 10000 milliseconds (10 seconds).\",\n\t\t\t),\n\t})\n\t.optional();\n\nexport const DocServerlessConfigSchema = z\n\t.object({\n\t\tspawnEngine: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Downloads and starts the full Rust engine process. Auto-enabled in development mode when no endpoint is provided. Default: false\",\n\t\t\t),\n\t\tengineVersion: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Version of the engine to download. Defaults to the current RivetKit version.\",\n\t\t\t),\n\t\tconfigureRunnerPool: DocConfigureRunnerPoolSchema.describe(\n\t\t\t\"Automatically configure serverless runners in the engine.\",\n\t\t),\n\t\tbasePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Base path for serverless API routes. Default: '/api/rivet'\",\n\t\t\t),\n\t\tpublicEndpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"The endpoint that clients should connect to. Supports URL auth syntax: https://namespace:token@api.rivet.dev\",\n\t\t\t),\n\t\tpublicToken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Token that clients should use when connecting via the public endpoint.\",\n\t\t\t),\n\t})\n\t.describe(\"Configuration for serverless deployment mode.\");\n\nexport const DocRunnerConfigSchema = z\n\t.object({\n\t\ttotalSlots: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Total number of actor slots available. Default: 100000\"),\n\t\trunnerName: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Name of this runner. Default: 'default'\"),\n\t\trunnerKey: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Authentication key for the runner.\"),\n\t\tversion: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Version number of this runner. Default: 1\"),\n\t})\n\t.describe(\"Configuration for runner mode.\");\n\nexport const DocRegistryConfigSchema = z\n\t.object({\n\t\tuse: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.describe(\n\t\t\t\t\"Actor definitions. Keys are actor names, values are actor definitions.\",\n\t\t\t),\n\t\tstoragePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Storage path for RivetKit file-system state when using the default driver. Can also be set via RIVETKIT_STORAGE_PATH.\",\n\t\t\t),\n\t\tmaxIncomingMessageSize: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Maximum size of incoming WebSocket messages in bytes. Default: 65536\",\n\t\t\t),\n\t\tmaxOutgoingMessageSize: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Maximum size of outgoing WebSocket messages in bytes. Default: 1048576\",\n\t\t\t),\n\t\tnoWelcome: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\"Disable the welcome message on startup. Default: false\"),\n\t\tlogging: z\n\t\t\t.object({\n\t\t\t\tlevel: LogLevelSchema.optional().describe(\n\t\t\t\t\t\"Log level for RivetKit. Default: 'warn'\",\n\t\t\t\t),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.describe(\"Logging configuration.\"),\n\t\tendpoint: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Endpoint URL to connect to Rivet Engine. Supports URL auth syntax: https://namespace:token@api.rivet.dev. Can also be set via RIVET_ENDPOINT environment variable.\",\n\t\t\t),\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Authentication token for Rivet Engine. Can also be set via RIVET_TOKEN environment variable.\",\n\t\t\t),\n\t\tnamespace: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Namespace to use. Default: 'default'. Can also be set via RIVET_NAMESPACE environment variable.\",\n\t\t\t),\n\t\theaders: z\n\t\t\t.record(z.string(), z.string())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Additional headers to include in requests to Rivet Engine.\",\n\t\t\t),\n\t\tserveManager: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Whether to start the local manager server. Auto-determined based on endpoint and NODE_ENV if not specified.\",\n\t\t\t),\n\t\tmanagerBasePath: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.describe(\"Base path for the manager API. Default: '/'\"),\n\t\tmanagerPort: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Port to run the manager on. Default: 6420\"),\n\t\tinspector: DocInspectorConfigSchema,\n\t\tserverless: DocServerlessConfigSchema.optional(),\n\t\trunner: DocRunnerConfigSchema.optional(),\n\t})\n\t.describe(\"RivetKit registry configuration.\");\n","export const ENGINE_PORT = 6420;\nexport const ENGINE_ENDPOINT = `http://127.0.0.1:${ENGINE_PORT}`;\n","import { z } from \"zod/v4\";\nimport {\n\tgetRivetkitInspectorToken,\n\tisDev,\n\tgetRivetkitInspectorDisable,\n} from \"@/utils/env-vars\";\n\nconst defaultTokenFn = () => {\n\tconst envToken = getRivetkitInspectorToken();\n\n\tif (envToken) {\n\t\treturn envToken;\n\t}\n\n\treturn \"\";\n};\n\nconst defaultEnabled = () => {\n\treturn (\n\t\tisDev() ||\n\t\t!getRivetkitInspectorDisable()\n\t);\n};\n\nexport const InspectorConfigSchema = z\n\t.object({\n\t\tenabled: z.boolean().default(defaultEnabled),\n\n\t\t/**\n\t\t * Token used to access the Inspector.\n\t\t */\n\t\ttoken: z\n\t\t\t.custom<() => string>()\n\t\t\t.optional()\n\t\t\t.default(() => defaultTokenFn),\n\n\t\t/**\n\t\t * Default RivetKit server endpoint for Rivet Inspector to connect to. This should be the same endpoint as what you use for your Rivet client to connect to RivetKit.\n\t\t *\n\t\t * This is a convenience property just for printing out the inspector URL.\n\t\t */\n\t\tdefaultEndpoint: z.string().optional(),\n\t})\n\t.optional()\n\t.default(() => ({\n\t\tenabled: defaultEnabled(),\n\t\ttoken: defaultTokenFn,\n\t}));\nexport type InspectorConfig = z.infer<typeof InspectorConfigSchema>;\n","import { z } from \"zod/v4\";\n\nexport interface ParsedEndpoint {\n\tendpoint: string;\n\tnamespace: string | undefined;\n\ttoken: string | undefined;\n}\n\nexport interface TryParseEndpointOptions {\n\t/** The endpoint URL string to parse */\n\tendpoint: string;\n\t/** Path prefix for error messages (default: [\"endpoint\"]) */\n\tpath?: (string | number)[];\n\t/** Namespace from config, to check for duplicate specification */\n\tnamespace?: string;\n\t/** Token from config, to check for duplicate specification */\n\ttoken?: string;\n}\n\n/**\n * Parses an endpoint URL that may contain auth syntax for namespace and token.\n *\n * Uses ctx.addIssue for clean error reporting in Zod transforms.\n *\n * Supports formats like:\n * - `https://namespace:token@api.rivet.dev`\n * - `https://namespace@api.rivet.dev` (namespace only, no token)\n * - `https://api.rivet.dev` (no auth)\n * - `https://namespace:token@api.rivet.dev/path` (with path)\n *\n * Query strings and fragments are not allowed as they may conflict with\n * runtime parameters.\n *\n * @param ctx - Zod refinement context for error reporting\n * @param options - Parsing options including endpoint, path, and config values\n * @returns ParsedEndpoint on success, undefined on error (after adding issues to ctx)\n */\nexport function tryParseEndpoint(\n\tctx: z.RefinementCtx,\n\toptions: TryParseEndpointOptions,\n): ParsedEndpoint | undefined {\n\tconst { endpoint, path = [\"endpoint\"], namespace: configNamespace, token: configToken } = options;\n\t// Parse the URL\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(endpoint);\n\t} catch {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: `invalid URL: ${endpoint}`,\n\t\t\tpath,\n\t\t});\n\t\treturn undefined;\n\t}\n\n\t// Reject query strings\n\tif (url.search) {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: \"endpoint cannot contain a query string\",\n\t\t\tpath,\n\t\t});\n\t\treturn undefined;\n\t}\n\n\t// Reject fragments\n\tif (url.hash) {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: \"endpoint cannot contain a fragment\",\n\t\t\tpath,\n\t\t});\n\t\treturn undefined;\n\t}\n\n\t// Extract namespace and token from username and password\n\t// URL stores these as percent-encoded, so we need to decode them\n\tconst namespace = url.username\n\t\t? decodeURIComponent(url.username)\n\t\t: undefined;\n\tconst token = url.password ? decodeURIComponent(url.password) : undefined;\n\n\t// Reject token without namespace (e.g., https://:token@api.rivet.dev)\n\tif (token && !namespace) {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage: \"endpoint cannot have a token without a namespace\",\n\t\t\tpath,\n\t\t});\n\t\treturn undefined;\n\t}\n\n\t// Check for duplicate credentials (specified both in URL and config)\n\tif (namespace && configNamespace) {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage:\n\t\t\t\t\"cannot specify namespace both in endpoint URL and as a separate config option\",\n\t\t\tpath: [\"namespace\"],\n\t\t});\n\t}\n\tif (token && configToken) {\n\t\tctx.addIssue({\n\t\t\tcode: \"custom\",\n\t\t\tmessage:\n\t\t\t\t\"cannot specify token both in endpoint URL and as a separate config option\",\n\t\t\tpath: [\"token\"],\n\t\t});\n\t}\n\n\t// Strip auth from the URL by clearing username and password\n\turl.username = \"\";\n\turl.password = \"\";\n\n\t// Get the cleaned endpoint without auth\n\tconst cleanedEndpoint = url.toString();\n\n\treturn {\n\t\tendpoint: cleanedEndpoint,\n\t\tnamespace,\n\t\ttoken,\n\t};\n}\n\n","import { z } from \"zod/v4\";\nimport { ActorDriverBuilder } from \"@/actor/driver\";\nimport { ManagerDriverBuilder } from \"@/manager/driver\";\n\nexport const DriverConfigSchema = z.object({\n\t/** Machine-readable name to identify this driver by. */\n\tname: z.string(),\n\tdisplayName: z.string(),\n\tmanager: z.custom<ManagerDriverBuilder>(),\n\tactor: z.custom<ActorDriverBuilder>(),\n\t/**\n\t * Start actor driver immediately or if this is started separately.\n\t *\n\t * For example:\n\t * - Engine driver needs this to start immediately since this starts the Runner that connects to the engine\n\t * - Cloudflare Workers should not start it automatically, since the actor only runs in the DO\n\t * */\n\tautoStartActorDriver: z.boolean(),\n});\n\nexport type DriverConfig = z.infer<typeof DriverConfigSchema>;\n","import { z } from \"zod/v4\";\nimport {\n\tisDev,\n\tgetRivetTotalSlots,\n\tgetRivetRunner,\n\tgetRivetRunnerKey,\n\tgetRivetRunnerVersion,\n} from \"@/utils/env-vars\";\n\nexport const RunnerConfigSchema = z.object({\n\t// MARK: Runner\n\ttotalSlots: z.number().default(() => getRivetTotalSlots() ?? 100000),\n\trunnerName: z.string().default(() => getRivetRunner() ?? \"default\"),\n\trunnerKey: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((x) => x ?? getRivetRunnerKey()),\n\tversion: z.number().default(() => getRivetRunnerVersion() ?? 1),\n});\nexport type RunnerConfigInput = z.input<typeof RunnerConfigSchema>;\nexport type RunnerConfig = z.infer<typeof RunnerConfigSchema>;\n","import { z } from \"zod/v4\";\nimport { VERSION } from \"@/utils\";\nimport {\n\tgetRivetRunEngineVersion,\n\tgetRivetRunEngine,\n\tgetRivetPublicEndpoint,\n\tgetRivetPublicToken,\n} from \"@/utils/env-vars\";\n\nexport const ConfigureRunnerPoolSchema = z\n\t.object({\n\t\tname: z.string().optional(),\n\t\turl: z.string(),\n\t\theaders: z.record(z.string(), z.string()).optional(),\n\t\tmaxRunners: z.number().optional(),\n\t\tminRunners: z.number().optional(),\n\t\trequestLifespan: z.number().optional(),\n\t\trunnersMargin: z.number().optional(),\n\t\tslotsPerRunner: z.number().optional(),\n\t\tmetadata: z.record(z.string(), z.unknown()).optional(),\n\t\tmetadataPollInterval: z.number().optional(),\n\t\tdrainOnVersionUpgrade: z.boolean().optional(),\n\t})\n\t.optional();\n\nexport const ServerlessConfigSchema = z.object({\n\t// MARK: Run Engine\n\t/**\n\t * @experimental\n\t *\n\t * Downloads and starts the full Rust engine process.\n\t * Auto-enabled in development mode when no endpoint is provided.\n\t */\n\tspawnEngine: z.boolean().default(() => getRivetRunEngine()),\n\n\t/** @experimental */\n\tengineVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.default(() => getRivetRunEngineVersion() ?? VERSION),\n\n\t/**\n\t * @experimental\n\t *\n\t * Automatically configure serverless runners in the engine.\n\t * Can only be used when runnerKind is \"serverless\".\n\t * If true, uses default configuration. Can also provide custom configuration.\n\t */\n\tconfigureRunnerPool: ConfigureRunnerPoolSchema.optional(),\n\n\t// MARK: Routing\n\t// TODO: serverlessBasePath? better naming?\n\tbasePath: z.string().optional().default(\"/api/rivet\"),\n\n\t// MARK: Public Endpoint Configuration\n\t/**\n\t * The endpoint that clients should connect to.\n\t *\n\t * This is useful if clients connect to serverless directly\n\t * (e.g. `http://localhost:3000/api/rivet`), they will fetch\n\t * `http://localhost:3000/api/rivet/metadata` and be redirected to\n\t * the public endpoint.\n\t *\n\t * Supports URL auth syntax for namespace and token:\n\t * - `https://namespace:token@api.rivet.dev`\n\t * - `https://namespace@api.rivet.dev`\n\t *\n\t * Auto-determined based on endpoint and NODE_ENV if not specified.\n\t *\n\t * Can also be set via RIVET_PUBLIC_ENDPOINT environment variable.\n\t */\n\tpublicEndpoint: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetPublicEndpoint()),\n\n\t/**\n\t * Token that clients should use when connecting via the public endpoint.\n\t *\n\t * Can also be set via RIVET_PUBLIC_TOKEN environment variable.\n\t *\n\t * Can also be specified in the publicEndpoint URL as `https://namespace:token@host`.\n\t */\n\tpublicToken: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetPublicToken()),\n\n\t// There is no publicNamespace config option because the frontend and backend\n\t// cannot use different namespaces. The namespace is extracted from the\n\t// publicEndpoint URL auth syntax if provided.\n});\nexport type ServerlessConfigInput = z.input<typeof ServerlessConfigSchema>;\nexport type ServerlessConfig = z.infer<typeof ServerlessConfigSchema>;\n","\nimport { extract } from \"tar\";\nimport { getNodeFs, getNodeOs, getNodePath, getNodeUrl } from \"@/utils/node\";\n\nlet extractedDir: string | undefined;\nlet extractionPromise: Promise<string> | undefined;\n\nexport async function getInspectorDir(): Promise<string> {\n\tif (extractedDir !== undefined) return extractedDir;\n\tif (extractionPromise !== undefined) return extractionPromise;\n\n\tconst nodeFs = getNodeFs();\n\tconst os = getNodeOs();\n\tconst url = getNodeUrl();\n\tconst path = getNodePath();\n\n\textractionPromise = (async () => {\n\t\tconst tarball = path.join(\n\t\t\tpath.dirname(url.fileURLToPath(import.meta.url)),\n\t\t\t\"../../dist/inspector.tar.gz\",\n\t\t);\n\n\t\ttry {\n\t\t\tawait nodeFs.access(tarball);\n\t\t} catch {\n\t\t\tthrow new Error(\n\t\t\t\t`Inspector tarball not found at ${tarball}. Run 'pnpm build:pack-inspector' first.`,\n\t\t\t);\n\t\t}\n\n\t\tconst dest = path.join(os.tmpdir(), \"rivetkit-inspector\");\n\t\tawait nodeFs.mkdir(dest, { recursive: true });\n\t\tawait extract({ file: tarball, cwd: dest });\n\n\t\textractedDir = dest;\n\t\treturn dest;\n\t})();\n\n\treturn extractionPromise;\n}\n","import { createRequire } from \"node:module\";\n\n// Global variables for Node.js modules.\n//\n// We use synchronous require() instead of async import() for Node.js module loading because:\n// 1. These modules are only needed in Node.js environments (not browser/edge)\n// 2. registry.start() cannot be async and needs immediate access to Node modules\n// 3. The setup process must be synchronous to avoid breaking the API\n//\n// Biome only allows imports of node modules in this file in order to ensure\n// we're forcing the use of dynamic imports.\nlet nodeCrypto: typeof import(\"node:crypto\") | undefined;\nlet nodeFsSync: typeof import(\"node:fs\") | undefined;\nlet nodeFs: typeof import(\"node:fs/promises\") | undefined;\nlet nodePath: typeof import(\"node:path\") | undefined;\nlet nodeOs: typeof import(\"node:os\") | undefined;\nlet nodeChildProcess: typeof import(\"node:child_process\") | undefined;\nlet nodeStream: typeof import(\"node:stream/promises\") | undefined;\nlet nodeUrl: typeof import(\"node:url\") | undefined;\n\nlet hasImportedDependencies = false;\n\n// Helper to get a require function that works in both CommonJS and ESM.\n// We use require() instead of await import() because registry.start() cannot\n// be async and needs immediate access to Node.js modules during setup.\nexport function getRequireFn() {\n\t// TODO: This causes issues in tsup\n\t// CommonJS context - use global require\n\t// if (typeof require !== \"undefined\") {\n\t// \tconsole.log(\"existing require\");\n\t// \treturn require;\n\t// }\n\n\t// ESM context - use createRequire with import.meta.url\n\treturn createRequire(import.meta.url);\n}\n\n/**\n * Dynamically imports all required Node.js dependencies. We do this early in a\n * single function call in order to surface errors early.\n *\n * This function is idempotent and will only import once.\n *\n * @throws Error if Node.js modules are not available (e.g., in browser/edge environments)\n */\nexport function importNodeDependencies(): void {\n\t// Check if already loaded\n\tif (hasImportedDependencies) return;\n\n\ttry {\n\t\t// Get a require function that works in both CommonJS and ESM\n\t\tconst requireFn = getRequireFn();\n\n\t\t// Use requireFn with webpack ignore comment to prevent bundling\n\t\tnodeCrypto = requireFn(/* webpackIgnore: true */ \"node:crypto\");\n\t\tnodeFsSync = requireFn(/* webpackIgnore: true */ \"node:fs\");\n\t\tnodeFs = requireFn(/* webpackIgnore: true */ \"node:fs/promises\");\n\t\tnodePath = requireFn(/* webpackIgnore: true */ \"node:path\");\n\t\tnodeOs = requireFn(/* webpackIgnore: true */ \"node:os\");\n\t\tnodeChildProcess = requireFn(\n\t\t\t/* webpackIgnore: true */ \"node:child_process\",\n\t\t);\n\t\tnodeStream = requireFn(\n\t\t\t/* webpackIgnore: true */ \"node:stream/promises\",\n\t\t);\n\t\tnodeUrl = requireFn(/* webpackIgnore: true */ \"node:url\");\n\t\thasImportedDependencies = true;\n\t} catch (err) {\n\t\tconsole.warn(\n\t\t\t\"Node.js modules not available, file system driver will not work\",\n\t\t\terr,\n\t\t);\n\t\tthrow err;\n\t}\n}\n\n/**\n * Gets the Node.js crypto module.\n * @throws Error if crypto module is not loaded\n */\nexport function getNodeCrypto(): typeof import(\"node:crypto\") {\n\tif (!nodeCrypto) {\n\t\tthrow new Error(\n\t\t\t\"Node crypto module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeCrypto;\n}\n\n/**\n * Gets the Node.js fs module.\n * @throws Error if fs module is not loaded\n */\nexport function getNodeFsSync(): typeof import(\"node:fs\") {\n\tif (!nodeFsSync) {\n\t\tthrow new Error(\n\t\t\t\"Node fs module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeFsSync;\n}\n\n/**\n * Gets the Node.js fs/promises module.\n * @throws Error if fs/promises module is not loaded\n */\nexport function getNodeFs(): typeof import(\"node:fs/promises\") {\n\tif (!nodeFs) {\n\t\tthrow new Error(\n\t\t\t\"Node fs/promises module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeFs;\n}\n\n/**\n * Gets the Node.js path module.\n * @throws Error if path module is not loaded\n */\nexport function getNodePath(): typeof import(\"node:path\") {\n\tif (!nodePath) {\n\t\tthrow new Error(\n\t\t\t\"Node path module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodePath;\n}\n\n/**\n * Gets the Node.js os module.\n * @throws Error if os module is not loaded\n */\nexport function getNodeOs(): typeof import(\"node:os\") {\n\tif (!nodeOs) {\n\t\tthrow new Error(\n\t\t\t\"Node os module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeOs;\n}\n\n/**\n * Gets the Node.js child_process module.\n * @throws Error if child_process module is not loaded\n */\nexport function getNodeChildProcess(): typeof import(\"node:child_process\") {\n\tif (!nodeChildProcess) {\n\t\tthrow new Error(\n\t\t\t\"Node child_process module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeChildProcess;\n}\n\n/**\n * Gets the Node.js stream/promises module.\n * @throws Error if stream/promises module is not loaded\n */\nexport function getNodeStream(): typeof import(\"node:stream/promises\") {\n\tif (!nodeStream) {\n\t\tthrow new Error(\n\t\t\t\"Node stream/promises module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeStream;\n}\n\n/**\n * Gets the Node.js url module lazily.\n */\nexport function getNodeUrl(): typeof import(\"node:url\") {\n\tif (!nodeUrl) {\n\t\tthrow new Error(\n\t\t\t\"Node url module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeUrl;\n}","import { z } from \"zod/v4\";\nimport { RivetIdSchema } from \"./common\";\n\nexport const ActorSchema = z.object({\n\tactor_id: RivetIdSchema,\n\tname: z.string(),\n\tkey: z.string(),\n\tnamespace_id: RivetIdSchema,\n\trunner_name_selector: z.string(),\n\tcreate_ts: z.number(),\n\tconnectable_ts: z.number().nullable().optional(),\n\tdestroy_ts: z.number().nullable().optional(),\n\tsleep_ts: z.number().nullable().optional(),\n\tstart_ts: z.number().nullable().optional(),\n\terror: z.unknown().nullable().optional(),\n});\nexport type Actor = z.infer<typeof ActorSchema>;\n\nexport const ActorNameSchema = z.object({\n\tmetadata: z.record(z.string(), z.unknown()),\n});\nexport type ActorName = z.infer<typeof ActorNameSchema>;\n\n// MARK: GET /actors\nexport const ActorsListResponseSchema = z.object({\n\tactors: z.array(ActorSchema),\n});\nexport type ActorsListResponse = z.infer<typeof ActorsListResponseSchema>;\n\n// MARK: POST /actors\nexport const ActorsCreateRequestSchema = z.object({\n\tdatacenter: z.string().optional(),\n\tname: z.string(),\n\trunner_name_selector: z.string(),\n\tcrash_policy: z.string(),\n\tkey: z.string().nullable().optional(),\n\tinput: z.string().nullable().optional(),\n});\nexport type ActorsCreateRequest = z.infer<typeof ActorsCreateRequestSchema>;\n\nexport const ActorsCreateResponseSchema = z.object({\n\tactor: ActorSchema,\n});\nexport type ActorsCreateResponse = z.infer<typeof ActorsCreateResponseSchema>;\n\n// MARK: PUT /actors\nexport const ActorsGetOrCreateRequestSchema = z.object({\n\tdatacenter: z.string().optional(),\n\tname: z.string(),\n\tkey: z.string(),\n\trunner_name_selector: z.string(),\n\tcrash_policy: z.string(),\n\tinput: z.string().nullable().optional(),\n});\nexport type ActorsGetOrCreateRequest = z.infer<\n\ttypeof ActorsGetOrCreateRequestSchema\n>;\n\nexport const ActorsGetOrCreateResponseSchema = z.object({\n\tactor: ActorSchema,\n\tcreated: z.boolean(),\n});\nexport type ActorsGetOrCreateResponse = z.infer<\n\ttypeof ActorsGetOrCreateResponseSchema\n>;\n\n// MARK: DELETE /actors/{}\nexport const ActorsDeleteResponseSchema = z.object({});\nexport type ActorsDeleteResponse = z.infer<typeof ActorsDeleteResponseSchema>;\n\n// MARK: GET /actors/names\nexport const ActorsListNamesResponseSchema = z.object({\n\tnames: z.record(z.string(), ActorNameSchema),\n});\nexport type ActorsListNamesResponse = z.infer<\n\ttypeof ActorsListNamesResponseSchema\n>;\n\n// MARK: GET /actors/{actor_id}/kv/keys/{key}\nexport const ActorsKvGetResponseSchema = z.object({\n\tvalue: z.string().nullable(),\n});\nexport type ActorsKvGetResponse = z.infer<typeof ActorsKvGetResponseSchema>;\n","import { z } from \"zod/v4\";\n\nexport const RivetIdSchema = z.string();\nexport type RivetId = z.infer<typeof RivetIdSchema>;\n","/**\n * Timing-safe comparison of two Uint8Arrays or strings.\n * This prevents timing attacks by always comparing all bytes.\n */\nexport function timingSafeEqual(\n\ta: Uint8Array | string,\n\tb: Uint8Array | string,\n): boolean {\n\tconst encoder = new TextEncoder();\n\tconst bufferA = typeof a === \"string\" ? encoder.encode(a) : a;\n\tconst bufferB = typeof b === \"string\" ? encoder.encode(b) : b;\n\n\t// Pad to max length to avoid leaking length information\n\tconst maxLength = Math.max(bufferA.byteLength, bufferB.byteLength);\n\tlet result = bufferA.byteLength ^ bufferB.byteLength;\n\n\tfor (let i = 0; i < maxLength; i++) {\n\t\tconst byteA = i < bufferA.byteLength ? bufferA[i] : 0;\n\t\tconst byteB = i < bufferB.byteLength ? bufferB[i] : 0;\n\t\tresult |= byteA ^ byteB;\n\t}\n\n\treturn result === 0;\n}\n","import { OpenAPIHono } from \"@hono/zod-openapi\";\nimport type { Hono } from \"hono\";\nimport { createMiddleware } from \"hono/factory\";\nimport { cors } from \"@/common/cors\";\nimport {\n\thandleRouteError,\n\thandleRouteNotFound,\n\tloggerMiddleware,\n} from \"@/common/router\";\nimport { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"router\");\n}\n\nexport function createRouter(\n\tbasePath: string,\n\tbuilder: (app: OpenAPIHono) => void,\n): {\n\trouter: Hono;\n\topenapi: OpenAPIHono;\n} {\n\tconst router = new OpenAPIHono({ strict: false }).basePath(basePath);\n\n\trouter.use(\"*\", loggerMiddleware(logger()), cors());\n\n\t// HACK: Add Sec-WebSocket-Protocol header to fix KIT-339\n\t//\n\t// Some Deno WebSocket providers do not auto-set the protocol, which\n\t// will cause some WebSocket clients to fail\n\trouter.use(\n\t\t\"*\",\n\t\tcreateMiddleware(async (c, next) => {\n\t\t\tconst upgrade = c.req.header(\"upgrade\");\n\t\t\tconst isWebSocket = upgrade?.toLowerCase() === \"websocket\";\n\t\t\tconst isGet = c.req.method === \"GET\";\n\n\t\t\tif (isGet && isWebSocket) {\n\t\t\t\tc.header(\"Sec-WebSocket-Protocol\", \"rivet\");\n\t\t\t}\n\n\t\t\tawait next();\n\t\t}),\n\t);\n\n\tbuilder(router);\n\n\t// Error handling\n\trouter.notFound(handleRouteNotFound);\n\trouter.onError(handleRouteError);\n\n\treturn { router: router as Hono, openapi: router };\n}\n\nexport function buildOpenApiResponses<T>(schema: T) {\n\treturn {\n\t\t200: {\n\t\t\tdescription: \"Success\",\n\t\t\tcontent: {\n\t\t\t\t\"application/json\": {\n\t\t\t\t\tschema,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t400: {\n\t\t\tdescription: \"User error\",\n\t\t},\n\t\t500: {\n\t\t\tdescription: \"Internal error\",\n\t\t},\n\t};\n}\n\nexport function buildOpenApiRequestBody<T>(schema: T) {\n\treturn {\n\t\trequired: true,\n\t\tcontent: {\n\t\t\t\"application/json\": {\n\t\t\t\tschema,\n\t\t\t},\n\t\t},\n\t};\n}\n","import type { MiddlewareHandler } from \"hono\";\n\n/**\n * Simple CORS middleware that matches the gateway behavior.\n *\n * - Echoes back the Origin header from the request\n * - Echoes back the Access-Control-Request-Headers from preflight\n * - Supports credentials\n * - Allows common HTTP methods\n * - Caches preflight for 24 hours\n * - Adds Vary header to prevent cache poisoning\n */\nexport const cors = (): MiddlewareHandler => {\n\treturn async (c, next) => {\n\t\t// Extract origin from request\n\t\tconst origin = c.req.header(\"origin\") || \"*\";\n\n\t\t// Handle preflight OPTIONS request\n\t\tif (c.req.method === \"OPTIONS\") {\n\t\t\tconst requestHeaders =\n\t\t\t\tc.req.header(\"access-control-request-headers\") || \"*\";\n\n\t\t\tc.header(\"access-control-allow-origin\", origin);\n\t\t\tc.header(\"access-control-allow-credentials\", \"true\");\n\t\t\tc.header(\n\t\t\t\t\"access-control-allow-methods\",\n\t\t\t\t\"GET, POST, PUT, DELETE, OPTIONS, PATCH\",\n\t\t\t);\n\t\t\tc.header(\"access-control-allow-headers\", requestHeaders);\n\t\t\tc.header(\"access-control-expose-headers\", \"*\");\n\t\t\tc.header(\"access-control-max-age\", \"86400\");\n\n\t\t\t// Add Vary header to prevent cache poisoning when echoing origin\n\t\t\tif (origin !== \"*\") {\n\t\t\t\tc.header(\"vary\", \"Origin\");\n\t\t\t}\n\n\t\t\t// Remove content headers from preflight response\n\t\t\tc.res.headers.delete(\"content-length\");\n\t\t\tc.res.headers.delete(\"content-type\");\n\n\t\t\treturn c.body(null, 204);\n\t\t}\n\n\t\tawait next();\n\n\t\t// Add CORS headers to actual request\n\t\tc.header(\"access-control-allow-origin\", origin);\n\t\tc.header(\"access-control-allow-credentials\", \"true\");\n\t\tc.header(\"access-control-expose-headers\", \"*\");\n\n\t\t// Add Vary header to prevent cache poisoning when echoing origin\n\t\tif (origin !== \"*\") {\n\t\t\tc.header(\"vary\", \"Origin\");\n\t\t}\n\t};\n};\n","import type { Context as HonoContext, Next } from \"hono\";\nimport type { WSContext } from \"hono/ws\";\nimport invariant from \"invariant\";\nimport { MissingActorHeader, WebSocketsNotEnabled } from \"@/actor/errors\";\nimport {\n\tparseWebSocketProtocols,\n\ttype UpgradeWebSocketArgs,\n} from \"@/actor/router-websocket-endpoints\";\nimport {\n\tHEADER_RIVET_ACTOR,\n\tHEADER_RIVET_TARGET,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_TARGET,\n} from \"@/common/actor-router-consts\";\nimport type { UniversalWebSocket } from \"@/mod\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { type GetUpgradeWebSocket, promiseWithResolvers } from \"@/utils\";\nimport type { ManagerDriver } from \"./driver\";\nimport { logger } from \"./log\";\n\ninterface ActorPathInfo {\n\tactorId: string;\n\ttoken?: string;\n\tremainingPath: string;\n}\n\n/**\n * Handle path-based WebSocket routing\n */\nasync function handleWebSocketGatewayPathBased(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tc: HonoContext,\n\tactorPathInfo: ActorPathInfo,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n): Promise<Response> {\n\tconst upgradeWebSocket = getUpgradeWebSocket?.();\n\tif (!upgradeWebSocket) {\n\t\tthrow new WebSocketsNotEnabled();\n\t}\n\n\t// NOTE: Token validation implemented in EE\n\n\t// Parse additional configuration from Sec-WebSocket-Protocol header\n\tconst { encoding, connParams } = parseWebSocketProtocols(\n\t\tc.req.header(\"sec-websocket-protocol\"),\n\t);\n\n\tlogger().debug({\n\t\tmsg: \"proxying websocket to actor via path-based routing\",\n\t\tactorId: actorPathInfo.actorId,\n\t\tpath: actorPathInfo.remainingPath,\n\t\tencoding,\n\t});\n\n\treturn await managerDriver.proxyWebSocket(\n\t\tc,\n\t\tactorPathInfo.remainingPath,\n\t\tactorPathInfo.actorId,\n\t\tencoding as any, // Will be validated by driver\n\t\tconnParams,\n\t);\n}\n\n/**\n * Handle path-based HTTP routing\n */\nasync function handleHttpGatewayPathBased(\n\tmanagerDriver: ManagerDriver,\n\tc: HonoContext,\n\tactorPathInfo: ActorPathInfo,\n): Promise<Response> {\n\t// NOTE: Token validation implemented in EE\n\n\tlogger().debug({\n\t\tmsg: \"proxying request to actor via path-based routing\",\n\t\tactorId: actorPathInfo.actorId,\n\t\tpath: actorPathInfo.remainingPath,\n\t\tmethod: c.req.method,\n\t});\n\n\t// Preserve all headers\n\tconst proxyHeaders = new Headers(c.req.raw.headers);\n\n\t// Build the proxy request with the actor URL format\n\tconst proxyUrl = new URL(`http://actor${actorPathInfo.remainingPath}`);\n\n\tconst proxyRequest = new Request(proxyUrl, {\n\t\tmethod: c.req.raw.method,\n\t\theaders: proxyHeaders,\n\t\tbody: c.req.raw.body,\n\t\tsignal: c.req.raw.signal,\n\t\tduplex: \"half\",\n\t} as RequestInit);\n\n\treturn await managerDriver.proxyRequest(\n\t\tc,\n\t\tproxyRequest,\n\t\tactorPathInfo.actorId,\n\t);\n}\n\n/**\n * Provides an endpoint to connect to individual actors.\n *\n * Routes requests using either path-based routing or header-based routing:\n *\n * Path-based routing (checked first):\n * - /gateway/{actor_id}/{...path}\n * - /gateway/{actor_id}@{token}/{...path}\n *\n * Header-based routing (fallback):\n * - WebSocket requests: Uses sec-websocket-protocol for routing (target.actor, actor.{id})\n * - HTTP requests: Uses x-rivet-target and x-rivet-actor headers for routing\n */\nexport async function actorGateway(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n\tc: HonoContext,\n\tnext: Next,\n) {\n\n\t// Skip test routes - let them be handled by their specific handlers\n\tif (c.req.path.startsWith(\"/.test/\")) {\n\t\treturn next();\n\t}\n\n\t// Strip basePath from the request path\n\tlet strippedPath = c.req.path;\n\tif (\n\t\tconfig.managerBasePath &&\n\t\tstrippedPath.startsWith(config.managerBasePath)\n\t) {\n\t\tstrippedPath = strippedPath.slice(config.managerBasePath.length);\n\t\t// Ensure the path starts with /\n\t\tif (!strippedPath.startsWith(\"/\")) {\n\t\t\tstrippedPath = \"/\" + strippedPath;\n\t\t}\n\t}\n\n\t// Include query string if present (needed for parseActorPath to preserve query params)\n\tconst pathWithQuery = c.req.url.includes(\"?\")\n\t\t? strippedPath + c.req.url.substring(c.req.url.indexOf(\"?\"))\n\t\t: strippedPath;\n\n\t// First, check if this is an actor path-based route\n\tconst actorPathInfo = parseActorPath(pathWithQuery);\n\tif (actorPathInfo) {\n\t\tlogger().debug({\n\t\t\tmsg: \"routing using path-based actor routing\",\n\t\t\tactorPathInfo,\n\t\t});\n\n\t\t// Check if this is a WebSocket upgrade request\n\t\tconst isWebSocket = c.req.header(\"upgrade\") === \"websocket\";\n\n\t\tif (isWebSocket) {\n\t\t\treturn await handleWebSocketGatewayPathBased(\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tc,\n\t\t\t\tactorPathInfo,\n\t\t\t\tgetUpgradeWebSocket,\n\t\t\t);\n\t\t}\n\n\t\t// Handle regular HTTP requests\n\t\treturn await handleHttpGatewayPathBased(\n\t\t\tmanagerDriver,\n\t\t\tc,\n\t\t\tactorPathInfo,\n\t\t);\n\t}\n\n\t// Fallback to header-based routing\n\t// Check if this is a WebSocket upgrade request\n\tif (c.req.header(\"upgrade\") === \"websocket\") {\n\t\treturn await handleWebSocketGateway(\n\t\t\tconfig,\n\t\t\tmanagerDriver,\n\t\t\tgetUpgradeWebSocket,\n\t\t\tc,\n\t\t\tstrippedPath,\n\t\t);\n\t}\n\n\t// Handle regular HTTP requests\n\treturn await handleHttpGateway(managerDriver, c, next, strippedPath);\n}\n\n/**\n * Handle WebSocket requests using sec-websocket-protocol for routing\n */\nasync function handleWebSocketGateway(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n\tc: HonoContext,\n\tstrippedPath: string,\n) {\n\tconst upgradeWebSocket = getUpgradeWebSocket?.();\n\tif (!upgradeWebSocket) {\n\t\tthrow new WebSocketsNotEnabled();\n\t}\n\n\tlet target: string | undefined;\n\tlet actorId: string | undefined;\n\n\t// Parse configuration from Sec-WebSocket-Protocol header\n\tconst { encoding, connParams } = parseWebSocketProtocols(\n\t\tc.req.header(\"sec-websocket-protocol\"),\n\t);\n\n\tif (target !== \"actor\") {\n\t\treturn c.text(\"WebSocket upgrade requires target.actor protocol\", 400);\n\t}\n\n\tif (!actorId) {\n\t\tthrow new MissingActorHeader();\n\t}\n\n\tlogger().debug({\n\t\tmsg: \"proxying websocket to actor\",\n\t\tactorId,\n\t\tpath: strippedPath,\n\t\tencoding,\n\t});\n\n\t// Include query string if present\n\tconst pathWithQuery = c.req.url.includes(\"?\")\n\t\t? strippedPath + c.req.url.substring(c.req.url.indexOf(\"?\"))\n\t\t: strippedPath;\n\n\treturn await managerDriver.proxyWebSocket(\n\t\tc,\n\t\tpathWithQuery,\n\t\tactorId,\n\t\tencoding,\n\t\tconnParams,\n\t);\n}\n\n/**\n * Handle HTTP requests using x-rivet headers for routing\n */\nasync function handleHttpGateway(\n\tmanagerDriver: ManagerDriver,\n\tc: HonoContext,\n\tnext: Next,\n\tstrippedPath: string,\n) {\n\tconst target = c.req.header(HEADER_RIVET_TARGET);\n\tconst actorId = c.req.header(HEADER_RIVET_ACTOR);\n\n\tif (target !== \"actor\") {\n\t\treturn next();\n\t}\n\n\tif (!actorId) {\n\t\tthrow new MissingActorHeader();\n\t}\n\n\tlogger().debug({\n\t\tmsg: \"proxying request to actor\",\n\t\tactorId,\n\t\tpath: strippedPath,\n\t\tmethod: c.req.method,\n\t});\n\n\t// Preserve all headers except the routing headers\n\tconst proxyHeaders = new Headers(c.req.raw.headers);\n\tproxyHeaders.delete(HEADER_RIVET_TARGET);\n\tproxyHeaders.delete(HEADER_RIVET_ACTOR);\n\n\t// Build the proxy request with the actor URL format\n\tconst url = new URL(c.req.url);\n\tconst proxyUrl = new URL(`http://actor${strippedPath}${url.search}`);\n\n\tconst proxyRequest = new Request(proxyUrl, {\n\t\tmethod: c.req.raw.method,\n\t\theaders: proxyHeaders,\n\t\tbody: c.req.raw.body,\n\t\tsignal: c.req.raw.signal,\n\t\tduplex: \"half\",\n\t} as RequestInit);\n\n\treturn await managerDriver.proxyRequest(c, proxyRequest, actorId);\n}\n\n/**\n * Parse actor routing information from path\n * Matches patterns:\n * - /gateway/{actor_id}/{...path}\n * - /gateway/{actor_id}@{token}/{...path}\n */\nexport function parseActorPath(path: string): ActorPathInfo | null {\n\t// Find query string position (everything from ? onwards, but before fragment)\n\tconst queryPos = path.indexOf(\"?\");\n\tconst fragmentPos = path.indexOf(\"#\");\n\n\t// Extract query string (excluding fragment)\n\tlet queryString = \"\";\n\tif (queryPos !== -1) {\n\t\tif (fragmentPos !== -1 && queryPos < fragmentPos) {\n\t\t\tqueryString = path.slice(queryPos, fragmentPos);\n\t\t} else {\n\t\t\tqueryString = path.slice(queryPos);\n\t\t}\n\t}\n\n\t// Extract base path (before query and fragment)\n\tlet basePath = path;\n\tif (queryPos !== -1) {\n\t\tbasePath = path.slice(0, queryPos);\n\t} else if (fragmentPos !== -1) {\n\t\tbasePath = path.slice(0, fragmentPos);\n\t}\n\n\t// Check for double slashes (invalid path)\n\tif (basePath.includes(\"//\")) {\n\t\treturn null;\n\t}\n\n\t// Split the path into segments\n\tconst segments = basePath.split(\"/\").filter((s) => s.length > 0);\n\n\t// Check minimum required segments: gateway, {actor_id}\n\tif (segments.length < 2) {\n\t\treturn null;\n\t}\n\n\t// Verify the first segment is \"gateway\"\n\tif (segments[0] !== \"gateway\") {\n\t\treturn null;\n\t}\n\n\t// Extract actor_id segment (may contain @token)\n\tconst actorSegment = segments[1];\n\n\t// Check for empty actor segment\n\tif (actorSegment.length === 0) {\n\t\treturn null;\n\t}\n\n\t// Parse actor_id and optional token from the segment\n\tlet actorId: string;\n\tlet token: string | undefined;\n\n\tconst atPos = actorSegment.indexOf(\"@\");\n\tif (atPos !== -1) {\n\t\t// Pattern: /gateway/{actor_id}@{token}/{...path}\n\t\tconst rawActorId = actorSegment.slice(0, atPos);\n\t\tconst rawToken = actorSegment.slice(atPos + 1);\n\n\t\t// Check for empty actor_id or token\n\t\tif (rawActorId.length === 0 || rawToken.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// URL-decode both actor_id and token\n\t\ttry {\n\t\t\tactorId = decodeURIComponent(rawActorId);\n\t\t\ttoken = decodeURIComponent(rawToken);\n\t\t} catch (e) {\n\t\t\t// Invalid URL encoding\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\t// Pattern: /gateway/{actor_id}/{...path}\n\t\t// URL-decode actor_id\n\t\ttry {\n\t\t\tactorId = decodeURIComponent(actorSegment);\n\t\t} catch (e) {\n\t\t\t// Invalid URL encoding\n\t\t\treturn null;\n\t\t}\n\t\ttoken = undefined;\n\t}\n\n\t// Calculate remaining path\n\t// The remaining path starts after /gateway/{actor_id[@token]}/\n\tlet prefixLen = 0;\n\tfor (let i = 0; i < 2; i++) {\n\t\tprefixLen += 1 + segments[i].length; // +1 for the slash\n\t}\n\n\t// Extract the remaining path preserving trailing slashes\n\tlet remainingBase: string;\n\tif (prefixLen < basePath.length) {\n\t\tremainingBase = basePath.slice(prefixLen);\n\t} else {\n\t\tremainingBase = \"/\";\n\t}\n\n\t// Ensure remaining path starts with /\n\tlet remainingPath: string;\n\tif (remainingBase.length === 0 || !remainingBase.startsWith(\"/\")) {\n\t\tremainingPath = `/${remainingBase}${queryString}`;\n\t} else {\n\t\tremainingPath = `${remainingBase}${queryString}`;\n\t}\n\n\treturn {\n\t\tactorId,\n\t\ttoken,\n\t\tremainingPath,\n\t};\n}\n\n/**\n * Creates a WebSocket proxy for test endpoints that forwards messages between server and client WebSockets\n *\n * clientToProxyWs = the websocket from the client -> the proxy\n * proxyToActorWs = the websocket from the proxy -> the actor\n */\nexport async function createTestWebSocketProxy(\n\tproxyToActorWsPromise: Promise<UniversalWebSocket>,\n): Promise<UpgradeWebSocketArgs> {\n\t// Store a reference to the resolved WebSocket\n\tlet proxyToActorWs: UniversalWebSocket | null = null;\n\tconst {\n\t\tpromise: clientToProxyWsPromise,\n\t\tresolve: clientToProxyWsResolve,\n\t\treject: clientToProxyWsReject,\n\t} = promiseWithResolvers<WSContext>((reason) => logger().warn({ msg: \"unhandled client websocket promise rejection\", reason }));\n\ttry {\n\t\t// Resolve the client WebSocket promise\n\t\tlogger().debug({ msg: \"awaiting client websocket promise\" });\n\t\tproxyToActorWs = await proxyToActorWsPromise;\n\t\tlogger().debug({\n\t\t\tmsg: \"client websocket promise resolved\",\n\t\t\tconstructor: proxyToActorWs?.constructor.name,\n\t\t});\n\n\t\t// Wait for ws to open\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tinvariant(proxyToActorWs, \"missing proxyToActorWs\");\n\n\t\t\tconst onOpen = () => {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"test websocket connection to actor opened\",\n\t\t\t\t});\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst onError = (error: any) => {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"test websocket connection failed\",\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`Failed to open WebSocket: ${error.message || error}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tclientToProxyWsReject();\n\t\t\t};\n\n\t\t\tproxyToActorWs.addEventListener(\"open\", onOpen);\n\n\t\t\tproxyToActorWs.addEventListener(\"error\", onError);\n\n\t\t\tproxyToActorWs.addEventListener(\n\t\t\t\t\"message\",\n\t\t\t\tasync (clientEvt: MessageEvent) => {\n\t\t\t\t\tconst clientToProxyWs = await clientToProxyWsPromise;\n\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: `test websocket connection message from client`,\n\t\t\t\t\t\tdataType: typeof clientEvt.data,\n\t\t\t\t\t\tisBlob: clientEvt.data instanceof Blob,\n\t\t\t\t\t\tisArrayBuffer: clientEvt.data instanceof ArrayBuffer,\n\t\t\t\t\t\tdataConstructor: clientEvt.data?.constructor?.name,\n\t\t\t\t\t\tdataStr:\n\t\t\t\t\t\t\ttypeof clientEvt.data === \"string\"\n\t\t\t\t\t\t\t\t? clientEvt.data.substring(0, 100)\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (clientToProxyWs.readyState === 1) {\n\t\t\t\t\t\t// OPEN\n\t\t\t\t\t\t// Handle Blob data\n\t\t\t\t\t\tif (clientEvt.data instanceof Blob) {\n\t\t\t\t\t\t\tclientEvt.data\n\t\t\t\t\t\t\t\t.arrayBuffer()\n\t\t\t\t\t\t\t\t.then((buffer) => {\n\t\t\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\t\t\tmsg: \"converted client blob to arraybuffer, sending to server\",\n\t\t\t\t\t\t\t\t\t\tbufferSize: buffer.byteLength,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tclientToProxyWs.send(buffer as any);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\t\t\tmsg: \"failed to convert blob to arraybuffer\",\n\t\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\tmsg: \"sending client data directly to server\",\n\t\t\t\t\t\t\t\tdataType: typeof clientEvt.data,\n\t\t\t\t\t\t\t\tdataLength:\n\t\t\t\t\t\t\t\t\ttypeof clientEvt.data === \"string\"\n\t\t\t\t\t\t\t\t\t\t? clientEvt.data.length\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tclientToProxyWs.send(clientEvt.data as any);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tproxyToActorWs.addEventListener(\"close\", async (clientEvt: any) => {\n\t\t\t\tconst clientToProxyWs = await clientToProxyWsPromise;\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: `test websocket connection closed`,\n\t\t\t\t});\n\n\t\t\t\tif (clientToProxyWs.readyState !== 3) {\n\t\t\t\t\t// Not CLOSED\n\t\t\t\t\tclientToProxyWs.close(clientEvt.code, clientEvt.reason);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tproxyToActorWs.addEventListener(\"error\", async () => {\n\t\t\t\tconst clientToProxyWs = await clientToProxyWsPromise;\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: `test websocket connection error`,\n\t\t\t\t});\n\n\t\t\t\tif (clientToProxyWs.readyState !== 3) {\n\t\t\t\t\t// Not CLOSED\n\t\t\t\t\tclientToProxyWs.close(1011, \"Error in client websocket\");\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\tlogger().error({\n\t\t\tmsg: `failed to establish client websocket connection`,\n\t\t\terror,\n\t\t});\n\t\treturn {\n\t\t\tonOpen: (_evt, clientToProxyWs) => {\n\t\t\t\tclientToProxyWs.close(1011, \"Failed to establish connection\");\n\t\t\t},\n\t\t\tonMessage: () => {},\n\t\t\tonError: () => {},\n\t\t\tonClose: () => {},\n\t\t};\n\t}\n\n\t// Create WebSocket proxy handlers to relay messages between client and server\n\treturn {\n\t\tonOpen: (_evt: any, clientToProxyWs: WSContext) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: `test websocket connection from client opened`,\n\t\t\t});\n\n\t\t\t// Check WebSocket type\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"proxyToActorWs info\",\n\t\t\t\tconstructor: proxyToActorWs.constructor.name,\n\t\t\t\thasAddEventListener:\n\t\t\t\t\ttypeof proxyToActorWs.addEventListener === \"function\",\n\t\t\t\treadyState: proxyToActorWs.readyState,\n\t\t\t});\n\n\t\t\tclientToProxyWsResolve(clientToProxyWs);\n\t\t},\n\t\tonMessage: (evt: { data: any }) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"received message from server\",\n\t\t\t\tdataType: typeof evt.data,\n\t\t\t\tisBlob: evt.data instanceof Blob,\n\t\t\t\tisArrayBuffer: evt.data instanceof ArrayBuffer,\n\t\t\t\tdataConstructor: evt.data?.constructor?.name,\n\t\t\t\tdataStr:\n\t\t\t\t\ttypeof evt.data === \"string\"\n\t\t\t\t\t\t? evt.data.substring(0, 100)\n\t\t\t\t\t\t: undefined,\n\t\t\t});\n\n\t\t\t// Forward messages from server websocket to client websocket\n\t\t\tif (proxyToActorWs.readyState === 1) {\n\t\t\t\t// OPEN\n\t\t\t\t// Handle Blob data\n\t\t\t\tif (evt.data instanceof Blob) {\n\t\t\t\t\tevt.data\n\t\t\t\t\t\t.arrayBuffer()\n\t\t\t\t\t\t.then((buffer) => {\n\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\tmsg: \"converted blob to arraybuffer, sending\",\n\t\t\t\t\t\t\t\tbufferSize: buffer.byteLength,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tproxyToActorWs.send(buffer);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\tmsg: \"failed to convert blob to arraybuffer\",\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"sending data directly\",\n\t\t\t\t\t\tdataType: typeof evt.data,\n\t\t\t\t\t\tdataLength:\n\t\t\t\t\t\t\ttypeof evt.data === \"string\"\n\t\t\t\t\t\t\t\t? evt.data.length\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t});\n\t\t\t\t\tproxyToActorWs.send(evt.data);\n\t\t\t\t}\n\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\tclientToProxyWs: WSContext,\n\t\t) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: `server websocket closed`,\n\t\t\t\twasClean: event.wasClean,\n\t\t\t\tcode: event.code,\n\t\t\t\treason: event.reason,\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\tclientToProxyWs.close(1000, \"hack_force_close\");\n\n\t\t\t// Close the client websocket when the server websocket closes\n\t\t\tif (\n\t\t\t\tproxyToActorWs &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSED &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSING\n\t\t\t) {\n\t\t\t\t// Don't pass code/message since this may affect how close events are triggered\n\t\t\t\tproxyToActorWs.close(1000, event.reason);\n\t\t\t}\n\t\t},\n\t\tonError: (error: unknown) => {\n\t\t\tlogger().error({\n\t\t\t\tmsg: `error in server websocket`,\n\t\t\t\terror,\n\t\t\t});\n\n\t\t\t// Close the client websocket on error\n\t\t\tif (\n\t\t\t\tproxyToActorWs &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSED &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSING\n\t\t\t) {\n\t\t\t\tproxyToActorWs.close(1011, \"Error in server websocket\");\n\t\t\t}\n\n\t\t\tclientToProxyWsReject();\n\t\t},\n\t};\n}\n","import type { WSContext } from \"hono/ws\";\nimport invariant from \"invariant\";\nimport type { AnyConn } from \"@/actor/conn/mod\";\nimport type { AnyActorInstance } from \"@/actor/instance/mod\";\nimport type { InputData } from \"@/actor/protocol/serde\";\nimport { type Encoding, EncodingSchema } from \"@/actor/protocol/serde\";\nimport {\n\tPATH_CONNECT,\n\tPATH_INSPECTOR_CONNECT,\n\tPATH_WEBSOCKET_BASE,\n\tPATH_WEBSOCKET_PREFIX,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_INSPECTOR_TOKEN,\n} from \"@/common/actor-router-consts\";\nimport { deconstructError } from \"@/common/utils\";\nimport type {\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nimport { handleWebSocketInspectorConnect } from \"@/inspector/handler\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { promiseWithResolvers } from \"@/utils\";\nimport { timingSafeEqual } from \"@/utils/crypto\";\nimport type { ConnDriver } from \"./conn/driver\";\nimport { createRawWebSocketDriver } from \"./conn/drivers/raw-websocket\";\nimport { createWebSocketDriver } from \"./conn/drivers/websocket\";\nimport type { ActorDriver } from \"./driver\";\nimport { loggerWithoutContext } from \"./log\";\nimport { parseMessage } from \"./protocol/old\";\nimport { getRequestExposeInternalError } from \"./router-endpoints\";\n\n// TODO: Merge with ConnectWebSocketOutput interface\nexport interface UpgradeWebSocketArgs {\n\tconn?: AnyConn;\n\tactor?: AnyActorInstance;\n\tonRestore?: (ws: WSContext) => void;\n\tonOpen: (event: any, ws: WSContext) => void;\n\tonMessage: (event: any, ws: WSContext) => void;\n\tonClose: (event: any, ws: WSContext) => void;\n\tonError: (error: any, ws: WSContext) => void;\n}\n\ninterface WebSocketHandlerOpts {\n\tconfig: RegistryConfig;\n\trequest: Request | undefined;\n\tencoding: Encoding;\n\tactor: AnyActorInstance;\n\tclosePromiseResolvers: ReturnType<typeof promiseWithResolvers<void>>;\n\tconn: AnyConn;\n\texposeInternalError: boolean;\n}\n\n/** Handler for a specific WebSocket route. Used in routeWebSocket. */\ntype WebSocketHandler = (\n\topts: WebSocketHandlerOpts,\n) => Promise<UpgradeWebSocketArgs>;\n\nexport async function routeWebSocket(\n\trequest: Request | undefined,\n\trequestPath: string,\n\trequestHeaders: Record<string, string>,\n\tconfig: RegistryConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tencoding: Encoding,\n\tparameters: unknown,\n\tgatewayId: ArrayBuffer | undefined,\n\trequestId: ArrayBuffer | undefined,\n\tisHibernatable: boolean,\n\tisRestoringHibernatable: boolean,\n): Promise<UpgradeWebSocketArgs> {\n\tconst exposeInternalError = request\n\t\t? getRequestExposeInternalError(request)\n\t\t: false;\n\n\tlet createdConn: AnyConn | undefined;\n\ttry {\n\t\tconst actor = await actorDriver.loadActor(actorId);\n\n\t\tactor.rLog.debug({\n\t\t\tmsg: \"new websocket connection\",\n\t\t\tactorId,\n\t\t\trequestPath,\n\t\t\tisHibernatable,\n\t\t});\n\n\t\t// Promise used to wait for the websocket close in `disconnect`\n\t\tconst closePromiseResolvers = promiseWithResolvers<void>((reason) => loggerWithoutContext().warn({ msg: \"unhandled websocket close promise rejection\", reason }));\n\n\t\t// Strip query parameters from requestPath for routing purposes.\n\t\t// This handles paths like \"/websocket?query=value\" which should route\n\t\t// to the raw websocket handler.\n\t\tconst requestPathWithoutQuery = requestPath.split(\"?\")[0];\n\n\t\t// Route WebSocket & create driver\n\t\tlet handler: WebSocketHandler;\n\t\tlet connDriver: ConnDriver;\n\t\tif (requestPathWithoutQuery === PATH_CONNECT) {\n\t\t\tconst { driver, setWebSocket } = createWebSocketDriver(\n\t\t\t\tisHibernatable\n\t\t\t\t\t? { gatewayId: gatewayId!, requestId: requestId! }\n\t\t\t\t\t: undefined,\n\t\t\t\tencoding,\n\t\t\t\tclosePromiseResolvers.promise,\n\t\t\t\tconfig,\n\t\t\t);\n\t\t\thandler = handleWebSocketConnect.bind(undefined, setWebSocket);\n\t\t\tconnDriver = driver;\n\t\t} else if (\n\t\t\trequestPathWithoutQuery === PATH_WEBSOCKET_BASE ||\n\t\t\trequestPathWithoutQuery.startsWith(PATH_WEBSOCKET_PREFIX)\n\t\t) {\n\t\t\tconst { driver, setWebSocket } = createRawWebSocketDriver(\n\t\t\t\tisHibernatable\n\t\t\t\t\t? { gatewayId: gatewayId!, requestId: requestId! }\n\t\t\t\t\t: undefined,\n\t\t\t\tclosePromiseResolvers.promise,\n\t\t\t);\n\t\t\thandler = handleRawWebSocket.bind(undefined, setWebSocket);\n\t\t\tconnDriver = driver;\n\t\t} else if (requestPathWithoutQuery === PATH_INSPECTOR_CONNECT) {\n\t\t\tif (!actor.inspectorToken) {\n\t\t\t\tthrow \"WebSocket Inspector Unauthorized: actor does not provide inspector access\";\n\t\t\t}\n\n\t\t\tconst inspectorToken = requestHeaders[\"sec-websocket-protocol\"]\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((p) => p.trim())\n\t\t\t\t.find((protocol) =>\n\t\t\t\t\tprotocol.startsWith(WS_PROTOCOL_INSPECTOR_TOKEN),\n\t\t\t\t)\n\t\t\t\t// skip token prefix\n\t\t\t\t?.split(\".\")[1];\n\n\t\t\tif (\n\t\t\t\t!inspectorToken ||\n\t\t\t\t!timingSafeEqual(actor.inspectorToken, inspectorToken)\n\t\t\t) {\n\t\t\t\tthrow \"WebSocket Inspector Unauthorized: invalid token\";\n\t\t\t}\n\t\t\t// This returns raw UpgradeWebSocketArgs instead of accepting a\n\t\t\t// Conn since this does not need a Conn\n\t\t\treturn await handleWebSocketInspectorConnect({ actor });\n\t\t} else {\n\t\t\tthrow `WebSocket Path Not Found: ${requestPath}`;\n\t\t}\n\n\t\t// Prepare connection\n\t\tconst conn = await actor.connectionManager.prepareConn(\n\t\t\tconnDriver,\n\t\t\tparameters,\n\t\t\trequest,\n\t\t\trequestPath,\n\t\t\trequestHeaders,\n\t\t\tisHibernatable,\n\t\t\tisRestoringHibernatable,\n\t\t);\n\t\tcreatedConn = conn;\n\n\t\t// Create handler\n\t\t//\n\t\t// This must call actor.connectionManager.connectConn in onOpen.\n\t\treturn await handler({\n\t\t\tconfig: config,\n\t\t\trequest,\n\t\t\tencoding,\n\t\t\tactor,\n\t\t\tclosePromiseResolvers,\n\t\t\tconn,\n\t\t\texposeInternalError,\n\t\t});\n\t} catch (error) {\n\t\tconst { group, code } = deconstructError(\n\t\t\terror,\n\t\t\tloggerWithoutContext(),\n\t\t\t{},\n\t\t\texposeInternalError,\n\t\t);\n\n\t\t// Clean up connection\n\t\tif (createdConn) {\n\t\t\tcreatedConn.disconnect(`${group}.${code}`);\n\t\t}\n\n\t\t// Return handler that immediately closes with error\n\t\t// Note: createdConn should always exist here, but we use a type assertion for safety\n\t\treturn {\n\t\t\tconn: createdConn!,\n\t\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\t\tws.close(1011, `${group}.${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\n/**\n * Creates a WebSocket connection handler\n */\nexport async function handleWebSocketConnect(\n\tsetWebSocket: (ws: WSContext) => void,\n\t{\n\t\tconfig: runConfig,\n\t\tencoding,\n\t\tactor,\n\t\tclosePromiseResolvers,\n\t\tconn,\n\t\texposeInternalError,\n\t}: WebSocketHandlerOpts,\n): Promise<UpgradeWebSocketArgs> {\n\t// Process WS messages in order to avoid races between subscription updates\n\t// and subsequent action requests.\n\tlet pendingMessage = Promise.resolve();\n\n\treturn {\n\t\tconn,\n\t\tactor,\n\t\tonRestore: (ws: WSContext) => {\n\t\t\tsetWebSocket(ws);\n\t\t},\n\t\t// NOTE: onOpen cannot be async since this messes up the open event listener order\n\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\tactor.rLog.debug(\"actor websocket open\");\n\n\t\t\tsetWebSocket(ws);\n\n\t\t\t// This will not be called by restoring hibernatable\n\t\t\t// connections. All restoration is done in prepareConn.\n\t\t\tactor.connectionManager.connectConn(conn);\n\t\t},\n\t\tonMessage: (evt: RivetMessageEvent, ws: WSContext) => {\n\t\t\tactor.rLog.debug({ msg: \"received message\" });\n\t\t\tconst value = evt.data.valueOf() as InputData;\n\t\t\tpendingMessage = pendingMessage\n\t\t\t\t.then(async () => {\n\t\t\t\t\tconst message = await parseMessage(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\tawait actor.processMessage(message, conn);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconst { group, code } = deconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tactor.rLog,\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, `${group}.${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\tclosePromiseResolvers.resolve();\n\n\t\t\tif (event.wasClean) {\n\t\t\t\tactor.rLog.info({\n\t\t\t\t\tmsg: \"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\tactor.rLog.warn({\n\t\t\t\t\tmsg: \"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// Wait for actor.createConn to finish before removing the connection\n\t\t\tconn.disconnect(event?.reason);\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\tactor.rLog.warn({ msg: \"websocket error\" });\n\t\t\t} catch (error) {\n\t\t\t\tdeconstructError(\n\t\t\t\t\terror,\n\t\t\t\t\tactor.rLog,\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\nexport async function handleRawWebSocket(\n\tsetWebSocket: (ws: UniversalWebSocket) => void,\n\t{ request, actor, closePromiseResolvers, conn }: WebSocketHandlerOpts,\n): Promise<UpgradeWebSocketArgs> {\n\treturn {\n\t\tconn,\n\t\tactor,\n\t\tonRestore: (wsContext: WSContext) => {\n\t\t\tconst ws = wsContext.raw as UniversalWebSocket;\n\t\t\tinvariant(ws, \"missing wsContext.raw\");\n\n\t\t\tsetWebSocket(ws);\n\t\t},\n\t\t// NOTE: onOpen cannot be async since this will cause the client's open\n\t\t// event to be called before this completes. Do all async work in\n\t\t// handleRawWebSocket root.\n\t\tonOpen: (_evt: any, wsContext: WSContext) => {\n\t\t\tconst ws = wsContext.raw as UniversalWebSocket;\n\t\t\tinvariant(ws, \"missing wsContext.raw\");\n\n\t\t\tsetWebSocket(ws);\n\n\t\t\t// This will not be called by restoring hibernatable\n\t\t\t// connections. All restoration is done in prepareConn.\n\t\t\tactor.connectionManager.connectConn(conn);\n\n\t\t\t// Call the actor's onWebSocket handler with the adapted WebSocket\n\t\t\t//\n\t\t\t// NOTE: onWebSocket is called inside this function. Make sure\n\t\t\t// this is called synchronously within onOpen.\n\t\t\tactor.handleRawWebSocket(conn, ws, request);\n\t\t},\n\t\t// Raw websocket messages are handled directly by the actor's event\n\t\t// listeners on the WebSocket object, not through this callback\n\t\tonMessage: (_evt: any, _ws: any) => { },\n\t\tonClose: (evt: any, ws: any) => {\n\t\t\t// Resolve the close promise\n\t\t\tclosePromiseResolvers.resolve();\n\n\t\t\t// Clean up the connection\n\t\t\tconn.disconnect(evt?.reason);\n\t\t},\n\t\tonError: (error: any, ws: any) => { },\n\t};\n}\n\nexport interface WebSocketCustomProtocols {\n\tencoding: Encoding;\n\tconnParams: unknown;\n}\n\n/**\n * Parse encoding and connection parameters from WebSocket Sec-WebSocket-Protocol header\n */\nexport function parseWebSocketProtocols(\n\tprotocols: string | null | undefined,\n): WebSocketCustomProtocols {\n\tlet encodingRaw: string | undefined;\n\tlet connParamsRaw: string | undefined;\n\n\tif (protocols) {\n\t\tconst protocolList = protocols.split(\",\").map((p) => p.trim());\n\t\tfor (const protocol of protocolList) {\n\t\t\tif (protocol.startsWith(WS_PROTOCOL_ENCODING)) {\n\t\t\t\tencodingRaw = protocol.substring(WS_PROTOCOL_ENCODING.length);\n\t\t\t} else if (protocol.startsWith(WS_PROTOCOL_CONN_PARAMS)) {\n\t\t\t\tconnParamsRaw = decodeURIComponent(\n\t\t\t\t\tprotocol.substring(WS_PROTOCOL_CONN_PARAMS.length),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Default to \"json\" encoding for raw WebSocket connections without subprotocols\n\tconst encoding = EncodingSchema.parse(encodingRaw ?? \"json\");\n\tconst connParams = connParamsRaw ? JSON.parse(connParamsRaw) : undefined;\n\n\treturn { encoding, connParams };\n}\n\n/**\n * Truncase the PATH_WEBSOCKET_PREFIX path prefix in order to pass a clean\n * path to the onWebSocket handler.\n *\n * Example:\n * - `/websocket/foo` -> `/foo`\n * - `/websocket` -> `/`\n */\nexport function truncateRawWebSocketPathPrefix(path: string): string {\n\t// Extract the path after prefix and preserve query parameters\n\t// Use URL API for cleaner parsing\n\tconst url = new URL(path, \"http://actor\");\n\tconst pathname = url.pathname.replace(/^\\/websocket\\/?/, \"\") || \"/\";\n\tconst normalizedPath =\n\t\t(pathname.startsWith(\"/\") ? pathname : `/${pathname}`) + url.search;\n\n\treturn normalizedPath;\n}\n","import type { WSContext } from \"hono/ws\";\nimport type { Unsubscribe } from \"nanoevents\";\nimport type { UpgradeWebSocketArgs } from \"@/actor/router-websocket-endpoints\";\nimport type { AnyActorInstance, RivetMessageEvent } from \"@/mod\";\nimport type { ToClient } from \"@/schemas/actor-inspector/mod\";\nimport { encodeReadRangeWire } from \"@rivetkit/traces/encoding\";\nimport {\n\tCURRENT_VERSION as INSPECTOR_CURRENT_VERSION,\n\tTO_CLIENT_VERSIONED as toClient,\n\tTO_SERVER_VERSIONED as toServer,\n} from \"@/schemas/actor-inspector/versioned\";\nimport { assertUnreachable, bufferToArrayBuffer } from \"@/utils\";\nimport { inspectorLogger } from \"./log\";\n\nexport async function handleWebSocketInspectorConnect({\n\tactor,\n}: {\n\tactor: AnyActorInstance;\n}): Promise<UpgradeWebSocketArgs> {\n\tconst inspector = actor.inspector;\n\tconst maxQueueStatusLimit = 200;\n\n\tconst listeners: Unsubscribe[] = [];\n\treturn {\n\t\t// NOTE: onOpen cannot be async since this messes up the open event listener order\n\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\tsendMessage(ws, {\n\t\t\t\tbody: {\n\t\t\t\t\ttag: \"Init\",\n\t\t\t\t\tval: {\n\t\t\t\t\t\tconnections: inspector.getConnections(),\n\t\t\t\t\t\trpcs: inspector.getRpcs(),\n\t\t\t\t\t\tstate: inspector.isStateEnabled()\n\t\t\t\t\t\t\t? inspector.getState()\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tisStateEnabled: inspector.isStateEnabled(),\n\t\t\t\t\t\tisDatabaseEnabled: inspector.isDatabaseEnabled(),\n\t\t\t\t\t\tqueueSize: BigInt(inspector.getQueueSize()),\n\t\t\t\t\t\tworkflowHistory: inspector.getWorkflowHistory(),\n\t\t\t\t\t\tisWorkflowEnabled: inspector.isWorkflowEnabled(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tlisteners.push(\n\t\t\t\tinspector.emitter.on(\"stateUpdated\", () => {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"StateUpdated\",\n\t\t\t\t\t\t\tval: { state: inspector.getState() },\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tinspector.emitter.on(\"connectionsUpdated\", () => {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ConnectionsUpdated\",\n\t\t\t\t\t\t\tval: { connections: inspector.getConnections() },\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tinspector.emitter.on(\"queueUpdated\", () => {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"QueueUpdated\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tqueueSize: BigInt(inspector.getQueueSize()),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tinspector.emitter.on(\"workflowHistoryUpdated\", (history) => {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"WorkflowHistoryUpdated\",\n\t\t\t\t\t\t\tval: { history },\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tonMessage: async (evt: RivetMessageEvent, ws: WSContext) => {\n\t\t\ttry {\n\t\t\t\tconst message = receiveMessage(evt.data);\n\n\t\t\t\tif (message.body.tag === \"PatchStateRequest\") {\n\t\t\t\t\tconst { state } = message.body.val;\n\t\t\t\t\tinspector.setState(state);\n\t\t\t\t\treturn;\n\t\t\t\t} else if (message.body.tag === \"ActionRequest\") {\n\t\t\t\t\tconst { name, args, id } = message.body.val;\n\t\t\t\t\tconst result = await inspector.executeAction(name, args);\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ActionResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: id,\n\t\t\t\t\t\t\t\toutput: result,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"StateRequest\") {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"StateResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: message.body.val.id,\n\t\t\t\t\t\t\t\tstate: inspector.isStateEnabled()\n\t\t\t\t\t\t\t\t\t? inspector.getState()\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\tisStateEnabled: inspector.isStateEnabled(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"ConnectionsRequest\") {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ConnectionsResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: message.body.val.id,\n\t\t\t\t\t\t\t\tconnections: inspector.getConnections(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"RpcsListRequest\") {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"RpcsListResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: message.body.val.id,\n\t\t\t\t\t\t\t\trpcs: inspector.getRpcs(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"TraceQueryRequest\") {\n\t\t\t\t\tconst { id, startMs, endMs, limit } = message.body.val;\n\t\t\t\t\tconst wire = await actor.traces.readRangeWire({\n\t\t\t\t\t\tstartMs: Number(startMs),\n\t\t\t\t\t\tendMs: Number(endMs),\n\t\t\t\t\t\tlimit: Number(limit),\n\t\t\t\t\t});\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"TraceQueryResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: id,\n\t\t\t\t\t\t\t\tpayload: bufferToArrayBuffer(\n\t\t\t\t\t\t\t\t\tencodeReadRangeWire(wire),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"QueueRequest\") {\n\t\t\t\t\tconst { id, limit } = message.body.val;\n\t\t\t\t\tconst status = await inspector.getQueueStatus(\n\t\t\t\t\t\tMath.min(Number(limit), maxQueueStatusLimit),\n\t\t\t\t\t);\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"QueueResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: id,\n\t\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"WorkflowHistoryRequest\") {\n\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"WorkflowHistoryResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\trid: message.body.val.id,\n\t\t\t\t\t\t\t\thistory: inspector.getWorkflowHistory(),\n\t\t\t\t\t\t\t\tisWorkflowEnabled:\n\t\t\t\t\t\t\t\t\tinspector.isWorkflowEnabled(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (message.body.tag === \"DatabaseSchemaRequest\") {\n\t\t\t\t\tconst { id } = message.body.val;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst schema = await inspector.getDatabaseSchema();\n\t\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\ttag: \"DatabaseSchemaResponse\",\n\t\t\t\t\t\t\t\tval: { rid: id, schema },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tinspectorLogger().warn(\n\t\t\t\t\t\t\t{ error },\n\t\t\t\t\t\t\t\"Failed to get database schema\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\ttag: \"Error\",\n\t\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\t\tmessage: `Failed to get database schema: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (message.body.tag === \"DatabaseTableRowsRequest\") {\n\t\t\t\t\tconst { id, table, limit, offset } = message.body.val;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await inspector.getDatabaseTableRows(\n\t\t\t\t\t\t\ttable,\n\t\t\t\t\t\t\tNumber(limit),\n\t\t\t\t\t\t\tNumber(offset),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\ttag: \"DatabaseTableRowsResponse\",\n\t\t\t\t\t\t\t\tval: { rid: id, result },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tinspectorLogger().warn(\n\t\t\t\t\t\t\t{ error },\n\t\t\t\t\t\t\t\"Failed to get database table rows\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsendMessage(ws, {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\ttag: \"Error\",\n\t\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\t\tmessage: `Failed to get database rows: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tassertUnreachable(message.body);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tinspectorLogger().warn(\n\t\t\t\t\t{ error },\n\t\t\t\t\t\"Failed to handle inspector WS message\",\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tonClose: (\n\t\t\t_event: {\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\t_ws: WSContext,\n\t\t) => {\n\t\t\tfor (const unsubscribe of listeners) {\n\t\t\t\tunsubscribe();\n\t\t\t}\n\t\t},\n\t\tonError: (_error: unknown) => {\n\t\t\tinspectorLogger().warn(\n\t\t\t\t{ error: _error },\n\t\t\t\t\"WebSocket inspector connection error\",\n\t\t\t);\n\t\t},\n\t};\n}\n\nfunction sendMessage(ws: WSContext, message: ToClient) {\n\tws.send(\n\t\ttoClient.serializeWithEmbeddedVersion(\n\t\t\tmessage,\n\t\t\tINSPECTOR_CURRENT_VERSION,\n\t\t) as unknown as ArrayBuffer,\n\t);\n}\n\nfunction receiveMessage(data: ArrayBuffer) {\n\treturn toServer.deserializeWithEmbeddedVersion(new Uint8Array(data));\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function inspectorLogger() {\n\treturn getLogger(\"inspector\");\n}\n","import type { AnyConn } from \"@/actor/conn/mod\";\nimport type { AnyActorInstance } from \"@/actor/instance/mod\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { loggerWithoutContext } from \"../../log\";\nimport { type ConnDriver, DriverReadyState } from \"../driver\";\n\n/**\n * Creates a raw WebSocket connection driver.\n *\n * This driver is used for raw WebSocket connections that don't use the RivetKit protocol.\n * Unlike the standard WebSocket driver, this doesn't have sendMessage since raw WebSockets\n * don't handle messages from the RivetKit protocol - they handle messages directly in the\n * actor's onWebSocket handler.\n */\nexport function createRawWebSocketDriver(\n\thibernatable: ConnDriver[\"hibernatable\"],\n\tclosePromise: Promise<void>,\n): { driver: ConnDriver; setWebSocket(ws: UniversalWebSocket): void } {\n\tlet websocket: UniversalWebSocket | undefined;\n\n\tconst driver: ConnDriver = {\n\t\ttype: \"raw-websocket\",\n\t\thibernatable,\n\n\t\t// No sendMessage implementation since this is a raw WebSocket that doesn't\n\t\t// handle messages from the RivetKit protocol\n\n\t\tdisconnect: async (\n\t\t\t_actor: AnyActorInstance,\n\t\t\t_conn: AnyConn,\n\t\t\treason?: string,\n\t\t) => {\n\t\t\tif (!websocket) {\n\t\t\t\tloggerWithoutContext().warn(\n\t\t\t\t\t\"disconnecting raw ws without websocket\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Close socket\n\t\t\twebsocket.close(1000, reason);\n\n\t\t\t// Wait for socket to close gracefully\n\t\t\tawait closePromise;\n\t\t},\n\n\t\tterminate: () => {\n\t\t\t(websocket as any)?.terminate?.();\n\t\t},\n\n\t\tgetConnectionReadyState: (\n\t\t\t_actor: AnyActorInstance,\n\t\t\t_conn: AnyConn,\n\t\t): DriverReadyState | undefined => {\n\t\t\treturn websocket?.readyState ?? DriverReadyState.CONNECTING;\n\t\t},\n\t};\n\n\treturn {\n\t\tdriver,\n\t\tsetWebSocket(ws) {\n\t\t\twebsocket = ws;\n\t\t},\n\t};\n}\n","import type { WSContext } from \"hono/ws\";\nimport type { AnyConn } from \"@/actor/conn/mod\";\nimport type { AnyActorInstance } from \"@/actor/instance/mod\";\nimport type { CachedSerializer, Encoding } from \"@/actor/protocol/serde\";\nimport * as errors from \"@/actor/errors\";\nimport { loggerWithoutContext } from \"../../log\";\nimport { type ConnDriver, DriverReadyState } from \"../driver\";\nimport { RegistryConfig } from \"@/registry/config\";\n\nexport type ConnDriverWebSocketState = Record<never, never>;\n\nexport function createWebSocketDriver(\n\thibernatable: ConnDriver[\"hibernatable\"],\n\tencoding: Encoding,\n\tclosePromise: Promise<void>,\n\tconfig: RegistryConfig,\n): { driver: ConnDriver; setWebSocket(ws: WSContext): void } {\n\tloggerWithoutContext().debug({\n\t\tmsg: \"createWebSocketDriver creating driver\",\n\t\thibernatable,\n\t});\n\t// Wait for WS to open\n\tlet websocket: WSContext | undefined;\n\n\tconst driver: ConnDriver = {\n\t\ttype: \"websocket\",\n\t\thibernatable,\n\t\trivetKitProtocol: {\n\t\t\tsendMessage: (\n\t\t\t\tactor: AnyActorInstance,\n\t\t\t\tconn: AnyConn,\n\t\t\t\tmessage: CachedSerializer<any, any, any>,\n\t\t\t) => {\n\t\t\t\tif (!websocket) {\n\t\t\t\t\tactor.rLog.warn({\n\t\t\t\t\t\tmsg: \"websocket not open\",\n\t\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (websocket.readyState !== DriverReadyState.OPEN) {\n\t\t\t\t\tactor.rLog.warn({\n\t\t\t\t\t\tmsg: \"attempting to send message to closed websocket, this is likely a bug in RivetKit\",\n\t\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\t\twsReadyState: websocket.readyState,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst serialized = message.serialize(encoding);\n\n\t\t\t\tactor.rLog.debug({\n\t\t\t\t\tmsg: \"sending websocket message\",\n\t\t\t\t\tencoding: encoding,\n\t\t\t\t\tdataType: typeof serialized,\n\t\t\t\t\tisUint8Array: serialized instanceof Uint8Array,\n\t\t\t\t\tisArrayBuffer: serialized instanceof ArrayBuffer,\n\t\t\t\t\tdataLength:\n\t\t\t\t\t\t(serialized as any).byteLength ||\n\t\t\t\t\t\t(serialized as any).length,\n\t\t\t\t});\n\n\t\t\t\t// Check outgoing message size\n\t\t\t\tconst messageSize =\n\t\t\t\t\t(serialized as any).byteLength || (serialized as any).length;\n\t\t\t\tif (messageSize > config.maxOutgoingMessageSize) {\n\t\t\t\t\tactor.rLog.error({\n\t\t\t\t\t\tmsg: \"outgoing message exceeds maxOutgoingMessageSize\",\n\t\t\t\t\t\tmessageSize,\n\t\t\t\t\t\tmaxOutgoingMessageSize: config.maxOutgoingMessageSize,\n\t\t\t\t\t});\n\t\t\t\t\tthrow new errors.OutgoingMessageTooLong();\n\t\t\t\t}\n\n\t\t\t\t// Convert Uint8Array to ArrayBuffer for proper transmission\n\t\t\t\tif (serialized instanceof Uint8Array) {\n\t\t\t\t\tconst buffer = serialized.buffer.slice(\n\t\t\t\t\t\tserialized.byteOffset,\n\t\t\t\t\t\tserialized.byteOffset + serialized.byteLength,\n\t\t\t\t\t);\n\t\t\t\t\t// Handle SharedArrayBuffer case\n\t\t\t\t\tif (buffer instanceof SharedArrayBuffer) {\n\t\t\t\t\t\tconst arrayBuffer = new ArrayBuffer(buffer.byteLength);\n\t\t\t\t\t\tnew Uint8Array(arrayBuffer).set(new Uint8Array(buffer));\n\t\t\t\t\t\tactor.rLog.debug({\n\t\t\t\t\t\t\tmsg: \"converted SharedArrayBuffer to ArrayBuffer\",\n\t\t\t\t\t\t\tbyteLength: arrayBuffer.byteLength,\n\t\t\t\t\t\t});\n\t\t\t\t\t\twebsocket.send(arrayBuffer);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tactor.rLog.debug({\n\t\t\t\t\t\t\tmsg: \"sending ArrayBuffer\",\n\t\t\t\t\t\t\tbyteLength: buffer.byteLength,\n\t\t\t\t\t\t});\n\t\t\t\t\t\twebsocket.send(buffer);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tactor.rLog.debug({\n\t\t\t\t\t\tmsg: \"sending string data\",\n\t\t\t\t\t\tlength: (serialized as string).length,\n\t\t\t\t\t});\n\t\t\t\t\twebsocket.send(serialized);\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\tdisconnect: async (\n\t\t\t_actor: AnyActorInstance,\n\t\t\t_conn: AnyConn,\n\t\t\treason?: string,\n\t\t) => {\n\t\t\tif (!websocket) {\n\t\t\t\tloggerWithoutContext().warn(\n\t\t\t\t\t\"disconnecting ws without websocket\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Close socket\n\t\t\twebsocket.close(1000, reason);\n\n\t\t\t// Create promise to wait for socket to close gracefully\n\t\t\tawait closePromise;\n\t\t},\n\n\t\tterminate: () => {\n\t\t\t(websocket as any).terminate();\n\t\t},\n\n\t\tgetConnectionReadyState: (\n\t\t\t_actor: AnyActorInstance,\n\t\t\t_conn: AnyConn,\n\t\t): DriverReadyState | undefined => {\n\t\t\treturn websocket?.readyState ?? DriverReadyState.CONNECTING;\n\t\t},\n\t};\n\n\treturn {\n\t\tdriver,\n\t\tsetWebSocket(ws) {\n\t\t\twebsocket = ws;\n\t\t},\n\t};\n}\n","import * as cbor from \"cbor-x\";\nimport { z } from \"zod/v4\";\nimport type { AnyDatabaseProvider } from \"@/actor/database\";\nimport * as errors from \"@/actor/errors\";\nimport {\n\tCachedSerializer,\n\ttype Encoding,\n\ttype InputData,\n} from \"@/actor/protocol/serde\";\nimport { deconstructError } from \"@/common/utils\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tTO_CLIENT_VERSIONED,\n\tTO_SERVER_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype ToClient as ToClientJson,\n\tToClientSchema,\n\ttype ToServer as ToServerJson,\n\tToServerSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { deserializeWithEncoding } from \"@/serde\";\nimport {\n\tassertUnreachable,\n\tbufferToArrayBuffer,\n\tgetEnvUniversal,\n} from \"../../utils\";\nimport { CONN_SEND_MESSAGE_SYMBOL, type Conn } from \"../conn/mod\";\nimport { ActionContext } from \"../contexts\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\n\ninterface MessageEventOpts {\n\tencoding: Encoding;\n\tmaxIncomingMessageSize: number;\n}\n\nexport function getValueLength(value: InputData): number {\n\tif (typeof value === \"string\") {\n\t\treturn value.length;\n\t} else if (value instanceof Blob) {\n\t\treturn value.size;\n\t} else if (\n\t\tvalue instanceof ArrayBuffer ||\n\t\tvalue instanceof SharedArrayBuffer ||\n\t\tvalue instanceof Uint8Array\n\t) {\n\t\treturn value.byteLength;\n\t} else {\n\t\tassertUnreachable(value);\n\t}\n}\n\nexport async function inputDataToBuffer(\n\tdata: InputData,\n): Promise<Uint8Array | string> {\n\tif (typeof data === \"string\") {\n\t\treturn data;\n\t} else if (data instanceof Blob) {\n\t\tconst arrayBuffer = await data.arrayBuffer();\n\t\treturn new Uint8Array(arrayBuffer);\n\t} else if (data instanceof Uint8Array) {\n\t\treturn data;\n\t} else if (\n\t\tdata instanceof ArrayBuffer ||\n\t\tdata instanceof SharedArrayBuffer\n\t) {\n\t\treturn new Uint8Array(data);\n\t} else {\n\t\tthrow new errors.MalformedMessage();\n\t}\n}\n\nexport async function parseMessage(\n\tvalue: InputData,\n\topts: MessageEventOpts,\n): Promise<{\n\tbody:\n\t\t| {\n\t\t\t\ttag: \"ActionRequest\";\n\t\t\t\tval: { id: bigint; name: string; args: unknown };\n\t\t }\n\t\t| {\n\t\t\t\ttag: \"SubscriptionRequest\";\n\t\t\t\tval: { eventName: string; subscribe: boolean };\n\t\t };\n}> {\n\t// Validate value length\n\tconst length = getValueLength(value);\n\tif (length > opts.maxIncomingMessageSize) {\n\t\tthrow new errors.IncomingMessageTooLong();\n\t}\n\n\t// Convert value\n\tlet buffer = await inputDataToBuffer(value);\n\n\t// HACK: For some reason, the output buffer needs to be cloned when using BARE encoding\n\t//\n\t// THis is likely because the input data is of type `Buffer` and there is an inconsistency in implementation that I am not aware of\n\tif (buffer instanceof Buffer) {\n\t\tbuffer = new Uint8Array(buffer);\n\t}\n\n\t// Deserialize message\n\treturn deserializeWithEncoding(\n\t\topts.encoding,\n\t\tbuffer,\n\t\tTO_SERVER_VERSIONED,\n\t\tToServerSchema,\n\t\t// JSON: values are already the correct type\n\t\t(json: ToServerJson): any => json,\n\t\t// BARE: need to decode ArrayBuffer fields back to unknown\n\t\t(bare: protocol.ToServer): any => {\n\t\t\tif (bare.body.tag === \"ActionRequest\") {\n\t\t\t\treturn {\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"ActionRequest\",\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tid: bare.body.val.id,\n\t\t\t\t\t\t\tname: bare.body.val.name,\n\t\t\t\t\t\t\targs: cbor.decode(\n\t\t\t\t\t\t\t\tnew Uint8Array(bare.body.val.args),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t// SubscriptionRequest has no ArrayBuffer fields\n\t\t\t\treturn bare;\n\t\t\t}\n\t\t},\n\t);\n}\n\nexport interface ProcessMessageHandler<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig,\n\tQ extends QueueSchemaConfig,\n> {\n\tonExecuteAction?: (\n\t\tctx: ActionContext<S, CP, CS, V, I, DB, E, Q>,\n\t\tname: string,\n\t\targs: unknown[],\n\t) => Promise<unknown>;\n\tonSubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t) => Promise<void>;\n\tonUnsubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t) => Promise<void>;\n}\n\nexport async function processMessage<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig,\n\tQ extends QueueSchemaConfig,\n>(\n\tmessage: {\n\t\tbody:\n\t\t\t| {\n\t\t\t\t\ttag: \"ActionRequest\";\n\t\t\t\t\tval: { id: bigint; name: string; args: unknown };\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\ttag: \"SubscriptionRequest\";\n\t\t\t\t\tval: { eventName: string; subscribe: boolean };\n\t\t\t };\n\t},\n\tactor: ActorInstance<S, CP, CS, V, I, DB, E, Q>,\n\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\thandler: ProcessMessageHandler<S, CP, CS, V, I, DB, E, Q>,\n) {\n\tlet actionId: bigint | undefined;\n\tlet actionName: string | undefined;\n\n\ttry {\n\t\tif (message.body.tag === \"ActionRequest\") {\n\t\t\t// Action request\n\n\t\t\tif (handler.onExecuteAction === undefined) {\n\t\t\t\tthrow new errors.Unsupported(\"Action\");\n\t\t\t}\n\n\t\t\tconst { id, name, args } = message.body.val;\n\t\t\tactionId = id;\n\t\t\tactionName = name;\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"processing action request\",\n\t\t\t\tactionId: id,\n\t\t\t\tactionName: name,\n\t\t\t});\n\n\t\t\tconst ctx = new ActionContext<S, CP, CS, V, I, DB, E, Q>(\n\t\t\t\tactor,\n\t\t\t\tconn,\n\t\t\t);\n\n\t\t\t// Process the action request and wait for the result\n\t\t\t// This will wait for async actions to complete\n\t\t\tconst output = await handler.onExecuteAction(\n\t\t\t\tctx,\n\t\t\t\tname,\n\t\t\t\targs as unknown[],\n\t\t\t);\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"sending action response\",\n\t\t\t\tactionId: id,\n\t\t\t\tactionName: name,\n\t\t\t\toutputType: typeof output,\n\t\t\t\tisPromise: output instanceof Promise,\n\t\t\t});\n\n\t\t\t// Send the response back to the client\n\t\t\tconn[CONN_SEND_MESSAGE_SYMBOL](\n\t\t\t\tnew CachedSerializer(\n\t\t\t\t\toutput,\n\t\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\t\tToClientSchema,\n\t\t\t\t\t// JSON: output is the raw value\n\t\t\t\t\t(value): ToClientJson => ({\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ActionResponse\" as const,\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\toutput: value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\t// BARE/CBOR: output needs to be CBOR-encoded to ArrayBuffer\n\t\t\t\t\t(value): protocol.ToClient => ({\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ActionResponse\" as const,\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\toutput: bufferToArrayBuffer(cbor.encode(value)),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tactor.rLog.debug({ msg: \"action response sent\", id, name: name });\n\t\t} else if (message.body.tag === \"SubscriptionRequest\") {\n\t\t\t// Subscription request\n\n\t\t\tif (\n\t\t\t\thandler.onSubscribe === undefined ||\n\t\t\t\thandler.onUnsubscribe === undefined\n\t\t\t) {\n\t\t\t\tthrow new errors.Unsupported(\"Subscriptions\");\n\t\t\t}\n\n\t\t\tconst { eventName, subscribe } = message.body.val;\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"processing subscription request\",\n\t\t\t\teventName,\n\t\t\t\tsubscribe,\n\t\t\t});\n\n\t\t\t\tif (subscribe) {\n\t\t\t\t\tawait actor.assertCanSubscribe(\n\t\t\t\t\t\tnew ActionContext<S, CP, CS, V, I, DB, E, Q>(\n\t\t\t\t\t\t\tactor,\n\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t),\n\t\t\t\t\t\teventName,\n\t\t\t\t\t);\n\t\t\t\t\tawait handler.onSubscribe(eventName, conn);\n\t\t\t\t} else {\n\t\t\t\t\tawait handler.onUnsubscribe(eventName, conn);\n\t\t\t\t}\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"subscription request completed\",\n\t\t\t\teventName,\n\t\t\t\tsubscribe,\n\t\t\t});\n\t\t} else {\n\t\t\tassertUnreachable(message.body);\n\t\t}\n\t} catch (error) {\n\t\tconst { group, code, message, metadata } = deconstructError(\n\t\t\terror,\n\t\t\tactor.rLog,\n\t\t\t{\n\t\t\t\tconnectionId: conn.id,\n\t\t\t\tactionId,\n\t\t\t\tactionName,\n\t\t\t},\n\t\t\tgetEnvUniversal(\"RIVET_EXPOSE_ERRORS\") === \"1\" ||\n\t\t\t\tgetEnvUniversal(\"NODE_ENV\") === \"development\",\n\t\t);\n\n\t\tactor.rLog.debug({\n\t\t\tmsg: \"sending error response\",\n\t\t\tactionId,\n\t\t\tactionName,\n\t\t\tcode,\n\t\t\tmessage,\n\t\t});\n\n\t\t// Build response\n\t\tconst errorData = { group, code, message, metadata, actionId };\n\t\tconn[CONN_SEND_MESSAGE_SYMBOL](\n\t\t\tnew CachedSerializer(\n\t\t\t\terrorData,\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\tToClientSchema,\n\t\t\t\t// JSON: metadata is the raw value (keep as undefined if not present)\n\t\t\t\t(value): ToClientJson => {\n\t\t\t\t\tconst val: any = {\n\t\t\t\t\t\tgroup: value.group,\n\t\t\t\t\t\tcode: value.code,\n\t\t\t\t\t\tmessage: value.message,\n\t\t\t\t\t\tactionId:\n\t\t\t\t\t\t\tvalue.actionId !== undefined\n\t\t\t\t\t\t\t\t? value.actionId\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t};\n\t\t\t\t\tif (value.metadata !== undefined) {\n\t\t\t\t\t\tval.metadata = value.metadata;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Error\" as const,\n\t\t\t\t\t\t\tval,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\t// BARE/CBOR: metadata needs to be CBOR-encoded to ArrayBuffer\n\t\t\t\t// Note: protocol.Error expects `| null` for optional fields (BARE protocol)\n\t\t\t\t(value): protocol.ToClient => ({\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Error\" as const,\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tgroup: value.group,\n\t\t\t\t\t\t\tcode: value.code,\n\t\t\t\t\t\t\tmessage: value.message,\n\t\t\t\t\t\t\tmetadata: value.metadata\n\t\t\t\t\t\t\t\t? bufferToArrayBuffer(\n\t\t\t\t\t\t\t\t\t\tcbor.encode(value.metadata),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tactionId:\n\t\t\t\t\t\t\t\tvalue.actionId !== undefined\n\t\t\t\t\t\t\t\t\t? value.actionId\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\n\t\tactor.rLog.debug({ msg: \"error response sent\", actionId, actionName });\n\t}\n}\n\n///**\n// * Use `CachedSerializer` if serializing the same data repeatedly.\n// */\n//export 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//\n//export async function deserialize(data: InputData, encoding: Encoding) {\n//\tif (encoding === \"json\") {\n//\t\tif (typeof data !== \"string\") {\n//\t\t\tactor.rLog.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\tactor.rLog.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","import * as cbor from \"cbor-x\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tTO_CLIENT_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype ToClient as ToClientJson,\n\tToClientSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport { EventPayloadInvalid, InternalError } from \"../errors\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport { CachedSerializer } from \"../protocol/serde\";\nimport {\n\ttype EventSchemaConfig,\n\thasSchemaConfigKey,\n\ttype InferEventArgs,\n\ttype InferSchemaMap,\n\ttype QueueSchemaConfig,\n\tvalidateSchemaSync,\n} from \"../schema\";\nimport type { ConnDriver } from \"./driver\";\nimport { type ConnDataInput, StateManager } from \"./state-manager\";\n\nexport type ConnId = string;\n\nexport type AnyConn = Conn<any, any, any, any, any, any, any, any>;\n\nexport const CONN_CONNECTED_SYMBOL = Symbol(\"connected\");\nexport const CONN_SPEAKS_RIVETKIT_SYMBOL = Symbol(\"speaksRivetKit\");\nexport const CONN_DRIVER_SYMBOL = Symbol(\"driver\");\nexport const CONN_ACTOR_SYMBOL = Symbol(\"actor\");\nexport const CONN_STATE_MANAGER_SYMBOL = Symbol(\"stateManager\");\nexport const CONN_SEND_MESSAGE_SYMBOL = Symbol(\"sendMessage\");\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.dev/docs/connections|Connection Documentation}\n */\nexport class Conn<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;\n\n\tget [CONN_ACTOR_SYMBOL](): ActorInstance<S, CP, CS, V, I, DB, E, Q> {\n\t\treturn this.#actor;\n\t}\n\n\t#stateManager!: StateManager<CP, CS>;\n\n\tget [CONN_STATE_MANAGER_SYMBOL]() {\n\t\treturn this.#stateManager;\n\t}\n\n\t/**\n\t * Connections exist before being connected to an actor. If true, this\n\t * connection has been connected.\n\t **/\n\t[CONN_CONNECTED_SYMBOL] = false;\n\n\t/**\n\t * If undefined, then no socket is connected to this conn\n\t */\n\t[CONN_DRIVER_SYMBOL]?: ConnDriver;\n\n\t/**\n\t * If this connection is speaking the RivetKit protocol. If false, this is\n\t * a raw connection for WebSocket or fetch or inspector.\n\t **/\n\tget [CONN_SPEAKS_RIVETKIT_SYMBOL](): boolean {\n\t\treturn this[CONN_DRIVER_SYMBOL]?.rivetKitProtocol !== undefined;\n\t}\n\n\tsubscriptions: Set<string> = new Set<string>();\n\n\t#assertConnected() {\n\t\tif (!this[CONN_CONNECTED_SYMBOL])\n\t\t\tthrow new InternalError(\n\t\t\t\t\"Connection not connected yet. This happens when trying to use the connection in onBeforeConnect or createConnState.\",\n\t\t\t);\n\t}\n\n\t// MARK: - Public Getters\n\tget params(): CP {\n\t\treturn this.#stateManager.ephemeralData.parameters;\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\tget state(): CS {\n\t\treturn this.#stateManager.state;\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\tset state(value: CS) {\n\t\tthis.#stateManager.state = value;\n\t}\n\n\t/**\n\t * Unique identifier for the connection.\n\t */\n\tget id(): ConnId {\n\t\treturn this.#stateManager.ephemeralData.id;\n\t}\n\n\t/**\n\t * @experimental\n\t *\n\t * If the underlying connection can hibernate.\n\t */\n\tget isHibernatable(): boolean {\n\t\treturn this.#stateManager.hibernatableDataRaw !== undefined;\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\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, DB, E, Q>,\n\t\tdata: ConnDataInput<CP, CS>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#stateManager = new StateManager(this, data);\n\t}\n\n\t/**\n\t * Sends a raw message to the underlying connection.\n\t */\n\t[CONN_SEND_MESSAGE_SYMBOL](message: CachedSerializer<any, any, any>) {\n\t\tif (this[CONN_DRIVER_SYMBOL]) {\n\t\t\tconst driver = this[CONN_DRIVER_SYMBOL];\n\n\t\t\tif (driver.rivetKitProtocol) {\n\t\t\t\tdriver.rivetKitProtocol.sendMessage(this.#actor, this, message);\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.warn({\n\t\t\t\t\tmsg: \"attempting to send RivetKit protocol message to connection that does not support it\",\n\t\t\t\t\tconn: this.id,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"missing connection driver state for send message\",\n\t\t\t\tconn: this.id,\n\t\t\t});\n\t\t}\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.dev/docs/events|Events Documentation}\n\t */\n\tsend<K extends keyof E & string>(\n\t\teventName: K,\n\t\t...args: InferEventArgs<InferSchemaMap<E>[K]>\n\t): void;\n\tsend(\n\t\teventName: keyof E extends never ? string : never,\n\t\t...args: unknown[]\n\t): void;\n\tsend(eventName: string, ...args: unknown[]) {\n\t\tthis.#assertConnected();\n\t\tif (!this[CONN_SPEAKS_RIVETKIT_SYMBOL]) {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"cannot send messages to this connection type\",\n\t\t\t\tconnId: this.id,\n\t\t\t\tconnType: this[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tthis.#actor.config.events !== undefined &&\n\t\t\t!hasSchemaConfigKey(this.#actor.config.events, eventName)\n\t\t) {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"sending event not defined in actor events config\",\n\t\t\t\teventName,\n\t\t\t\tconnId: this.id,\n\t\t\t});\n\t\t}\n\n\t\tconst payload = args.length === 1 ? args[0] : args;\n\t\tconst result = validateSchemaSync(\n\t\t\tthis.#actor.config.events,\n\t\t\teventName as keyof E & string,\n\t\t\tpayload,\n\t\t);\n\t\tif (!result.success) {\n\t\t\tthrow new EventPayloadInvalid(eventName, result.issues);\n\t\t}\n\t\tconst eventArgs =\n\t\t\targs.length === 1\n\t\t\t\t? [result.data]\n\t\t\t\t: Array.isArray(result.data)\n\t\t\t\t\t? (result.data as unknown[])\n\t\t\t\t\t: args;\n\t\tthis.#actor.emitTraceEvent(\"message.send\", {\n\t\t\t\"rivet.event.name\": eventName,\n\t\t\t\"rivet.conn.id\": this.id,\n\t\t});\n\t\tconst eventData = { name: eventName, args: eventArgs };\n\t\tthis[CONN_SEND_MESSAGE_SYMBOL](\n\t\t\tnew CachedSerializer(\n\t\t\t\teventData,\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\tToClientSchema,\n\t\t\t\t// JSON: args is the raw value (array of arguments)\n\t\t\t\t(value): ToClientJson => ({\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\t\targs: value.args,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\t// BARE/CBOR: args needs to be CBOR-encoded to ArrayBuffer\n\t\t\t\t(value): protocol.ToClient => ({\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(value.args)),\n\t\t\t\t\t\t},\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\tasync disconnect(reason?: string) {\n\t\tif (this[CONN_DRIVER_SYMBOL]) {\n\t\t\tconst driver = this[CONN_DRIVER_SYMBOL];\n\t\t\tif (driver.disconnect) {\n\t\t\t\tdriver.disconnect(this.#actor, this, reason);\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.debug({\n\t\t\t\t\tmsg: \"no disconnect handler for conn driver\",\n\t\t\t\t\tconn: this.id,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait this.#actor.connectionManager.connDisconnected(this);\n\t\t\t} finally {\n\t\t\t\tthis[CONN_DRIVER_SYMBOL] = undefined;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"missing connection driver state for disconnect\",\n\t\t\t\tconn: this.id,\n\t\t\t});\n\t\t\tthis[CONN_DRIVER_SYMBOL] = undefined;\n\t\t}\n\t}\n}\n","import type { HibernatingWebSocketMetadata } from \"@rivetkit/engine-runner\";\nimport onChange from \"@rivetkit/on-change\";\nimport * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport { isCborSerializable } from \"@/common/utils\";\nimport * as errors from \"../errors\";\nimport { assertUnreachable } from \"../utils\";\nimport { CONN_ACTOR_SYMBOL, type Conn } from \"./mod\";\nimport type { PersistedConn } from \"./persisted\";\n\n/** Pick a subset of persisted data used to represent ephemeral connections */\nexport type EphemeralConn<CP, CS> = Pick<\n\tPersistedConn<CP, CS>,\n\t\"id\" | \"parameters\" | \"state\"\n>;\n\nexport type ConnDataInput<CP, CS> =\n\t| { ephemeral: EphemeralConn<CP, CS> }\n\t| { hibernatable: PersistedConn<CP, CS> };\n\nexport type ConnData<CP, CS> =\n\t| {\n\t\t\tephemeral: {\n\t\t\t\t/** In-memory data representing this connection */\n\t\t\t\tdata: EphemeralConn<CP, CS>;\n\t\t\t};\n\t }\n\t| {\n\t\t\thibernatable: {\n\t\t\t\t/** Persisted data with on-change proxy */\n\t\t\t\tdata: PersistedConn<CP, CS>;\n\t\t\t\t/** Raw persisted data without proxy */\n\t\t\t\tdataRaw: PersistedConn<CP, CS>;\n\t\t\t};\n\t };\n\n/**\n * Manages connection state persistence, proxying, and change tracking.\n * Handles automatic state change detection for connection-specific state.\n */\nexport class StateManager<CP, CS> {\n\t#conn: Conn<any, CP, CS, any, any, any, any, any>;\n\n\t/**\n\t * Data representing this connection.\n\t *\n\t * This is stored as a struct for both ephemeral and hibernatable conns in\n\t * order to keep the separation clear between the two.\n\t */\n\t#data!: ConnData<CP, CS>;\n\n\tconstructor(\n\t\tconn: Conn<any, CP, CS, any, any, any, any, any>,\n\t\tdata: ConnDataInput<CP, CS>,\n\t) {\n\t\tthis.#conn = conn;\n\n\t\tif (\"ephemeral\" in data) {\n\t\t\tthis.#data = { ephemeral: { data: data.ephemeral } };\n\t\t} else if (\"hibernatable\" in data) {\n\t\t\t// Listen for changes to the object\n\t\t\tconst persistRaw = data.hibernatable;\n\t\t\tconst persist = onChange(\n\t\t\t\tpersistRaw,\n\t\t\t\t(\n\t\t\t\t\tpath: string,\n\t\t\t\t\tvalue: any,\n\t\t\t\t\t_previousValue: any,\n\t\t\t\t\t_applyData: any,\n\t\t\t\t) => {\n\t\t\t\t\tthis.#handleChange(path, value);\n\t\t\t\t},\n\t\t\t\t{ ignoreDetached: true },\n\t\t\t);\n\t\t\tthis.#data = {\n\t\t\t\thibernatable: { data: persist, dataRaw: persistRaw },\n\t\t\t};\n\t\t} else {\n\t\t\tassertUnreachable(data);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the ephemeral or persisted data for this connectioned.\n\t *\n\t * This property is used to be able to treat both memory & persist conns\n\t * identical by looking up the correct underlying data structure.\n\t */\n\tget ephemeralData(): EphemeralConn<CP, CS> {\n\t\tif (\"hibernatable\" in this.#data) {\n\t\t\treturn this.#data.hibernatable.data;\n\t\t} else if (\"ephemeral\" in this.#data) {\n\t\t\treturn this.#data.ephemeral.data;\n\t\t} else {\n\t\t\treturn assertUnreachable(this.#data);\n\t\t}\n\t}\n\n\tget hibernatableData(): PersistedConn<CP, CS> | undefined {\n\t\tif (\"hibernatable\" in this.#data) {\n\t\t\treturn this.#data.hibernatable.data;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\thibernatableDataOrError(): PersistedConn<CP, CS> {\n\t\tconst hibernatable = this.hibernatableData;\n\t\tinvariant(hibernatable, \"missing hibernatable data\");\n\t\treturn hibernatable;\n\t}\n\n\tget hibernatableDataRaw(): PersistedConn<CP, CS> | undefined {\n\t\tif (\"hibernatable\" in this.#data) {\n\t\t\treturn this.#data.hibernatable.dataRaw;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tget stateEnabled(): boolean {\n\t\treturn this.#conn[CONN_ACTOR_SYMBOL].connStateEnabled;\n\t}\n\n\tget state(): CS {\n\t\tthis.#validateStateEnabled();\n\t\tconst state = this.ephemeralData.state;\n\t\tif (!state) throw new Error(\"state should exists\");\n\t\treturn state;\n\t}\n\n\tset state(value: CS) {\n\t\tthis.#validateStateEnabled();\n\t\tthis.ephemeralData.state = value;\n\t}\n\n\t#validateStateEnabled() {\n\t\tif (!this.#conn[CONN_ACTOR_SYMBOL].connStateEnabled) {\n\t\t\tthrow new errors.ConnStateNotEnabled();\n\t\t}\n\t}\n\n\t#handleChange(path: string, value: any) {\n\t\t// NOTE: This will only be called for hibernatable conns since only\n\t\t// hibernatable conns have the on-change proxy\n\n\t\t// Validate CBOR serializability for state changes\n\t\tif (path.startsWith(\"state\")) {\n\t\t\tlet invalidPath = \"\";\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\tvalue,\n\t\t\t\t\t(invalidPathPart: string) => {\n\t\t\t\t\t\tinvalidPath = invalidPathPart;\n\t\t\t\t\t},\n\t\t\t\t\t\"\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new errors.InvalidStateType({\n\t\t\t\t\tpath: path + (invalidPath ? `.${invalidPath}` : \"\"),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.#conn[CONN_ACTOR_SYMBOL].rLog.debug({\n\t\t\tmsg: \"conn onChange triggered\",\n\t\t\tconnId: this.#conn.id,\n\t\t\tpath,\n\t\t});\n\n\t\t// Notify actor that this connection has changed\n\t\tthis.#conn[\n\t\t\tCONN_ACTOR_SYMBOL\n\t\t].connectionManager.markConnWithPersistChanged(this.#conn);\n\t}\n\n\taddSubscription({ eventName }: { eventName: string }) {\n\t\tconst hibernatable = this.hibernatableData;\n\t\tif (!hibernatable) return;\n\t\thibernatable.subscriptions.push({\n\t\t\teventName,\n\t\t});\n\t}\n\n\tremoveSubscription({ eventName }: { eventName: string }) {\n\t\tconst hibernatable = this.hibernatableData;\n\t\tif (!hibernatable) return;\n\t\tconst subIdx = hibernatable.subscriptions.findIndex(\n\t\t\t(s) => s.eventName === eventName,\n\t\t);\n\t\tif (subIdx !== -1) {\n\t\t\thibernatable.subscriptions.splice(subIdx, 1);\n\t\t}\n\t\treturn subIdx !== -1;\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"actor-manager\");\n}\n","import * as cbor from \"cbor-x\";\nimport { KEYS } from \"@/actor/instance/keys\";\nimport type * as persistSchema from \"@/schemas/actor-persist/mod\";\nimport {\n\tACTOR_VERSIONED,\n\tCURRENT_VERSION,\n} from \"@/schemas/actor-persist/versioned\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { ActorDriver } from \"./mod\";\nimport type { SqliteVfs } from \"@rivetkit/sqlite-vfs\";\n\nfunction serializeEmptyPersistData(input: unknown | undefined): Uint8Array {\n\tconst persistData: persistSchema.Actor = {\n\t\tinput:\n\t\t\tinput !== undefined\n\t\t\t\t? bufferToArrayBuffer(cbor.encode(input))\n\t\t\t\t: null,\n\t\thasInitialized: false,\n\t\tstate: bufferToArrayBuffer(cbor.encode(undefined)),\n\t\tscheduledEvents: [],\n\t};\n\treturn ACTOR_VERSIONED.serializeWithEmbeddedVersion(\n\t\tpersistData,\n\t\tCURRENT_VERSION,\n\t);\n}\n\n/**\n * Returns the initial KV state for a new actor. This is ued by the drivers to\n * write the initial state in to KV storage before starting the actor.\n */\nexport function getInitialActorKvState(\n\tinput: unknown | undefined,\n): [Uint8Array, Uint8Array][] {\n\tconst persistData = serializeEmptyPersistData(input);\n\treturn [[KEYS.PERSIST_DATA, persistData]];\n}\n\n/**\n * Dynamically import @rivetkit/sqlite-vfs and return a fresh SqliteVfs instance.\n *\n * The module specifier is built with Array.join() so that bundlers (esbuild, tsup,\n * Turbopack) cannot statically analyze or constant-fold the import path. This\n * prevents them from tracing into the WASM dependency tree, which would cause\n * errors in environments that don't support .wasm imports (e.g. Turbopack).\n *\n * Each call returns a new instance so that actors get independent SQLite modules,\n * avoiding cross-actor re-entry on the non-reentrant async build.\n */\nexport async function importSqliteVfs(): Promise<SqliteVfs> {\n\tconst specifier = [\"@rivetkit\", \"sqlite-vfs\"].join(\"/\");\n\tconst { SqliteVfs } = await import(specifier);\n\treturn new SqliteVfs();\n}\n","import { createVersionedDataHandler } from \"vbare\";\nimport * as v1 from \"../../../dist/schemas/actor-persist/v1\";\nimport * as v2 from \"../../../dist/schemas/actor-persist/v2\";\nimport * as v3 from \"../../../dist/schemas/actor-persist/v3\";\nimport * as v4 from \"../../../dist/schemas/actor-persist/v4\";\n\nexport const CURRENT_VERSION = 4;\n\n// Converter from v1 to v2\nconst v1ToV2 = (v1Data: v1.PersistedActor): v2.PersistedActor => ({\n\t...v1Data,\n\tconnections: v1Data.connections.map((conn) => ({\n\t\t...conn,\n\t\thibernatableRequestId: null,\n\t})),\n\thibernatableWebSockets: [],\n});\n\n// Converter from v2 to v3\nconst v2ToV3 = (v2Data: v2.PersistedActor): v3.Actor => {\n\t// Transform scheduled events from nested structure to flat structure\n\tconst scheduledEvents: v3.ScheduleEvent[] = v2Data.scheduledEvents.map(\n\t\t(event) => {\n\t\t\t// Extract action and args from the kind wrapper\n\t\t\tif (event.kind.tag === \"GenericPersistedScheduleEvent\") {\n\t\t\t\treturn {\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\ttimestamp: event.timestamp,\n\t\t\t\t\taction: event.kind.val.action,\n\t\t\t\t\targs: event.kind.val.args,\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Fallback for unknown kinds\n\t\t\tthrow new Error(`Unknown schedule event kind: ${event.kind.tag}`);\n\t\t},\n\t);\n\n\treturn {\n\t\tinput: v2Data.input,\n\t\thasInitialized: v2Data.hasInitialized,\n\t\tstate: v2Data.state,\n\t\tscheduledEvents,\n\t};\n};\n\n// Converter from v3 to v4: No changes to Actor structure\nconst v3ToV4 = (v3Data: v3.Actor): v4.Actor => {\n\treturn v3Data as unknown as v4.Actor;\n};\n\n// Converter from v4 to v3: No changes to Actor structure\nconst v4ToV3 = (v4Data: v4.Actor): v3.Actor => {\n\treturn v4Data as unknown as v3.Actor;\n};\n\n// Converter from v3 to v2\nconst v3ToV2 = (v3Data: v3.Actor): v2.PersistedActor => {\n\t// Transform scheduled events from flat structure back to nested structure\n\tconst scheduledEvents: v2.PersistedScheduleEvent[] =\n\t\tv3Data.scheduledEvents.map((event) => ({\n\t\t\teventId: event.eventId,\n\t\t\ttimestamp: event.timestamp,\n\t\t\tkind: {\n\t\t\t\ttag: \"GenericPersistedScheduleEvent\" as const,\n\t\t\t\tval: {\n\t\t\t\t\taction: event.action,\n\t\t\t\t\targs: event.args,\n\t\t\t\t},\n\t\t\t},\n\t\t}));\n\n\treturn {\n\t\tinput: v3Data.input,\n\t\thasInitialized: v3Data.hasInitialized,\n\t\tstate: v3Data.state,\n\t\tscheduledEvents,\n\t\tconnections: [],\n\t\thibernatableWebSockets: [],\n\t};\n};\n\n// Converter from v2 to v1\nconst v2ToV1 = (v2Data: v2.PersistedActor): v1.PersistedActor => {\n\treturn {\n\t\tinput: v2Data.input,\n\t\thasInitialized: v2Data.hasInitialized,\n\t\tstate: v2Data.state,\n\t\tscheduledEvents: v2Data.scheduledEvents,\n\t\tconnections: v2Data.connections.map((conn) => {\n\t\t\tconst { hibernatableRequestId, ...rest } = conn;\n\t\t\treturn rest;\n\t\t}),\n\t};\n};\n\nexport const ACTOR_VERSIONED = createVersionedDataHandler<v4.Actor>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.decodePersistedActor(bytes);\n\t\t\tcase 2:\n\t\t\t\treturn v2.decodePersistedActor(bytes);\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeActor(bytes);\n\t\t\tcase 4:\n\t\t\t\treturn v4.decodeActor(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.encodePersistedActor(data as v1.PersistedActor);\n\t\t\tcase 2:\n\t\t\t\treturn v2.encodePersistedActor(data as v2.PersistedActor);\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeActor(data as v3.Actor);\n\t\t\tcase 4:\n\t\t\t\treturn v4.encodeActor(data as v4.Actor);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tdeserializeConverters: () => [v1ToV2, v2ToV3, v3ToV4],\n\tserializeConverters: () => [v4ToV3, v3ToV2, v2ToV1],\n});\n\n// Conn identity converters (Conn is identical between v3 and v4)\nconst v3ConnToV4 = (v3Data: v3.Conn): v4.Conn => {\n\treturn v3Data as unknown as v4.Conn;\n};\n\nconst v4ConnToV3 = (v4Data: v4.Conn): v3.Conn => {\n\treturn v4Data as unknown as v3.Conn;\n};\n\nexport const CONN_VERSIONED = createVersionedDataHandler<v4.Conn>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeConn(bytes);\n\t\t\tcase 4:\n\t\t\t\treturn v4.decodeConn(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Conn type only exists in version 3+, got version ${version}`,\n\t\t\t\t);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeConn(data as v3.Conn);\n\t\t\tcase 4:\n\t\t\t\treturn v4.encodeConn(data as v4.Conn);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Conn type only exists in version 3+, got version ${version}`,\n\t\t\t\t);\n\t\t}\n\t},\n\tdeserializeConverters: () => [v3ConnToV4],\n\tserializeConverters: () => [v4ConnToV3],\n});\n\nexport const QUEUE_METADATA_VERSIONED =\n\tcreateVersionedDataHandler<v4.QueueMetadata>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 4:\n\t\t\t\t\treturn v4.decodeQueueMetadata(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`QueueMetadata type only exists in version 4+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 4:\n\t\t\t\t\treturn v4.encodeQueueMetadata(data as v4.QueueMetadata);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`QueueMetadata type only exists in version 4+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n\nexport const QUEUE_MESSAGE_VERSIONED =\n\tcreateVersionedDataHandler<v4.QueueMessage>({\n\t\tdeserializeVersion: (bytes, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 4:\n\t\t\t\t\treturn v4.decodeQueueMessage(bytes);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`QueueMessage type only exists in version 4+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tserializeVersion: (data, version) => {\n\t\t\tswitch (version) {\n\t\t\t\tcase 4:\n\t\t\t\t\treturn v4.encodeQueueMessage(data as v4.QueueMessage);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`QueueMessage type only exists in version 4+, got version ${version}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tdeserializeConverters: () => [],\n\t\tserializeConverters: () => [],\n\t});\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type u64 = bigint\n\nexport type PersistedSubscription = {\n readonly eventName: string,\n}\n\nexport function readPersistedSubscription(bc: bare.ByteCursor): PersistedSubscription {\n return {\n eventName: bare.readString(bc),\n }\n}\n\nexport function writePersistedSubscription(bc: bare.ByteCursor, x: PersistedSubscription): void {\n bare.writeString(bc, x.eventName)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly PersistedSubscription[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedSubscription(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedSubscription(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly PersistedSubscription[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedSubscription(bc, x[i])\n }\n}\n\nexport type PersistedConnection = {\n readonly id: string,\n readonly token: string,\n readonly parameters: ArrayBuffer,\n readonly state: ArrayBuffer,\n readonly subscriptions: readonly PersistedSubscription[],\n readonly lastSeen: u64,\n}\n\nexport function readPersistedConnection(bc: bare.ByteCursor): PersistedConnection {\n return {\n id: bare.readString(bc),\n token: bare.readString(bc),\n parameters: bare.readData(bc),\n state: bare.readData(bc),\n subscriptions: read0(bc),\n lastSeen: bare.readU64(bc),\n }\n}\n\nexport function writePersistedConnection(bc: bare.ByteCursor, x: PersistedConnection): void {\n bare.writeString(bc, x.id)\n bare.writeString(bc, x.token)\n bare.writeData(bc, x.parameters)\n bare.writeData(bc, x.state)\n write0(bc, x.subscriptions)\n bare.writeU64(bc, x.lastSeen)\n}\n\nfunction read1(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nexport type GenericPersistedScheduleEvent = {\n readonly action: string,\n readonly args: ArrayBuffer | null,\n}\n\nexport function readGenericPersistedScheduleEvent(bc: bare.ByteCursor): GenericPersistedScheduleEvent {\n return {\n action: bare.readString(bc),\n args: read1(bc),\n }\n}\n\nexport function writeGenericPersistedScheduleEvent(bc: bare.ByteCursor, x: GenericPersistedScheduleEvent): void {\n bare.writeString(bc, x.action)\n write1(bc, x.args)\n}\n\nexport type PersistedScheduleEventKind =\n | { readonly tag: \"GenericPersistedScheduleEvent\", readonly val: GenericPersistedScheduleEvent }\n\nexport function readPersistedScheduleEventKind(bc: bare.ByteCursor): PersistedScheduleEventKind {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"GenericPersistedScheduleEvent\", val: readGenericPersistedScheduleEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writePersistedScheduleEventKind(bc: bare.ByteCursor, x: PersistedScheduleEventKind): void {\n switch (x.tag) {\n case \"GenericPersistedScheduleEvent\": {\n bare.writeU8(bc, 0)\n writeGenericPersistedScheduleEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type PersistedScheduleEvent = {\n readonly eventId: string,\n readonly timestamp: u64,\n readonly kind: PersistedScheduleEventKind,\n}\n\nexport function readPersistedScheduleEvent(bc: bare.ByteCursor): PersistedScheduleEvent {\n return {\n eventId: bare.readString(bc),\n timestamp: bare.readU64(bc),\n kind: readPersistedScheduleEventKind(bc),\n }\n}\n\nexport function writePersistedScheduleEvent(bc: bare.ByteCursor, x: PersistedScheduleEvent): void {\n bare.writeString(bc, x.eventId)\n bare.writeU64(bc, x.timestamp)\n writePersistedScheduleEventKind(bc, x.kind)\n}\n\nfunction read2(bc: bare.ByteCursor): readonly PersistedConnection[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedConnection(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedConnection(bc)\n }\n return result\n}\n\nfunction write2(bc: bare.ByteCursor, x: readonly PersistedConnection[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedConnection(bc, x[i])\n }\n}\n\nfunction read3(bc: bare.ByteCursor): readonly PersistedScheduleEvent[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedScheduleEvent(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedScheduleEvent(bc)\n }\n return result\n}\n\nfunction write3(bc: bare.ByteCursor, x: readonly PersistedScheduleEvent[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedScheduleEvent(bc, x[i])\n }\n}\n\nexport type PersistedActor = {\n readonly input: ArrayBuffer | null,\n readonly hasInitialized: boolean,\n readonly state: ArrayBuffer,\n readonly connections: readonly PersistedConnection[],\n readonly scheduledEvents: readonly PersistedScheduleEvent[],\n}\n\nexport function readPersistedActor(bc: bare.ByteCursor): PersistedActor {\n return {\n input: read1(bc),\n hasInitialized: bare.readBool(bc),\n state: bare.readData(bc),\n connections: read2(bc),\n scheduledEvents: read3(bc),\n }\n}\n\nexport function writePersistedActor(bc: bare.ByteCursor, x: PersistedActor): void {\n write1(bc, x.input)\n bare.writeBool(bc, x.hasInitialized)\n bare.writeData(bc, x.state)\n write2(bc, x.connections)\n write3(bc, x.scheduledEvents)\n}\n\nexport function encodePersistedActor(x: PersistedActor): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writePersistedActor(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodePersistedActor(bytes: Uint8Array): PersistedActor {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readPersistedActor(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type i64 = bigint\n\nexport type PersistedSubscription = {\n readonly eventName: string,\n}\n\nexport function readPersistedSubscription(bc: bare.ByteCursor): PersistedSubscription {\n return {\n eventName: bare.readString(bc),\n }\n}\n\nexport function writePersistedSubscription(bc: bare.ByteCursor, x: PersistedSubscription): void {\n bare.writeString(bc, x.eventName)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly PersistedSubscription[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedSubscription(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedSubscription(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly PersistedSubscription[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedSubscription(bc, x[i])\n }\n}\n\nfunction read1(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nexport type PersistedConnection = {\n readonly id: string,\n readonly token: string,\n readonly parameters: ArrayBuffer,\n readonly state: ArrayBuffer,\n readonly subscriptions: readonly PersistedSubscription[],\n readonly lastSeen: i64,\n readonly hibernatableRequestId: ArrayBuffer | null,\n}\n\nexport function readPersistedConnection(bc: bare.ByteCursor): PersistedConnection {\n return {\n id: bare.readString(bc),\n token: bare.readString(bc),\n parameters: bare.readData(bc),\n state: bare.readData(bc),\n subscriptions: read0(bc),\n lastSeen: bare.readI64(bc),\n hibernatableRequestId: read1(bc),\n }\n}\n\nexport function writePersistedConnection(bc: bare.ByteCursor, x: PersistedConnection): void {\n bare.writeString(bc, x.id)\n bare.writeString(bc, x.token)\n bare.writeData(bc, x.parameters)\n bare.writeData(bc, x.state)\n write0(bc, x.subscriptions)\n bare.writeI64(bc, x.lastSeen)\n write1(bc, x.hibernatableRequestId)\n}\n\nexport type GenericPersistedScheduleEvent = {\n readonly action: string,\n readonly args: ArrayBuffer | null,\n}\n\nexport function readGenericPersistedScheduleEvent(bc: bare.ByteCursor): GenericPersistedScheduleEvent {\n return {\n action: bare.readString(bc),\n args: read1(bc),\n }\n}\n\nexport function writeGenericPersistedScheduleEvent(bc: bare.ByteCursor, x: GenericPersistedScheduleEvent): void {\n bare.writeString(bc, x.action)\n write1(bc, x.args)\n}\n\nexport type PersistedScheduleEventKind =\n | { readonly tag: \"GenericPersistedScheduleEvent\", readonly val: GenericPersistedScheduleEvent }\n\nexport function readPersistedScheduleEventKind(bc: bare.ByteCursor): PersistedScheduleEventKind {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"GenericPersistedScheduleEvent\", val: readGenericPersistedScheduleEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writePersistedScheduleEventKind(bc: bare.ByteCursor, x: PersistedScheduleEventKind): void {\n switch (x.tag) {\n case \"GenericPersistedScheduleEvent\": {\n bare.writeU8(bc, 0)\n writeGenericPersistedScheduleEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type PersistedScheduleEvent = {\n readonly eventId: string,\n readonly timestamp: i64,\n readonly kind: PersistedScheduleEventKind,\n}\n\nexport function readPersistedScheduleEvent(bc: bare.ByteCursor): PersistedScheduleEvent {\n return {\n eventId: bare.readString(bc),\n timestamp: bare.readI64(bc),\n kind: readPersistedScheduleEventKind(bc),\n }\n}\n\nexport function writePersistedScheduleEvent(bc: bare.ByteCursor, x: PersistedScheduleEvent): void {\n bare.writeString(bc, x.eventId)\n bare.writeI64(bc, x.timestamp)\n writePersistedScheduleEventKind(bc, x.kind)\n}\n\nexport type PersistedHibernatableWebSocket = {\n readonly requestId: ArrayBuffer,\n readonly lastSeenTimestamp: i64,\n readonly msgIndex: i64,\n}\n\nexport function readPersistedHibernatableWebSocket(bc: bare.ByteCursor): PersistedHibernatableWebSocket {\n return {\n requestId: bare.readData(bc),\n lastSeenTimestamp: bare.readI64(bc),\n msgIndex: bare.readI64(bc),\n }\n}\n\nexport function writePersistedHibernatableWebSocket(bc: bare.ByteCursor, x: PersistedHibernatableWebSocket): void {\n bare.writeData(bc, x.requestId)\n bare.writeI64(bc, x.lastSeenTimestamp)\n bare.writeI64(bc, x.msgIndex)\n}\n\nfunction read2(bc: bare.ByteCursor): readonly PersistedConnection[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedConnection(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedConnection(bc)\n }\n return result\n}\n\nfunction write2(bc: bare.ByteCursor, x: readonly PersistedConnection[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedConnection(bc, x[i])\n }\n}\n\nfunction read3(bc: bare.ByteCursor): readonly PersistedScheduleEvent[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedScheduleEvent(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedScheduleEvent(bc)\n }\n return result\n}\n\nfunction write3(bc: bare.ByteCursor, x: readonly PersistedScheduleEvent[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedScheduleEvent(bc, x[i])\n }\n}\n\nfunction read4(bc: bare.ByteCursor): readonly PersistedHibernatableWebSocket[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readPersistedHibernatableWebSocket(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readPersistedHibernatableWebSocket(bc)\n }\n return result\n}\n\nfunction write4(bc: bare.ByteCursor, x: readonly PersistedHibernatableWebSocket[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writePersistedHibernatableWebSocket(bc, x[i])\n }\n}\n\nexport type PersistedActor = {\n readonly input: ArrayBuffer | null,\n readonly hasInitialized: boolean,\n readonly state: ArrayBuffer,\n readonly connections: readonly PersistedConnection[],\n readonly scheduledEvents: readonly PersistedScheduleEvent[],\n readonly hibernatableWebSockets: readonly PersistedHibernatableWebSocket[],\n}\n\nexport function readPersistedActor(bc: bare.ByteCursor): PersistedActor {\n return {\n input: read1(bc),\n hasInitialized: bare.readBool(bc),\n state: bare.readData(bc),\n connections: read2(bc),\n scheduledEvents: read3(bc),\n hibernatableWebSockets: read4(bc),\n }\n}\n\nexport function writePersistedActor(bc: bare.ByteCursor, x: PersistedActor): void {\n write1(bc, x.input)\n bare.writeBool(bc, x.hasInitialized)\n bare.writeData(bc, x.state)\n write2(bc, x.connections)\n write3(bc, x.scheduledEvents)\n write4(bc, x.hibernatableWebSockets)\n}\n\nexport function encodePersistedActor(x: PersistedActor): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writePersistedActor(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodePersistedActor(bytes: Uint8Array): PersistedActor {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readPersistedActor(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\n\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type i64 = bigint\nexport type u16 = number\n\nexport type GatewayId = ArrayBuffer\n\nexport function readGatewayId(bc: bare.ByteCursor): GatewayId {\n return bare.readFixedData(bc, 4)\n}\n\nexport function writeGatewayId(bc: bare.ByteCursor, x: GatewayId): void {\n assert(x.byteLength === 4)\n bare.writeFixedData(bc, x)\n}\n\nexport type RequestId = ArrayBuffer\n\nexport function readRequestId(bc: bare.ByteCursor): RequestId {\n return bare.readFixedData(bc, 4)\n}\n\nexport function writeRequestId(bc: bare.ByteCursor, x: RequestId): void {\n assert(x.byteLength === 4)\n bare.writeFixedData(bc, x)\n}\n\nexport type MessageIndex = u16\n\nexport function readMessageIndex(bc: bare.ByteCursor): MessageIndex {\n return bare.readU16(bc)\n}\n\nexport function writeMessageIndex(bc: bare.ByteCursor, x: MessageIndex): void {\n bare.writeU16(bc, x)\n}\n\nexport function encodeMessageIndex(x: MessageIndex): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeMessageIndex(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeMessageIndex(bytes: Uint8Array): MessageIndex {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readMessageIndex(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type Cbor = ArrayBuffer\n\nexport function readCbor(bc: bare.ByteCursor): Cbor {\n return bare.readData(bc)\n}\n\nexport function writeCbor(bc: bare.ByteCursor, x: Cbor): void {\n bare.writeData(bc, x)\n}\n\nexport type Subscription = {\n readonly eventName: string,\n}\n\nexport function readSubscription(bc: bare.ByteCursor): Subscription {\n return {\n eventName: bare.readString(bc),\n }\n}\n\nexport function writeSubscription(bc: bare.ByteCursor, x: Subscription): void {\n bare.writeString(bc, x.eventName)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly Subscription[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readSubscription(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readSubscription(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly Subscription[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeSubscription(bc, x[i])\n }\n}\n\nfunction read1(bc: bare.ByteCursor): ReadonlyMap<string, string> {\n const len = bare.readUintSafe(bc)\n const result = new Map<string, string>()\n for (let i = 0; i < len; i++) {\n const offset = bc.offset\n const key = bare.readString(bc)\n if (result.has(key)) {\n bc.offset = offset\n throw new bare.BareError(offset, \"duplicated key\")\n }\n result.set(key, bare.readString(bc))\n }\n return result\n}\n\nfunction write1(bc: bare.ByteCursor, x: ReadonlyMap<string, string>): void {\n bare.writeUintSafe(bc, x.size)\n for(const kv of x) {\n bare.writeString(bc, kv[0])\n bare.writeString(bc, kv[1])\n }\n}\n\nexport type Conn = {\n readonly id: string,\n readonly parameters: Cbor,\n readonly state: Cbor,\n readonly subscriptions: readonly Subscription[],\n readonly gatewayId: GatewayId,\n readonly requestId: RequestId,\n readonly serverMessageIndex: u16,\n readonly clientMessageIndex: u16,\n readonly requestPath: string,\n readonly requestHeaders: ReadonlyMap<string, string>,\n}\n\nexport function readConn(bc: bare.ByteCursor): Conn {\n return {\n id: bare.readString(bc),\n parameters: readCbor(bc),\n state: readCbor(bc),\n subscriptions: read0(bc),\n gatewayId: readGatewayId(bc),\n requestId: readRequestId(bc),\n serverMessageIndex: bare.readU16(bc),\n clientMessageIndex: bare.readU16(bc),\n requestPath: bare.readString(bc),\n requestHeaders: read1(bc),\n }\n}\n\nexport function writeConn(bc: bare.ByteCursor, x: Conn): void {\n bare.writeString(bc, x.id)\n writeCbor(bc, x.parameters)\n writeCbor(bc, x.state)\n write0(bc, x.subscriptions)\n writeGatewayId(bc, x.gatewayId)\n writeRequestId(bc, x.requestId)\n bare.writeU16(bc, x.serverMessageIndex)\n bare.writeU16(bc, x.clientMessageIndex)\n bare.writeString(bc, x.requestPath)\n write1(bc, x.requestHeaders)\n}\n\nexport function encodeConn(x: Conn): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeConn(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeConn(bytes: Uint8Array): Conn {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readConn(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nfunction read2(bc: bare.ByteCursor): Cbor | null {\n return bare.readBool(bc)\n ? readCbor(bc)\n : null\n}\n\nfunction write2(bc: bare.ByteCursor, x: Cbor | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n writeCbor(bc, x)\n }\n}\n\nexport type ScheduleEvent = {\n readonly eventId: string,\n readonly timestamp: i64,\n readonly action: string,\n readonly args: Cbor | null,\n}\n\nexport function readScheduleEvent(bc: bare.ByteCursor): ScheduleEvent {\n return {\n eventId: bare.readString(bc),\n timestamp: bare.readI64(bc),\n action: bare.readString(bc),\n args: read2(bc),\n }\n}\n\nexport function writeScheduleEvent(bc: bare.ByteCursor, x: ScheduleEvent): void {\n bare.writeString(bc, x.eventId)\n bare.writeI64(bc, x.timestamp)\n bare.writeString(bc, x.action)\n write2(bc, x.args)\n}\n\nfunction read3(bc: bare.ByteCursor): readonly ScheduleEvent[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readScheduleEvent(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readScheduleEvent(bc)\n }\n return result\n}\n\nfunction write3(bc: bare.ByteCursor, x: readonly ScheduleEvent[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeScheduleEvent(bc, x[i])\n }\n}\n\nexport type Actor = {\n readonly input: Cbor | null,\n readonly hasInitialized: boolean,\n readonly state: Cbor,\n readonly scheduledEvents: readonly ScheduleEvent[],\n}\n\nexport function readActor(bc: bare.ByteCursor): Actor {\n return {\n input: read2(bc),\n hasInitialized: bare.readBool(bc),\n state: readCbor(bc),\n scheduledEvents: read3(bc),\n }\n}\n\nexport function writeActor(bc: bare.ByteCursor, x: Actor): void {\n write2(bc, x.input)\n bare.writeBool(bc, x.hasInitialized)\n writeCbor(bc, x.state)\n write3(bc, x.scheduledEvents)\n}\n\nexport function encodeActor(x: Actor): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActor(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActor(bytes: Uint8Array): Actor {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActor(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\n\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type i64 = bigint\nexport type u16 = number\nexport type u32 = number\nexport type u64 = bigint\n\nexport type GatewayId = ArrayBuffer\n\nexport function readGatewayId(bc: bare.ByteCursor): GatewayId {\n return bare.readFixedData(bc, 4)\n}\n\nexport function writeGatewayId(bc: bare.ByteCursor, x: GatewayId): void {\n assert(x.byteLength === 4)\n bare.writeFixedData(bc, x)\n}\n\nexport type RequestId = ArrayBuffer\n\nexport function readRequestId(bc: bare.ByteCursor): RequestId {\n return bare.readFixedData(bc, 4)\n}\n\nexport function writeRequestId(bc: bare.ByteCursor, x: RequestId): void {\n assert(x.byteLength === 4)\n bare.writeFixedData(bc, x)\n}\n\nexport type MessageIndex = u16\n\nexport function readMessageIndex(bc: bare.ByteCursor): MessageIndex {\n return bare.readU16(bc)\n}\n\nexport function writeMessageIndex(bc: bare.ByteCursor, x: MessageIndex): void {\n bare.writeU16(bc, x)\n}\n\nexport function encodeMessageIndex(x: MessageIndex): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeMessageIndex(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeMessageIndex(bytes: Uint8Array): MessageIndex {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readMessageIndex(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type Cbor = ArrayBuffer\n\nexport function readCbor(bc: bare.ByteCursor): Cbor {\n return bare.readData(bc)\n}\n\nexport function writeCbor(bc: bare.ByteCursor, x: Cbor): void {\n bare.writeData(bc, x)\n}\n\nexport type Subscription = {\n readonly eventName: string,\n}\n\nexport function readSubscription(bc: bare.ByteCursor): Subscription {\n return {\n eventName: bare.readString(bc),\n }\n}\n\nexport function writeSubscription(bc: bare.ByteCursor, x: Subscription): void {\n bare.writeString(bc, x.eventName)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly Subscription[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readSubscription(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readSubscription(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly Subscription[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeSubscription(bc, x[i])\n }\n}\n\nfunction read1(bc: bare.ByteCursor): ReadonlyMap<string, string> {\n const len = bare.readUintSafe(bc)\n const result = new Map<string, string>()\n for (let i = 0; i < len; i++) {\n const offset = bc.offset\n const key = bare.readString(bc)\n if (result.has(key)) {\n bc.offset = offset\n throw new bare.BareError(offset, \"duplicated key\")\n }\n result.set(key, bare.readString(bc))\n }\n return result\n}\n\nfunction write1(bc: bare.ByteCursor, x: ReadonlyMap<string, string>): void {\n bare.writeUintSafe(bc, x.size)\n for(const kv of x) {\n bare.writeString(bc, kv[0])\n bare.writeString(bc, kv[1])\n }\n}\n\nexport type Conn = {\n readonly id: string,\n readonly parameters: Cbor,\n readonly state: Cbor,\n readonly subscriptions: readonly Subscription[],\n readonly gatewayId: GatewayId,\n readonly requestId: RequestId,\n readonly serverMessageIndex: u16,\n readonly clientMessageIndex: u16,\n readonly requestPath: string,\n readonly requestHeaders: ReadonlyMap<string, string>,\n}\n\nexport function readConn(bc: bare.ByteCursor): Conn {\n return {\n id: bare.readString(bc),\n parameters: readCbor(bc),\n state: readCbor(bc),\n subscriptions: read0(bc),\n gatewayId: readGatewayId(bc),\n requestId: readRequestId(bc),\n serverMessageIndex: bare.readU16(bc),\n clientMessageIndex: bare.readU16(bc),\n requestPath: bare.readString(bc),\n requestHeaders: read1(bc),\n }\n}\n\nexport function writeConn(bc: bare.ByteCursor, x: Conn): void {\n bare.writeString(bc, x.id)\n writeCbor(bc, x.parameters)\n writeCbor(bc, x.state)\n write0(bc, x.subscriptions)\n writeGatewayId(bc, x.gatewayId)\n writeRequestId(bc, x.requestId)\n bare.writeU16(bc, x.serverMessageIndex)\n bare.writeU16(bc, x.clientMessageIndex)\n bare.writeString(bc, x.requestPath)\n write1(bc, x.requestHeaders)\n}\n\nexport function encodeConn(x: Conn): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeConn(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeConn(bytes: Uint8Array): Conn {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readConn(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nfunction read2(bc: bare.ByteCursor): Cbor | null {\n return bare.readBool(bc)\n ? readCbor(bc)\n : null\n}\n\nfunction write2(bc: bare.ByteCursor, x: Cbor | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n writeCbor(bc, x)\n }\n}\n\nexport type ScheduleEvent = {\n readonly eventId: string,\n readonly timestamp: i64,\n readonly action: string,\n readonly args: Cbor | null,\n}\n\nexport function readScheduleEvent(bc: bare.ByteCursor): ScheduleEvent {\n return {\n eventId: bare.readString(bc),\n timestamp: bare.readI64(bc),\n action: bare.readString(bc),\n args: read2(bc),\n }\n}\n\nexport function writeScheduleEvent(bc: bare.ByteCursor, x: ScheduleEvent): void {\n bare.writeString(bc, x.eventId)\n bare.writeI64(bc, x.timestamp)\n bare.writeString(bc, x.action)\n write2(bc, x.args)\n}\n\nfunction read3(bc: bare.ByteCursor): readonly ScheduleEvent[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readScheduleEvent(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readScheduleEvent(bc)\n }\n return result\n}\n\nfunction write3(bc: bare.ByteCursor, x: readonly ScheduleEvent[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeScheduleEvent(bc, x[i])\n }\n}\n\nexport type Actor = {\n readonly input: Cbor | null,\n readonly hasInitialized: boolean,\n readonly state: Cbor,\n readonly scheduledEvents: readonly ScheduleEvent[],\n}\n\nexport function readActor(bc: bare.ByteCursor): Actor {\n return {\n input: read2(bc),\n hasInitialized: bare.readBool(bc),\n state: readCbor(bc),\n scheduledEvents: read3(bc),\n }\n}\n\nexport function writeActor(bc: bare.ByteCursor, x: Actor): void {\n write2(bc, x.input)\n bare.writeBool(bc, x.hasInitialized)\n writeCbor(bc, x.state)\n write3(bc, x.scheduledEvents)\n}\n\nexport function encodeActor(x: Actor): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActor(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActor(bytes: Uint8Array): Actor {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActor(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type QueueMetadata = {\n readonly nextId: u64,\n readonly size: u32,\n}\n\nexport function readQueueMetadata(bc: bare.ByteCursor): QueueMetadata {\n return {\n nextId: bare.readU64(bc),\n size: bare.readU32(bc),\n }\n}\n\nexport function writeQueueMetadata(bc: bare.ByteCursor, x: QueueMetadata): void {\n bare.writeU64(bc, x.nextId)\n bare.writeU32(bc, x.size)\n}\n\nexport function encodeQueueMetadata(x: QueueMetadata): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeQueueMetadata(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeQueueMetadata(bytes: Uint8Array): QueueMetadata {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readQueueMetadata(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nfunction read4(bc: bare.ByteCursor): u32 | null {\n return bare.readBool(bc)\n ? bare.readU32(bc)\n : null\n}\n\nfunction write4(bc: bare.ByteCursor, x: u32 | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeU32(bc, x)\n }\n}\n\nfunction read5(bc: bare.ByteCursor): i64 | null {\n return bare.readBool(bc)\n ? bare.readI64(bc)\n : null\n}\n\nfunction write5(bc: bare.ByteCursor, x: i64 | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeI64(bc, x)\n }\n}\n\nfunction read6(bc: bare.ByteCursor): boolean | null {\n return bare.readBool(bc)\n ? bare.readBool(bc)\n : null\n}\n\nfunction write6(bc: bare.ByteCursor, x: boolean | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeBool(bc, x)\n }\n}\n\nexport type QueueMessage = {\n readonly name: string,\n readonly body: Cbor,\n readonly createdAt: i64,\n readonly failureCount: u32 | null,\n readonly availableAt: i64 | null,\n readonly inFlight: boolean | null,\n readonly inFlightAt: i64 | null,\n}\n\nexport function readQueueMessage(bc: bare.ByteCursor): QueueMessage {\n return {\n name: bare.readString(bc),\n body: readCbor(bc),\n createdAt: bare.readI64(bc),\n failureCount: read4(bc),\n availableAt: read5(bc),\n inFlight: read6(bc),\n inFlightAt: read5(bc),\n }\n}\n\nexport function writeQueueMessage(bc: bare.ByteCursor, x: QueueMessage): void {\n bare.writeString(bc, x.name)\n writeCbor(bc, x.body)\n bare.writeI64(bc, x.createdAt)\n write4(bc, x.failureCount)\n write5(bc, x.availableAt)\n write6(bc, x.inFlight)\n write5(bc, x.inFlightAt)\n}\n\nexport function encodeQueueMessage(x: QueueMessage): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeQueueMessage(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeQueueMessage(bytes: Uint8Array): QueueMessage {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readQueueMessage(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n"]}