rivetkit 2.1.1 → 2.1.2

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 (108) hide show
  1. package/dist/browser/client.d.ts +22 -2
  2. package/dist/browser/client.js +1 -1
  3. package/dist/browser/client.js.map +1 -1
  4. package/dist/browser/inspector/client.js +1 -1
  5. package/dist/browser/inspector/client.js.map +1 -1
  6. package/dist/inspector.tar.gz +0 -0
  7. package/dist/tsup/{chunk-65RINRXE.cjs → chunk-772NPMTY.cjs} +98 -98
  8. package/dist/tsup/{chunk-65RINRXE.cjs.map → chunk-772NPMTY.cjs.map} +1 -1
  9. package/dist/tsup/{chunk-NAM3D5W5.js → chunk-BFI4LYS2.js} +5 -6
  10. package/dist/tsup/chunk-BFI4LYS2.js.map +1 -0
  11. package/dist/tsup/{chunk-OONQLPOH.js → chunk-BSIJG3LG.js} +7 -7
  12. package/dist/tsup/chunk-BSIJG3LG.js.map +1 -0
  13. package/dist/tsup/{chunk-WPDQXB7R.cjs → chunk-GVQAVU7R.cjs} +4 -4
  14. package/dist/tsup/{chunk-WPDQXB7R.cjs.map → chunk-GVQAVU7R.cjs.map} +1 -1
  15. package/dist/tsup/{chunk-AWJU3AZB.js → chunk-HB4RGGMC.js} +5 -5
  16. package/dist/tsup/{chunk-LNDVGTPQ.cjs → chunk-HFWRHT5T.cjs} +24 -10
  17. package/dist/tsup/chunk-HFWRHT5T.cjs.map +1 -0
  18. package/dist/tsup/{chunk-Q5CW77IT.cjs → chunk-MNS5LY6M.cjs} +81 -75
  19. package/dist/tsup/chunk-MNS5LY6M.cjs.map +1 -0
  20. package/dist/tsup/{chunk-ZR76ZGYS.cjs → chunk-NXEHFUDB.cjs} +20 -20
  21. package/dist/tsup/chunk-NXEHFUDB.cjs.map +1 -0
  22. package/dist/tsup/{chunk-XQWBEBLD.js → chunk-PSUVV4HM.js} +23 -9
  23. package/dist/tsup/{chunk-XQWBEBLD.js.map → chunk-PSUVV4HM.js.map} +1 -1
  24. package/dist/tsup/{chunk-VBU4P2IX.js → chunk-PW3YONDJ.js} +2 -2
  25. package/dist/tsup/{chunk-AGERRJ32.cjs → chunk-PZAV6PP2.cjs} +152 -152
  26. package/dist/tsup/{chunk-AGERRJ32.cjs.map → chunk-PZAV6PP2.cjs.map} +1 -1
  27. package/dist/tsup/{chunk-LPXB254R.cjs → chunk-QABDKI3W.cjs} +236 -237
  28. package/dist/tsup/chunk-QABDKI3W.cjs.map +1 -0
  29. package/dist/tsup/{chunk-T4PQK4WA.js → chunk-RHUII57M.js} +7 -8
  30. package/dist/tsup/chunk-RHUII57M.js.map +1 -0
  31. package/dist/tsup/{chunk-MMUXNMJF.cjs → chunk-RMJJE43B.cjs} +2 -2
  32. package/dist/tsup/{chunk-MMUXNMJF.cjs.map → chunk-RMJJE43B.cjs.map} +1 -1
  33. package/dist/tsup/{chunk-WTRB56DR.js → chunk-TDFDR7AO.js} +2 -2
  34. package/dist/tsup/{chunk-F5B36GL7.cjs → chunk-UZV7NXC6.cjs} +31 -32
  35. package/dist/tsup/chunk-UZV7NXC6.cjs.map +1 -0
  36. package/dist/tsup/{chunk-MICYEINX.js → chunk-VMX4I4MP.js} +10 -4
  37. package/dist/tsup/{chunk-MICYEINX.js.map → chunk-VMX4I4MP.js.map} +1 -1
  38. package/dist/tsup/{chunk-IZ4M5TJU.js → chunk-WUXR722E.js} +2 -2
  39. package/dist/tsup/{chunk-IZ4M5TJU.js.map → chunk-WUXR722E.js.map} +1 -1
  40. package/dist/tsup/{chunk-74ER4FEE.js → chunk-YQ5P6KMN.js} +4 -4
  41. package/dist/tsup/chunk-YQ5P6KMN.js.map +1 -0
  42. package/dist/tsup/{chunk-FUBHHHK5.cjs → chunk-ZHQDRRMY.cjs} +3 -3
  43. package/dist/tsup/{chunk-FUBHHHK5.cjs.map → chunk-ZHQDRRMY.cjs.map} +1 -1
  44. package/dist/tsup/client/mod.cjs +6 -6
  45. package/dist/tsup/client/mod.d.cts +2 -2
  46. package/dist/tsup/client/mod.d.ts +2 -2
  47. package/dist/tsup/client/mod.js +5 -5
  48. package/dist/tsup/common/log.cjs +2 -2
  49. package/dist/tsup/common/log.js +1 -1
  50. package/dist/tsup/common/websocket.cjs +3 -3
  51. package/dist/tsup/common/websocket.js +2 -2
  52. package/dist/tsup/{config-BFqid9Gr.d.ts → config-P3XujgRr.d.ts} +23 -3
  53. package/dist/tsup/{config-CAZphOS1.d.cts → config-_gfywqqI.d.cts} +23 -3
  54. package/dist/tsup/{context-7X-Dm6_f.d.cts → context-Bxd8Cx4H.d.cts} +5 -5
  55. package/dist/tsup/{context-x9zKhx5T.d.ts → context-uNA4TRn3.d.ts} +5 -5
  56. package/dist/tsup/{driver-DYXwJR5D.d.cts → driver-BcLvZcKl.d.cts} +1 -1
  57. package/dist/tsup/{driver-Bxv62E2p.d.ts → driver-CPGHKXyh.d.ts} +1 -1
  58. package/dist/tsup/driver-helpers/mod.cjs +6 -4
  59. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  60. package/dist/tsup/driver-helpers/mod.d.cts +16 -4
  61. package/dist/tsup/driver-helpers/mod.d.ts +16 -4
  62. package/dist/tsup/driver-helpers/mod.js +6 -4
  63. package/dist/tsup/driver-test-suite/mod.cjs +64 -64
  64. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  65. package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
  66. package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
  67. package/dist/tsup/driver-test-suite/mod.js +14 -14
  68. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  69. package/dist/tsup/inspector/mod.cjs +3 -3
  70. package/dist/tsup/inspector/mod.js +2 -2
  71. package/dist/tsup/mod.cjs +8 -8
  72. package/dist/tsup/mod.d.cts +5 -5
  73. package/dist/tsup/mod.d.ts +5 -5
  74. package/dist/tsup/mod.js +7 -7
  75. package/dist/tsup/serve-test-suite/mod.cjs +126 -118
  76. package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
  77. package/dist/tsup/serve-test-suite/mod.js +37 -29
  78. package/dist/tsup/serve-test-suite/mod.js.map +1 -1
  79. package/dist/tsup/test/mod.cjs +10 -10
  80. package/dist/tsup/test/mod.d.cts +1 -1
  81. package/dist/tsup/test/mod.d.ts +1 -1
  82. package/dist/tsup/test/mod.js +6 -6
  83. package/dist/tsup/utils.cjs +2 -2
  84. package/dist/tsup/utils.js +1 -1
  85. package/dist/tsup/workflow/mod.cjs +5 -5
  86. package/dist/tsup/workflow/mod.d.cts +3 -3
  87. package/dist/tsup/workflow/mod.d.ts +3 -3
  88. package/dist/tsup/workflow/mod.js +4 -4
  89. package/package.json +5 -5
  90. package/src/actor/instance/queue.ts +67 -9
  91. package/src/driver-helpers/mod.ts +1 -1
  92. package/src/driver-helpers/utils.ts +18 -0
  93. package/src/driver-test-suite/tests/actor-queue.ts +4 -4
  94. package/src/drivers/file-system/actor.ts +6 -16
  95. package/src/engine-process/mod.ts +1 -1
  96. package/src/workflow/context.ts +5 -4
  97. package/dist/tsup/chunk-74ER4FEE.js.map +0 -1
  98. package/dist/tsup/chunk-F5B36GL7.cjs.map +0 -1
  99. package/dist/tsup/chunk-LNDVGTPQ.cjs.map +0 -1
  100. package/dist/tsup/chunk-LPXB254R.cjs.map +0 -1
  101. package/dist/tsup/chunk-NAM3D5W5.js.map +0 -1
  102. package/dist/tsup/chunk-OONQLPOH.js.map +0 -1
  103. package/dist/tsup/chunk-Q5CW77IT.cjs.map +0 -1
  104. package/dist/tsup/chunk-T4PQK4WA.js.map +0 -1
  105. package/dist/tsup/chunk-ZR76ZGYS.cjs.map +0 -1
  106. /package/dist/tsup/{chunk-AWJU3AZB.js.map → chunk-HB4RGGMC.js.map} +0 -0
  107. /package/dist/tsup/{chunk-VBU4P2IX.js.map → chunk-PW3YONDJ.js.map} +0 -0
  108. /package/dist/tsup/{chunk-WTRB56DR.js.map → chunk-TDFDR7AO.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/actor/errors.ts","../../src/utils/env-vars.ts","../../src/common/utils.ts","../../package.json","../../src/common/log.ts","../../src/common/log-levels.ts","../../src/common/logfmt.ts","../../src/utils.ts","../../src/devtools-loader/log.ts","../../src/devtools-loader/index.ts","../../src/remote-manager-driver/mod.ts","../../src/actor/keys.ts","../../src/serde.ts","../../src/actor/protocol/serde.ts","../../src/actor/log.ts","../../src/actor/utils.ts","../../src/common/actor-router-consts.ts","../../src/client/log.ts","../../src/common/websocket.ts","../../src/remote-manager-driver/api-utils.ts","../../src/client/utils.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/client/errors.ts","../../src/remote-manager-driver/log.ts","../../src/remote-manager-driver/actor-websocket-client.ts","../../src/remote-manager-driver/actor-http-client.ts","../../src/remote-manager-driver/api-endpoints.ts","../../src/remote-manager-driver/metadata.ts","../../src/remote-manager-driver/ws-proxy.ts","../../src/client/actor-conn.ts","../../src/actor/protocol/old.ts","../../src/actor/instance/keys.ts","../../src/client/actor-query.ts","../../src/client/queue.ts","../../src/utils/endpoint-parser.ts","../../src/client/actor-handle.ts","../../src/client/raw-utils.ts","../../src/client/client.ts","../../src/client/config.ts","../../src/client/mod.ts"],"sourcesContent":["import type { DeconstructedError } from \"@/common/utils\";\n\nexport const INTERNAL_ERROR_CODE = \"internal_error\";\nexport const INTERNAL_ERROR_DESCRIPTION =\n\t\"Internal error. Read the server logs for more details.\";\nexport type InternalErrorMetadata = {};\n\nexport const USER_ERROR_CODE = \"user_error\";\n\ninterface ActorErrorOptions extends ErrorOptions {\n\t/** Error data can safely be serialized in a response to the client. */\n\tpublic?: boolean;\n\t/** Metadata associated with this error. This will be sent to clients. */\n\tmetadata?: unknown;\n}\n\nexport class ActorError extends Error {\n\t__type = \"ActorError\";\n\n\tpublic public: boolean;\n\tpublic metadata?: unknown;\n\tpublic statusCode = 500;\n\tpublic readonly group: string;\n\tpublic readonly code: string;\n\n\tpublic static isActorError(\n\t\terror: unknown,\n\t): error is ActorError | DeconstructedError {\n\t\treturn (\n\t\t\ttypeof error === \"object\" &&\n\t\t\t(error as ActorError | DeconstructedError).__type === \"ActorError\"\n\t\t);\n\t}\n\n\tconstructor(\n\t\tgroup: string,\n\t\tcode: string,\n\t\tmessage: string,\n\t\topts?: ActorErrorOptions,\n\t) {\n\t\tsuper(message, { cause: opts?.cause });\n\t\tthis.group = group;\n\t\tthis.code = code;\n\t\tthis.public = opts?.public ?? false;\n\t\tthis.metadata = opts?.metadata;\n\n\t\t// Set status code based on error type\n\t\tif (opts?.public) {\n\t\t\tthis.statusCode = 400; // Bad request for public errors\n\t\t}\n\t}\n\n\ttoString() {\n\t\t// Force stringify to return the message\n\t\treturn this.message;\n\t}\n}\n\nexport class InternalError extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"actor\", INTERNAL_ERROR_CODE, message);\n\t}\n}\n\nexport class Unreachable extends InternalError {\n\tconstructor(x: never) {\n\t\tsuper(`Unreachable case: ${x}`);\n\t}\n}\n\nexport class StateNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"state_not_enabled\",\n\t\t\t\"State not enabled. Must implement `createState` or `state` to use state. (https://www.rivet.dev/docs/actors/state/#initializing-state)\",\n\t\t);\n\t}\n}\n\nexport class ConnStateNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"conn_state_not_enabled\",\n\t\t\t\"Connection state not enabled. Must implement `createConnectionState` or `connectionState` to use connection state. (https://www.rivet.dev/docs/actors/connections/#connection-state)\",\n\t\t);\n\t}\n}\n\nexport class VarsNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"vars_not_enabled\",\n\t\t\t\"Variables not enabled. Must implement `createVars` or `vars` to use state. (https://www.rivet.dev/docs/actors/ephemeral-variables/#initializing-variables)\",\n\t\t);\n\t}\n}\n\nexport class ActionTimedOut extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"action\",\n\t\t\t\"timed_out\",\n\t\t\t\"Action timed out. This can be increased with: `actor({ options: { action: { timeout: ... } } })`\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ActionNotFound extends ActorError {\n\tconstructor(name: string) {\n\t\tsuper(\n\t\t\t\"action\",\n\t\t\t\"not_found\",\n\t\t\t`Action '${name}' not found. Validate the action exists on your actor.`,\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class InvalidEncoding extends ActorError {\n\tconstructor(format?: string) {\n\t\tsuper(\n\t\t\t\"encoding\",\n\t\t\t\"invalid\",\n\t\t\t`Invalid encoding \\`${format}\\`. (https://www.rivet.dev/docs/clients/javascript)`,\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class IncomingMessageTooLong extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"message\",\n\t\t\t\"incoming_too_long\",\n\t\t\t\"Incoming message too long. This can be configured with: `registry.start({ maxIncomingMessageSize: ... })`\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class OutgoingMessageTooLong extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"message\",\n\t\t\t\"outgoing_too_long\",\n\t\t\t\"Outgoing message too long. This can be configured with: `registry.start({ maxOutgoingMessageSize: ... })`\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class MalformedMessage extends ActorError {\n\tconstructor(cause?: unknown) {\n\t\tsuper(\"message\", \"malformed\", `Malformed message: ${cause}`, {\n\t\t\tpublic: true,\n\t\t\tcause,\n\t\t});\n\t}\n}\n\nexport interface InvalidStateTypeOptions {\n\tpath?: unknown;\n}\n\nexport class InvalidStateType extends ActorError {\n\tconstructor(opts?: InvalidStateTypeOptions) {\n\t\tlet msg = \"\";\n\t\tif (opts?.path) {\n\t\t\tmsg += `Attempted to set invalid state at path \\`${opts.path}\\`.`;\n\t\t} else {\n\t\t\tmsg += \"Attempted to set invalid state.\";\n\t\t}\n\t\tmsg +=\n\t\t\t\" Valid types include: null, undefined, boolean, string, number, BigInt, Date, RegExp, Error, typed arrays (Uint8Array, Int8Array, Float32Array, etc.), Map, Set, Array, and plain objects. (https://www.rivet.dev/docs/actors/state/#limitations)\";\n\t\tsuper(\"state\", \"invalid_type\", msg);\n\t}\n}\n\nexport class Unsupported extends ActorError {\n\tconstructor(feature: string) {\n\t\tsuper(\"feature\", \"unsupported\", `Unsupported feature: ${feature}`);\n\t}\n}\n\nexport class QueueFull extends ActorError {\n\tconstructor(limit: number) {\n\t\tsuper(\"queue\", \"full\", `Queue is full. Limit is ${limit} messages.`, {\n\t\t\tpublic: true,\n\t\t\tmetadata: { limit },\n\t\t});\n\t}\n}\n\nexport class QueueMessageTooLarge extends ActorError {\n\tconstructor(size: number, limit: number) {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"message_too_large\",\n\t\t\t`Queue message too large (${size} bytes). Limit is ${limit} bytes.`,\n\t\t\t{ public: true, metadata: { size, limit } },\n\t\t);\n\t}\n}\n\nexport class QueueMessageInvalid extends ActorError {\n\tconstructor(path?: string) {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"message_invalid\",\n\t\t\tpath\n\t\t\t\t? `Queue message body contains unsupported type at ${path}.`\n\t\t\t\t: \"Queue message body contains unsupported type.\",\n\t\t\t{ public: true, metadata: path ? { path } : undefined },\n\t\t);\n\t}\n}\n\nexport class EventPayloadInvalid extends ActorError {\n\tconstructor(name: string, issues?: unknown[]) {\n\t\tsuper(\n\t\t\t\"event\",\n\t\t\t\"invalid_payload\",\n\t\t\t`Event payload failed validation for '${name}'.`,\n\t\t\t{ public: true, metadata: { name, issues } },\n\t\t);\n\t}\n}\n\nexport class QueuePayloadInvalid extends ActorError {\n\tconstructor(name: string, issues?: unknown[]) {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"invalid_payload\",\n\t\t\t`Queue payload failed validation for '${name}'.`,\n\t\t\t{ public: true, metadata: { name, issues } },\n\t\t);\n\t}\n}\n\nexport class QueueCompletionPayloadInvalid extends ActorError {\n\tconstructor(name: string, issues?: unknown[]) {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"invalid_completion_payload\",\n\t\t\t`Queue completion payload failed validation for '${name}'.`,\n\t\t\t{ public: true, metadata: { name, issues } },\n\t\t);\n\t}\n}\n\nexport class QueueAlreadyCompleted extends ActorError {\n\tconstructor() {\n\t\tsuper(\"queue\", \"already_completed\", \"Queue message was already completed.\", {\n\t\t\tpublic: true,\n\t\t});\n\t}\n}\n\nexport class QueuePreviousMessageNotCompleted extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"previous_message_not_completed\",\n\t\t\t\"Previous completable queue message is not completed. Call `message.complete(...)` before receiving the next message.\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class QueueCompleteNotConfigured extends ActorError {\n\tconstructor(name: string) {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"complete_not_configured\",\n\t\t\t`Queue '${name}' does not support completion responses.`,\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t\tmetadata: { name },\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class ActorAborted extends ActorError {\n\tconstructor() {\n\t\tsuper(\"actor\", \"aborted\", \"Actor aborted.\", { public: true });\n\t}\n}\n\n/**\n * Options for the UserError class.\n */\nexport interface UserErrorOptions extends ErrorOptions {\n\t/**\n\t * Machine readable code for this error. Useful for catching different types of errors in try-catch.\n\t */\n\tcode?: string;\n\n\t/**\n\t * Additional metadata related to the error. Useful for understanding context about the error.\n\t */\n\tmetadata?: unknown;\n}\n\n/** Error that can be safely returned to the user. */\nexport class UserError extends ActorError {\n\t/**\n\t * Constructs a new UserError instance.\n\t *\n\t * @param message - The error message to be displayed.\n\t * @param opts - Optional parameters for the error, including a machine-readable code and additional metadata.\n\t */\n\tconstructor(message: string, opts?: UserErrorOptions) {\n\t\tsuper(\"user\", opts?.code ?? USER_ERROR_CODE, message, {\n\t\t\tpublic: true,\n\t\t\tmetadata: opts?.metadata,\n\t\t});\n\t}\n}\n\nexport class InvalidQueryJSON extends ActorError {\n\tconstructor(error?: unknown) {\n\t\tsuper(\"request\", \"invalid_query_json\", `Invalid query JSON: ${error}`, {\n\t\t\tpublic: true,\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\nexport class InvalidRequest extends ActorError {\n\tconstructor(error?: unknown) {\n\t\tsuper(\"request\", \"invalid\", `Invalid request: ${error}`, {\n\t\t\tpublic: true,\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\nexport class ActorNotFound extends ActorError {\n\tconstructor(identifier?: string) {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"not_found\",\n\t\t\tidentifier\n\t\t\t\t? `Actor not found: ${identifier} (https://www.rivet.dev/docs/clients/javascript)`\n\t\t\t\t: \"Actor not found (https://www.rivet.dev/docs/clients/javascript)\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ActorDuplicateKey extends ActorError {\n\tconstructor(name: string, key: string[]) {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"duplicate_key\",\n\t\t\t`Actor already exists with name '${name}' and key '${JSON.stringify(key)}' (https://www.rivet.dev/docs/clients/javascript)`,\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ActorStopping extends ActorError {\n\tconstructor(identifier?: string) {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"stopping\",\n\t\t\tidentifier ? `Actor stopping: ${identifier}` : \"Actor stopping\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ProxyError extends ActorError {\n\tconstructor(operation: string, error?: unknown) {\n\t\tsuper(\n\t\t\t\"proxy\",\n\t\t\t\"error\",\n\t\t\t`Error proxying ${operation}, this is likely an internal error: ${error}`,\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t\tcause: error,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class InvalidActionRequest extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"action\", \"invalid_request\", message, { public: true });\n\t}\n}\n\nexport class InvalidParams extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"params\", \"invalid\", message, { public: true });\n\t}\n}\n\nexport class DatabaseNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"database\",\n\t\t\t\"not_enabled\",\n\t\t\t\"Database not enabled. Must implement `database` to use database.\",\n\t\t);\n\t}\n}\n\nexport class RequestHandlerNotDefined extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"request_not_defined\",\n\t\t\t\"Raw request handler not defined. Actor must implement `onRequest` to handle raw HTTP requests. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 404;\n\t}\n}\n\nexport class WebSocketHandlerNotDefined extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"websocket_not_defined\",\n\t\t\t\"Raw WebSocket handler not defined. Actor must implement `onWebSocket` to handle raw WebSocket connections. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 404;\n\t}\n}\n\nexport class InvalidRequestHandlerResponse extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"invalid_request_handler_response\",\n\t\t\t\"Actor's onRequest handler must return a Response object. Returning void/undefined is not allowed. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 500;\n\t}\n}\n\nexport class InvalidCanSubscribeResponse extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"invalid_can_subscribe_response\",\n\t\t\t\"Event canSubscribe hook must return a boolean value.\",\n\t\t);\n\t\tthis.statusCode = 500;\n\t}\n}\n\nexport class InvalidCanPublishResponse extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"invalid_can_publish_response\",\n\t\t\t\"Queue canPublish hook must return a boolean value.\",\n\t\t);\n\t\tthis.statusCode = 500;\n\t}\n}\n\n// Manager-specific errors\nexport class MissingActorHeader extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"request\",\n\t\t\t\"missing_actor_header\",\n\t\t\t\"Missing x-rivet-actor header when x-rivet-target=actor\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n\nexport class WebSocketsNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"driver\",\n\t\t\t\"websockets_not_enabled\",\n\t\t\t\"WebSockets are not enabled for this driver\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n\nexport class FeatureNotImplemented extends ActorError {\n\tconstructor(feature: string) {\n\t\tsuper(\"feature\", \"not_implemented\", `${feature} is not implemented`, {\n\t\t\tpublic: true,\n\t\t});\n\t\tthis.statusCode = 501;\n\t}\n}\n\nexport class RouteNotFound extends ActorError {\n\tconstructor() {\n\t\tsuper(\"route\", \"not_found\", \"Route not found\", { public: true });\n\t\tthis.statusCode = 404;\n\t}\n}\n\nexport class RestrictedFeature extends ActorError {\n\tconstructor(feature: string) {\n\t\tsuper(\n\t\t\t\"feature\",\n\t\t\t\"restricted\",\n\t\t\t`Run this actor locally or set the token in run config to use the ${feature}`,\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 403;\n\t}\n}\n\nexport class Forbidden extends ActorError {\n\tconstructor() {\n\t\tsuper(\"auth\", \"forbidden\", \"Forbidden\", { public: true });\n\t\tthis.statusCode = 403;\n\t}\n}\n\nexport class EndpointMismatch extends ActorError {\n\tconstructor(expected: string, received: string) {\n\t\tsuper(\n\t\t\t\"config\",\n\t\t\t\"endpoint_mismatch\",\n\t\t\t`Endpoint mismatch: expected \"${expected}\", received \"${received}\"`,\n\t\t\t{ public: true, metadata: { expected, received } },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n\nexport class NamespaceMismatch extends ActorError {\n\tconstructor(expected: string, received: string) {\n\t\tsuper(\n\t\t\t\"config\",\n\t\t\t\"namespace_mismatch\",\n\t\t\t`Namespace mismatch: expected \"${expected}\", received \"${received}\"`,\n\t\t\t{ public: true, metadata: { expected, received } },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n","// This file consolidates all environment variables that affect RivetKit's behavior.\n//\n// IMPORTANT: When adding or modifying environment variables here, also update the\n// documentation at: website/src/content/docs/general/environment-variables.mdx\n\nimport { getEnvUniversal } from \"@/utils\";\n\n// Rivet configuration\nexport const getRivetEngine = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_ENGINE\");\nexport const getRivetEndpoint = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_ENDPOINT\");\nexport const getRivetToken = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_TOKEN\");\nexport const getRivetNamespace = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_NAMESPACE\");\nexport const getRivetRunner = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_RUNNER\");\nexport const getRivetTotalSlots = (): number | undefined => {\n\tconst value = getEnvUniversal(\"RIVET_TOTAL_SLOTS\");\n\treturn value !== undefined ? parseInt(value, 10) : undefined;\n};\nexport const getRivetRunnerKey = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_RUNNER_KEY\");\nexport const getRivetRunEngine = (): boolean =>\n\tgetEnvUniversal(\"RIVET_RUN_ENGINE\") === \"1\";\nexport const getRivetRunEngineVersion = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_RUN_ENGINE_VERSION\");\nexport const getRivetRunnerKind = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_RUNNER_KIND\");\nexport const getRivetRunnerVersion = (): number | undefined => {\n\tconst value = getEnvUniversal(\"RIVET_RUNNER_VERSION\");\n\treturn value !== undefined ? parseInt(value, 10) : undefined;\n};\nexport const getRivetPublicEndpoint = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_PUBLIC_ENDPOINT\");\nexport const getRivetPublicToken = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_PUBLIC_TOKEN\");\n// There is no RIVET_PUBLIC_NAMESPACE because the frontend and backend cannot\n// use different namespaces\n\n// RivetKit configuration\nexport const getRivetkitInspectorToken = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_INSPECTOR_TOKEN\");\nexport const getRivetkitInspectorDisable = (): boolean =>\n\tgetEnvUniversal(\"RIVET_INSPECTOR_DISABLE\") === \"1\";\nexport const getRivetkitStoragePath = (): string | undefined =>\n\tgetEnvUniversal(\"RIVETKIT_STORAGE_PATH\");\n\n// Logging configuration\n// DEPRECATED: LOG_LEVEL will be removed in a future version\nexport const getLogLevel = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_LOG_LEVEL\") ?? getEnvUniversal(\"LOG_LEVEL\");\nexport const getLogTarget = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_TARGET\") === \"1\";\nexport const getLogTimestamp = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_TIMESTAMP\") === \"1\";\nexport const getLogMessage = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_MESSAGE\") === \"1\";\nexport const getLogErrorStack = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_ERROR_STACK\") === \"1\";\nexport const getLogHeaders = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_HEADERS\") === \"1\";\n\n// Environment configuration\nexport const getNodeEnv = (): string | undefined => getEnvUniversal(\"NODE_ENV\");\nexport const getNextPhase = (): string | undefined =>\n\tgetEnvUniversal(\"NEXT_PHASE\");\nexport const isDev = (): boolean => getNodeEnv() !== \"production\";\n\n// Experimental\n/**\n * Enables experimental OTel tracing for Rivet Actors.\n *\n * When disabled, actors use an in-memory no-op traces implementation.\n */\nexport const getRivetExperimentalOtel = (): boolean =>\n\tgetEnvUniversal(\"RIVET_EXPERIMENTAL_OTEL\") === \"1\";\n","import type { Next } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport * as errors from \"@/actor/errors\";\nimport { EXTRA_ERROR_LOG, VERSION } from \"@/utils\";\nimport { getLogErrorStack } from \"@/utils/env-vars\";\nimport type { Logger } from \"./log\";\n\nexport function assertUnreachable(x: never): never {\n\tthrow new Error(`Unreachable case: ${x}`);\n}\n\n/**\n * Safely stringifies an object, ensuring that the stringified object is under a certain size.\n * @param obj any object to stringify\n * @param maxSize maximum size of the stringified object in bytes\n * @returns stringified object\n */\nexport function safeStringify(obj: unknown, maxSize: number) {\n\tlet size = 0;\n\n\tfunction replacer(key: string, value: unknown) {\n\t\tif (value === null || value === undefined) return value;\n\t\tconst valueSize =\n\t\t\ttypeof value === \"string\"\n\t\t\t\t? value.length\n\t\t\t\t: JSON.stringify(value).length;\n\t\tsize += key.length + valueSize;\n\n\t\tif (size > maxSize) {\n\t\t\tthrow new Error(\n\t\t\t\t`JSON object exceeds size limit of ${maxSize} bytes.`,\n\t\t\t);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\treturn JSON.stringify(obj, replacer);\n}\n\n// TODO: Instead of doing this, use a temp var for state and attempt to write\n// it. Roll back state if fails to serialize.\n\n/**\n * Check if a value is CBOR serializable.\n * Optionally pass an onInvalid callback to receive the path to invalid values.\n *\n * For a complete list of supported CBOR tags, see:\n * https://github.com/kriszyp/cbor-x/blob/cc1cf9df8ba72288c7842af1dd374d73e34cdbc1/README.md#list-of-supported-tags-for-decoding\n */\nexport function isCborSerializable(\n\tvalue: unknown,\n\tonInvalid?: (path: string) => void,\n\tcurrentPath = \"\",\n): boolean {\n\t// Handle primitive types directly\n\tif (value === null || value === undefined) {\n\t\treturn true;\n\t}\n\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) {\n\t\t\tonInvalid?.(currentPath);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tif (typeof value === \"boolean\" || typeof value === \"string\") {\n\t\treturn true;\n\t}\n\n\t// Handle BigInt (CBOR tags 2 and 3)\n\tif (typeof value === \"bigint\") {\n\t\treturn true;\n\t}\n\n\t// Handle Date objects (CBOR tags 0 and 1)\n\tif (value instanceof Date) {\n\t\treturn true;\n\t}\n\n\t// Handle typed arrays (CBOR tags 64-82)\n\tif (\n\t\tvalue instanceof Uint8Array ||\n\t\tvalue instanceof Uint8ClampedArray ||\n\t\tvalue instanceof Uint16Array ||\n\t\tvalue instanceof Uint32Array ||\n\t\tvalue instanceof BigUint64Array ||\n\t\tvalue instanceof Int8Array ||\n\t\tvalue instanceof Int16Array ||\n\t\tvalue instanceof Int32Array ||\n\t\tvalue instanceof BigInt64Array ||\n\t\tvalue instanceof Float32Array ||\n\t\tvalue instanceof Float64Array\n\t) {\n\t\treturn true;\n\t}\n\n\t// Handle Map (CBOR tag 259)\n\tif (value instanceof Map) {\n\t\tfor (const [key, val] of value.entries()) {\n\t\t\tconst keyPath = currentPath\n\t\t\t\t? `${currentPath}.key(${String(key)})`\n\t\t\t\t: `key(${String(key)})`;\n\t\t\tconst valPath = currentPath\n\t\t\t\t? `${currentPath}.value(${String(key)})`\n\t\t\t\t: `value(${String(key)})`;\n\t\t\tif (\n\t\t\t\t!isCborSerializable(key, onInvalid, keyPath) ||\n\t\t\t\t!isCborSerializable(val, onInvalid, valPath)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Handle Set (CBOR tag 258)\n\tif (value instanceof Set) {\n\t\tlet index = 0;\n\t\tfor (const item of value.values()) {\n\t\t\tconst itemPath = currentPath\n\t\t\t\t? `${currentPath}.set[${index}]`\n\t\t\t\t: `set[${index}]`;\n\t\t\tif (!isCborSerializable(item, onInvalid, itemPath)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tindex++;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Handle RegExp (CBOR tag 27)\n\tif (value instanceof RegExp) {\n\t\treturn true;\n\t}\n\n\t// Handle Error objects (CBOR tag 27)\n\tif (value instanceof Error) {\n\t\treturn true;\n\t}\n\n\t// Handle arrays\n\tif (Array.isArray(value)) {\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\tconst itemPath = currentPath ? `${currentPath}[${i}]` : `[${i}]`;\n\t\t\tif (!isCborSerializable(value[i], onInvalid, itemPath)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Handle plain objects and records (CBOR tags 105, 51, 57344-57599)\n\tif (typeof value === \"object\") {\n\t\t// Allow plain objects and objects with prototypes (for records and named objects)\n\t\tconst proto = Object.getPrototypeOf(value);\n\t\tif (proto !== null && proto !== Object.prototype) {\n\t\t\t// Check if it's a known serializable object type\n\t\t\tconst protoConstructor = value.constructor;\n\t\t\tif (protoConstructor && typeof protoConstructor.name === \"string\") {\n\t\t\t\t// Allow objects with named constructors (records, named objects)\n\t\t\t\t// This includes user-defined classes and built-in objects\n\t\t\t\t// that CBOR can serialize with tag 27 or record tags\n\t\t\t}\n\t\t}\n\n\t\t// Check all properties recursively\n\t\tfor (const key in value) {\n\t\t\tconst propPath = currentPath ? `${currentPath}.${key}` : key;\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\tvalue[key as keyof typeof value],\n\t\t\t\t\tonInvalid,\n\t\t\t\t\tpropPath,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Not serializable\n\tonInvalid?.(currentPath);\n\treturn false;\n}\n\nexport interface DeconstructedError {\n\t__type: \"ActorError\";\n\tstatusCode: ContentfulStatusCode;\n\tpublic: boolean;\n\tgroup: string;\n\tcode: string;\n\tmessage: string;\n\tmetadata?: unknown;\n}\n\n/** Deconstructs error in to components that are used to build responses. */\nexport function deconstructError(\n\terror: unknown,\n\tlogger: Logger,\n\textraLog: Record<string, unknown>,\n\texposeInternalError = false,\n): DeconstructedError {\n\t// Build response error information. Only return errors if flagged as public in order to prevent leaking internal behavior.\n\t//\n\t// We log the error here instead of after generating the code & message because we need to log the original error, not the masked internal error.\n\tlet statusCode: ContentfulStatusCode;\n\tlet public_: boolean;\n\tlet group: string;\n\tlet code: string;\n\tlet message: string;\n\tlet metadata: unknown;\n\tif (errors.ActorError.isActorError(error) && error.public) {\n\t\t// Check if error has statusCode (could be ActorError instance or DeconstructedError)\n\t\tstatusCode = (\n\t\t\t\"statusCode\" in error && error.statusCode ? error.statusCode : 400\n\t\t) as ContentfulStatusCode;\n\t\tpublic_ = true;\n\t\tgroup = error.group;\n\t\tcode = error.code;\n\t\tmessage = getErrorMessage(error);\n\t\tmetadata = error.metadata;\n\n\t\tlogger.info({\n\t\t\tmsg: \"public error\",\n\t\t\tgroup,\n\t\t\tcode,\n\t\t\tmessage,\n\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t...extraLog,\n\t\t});\n\t} else if (exposeInternalError) {\n\t\tif (errors.ActorError.isActorError(error)) {\n\t\t\tstatusCode = 500;\n\t\t\tpublic_ = false;\n\t\t\tgroup = error.group;\n\t\t\tcode = error.code;\n\t\t\tmessage = getErrorMessage(error);\n\t\t\tmetadata = error.metadata;\n\n\t\t\tlogger.info({\n\t\t\t\tmsg: \"internal error\",\n\t\t\t\tgroup,\n\t\t\t\tcode,\n\t\t\t\tmessage,\n\t\t\t\tstack: (error as Error)?.stack,\n\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t\t...extraLog,\n\t\t\t});\n\t\t} else {\n\t\t\tstatusCode = 500;\n\t\t\tpublic_ = false;\n\t\t\tgroup = \"rivetkit\";\n\t\t\tcode = errors.INTERNAL_ERROR_CODE;\n\t\t\tmessage = getErrorMessage(error);\n\n\t\t\tlogger.info({\n\t\t\t\tmsg: \"internal error\",\n\t\t\t\tgroup,\n\t\t\t\tcode,\n\t\t\t\tmessage,\n\t\t\t\tstack: (error as Error)?.stack,\n\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t\t...extraLog,\n\t\t\t});\n\t\t}\n\t} else {\n\t\tstatusCode = 500;\n\t\tpublic_ = false;\n\t\tgroup = \"rivetkit\";\n\t\tcode = errors.INTERNAL_ERROR_CODE;\n\t\tmessage = errors.INTERNAL_ERROR_DESCRIPTION;\n\t\tmetadata = {\n\t\t\t//url: `https://hub.rivet.dev/projects/${actorMetadata.project.slug}/environments/${actorMetadata.environment.slug}/actors?actorId=${actorMetadata.actor.id}`,\n\t\t} satisfies errors.InternalErrorMetadata;\n\n\t\tlogger.warn({\n\t\t\tmsg: \"internal error\",\n\t\t\terror: getErrorMessage(error),\n\t\t\tstack: (error as Error)?.stack,\n\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t...extraLog,\n\t\t});\n\t}\n\n\treturn {\n\t\t__type: \"ActorError\",\n\t\tstatusCode,\n\t\tpublic: public_,\n\t\tgroup,\n\t\tcode,\n\t\tmessage,\n\t\tmetadata,\n\t};\n}\n\nexport function stringifyError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\tif (\n\t\t\ttypeof process !== \"undefined\" &&\n\t\t\tgetLogErrorStack()\n\t\t) {\n\t\t\treturn `${error.name}: ${error.message}${error.stack ? `\\n${error.stack}` : \"\"}`;\n\t\t} else {\n\t\t\treturn `${error.name}: ${error.message}`;\n\t\t}\n\t} else if (typeof error === \"string\") {\n\t\treturn error;\n\t} else if (typeof error === \"object\" && error !== null) {\n\t\ttry {\n\t\t\treturn `${JSON.stringify(error)}`;\n\t\t} catch {\n\t\t\treturn \"[cannot stringify error]\";\n\t\t}\n\t} else {\n\t\treturn `Unknown error: ${getErrorMessage(error)}`;\n\t}\n}\n\nfunction getErrorMessage(err: unknown): string {\n\tif (\n\t\terr &&\n\t\ttypeof err === \"object\" &&\n\t\t\"message\" in err &&\n\t\ttypeof err.message === \"string\"\n\t) {\n\t\treturn err.message;\n\t} else {\n\t\treturn String(err);\n\t}\n}\n\n/** Generates a `Next` handler to pass to middleware in order to be able to call arbitrary middleware. */\nexport function noopNext(): Next {\n\treturn async () => { };\n}\n","{\n\t\"name\": \"rivetkit\",\n\t\"version\": \"2.1.1\",\n\t\"description\": \"Lightweight libraries for building stateful actors on edge platforms\",\n\t\"license\": \"Apache-2.0\",\n\t\"keywords\": [\n\t\t\"rivetkit\",\n\t\t\"stateful\",\n\t\t\"serverless\",\n\t\t\"actors\",\n\t\t\"agents\",\n\t\t\"realtime\",\n\t\t\"websocket\",\n\t\t\"actors\",\n\t\t\"framework\"\n\t],\n\t\"files\": [\n\t\t\"dist\",\n\t\t\"src\",\n\t\t\"deno.json\",\n\t\t\"bun.json\",\n\t\t\"package.json\"\n\t],\n\t\"type\": \"module\",\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./workflow\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/workflow/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/workflow/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/workflow/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/workflow/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./client\": {\n\t\t\t\"import\": {\n\t\t\t\t\"browser\": {\n\t\t\t\t\t\"types\": \"./dist/browser/client.d.ts\",\n\t\t\t\t\t\"default\": \"./dist/browser/client.js\"\n\t\t\t\t},\n\t\t\t\t\"types\": \"./dist/tsup/client/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/client/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/client/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/client/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./log\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/common/log.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/common/log.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/common/log.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/common/log.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./errors\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/actor/errors.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/actor/errors.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/actor/errors.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/actor/errors.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./utils\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/utils.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/utils.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/utils.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/utils.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./driver-helpers\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/driver-helpers/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/driver-helpers/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/driver-helpers/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/driver-helpers/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./driver-helpers/websocket\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/common/websocket.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/common/websocket.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/common/websocket.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/common/websocket.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./driver-test-suite\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/driver-test-suite/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/driver-test-suite/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/driver-test-suite/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/driver-test-suite/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./serve-test-suite\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/serve-test-suite/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/serve-test-suite/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/serve-test-suite/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/serve-test-suite/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./topologies/coordinate\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/topologies/coordinate/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/topologies/coordinate/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/topologies/coordinate/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/topologies/coordinate/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./topologies/partition\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/topologies/partition/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/topologies/partition/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/topologies/partition/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/topologies/partition/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./test\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/test/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/test/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/test/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/test/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./inspector\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/inspector/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/inspector/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/inspector/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/inspector/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./inspector/client\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/browser/inspector/client.d.ts\",\n\t\t\t\t\"default\": \"./dist/browser/inspector/client.js\"\n\t\t\t}\n\t\t},\n\t\t\"./db\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./db/drizzle\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/drizzle/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/drizzle/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/drizzle/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/drizzle/mod.cjs\"\n\t\t\t}\n\t\t}\n\t},\n\t\"engines\": {\n\t\t\"node\": \">=22.0.0\"\n\t},\n\t\"sideEffects\": [\n\t\t\"./dist/tsup/chunk-*.js\",\n\t\t\"./dist/tsup/chunk-*.cjs\"\n\t],\n\t\"scripts\": {\n \t\t\"build\": \"tsup src/mod.ts src/client/mod.ts src/common/log.ts src/common/websocket.ts src/actor/errors.ts src/topologies/coordinate/mod.ts src/topologies/partition/mod.ts src/utils.ts src/driver-helpers/mod.ts src/driver-test-suite/mod.ts src/serve-test-suite/mod.ts src/test/mod.ts src/inspector/mod.ts src/workflow/mod.ts src/db/mod.ts src/db/drizzle/mod.ts\",\n\t\t\"build:browser\": \"tsup --config tsup.browser.config.ts\",\n\t\t\"build:schema\": \"./scripts/compile-bare.ts compile schemas/client-protocol/v1.bare -o dist/schemas/client-protocol/v1.ts && ./scripts/compile-bare.ts compile schemas/client-protocol/v2.bare -o dist/schemas/client-protocol/v2.ts && ./scripts/compile-bare.ts compile schemas/client-protocol/v3.bare -o dist/schemas/client-protocol/v3.ts && ./scripts/compile-bare.ts compile schemas/file-system-driver/v1.bare -o dist/schemas/file-system-driver/v1.ts && ./scripts/compile-bare.ts compile schemas/file-system-driver/v2.bare -o dist/schemas/file-system-driver/v2.ts && ./scripts/compile-bare.ts compile schemas/file-system-driver/v3.bare -o dist/schemas/file-system-driver/v3.ts && ./scripts/compile-bare.ts compile schemas/actor-persist/v1.bare -o dist/schemas/actor-persist/v1.ts && ./scripts/compile-bare.ts compile schemas/actor-persist/v2.bare -o dist/schemas/actor-persist/v2.ts && ./scripts/compile-bare.ts compile schemas/actor-persist/v3.bare -o dist/schemas/actor-persist/v3.ts && ./scripts/compile-bare.ts compile schemas/actor-persist/v4.bare -o dist/schemas/actor-persist/v4.ts && ./scripts/compile-bare.ts compile schemas/persist/v1.bare -o dist/schemas/persist/v1.ts && ./scripts/compile-bare.ts compile schemas/transport/v1.bare -o dist/schemas/transport/v1.ts && ./scripts/compile-bare.ts compile schemas/actor-inspector/v1.bare -o dist/schemas/actor-inspector/v1.ts && ./scripts/compile-bare.ts compile schemas/actor-inspector/v2.bare -o dist/schemas/actor-inspector/v2.ts && ./scripts/compile-bare.ts compile schemas/actor-inspector/v3.bare -o dist/schemas/actor-inspector/v3.ts\",\n\t\t\"check-types\": \"tsc --noEmit\",\n\t\t\"lint\": \"biome check .\",\n\t\t\"lint:fix\": \"biome check --write .\",\n\t\t\"format\": \"biome format .\",\n\t\t\"format:write\": \"biome format --write .\",\n\t\t\"test\": \"vitest run\",\n\t\t\"test:watch\": \"vitest\",\n\t\t\"manager-openapi-gen\": \"tsx scripts/manager-openapi-gen.ts\",\n\t\t\"dump-asyncapi\": \"tsx scripts/dump-asyncapi.ts\",\n\t\t\"registry-config-schema-gen\": \"tsx scripts/registry-config-schema-gen.ts\",\n\t\t\"actor-config-schema-gen\": \"tsx scripts/actor-config-schema-gen.ts\",\n\t\t\"build:pack-inspector\": \"tsx scripts/pack-inspector.ts\"\n\t},\n\t\"dependencies\": {\n\t\t\"@hono/standard-validator\": \"^0.1.3\",\n\t\t\"@hono/zod-openapi\": \"^1.1.5\",\n\t\t\"@rivetkit/bare-ts\": \"^0.6.2\",\n\t\t\"@rivetkit/engine-runner\": \"workspace:*\",\n\t\t\"@rivetkit/fast-json-patch\": \"^3.1.2\",\n\t\t\"@rivetkit/on-change\": \"^6.0.2-rc.1\",\n\t\t\"@rivetkit/sqlite-vfs\": \"workspace:*\",\n\t\t\"@rivetkit/traces\": \"workspace:*\",\n\t\t\"@rivetkit/virtual-websocket\": \"workspace:*\",\n\t\t\"@rivetkit/workflow-engine\": \"workspace:*\",\n\t\t\"cbor-x\": \"^1.6.0\",\n\t\t\"get-port\": \"^7.1.0\",\n\t\t\"hono\": \"^4.7.0\",\n\t\t\"invariant\": \"^2.2.4\",\n\t\t\"nanoevents\": \"^9.1.0\",\n\t\t\"p-retry\": \"^6.2.1\",\n\t\t\"pino\": \"^9.5.0\",\n\t\t\"tar\": \"^7.5.0\",\n\t\t\"uuid\": \"^12.0.0\",\n\t\t\"vbare\": \"^0.0.4\",\n\t\t\"@rivetkit/sqlite\": \"^0.1.1\",\n\t\t\"zod\": \"^4.1.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@bare-ts/tools\": \"^0.13.0\",\n\t\t\"@biomejs/biome\": \"^2.3\",\n\t\t\"@hono/node-server\": \"^1.18.2\",\n\t\t\"@hono/node-ws\": \"^1.1.1\",\n\t\t\"@standard-schema/spec\": \"^1.0.0\",\n\t\t\"@types/invariant\": \"^2\",\n\t\t\"@types/node\": \"^22.13.1\",\n\t\t\"@types/ws\": \"^8\",\n\t\t\"@vitest/ui\": \"3.1.1\",\n\t\t\"cli-table3\": \"^0.6.5\",\n\t\t\"commander\": \"^12.1.0\",\n\t\t\"eventsource\": \"^4.0.0\",\n\t\t\"local-pkg\": \"^0.5.1\",\n\t\t\"tsup\": \"^8.4.0\",\n\t\t\"tsx\": \"^4.19.4\",\n\t\t\"typescript\": \"^5.7.3\",\n\t\t\"vite-tsconfig-paths\": \"^5.1.4\",\n\t\t\"vitest\": \"^3.1.1\",\n\t\t\"ws\": \"^8.18.1\",\n\t\t\"zod-to-json-schema\": \"^3.25.0\"\n\t},\n\t\"peerDependencies\": {\n\t\t\"@hono/node-server\": \"^1.14.0\",\n\t\t\"@hono/node-ws\": \"^1.1.1\",\n\t\t\"drizzle-kit\": \"^0.31.2\",\n\t\t\"drizzle-orm\": \"^0.44.2\",\n\t\t\"eventsource\": \"^4.0.0\",\n\t\t\"ws\": \"^8.0.0\"\n\t},\n\t\"peerDependenciesMeta\": {\n\t\t\"@hono/node-server\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@hono/node-ws\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"drizzle-kit\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"drizzle-orm\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eventsource\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"ws\": {\n\t\t\t\"optional\": true\n\t\t}\n\t},\n\t\"stableVersion\": \"0.8.0\"\n}\n","import {\n\ttype LevelWithSilent,\n\ttype Logger,\n\tpino,\n\tstdTimeFunctions,\n} from \"pino\";\nimport { z } from \"zod/v4\";\nimport { getLogLevel, getLogTarget, getLogTimestamp } from \"@/utils/env-vars\";\nimport {\n\tcastToLogValue,\n\tformatTimestamp,\n\tLOGGER_CONFIG,\n\tstringify,\n} from \"./logfmt\";\n\nexport type { Logger } from \"pino\";\n\nlet baseLogger: Logger | undefined;\nlet configuredLogLevel: LogLevel | undefined;\n\n/** Cache of child loggers by logger name. */\nconst loggerCache = new Map<string, Logger>();\n\nexport const LogLevelSchema = z.enum([\n\t\"trace\",\n\t\"debug\",\n\t\"info\",\n\t\"warn\",\n\t\"error\",\n\t\"fatal\",\n\t\"silent\",\n]);\n\nexport type LogLevel = z.infer<typeof LogLevelSchema>;\n\nexport function getPinoLevel(logLevel?: LogLevel): LevelWithSilent {\n\t// Priority: provided > configured > env > default\n\tif (logLevel) {\n\t\treturn logLevel;\n\t}\n\n\tif (configuredLogLevel) {\n\t\treturn configuredLogLevel;\n\t}\n\n\tconst raw = (getLogLevel() || \"warn\").toString().toLowerCase();\n\n\tconst parsed = LogLevelSchema.safeParse(raw);\n\tif (parsed.success) {\n\t\treturn parsed.data;\n\t}\n\n\t// Default to info if invalid\n\treturn \"info\";\n}\n\nexport function getIncludeTarget(): boolean {\n\treturn getLogTarget();\n}\n\n/**\n * Configure a custom base logger.\n */\nexport function configureBaseLogger(logger: Logger): void {\n\tbaseLogger = logger;\n\tloggerCache.clear();\n}\n\n// TODO: This can be simplified in logfmt.ts\nfunction customWrite(level: string, o: any) {\n\tconst entries: any = {};\n\n\t// Add timestamp if enabled\n\tif (getLogTimestamp() && o.time) {\n\t\tconst date = typeof o.time === \"number\" ? new Date(o.time) : new Date();\n\t\tentries.ts = formatTimestamp(date);\n\t}\n\n\t// Add level\n\tentries.level = level.toUpperCase();\n\n\t// Add target if present\n\tif (o.target) {\n\t\tentries.target = o.target;\n\t}\n\n\t// Add message\n\tif (o.msg) {\n\t\tentries.msg = o.msg;\n\t}\n\n\t// Add other properties\n\tfor (const [key, value] of Object.entries(o)) {\n\t\tif (\n\t\t\tkey !== \"time\" &&\n\t\t\tkey !== \"level\" &&\n\t\t\tkey !== \"target\" &&\n\t\t\tkey !== \"msg\" &&\n\t\t\tkey !== \"pid\" &&\n\t\t\tkey !== \"hostname\"\n\t\t) {\n\t\t\tentries[key] = castToLogValue(value);\n\t\t}\n\t}\n\n\tconst output = stringify(entries);\n\tconsole.log(output);\n}\n\n/**\n * Configure the default logger with optional log level.\n */\nexport function configureDefaultLogger(logLevel?: LogLevel) {\n\t// Store the configured log level\n\tif (logLevel) {\n\t\tconfiguredLogLevel = logLevel;\n\t}\n\n\tbaseLogger = pino({\n\t\tlevel: getPinoLevel(logLevel),\n\t\tmessageKey: \"msg\",\n\t\t// Do not include pid/hostname in output\n\t\tbase: {},\n\t\t// Keep a string level in the output\n\t\tformatters: {\n\t\t\tlevel(_label: string, number: number) {\n\t\t\t\treturn { level: number };\n\t\t\t},\n\t\t},\n\t\ttimestamp: getLogTimestamp() ? stdTimeFunctions.epochTime : false,\n\t\tbrowser: {\n\t\t\twrite: {\n\t\t\t\tfatal: customWrite.bind(null, \"fatal\"),\n\t\t\t\terror: customWrite.bind(null, \"error\"),\n\t\t\t\twarn: customWrite.bind(null, \"warn\"),\n\t\t\t\tinfo: customWrite.bind(null, \"info\"),\n\t\t\t\tdebug: customWrite.bind(null, \"debug\"),\n\t\t\t\ttrace: customWrite.bind(null, \"trace\"),\n\t\t\t},\n\t\t},\n\t\thooks: {\n\t\t\tlogMethod(inputArgs, method, level) {\n\t\t\t\t// TODO: This is a hack to not implement our own Pino transport target. We can get better perf if we have our own transport target.\n\n\t\t\t\tconst levelMap: Record<number, string> = {\n\t\t\t\t\t10: \"trace\",\n\t\t\t\t\t20: \"debug\",\n\t\t\t\t\t30: \"info\",\n\t\t\t\t\t40: \"warn\",\n\t\t\t\t\t50: \"error\",\n\t\t\t\t\t60: \"fatal\",\n\t\t\t\t};\n\t\t\t\tconst levelName = levelMap[level] || \"info\";\n\t\t\t\tconst time = getLogTimestamp() ? Date.now() : undefined;\n\n\t\t\t\t// Get bindings from the logger instance (child logger fields)\n\t\t\t\tconst bindings = (this as any).bindings?.() || {};\n\n\t\t\t\t// TODO: This can be simplified in logfmt.ts\n\t\t\t\tif (inputArgs.length >= 2) {\n\t\t\t\t\tconst [objOrMsg, msg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, {\n\t\t\t\t\t\t\t...bindings,\n\t\t\t\t\t\t\t...objOrMsg,\n\t\t\t\t\t\t\tmsg,\n\t\t\t\t\t\t\ttime,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, {\n\t\t\t\t\t\t\t...bindings,\n\t\t\t\t\t\t\tmsg: String(objOrMsg),\n\t\t\t\t\t\t\ttime,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (inputArgs.length === 1) {\n\t\t\t\t\tconst [objOrMsg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, {\n\t\t\t\t\t\t\t...bindings,\n\t\t\t\t\t\t\t...objOrMsg,\n\t\t\t\t\t\t\ttime,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, {\n\t\t\t\t\t\t\t...bindings,\n\t\t\t\t\t\t\tmsg: String(objOrMsg),\n\t\t\t\t\t\t\ttime,\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\tloggerCache.clear();\n}\n\n/**\n * Get or initialize the base logger.\n */\nexport function getBaseLogger(): Logger {\n\tif (!baseLogger) {\n\t\tconfigureDefaultLogger();\n\t}\n\treturn baseLogger!;\n}\n\n/**\n * Returns a child logger with `target` bound for the given name.\n */\nexport function getLogger(name = \"default\"): Logger {\n\t// Check cache first\n\tconst cached = loggerCache.get(name);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\t// Create\n\tconst base = getBaseLogger();\n\n\t// Add target to log if enabled\n\tconst child = getIncludeTarget() ? base.child({ target: name }) : base;\n\n\t// Cache the logger\n\tloggerCache.set(name, child);\n\n\treturn child;\n}\n","export type LogLevel =\n\t| \"TRACE\"\n\t| \"DEBUG\"\n\t| \"INFO\"\n\t| \"WARN\"\n\t| \"ERROR\"\n\t| \"CRITICAL\";\n\nexport const LogLevels: Record<LogLevel, LevelIndex> = {\n\tTRACE: 0,\n\tDEBUG: 1,\n\tINFO: 2,\n\tWARN: 3,\n\tERROR: 4,\n\tCRITICAL: 5,\n} as const;\n\nexport const LevelNameMap: Record<number, LogLevel> = {\n\t0: \"TRACE\",\n\t1: \"DEBUG\",\n\t2: \"INFO\",\n\t3: \"WARN\",\n\t4: \"ERROR\",\n\t5: \"CRITICAL\",\n};\n\nexport type LevelIndex = number;\n","import { type LogLevel, LogLevels } from \"./log-levels\";\n\nconst LOG_LEVEL_COLORS: Record<number, string> = {\n\t[LogLevels.CRITICAL]: \"\\x1b[31m\", // Red\n\t[LogLevels.ERROR]: \"\\x1b[31m\", // Red\n\t[LogLevels.WARN]: \"\\x1b[33m\", // Yellow\n\t[LogLevels.INFO]: \"\\x1b[32m\", // Green\n\t[LogLevels.DEBUG]: \"\\x1b[36m\", // Cyan\n\t[LogLevels.TRACE]: \"\\x1b[36m\", // Cyan\n};\n\nconst RESET_COLOR = \"\\x1b[0m\";\n\n/**\n * Serializes logfmt line from an object.\n *\n * ## Styling Methodology\n *\n * The three things you need to know for every log line is the level, the\n * message, and who called it. These properties are highlighted in different colros\n * and sorted in th eorder that you usually read them.\n *\n * Once you've found a log line you care about, then you want to find the\n * property you need to see. The property names are bolded and the default color\n * while the rest of the data is dim. This lets you scan to find the property\n * name quickly then look closer to read the data associated with the\n * property.\n */\nexport function stringify(data: any) {\n\tlet line = \"\";\n\tconst entries = Object.entries(data);\n\n\tfor (let i = 0; i < entries.length; i++) {\n\t\tconst [key, valueRaw] = entries[i];\n\n\t\tlet isNull = false;\n\t\tlet valueString: string;\n\t\tif (valueRaw == null) {\n\t\t\tisNull = true;\n\t\t\tvalueString = \"\";\n\t\t} else {\n\t\t\tvalueString = valueRaw.toString();\n\t\t}\n\n\t\t// Clip value unless specifically the error message\n\t\tif (valueString.length > 512 && key !== \"msg\" && key !== \"error\")\n\t\t\tvalueString = `${valueString.slice(0, 512)}...`;\n\n\t\tconst needsQuoting =\n\t\t\tvalueString.indexOf(\" \") > -1 || valueString.indexOf(\"=\") > -1;\n\t\tconst needsEscaping =\n\t\t\tvalueString.indexOf('\"') > -1 || valueString.indexOf(\"\\\\\") > -1;\n\n\t\tvalueString = valueString.replace(/\\n/g, \"\\\\n\");\n\t\tif (needsEscaping) valueString = valueString.replace(/[\"\\\\]/g, \"\\\\$&\");\n\t\tif (needsQuoting || needsEscaping) valueString = `\"${valueString}\"`;\n\t\tif (valueString === \"\" && !isNull) valueString = '\"\"';\n\n\t\tif (LOGGER_CONFIG.enableColor) {\n\t\t\t// With color\n\n\t\t\t// Special message colors\n\t\t\tlet color = \"\\x1b[2m\";\n\t\t\tif (key === \"level\") {\n\t\t\t\tconst level = LogLevels[valueString as LogLevel];\n\t\t\t\tconst levelColor = LOG_LEVEL_COLORS[level];\n\t\t\t\tif (levelColor) {\n\t\t\t\t\tcolor = levelColor;\n\t\t\t\t}\n\t\t\t} else if (key === \"msg\") {\n\t\t\t\tcolor = \"\\x1b[32m\";\n\t\t\t} else if (key === \"trace\") {\n\t\t\t\tcolor = \"\\x1b[34m\";\n\t\t\t}\n\n\t\t\t// Format line\n\t\t\tline += `\\x1b[0m\\x1b[1m${key}\\x1b[0m\\x1b[2m=\\x1b[0m${color}${valueString}${RESET_COLOR}`;\n\t\t} else {\n\t\t\t// No color\n\t\t\tline += `${key}=${valueString}`;\n\t\t}\n\n\t\tif (i !== entries.length - 1) {\n\t\t\tline += \" \";\n\t\t}\n\t}\n\n\treturn line;\n}\n\nexport function formatTimestamp(date: Date): string {\n\tconst year = date.getUTCFullYear();\n\tconst month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n\tconst day = String(date.getUTCDate()).padStart(2, \"0\");\n\tconst hours = String(date.getUTCHours()).padStart(2, \"0\");\n\tconst minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n\tconst seconds = String(date.getUTCSeconds()).padStart(2, \"0\");\n\tconst milliseconds = String(date.getUTCMilliseconds()).padStart(3, \"0\");\n\n\treturn `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}Z`;\n}\n\nexport function castToLogValue(v: unknown): any {\n\tif (\n\t\ttypeof v === \"string\" ||\n\t\ttypeof v === \"number\" ||\n\t\ttypeof v === \"bigint\" ||\n\t\ttypeof v === \"boolean\" ||\n\t\tv === null ||\n\t\tv === undefined\n\t) {\n\t\treturn v;\n\t}\n\tif (v instanceof Error) {\n\t\t//args.push(...errorToLogEntries(k, v));\n\t\treturn String(v);\n\t}\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch {\n\t\treturn \"[cannot stringify]\";\n\t}\n}\n\n// MARK: Config\ninterface GlobalLoggerConfig {\n\tenableColor: boolean;\n\tenableSpreadObject: boolean;\n\tenableErrorStack: boolean;\n}\n\nexport const LOGGER_CONFIG: GlobalLoggerConfig = {\n\tenableColor: false,\n\tenableSpreadObject: false,\n\tenableErrorStack: false,\n};\n\n// MARK: Utils\n/**\n * Converts an object in to an easier to read KV of entries.\n */\nexport function spreadObjectToLogEntries(base: string, data: unknown): any {\n\tif (\n\t\tLOGGER_CONFIG.enableSpreadObject &&\n\t\ttypeof data === \"object\" &&\n\t\t!Array.isArray(data) &&\n\t\tdata !== null &&\n\t\tObject.keys(data).length !== 0 &&\n\t\tObject.keys(data).length < 16\n\t) {\n\t\tconst logData: any = {};\n\t\tfor (const key in data) {\n\t\t\tObject.assign(\n\t\t\t\tlogData,\n\t\t\t\tspreadObjectToLogEntries(\n\t\t\t\t\t`${base}.${key}`,\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: FIXME\n\t\t\t\t\t(data as any)[key],\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn logData;\n\t}\n\n\treturn { [base]: JSON.stringify(data) };\n}\n\nexport function errorToLogEntries(base: string, error: unknown): any {\n\tif (error instanceof Error) {\n\t\treturn {\n\t\t\t[`${base}.message`]: error.message,\n\t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n\t\t\t\t? { [`${base}.stack`]: formatStackTrace(error.stack) }\n\t\t\t\t: {}),\n\t\t\t...(error.cause\n\t\t\t\t? errorToLogEntries(`${base}.cause`, error.cause)\n\t\t\t\t: {}),\n\t\t};\n\t}\n\treturn { [base]: `${error}` };\n}\n\n// export function errorToLogEntries(base: string, error: unknown): LogEntry[] {\n// \tif (error instanceof RuntimeError) {\n// \t\treturn [\n// \t\t\t[`${base}.code`, error.code],\n// \t\t\t[`${base}.description`, error.errorConfig?.description],\n// \t\t\t[`${base}.module`, error.moduleName],\n// \t\t\t...(error.trace ? [[`${base}.trace`, stringifyTrace(error.trace)] as LogEntry] : []),\n// \t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n// \t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n// \t\t\t\t: []),\n// \t\t\t...(error.meta ? [[`${base}.meta`, JSON.stringify(error.meta)] as LogEntry] : []),\n// \t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n// \t\t];\n// \t} else if (error instanceof Error) {\n// \t\treturn [\n// \t\t\t[`${base}.name`, error.name],\n// \t\t\t[`${base}.message`, error.message],\n// \t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n// \t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n// \t\t\t\t: []),\n// \t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n// \t\t];\n// \t} else {\n// \t\treturn [\n// \t\t\t[base, `${error}`],\n// \t\t];\n// \t}\n// }\n\n/**\n * Formats a JS stack trace in to a legible one-liner.\n */\nfunction formatStackTrace(stackTrace: string): string {\n\tconst regex = /at (.+?)$/gm;\n\tconst matches = [...stackTrace.matchAll(regex)];\n\t// Reverse array since the stack goes from top level -> bottom level\n\tmatches.reverse();\n\treturn matches.map((match) => match[1].trim()).join(\" > \");\n}\n","import { stringifyError } from \"@/common/utils\";\nimport type { Context as HonoContext, Handler as HonoHandler } from \"hono\";\nimport { stringify as uuidstringify } from \"uuid\";\nimport pkgJson from \"../package.json\" with { type: \"json\" };\nimport { getLogger } from \"./common/log\";\nimport { assertUnreachable } from \"./common/utils\";\n\n/** @experimental */\nexport { stringifyError };\n\n/** @experimental */\nexport { assertUnreachable };\n\n/**\n * Joins multiple abort signals into one.\n *\n * The returned signal aborts when the first input signal aborts.\n * Uses `AbortSignal.any(...)` when available, with a runtime fallback.\n *\n * @experimental\n */\nexport function joinSignals(\n\t...signals: Array<AbortSignal | undefined | null>\n): AbortSignal {\n\tconst validSignals = signals.filter(\n\t\t(signal): signal is AbortSignal => signal != null,\n\t);\n\n\tif (validSignals.length === 0) {\n\t\treturn new AbortController().signal;\n\t}\n\n\tif (validSignals.length === 1) {\n\t\treturn validSignals[0];\n\t}\n\n\tconst signalAny = (\n\t\tAbortSignal as typeof AbortSignal & {\n\t\t\tany?: (signals: AbortSignal[]) => AbortSignal;\n\t\t}\n\t).any;\n\tif (typeof signalAny === \"function\") {\n\t\treturn signalAny(validSignals);\n\t}\n\n\tconst controller = new AbortController();\n\tconst cleanups: Array<() => void> = [];\n\n\tconst abortWithSignal = (signal: AbortSignal) => {\n\t\tif (controller.signal.aborted) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const cleanup of cleanups) {\n\t\t\tcleanup();\n\t\t}\n\n\t\tconst reason = (signal as AbortSignal & { reason?: unknown }).reason;\n\t\tcontroller.abort(reason);\n\t};\n\n\tfor (const signal of validSignals) {\n\t\tif (signal.aborted) {\n\t\t\tabortWithSignal(signal);\n\t\t\tbreak;\n\t\t}\n\n\t\tconst onAbort = () => abortWithSignal(signal);\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tcleanups.push(() => signal.removeEventListener(\"abort\", onAbort));\n\t}\n\n\treturn controller.signal;\n}\n\n/**\n * Returns a promise that resolves after the given number of milliseconds.\n *\n * @experimental\n */\nexport function sleep(ms: number): Promise<void> {\n\treturn new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Creates a fixed-rate interval tick function that can be awaited in a loop.\n *\n * @example\n * const tick = interval(100);\n * while (!c.aborted) {\n * await tick();\n * if (c.aborted) break;\n * // ... game logic\n * }\n *\n * @experimental\n */\nexport function interval(ms: number): () => Promise<void> {\n\treturn () => sleep(ms);\n}\n\nexport const VERSION = pkgJson.version;\n\nlet _userAgent: string | undefined;\n\nfunction logger() {\n\treturn getLogger(\"utils\");\n}\n\n/**\n * Builds the HTTP user agent used by this library.\n *\n * @experimental\n */\nexport function httpUserAgent(): string {\n\t// Return cached value if already initialized\n\tif (_userAgent !== undefined) {\n\t\treturn _userAgent;\n\t}\n\n\t// Library\n\tlet userAgent = `RivetKit/${VERSION}`;\n\n\t// Navigator\n\tconst navigatorObj =\n\t\ttypeof navigator !== \"undefined\" ? navigator : undefined;\n\tif (navigatorObj?.userAgent) userAgent += ` ${navigatorObj.userAgent}`;\n\n\t_userAgent = userAgent;\n\n\treturn userAgent;\n}\n\nexport type UpgradeWebSocket = (\n\tcreateEvents: (c: HonoContext) => any,\n) => HonoHandler;\n\nexport type GetUpgradeWebSocket = () => UpgradeWebSocket;\n\n/**\n * Reads an environment variable from Deno or Node runtimes.\n *\n * @experimental\n */\nexport function getEnvUniversal(key: string): string | undefined {\n\tif (typeof Deno !== \"undefined\") {\n\t\treturn Deno.env.get(key);\n\t} else if (typeof process !== \"undefined\") {\n\t\t// Do this after Deno since `process` is sometimes polyfilled\n\t\treturn process.env[key];\n\t}\n}\n\n/**\n * Traces a debug value and returns it.\n *\n * @experimental\n */\nexport function dbg<T>(x: T): T {\n\tconsole.trace(`=== DEBUG ===\\n${x}`);\n\treturn x;\n}\n\n/**\n * Converts various ArrayBuffer-like types to Uint8Array.\n * Handles ArrayBuffer, ArrayBufferView (including typed arrays), and passes through existing Uint8Array.\n *\n * @param data - The ArrayBuffer or ArrayBufferView to convert\n * @returns A Uint8Array view of the data\n *\n * @experimental\n */\nexport function toUint8Array(data: ArrayBuffer | ArrayBufferView): Uint8Array {\n\tif (data instanceof Uint8Array) {\n\t\treturn data;\n\t} else if (data instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(data);\n\t} else if (ArrayBuffer.isView(data)) {\n\t\t// Handle other ArrayBufferView types (Int8Array, Uint16Array, DataView, etc.)\n\t\treturn new Uint8Array(\n\t\t\tdata.buffer.slice(\n\t\t\t\tdata.byteOffset,\n\t\t\t\tdata.byteOffset + data.byteLength,\n\t\t\t),\n\t\t);\n\t} else {\n\t\tthrow new TypeError(\"Input must be ArrayBuffer or ArrayBufferView\");\n\t}\n}\n\n// Long timeouts\n//\n// JavaScript timers use a signed 32-bit integer for delays, so values above 2^31-1 (~24.8 days)\n// are not reliable and may fire immediately or overflow.\n//\n// https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#maximum_delay_value\nconst TIMEOUT_MAX = 2147483647; // 2^31-1\n\nexport type LongTimeoutHandle = { abort: () => void };\n\n/**\n * Polyfill for Promise.withResolvers().\n *\n * This is specifically for Cloudflare Workers. Their implementation of Promise.withResolvers does not work correctly.\n *\n * @experimental\n */\nexport function promiseWithResolvers<T>(onReject: (reason?: any) => void): {\n\tpromise: Promise<T>;\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n} {\n\tlet resolve!: (value: T | PromiseLike<T>) => void;\n\tlet reject!: (reason?: any) => void;\n\tconst promise = new Promise<T>((res, rej) => {\n\t\tresolve = res;\n\t\treject = rej;\n\t});\n\tpromise.catch(onReject);\n\treturn { promise, resolve, reject };\n}\n\n/**\n * Sets a timeout that supports delays larger than the JavaScript timer limit.\n *\n * @experimental\n */\nexport function setLongTimeout(\n\tlistener: () => void,\n\tafter: number,\n): LongTimeoutHandle {\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\n\tfunction start(remaining: number) {\n\t\tif (remaining <= TIMEOUT_MAX) {\n\t\t\ttimeout = setTimeout(listener, remaining);\n\t\t} else {\n\t\t\ttimeout = setTimeout(() => {\n\t\t\t\tstart(remaining - TIMEOUT_MAX);\n\t\t\t}, TIMEOUT_MAX);\n\t\t}\n\t}\n\n\tstart(after);\n\n\treturn {\n\t\tabort: () => {\n\t\t\tif (timeout !== undefined) clearTimeout(timeout);\n\t\t},\n\t};\n}\n\n/**\n * A tiny utility that coalesces/enqueues async operations so only the latest\n * queued task runs per cycle, while callers receive a promise that resolves\n * when the task for the cycle they joined has completed.\n */\nexport class SinglePromiseQueue {\n\t/** Next operation to execute in the queue. If attempting to enqueue another op, it will override the existing op. */\n\t#queuedOp?: () => Promise<void>;\n\n\t/** The currently running promise of #drainLoop. Do not await this, instead await `pending` to await the current cycle. */\n\trunningDrainLoop?: Promise<void>;\n\n\t/** Pending resolver fro the currently queued entry. */\n\t#pending?: ReturnType<typeof promiseWithResolvers<void>>;\n\n\t/** Queue the next operation and return a promise that resolves when it flushes. */\n\tenqueue(op: () => Promise<void>): Promise<void> {\n\t\t// Replace any previously queued operation with the latest one\n\t\tthis.#queuedOp = op;\n\n\t\t// Ensure a shared resolver exists for all callers in this cycle\n\t\tif (!this.#pending) {\n\t\t\tthis.#pending = promiseWithResolvers<void>((reason) => logger().warn({ msg: \"unhandled single promise queue rejection\", reason }));\n\t\t}\n\n\t\tconst waitForThisCycle = this.#pending.promise;\n\n\t\t// Start runner if not already running\n\t\tif (!this.runningDrainLoop) {\n\t\t\tthis.runningDrainLoop = this.#drainLoop();\n\t\t}\n\n\t\treturn waitForThisCycle;\n\t}\n\n\t/** Drain queued operations sequentially until there is nothing left. */\n\tasync #drainLoop(): Promise<void> {\n\t\ttry {\n\t\t\twhile (this.#queuedOp) {\n\t\t\t\t// Capture current cycle resolver then reset for the next cycle\n\t\t\t\tconst resolver = this.#pending;\n\t\t\t\tthis.#pending = undefined;\n\n\t\t\t\t// Capture and clear the currently queued operation\n\t\t\t\tconst op = this.#queuedOp;\n\t\t\t\tthis.#queuedOp = undefined;\n\n\t\t\t\ttry {\n\t\t\t\t\tawait op();\n\t\t\t\t\t// Notify all waiters for this cycle\n\t\t\t\t\tresolver?.resolve();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error in SinglePromiseQueue drain loop\",\n\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t\t// Reject all waiters for this cycle\n\t\t\t\t\tresolver?.reject(err);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.runningDrainLoop = undefined;\n\t\t}\n\t}\n}\n\n/**\n * Converts a Buffer or Uint8Array into an ArrayBuffer view.\n *\n * @experimental\n */\nexport function bufferToArrayBuffer(buf: Buffer | Uint8Array): ArrayBuffer {\n\treturn buf.buffer.slice(\n\t\tbuf.byteOffset,\n\t\tbuf.byteOffset + buf.byteLength,\n\t) as ArrayBuffer;\n}\n\n/**\n * Properly combines a base URL endpoint with a path, preserving any base path in the endpoint.\n *\n * @example\n * combineUrlPath(\"http://localhost:8787/rivet\", \"/actors/action\")\n * // Returns: \"http://localhost:8787/rivet/actors/action\"\n *\n * @example\n * combineUrlPath(\"http://localhost:8787/rivet\", \"/actors?type=foo\", { namespace: \"test\" })\n * // Returns: \"http://localhost:8787/rivet/actors?type=foo&namespace=test\"\n *\n * @param endpoint The base URL endpoint that may contain a path component\n * @param path The path to append to the endpoint (may include query parameters)\n * @param queryParams Optional additional query parameters to append\n * @returns The properly combined URL string\n *\n * @experimental\n */\nexport function combineUrlPath(\n\tendpoint: string,\n\tpath: string,\n\tqueryParams?: Record<string, string | undefined>,\n): string {\n\tconst baseUrl = new URL(endpoint);\n\n\t// Extract path and query from the provided path\n\tconst pathParts = path.split(\"?\");\n\tconst pathOnly = pathParts[0];\n\tconst existingQuery = pathParts[1] || \"\";\n\n\t// Remove trailing slash from base path and ensure path starts with /\n\tconst basePath = baseUrl.pathname.replace(/\\/$/, \"\");\n\tconst cleanPath = pathOnly.startsWith(\"/\") ? pathOnly : `/${pathOnly}`;\n\t// Combine paths and remove any double slashes\n\tconst fullPath = (basePath + cleanPath).replace(/\\/\\//g, \"/\");\n\n\t// Build query string\n\tconst queryParts: string[] = [];\n\tif (existingQuery) {\n\t\tqueryParts.push(existingQuery);\n\t}\n\tif (queryParams) {\n\t\tfor (const [key, value] of Object.entries(queryParams)) {\n\t\t\tif (value !== undefined) {\n\t\t\t\tqueryParts.push(\n\t\t\t\t\t`${encodeURIComponent(key)}=${encodeURIComponent(value)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst fullQuery = queryParts.length > 0 ? `?${queryParts.join(\"&\")}` : \"\";\n\treturn `${baseUrl.protocol}//${baseUrl.host}${fullPath}${fullQuery}`;\n}\n\n/**\n * Compares two ArrayBuffer values by byte content.\n *\n * @experimental\n */\nexport function arrayBuffersEqual(\n\tbuf1: ArrayBuffer,\n\tbuf2: ArrayBuffer,\n): boolean {\n\tif (buf1.byteLength !== buf2.byteLength) return false;\n\n\tconst view1 = new Uint8Array(buf1);\n\tconst view2 = new Uint8Array(buf2);\n\n\tfor (let i = 0; i < view1.length; i++) {\n\t\tif (view1[i] !== view2[i]) return false;\n\t}\n\treturn true;\n}\n\nexport const EXTRA_ERROR_LOG = {\n\tissues: \"https://github.com/rivet-dev/rivetkit/issues\",\n\tsupport: \"https://rivet.dev/discord\",\n\tversion: VERSION,\n};\n\nexport type Runtime = \"deno\" | \"bun\" | \"node\";\n\n/**\n * Detects the current JavaScript runtime from the user agent.\n *\n * @experimental\n */\nexport function detectRuntime(): Runtime {\n\tconst userAgent =\n\t\ttypeof navigator !== \"undefined\" ? navigator.userAgent : \"\";\n\tif (userAgent.includes(\"Deno\")) {\n\t\treturn \"deno\";\n\t}\n\tif (userAgent.includes(\"Bun\")) {\n\t\treturn \"bun\";\n\t}\n\treturn \"node\";\n}\n\nexport type DeepReadonly<T> = {\n\treadonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];\n};\n\nexport type DeepMutable<T> = {\n\t-readonly [K in keyof T]: T[K] extends object ? DeepMutable<T[K]> : T[K];\n};\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"devtools\");\n}\n","import type { ClientConfigInput } from \"@/client/client\";\nimport { VERSION } from \"@/utils\";\nimport { logger } from \"./log\";\n\ndeclare global {\n\t// Injected via tsup config\n\t// biome-ignore lint/style/noVar: required for global declaration\n\tvar CUSTOM_RIVETKIT_DEVTOOLS_URL: string | undefined;\n}\n\nconst DEFAULT_DEVTOOLS_URL = (version = VERSION) =>\n\t`https://releases.rivet.dev/rivet/latest/devtools/mod.js?v=${version}`;\n\nconst scriptId = \"rivetkit-devtools-script\";\n\nexport function injectDevtools(config: ClientConfigInput) {\n\tif (!window) {\n\t\tlogger().warn(\"devtools not available outside browser environment\");\n\t\treturn;\n\t}\n\n\tif (!document.getElementById(scriptId)) {\n\t\tconst script = document.createElement(\"script\");\n\t\tscript.id = scriptId;\n\t\tscript.src =\n\t\t\tglobalThis.CUSTOM_RIVETKIT_DEVTOOLS_URL || DEFAULT_DEVTOOLS_URL();\n\t\tscript.async = true;\n\t\tdocument.head.appendChild(script);\n\t}\n\n\twindow.__rivetkit = window.__rivetkit || [];\n\twindow.__rivetkit.push(config);\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext } from \"hono\";\nimport invariant from \"invariant\";\nimport { deserializeActorKey, serializeActorKey } from \"@/actor/keys\";\nimport type { ClientConfig } from \"@/client/client\";\nimport { noopNext } from \"@/common/utils\";\nimport type {\n\tActorOutput,\n\tCreateInput,\n\tGetForIdInput,\n\tGetOrCreateWithKeyInput,\n\tGetWithKeyInput,\n\tListActorsInput,\n\tManagerDisplayInformation,\n\tManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport type { Actor as ApiActor } from \"@/manager-api/actors\";\nimport type { Encoding, UniversalWebSocket } from \"@/mod\";\nimport { uint8ArrayToBase64 } from \"@/serde\";\nimport { combineUrlPath, type GetUpgradeWebSocket } from \"@/utils\";\nimport { getNextPhase } from \"@/utils/env-vars\";\nimport { sendHttpRequestToActor } from \"./actor-http-client\";\nimport {\n\tbuildActorGatewayUrl,\n\tbuildWebSocketProtocols,\n\topenWebSocketToActor,\n} from \"./actor-websocket-client\";\nimport {\n\tcreateActor,\n\tdestroyActor,\n\tgetActor,\n\tgetActorByKey,\n\tgetOrCreateActor,\n\tkvGet,\n\tlistActorsByName,\n} from \"./api-endpoints\";\nimport { EngineApiError, getEndpoint } from \"./api-utils\";\nimport { logger } from \"./log\";\nimport { lookupMetadataCached } from \"./metadata\";\nimport { createWebSocketProxy } from \"./ws-proxy\";\n\n// TODO:\n// // Lazily import the dynamic imports so we don't have to turn `createClient` in to an async fn\n// const dynamicImports = (async () => {\n// \t// Import dynamic dependencies\n// \tconst [WebSocket, EventSource] = await Promise.all([\n// \t\timportWebSocket(),\n// \t\timportEventSource(),\n// \t]);\n// \treturn {\n// \t\tWebSocket,\n// \t\tEventSource,\n// \t};\n// })();\n\nexport class RemoteManagerDriver implements ManagerDriver {\n\t#config: ClientConfig;\n\t#metadataPromise: Promise<void> | undefined;\n\n\tconstructor(runConfig: ClientConfig) {\n\t\t// Disable health check if in Next.js build phase since there is no `/metadata` endpoint\n\t\t//\n\t\t// See https://github.com/vercel/next.js/blob/5e6b008b561caf2710ab7be63320a3d549474a5b/packages/next/shared/lib/constants.ts#L19-L23\n\t\tif (getNextPhase() === \"phase-production-build\") {\n\t\t\tlogger().info(\n\t\t\t\t\"detected next.js build phase, disabling health check\",\n\t\t\t);\n\t\t\trunConfig.disableMetadataLookup = true;\n\t\t}\n\n\t\t// Clone config so we can mutate the endpoint in #metadataPromise\n\t\t// NOTE: This is a shallow clone, so mutating nested properties will not do anything\n\t\tthis.#config = { ...runConfig };\n\n\t\t// Perform metadata check if enabled\n\t\tif (!runConfig.disableMetadataLookup) {\n\t\t\t// This should never error, since it uses pRetry. If it does for\n\t\t\t// any reason, we'll surface the error anywhere #metadataPromise is\n\t\t\t// awaited.\n\t\t\tthis.#metadataPromise = lookupMetadataCached(this.#config).then(\n\t\t\t\t(metadataData) => {\n\t\t\t\t\t// Override endpoint for all future requests\n\t\t\t\t\tif (metadataData.clientEndpoint) {\n\t\t\t\t\t\tthis.#config.endpoint = metadataData.clientEndpoint;\n\t\t\t\t\t\tif (metadataData.clientNamespace) {\n\t\t\t\t\t\t\tthis.#config.namespace =\n\t\t\t\t\t\t\t\tmetadataData.clientNamespace;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (metadataData.clientToken) {\n\t\t\t\t\t\t\tthis.#config.token = metadataData.clientToken;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlogger().info({\n\t\t\t\t\t\t\tmsg: \"overriding client endpoint\",\n\t\t\t\t\t\t\tendpoint: metadataData.clientEndpoint,\n\t\t\t\t\t\t\tnamespace: metadataData.clientNamespace,\n\t\t\t\t\t\t\ttoken: metadataData.clientToken,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlogger().info({\n\t\t\t\t\t\tmsg: \"connected to rivetkit manager\",\n\t\t\t\t\t\truntime: metadataData.runtime,\n\t\t\t\t\t\tversion: metadataData.version,\n\t\t\t\t\t\trunner: metadataData.runner,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n\n\tasync getForId({\n\t\tc,\n\t\tname,\n\t\tactorId,\n\t}: GetForIdInput): Promise<ActorOutput | undefined> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\t// Fetch from API if not in cache\n\t\tconst response = await getActor(this.#config, name, actorId);\n\t\tconst actor = response.actors[0];\n\t\tif (!actor) return undefined;\n\n\t\t// Validate name matches\n\t\tif (actor.name !== name) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"actor name mismatch from api\",\n\t\t\t\tactorId,\n\t\t\t\tapiName: actor.name,\n\t\t\t\trequestedName: name,\n\t\t\t});\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn apiActorToOutput(actor);\n\t}\n\n\tasync getWithKey({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t}: GetWithKeyInput): Promise<ActorOutput | undefined> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tlogger().debug({ msg: \"getWithKey: searching for actor\", name, key });\n\n\t\t// If not in local cache, fetch by key from API\n\t\ttry {\n\t\t\tconst response = await getActorByKey(this.#config, name, key);\n\t\t\tconst actor = response.actors[0];\n\t\t\tif (!actor) return undefined;\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"getWithKey: found actor via api\",\n\t\t\t\tactorId: actor.actor_id,\n\t\t\t\tname,\n\t\t\t\tkey,\n\t\t\t});\n\n\t\t\treturn apiActorToOutput(actor);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror instanceof EngineApiError &&\n\t\t\t\t(error as EngineApiError).group === \"actor\" &&\n\t\t\t\t(error as EngineApiError).code === \"not_found\"\n\t\t\t) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getOrCreateWithKey(\n\t\tinput: GetOrCreateWithKeyInput,\n\t): Promise<ActorOutput> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tconst { c, name, key, input: actorInput, region } = input;\n\n\t\tlogger().info({\n\t\t\tmsg: \"getOrCreateWithKey: getting or creating actor via engine api\",\n\t\t\tname,\n\t\t\tkey,\n\t\t});\n\n\t\tconst { actor, created } = await getOrCreateActor(this.#config, {\n\t\t\tdatacenter: region,\n\t\t\tname,\n\t\t\tkey: serializeActorKey(key),\n\t\t\trunner_name_selector: this.#config.runnerName,\n\t\t\tinput: actorInput\n\t\t\t\t? uint8ArrayToBase64(cbor.encode(actorInput))\n\t\t\t\t: undefined,\n\t\t\tcrash_policy: \"sleep\",\n\t\t});\n\n\t\tlogger().info({\n\t\t\tmsg: \"getOrCreateWithKey: actor ready\",\n\t\t\tactorId: actor.actor_id,\n\t\t\tname,\n\t\t\tkey,\n\t\t\tcreated,\n\t\t});\n\n\t\treturn apiActorToOutput(actor);\n\t}\n\n\tasync createActor({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t\tinput,\n\t\tregion,\n\t}: CreateInput): Promise<ActorOutput> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tlogger().info({ msg: \"creating actor via engine api\", name, key });\n\n\t\t// Create actor via engine API\n\t\tconst result = await createActor(this.#config, {\n\t\t\tdatacenter: region,\n\t\t\tname,\n\t\t\trunner_name_selector: this.#config.runnerName,\n\t\t\tkey: serializeActorKey(key),\n\t\t\tinput: input ? uint8ArrayToBase64(cbor.encode(input)) : undefined,\n\t\t\tcrash_policy: \"sleep\",\n\t\t});\n\n\t\tlogger().info({\n\t\t\tmsg: \"actor created\",\n\t\t\tactorId: result.actor.actor_id,\n\t\t\tname,\n\t\t\tkey,\n\t\t});\n\n\t\treturn apiActorToOutput(result.actor);\n\t}\n\n\tasync listActors({ c, name }: ListActorsInput): Promise<ActorOutput[]> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tlogger().debug({ msg: \"listing actors via engine api\", name });\n\n\t\tconst response = await listActorsByName(this.#config, name);\n\n\t\treturn response.actors.map(apiActorToOutput);\n\t}\n\n\tasync destroyActor(actorId: string): Promise<void> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tlogger().info({ msg: \"destroying actor via engine api\", actorId });\n\n\t\tawait destroyActor(this.#config, actorId);\n\n\t\tlogger().info({ msg: \"actor destroyed\", actorId });\n\t}\n\n\tasync sendRequest(\n\t\tactorId: string,\n\t\tactorRequest: Request,\n\t): Promise<Response> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\treturn await sendHttpRequestToActor(\n\t\t\tthis.#config,\n\t\t\tactorId,\n\t\t\tactorRequest,\n\t\t);\n\t}\n\n\tasync openWebSocket(\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<UniversalWebSocket> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\treturn await openWebSocketToActor(\n\t\t\tthis.#config,\n\t\t\tpath,\n\t\t\tactorId,\n\t\t\tencoding,\n\t\t\tparams,\n\t\t);\n\t}\n\n\tasync buildGatewayUrl(actorId: string): Promise<string> {\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tconst endpoint = getEndpoint(this.#config);\n\t\treturn buildActorGatewayUrl(endpoint, actorId, this.#config.token);\n\t}\n\n\tasync proxyRequest(\n\t\t_c: HonoContext,\n\t\tactorRequest: Request,\n\t\tactorId: string,\n\t): Promise<Response> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\treturn await sendHttpRequestToActor(\n\t\t\tthis.#config,\n\t\t\tactorId,\n\t\t\tactorRequest,\n\t\t);\n\t}\n\n\tasync proxyWebSocket(\n\t\tc: HonoContext,\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<Response> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tconst upgradeWebSocket = this.#config.getUpgradeWebSocket?.();\n\t\tinvariant(upgradeWebSocket, \"missing getUpgradeWebSocket\");\n\n\t\tconst endpoint = getEndpoint(this.#config);\n\t\tconst guardUrl = combineUrlPath(endpoint, path);\n\t\tconst wsGuardUrl = guardUrl.replace(\"http://\", \"ws://\");\n\n\t\tlogger().debug({\n\t\t\tmsg: \"forwarding websocket to actor via guard\",\n\t\t\tactorId,\n\t\t\tpath,\n\t\t\tguardUrl,\n\t\t});\n\n\t\t// Build protocols\n\t\tconst protocols = buildWebSocketProtocols(\n\t\t\tthis.#config,\n\t\t\tencoding,\n\t\t\tparams,\n\t\t);\n\t\tconst args = await createWebSocketProxy(c, wsGuardUrl, protocols);\n\n\t\treturn await upgradeWebSocket(() => args)(c, noopNext());\n\t}\n\n\tasync kvGet(actorId: string, key: Uint8Array): Promise<string | null> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tlogger().debug({ msg: \"getting kv value via engine api\", key });\n\n\t\tconst response = await kvGet(\n\t\t\tthis.#config,\n\t\t\tactorId,\n\t\t\tnew TextDecoder(\"utf8\").decode(key),\n\t\t);\n\n\t\treturn response.value;\n\t}\n\n\tdisplayInformation(): ManagerDisplayInformation {\n\t\treturn { properties: {} };\n\t}\n\n\tsetGetUpgradeWebSocket(getUpgradeWebSocket: GetUpgradeWebSocket): void {\n\t\tthis.#config.getUpgradeWebSocket = getUpgradeWebSocket;\n\t}\n}\n\nfunction apiActorToOutput(actor: ApiActor): ActorOutput {\n\treturn {\n\t\tactorId: actor.actor_id,\n\t\tname: actor.name,\n\t\tkey: deserializeActorKey(actor.key),\n\t\tcreateTs: actor.create_ts,\n\t\tstartTs: actor.start_ts ?? null,\n\t\tconnectableTs: actor.connectable_ts ?? null,\n\t\tsleepTs: actor.sleep_ts ?? null,\n\t\tdestroyTs: actor.destroy_ts ?? null,\n\t\terror: actor.error ?? undefined,\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 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 * 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 { getLogger } from \"@/common/log\";\n\n/** Prever to use ActorInstance.rlog child logger. This does not provide context in the log, should only be used as a last resort if you cannot pass the actor's child logger. */\nexport function loggerWithoutContext() {\n\treturn getLogger(\"actor-runtime\");\n}\n","import * as errors from \"./errors\";\nimport { loggerWithoutContext } from \"./log\";\n\nexport function assertUnreachable(x: never): never {\n\tloggerWithoutContext().error({\n\t\tmsg: \"unreachable\",\n\t\tvalue: `${x}`,\n\t\tstack: new Error().stack,\n\t});\n\tthrow new errors.Unreachable(x);\n}\n\nexport const throttle = <\n\t// biome-ignore lint/suspicious/noExplicitAny: we want to allow any function\n\tFn extends (...args: any) => any,\n>(\n\tfn: Fn,\n\tdelay: number,\n) => {\n\tlet lastRan = false;\n\tlet lastArgs: Parameters<Fn> | null = null;\n\n\treturn (...args: Parameters<Fn>) => {\n\t\tif (!lastRan) {\n\t\t\tfn.apply(this, args);\n\t\t\tlastRan = true;\n\t\t\tconst timer = () =>\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tlastRan = false;\n\t\t\t\t\tif (lastArgs) {\n\t\t\t\t\t\tfn.apply(this, lastArgs);\n\t\t\t\t\t\tlastRan = true;\n\t\t\t\t\t\tlastArgs = null;\n\t\t\t\t\t\ttimer();\n\t\t\t\t\t}\n\t\t\t\t}, delay);\n\t\t\ttimer();\n\t\t} else lastArgs = args;\n\t};\n};\n\nexport class DeadlineError extends Error {\n\tconstructor() {\n\t\tsuper(\"Promise did not complete before deadline.\");\n\t}\n}\n\nexport function deadline<T>(promise: Promise<T>, timeout: number): Promise<T> {\n\tconst controller = new AbortController();\n\tconst signal = controller.signal;\n\n\t// Set a timeout to abort the operation\n\tconst timeoutId = setTimeout(() => controller.abort(), timeout);\n\n\treturn Promise.race<T>([\n\t\tpromise,\n\t\tnew Promise<T>((_, reject) => {\n\t\t\tsignal.addEventListener(\"abort\", () => reject(new DeadlineError()));\n\t\t}),\n\t]).finally(() => {\n\t\tclearTimeout(timeoutId);\n\t});\n}\n\nexport class Lock<T> {\n\tprivate _locked = false;\n\tprivate _waiting: Array<() => void> = [];\n\n\tconstructor(private _value: T) {}\n\n\tasync lock(fn: (value: T) => Promise<void>): Promise<void> {\n\t\tif (this._locked) {\n\t\t\tawait new Promise<void>((resolve) => this._waiting.push(resolve));\n\t\t}\n\t\tthis._locked = true;\n\n\t\ttry {\n\t\t\tawait fn(this._value);\n\t\t} finally {\n\t\t\tthis._locked = false;\n\t\t\tconst next = this._waiting.shift();\n\t\t\tif (next) next();\n\t\t}\n\t}\n}\n\nexport interface JoinedAbortSignal {\n\tsignal?: AbortSignal;\n\tcleanup: () => void;\n}\n\nexport function joinAbortSignals(\n\t...signals: Array<AbortSignal | undefined>\n): JoinedAbortSignal {\n\tconst activeSignals = signals.filter(\n\t\t(signal): signal is AbortSignal => signal !== undefined,\n\t);\n\tif (activeSignals.length === 0) {\n\t\treturn { signal: undefined, cleanup: () => {} };\n\t}\n\tif (activeSignals.length === 1) {\n\t\treturn { signal: activeSignals[0], cleanup: () => {} };\n\t}\n\n\tconst controller = new AbortController();\n\tif (activeSignals.some((signal) => signal.aborted)) {\n\t\tcontroller.abort();\n\t\treturn { signal: controller.signal, cleanup: () => {} };\n\t}\n\n\tconst cleanup = () => {\n\t\tfor (const signal of activeSignals) {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t};\n\tconst onAbort = () => {\n\t\tcontroller.abort();\n\t\tcleanup();\n\t};\n\tfor (const signal of activeSignals) {\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t}\n\n\treturn { signal: controller.signal, cleanup };\n}\n\nexport function generateSecureToken(length = 32) {\n\tconst array = new Uint8Array(length);\n\tcrypto.getRandomValues(array);\n\t// Replace base64 chars that are not URL safe with URL-safe chars and strip padding\n\treturn btoa(String.fromCharCode(...array))\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=/g, \"\");\n}\n\n/**\n * Checks if a path is an actor state path within the persisted actor data.\n */\nexport function isStatePath(path: string): boolean {\n\treturn path === \"state\" || path.startsWith(\"state.\");\n}\n\n/**\n * Checks if a path is a connection state path within the persisted actor data.\n */\nexport function isConnStatePath(path: string): boolean {\n\tif (!path.startsWith(\"connections.\")) {\n\t\treturn false;\n\t}\n\tconst stateIndex = path.indexOf(\".state\", 12); // Start after \"connections.\"\n\tif (stateIndex === -1) {\n\t\treturn false;\n\t}\n\tconst afterState = stateIndex + 6; // \".state\".length = 6\n\t// Check if \".state\" is followed by end of string or \".\"\n\treturn path.length === afterState || path[afterState] === \".\";\n}\n","// 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 { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"actor-client\");\n}\n","import { logger } from \"@/client/log\";\n\n// Global singleton promise that will be reused for subsequent calls\nlet webSocketPromise: Promise<typeof WebSocket> | null = null;\n\nexport async function importWebSocket(): Promise<typeof WebSocket> {\n\t// Return existing promise if we already started loading\n\tif (webSocketPromise !== null) {\n\t\treturn webSocketPromise;\n\t}\n\n\t// Create and store the promise\n\twebSocketPromise = (async () => {\n\t\tlet _WebSocket: typeof WebSocket;\n\n\t\tif (typeof WebSocket !== \"undefined\") {\n\t\t\t// Browser environment\n\t\t\t_WebSocket = WebSocket as unknown as typeof WebSocket;\n\t\t} else {\n\t\t\t// Node.js environment\n\t\t\ttry {\n\t\t\t\tconst moduleName = \"ws\";\n\t\t\t\tconst ws = await import(/* webpackIgnore: true */ moduleName);\n\t\t\t\t_WebSocket = ws.default as unknown as typeof WebSocket;\n\t\t\t\tlogger().debug(\"using websocket from npm\");\n\t\t\t} catch {\n\t\t\t\t// WS not available\n\t\t\t\t_WebSocket = class MockWebSocket {\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t'WebSocket support requires installing the \"ws\" peer dependency.',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} as unknown as typeof WebSocket;\n\t\t\t\tlogger().debug(\"using mock websocket\");\n\t\t\t}\n\t\t}\n\n\t\treturn _WebSocket;\n\t})();\n\n\treturn webSocketPromise;\n}\n","import { z } from \"zod/v4\";\nimport type { ClientConfig } from \"@/client/config\";\nimport { sendHttpRequest } from \"@/client/utils\";\nimport { combineUrlPath } from \"@/utils\";\nimport { logger } from \"./log\";\nimport { RegistryConfig } from \"@/registry/config\";\n\n// Error class for Engine API errors\nexport class EngineApiError extends Error {\n\tconstructor(\n\t\tpublic readonly group: string,\n\t\tpublic readonly code: string,\n\t\tmessage?: string,\n\t) {\n\t\tsuper(message || `Engine API error: ${group}/${code}`);\n\t\tthis.name = \"EngineApiError\";\n\t}\n}\n\n// TODO: Remove getEndpoint, but it's used in a lot of places\nexport function getEndpoint(config: ClientConfig | RegistryConfig) {\n\t// Endpoint is always defined for ClientConfig (has default in schema).\n\t// RegistryConfig may not have endpoint if using local manager.\n\treturn config.endpoint ?? \"http://127.0.0.1:6420\";\n}\n\n// Helper function for making API calls\nexport async function apiCall<TInput = unknown, TOutput = unknown>(\n\tconfig: ClientConfig,\n\tmethod: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n\tpath: string,\n\tbody?: TInput,\n): Promise<TOutput> {\n\tconst endpoint = getEndpoint(config);\n\tconst url = combineUrlPath(endpoint, path, {\n\t\tnamespace: config.namespace,\n\t});\n\n\tlogger().debug({ msg: \"making api call\", method, url });\n\n\tconst headers: Record<string, string> = {\n\t\t...config.headers,\n\t};\n\n\t// Add Authorization header if token is provided\n\tif (config.token) {\n\t\theaders.Authorization = `Bearer ${config.token}`;\n\t}\n\n\treturn await sendHttpRequest<TInput, TOutput>({\n\t\tmethod,\n\t\turl,\n\t\theaders,\n\t\tbody,\n\t\tencoding: \"json\",\n\t\tskipParseResponse: false,\n\t\trequestVersionedDataHandler: undefined,\n\t\trequestVersion: undefined,\n\t\tresponseVersionedDataHandler: undefined,\n\t\tresponseVersion: undefined,\n\t\trequestZodSchema: z.any() as z.ZodType<TInput>,\n\t\tresponseZodSchema: z.any() as z.ZodType<TOutput>,\n\t\t// Identity conversions (passthrough for generic API calls)\n\t\trequestToJson: (value) => value,\n\t\trequestToBare: (value) => value,\n\t\tresponseFromJson: (value) => value,\n\t\tresponseFromBare: (value) => 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 type { Encoding } from \"@/actor/protocol/serde\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport type { HttpResponseError } from \"@/schemas/client-protocol/mod\";\nimport { HTTP_RESPONSE_ERROR_VERSIONED } from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype HttpResponseError as HttpResponseErrorJson,\n\tHttpResponseErrorSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport {\n\tcontentTypeForEncoding,\n\tdeserializeWithEncoding,\n\tencodingIsBinary,\n\tserializeWithEncoding,\n} from \"@/serde\";\nimport { httpUserAgent } from \"@/utils\";\nimport { ActorError, HttpRequestError } from \"./errors\";\nimport { logger } from \"./log\";\n\nexport interface ParsedCloseReason {\n\tgroup: string;\n\tcode: string;\n\trayId?: string;\n}\n\n/**\n * Parses WebSocket close reason string into structured data.\n *\n * Expected format examples:\n * - \"guard.actor_runner_failed#t1s80so6h3irenp8ymzltfoittcl00\"\n * - \"ws.client_closed\"\n *\n * Returns undefined if the format is invalid\n */\nexport function parseWebSocketCloseReason(\n\treason: string,\n): ParsedCloseReason | undefined {\n\tconst [mainPart, rayId] = reason.split(\"#\");\n\tconst [group, code] = mainPart.split(\".\");\n\n\tif (!group || !code) {\n\t\tlogger().warn({ msg: \"failed to parse close reason\", reason });\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tgroup,\n\t\tcode,\n\t\trayId,\n\t};\n}\n\nexport type WebSocketMessage = string | Blob | ArrayBuffer | Uint8Array;\n\nexport function messageLength(message: WebSocketMessage): number {\n\tif (message instanceof Blob) {\n\t\treturn message.size;\n\t}\n\tif (message instanceof ArrayBuffer) {\n\t\treturn message.byteLength;\n\t}\n\tif (message instanceof Uint8Array) {\n\t\treturn message.byteLength;\n\t}\n\tif (typeof message === \"string\") {\n\t\treturn message.length;\n\t}\n\tassertUnreachable(message);\n}\n\nexport interface HttpRequestOpts<\n\tRequestBare,\n\tResponseBare,\n\tRequestJson = RequestBare,\n\tResponseJson = ResponseBare,\n\tRequest = RequestBare,\n\tResponse = ResponseBare,\n> {\n\tmethod: string;\n\turl: string;\n\theaders: Record<string, string>;\n\tbody?: Request;\n\tencoding: Encoding;\n\tskipParseResponse?: boolean;\n\tsignal?: AbortSignal;\n\tcustomFetch?: (req: globalThis.Request) => Promise<globalThis.Response>;\n\trequestVersionedDataHandler: VersionedDataHandler<RequestBare> | undefined;\n\trequestVersion: number | undefined;\n\tresponseVersionedDataHandler:\n\t\t| VersionedDataHandler<ResponseBare>\n\t\t| undefined;\n\tresponseVersion: number | undefined;\n\trequestZodSchema: z.ZodType<RequestJson>;\n\tresponseZodSchema: z.ZodType<ResponseJson>;\n\trequestToJson: (value: Request) => RequestJson;\n\trequestToBare: (value: Request) => RequestBare;\n\tresponseFromJson: (value: ResponseJson) => Response;\n\tresponseFromBare: (value: ResponseBare) => Response;\n}\n\nexport async function sendHttpRequest<\n\tRequestBare = unknown,\n\tResponseBare = unknown,\n\tRequestJson = RequestBare,\n\tResponseJson = ResponseBare,\n\tRequest = RequestBare,\n\tResponse = ResponseBare,\n>(\n\topts: HttpRequestOpts<\n\t\tRequestBare,\n\t\tResponseBare,\n\t\tRequestJson,\n\t\tResponseJson,\n\t\tRequest,\n\t\tResponse\n\t>,\n): Promise<Response> {\n\tlogger().debug({\n\t\tmsg: \"sending http request\",\n\t\turl: opts.url,\n\t\tencoding: opts.encoding,\n\t});\n\n\t// Serialize body\n\tlet contentType: string | undefined;\n\tlet bodyData: string | Uint8Array | undefined;\n\tif (opts.method === \"POST\" || opts.method === \"PUT\") {\n\t\tinvariant(opts.body !== undefined, \"missing body\");\n\t\tcontentType = contentTypeForEncoding(opts.encoding);\n\t\tbodyData = serializeWithEncoding<RequestBare, RequestJson, Request>(\n\t\t\topts.encoding,\n\t\t\topts.body,\n\t\t\topts.requestVersionedDataHandler,\n\t\t\topts.requestVersion,\n\t\t\topts.requestZodSchema,\n\t\t\topts.requestToJson,\n\t\t\topts.requestToBare,\n\t\t);\n\t}\n\n\t// Send request\n\tlet response: globalThis.Response;\n\ttry {\n\t\t// Make the HTTP request\n\t\tresponse = await (opts.customFetch ?? fetch)(\n\t\t\tnew globalThis.Request(opts.url, {\n\t\t\t\tmethod: opts.method,\n\t\t\t\theaders: {\n\t\t\t\t\t...opts.headers,\n\t\t\t\t\t...(contentType\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\"Content-Type\": contentType,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t\"User-Agent\": httpUserAgent(),\n\t\t\t\t},\n\t\t\t\tbody: bodyData,\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tsignal: opts.signal,\n\t\t\t}),\n\t\t);\n\t} catch (error) {\n\t\tthrow new HttpRequestError(`Request failed: ${error}`, {\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\t// Parse response error\n\tif (!response.ok) {\n\t\tconst bufferResponse = await response.arrayBuffer();\n\t\tconst contentType = response.headers.get(\"content-type\");\n\t\tconst rayId = response.headers.get(\"x-rivet-ray-id\");\n\n\t\t// Determine encoding from Content-Type header, defaulting to provided encoding\n\t\tconst encoding: Encoding = contentType?.includes(\"application/json\")\n\t\t\t? \"json\"\n\t\t\t: opts.encoding;\n\n\t\t// Attempt to parse structured error data\n\t\ttry {\n\t\t\tconst responseData = deserializeWithEncoding(\n\t\t\t\tencoding,\n\t\t\t\tnew Uint8Array(bufferResponse),\n\t\t\t\tHTTP_RESPONSE_ERROR_VERSIONED,\n\t\t\t\tHttpResponseErrorSchema,\n\t\t\t\t// JSON: metadata is already unknown\n\t\t\t\t(json): HttpResponseErrorJson => json as HttpResponseErrorJson,\n\t\t\t\t// BARE: decode ArrayBuffer metadata to unknown\n\t\t\t\t(bare): any => ({\n\t\t\t\t\tgroup: bare.group,\n\t\t\t\t\tcode: bare.code,\n\t\t\t\t\tmessage: bare.message,\n\t\t\t\t\tmetadata: bare.metadata\n\t\t\t\t\t\t? cbor.decode(new Uint8Array(bare.metadata))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tthrow new ActorError(\n\t\t\t\tresponseData.group,\n\t\t\t\tresponseData.code,\n\t\t\t\tresponseData.message,\n\t\t\t\tresponseData.metadata,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\t// If it's already an ActorError, re-throw it\n\t\t\tif (error instanceof ActorError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\t// Otherwise, fall back to generic error with text response\n\t\t\tconst textResponse = new TextDecoder(\"utf-8\", {\n\t\t\t\tfatal: false,\n\t\t\t}).decode(bufferResponse);\n\n\t\t\tif (rayId) {\n\t\t\t\tthrow new HttpRequestError(\n\t\t\t\t\t`${response.statusText} (${response.status}) (Ray ID: ${rayId}):\\n${textResponse}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow new HttpRequestError(\n\t\t\t\t\t`${response.statusText} (${response.status}):\\n${textResponse}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Some requests don't need the success response to be parsed, so this can speed things up\n\tif (opts.skipParseResponse) {\n\t\treturn undefined as Response;\n\t}\n\n\t// Parse the response based on encoding\n\ttry {\n\t\tconst buffer = new Uint8Array(await response.arrayBuffer());\n\t\treturn deserializeWithEncoding<ResponseBare, ResponseJson, Response>(\n\t\t\topts.encoding,\n\t\t\tbuffer,\n\t\t\topts.responseVersionedDataHandler,\n\t\t\topts.responseZodSchema,\n\t\t\topts.responseFromJson,\n\t\t\topts.responseFromBare,\n\t\t);\n\t} catch (error) {\n\t\tthrow new HttpRequestError(`Failed to parse response: ${error}`, {\n\t\t\tcause: error,\n\t\t});\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","export class ActorClientError extends Error {}\n\nexport class InternalError extends ActorClientError {}\n\nexport class ManagerError extends ActorClientError {\n\tconstructor(error: string, opts?: ErrorOptions) {\n\t\tsuper(`Manager error: ${error}`, opts);\n\t}\n}\n\nexport class MalformedResponseMessage extends ActorClientError {\n\tconstructor(cause?: unknown) {\n\t\tsuper(`Malformed response message: ${cause}`, { cause });\n\t}\n}\n\nexport class ActorError extends ActorClientError {\n\t__type = \"ActorError\";\n\n\tconstructor(\n\t\tpublic readonly group: string,\n\t\tpublic readonly code: string,\n\t\tmessage: string,\n\t\tpublic readonly metadata?: unknown,\n\t) {\n\t\tsuper(message);\n\t}\n}\n\nexport class HttpRequestError extends ActorClientError {\n\tconstructor(message: string, opts?: { cause?: unknown }) {\n\t\tsuper(`HTTP request error: ${message}`, { cause: opts?.cause });\n\t}\n}\n\nexport class ActorConnDisposed extends ActorClientError {\n\tconstructor() {\n\t\tsuper(\"Attempting to interact with a disposed actor connection.\");\n\t}\n}\n\n/**\n * Checks if an error code indicates a scheduling error that may have more details.\n */\nexport function isSchedulingError(group: string, code: string): boolean {\n\treturn (\n\t\tgroup === \"guard\" &&\n\t\t(code === \"actor_ready_timeout\" || code === \"actor_runner_failed\")\n\t);\n}\n\n/**\n * Error thrown when actor scheduling fails.\n * Provides detailed information about why the actor failed to start.\n */\nexport class ActorSchedulingError extends ActorError {\n\tpublic readonly actorId: string;\n\tpublic readonly details: unknown;\n\n\tconstructor(\n\t\tgroup: string,\n\t\tcode: string,\n\t\tactorId: string,\n\t\tdetails: unknown,\n\t) {\n\t\tsuper(\n\t\t\tgroup,\n\t\t\tcode,\n\t\t\t`Actor failed to start (${actorId}): ${JSON.stringify(details)}`,\n\t\t\t{ actorId, details },\n\t\t);\n\t\tthis.name = \"ActorSchedulingError\";\n\t\tthis.actorId = actorId;\n\t\tthis.details = details;\n\t}\n}\n","import { getLogger } from \"@/common//log\";\n\nexport function logger() {\n\treturn getLogger(\"remote-manager-driver\");\n}\n","import type { ClientConfig } from \"@/client/config\";\nimport {\n\tHEADER_CONN_PARAMS,\n\tHEADER_ENCODING,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_STANDARD as WS_PROTOCOL_RIVETKIT,\n\tWS_PROTOCOL_TOKEN,\n} from \"@/common/actor-router-consts\";\nimport { importWebSocket } from \"@/common/websocket\";\nimport type { Encoding, UniversalWebSocket } from \"@/mod\";\nimport { combineUrlPath } from \"@/utils\";\nimport { getEndpoint } from \"./api-utils\";\nimport { logger } from \"./log\";\n\nexport function buildActorGatewayUrl(\n\tendpoint: string,\n\tactorId: string,\n\ttoken: string | undefined,\n\tpath = \"\",\n): string {\n\tconst tokenSegment =\n\t\ttoken !== undefined ? `@${encodeURIComponent(token)}` : \"\";\n\tconst gatewayPath = `/gateway/${encodeURIComponent(actorId)}${tokenSegment}${path}`;\n\treturn combineUrlPath(endpoint, gatewayPath);\n}\n\nexport async function openWebSocketToActor(\n\trunConfig: ClientConfig,\n\tpath: string,\n\tactorId: string,\n\tencoding: Encoding,\n\tparams: unknown,\n): Promise<UniversalWebSocket> {\n\tconst WebSocket = await importWebSocket();\n\n\t// WebSocket connections go through guard\n\tconst endpoint = getEndpoint(runConfig);\n\tconst guardUrl = buildActorGatewayUrl(\n\t\tendpoint,\n\t\tactorId,\n\t\trunConfig.token,\n\t\tpath,\n\t);\n\n\tlogger().debug({\n\t\tmsg: \"opening websocket to actor via guard\",\n\t\tactorId,\n\t\tpath,\n\t\tguardUrl,\n\t});\n\n\t// Create WebSocket connection\n\tconst ws = new WebSocket(\n\t\tguardUrl,\n\t\tbuildWebSocketProtocols(runConfig, encoding, params),\n\t);\n\n\t// Set binary type to arraybuffer for proper encoding support\n\tws.binaryType = \"arraybuffer\";\n\n\tlogger().debug({ msg: \"websocket connection opened\", actorId });\n\n\treturn ws as UniversalWebSocket;\n}\n\nexport function buildWebSocketProtocols(\n\trunConfig: ClientConfig,\n\tencoding: Encoding,\n\tparams?: unknown,\n): string[] {\n\tconst protocols: string[] = [];\n\tprotocols.push(WS_PROTOCOL_RIVETKIT);\n\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\tif (params) {\n\t\tprotocols.push(\n\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t);\n\t}\n\treturn protocols;\n}\n","import type { ClientConfig } from \"@/client/config\";\nimport { HEADER_RIVET_TOKEN } from \"@/common/actor-router-consts\";\nimport { buildActorGatewayUrl } from \"./actor-websocket-client\";\nimport { getEndpoint } from \"./api-utils\";\n\nexport async function sendHttpRequestToActor(\n\trunConfig: ClientConfig,\n\tactorId: string,\n\tactorRequest: Request,\n): Promise<Response> {\n\t// Route through guard port\n\tconst url = new URL(actorRequest.url);\n\tconst endpoint = getEndpoint(runConfig);\n\tconst guardUrl = buildActorGatewayUrl(\n\t\tendpoint,\n\t\tactorId,\n\t\trunConfig.token,\n\t\t`${url.pathname}${url.search}`,\n\t);\n\n\t// Handle body properly based on method and presence\n\tlet bodyToSend: ArrayBuffer | null = null;\n\tconst guardHeaders = buildGuardHeadersForHttp(\n\t\trunConfig,\n\t\tactorRequest,\n\t\tactorId,\n\t);\n\n\tif (actorRequest.method !== \"GET\" && actorRequest.method !== \"HEAD\") {\n\t\tif (actorRequest.bodyUsed) {\n\t\t\tthrow new Error(\"Request body has already been consumed\");\n\t\t}\n\n\t\t// TODO: This buffers the entire request in memory every time. We\n\t\t// need to properly implement streaming bodies.\n\t\tconst reqBody = await actorRequest.arrayBuffer();\n\n\t\tif (reqBody.byteLength !== 0) {\n\t\t\tbodyToSend = reqBody;\n\n\t\t\t// If this is a streaming request, we need to convert the headers\n\t\t\t// for the basic array buffer\n\t\t\tguardHeaders.delete(\"transfer-encoding\");\n\t\t\tguardHeaders.set(\"content-length\", String(bodyToSend.byteLength));\n\t\t}\n\t}\n\n\tconst guardRequest = new Request(guardUrl, {\n\t\tmethod: actorRequest.method,\n\t\theaders: guardHeaders,\n\t\tbody: bodyToSend,\n\t\tsignal: actorRequest.signal,\n\t});\n\n\treturn mutableResponse(await fetch(guardRequest));\n}\n\nfunction mutableResponse(fetchRes: Response): Response {\n\t// We cannot return the raw response from `fetch` since the response type is not mutable.\n\t//\n\t// In order for middleware to be able to mutate the response, we need to build a new Response object that is mutable.\n\treturn new Response(fetchRes.body, fetchRes);\n}\n\nfunction buildGuardHeadersForHttp(\n\trunConfig: ClientConfig,\n\tactorRequest: Request,\n\tactorId: string,\n): Headers {\n\tconst headers = new Headers();\n\t// Copy all headers from the original request\n\tactorRequest.headers.forEach((value, key) => {\n\t\theaders.set(key, value);\n\t});\n\t// Add extra headers from config\n\tfor (const [key, value] of Object.entries(runConfig.headers)) {\n\t\theaders.set(key, value as string);\n\t}\n\t// Add guard-specific headers\n\tif (runConfig.token) {\n\t\theaders.set(HEADER_RIVET_TOKEN, runConfig.token);\n\t}\n\treturn headers;\n}\n","import { serializeActorKey } from \"@/actor/keys\";\nimport type { ClientConfig } from \"@/client/client\";\nimport type { MetadataResponse } from \"@/common/router\";\nimport type {\n\tActorsCreateRequest,\n\tActorsCreateResponse,\n\tActorsDeleteResponse,\n\tActorsGetOrCreateRequest,\n\tActorsGetOrCreateResponse,\n\tActorsListResponse,\n} from \"@/manager-api/actors\";\nimport type { RivetId } from \"@/manager-api/common\";\nimport { apiCall } from \"./api-utils\";\n\n// MARK: Get actor\nexport async function getActor(\n\tconfig: ClientConfig,\n\t_: string,\n\tactorId: RivetId,\n): Promise<ActorsListResponse> {\n\treturn apiCall<never, ActorsListResponse>(\n\t\tconfig,\n\t\t\"GET\",\n\t\t`/actors?actor_ids=${encodeURIComponent(actorId)}`,\n\t);\n}\n\n// MARK: Get actor by key\nexport async function getActorByKey(\n\tconfig: ClientConfig,\n\tname: string,\n\tkey: string[],\n): Promise<ActorsListResponse> {\n\tconst serializedKey = serializeActorKey(key);\n\treturn apiCall<never, ActorsListResponse>(\n\t\tconfig,\n\t\t\"GET\",\n\t\t`/actors?name=${encodeURIComponent(name)}&key=${encodeURIComponent(serializedKey)}`,\n\t);\n}\n\n// MARK: List actors by name\nexport async function listActorsByName(\n\tconfig: ClientConfig,\n\tname: string,\n): Promise<ActorsListResponse> {\n\treturn apiCall<never, ActorsListResponse>(\n\t\tconfig,\n\t\t\"GET\",\n\t\t`/actors?name=${encodeURIComponent(name)}`,\n\t);\n}\n\n// MARK: Get or create actor by id\nexport async function getOrCreateActor(\n\tconfig: ClientConfig,\n\trequest: ActorsGetOrCreateRequest,\n): Promise<ActorsGetOrCreateResponse> {\n\treturn apiCall<ActorsGetOrCreateRequest, ActorsGetOrCreateResponse>(\n\t\tconfig,\n\t\t\"PUT\",\n\t\t`/actors`,\n\t\trequest,\n\t);\n}\n\n// MARK: Create actor\nexport async function createActor(\n\tconfig: ClientConfig,\n\trequest: ActorsCreateRequest,\n): Promise<ActorsCreateResponse> {\n\treturn apiCall<ActorsCreateRequest, ActorsCreateResponse>(\n\t\tconfig,\n\t\t\"POST\",\n\t\t`/actors`,\n\t\trequest,\n\t);\n}\n\n// MARK: Destroy actor\nexport async function destroyActor(\n\tconfig: ClientConfig,\n\tactorId: RivetId,\n): Promise<ActorsDeleteResponse> {\n\treturn apiCall<never, ActorsDeleteResponse>(\n\t\tconfig,\n\t\t\"DELETE\",\n\t\t`/actors/${encodeURIComponent(actorId)}`,\n\t);\n}\n\n// MARK: Get metadata\nexport async function getMetadata(\n\tconfig: ClientConfig,\n): Promise<MetadataResponse> {\n\treturn apiCall<never, MetadataResponse>(config, \"GET\", `/metadata`);\n}\n\n// MARK: Get datacenters\nexport interface DatacentersResponse {\n\tdatacenters: { name: string }[];\n}\n\nexport async function getDatacenters(\n\tconfig: ClientConfig,\n): Promise<DatacentersResponse> {\n\treturn apiCall<never, DatacentersResponse>(config, \"GET\", `/datacenters`);\n}\n\n// MARK: Update runner config\nexport interface RegistryConfigRequest {\n\tdatacenters: Record<\n\t\tstring,\n\t\t{\n\t\t\tserverless: {\n\t\t\t\turl: string;\n\t\t\t\theaders: Record<string, string>;\n\t\t\t\tmax_runners: number;\n\t\t\t\tmin_runners: number;\n\t\t\t\trequest_lifespan: number;\n\t\t\t\trunners_margin: number;\n\t\t\t\tslots_per_runner: number;\n\t\t\t\tmetadata_poll_interval?: number;\n\t\t\t};\n\t\t\tmetadata?: Record<string, unknown>;\n\t\t}\n\t>;\n}\n\nexport async function updateRunnerConfig(\n\tconfig: ClientConfig,\n\trunnerName: string,\n\trequest: RegistryConfigRequest,\n): Promise<void> {\n\treturn apiCall<RegistryConfigRequest, void>(\n\t\tconfig,\n\t\t\"PUT\",\n\t\t`/runner-configs/${runnerName}`,\n\t\trequest,\n\t);\n}\n\n// MARK: KV Get\ninterface KvGetResponse {\n\tupdate_ts: string;\n\tvalue: string | null;\n}\n\nexport async function kvGet(\n\tconfig: ClientConfig,\n\tactorId: RivetId,\n\tkey: string,\n): Promise<KvGetResponse> {\n\treturn apiCall<{}, KvGetResponse>(\n\t\tconfig,\n\t\t\"GET\",\n\t\t`/actors/${encodeURIComponent(actorId)}/kv/keys/${encodeURIComponent(key)}`,\n\t);\n}\n","import pRetry from \"p-retry\";\nimport type { ClientConfig } from \"@/client/client\";\nimport type { MetadataResponse } from \"@/common/router\";\nimport { stringifyError } from \"@/common/utils\";\nimport { getMetadata } from \"./api-endpoints\";\nimport { getEndpoint } from \"./api-utils\";\nimport { logger } from \"./log\";\n\n// Global cache to store metadata check promises for each endpoint\nconst metadataLookupCache = new Map<string, Promise<MetadataResponse>>();\n\nexport async function lookupMetadataCached(\n\tconfig: ClientConfig,\n): Promise<MetadataResponse> {\n\tconst endpoint = getEndpoint(config);\n\n\t// Check if metadata lookup is already in progress or completed for this endpoint\n\tconst existingPromise = metadataLookupCache.get(endpoint);\n\tif (existingPromise) {\n\t\treturn existingPromise;\n\t}\n\n\t// Create and store the promise immediately to prevent racing requests\n\tconst metadataLookupPromise = pRetry(\n\t\tasync () => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"fetching metadata\",\n\t\t\t\tendpoint,\n\t\t\t});\n\n\t\t\tconst metadataData = await getMetadata(config);\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"received metadata\",\n\t\t\t\tendpoint,\n\t\t\t\tclientEndpoint: metadataData.clientEndpoint,\n\t\t\t});\n\n\t\t\treturn metadataData;\n\t\t},\n\t\t{\n\t\t\tforever: true,\n\t\t\tminTimeout: 500,\n\t\t\tmaxTimeout: 15_000,\n\t\t\tonFailedAttempt: (error) => {\n\t\t\t\t// Skip logging warning on first attempt since this attempt\n\t\t\t\t// fails if called immediately on startup. This is because the\n\t\t\t\t// runtime startup is an async operation that will not be\n\t\t\t\t// available on the first tick.\n\t\t\t\tif (error.attemptNumber > 1) {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"failed to fetch metadata, retrying\",\n\t\t\t\t\t\tendpoint,\n\t\t\t\t\t\tattempt: error.attemptNumber,\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t);\n\n\tmetadataLookupCache.set(endpoint, metadataLookupPromise);\n\treturn metadataLookupPromise;\n}\n","import type { Context as HonoContext } from \"hono\";\nimport type { WSContext } from \"hono/ws\";\nimport type { UpgradeWebSocketArgs } from \"@/actor/router-websocket-endpoints\";\nimport { stringifyError } from \"@/common/utils\";\nimport { importWebSocket } from \"@/common/websocket\";\nimport { logger } from \"./log\";\n\n/**\n * Returns Hono `upgradeWebSocket` args that will proxy requests from the client to a destination address.\n */\nexport async function createWebSocketProxy(\n\tc: HonoContext,\n\ttargetUrl: string,\n\tprotocols: string[],\n): Promise<UpgradeWebSocketArgs> {\n\tconst WebSocket = await importWebSocket();\n\n\t// WebSocket state\n\tinterface WsState {\n\t\ttargetWs?: WebSocket;\n\t\tconnectPromise?: Promise<void>;\n\t}\n\tconst state: WsState = {};\n\n\treturn {\n\t\tonOpen: async (event: any, clientWs: WSContext) => {\n\t\t\tlogger().debug({ msg: \"client websocket connected\", targetUrl });\n\n\t\t\tif (clientWs.readyState !== 1) {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"client websocket not open on connection\",\n\t\t\t\t\ttargetUrl,\n\t\t\t\t\treadyState: clientWs.readyState,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create WebSocket\n\t\t\tconst targetWs = new WebSocket(targetUrl, protocols);\n\t\t\tstate.targetWs = targetWs;\n\n\t\t\t// Setup connection promise\n\t\t\tstate.connectPromise = new Promise<void>((resolve, reject) => {\n\t\t\t\ttargetWs.addEventListener(\"open\", () => {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"target websocket connected\",\n\t\t\t\t\t\ttargetUrl,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (clientWs.readyState !== 1) {\n\t\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\t\tmsg: \"client websocket closed before target connected\",\n\t\t\t\t\t\t\ttargetUrl,\n\t\t\t\t\t\t\tclientReadyState: clientWs.readyState,\n\t\t\t\t\t\t});\n\t\t\t\t\t\ttargetWs.close(1001, \"Client disconnected\");\n\t\t\t\t\t\treject(new Error(\"Client disconnected\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\n\t\t\t\ttargetWs.addEventListener(\"error\", (error) => {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"target websocket error during connection\",\n\t\t\t\t\t\ttargetUrl,\n\t\t\t\t\t});\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Setup bidirectional forwarding\n\t\t\tstate.targetWs.addEventListener(\"message\", (event) => {\n\t\t\t\tif (\n\t\t\t\t\ttypeof event.data === \"string\" ||\n\t\t\t\t\tevent.data instanceof ArrayBuffer\n\t\t\t\t) {\n\t\t\t\t\tclientWs.send(event.data);\n\t\t\t\t} else if (event.data instanceof Blob) {\n\t\t\t\t\tevent.data.arrayBuffer().then((buffer) => {\n\t\t\t\t\t\tclientWs.send(buffer);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tstate.targetWs.addEventListener(\"close\", (event) => {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"target websocket closed\",\n\t\t\t\t\ttargetUrl,\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t});\n\t\t\t\tcloseWebSocketIfOpen(clientWs, event.code, event.reason);\n\t\t\t});\n\n\t\t\tstate.targetWs.addEventListener(\"error\", (error) => {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"target websocket error\",\n\t\t\t\t\ttargetUrl,\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tcloseWebSocketIfOpen(clientWs, 1011, \"Target WebSocket error\");\n\t\t\t});\n\t\t},\n\n\t\tonMessage: async (event: any, clientWs: WSContext) => {\n\t\t\tif (!state.targetWs || !state.connectPromise) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"websocket state not initialized\",\n\t\t\t\t\ttargetUrl,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait state.connectPromise;\n\t\t\t\tif (state.targetWs.readyState === WebSocket.OPEN) {\n\t\t\t\t\tstate.targetWs.send(event.data);\n\t\t\t\t} else {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"target websocket not open\",\n\t\t\t\t\t\ttargetUrl,\n\t\t\t\t\t\treadyState: state.targetWs.readyState,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed to connect to target websocket\",\n\t\t\t\t\ttargetUrl,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\tcloseWebSocketIfOpen(\n\t\t\t\t\tclientWs,\n\t\t\t\t\t1011,\n\t\t\t\t\t\"Failed to connect to target\",\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tonClose: (event: any, clientWs: WSContext) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"client websocket closed\",\n\t\t\t\ttargetUrl,\n\t\t\t\tcode: event.code,\n\t\t\t\treason: event.reason,\n\t\t\t\twasClean: event.wasClean,\n\t\t\t});\n\n\t\t\tif (state.targetWs) {\n\t\t\t\tif (\n\t\t\t\t\tstate.targetWs.readyState === WebSocket.OPEN ||\n\t\t\t\t\tstate.targetWs.readyState === WebSocket.CONNECTING\n\t\t\t\t) {\n\t\t\t\t\tstate.targetWs.close(\n\t\t\t\t\t\t1000,\n\t\t\t\t\t\tevent.reason || \"Client disconnected\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonError: (event: any, clientWs: WSContext) => {\n\t\t\tlogger().error({ msg: \"client websocket error\", targetUrl, event });\n\n\t\t\tif (state.targetWs) {\n\t\t\t\tif (state.targetWs.readyState === WebSocket.OPEN) {\n\t\t\t\t\tstate.targetWs.close(1011, \"Client WebSocket error\");\n\t\t\t\t} else if (state.targetWs.readyState === WebSocket.CONNECTING) {\n\t\t\t\t\tstate.targetWs.close();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction closeWebSocketIfOpen(\n\tws: WebSocket | WSContext,\n\tcode: number,\n\treason: string,\n): void {\n\tif (ws.readyState === 1) {\n\t\tws.close(code, reason);\n\t} else if (\n\t\t\"close\" in ws &&\n\t\t(ws as WebSocket).readyState === WebSocket.OPEN\n\t) {\n\t\tws.close(code, reason);\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport pRetry from \"p-retry\";\nimport type { CloseEvent } from \"ws\";\nimport type { AnyActorDefinition } from \"@/actor/definition\";\nimport { inputDataToBuffer } from \"@/actor/protocol/old\";\nimport { type Encoding, jsonStringifyCompat } from \"@/actor/protocol/serde\";\nimport { PATH_CONNECT } from \"@/common/actor-router-consts\";\nimport { assertUnreachable, stringifyError } from \"@/common/utils\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport type { ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\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, serializeWithEncoding } from \"@/serde\";\nimport { bufferToArrayBuffer, promiseWithResolvers } from \"@/utils\";\nimport { getLogMessage } from \"@/utils/env-vars\";\nimport type { ActorDefinitionActions } from \"./actor-common\";\nimport { checkForSchedulingError, queryActor } from \"./actor-query\";\nimport { ACTOR_CONNS_SYMBOL, type ClientRaw } from \"./client\";\nimport * as errors from \"./errors\";\nimport { logger } from \"./log\";\nimport {\n\tcreateQueueSender,\n\ttype QueueSendNoWaitOptions,\n\ttype QueueSendOptions,\n\ttype QueueSendResult,\n\ttype QueueSendWaitOptions,\n} from \"./queue\";\nimport {\n\ttype WebSocketMessage as ConnMessage,\n\tmessageLength,\n\tparseWebSocketCloseReason,\n\tsendHttpRequest,\n} from \"./utils\";\n\n/**\n * Connection status for an actor connection.\n *\n * - `\"idle\"`: Not connected, no auto-reconnect (initial state, after dispose, or disabled)\n * - `\"connecting\"`: Attempting to establish connection\n * - `\"connected\"`: Connection is active\n * - `\"disconnected\"`: Connection was lost, will auto-reconnect\n */\nexport type ActorConnStatus =\n\t| \"idle\"\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"disconnected\";\n\ninterface ActionInFlight {\n\tname: string;\n\tresolve: (response: { id: bigint; output: unknown }) => void;\n\treject: (error: Error) => void;\n}\n\ninterface EventSubscriptions<Args extends Array<unknown>> {\n\tcallback: (...args: Args) => void;\n\tonce: boolean;\n}\n\n/**\n * A function that unsubscribes from an event.\n *\n * @typedef {Function} EventUnsubscribe\n */\nexport type EventUnsubscribe = () => void;\n\n/**\n * A function that handles connection errors.\n *\n * @typedef {Function} ActorErrorCallback\n */\nexport type ActorErrorCallback = (error: errors.ActorError) => void;\n\n/**\n * A callback for connection state changes.\n *\n * @typedef {Function} ConnectionStateCallback\n */\nexport type ConnectionStateCallback = () => void;\n\n/**\n * A callback for connection status changes.\n *\n * @typedef {Function} StatusChangeCallback\n */\nexport type StatusChangeCallback = (status: ActorConnStatus) => void;\n\nexport interface SendHttpMessageOpts {\n\tephemeral: boolean;\n\tsignal?: AbortSignal;\n}\n\nexport const CONNECT_SYMBOL = Symbol(\"connect\");\n\n/**\n * Provides underlying functions for {@link ActorConn}. See {@link ActorConn} for using type-safe remote procedure calls.\n *\n * @see {@link ActorConn}\n */\nexport class ActorConnRaw {\n\t#disposed = false;\n\n\t/* Will be aborted on dispose. */\n\t#abortController = new AbortController();\n\n\t#connStatus: ActorConnStatus = \"idle\";\n\n\t#actorId?: string;\n\t#connId?: string;\n\n\t#messageQueue: Array<{\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\t#actionsInFlight = new Map<number, ActionInFlight>();\n\n\t// biome-ignore lint/suspicious/noExplicitAny: Unknown subscription type\n\t#eventSubscriptions = new Map<string, Set<EventSubscriptions<any[]>>>();\n\n\t#errorHandlers = new Set<ActorErrorCallback>();\n\t#openHandlers = new Set<ConnectionStateCallback>();\n\t#openScheduled = false;\n\t#closeHandlers = new Set<ConnectionStateCallback>();\n\t#statusChangeHandlers = new Set<StatusChangeCallback>();\n\n\t#actionIdCounter = 0;\n\t#queueSender: ReturnType<typeof createQueueSender>;\n\n\t/**\n\t * Interval that keeps the NodeJS process alive if this is the only thing running.\n\t *\n\t * See ttps://github.com/nodejs/node/issues/22088\n\t */\n\t#keepNodeAliveInterval: NodeJS.Timeout;\n\n\t/** Promise used to indicate the socket has connected successfully. This will be rejected if the connection fails. */\n\t#onOpenPromise?: ReturnType<typeof promiseWithResolvers<undefined>>;\n\n\t#websocket?: UniversalWebSocket;\n\n\t#client: ClientRaw;\n\t#driver: ManagerDriver;\n\t#params: unknown;\n\t#encoding: Encoding;\n\t#actorQuery: ActorQuery;\n\n\t// TODO: ws message queue\n\n\t/**\n\t * Do not call this directly.\n\t *\n\t * Creates an instance of ActorConnRaw.\n\t *\n\t * @protected\n\t */\n\tpublic constructor(\n\t\tclient: ClientRaw,\n\t\tdriver: ManagerDriver,\n\t\tparams: unknown,\n\t\tencoding: Encoding,\n\t\tactorQuery: ActorQuery,\n\t) {\n\t\tthis.#client = client;\n\t\tthis.#driver = driver;\n\t\tthis.#params = params;\n\t\tthis.#encoding = encoding;\n\t\tthis.#actorQuery = actorQuery;\n\t\tthis.#queueSender = createQueueSender({\n\t\t\tencoding: this.#encoding,\n\t\t\tparams: this.#params,\n\t\t\tcustomFetch: async (request: Request) => {\n\t\t\t\tif (!this.#actorId) {\n\t\t\t\t\tconst { actorId } = await queryActor(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tthis.#actorQuery,\n\t\t\t\t\t\tthis.#driver,\n\t\t\t\t\t);\n\t\t\t\t\tthis.#actorId = actorId;\n\t\t\t\t}\n\t\t\t\treturn this.#driver.sendRequest(this.#actorId, request);\n\t\t\t},\n\t\t});\n\n\t\tthis.#keepNodeAliveInterval = setInterval(() => 60_000);\n\t}\n\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions: QueueSendWaitOptions,\n\t): Promise<QueueSendResult>;\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendNoWaitOptions,\n\t): Promise<void>;\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendOptions,\n\t): Promise<QueueSendResult | void> {\n\t\treturn this.#queueSender.send(name, body, options as any);\n\t}\n\n\t/**\n\t * Call a raw action connection. See {@link ActorConn} for type-safe action calls.\n\t *\n\t * @see {@link ActorConn}\n\t * @template Args - The type of arguments to pass to the action function.\n\t * @template Response - The type of the response returned by the action function.\n\t * @param {string} name - The name of the action function to call.\n\t * @param {...Args} args - The arguments to pass to the action function.\n\t * @returns {Promise<Response>} - A promise that resolves to the response of the action function.\n\t */\n\tasync action<\n\t\tArgs extends Array<unknown> = unknown[],\n\t\tResponse = unknown,\n\t>(opts: {\n\t\tname: string;\n\t\targs: Args;\n\t\tsignal?: AbortSignal;\n\t}): Promise<Response> {\n\t\tlogger().debug({ msg: \"action\", name: opts.name, args: opts.args });\n\n\t\t// If we have an active connection, use the websockactionId\n\t\tconst actionId = this.#actionIdCounter;\n\t\tthis.#actionIdCounter += 1;\n\n\t\tconst { promise, resolve, reject } = promiseWithResolvers<{\n\t\t\tid: bigint;\n\t\t\toutput: unknown;\n\t\t}>((reason) => logger().warn({ msg: \"unhandled action promise rejection\", reason }));\n\t\tthis.#actionsInFlight.set(actionId, {\n\t\t\tname: opts.name,\n\t\t\tresolve,\n\t\t\treject,\n\t\t});\n\t\tlogger().debug({\n\t\t\tmsg: \"added action to in-flight map\",\n\t\t\tactionId,\n\t\t\tactionName: opts.name,\n\t\t\tinFlightCount: this.#actionsInFlight.size,\n\t\t});\n\n\t\tthis.#sendMessage({\n\t\t\tbody: {\n\t\t\t\ttag: \"ActionRequest\",\n\t\t\t\tval: {\n\t\t\t\t\tid: BigInt(actionId),\n\t\t\t\t\tname: opts.name,\n\t\t\t\t\targs: opts.args,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\t// TODO: Throw error if disconnect is called\n\n\t\tconst { id: responseId, output } = await promise;\n\t\tif (responseId !== BigInt(actionId))\n\t\t\tthrow new Error(\n\t\t\t\t`Request ID ${actionId} does not match response ID ${responseId}`,\n\t\t\t);\n\n\t\treturn output as Response;\n\t}\n\n\t/**\n\t * Do not call this directly.\n\t * Establishes a connection to the server using the specified endpoint & encoding & driver.\n\t *\n\t * @protected\n\t */\n\tpublic [CONNECT_SYMBOL]() {\n\t\tthis.#connectWithRetry();\n\t}\n\n\t#setConnStatus(status: ActorConnStatus) {\n\t\tconst prevStatus = this.#connStatus;\n\t\tif (prevStatus === status) return;\n\t\tthis.#connStatus = status;\n\n\t\t// Notify status change handlers\n\t\tfor (const handler of [...this.#statusChangeHandlers]) {\n\t\t\ttry {\n\t\t\t\thandler(status);\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in status change handler\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Notify open handlers\n\t\tif (status === \"connected\") {\n\t\t\tfor (const handler of [...this.#openHandlers]) {\n\t\t\t\ttry {\n\t\t\t\t\thandler();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error in open handler\",\n\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Notify close handlers (only if transitioning from Connected to Disconnected or Idle)\n\t\tif (\n\t\t\t(status === \"disconnected\" || status === \"idle\") &&\n\t\t\tprevStatus === \"connected\"\n\t\t) {\n\t\t\tfor (const handler of [...this.#closeHandlers]) {\n\t\t\t\ttry {\n\t\t\t\t\thandler();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error in close handler\",\n\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#connectWithRetry() {\n\t\tthis.#setConnStatus(\"connecting\");\n\n\t\t// Attempt to reconnect indefinitely\n\t\t// This is intentionally not awaited - connection happens in background\n\t\tpRetry(this.#connectAndWait.bind(this), {\n\t\t\tforever: true,\n\t\t\tminTimeout: 250,\n\t\t\tmaxTimeout: 30_000,\n\n\t\t\tonFailedAttempt: (error) => {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"failed to reconnect\",\n\t\t\t\t\tattempt: error.attemptNumber,\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t// Cancel retry if aborted\n\t\t\tsignal: this.#abortController.signal,\n\t\t}).catch((err) => {\n\t\t\tif ((err as Error).name === \"AbortError\") {\n\t\t\t\tlogger().info({ msg: \"connection retry aborted\" });\n\t\t\t} else {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"unexpected error in connection retry\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync #connectAndWait() {\n\t\ttry {\n\t\t\t// Create promise for open\n\t\t\tif (this.#onOpenPromise)\n\t\t\t\tthrow new Error(\"#onOpenPromise already defined\");\n\t\t\tthis.#onOpenPromise = promiseWithResolvers((reason) => logger().warn({ msg: \"unhandled open promise rejection\", reason }));\n\n\t\t\tawait this.#connectWebSocket();\n\n\t\t\t// Wait for result\n\t\t\tawait this.#onOpenPromise.promise;\n\t\t} finally {\n\t\t\tthis.#onOpenPromise = undefined;\n\t\t}\n\t}\n\n\tasync #connectWebSocket() {\n\t\tconst { actorId } = await queryActor(\n\t\t\tundefined,\n\t\t\tthis.#actorQuery,\n\t\t\tthis.#driver,\n\t\t);\n\n\t\t// Store actorId early so we can use it for error lookups\n\t\tthis.#actorId = actorId;\n\n\t\tconst ws = await this.#driver.openWebSocket(\n\t\t\tPATH_CONNECT,\n\t\t\tactorId,\n\t\t\tthis.#encoding,\n\t\t\tthis.#params,\n\t\t);\n\t\tlogger().debug({\n\t\t\tmsg: \"opened websocket\",\n\t\t\tconnId: this.#connId,\n\t\t\treadyState: ws.readyState,\n\t\t\tmessageQueueLength: this.#messageQueue.length,\n\t\t});\n\t\tthis.#websocket = ws;\n\t\tws.addEventListener(\"open\", () => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"client websocket open\",\n\t\t\t\tconnId: this.#connId,\n\t\t\t});\n\t\t});\n\t\tws.addEventListener(\"message\", async (ev) => {\n\t\t\ttry {\n\t\t\t\tawait this.#handleOnMessage(ev.data);\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in websocket message handler\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tws.addEventListener(\"close\", async (ev) => {\n\t\t\ttry {\n\t\t\t\tawait this.#handleOnClose(ev);\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in websocket close handler\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tws.addEventListener(\"error\", (_ev) => {\n\t\t\ttry {\n\t\t\t\tthis.#handleOnError();\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in websocket error handler\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Called by the onopen event from drivers. */\n\t#handleOnOpen() {\n\t\t// Connection was disposed before Init message arrived - close the websocket to avoid leak\n\t\tif (this.#disposed) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"handleOnOpen called after dispose, closing websocket\",\n\t\t\t});\n\t\t\tif (this.#websocket) {\n\t\t\t\tthis.#websocket.close(1000, \"Disposed\");\n\t\t\t\tthis.#websocket = undefined;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#connStatus === \"connected\" || this.#openScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#openScheduled = true;\n\n\t\tqueueMicrotask(() => {\n\t\t\tthis.#openScheduled = false;\n\t\t\tif (this.#disposed) {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"handleOnOpen scheduled after dispose, closing websocket\",\n\t\t\t\t});\n\t\t\t\tif (this.#websocket) {\n\t\t\t\t\tthis.#websocket.close(1000, \"Disposed\");\n\t\t\t\t\tthis.#websocket = undefined;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"socket open\",\n\t\t\t\tmessageQueueLength: this.#messageQueue.length,\n\t\t\t\tconnId: this.#connId,\n\t\t\t});\n\n\t\t\t// Update connection state (this also notifies handlers)\n\t\t\tthis.#setConnStatus(\"connected\");\n\n\t\t\t// Resolve open promise\n\t\t\tif (this.#onOpenPromise) {\n\t\t\t\tthis.#onOpenPromise.resolve(undefined);\n\t\t\t} else {\n\t\t\t\tlogger().warn({ msg: \"#onOpenPromise is undefined\" });\n\t\t\t}\n\n\t\t\t// Resubscribe to all active events\n\t\t\tfor (const eventName of this.#eventSubscriptions.keys()) {\n\t\t\t\tthis.#sendSubscription(eventName, true);\n\t\t\t}\n\n\t\t\t// Flush queue\n\t\t\t//\n\t\t\t// If the message fails to send, the message will be re-queued\n\t\t\tconst queue = this.#messageQueue;\n\t\t\tthis.#messageQueue = [];\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"flushing message queue\",\n\t\t\t\tqueueLength: queue.length,\n\t\t\t});\n\t\t\tfor (const msg of queue) {\n\t\t\t\tthis.#sendMessage(msg);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Called by the onmessage event from drivers. */\n\tasync #handleOnMessage(data: any) {\n\t\tlogger().trace({\n\t\t\tmsg: \"received message\",\n\t\t\tdataType: typeof data,\n\t\t\tisBlob: data instanceof Blob,\n\t\t\tisArrayBuffer: data instanceof ArrayBuffer,\n\t\t});\n\n\t\tconst response = await this.#parseMessage(data as ConnMessage);\n\t\tlogger().trace(\n\t\t\tgetLogMessage()\n\t\t\t\t? {\n\t\t\t\t\t\tmsg: \"parsed message\",\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\tjsonStringifyCompat(response).substring(0, 100) +\n\t\t\t\t\t\t\t\"...\",\n\t\t\t\t\t}\n\t\t\t\t: { msg: \"parsed message\" },\n\t\t);\n\n\t\tif (response.body.tag === \"Init\") {\n\t\t\t// Store connection info\n\t\t\tthis.#actorId = response.body.val.actorId;\n\t\t\tthis.#connId = response.body.val.connectionId;\n\t\t\tlogger().trace({\n\t\t\t\tmsg: \"received init message\",\n\t\t\t\tactorId: this.#actorId,\n\t\t\t\tconnId: this.#connId,\n\t\t\t});\n\t\t\tthis.#handleOnOpen();\n\t\t} else if (response.body.tag === \"Error\") {\n\t\t\t// Connection error\n\t\t\tconst { group, code, message, metadata, actionId } =\n\t\t\t\tresponse.body.val;\n\n\t\t\tif (actionId) {\n\t\t\t\tconst inFlight = this.#takeActionInFlight(Number(actionId));\n\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"action error\",\n\t\t\t\t\tactionId: actionId,\n\t\t\t\t\tactionName: inFlight?.name,\n\t\t\t\t\tgroup,\n\t\t\t\t\tcode,\n\t\t\t\t\tmessage,\n\t\t\t\t\tmetadata,\n\t\t\t\t});\n\n\t\t\t\tinFlight.reject(\n\t\t\t\t\tnew errors.ActorError(group, code, message, metadata),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"connection error\",\n\t\t\t\t\tgroup,\n\t\t\t\t\tcode,\n\t\t\t\t\tmessage,\n\t\t\t\t\tmetadata,\n\t\t\t\t});\n\n\t\t\t\t// Check if this is an actor scheduling error and try to get more details\n\t\t\t\tlet errorToThrow = new errors.ActorError(\n\t\t\t\t\tgroup,\n\t\t\t\t\tcode,\n\t\t\t\t\tmessage,\n\t\t\t\t\tmetadata,\n\t\t\t\t);\n\t\t\t\tif (errors.isSchedulingError(group, code) && this.#actorId) {\n\t\t\t\t\tconst schedulingError = await checkForSchedulingError(\n\t\t\t\t\t\tgroup,\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\tthis.#actorId,\n\t\t\t\t\t\tthis.#actorQuery,\n\t\t\t\t\t\tthis.#driver,\n\t\t\t\t\t);\n\t\t\t\t\tif (schedulingError) {\n\t\t\t\t\t\terrorToThrow = schedulingError;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If we have an onOpenPromise, reject it with the error\n\t\t\t\tif (this.#onOpenPromise) {\n\t\t\t\t\tthis.#onOpenPromise.reject(errorToThrow);\n\t\t\t\t}\n\n\t\t\t\t// Reject any in-flight requests\n\t\t\t\tfor (const [id, inFlight] of this.#actionsInFlight.entries()) {\n\t\t\t\t\tinFlight.reject(errorToThrow);\n\t\t\t\t\tthis.#actionsInFlight.delete(id);\n\t\t\t\t}\n\n\t\t\t\tthis.#dispatchActorError(errorToThrow);\n\t\t\t}\n\t\t} else if (response.body.tag === \"ActionResponse\") {\n\t\t\t// Action response OK\n\t\t\tconst { id: actionId } = response.body.val;\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"received action response\",\n\t\t\t\tactionId: Number(actionId),\n\t\t\t\tinFlightCount: this.#actionsInFlight.size,\n\t\t\t\tinFlightIds: Array.from(this.#actionsInFlight.keys()),\n\t\t\t});\n\n\t\t\tconst inFlight = this.#takeActionInFlight(Number(actionId));\n\t\t\tlogger().trace({\n\t\t\t\tmsg: \"resolving action promise\",\n\t\t\t\tactionId,\n\t\t\t\tactionName: inFlight?.name,\n\t\t\t});\n\t\t\tinFlight.resolve(response.body.val);\n\t\t} else if (response.body.tag === \"Event\") {\n\t\t\tlogger().trace({\n\t\t\t\tmsg: \"received event\",\n\t\t\t\tname: response.body.val.name,\n\t\t\t});\n\t\t\tthis.#dispatchEvent(response.body.val);\n\t\t} else {\n\t\t\tassertUnreachable(response.body);\n\t\t}\n\t}\n\n\t/** Called by the onclose event from drivers. */\n\tasync #handleOnClose(event: Event | CloseEvent) {\n\t\t// We can't use `event instanceof CloseEvent` because it's not defined in NodeJS\n\t\tconst closeEvent = event as CloseEvent;\n\t\tconst wasClean = closeEvent.wasClean;\n\t\tconst wasConnected = this.#connStatus === \"connected\";\n\n\t\tlogger().info({\n\t\t\tmsg: \"socket closed\",\n\t\t\tcode: closeEvent.code,\n\t\t\treason: closeEvent.reason,\n\t\t\twasClean,\n\t\t\tdisposed: this.#disposed,\n\t\t\tconnId: this.#connId,\n\t\t});\n\n\t\tthis.#websocket = undefined;\n\n\t\tif (this.#disposed) {\n\t\t\t// Use ActorConnDisposed error and prevent unhandled rejection\n\t\t\tthis.#rejectPendingPromises(new errors.ActorConnDisposed(), true);\n\t\t} else {\n\t\t\tthis.#setConnStatus(\"disconnected\");\n\n\t\t\t// Build error from close event\n\t\t\tlet error: Error;\n\t\t\tconst reason = closeEvent.reason || \"\";\n\t\t\tconst parsed = parseWebSocketCloseReason(reason);\n\n\t\t\tif (parsed) {\n\t\t\t\tconst { group, code } = parsed;\n\n\t\t\t\t// Check if this is a scheduling error\n\t\t\t\tif (errors.isSchedulingError(group, code) && this.#actorId) {\n\t\t\t\t\tconst schedulingError = await checkForSchedulingError(\n\t\t\t\t\t\tgroup,\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\tthis.#actorId,\n\t\t\t\t\t\tthis.#actorQuery,\n\t\t\t\t\t\tthis.#driver,\n\t\t\t\t\t);\n\t\t\t\t\tif (schedulingError) {\n\t\t\t\t\t\terror = schedulingError;\n\t\t\t\t\t} else {\n\t\t\t\t\t\terror = new errors.ActorError(\n\t\t\t\t\t\t\tgroup,\n\t\t\t\t\t\t\tcode,\n\t\t\t\t\t\t\t`Connection closed: ${reason}`,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\terror = new errors.ActorError(\n\t\t\t\t\t\tgroup,\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\t`Connection closed: ${reason}`,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Default error for non-structured close reasons\n\t\t\t\terror = new Error(\n\t\t\t\t\t`${wasClean ? \"Connection closed\" : \"Connection lost\"} (code: ${closeEvent.code}, reason: ${reason})`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.#rejectPendingPromises(error, false);\n\n\t\t\t// Dispatch to error handler if it's an ActorError\n\t\t\tif (error instanceof errors.ActorError) {\n\t\t\t\tthis.#dispatchActorError(error);\n\t\t\t}\n\n\t\t\t// Automatically reconnect if we were connected\n\t\t\tif (wasConnected) {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"triggering reconnect\",\n\t\t\t\t\tconnId: this.#connId,\n\t\t\t\t});\n\t\t\t\tthis.#connectWithRetry();\n\t\t\t}\n\t\t}\n\t}\n\n\t#rejectPendingPromises(error: Error, suppressUnhandled: boolean) {\n\t\tif (this.#onOpenPromise) {\n\t\t\tif (suppressUnhandled) {\n\t\t\t\tthis.#onOpenPromise.promise.catch(() => {});\n\t\t\t}\n\t\t\tthis.#onOpenPromise.reject(error);\n\t\t}\n\n\t\tfor (const actionInfo of this.#actionsInFlight.values()) {\n\t\t\tactionInfo.reject(error);\n\t\t}\n\t\tthis.#actionsInFlight.clear();\n\t}\n\n\t/** Called by the onerror event from drivers. */\n\t#handleOnError() {\n\t\tif (this.#disposed) return;\n\n\t\t// More detailed information will be logged in onclose\n\t\tlogger().warn(\"socket error\");\n\t}\n\n\t#takeActionInFlight(id: number): ActionInFlight {\n\t\tconst inFlight = this.#actionsInFlight.get(id);\n\t\tif (!inFlight) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"action not found in in-flight map\",\n\t\t\t\tlookupId: id,\n\t\t\t\tinFlightCount: this.#actionsInFlight.size,\n\t\t\t\tinFlightIds: Array.from(this.#actionsInFlight.keys()),\n\t\t\t\tinFlightActions: Array.from(\n\t\t\t\t\tthis.#actionsInFlight.entries(),\n\t\t\t\t).map(([id, action]) => ({\n\t\t\t\t\tid,\n\t\t\t\t\tname: action.name,\n\t\t\t\t})),\n\t\t\t});\n\t\t\tthrow new errors.InternalError(`No in flight response for ${id}`);\n\t\t}\n\t\tthis.#actionsInFlight.delete(id);\n\t\tlogger().debug({\n\t\t\tmsg: \"removed action from in-flight map\",\n\t\t\tactionId: id,\n\t\t\tactionName: inFlight.name,\n\t\t\tinFlightCount: this.#actionsInFlight.size,\n\t\t});\n\t\treturn inFlight;\n\t}\n\n\t#dispatchEvent(event: { name: string; args: unknown }) {\n\t\tconst { name, args } = event;\n\n\t\tconst listeners = this.#eventSubscriptions.get(name);\n\t\tif (!listeners) return;\n\n\t\t// Create a new array to avoid issues with listeners being removed during iteration\n\t\tfor (const listener of [...listeners]) {\n\t\t\tlistener.callback(...(args as unknown[]));\n\n\t\t\t// Remove if this was a one-time listener\n\t\t\tif (listener.once) {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t}\n\t\t}\n\n\t\t// Clean up empty listener sets\n\t\tif (listeners.size === 0) {\n\t\t\tthis.#eventSubscriptions.delete(name);\n\t\t}\n\t}\n\n\t#dispatchActorError(error: errors.ActorError) {\n\t\t// Call all registered error handlers\n\t\tfor (const handler of [...this.#errorHandlers]) {\n\t\t\ttry {\n\t\t\t\thandler(error);\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in connection error handler\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t#addEventSubscription<Args extends Array<unknown>>(\n\t\teventName: string,\n\t\tcallback: (...args: Args) => void,\n\t\tonce: boolean,\n\t): EventUnsubscribe {\n\t\tconst listener: EventSubscriptions<Args> = {\n\t\t\tcallback,\n\t\t\tonce,\n\t\t};\n\n\t\tlet subscriptionSet = this.#eventSubscriptions.get(eventName);\n\t\tif (subscriptionSet === undefined) {\n\t\t\tsubscriptionSet = new Set();\n\t\t\tthis.#eventSubscriptions.set(eventName, subscriptionSet);\n\t\t\tthis.#sendSubscription(eventName, true);\n\t\t}\n\t\tsubscriptionSet.add(listener);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tconst listeners = this.#eventSubscriptions.get(eventName);\n\t\t\tif (listeners) {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t\tif (listeners.size === 0) {\n\t\t\t\t\tthis.#eventSubscriptions.delete(eventName);\n\t\t\t\t\tthis.#sendSubscription(eventName, false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Subscribes to an event that will happen repeatedly.\n\t *\n\t * @template Args - The type of arguments the event callback will receive.\n\t * @param {string} eventName - The name of the event to subscribe to.\n\t * @param {(...args: Args) => void} callback - The callback function to execute when the event is triggered.\n\t * @returns {EventUnsubscribe} - A function to unsubscribe from the event.\n\t * @see {@link https://rivet.dev/docs/events|Events Documentation}\n\t */\n\ton<Args extends Array<unknown> = unknown[]>(\n\t\teventName: string,\n\t\tcallback: (...args: Args) => void,\n\t): EventUnsubscribe {\n\t\treturn this.#addEventSubscription<Args>(eventName, callback, false);\n\t}\n\n\t/**\n\t * Subscribes to an event that will be triggered only once.\n\t *\n\t * @template Args - The type of arguments the event callback will receive.\n\t * @param {string} eventName - The name of the event to subscribe to.\n\t * @param {(...args: Args) => void} callback - The callback function to execute when the event is triggered.\n\t * @returns {EventUnsubscribe} - A function to unsubscribe from the event.\n\t * @see {@link https://rivet.dev/docs/events|Events Documentation}\n\t */\n\tonce<Args extends Array<unknown> = unknown[]>(\n\t\teventName: string,\n\t\tcallback: (...args: Args) => void,\n\t): EventUnsubscribe {\n\t\treturn this.#addEventSubscription<Args>(eventName, callback, true);\n\t}\n\n\t/**\n\t * Subscribes to connection errors.\n\t *\n\t * @param {ActorErrorCallback} callback - The callback function to execute when a connection error occurs.\n\t * @returns {() => void} - A function to unsubscribe from the error handler.\n\t */\n\tonError(callback: ActorErrorCallback): () => void {\n\t\tthis.#errorHandlers.add(callback);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tthis.#errorHandlers.delete(callback);\n\t\t};\n\t}\n\n\t/**\n\t * Returns the current connection status.\n\t *\n\t * @returns {ActorConnStatus} - The current connection status.\n\t */\n\tget connStatus(): ActorConnStatus {\n\t\treturn this.#connStatus;\n\t}\n\n\t/**\n\t * Returns whether the connection is currently open.\n\t *\n\t * @deprecated Use `connStatus` instead.\n\t * @returns {boolean} - True if the connection is open, false otherwise.\n\t */\n\tget isConnected(): boolean {\n\t\treturn this.#connStatus === \"connected\";\n\t}\n\n\t/**\n\t * Subscribes to connection open events.\n\t *\n\t * This is called when the WebSocket connection is established and the Init message is received.\n\t *\n\t * @param {ConnectionStateCallback} callback - The callback function to execute when the connection opens.\n\t * @returns {() => void} - A function to unsubscribe from the open handler.\n\t */\n\tonOpen(callback: ConnectionStateCallback): () => void {\n\t\tthis.#openHandlers.add(callback);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tthis.#openHandlers.delete(callback);\n\t\t};\n\t}\n\n\t/**\n\t * Subscribes to connection close events.\n\t *\n\t * This is called when the WebSocket connection is closed. The connection will automatically\n\t * attempt to reconnect unless disposed.\n\t *\n\t * @param {ConnectionStateCallback} callback - The callback function to execute when the connection closes.\n\t * @returns {() => void} - A function to unsubscribe from the close handler.\n\t */\n\tonClose(callback: ConnectionStateCallback): () => void {\n\t\tthis.#closeHandlers.add(callback);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tthis.#closeHandlers.delete(callback);\n\t\t};\n\t}\n\n\t/**\n\t * Subscribes to connection status changes.\n\t *\n\t * This is called whenever the connection status changes between Disconnected, Connecting, and Connected.\n\t *\n\t * @param {StatusChangeCallback} callback - The callback function to execute when the status changes.\n\t * @returns {() => void} - A function to unsubscribe from the status change handler.\n\t */\n\tonStatusChange(callback: StatusChangeCallback): () => void {\n\t\tthis.#statusChangeHandlers.add(callback);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tthis.#statusChangeHandlers.delete(callback);\n\t\t};\n\t}\n\n\t#sendMessage(\n\t\tmessage: {\n\t\t\tbody:\n\t\t\t\t| {\n\t\t\t\t\t\ttag: \"ActionRequest\";\n\t\t\t\t\t\tval: { id: bigint; name: string; args: unknown };\n\t\t\t\t }\n\t\t\t\t| {\n\t\t\t\t\t\ttag: \"SubscriptionRequest\";\n\t\t\t\t\t\tval: { eventName: string; subscribe: boolean };\n\t\t\t\t };\n\t\t},\n\t\topts?: SendHttpMessageOpts,\n\t) {\n\t\tif (this.#disposed) {\n\t\t\tif (opts?.ephemeral) {\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tthrow new errors.ActorConnDisposed();\n\t\t\t}\n\t\t}\n\n\t\tlet queueMessage = false;\n\t\tif (this.#websocket) {\n\t\t\tconst readyState = this.#websocket.readyState;\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"websocket send attempt\",\n\t\t\t\treadyState,\n\t\t\t\treadyStateString:\n\t\t\t\t\treadyState === 0\n\t\t\t\t\t\t? \"CONNECTING\"\n\t\t\t\t\t\t: readyState === 1\n\t\t\t\t\t\t\t? \"OPEN\"\n\t\t\t\t\t\t\t: readyState === 2\n\t\t\t\t\t\t\t\t? \"CLOSING\"\n\t\t\t\t\t\t\t\t: \"CLOSED\",\n\t\t\t\tconnId: this.#connId,\n\t\t\t\tmessageType: (message.body as any).tag,\n\t\t\t\tactionName: (message.body as any).val?.name,\n\t\t\t});\n\t\t\tif (this.#connStatus !== \"connected\") {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"websocket init pending, queueing message\",\n\t\t\t\t\tconnStatus: this.#connStatus,\n\t\t\t\t\tmessageType: (message.body as any).tag,\n\t\t\t\t});\n\t\t\t\tqueueMessage = true;\n\t\t\t} else if (readyState === 1) {\n\t\t\t\ttry {\n\t\t\t\t\tconst messageSerialized = serializeWithEncoding(\n\t\t\t\t\t\tthis.#encoding,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\tTO_SERVER_VERSIONED,\n\t\t\t\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\t\t\tToServerSchema,\n\t\t\t\t\t\t// JSON: args is the raw value\n\t\t\t\t\t\t(msg): ToServerJson => msg as ToServerJson,\n\t\t\t\t\t\t// BARE: args needs to be CBOR-encoded to ArrayBuffer\n\t\t\t\t\t\t(msg): protocol.ToServer => {\n\t\t\t\t\t\t\tif (msg.body.tag === \"ActionRequest\") {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\t\ttag: \"ActionRequest\",\n\t\t\t\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\t\t\t\tid: msg.body.val.id,\n\t\t\t\t\t\t\t\t\t\t\tname: msg.body.val.name,\n\t\t\t\t\t\t\t\t\t\t\targs: bufferToArrayBuffer(\n\t\t\t\t\t\t\t\t\t\t\t\tcbor.encode(msg.body.val.args),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t},\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\t} else {\n\t\t\t\t\t\t\t\treturn msg as protocol.ToServer;\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\tthis.#websocket.send(messageSerialized);\n\t\t\t\t\tlogger().trace({\n\t\t\t\t\t\tmsg: \"sent websocket message\",\n\t\t\t\t\t\tlen: messageLength(messageSerialized),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"failed to send message, added to queue\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tconnId: this.#connId,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Assuming the socket is disconnected and will be reconnected soon\n\t\t\t\t\tqueueMessage = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"websocket not open, queueing message\",\n\t\t\t\t\treadyState,\n\t\t\t\t});\n\t\t\t\tqueueMessage = true;\n\t\t\t}\n\t\t} else {\n\t\t\t// No websocket connected yet\n\t\t\tlogger().debug({ msg: \"no websocket, queueing message\" });\n\t\t\tqueueMessage = true;\n\t\t}\n\n\t\tif (!opts?.ephemeral && queueMessage) {\n\t\t\tthis.#messageQueue.push(message);\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"queued connection message\",\n\t\t\t\tqueueLength: this.#messageQueue.length,\n\t\t\t\tconnId: this.#connId,\n\t\t\t\tmessageType: (message.body as any).tag,\n\t\t\t\tactionName: (message.body as any).val?.name,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync #parseMessage(data: ConnMessage): Promise<{\n\t\tbody:\n\t\t\t| { tag: \"Init\"; val: { actorId: string; connectionId: string } }\n\t\t\t| {\n\t\t\t\t\ttag: \"Error\";\n\t\t\t\t\tval: {\n\t\t\t\t\t\tgroup: string;\n\t\t\t\t\t\tcode: string;\n\t\t\t\t\t\tmessage: string;\n\t\t\t\t\t\tmetadata: unknown;\n\t\t\t\t\t\tactionId: bigint | null;\n\t\t\t\t\t};\n\t\t\t }\n\t\t\t| { tag: \"ActionResponse\"; val: { id: bigint; output: unknown } }\n\t\t\t| { tag: \"Event\"; val: { name: string; args: unknown } };\n\t}> {\n\t\tinvariant(this.#websocket, \"websocket must be defined\");\n\n\t\tconst buffer = await inputDataToBuffer(data);\n\n\t\treturn deserializeWithEncoding(\n\t\t\tthis.#encoding,\n\t\t\tbuffer,\n\t\t\tTO_CLIENT_VERSIONED,\n\t\t\tToClientSchema,\n\t\t\t// JSON: values are already the correct type\n\t\t\t(msg): ToClientJson => msg as ToClientJson,\n\t\t\t// BARE: need to decode ArrayBuffer fields back to unknown\n\t\t\t(msg): any => {\n\t\t\t\tif (msg.body.tag === \"Error\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Error\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tgroup: msg.body.val.group,\n\t\t\t\t\t\t\t\tcode: msg.body.val.code,\n\t\t\t\t\t\t\t\tmessage: msg.body.val.message,\n\t\t\t\t\t\t\t\tmetadata: msg.body.val.metadata\n\t\t\t\t\t\t\t\t\t? cbor.decode(\n\t\t\t\t\t\t\t\t\t\t\tnew Uint8Array(\n\t\t\t\t\t\t\t\t\t\t\t\tmsg.body.val.metadata,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\tactionId: msg.body.val.actionId,\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 (msg.body.tag === \"ActionResponse\") {\n\t\t\t\t\treturn {\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\tid: msg.body.val.id,\n\t\t\t\t\t\t\t\toutput: cbor.decode(\n\t\t\t\t\t\t\t\t\tnew Uint8Array(msg.body.val.output),\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 (msg.body.tag === \"Event\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Event\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tname: msg.body.val.name,\n\t\t\t\t\t\t\t\targs: cbor.decode(\n\t\t\t\t\t\t\t\t\tnew Uint8Array(msg.body.val.args),\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\t// Init has no ArrayBuffer fields\n\t\t\t\t\treturn msg;\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Get the actor ID (for testing purposes).\n\t * @internal\n\t */\n\tget actorId(): string | undefined {\n\t\treturn this.#actorId;\n\t}\n\n\t/**\n\t * Get the connection ID (for testing purposes).\n\t * @internal\n\t */\n\tget connId(): string | undefined {\n\t\treturn this.#connId;\n\t}\n\n\t/**\n\t * Get the connection ID (for testing purposes).\n\t * @internal\n\t * @deprecated Use `connId` instead.\n\t */\n\tget connectionId(): string | undefined {\n\t\treturn this.#connId;\n\t}\n\n\t/**\n\t * Disconnects from the actor.\n\t *\n\t * @returns {Promise<void>} A promise that resolves when the socket is gracefully closed.\n\t */\n\tasync dispose(): Promise<void> {\n\t\t// Internally, this \"disposes\" the connection\n\n\t\tif (this.#disposed) {\n\t\t\tlogger().warn({ msg: \"connection already disconnected\" });\n\t\t\treturn;\n\t\t}\n\t\tthis.#disposed = true;\n\n\t\tlogger().debug({ msg: \"disposing actor conn\" });\n\n\t\t// Set status to Idle (intentionally closed, no auto-reconnect)\n\t\tthis.#setConnStatus(\"idle\");\n\n\t\t// Clear interval so NodeJS process can exit\n\t\tclearInterval(this.#keepNodeAliveInterval);\n\n\t\t// Abort retry loop\n\t\tthis.#abortController.abort();\n\n\t\t// Remove from registry\n\t\tthis.#client[ACTOR_CONNS_SYMBOL].delete(this);\n\n\t\t// Close websocket (#handleOnClose will reject pending promises)\n\t\tif (this.#websocket) {\n\t\t\tconst ws = this.#websocket;\n\t\t\tif (\n\t\t\t\tws.readyState !== 2 /* CLOSING */ &&\n\t\t\t\tws.readyState !== 3 /* CLOSED */\n\t\t\t) {\n\t\t\t\tconst { promise, resolve } = promiseWithResolvers((reason) => logger().warn({ msg: \"unhandled websocket close promise rejection\", reason }));\n\t\t\t\tws.addEventListener(\"close\", () => resolve(undefined));\n\t\t\t\tws.close(1000, \"Disposed\");\n\t\t\t\tawait promise;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#rejectPendingPromises(new errors.ActorConnDisposed(), true);\n\t\t}\n\t\tthis.#websocket = undefined;\n\t}\n\n\t#sendSubscription(eventName: string, subscribe: boolean) {\n\t\tthis.#sendMessage(\n\t\t\t{\n\t\t\t\tbody: {\n\t\t\t\t\ttag: \"SubscriptionRequest\",\n\t\t\t\t\tval: {\n\t\t\t\t\t\teventName,\n\t\t\t\t\t\tsubscribe,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ ephemeral: true },\n\t\t);\n\t}\n}\n\n/**\n * Connection to a actor. Allows calling actor's remote procedure calls with inferred types. See {@link ActorConnRaw} for underlying methods.\n *\n * @example\n * ```\n * const room = client.connect<ChatRoom>(...etc...);\n * // This calls the action named `sendMessage` on the `ChatRoom` actor.\n * await room.sendMessage('Hello, world!');\n * ```\n *\n * Private methods (e.g. those starting with `_`) are automatically excluded.\n *\n * @template AD The actor class that this connection is for.\n * @see {@link ActorConnRaw}\n */\nexport type ActorConn<AD extends AnyActorDefinition> = ActorConnRaw &\n\tActorDefinitionActions<AD>;\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","export const KEYS = {\n\tPERSIST_DATA: Uint8Array.from([1]),\n\tCONN_PREFIX: Uint8Array.from([2]), // Prefix for connection keys\n\tINSPECTOR_TOKEN: Uint8Array.from([3]), // Inspector token key\n\tKV: Uint8Array.from([4]), // Prefix for user-facing KV storage\n\tQUEUE_PREFIX: Uint8Array.from([5]), // Prefix for queue storage\n\tWORKFLOW_PREFIX: Uint8Array.from([6]), // Prefix for workflow storage\n\tTRACES_PREFIX: Uint8Array.from([7]), // Prefix for traces storage\n\tSQLITE_PREFIX: Uint8Array.from([8]), // Prefix for SQLite VFS data\n};\n\nexport const STORAGE_VERSION = {\n\tQUEUE: 1,\n\tWORKFLOW: 1,\n\tTRACES: 1,\n\tSQLITE: 1,\n} as const;\n\nconst STORAGE_VERSION_BYTES = {\n\tQUEUE: Uint8Array.from([STORAGE_VERSION.QUEUE]),\n\tWORKFLOW: Uint8Array.from([STORAGE_VERSION.WORKFLOW]),\n\tTRACES: Uint8Array.from([STORAGE_VERSION.TRACES]),\n\tSQLITE: Uint8Array.from([STORAGE_VERSION.SQLITE]),\n} as const;\n\nconst QUEUE_NAMESPACE = {\n\tMETADATA: Uint8Array.from([1]),\n\tMESSAGES: Uint8Array.from([2]),\n} as const;\n\nconst QUEUE_ID_BYTES = 8;\n\nfunction concatPrefix(prefix: Uint8Array, suffix: Uint8Array): Uint8Array {\n\tconst merged = new Uint8Array(prefix.length + suffix.length);\n\tmerged.set(prefix, 0);\n\tmerged.set(suffix, prefix.length);\n\treturn merged;\n}\n\nconst QUEUE_STORAGE_PREFIX = concatPrefix(\n\tKEYS.QUEUE_PREFIX,\n\tSTORAGE_VERSION_BYTES.QUEUE,\n);\nconst QUEUE_METADATA_KEY = concatPrefix(\n\tQUEUE_STORAGE_PREFIX,\n\tQUEUE_NAMESPACE.METADATA,\n);\nconst QUEUE_MESSAGES_PREFIX = concatPrefix(\n\tQUEUE_STORAGE_PREFIX,\n\tQUEUE_NAMESPACE.MESSAGES,\n);\nconst WORKFLOW_STORAGE_PREFIX = concatPrefix(\n\tKEYS.WORKFLOW_PREFIX,\n\tSTORAGE_VERSION_BYTES.WORKFLOW,\n);\nconst TRACES_STORAGE_PREFIX = concatPrefix(\n\tKEYS.TRACES_PREFIX,\n\tSTORAGE_VERSION_BYTES.TRACES,\n);\nconst SQLITE_STORAGE_PREFIX = concatPrefix(\n\tKEYS.SQLITE_PREFIX,\n\tSTORAGE_VERSION_BYTES.SQLITE,\n);\n\n// Helper to create a prefixed key for user-facing KV storage\nexport function makePrefixedKey(key: Uint8Array): Uint8Array {\n\tconst prefixed = new Uint8Array(KEYS.KV.length + key.length);\n\tprefixed.set(KEYS.KV, 0);\n\tprefixed.set(key, KEYS.KV.length);\n\treturn prefixed;\n}\n\n// Helper to remove the prefix from a key\nexport function removePrefixFromKey(prefixedKey: Uint8Array): Uint8Array {\n\treturn prefixedKey.slice(KEYS.KV.length);\n}\n\nexport function makeWorkflowKey(key: Uint8Array): Uint8Array {\n\treturn concatPrefix(WORKFLOW_STORAGE_PREFIX, key);\n}\n\nexport function makeTracesKey(key: Uint8Array): Uint8Array {\n\treturn concatPrefix(TRACES_STORAGE_PREFIX, key);\n}\n\nexport function workflowStoragePrefix(): Uint8Array {\n\treturn Uint8Array.from(WORKFLOW_STORAGE_PREFIX);\n}\n\nexport function tracesStoragePrefix(): Uint8Array {\n\treturn Uint8Array.from(TRACES_STORAGE_PREFIX);\n}\n\nexport function sqliteStoragePrefix(): Uint8Array {\n\treturn Uint8Array.from(SQLITE_STORAGE_PREFIX);\n}\n\nexport function queueStoragePrefix(): Uint8Array {\n\treturn Uint8Array.from(QUEUE_STORAGE_PREFIX);\n}\n\nexport function queueMetadataKey(): Uint8Array {\n\treturn Uint8Array.from(QUEUE_METADATA_KEY);\n}\n\nexport function queueMessagesPrefix(): Uint8Array {\n\treturn Uint8Array.from(QUEUE_MESSAGES_PREFIX);\n}\n\n// Helper to create a connection key\nexport function makeConnKey(connId: string): Uint8Array {\n\tconst encoder = new TextEncoder();\n\tconst connIdBytes = encoder.encode(connId);\n\tconst key = new Uint8Array(KEYS.CONN_PREFIX.length + connIdBytes.length);\n\tkey.set(KEYS.CONN_PREFIX, 0);\n\tkey.set(connIdBytes, KEYS.CONN_PREFIX.length);\n\treturn key;\n}\n\n// Helper to create a queue message key\nexport function makeQueueMessageKey(id: bigint): Uint8Array {\n\tconst key = new Uint8Array(QUEUE_MESSAGES_PREFIX.length + QUEUE_ID_BYTES);\n\tkey.set(QUEUE_MESSAGES_PREFIX, 0);\n\tconst view = new DataView(key.buffer, key.byteOffset, key.byteLength);\n\tview.setBigUint64(QUEUE_MESSAGES_PREFIX.length, id, false);\n\treturn key;\n}\n\n// Helper to decode a queue message key\nexport function decodeQueueMessageKey(key: Uint8Array): bigint {\n\tconst offset = QUEUE_MESSAGES_PREFIX.length;\n\tif (key.length < offset + QUEUE_ID_BYTES) {\n\t\tthrow new Error(\"Queue key is too short\");\n\t}\n\tfor (let i = 0; i < QUEUE_MESSAGES_PREFIX.length; i++) {\n\t\tif (key[i] !== QUEUE_MESSAGES_PREFIX[i]) {\n\t\t\tthrow new Error(\"Queue key has invalid prefix\");\n\t\t}\n\t}\n\tconst view = new DataView(\n\t\tkey.buffer,\n\t\tkey.byteOffset + offset,\n\t\tQUEUE_ID_BYTES,\n\t);\n\treturn view.getBigUint64(0, false);\n}\n","import type { Context as HonoContext } from \"hono\";\nimport * as errors from \"@/actor/errors\";\nimport { stringifyError } from \"@/common/utils\";\nimport type { ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\nimport { ActorSchedulingError } from \"./errors\";\nimport { logger } from \"./log\";\n\n/**\n * Query the manager driver to get or create a actor based on the provided query\n */\nexport async function queryActor(\n\tc: HonoContext | undefined,\n\tquery: ActorQuery,\n\tmanagerDriver: ManagerDriver,\n): Promise<{ actorId: string }> {\n\tlogger().debug({ msg: \"querying actor\", query: JSON.stringify(query) });\n\tlet actorOutput: { actorId: string };\n\tif (\"getForId\" in query) {\n\t\tconst output = await managerDriver.getForId({\n\t\t\tc,\n\t\t\tname: query.getForId.name,\n\t\t\tactorId: query.getForId.actorId,\n\t\t});\n\t\tif (!output) throw new errors.ActorNotFound(query.getForId.actorId);\n\t\tactorOutput = output;\n\t} else if (\"getForKey\" in query) {\n\t\tconst existingActor = await managerDriver.getWithKey({\n\t\t\tc,\n\t\t\tname: query.getForKey.name,\n\t\t\tkey: query.getForKey.key,\n\t\t});\n\t\tif (!existingActor) {\n\t\t\tthrow new errors.ActorNotFound(\n\t\t\t\t`${query.getForKey.name}:${JSON.stringify(query.getForKey.key)}`,\n\t\t\t);\n\t\t}\n\t\tactorOutput = existingActor;\n\t} else if (\"getOrCreateForKey\" in query) {\n\t\tconst getOrCreateOutput = await managerDriver.getOrCreateWithKey({\n\t\t\tc,\n\t\t\tname: query.getOrCreateForKey.name,\n\t\t\tkey: query.getOrCreateForKey.key,\n\t\t\tinput: query.getOrCreateForKey.input,\n\t\t\tregion: query.getOrCreateForKey.region,\n\t\t});\n\t\tactorOutput = {\n\t\t\tactorId: getOrCreateOutput.actorId,\n\t\t};\n\t} else if (\"create\" in query) {\n\t\tconst createOutput = await managerDriver.createActor({\n\t\t\tc,\n\t\t\tname: query.create.name,\n\t\t\tkey: query.create.key,\n\t\t\tinput: query.create.input,\n\t\t\tregion: query.create.region,\n\t\t});\n\t\tactorOutput = {\n\t\t\tactorId: createOutput.actorId,\n\t\t};\n\t} else {\n\t\tthrow new errors.InvalidRequest(\"Invalid query format\");\n\t}\n\n\tlogger().debug({ msg: \"actor query result\", actorId: actorOutput.actorId });\n\treturn { actorId: actorOutput.actorId };\n}\n\n/**\n * Extract the actor name from a query.\n */\nexport function getActorNameFromQuery(query: ActorQuery): string {\n\tif (\"getForId\" in query) return query.getForId.name;\n\tif (\"getForKey\" in query) return query.getForKey.name;\n\tif (\"getOrCreateForKey\" in query) return query.getOrCreateForKey.name;\n\tif (\"create\" in query) return query.create.name;\n\tthrow new errors.InvalidRequest(\"Invalid query format\");\n}\n\n/**\n * Fetch actor details and check for scheduling errors.\n */\nexport async function checkForSchedulingError(\n\tgroup: string,\n\tcode: string,\n\tactorId: string,\n\tquery: ActorQuery,\n\tdriver: ManagerDriver,\n): Promise<ActorSchedulingError | null> {\n\tconst name = getActorNameFromQuery(query);\n\n\ttry {\n\t\tconst actor = await driver.getForId({ name, actorId });\n\n\t\tif (actor?.error) {\n\t\t\tlogger().info({\n\t\t\t\tmsg: \"found actor scheduling error\",\n\t\t\t\tactorId,\n\t\t\t\terror: actor.error,\n\t\t\t});\n\t\t\treturn new ActorSchedulingError(group, code, actorId, actor.error);\n\t\t}\n\t} catch (err) {\n\t\tlogger().warn({\n\t\t\tmsg: \"failed to fetch actor details for scheduling error check\",\n\t\t\tactorId,\n\t\t\terror: stringifyError(err),\n\t\t});\n\t}\n\n\treturn null;\n}\n","import * as cbor from \"cbor-x\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport { HEADER_CONN_PARAMS, HEADER_ENCODING } from \"@/driver-helpers/mod\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tHTTP_QUEUE_SEND_REQUEST_VERSIONED,\n\tHTTP_QUEUE_SEND_RESPONSE_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype HttpQueueSendRequest as HttpQueueSendRequestJson,\n\tHttpQueueSendRequestSchema,\n\ttype HttpQueueSendResponse as HttpQueueSendResponseJson,\n\tHttpQueueSendResponseSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport { sendHttpRequest } from \"./utils\";\n\nexport interface QueueSender {\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions: QueueSendWaitOptions,\n\t): Promise<QueueSendResult>;\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendNoWaitOptions,\n\t): Promise<void>;\n}\n\nexport interface QueueSendWaitOptions {\n\twait: true;\n\ttimeout?: number;\n\tsignal?: AbortSignal;\n}\n\nexport interface QueueSendNoWaitOptions {\n\twait?: false;\n\ttimeout?: never;\n\tsignal?: AbortSignal;\n}\n\nexport type QueueSendOptions = QueueSendWaitOptions | QueueSendNoWaitOptions;\n\nexport interface QueueSendResult {\n\tstatus: \"completed\" | \"timedOut\";\n\tresponse?: unknown;\n}\n\ninterface QueueSenderOptions {\n\tencoding: Encoding;\n\tparams: unknown;\n\tcustomFetch: (request: Request) => Promise<Response>;\n}\n\nexport function createQueueSender(senderOptions: QueueSenderOptions): QueueSender {\n\tasync function send(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions: QueueSendWaitOptions,\n\t): Promise<QueueSendResult>;\n\tasync function send(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendNoWaitOptions,\n\t): Promise<void>;\n\tasync function send(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendOptions,\n\t): Promise<QueueSendResult | void> {\n\t\tconst wait = options?.wait ?? false;\n\t\tconst timeout = options?.timeout;\n\n\t\tconst result = await sendHttpRequest<\n\t\t\tprotocol.HttpQueueSendRequest,\n\t\t\tprotocol.HttpQueueSendResponse,\n\t\t\tHttpQueueSendRequestJson,\n\t\t\tHttpQueueSendResponseJson,\n\t\t\t{ body: unknown; wait?: boolean; timeout?: number; name?: string },\n\t\t\tQueueSendResult\n\t\t>({\n\t\t\turl: `http://actor/queue/${encodeURIComponent(name)}`,\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t[HEADER_ENCODING]: senderOptions.encoding,\n\t\t\t\t...(senderOptions.params !== undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t[HEADER_CONN_PARAMS]: JSON.stringify(\n\t\t\t\t\t\t\t\tsenderOptions.params,\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},\n\t\t\tbody: { body, wait, timeout },\n\t\t\tencoding: senderOptions.encoding,\n\t\t\tcustomFetch: senderOptions.customFetch,\n\t\t\tsignal: options?.signal,\n\t\t\trequestVersion: CLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\trequestVersionedDataHandler: HTTP_QUEUE_SEND_REQUEST_VERSIONED,\n\t\t\tresponseVersion: CLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\tresponseVersionedDataHandler:\n\t\t\t\tHTTP_QUEUE_SEND_RESPONSE_VERSIONED,\n\t\t\trequestZodSchema: HttpQueueSendRequestSchema,\n\t\t\tresponseZodSchema: HttpQueueSendResponseSchema,\n\t\t\trequestToJson: (value): HttpQueueSendRequestJson => ({\n\t\t\t\t...value,\n\t\t\t\tname,\n\t\t\t}),\n\t\t\trequestToBare: (value): protocol.HttpQueueSendRequest => ({\n\t\t\t\tname: value.name ?? name,\n\t\t\t\tbody: bufferToArrayBuffer(cbor.encode(value.body)),\n\t\t\t\twait: value.wait ?? false,\n\t\t\t\ttimeout: value.timeout !== undefined ? BigInt(value.timeout) : null,\n\t\t\t}),\n\t\t\tresponseFromJson: (json): QueueSendResult => {\n\t\t\t\tif (json.response === undefined) {\n\t\t\t\t\treturn { status: json.status as \"completed\" | \"timedOut\" };\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: json.status as \"completed\" | \"timedOut\",\n\t\t\t\t\tresponse: json.response,\n\t\t\t\t};\n\t\t\t},\n\t\t\tresponseFromBare: (bare): QueueSendResult => {\n\t\t\t\tif (bare.response === null || bare.response === undefined) {\n\t\t\t\t\treturn { status: bare.status as \"completed\" | \"timedOut\" };\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: bare.status as \"completed\" | \"timedOut\",\n\t\t\t\t\tresponse: cbor.decode(new Uint8Array(bare.response)),\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\n\t\tif (wait) {\n\t\t\treturn result;\n\t\t}\n\t\treturn;\n\t}\n\n\treturn {\n\t\tsend,\n\t};\n}\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 * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport type { AnyActorDefinition } from \"@/actor/definition\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport { assertUnreachable } from \"@/actor/utils\";\nimport { deconstructError } from \"@/common/utils\";\nimport {\n\tHEADER_CONN_PARAMS,\n\tHEADER_ENCODING,\n\ttype ManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\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} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype HttpActionRequest as HttpActionRequestJson,\n\tHttpActionRequestSchema,\n\ttype HttpActionResponse as HttpActionResponseJson,\n\tHttpActionResponseSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { ActorDefinitionActions } from \"./actor-common\";\nimport { type ActorConn, ActorConnRaw } from \"./actor-conn\";\nimport { checkForSchedulingError, queryActor } from \"./actor-query\";\nimport { type ClientRaw, CREATE_ACTOR_CONN_PROXY } from \"./client\";\nimport { ActorError, isSchedulingError } from \"./errors\";\nimport { logger } from \"./log\";\nimport {\n\tcreateQueueSender,\n\ttype QueueSendNoWaitOptions,\n\ttype QueueSendOptions,\n\ttype QueueSendResult,\n\ttype QueueSendWaitOptions,\n} from \"./queue\";\nimport { rawHttpFetch, rawWebSocket } from \"./raw-utils\";\nimport { sendHttpRequest } from \"./utils\";\n\n/**\n * Provides underlying functions for stateless {@link ActorHandle} for action calls.\n * Similar to ActorConnRaw but doesn't maintain a connection.\n *\n * @see {@link ActorHandle}\n */\nexport class ActorHandleRaw {\n\t#client: ClientRaw;\n\t#driver: ManagerDriver;\n\t#encoding: Encoding;\n\t#actorQuery: ActorQuery;\n\t#params: unknown;\n\t#queueSender: ReturnType<typeof createQueueSender>;\n\n\t/**\n\t * Do not call this directly.\n\t *\n\t * Creates an instance of ActorHandleRaw.\n\t *\n\t * @protected\n\t */\n\tpublic constructor(\n\t\tclient: any,\n\t\tdriver: ManagerDriver,\n\t\tparams: unknown,\n\t\tencoding: Encoding,\n\t\tactorQuery: ActorQuery,\n\t) {\n\t\tthis.#client = client;\n\t\tthis.#driver = driver;\n\t\tthis.#encoding = encoding;\n\t\tthis.#actorQuery = actorQuery;\n\t\tthis.#params = params;\n\t\tthis.#queueSender = createQueueSender({\n\t\t\tencoding: this.#encoding,\n\t\t\tparams: this.#params,\n\t\t\tcustomFetch: async (request: Request) => {\n\t\t\t\tconst { actorId } = await queryActor(\n\t\t\t\t\tundefined,\n\t\t\t\t\tthis.#actorQuery,\n\t\t\t\t\tthis.#driver,\n\t\t\t\t);\n\t\t\t\treturn this.#driver.sendRequest(actorId, request);\n\t\t\t},\n\t\t});\n\t}\n\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions: QueueSendWaitOptions,\n\t): Promise<QueueSendResult>;\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendNoWaitOptions,\n\t): Promise<void>;\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendOptions,\n\t): Promise<QueueSendResult | void> {\n\t\treturn this.#queueSender.send(name, body, options as any);\n\t}\n\n\t/**\n\t * Call a raw action. This method sends an HTTP request to invoke the named action.\n\t *\n\t * @see {@link ActorHandle}\n\t * @template Args - The type of arguments to pass to the action function.\n\t * @template Response - The type of the response returned by the action function.\n\t */\n\tasync action<\n\t\tArgs extends Array<unknown> = unknown[],\n\t\tResponse = unknown,\n\t>(opts: {\n\t\tname: string;\n\t\targs: Args;\n\t\tsignal?: AbortSignal;\n\t}): Promise<Response> {\n\t\t// Track actorId for scheduling error lookups\n\t\tlet actorId: string | undefined;\n\n\t\ttry {\n\t\t\t// Get the actor ID\n\t\t\tconst result = await queryActor(\n\t\t\t\tundefined,\n\t\t\t\tthis.#actorQuery,\n\t\t\t\tthis.#driver,\n\t\t\t);\n\t\t\tactorId = result.actorId;\n\t\t\tlogger().debug({ msg: \"found actor for action\", actorId });\n\t\t\tinvariant(actorId, \"Missing actor ID\");\n\n\t\t\t// Invoke the action\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"handling action\",\n\t\t\t\tname: opts.name,\n\t\t\t\tencoding: this.#encoding,\n\t\t\t});\n\t\t\tconst responseData = await sendHttpRequest<\n\t\t\t\tprotocol.HttpActionRequest, // Bare type\n\t\t\t\tprotocol.HttpActionResponse, // Bare type\n\t\t\t\tHttpActionRequestJson, // Json type\n\t\t\t\tHttpActionResponseJson, // Json type\n\t\t\t\tunknown[], // Request type (the args array)\n\t\t\t\tResponse // Response type (the output value)\n\t\t\t>({\n\t\t\t\turl: `http://actor/action/${encodeURIComponent(opts.name)}`,\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t[HEADER_ENCODING]: this.#encoding,\n\t\t\t\t\t...(this.#params !== undefined\n\t\t\t\t\t\t? { [HEADER_CONN_PARAMS]: JSON.stringify(this.#params) }\n\t\t\t\t\t\t: {}),\n\t\t\t\t},\n\t\t\t\tbody: opts.args,\n\t\t\t\tencoding: this.#encoding,\n\t\t\t\tcustomFetch: this.#driver.sendRequest.bind(\n\t\t\t\t\tthis.#driver,\n\t\t\t\t\tactorId,\n\t\t\t\t),\n\t\t\t\tsignal: opts?.signal,\n\t\t\t\trequestVersion: CLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\trequestVersionedDataHandler: HTTP_ACTION_REQUEST_VERSIONED,\n\t\t\t\tresponseVersion: CLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\tresponseVersionedDataHandler: HTTP_ACTION_RESPONSE_VERSIONED,\n\t\t\t\trequestZodSchema: HttpActionRequestSchema,\n\t\t\t\tresponseZodSchema: HttpActionResponseSchema,\n\t\t\t\t// JSON Request: args is the raw value\n\t\t\t\trequestToJson: (args): HttpActionRequestJson => ({\n\t\t\t\t\targs,\n\t\t\t\t}),\n\t\t\t\t// BARE Request: args needs to be CBOR-encoded\n\t\t\t\trequestToBare: (args): protocol.HttpActionRequest => ({\n\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(args)),\n\t\t\t\t}),\n\t\t\t\t// JSON Response: output is the raw value\n\t\t\t\tresponseFromJson: (json): Response => json.output as Response,\n\t\t\t\t// BARE Response: output is ArrayBuffer that needs CBOR-decoding\n\t\t\t\tresponseFromBare: (bare): Response =>\n\t\t\t\t\tcbor.decode(new Uint8Array(bare.output)) as Response,\n\t\t\t});\n\n\t\t\treturn responseData;\n\t\t} catch (err) {\n\t\t\t// Standardize to ClientActorError instead of the native backend error\n\t\t\tconst { group, code, message, metadata } = deconstructError(\n\t\t\t\terr,\n\t\t\t\tlogger(),\n\t\t\t\t{},\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\t// Check if this is a scheduling error and try to get more details\n\t\t\tif (actorId && isSchedulingError(group, code)) {\n\t\t\t\tconst schedulingError = await checkForSchedulingError(\n\t\t\t\t\tgroup,\n\t\t\t\t\tcode,\n\t\t\t\t\tactorId,\n\t\t\t\t\tthis.#actorQuery,\n\t\t\t\t\tthis.#driver,\n\t\t\t\t);\n\t\t\t\tif (schedulingError) {\n\t\t\t\t\tthrow schedulingError;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow new ActorError(group, code, message, metadata);\n\t\t}\n\t}\n\n\t/**\n\t * Establishes a persistent connection to the actor.\n\t *\n\t * @template AD The actor class that this connection is for.\n\t * @returns {ActorConn<AD>} A connection to the actor.\n\t */\n\tconnect(): ActorConn<AnyActorDefinition> {\n\t\tlogger().debug({\n\t\t\tmsg: \"establishing connection from handle\",\n\t\t\tquery: this.#actorQuery,\n\t\t});\n\n\t\tconst conn = new ActorConnRaw(\n\t\t\tthis.#client,\n\t\t\tthis.#driver,\n\t\t\tthis.#params,\n\t\t\tthis.#encoding,\n\t\t\tthis.#actorQuery,\n\t\t);\n\n\t\treturn this.#client[CREATE_ACTOR_CONN_PROXY](\n\t\t\tconn,\n\t\t) as ActorConn<AnyActorDefinition>;\n\t}\n\n\t/**\n\t * Fetches a resource from this actor via the /request endpoint. This is a\n\t * convenience wrapper around the raw HTTP API.\n\t */\n\tfetch(input: string | URL | Request, init?: RequestInit) {\n\t\treturn rawHttpFetch(\n\t\t\tthis.#driver,\n\t\t\tthis.#actorQuery,\n\t\t\tthis.#params,\n\t\t\tinput,\n\t\t\tinit,\n\t\t);\n\t}\n\n\t/**\n\t * Opens a raw WebSocket connection to this actor.\n\t */\n\twebSocket(path?: string, protocols?: string | string[]) {\n\t\treturn rawWebSocket(\n\t\t\tthis.#driver,\n\t\t\tthis.#actorQuery,\n\t\t\tthis.#params,\n\t\t\tpath,\n\t\t\tprotocols,\n\t\t);\n\t}\n\n\t/**\n\t * Resolves the actor to get its unique actor ID.\n\t */\n\tasync resolve(): Promise<string> {\n\t\tif (\"getForKey\" in this.#actorQuery) {\n\t\t\tconst name = this.#actorQuery.getForKey.name;\n\n\t\t\t// Query the actor to get the id\n\t\t\tconst { actorId } = await queryActor(\n\t\t\t\tundefined,\n\t\t\t\tthis.#actorQuery,\n\t\t\t\tthis.#driver,\n\t\t\t);\n\n\t\t\tthis.#actorQuery = { getForId: { actorId, name } };\n\n\t\t\treturn actorId;\n\t\t} else if (\"getOrCreateForKey\" in this.#actorQuery) {\n\t\t\tconst name = this.#actorQuery.getOrCreateForKey.name;\n\n\t\t\t// Query the actor to get or create and get the id\n\t\t\tconst { actorId } = await queryActor(\n\t\t\t\tundefined,\n\t\t\t\tthis.#actorQuery,\n\t\t\t\tthis.#driver,\n\t\t\t);\n\n\t\t\tthis.#actorQuery = { getForId: { actorId, name } };\n\n\t\t\treturn actorId;\n\t\t} else if (\"getForId\" in this.#actorQuery) {\n\t\t\t// Skip since it's already resolved\n\t\t\treturn this.#actorQuery.getForId.actorId;\n\t\t} else if (\"create\" in this.#actorQuery) {\n\t\t\t// Cannot create a handle with this query\n\t\t\tinvariant(false, \"actorQuery cannot be create\");\n\t\t} else {\n\t\t\tassertUnreachable(this.#actorQuery);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the raw URL for routing traffic to the actor.\n\t */\n\tasync getGatewayUrl(): Promise<string> {\n\t\tconst { actorId } = await queryActor(\n\t\t\tundefined,\n\t\t\tthis.#actorQuery,\n\t\t\tthis.#driver,\n\t\t);\n\t\treturn await this.#driver.buildGatewayUrl(actorId);\n\t}\n}\n\n/**\n * Stateless handle to a actor. Allows calling actor's remote procedure calls with inferred types\n * without establishing a persistent connection.\n *\n * @example\n * ```\n * const room = client.get<ChatRoom>(...etc...);\n * // This calls the action named `sendMessage` on the `ChatRoom` actor without a connection.\n * await room.sendMessage('Hello, world!');\n * ```\n *\n * Private methods (e.g. those starting with `_`) are automatically excluded.\n *\n * @template AD The actor class that this handle is for.\n * @see {@link ActorHandleRaw}\n */\nexport type ActorHandle<AD extends AnyActorDefinition> = Omit<\n\tActorHandleRaw,\n\t\"connect\"\n> & {\n\t// Add typed version of ActorConn (instead of using AnyActorDefinition)\n\tconnect(): ActorConn<AD>;\n\t// Resolve method returns the actor ID\n\tresolve(): Promise<string>;\n} & ActorDefinitionActions<AD>;\n","import invariant from \"invariant\";\nimport { PATH_WEBSOCKET_PREFIX } from \"@/common/actor-router-consts\";\nimport { deconstructError } from \"@/common/utils\";\nimport { HEADER_CONN_PARAMS, type ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\nimport { queryActor } from \"./actor-query\";\nimport { ActorError } from \"./errors\";\nimport { logger } from \"./log\";\n\n/**\n * Shared implementation for raw HTTP fetch requests\n */\nexport async function rawHttpFetch(\n\tdriver: ManagerDriver,\n\tactorQuery: ActorQuery,\n\tparams: unknown,\n\tinput: string | URL | Request,\n\tinit?: RequestInit,\n): Promise<Response> {\n\t// Extract path and merge init options\n\tlet path: string;\n\tlet mergedInit: RequestInit = init || {};\n\n\tif (typeof input === \"string\") {\n\t\tpath = input;\n\t} else if (input instanceof URL) {\n\t\tpath = input.pathname + input.search;\n\t} else if (input instanceof Request) {\n\t\t// Extract path from Request URL\n\t\tconst url = new URL(input.url);\n\t\tpath = url.pathname + url.search;\n\t\t// Merge Request properties with init\n\t\tconst requestHeaders = new Headers(input.headers);\n\t\tconst initHeaders = new Headers(init?.headers || {});\n\n\t\t// Merge headers - init headers override request headers\n\t\tconst mergedHeaders = new Headers(requestHeaders);\n\t\tinitHeaders.forEach((value, key) => {\n\t\t\tmergedHeaders.set(key, value);\n\t\t});\n\n\t\tmergedInit = {\n\t\t\tmethod: input.method,\n\t\t\tbody: input.body,\n\t\t\tmode: input.mode,\n\t\t\tcredentials: input.credentials,\n\t\t\tredirect: input.redirect,\n\t\t\treferrer: input.referrer,\n\t\t\treferrerPolicy: input.referrerPolicy,\n\t\t\tintegrity: input.integrity,\n\t\t\tkeepalive: input.keepalive,\n\t\t\tsignal: input.signal,\n\t\t\t...mergedInit, // init overrides Request properties\n\t\t\theaders: mergedHeaders, // headers must be set after spread to ensure proper merge\n\t\t};\n\t\t// Add duplex if body is present\n\t\tif (mergedInit.body) {\n\t\t\t(mergedInit as any).duplex = \"half\";\n\t\t}\n\t} else {\n\t\tthrow new TypeError(\"Invalid input type for fetch\");\n\t}\n\n\ttry {\n\t\t// Get the actor ID\n\t\tconst { actorId } = await queryActor(undefined, actorQuery, driver);\n\t\tlogger().debug({ msg: \"found actor for raw http\", actorId });\n\t\tinvariant(actorId, \"Missing actor ID\");\n\n\t\t// Build the URL with normalized path\n\t\tconst normalizedPath = path.startsWith(\"/\") ? path.slice(1) : path;\n\t\tconst url = new URL(`http://actor/request/${normalizedPath}`);\n\n\t\t// Forward conn params if provided\n\t\tconst proxyRequestHeaders = new Headers(mergedInit.headers);\n\t\tif (params) {\n\t\t\tproxyRequestHeaders.set(HEADER_CONN_PARAMS, JSON.stringify(params));\n\t\t}\n\n\t\t// Forward the request to the actor\n\t\tconst proxyRequest = new Request(url, {\n\t\t\t...mergedInit,\n\t\t\theaders: proxyRequestHeaders,\n\t\t});\n\n\t\treturn driver.sendRequest(actorId, proxyRequest);\n\t} catch (err) {\n\t\t// Standardize to ClientActorError instead of the native backend error\n\t\tconst { group, code, message, metadata } = deconstructError(\n\t\t\terr,\n\t\t\tlogger(),\n\t\t\t{},\n\t\t\ttrue,\n\t\t);\n\t\tthrow new ActorError(group, code, message, metadata);\n\t}\n}\n\n/**\n * Shared implementation for raw WebSocket connections\n */\nexport async function rawWebSocket(\n\tdriver: ManagerDriver,\n\tactorQuery: ActorQuery,\n\tparams: unknown,\n\tpath?: string,\n\t// TODO: Supportp rotocols\n\tprotocols?: string | string[],\n): Promise<any> {\n\t// TODO: Do we need encoding in rawWebSocket?\n\tconst encoding = \"bare\";\n\n\t// Get the actor ID\n\tconst { actorId } = await queryActor(undefined, actorQuery, driver);\n\tlogger().debug({ msg: \"found actor for action\", actorId });\n\tinvariant(actorId, \"Missing actor ID\");\n\n\t// Parse path and query parameters\n\tlet pathPortion = \"\";\n\tlet queryPortion = \"\";\n\tif (path) {\n\t\tconst queryIndex = path.indexOf(\"?\");\n\t\tif (queryIndex !== -1) {\n\t\t\tpathPortion = path.substring(0, queryIndex);\n\t\t\tqueryPortion = path.substring(queryIndex); // includes the '?'\n\t\t} else {\n\t\t\tpathPortion = path;\n\t\t}\n\t\t// Remove leading slash if present\n\t\tif (pathPortion.startsWith(\"/\")) {\n\t\t\tpathPortion = pathPortion.slice(1);\n\t\t}\n\t}\n\n\tconst fullPath = `${PATH_WEBSOCKET_PREFIX}${pathPortion}${queryPortion}`;\n\n\tlogger().debug({\n\t\tmsg: \"opening websocket\",\n\t\tactorId,\n\t\tencoding,\n\t\tpath: fullPath,\n\t});\n\n\t// Open WebSocket\n\tconst ws = await driver.openWebSocket(fullPath, actorId, encoding, params);\n\n\t// Node & browser WebSocket types are incompatible\n\treturn ws as any;\n}\n","import type { AnyActorDefinition } from \"@/actor/definition\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport type { ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\nimport type { Registry } from \"@/registry\";\nimport type { ActorActionFunction } from \"./actor-common\";\nimport {\n\ttype ActorConn,\n\ttype ActorConnRaw,\n\tCONNECT_SYMBOL,\n} from \"./actor-conn\";\nimport { type ActorHandle, ActorHandleRaw } from \"./actor-handle\";\nimport { queryActor } from \"./actor-query\";\nimport type { ClientConfig } from \"./config\";\nimport { logger } from \"./log\";\n\nexport type { ClientConfig, ClientConfigInput } from \"./config\";\n\n/** Extract the actor registry from the registry definition. */\nexport type ExtractActorsFromRegistry<A extends Registry<any>> =\n\tA extends Registry<infer Actors> ? Actors : never;\n\n/** Extract the registry definition from the client. */\nexport type ExtractRegistryFromClient<C extends Client<Registry<{}>>> =\n\tC extends Client<infer A> ? A : never;\n\n/**\n * Represents a actor accessor that provides methods to interact with a specific actor.\n */\nexport interface ActorAccessor<AD extends AnyActorDefinition> {\n\t/**\n\t * Gets a stateless handle to a actor by its key, but does not create the actor if it doesn't exist.\n\t * The actor name is automatically injected from the property accessor.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {GetWithIdOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tget(key?: string | string[], opts?: GetWithIdOptions): ActorHandle<AD>;\n\n\t/**\n\t * Gets a stateless handle to a actor by its key, creating it if necessary.\n\t * The actor name is automatically injected from the property accessor.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {GetOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tgetOrCreate(\n\t\tkey?: string | string[],\n\t\topts?: GetOrCreateOptions,\n\t): ActorHandle<AD>;\n\n\t/**\n\t * Gets a stateless handle to a actor by its ID.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string} actorId - The ID of the actor.\n\t * @param {GetWithIdOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tgetForId(actorId: string, opts?: GetWithIdOptions): ActorHandle<AD>;\n\n\t/**\n\t * Creates a new actor with the name automatically injected from the property accessor,\n\t * and returns a stateless handle to it with the actor ID resolved.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string | string[]} key - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {CreateOptions} [opts] - Options for creating the actor (excluding name and key).\n\t * @returns {Promise<ActorHandle<AD>>} - A promise that resolves to a handle to the actor.\n\t */\n\tcreate(\n\t\tkey?: string | string[],\n\t\topts?: CreateOptions,\n\t): Promise<ActorHandle<AD>>;\n}\n\n/**\n * Options for querying actors.\n * @typedef {Object} QueryOptions\n * @property {unknown} [parameters] - Parameters to pass to the connection.\n */\nexport interface QueryOptions {\n\t/** Parameters to pass to the connection. */\n\tparams?: unknown;\n\t/** Signal to abort the request. */\n\tsignal?: AbortSignal;\n}\n\n/**\n * Options for getting a actor by ID.\n * @typedef {QueryOptions} GetWithIdOptions\n */\nexport interface GetWithIdOptions extends QueryOptions {}\n\n/**\n * Options for getting a actor.\n * @typedef {QueryOptions} GetOptions\n */\nexport interface GetOptions extends QueryOptions {}\n\n/**\n * Options for getting or creating a actor.\n * @typedef {QueryOptions} GetOrCreateOptions\n * @property {string} [createInRegion] - Region to create the actor in if it doesn't exist.\n */\nexport interface GetOrCreateOptions extends QueryOptions {\n\t/** Region to create the actor in if it doesn't exist. */\n\tcreateInRegion?: string;\n\t/** Input data to pass to the actor. */\n\tcreateWithInput?: unknown;\n}\n\n/**\n * Options for creating a actor.\n * @typedef {QueryOptions} CreateOptions\n * @property {string} [region] - The region to create the actor in.\n */\nexport interface CreateOptions extends QueryOptions {\n\t/** The region to create the actor in. */\n\tregion?: string;\n\t/** Input data to pass to the actor. */\n\tinput?: unknown;\n}\n\n/**\n * Represents a region to connect to.\n * @typedef {Object} Region\n * @property {string} id - The region ID.\n * @property {string} name - The region name.\n * @see {@link https://rivet.dev/docs/edge|Edge Networking}\n * @see {@link https://rivet.dev/docs/regions|Available Regions}\n */\nexport interface Region {\n\t/**\n\t * The region slug.\n\t */\n\tid: string;\n\n\t/**\n\t * The human-friendly region name.\n\t */\n\tname: string;\n}\n\nexport const ACTOR_CONNS_SYMBOL = Symbol(\"actorConns\");\nexport const CREATE_ACTOR_CONN_PROXY = Symbol(\"createActorConnProxy\");\n\n/**\n * Client for managing & connecting to actors.\n *\n * @template A The actors map type that defines the available actors.\n * @see {@link https://rivet.dev/docs/manage|Create & Manage Actors}\n */\nexport class ClientRaw {\n\t#disposed = false;\n\n\t[ACTOR_CONNS_SYMBOL] = new Set<ActorConnRaw>();\n\n\t#driver: ManagerDriver;\n\t#encodingKind: Encoding;\n\n\t/**\n\t * Creates an instance of Client.\n\t */\n\tpublic constructor(driver: ManagerDriver, encoding: Encoding | undefined) {\n\t\tthis.#driver = driver;\n\n\t\tthis.#encodingKind = encoding ?? \"bare\";\n\t}\n\n\t/**\n\t * Gets a stateless handle to a actor by its ID.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string} name - The name of the actor.\n\t * @param {string} actorId - The ID of the actor.\n\t * @param {GetWithIdOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tgetForId<AD extends AnyActorDefinition>(\n\t\tname: string,\n\t\tactorId: string,\n\t\topts?: GetWithIdOptions,\n\t): ActorHandle<AD> {\n\t\tlogger().debug({\n\t\t\tmsg: \"get handle to actor with id\",\n\t\t\tname,\n\t\t\tactorId,\n\t\t\tparams: opts?.params,\n\t\t});\n\n\t\tconst actorQuery: ActorQuery = {\n\t\t\tgetForId: {\n\t\t\t\tname,\n\t\t\t\tactorId,\n\t\t\t},\n\t\t};\n\n\t\tconst handle = this.#createHandle(opts?.params, actorQuery);\n\t\treturn createActorProxy(handle) as ActorHandle<AD>;\n\t}\n\n\t/**\n\t * Gets a stateless handle to a actor by its key, but does not create the actor if it doesn't exist.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string} name - The name of the actor.\n\t * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {GetWithIdOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tget<AD extends AnyActorDefinition>(\n\t\tname: string,\n\t\tkey?: string | string[],\n\t\topts?: GetWithIdOptions,\n\t): ActorHandle<AD> {\n\t\t// Convert string to array of strings\n\t\tconst keyArray: string[] = typeof key === \"string\" ? [key] : key || [];\n\n\t\tlogger().debug({\n\t\t\tmsg: \"get handle to actor\",\n\t\t\tname,\n\t\t\tkey: keyArray,\n\t\t\tparameters: opts?.params,\n\t\t});\n\n\t\tconst actorQuery: ActorQuery = {\n\t\t\tgetForKey: {\n\t\t\t\tname,\n\t\t\t\tkey: keyArray,\n\t\t\t},\n\t\t};\n\n\t\tconst handle = this.#createHandle(opts?.params, actorQuery);\n\t\treturn createActorProxy(handle) as ActorHandle<AD>;\n\t}\n\n\t/**\n\t * Gets a stateless handle to a actor by its key, creating it if necessary.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string} name - The name of the actor.\n\t * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {GetOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tgetOrCreate<AD extends AnyActorDefinition>(\n\t\tname: string,\n\t\tkey?: string | string[],\n\t\topts?: GetOrCreateOptions,\n\t): ActorHandle<AD> {\n\t\t// Convert string to array of strings\n\t\tconst keyArray: string[] = typeof key === \"string\" ? [key] : key || [];\n\n\t\tlogger().debug({\n\t\t\tmsg: \"get or create handle to actor\",\n\t\t\tname,\n\t\t\tkey: keyArray,\n\t\t\tparameters: opts?.params,\n\t\t\tcreateInRegion: opts?.createInRegion,\n\t\t});\n\n\t\tconst actorQuery: ActorQuery = {\n\t\t\tgetOrCreateForKey: {\n\t\t\t\tname,\n\t\t\t\tkey: keyArray,\n\t\t\t\tinput: opts?.createWithInput,\n\t\t\t\tregion: opts?.createInRegion,\n\t\t\t},\n\t\t};\n\n\t\tconst handle = this.#createHandle(opts?.params, actorQuery);\n\t\treturn createActorProxy(handle) as ActorHandle<AD>;\n\t}\n\n\t/**\n\t * Creates a new actor with the provided key and returns a stateless handle to it.\n\t * Resolves the actor ID and returns a handle with getForId query.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string} name - The name of the actor.\n\t * @param {string | string[]} key - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {CreateOptions} [opts] - Options for creating the actor (excluding name and key).\n\t * @returns {Promise<ActorHandle<AD>>} - A promise that resolves to a handle to the actor.\n\t */\n\tasync create<AD extends AnyActorDefinition>(\n\t\tname: string,\n\t\tkey?: string | string[],\n\t\topts?: CreateOptions,\n\t): Promise<ActorHandle<AD>> {\n\t\t// Convert string to array of strings\n\t\tconst keyArray: string[] = typeof key === \"string\" ? [key] : key || [];\n\n\t\tconst createQuery = {\n\t\t\tcreate: {\n\t\t\t\t...opts,\n\t\t\t\t// Do these last to override `opts`\n\t\t\t\tname,\n\t\t\t\tkey: keyArray,\n\t\t\t},\n\t\t} satisfies ActorQuery;\n\n\t\tlogger().debug({\n\t\t\tmsg: \"create actor handle\",\n\t\t\tname,\n\t\t\tkey: keyArray,\n\t\t\tparameters: opts?.params,\n\t\t\tcreate: createQuery.create,\n\t\t});\n\n\t\t// Create the actor\n\t\tconst { actorId } = await queryActor(\n\t\t\tundefined,\n\t\t\tcreateQuery,\n\t\t\tthis.#driver,\n\t\t);\n\t\tlogger().debug({\n\t\t\tmsg: \"created actor with ID\",\n\t\t\tname,\n\t\t\tkey: keyArray,\n\t\t\tactorId,\n\t\t});\n\n\t\t// Create handle with actor ID\n\t\tconst getForIdQuery = {\n\t\t\tgetForId: {\n\t\t\t\tname,\n\t\t\t\tactorId,\n\t\t\t},\n\t\t} satisfies ActorQuery;\n\t\tconst handle = this.#createHandle(opts?.params, getForIdQuery);\n\n\t\tconst proxy = createActorProxy(handle) as ActorHandle<AD>;\n\n\t\treturn proxy;\n\t}\n\n\t#createHandle(params: unknown, actorQuery: ActorQuery): ActorHandleRaw {\n\t\treturn new ActorHandleRaw(\n\t\t\tthis,\n\t\t\tthis.#driver,\n\t\t\tparams,\n\t\t\tthis.#encodingKind,\n\t\t\tactorQuery,\n\t\t);\n\t}\n\n\t[CREATE_ACTOR_CONN_PROXY]<AD extends AnyActorDefinition>(\n\t\tconn: ActorConnRaw,\n\t): ActorConn<AD> {\n\t\t// Save to connection list\n\t\tthis[ACTOR_CONNS_SYMBOL].add(conn);\n\n\t\t// Start connection\n\t\tconn[CONNECT_SYMBOL]();\n\n\t\treturn createActorProxy(conn) as ActorConn<AD>;\n\t}\n\n\t/**\n\t * Disconnects from all actors.\n\t *\n\t * @returns {Promise<void>} A promise that resolves when all connections are closed.\n\t */\n\tasync dispose(): Promise<void> {\n\t\tif (this.#disposed) {\n\t\t\tlogger().warn({ msg: \"client already disconnected\" });\n\t\t\treturn;\n\t\t}\n\t\tthis.#disposed = true;\n\n\t\tlogger().debug({ msg: \"disposing client\" });\n\n\t\tconst disposePromises = [];\n\n\t\t// Dispose all connections\n\t\tfor (const conn of this[ACTOR_CONNS_SYMBOL].values()) {\n\t\t\tdisposePromises.push(conn.dispose());\n\t\t}\n\n\t\tawait Promise.all(disposePromises);\n\t}\n}\n\n/**\n * Client type with actor accessors.\n * This adds property accessors for actor names to the ClientRaw base class.\n *\n * @template A The actor registry type.\n */\nexport type Client<A extends Registry<any>> = ClientRaw & {\n\t[K in keyof ExtractActorsFromRegistry<A>]: ActorAccessor<\n\t\tExtractActorsFromRegistry<A>[K]\n\t>;\n};\n\nexport type AnyClient = Client<Registry<any>>;\n\nexport function createClientWithDriver<A extends Registry<any>>(\n\tdriver: ManagerDriver,\n\tconfig: { encoding?: Encoding } = {},\n): Client<A> {\n\tconst client = new ClientRaw(driver, config.encoding);\n\n\t// Create proxy for accessing actors by name\n\treturn new Proxy(client, {\n\t\tget: (target: ClientRaw, prop: string | symbol, receiver: unknown) => {\n\t\t\t// Get the real property if it exists\n\t\t\tif (typeof prop === \"symbol\" || prop in target) {\n\t\t\t\tconst value = Reflect.get(target, prop, receiver);\n\t\t\t\t// Preserve method binding\n\t\t\t\tif (typeof value === \"function\") {\n\t\t\t\t\treturn value.bind(target);\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\t// Handle actor accessor for string properties (actor names)\n\t\t\tif (typeof prop === \"string\") {\n\t\t\t\t// Return actor accessor object with methods\n\t\t\t\treturn {\n\t\t\t\t\t// Handle methods (stateless action)\n\t\t\t\t\tget: (\n\t\t\t\t\t\tkey?: string | string[],\n\t\t\t\t\t\topts?: GetWithIdOptions,\n\t\t\t\t\t): ActorHandle<\n\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t> => {\n\t\t\t\t\t\treturn target.get<\n\t\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t\t>(prop, key, opts);\n\t\t\t\t\t},\n\t\t\t\t\tgetOrCreate: (\n\t\t\t\t\t\tkey?: string | string[],\n\t\t\t\t\t\topts?: GetOptions,\n\t\t\t\t\t): ActorHandle<\n\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t> => {\n\t\t\t\t\t\treturn target.getOrCreate<\n\t\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t\t>(prop, key, opts);\n\t\t\t\t\t},\n\t\t\t\t\tgetForId: (\n\t\t\t\t\t\tactorId: string,\n\t\t\t\t\t\topts?: GetWithIdOptions,\n\t\t\t\t\t): ActorHandle<\n\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t> => {\n\t\t\t\t\t\treturn target.getForId<\n\t\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t\t>(prop, actorId, opts);\n\t\t\t\t\t},\n\t\t\t\t\tcreate: async (\n\t\t\t\t\t\tkey: string | string[],\n\t\t\t\t\t\topts: CreateOptions = {},\n\t\t\t\t\t): Promise<\n\t\t\t\t\t\tActorHandle<ExtractActorsFromRegistry<A>[typeof prop]>\n\t\t\t\t\t> => {\n\t\t\t\t\t\treturn await target.create<\n\t\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t\t>(prop, key, opts);\n\t\t\t\t\t},\n\t\t\t\t} as ActorAccessor<ExtractActorsFromRegistry<A>[typeof prop]>;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t}) as Client<A>;\n}\n\n/**\n * Creates a proxy for a actor that enables calling actions without explicitly using `.action`.\n **/\nfunction createActorProxy<AD extends AnyActorDefinition>(\n\thandle: ActorHandleRaw | ActorConnRaw,\n): ActorHandle<AD> | ActorConn<AD> {\n\t// Stores returned action functions for faster calls\n\tconst methodCache = new Map<string, ActorActionFunction>();\n\treturn new Proxy(handle, {\n\t\tget(target: ActorHandleRaw, prop: string | symbol, receiver: unknown) {\n\t\t\t// Handle built-in Symbol properties\n\t\t\tif (typeof prop === \"symbol\") {\n\t\t\t\treturn Reflect.get(target, prop, receiver);\n\t\t\t}\n\n\t\t\t// Handle built-in Promise methods and existing properties\n\t\t\tif (prop === \"constructor\" || prop in target) {\n\t\t\t\tconst value = Reflect.get(target, prop, target);\n\t\t\t\t// Preserve method binding\n\t\t\t\tif (typeof value === \"function\") {\n\t\t\t\t\treturn value.bind(target);\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\t// Create action function that preserves 'this' context\n\t\t\tif (typeof prop === \"string\") {\n\t\t\t\t// If JS is attempting to calling this as a promise, ignore it\n\t\t\t\tif (prop === \"then\") return undefined;\n\n\t\t\t\tlet method = methodCache.get(prop);\n\t\t\t\tif (!method) {\n\t\t\t\t\tmethod = (...args: unknown[]) =>\n\t\t\t\t\t\ttarget.action({ name: prop, args });\n\t\t\t\t\tmethodCache.set(prop, method);\n\t\t\t\t}\n\t\t\t\treturn method;\n\t\t\t}\n\t\t},\n\n\t\t// Support for 'in' operator\n\t\thas(target: ActorHandleRaw, prop: string | symbol) {\n\t\t\t// All string properties are potentially action functions.\n\t\t\tif (typeof prop === \"string\") return true;\n\t\t\t// For symbols, defer to the target's own has behavior\n\t\t\treturn Reflect.has(target, prop);\n\t\t},\n\n\t\t// Support instanceof checks\n\t\tgetPrototypeOf(target: ActorHandleRaw) {\n\t\t\treturn Reflect.getPrototypeOf(target);\n\t\t},\n\n\t\t// Prevent property enumeration of non-existent action methods\n\t\townKeys(target: ActorHandleRaw) {\n\t\t\treturn Reflect.ownKeys(target);\n\t\t},\n\n\t\t// Support proper property descriptors\n\t\tgetOwnPropertyDescriptor(\n\t\t\ttarget: ActorHandleRaw,\n\t\t\tprop: string | symbol,\n\t\t) {\n\t\t\tconst targetDescriptor = Reflect.getOwnPropertyDescriptor(\n\t\t\t\ttarget,\n\t\t\t\tprop,\n\t\t\t);\n\t\t\tif (targetDescriptor) {\n\t\t\t\treturn targetDescriptor;\n\t\t\t}\n\t\t\tif (typeof prop === \"string\") {\n\t\t\t\t// Make action methods appear non-enumerable\n\t\t\t\treturn {\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\twritable: false,\n\t\t\t\t\tvalue: (...args: unknown[]) =>\n\t\t\t\t\t\ttarget.action({ name: prop, args }),\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t}) as ActorHandle<AD> | ActorConn<AD>;\n}\n","import z from \"zod/v4\";\nimport { EncodingSchema } from \"@/actor/protocol/serde\";\nimport { type GetUpgradeWebSocket } from \"@/utils\";\nimport {\n\tgetRivetEngine,\n\tgetRivetEndpoint,\n\tgetRivetToken,\n\tgetRivetNamespace,\n\tgetRivetRunner,\n} from \"@/utils/env-vars\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { tryParseEndpoint } from \"@/utils/endpoint-parser\";\n\n/**\n * Gets the default endpoint for the client.\n *\n * In browser: uses current origin + /api/rivet\n *\n * Server-side: uses 127.0.0.1:6420\n */\nfunction getDefaultEndpoint(): string {\n\tif (typeof window !== \"undefined\" && window.location?.origin) {\n\t\treturn `${window.location.origin}/api/rivet`;\n\t}\n\treturn \"http://127.0.0.1:6420\";\n}\n\n/**\n * Base client config schema without transforms so it can be merged in to other schemas.\n */\nexport const ClientConfigSchemaBase = z.object({\n\t/**\n\t * Endpoint to connect to for Rivet Engine or RivetKit manager API.\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 * Can also be set via RIVET_ENDPOINT environment variables.\n\t *\n\t * Defaults to current origin + /api/rivet in browser, or 127.0.0.1:6420 server-side.\n\t */\n\tendpoint: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform(\n\t\t\t(val) =>\n\t\t\t\tval ??\n\t\t\t\tgetRivetEngine() ??\n\t\t\t\tgetRivetEndpoint() ??\n\t\t\t\tgetDefaultEndpoint(),\n\t\t),\n\n\t/** Token to use to authenticate with the API. */\n\ttoken: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetToken()),\n\n\t/** Namespace to connect to. */\n\tnamespace: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetNamespace()),\n\n\t/** Name of the runner. This is used to group together runners in to different pools. */\n\trunnerName: z.string().default(() => getRivetRunner() ?? \"default\"),\n\n\tencoding: EncodingSchema.default(\"bare\"),\n\n\theaders: z\n\t\t.record(z.string(), z.string())\n\t\t.optional()\n\t\t.default(() => ({})),\n\n\t// See RunConfig.getUpgradeWebSocket\n\t//\n\t// This is required in the client config in order to support\n\t// `proxyWebSocket`\n\tgetUpgradeWebSocket: z.custom<GetUpgradeWebSocket>().optional(),\n\n\t/** Whether to automatically perform health checks when the client is created. */\n\tdisableMetadataLookup: z.boolean().optional().default(false),\n\n\t/** Whether to enable RivetKit Devtools integration. */\n\tdevtools: z\n\t\t.boolean()\n\t\t.default(\n\t\t\t() =>\n\t\t\t\ttypeof window !== \"undefined\" &&\n\t\t\t\t(window?.location?.hostname === \"127.0.0.1\" ||\n\t\t\t\t\twindow.location?.hostname === \"localhost\"),\n\t\t),\n});\n\nexport const ClientConfigSchema = ClientConfigSchemaBase.transform(\n\t(config, ctx) => transformClientConfig(config, ctx),\n);\n\nexport type ClientConfig = z.infer<typeof ClientConfigSchema>;\n\nexport type ClientConfigInput = z.input<typeof ClientConfigSchema>;\n\nexport function transformClientConfig(\n\tconfig: z.infer<typeof ClientConfigSchemaBase>,\n\tctx: z.RefinementCtx,\n) {\n\tconst parsedEndpoint = tryParseEndpoint(ctx, {\n\t\tendpoint: config.endpoint,\n\t\tpath: [\"endpoint\"],\n\t\tnamespace: config.namespace,\n\t\ttoken: config.token,\n\t});\n\n\treturn {\n\t\t...config,\n\t\tendpoint: parsedEndpoint?.endpoint,\n\t\tnamespace: parsedEndpoint?.namespace ?? config.namespace ?? \"default\",\n\t\ttoken: parsedEndpoint?.token ?? config.token,\n\t};\n}\n\n/**\n * Converts a base config in to a client config.\n *\n * The base config does not include all of the properties of the client config,\n * so this converts the subset of properties in to the client config.\n *\n * Note: We construct the object directly rather than using ClientConfigSchema.parse()\n * because RegistryConfig has already transformed the endpoint, namespace, and token.\n * Re-parsing would attempt to extract namespace/token from the endpoint URL again.\n */\nexport function convertRegistryConfigToClientConfig(\n\tconfig: RegistryConfig,\n): ClientConfig {\n\treturn {\n\t\tendpoint: config.endpoint,\n\t\ttoken: config.token,\n\t\tnamespace: config.namespace,\n\t\trunnerName: config.runner.runnerName,\n\t\theaders: config.headers,\n\t\tencoding: \"bare\",\n\t\tgetUpgradeWebSocket: undefined,\n\t\t// We don't need health checks for internal clients\n\t\tdisableMetadataLookup: true,\n\t\tdevtools:\n\t\t\ttypeof window !== \"undefined\" &&\n\t\t\t(window?.location?.hostname === \"127.0.0.1\" ||\n\t\t\t\twindow?.location?.hostname === \"localhost\"),\n\t};\n}\n","import { injectDevtools } from \"@/devtools-loader\";\nimport type { Registry } from \"@/registry\";\nimport { RemoteManagerDriver } from \"@/remote-manager-driver/mod\";\nimport {\n\ttype Client,\n\ttype ClientConfigInput,\n\tcreateClientWithDriver,\n} from \"./client\";\nimport { ClientConfigSchema } from \"./config\";\n\nexport type { ActorDefinition, AnyActorDefinition } from \"@/actor/definition\";\nexport type { Encoding } from \"@/actor/protocol/serde\";\nexport {\n\tActorClientError,\n\tActorConnDisposed,\n\tActorError,\n\tInternalError,\n\tMalformedResponseMessage,\n\tManagerError,\n} from \"@/client/errors\";\nexport type { CreateRequest } from \"@/manager/protocol/query\";\nexport { KEYS as KV_KEYS } from \"../actor/instance/keys\";\nexport type { ActorActionFunction } from \"./actor-common\";\nexport type {\n\tActorConn,\n\tActorConnStatus,\n\tConnectionStateCallback,\n\tEventUnsubscribe,\n\tStatusChangeCallback,\n} from \"./actor-conn\";\nexport { ActorConnRaw } from \"./actor-conn\";\nexport type { ActorHandle } from \"./actor-handle\";\nexport { ActorHandleRaw } from \"./actor-handle\";\nexport type {\n\tActorAccessor,\n\tClient,\n\tClientRaw,\n\tCreateOptions,\n\tExtractActorsFromRegistry,\n\tExtractRegistryFromClient,\n\tGetOptions,\n\tGetWithIdOptions,\n\tQueryOptions,\n\tRegion,\n} from \"./client\";\n\n/**\n * Creates a client with the actor accessor proxy.\n */\nexport function createClient<A extends Registry<any>>(\n\tendpointOrConfig?: string | ClientConfigInput,\n): Client<A> {\n\t// Parse config\n\tconst configInput =\n\t\tendpointOrConfig === undefined\n\t\t\t? {}\n\t\t\t: typeof endpointOrConfig === \"string\"\n\t\t\t\t? { endpoint: endpointOrConfig }\n\t\t\t\t: endpointOrConfig;\n\tconst config = ClientConfigSchema.parse(configInput);\n\n\t// Create client\n\tconst driver = new RemoteManagerDriver(config);\n\n\tif (config.devtools) {\n\t\tinjectDevtools(config);\n\t}\n\n\treturn createClientWithDriver<A>(driver, config);\n}\n"],"mappings":"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","names":["logger","VERSION","VERSION","VERSION","VERSION","config","cbor","invariant","z","assertUnreachable","z","logger","logger","z","cbor","invariant","bare","config","readInit","writeInit","read0","write0","read1","write1","readError","writeError","readActionResponse","writeActionResponse","readEvent","writeEvent","readToClientBody","writeToClientBody","readToClient","writeToClient","encodeToClient","decodeToClient","readActionRequest","writeActionRequest","readSubscriptionRequest","writeSubscriptionRequest","readToServerBody","writeToServerBody","readToServer","writeToServer","encodeToServer","decodeToServer","readHttpActionRequest","writeHttpActionRequest","encodeHttpActionRequest","decodeHttpActionRequest","readHttpActionResponse","writeHttpActionResponse","encodeHttpActionResponse","decodeHttpActionResponse","readHttpResponseError","writeHttpResponseError","encodeHttpResponseError","decodeHttpResponseError","readHttpResolveResponse","writeHttpResolveResponse","encodeHttpResolveResponse","decodeHttpResolveResponse","bare","config","readInit","writeInit","read0","write0","read1","write1","readError","writeError","readActionResponse","writeActionResponse","readEvent","writeEvent","readToClientBody","writeToClientBody","readToClient","writeToClient","encodeToClient","decodeToClient","readActionRequest","writeActionRequest","readSubscriptionRequest","writeSubscriptionRequest","readToServerBody","writeToServerBody","readToServer","writeToServer","encodeToServer","decodeToServer","readHttpActionRequest","writeHttpActionRequest","encodeHttpActionRequest","decodeHttpActionRequest","readHttpActionResponse","writeHttpActionResponse","encodeHttpActionResponse","decodeHttpActionResponse","readHttpResponseError","writeHttpResponseError","encodeHttpResponseError","decodeHttpResponseError","readHttpResolveResponse","writeHttpResolveResponse","encodeHttpResolveResponse","decodeHttpResolveResponse","decodeToServer","encodeToServer","decodeToClient","encodeToClient","decodeHttpActionRequest","encodeHttpActionRequest","decodeHttpActionResponse","encodeHttpActionResponse","decodeHttpResponseError","encodeHttpResponseError","decodeHttpResolveResponse","encodeHttpResolveResponse","z","InternalError","ActorError","logger","invariant","contentType","bare","ActorError","logger","config","logger","z","WebSocket","logger","config","config","config","logger","WebSocket","logger","event","logger","invariant","cbor","invariant","pRetry","cbor","logger","cbor","bare","logger","pRetry","ActorError","id","InternalError","invariant","cbor","invariant","invariant","logger","invariant","ActorError","logger","invariant","bare","ActorError","assertUnreachable","logger","config","z","z","config","config"]}
1
+ {"version":3,"sources":["../../src/actor/errors.ts","../../src/utils/env-vars.ts","../../src/common/utils.ts","../../package.json","../../src/common/log.ts","../../src/common/log-levels.ts","../../src/common/logfmt.ts","../../src/utils.ts","../../src/devtools-loader/log.ts","../../src/devtools-loader/index.ts","../../src/remote-manager-driver/mod.ts","../../src/actor/keys.ts","../../src/serde.ts","../../src/actor/protocol/serde.ts","../../src/actor/log.ts","../../src/actor/utils.ts","../../src/common/actor-router-consts.ts","../../src/client/log.ts","../../src/common/websocket.ts","../../src/remote-manager-driver/api-utils.ts","../../src/client/utils.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/client/errors.ts","../../src/remote-manager-driver/log.ts","../../src/remote-manager-driver/actor-websocket-client.ts","../../src/remote-manager-driver/actor-http-client.ts","../../src/remote-manager-driver/api-endpoints.ts","../../src/remote-manager-driver/metadata.ts","../../src/remote-manager-driver/ws-proxy.ts","../../src/client/actor-conn.ts","../../src/actor/protocol/old.ts","../../src/actor/instance/keys.ts","../../src/client/actor-query.ts","../../src/client/queue.ts","../../src/utils/endpoint-parser.ts","../../src/client/actor-handle.ts","../../src/client/raw-utils.ts","../../src/client/client.ts","../../src/client/config.ts","../../src/client/mod.ts"],"sourcesContent":["import type { DeconstructedError } from \"@/common/utils\";\n\nexport const INTERNAL_ERROR_CODE = \"internal_error\";\nexport const INTERNAL_ERROR_DESCRIPTION =\n\t\"Internal error. Read the server logs for more details.\";\nexport type InternalErrorMetadata = {};\n\nexport const USER_ERROR_CODE = \"user_error\";\n\ninterface ActorErrorOptions extends ErrorOptions {\n\t/** Error data can safely be serialized in a response to the client. */\n\tpublic?: boolean;\n\t/** Metadata associated with this error. This will be sent to clients. */\n\tmetadata?: unknown;\n}\n\nexport class ActorError extends Error {\n\t__type = \"ActorError\";\n\n\tpublic public: boolean;\n\tpublic metadata?: unknown;\n\tpublic statusCode = 500;\n\tpublic readonly group: string;\n\tpublic readonly code: string;\n\n\tpublic static isActorError(\n\t\terror: unknown,\n\t): error is ActorError | DeconstructedError {\n\t\treturn (\n\t\t\ttypeof error === \"object\" &&\n\t\t\t(error as ActorError | DeconstructedError).__type === \"ActorError\"\n\t\t);\n\t}\n\n\tconstructor(\n\t\tgroup: string,\n\t\tcode: string,\n\t\tmessage: string,\n\t\topts?: ActorErrorOptions,\n\t) {\n\t\tsuper(message, { cause: opts?.cause });\n\t\tthis.group = group;\n\t\tthis.code = code;\n\t\tthis.public = opts?.public ?? false;\n\t\tthis.metadata = opts?.metadata;\n\n\t\t// Set status code based on error type\n\t\tif (opts?.public) {\n\t\t\tthis.statusCode = 400; // Bad request for public errors\n\t\t}\n\t}\n\n\ttoString() {\n\t\t// Force stringify to return the message\n\t\treturn this.message;\n\t}\n}\n\nexport class InternalError extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"actor\", INTERNAL_ERROR_CODE, message);\n\t}\n}\n\nexport class Unreachable extends InternalError {\n\tconstructor(x: never) {\n\t\tsuper(`Unreachable case: ${x}`);\n\t}\n}\n\nexport class StateNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"state_not_enabled\",\n\t\t\t\"State not enabled. Must implement `createState` or `state` to use state. (https://www.rivet.dev/docs/actors/state/#initializing-state)\",\n\t\t);\n\t}\n}\n\nexport class ConnStateNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"conn_state_not_enabled\",\n\t\t\t\"Connection state not enabled. Must implement `createConnectionState` or `connectionState` to use connection state. (https://www.rivet.dev/docs/actors/connections/#connection-state)\",\n\t\t);\n\t}\n}\n\nexport class VarsNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"vars_not_enabled\",\n\t\t\t\"Variables not enabled. Must implement `createVars` or `vars` to use state. (https://www.rivet.dev/docs/actors/ephemeral-variables/#initializing-variables)\",\n\t\t);\n\t}\n}\n\nexport class ActionTimedOut extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"action\",\n\t\t\t\"timed_out\",\n\t\t\t\"Action timed out. This can be increased with: `actor({ options: { action: { timeout: ... } } })`\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ActionNotFound extends ActorError {\n\tconstructor(name: string) {\n\t\tsuper(\n\t\t\t\"action\",\n\t\t\t\"not_found\",\n\t\t\t`Action '${name}' not found. Validate the action exists on your actor.`,\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class InvalidEncoding extends ActorError {\n\tconstructor(format?: string) {\n\t\tsuper(\n\t\t\t\"encoding\",\n\t\t\t\"invalid\",\n\t\t\t`Invalid encoding \\`${format}\\`. (https://www.rivet.dev/docs/clients/javascript)`,\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class IncomingMessageTooLong extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"message\",\n\t\t\t\"incoming_too_long\",\n\t\t\t\"Incoming message too long. This can be configured with: `registry.start({ maxIncomingMessageSize: ... })`\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class OutgoingMessageTooLong extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"message\",\n\t\t\t\"outgoing_too_long\",\n\t\t\t\"Outgoing message too long. This can be configured with: `registry.start({ maxOutgoingMessageSize: ... })`\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class MalformedMessage extends ActorError {\n\tconstructor(cause?: unknown) {\n\t\tsuper(\"message\", \"malformed\", `Malformed message: ${cause}`, {\n\t\t\tpublic: true,\n\t\t\tcause,\n\t\t});\n\t}\n}\n\nexport interface InvalidStateTypeOptions {\n\tpath?: unknown;\n}\n\nexport class InvalidStateType extends ActorError {\n\tconstructor(opts?: InvalidStateTypeOptions) {\n\t\tlet msg = \"\";\n\t\tif (opts?.path) {\n\t\t\tmsg += `Attempted to set invalid state at path \\`${opts.path}\\`.`;\n\t\t} else {\n\t\t\tmsg += \"Attempted to set invalid state.\";\n\t\t}\n\t\tmsg +=\n\t\t\t\" Valid types include: null, undefined, boolean, string, number, BigInt, Date, RegExp, Error, typed arrays (Uint8Array, Int8Array, Float32Array, etc.), Map, Set, Array, and plain objects. (https://www.rivet.dev/docs/actors/state/#limitations)\";\n\t\tsuper(\"state\", \"invalid_type\", msg);\n\t}\n}\n\nexport class Unsupported extends ActorError {\n\tconstructor(feature: string) {\n\t\tsuper(\"feature\", \"unsupported\", `Unsupported feature: ${feature}`);\n\t}\n}\n\nexport class QueueFull extends ActorError {\n\tconstructor(limit: number) {\n\t\tsuper(\"queue\", \"full\", `Queue is full. Limit is ${limit} messages.`, {\n\t\t\tpublic: true,\n\t\t\tmetadata: { limit },\n\t\t});\n\t}\n}\n\nexport class QueueMessageTooLarge extends ActorError {\n\tconstructor(size: number, limit: number) {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"message_too_large\",\n\t\t\t`Queue message too large (${size} bytes). Limit is ${limit} bytes.`,\n\t\t\t{ public: true, metadata: { size, limit } },\n\t\t);\n\t}\n}\n\nexport class QueueMessageInvalid extends ActorError {\n\tconstructor(path?: string) {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"message_invalid\",\n\t\t\tpath\n\t\t\t\t? `Queue message body contains unsupported type at ${path}.`\n\t\t\t\t: \"Queue message body contains unsupported type.\",\n\t\t\t{ public: true, metadata: path ? { path } : undefined },\n\t\t);\n\t}\n}\n\nexport class EventPayloadInvalid extends ActorError {\n\tconstructor(name: string, issues?: unknown[]) {\n\t\tsuper(\n\t\t\t\"event\",\n\t\t\t\"invalid_payload\",\n\t\t\t`Event payload failed validation for '${name}'.`,\n\t\t\t{ public: true, metadata: { name, issues } },\n\t\t);\n\t}\n}\n\nexport class QueuePayloadInvalid extends ActorError {\n\tconstructor(name: string, issues?: unknown[]) {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"invalid_payload\",\n\t\t\t`Queue payload failed validation for '${name}'.`,\n\t\t\t{ public: true, metadata: { name, issues } },\n\t\t);\n\t}\n}\n\nexport class QueueCompletionPayloadInvalid extends ActorError {\n\tconstructor(name: string, issues?: unknown[]) {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"invalid_completion_payload\",\n\t\t\t`Queue completion payload failed validation for '${name}'.`,\n\t\t\t{ public: true, metadata: { name, issues } },\n\t\t);\n\t}\n}\n\nexport class QueueAlreadyCompleted extends ActorError {\n\tconstructor() {\n\t\tsuper(\"queue\", \"already_completed\", \"Queue message was already completed.\", {\n\t\t\tpublic: true,\n\t\t});\n\t}\n}\n\nexport class QueuePreviousMessageNotCompleted extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"previous_message_not_completed\",\n\t\t\t\"Previous completable queue message is not completed. Call `message.complete(...)` before receiving the next message.\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class QueueCompleteNotConfigured extends ActorError {\n\tconstructor(name: string) {\n\t\tsuper(\n\t\t\t\"queue\",\n\t\t\t\"complete_not_configured\",\n\t\t\t`Queue '${name}' does not support completion responses.`,\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t\tmetadata: { name },\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class ActorAborted extends ActorError {\n\tconstructor() {\n\t\tsuper(\"actor\", \"aborted\", \"Actor aborted.\", { public: true });\n\t}\n}\n\n/**\n * Options for the UserError class.\n */\nexport interface UserErrorOptions extends ErrorOptions {\n\t/**\n\t * Machine readable code for this error. Useful for catching different types of errors in try-catch.\n\t */\n\tcode?: string;\n\n\t/**\n\t * Additional metadata related to the error. Useful for understanding context about the error.\n\t */\n\tmetadata?: unknown;\n}\n\n/** Error that can be safely returned to the user. */\nexport class UserError extends ActorError {\n\t/**\n\t * Constructs a new UserError instance.\n\t *\n\t * @param message - The error message to be displayed.\n\t * @param opts - Optional parameters for the error, including a machine-readable code and additional metadata.\n\t */\n\tconstructor(message: string, opts?: UserErrorOptions) {\n\t\tsuper(\"user\", opts?.code ?? USER_ERROR_CODE, message, {\n\t\t\tpublic: true,\n\t\t\tmetadata: opts?.metadata,\n\t\t});\n\t}\n}\n\nexport class InvalidQueryJSON extends ActorError {\n\tconstructor(error?: unknown) {\n\t\tsuper(\"request\", \"invalid_query_json\", `Invalid query JSON: ${error}`, {\n\t\t\tpublic: true,\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\nexport class InvalidRequest extends ActorError {\n\tconstructor(error?: unknown) {\n\t\tsuper(\"request\", \"invalid\", `Invalid request: ${error}`, {\n\t\t\tpublic: true,\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\nexport class ActorNotFound extends ActorError {\n\tconstructor(identifier?: string) {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"not_found\",\n\t\t\tidentifier\n\t\t\t\t? `Actor not found: ${identifier} (https://www.rivet.dev/docs/clients/javascript)`\n\t\t\t\t: \"Actor not found (https://www.rivet.dev/docs/clients/javascript)\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ActorDuplicateKey extends ActorError {\n\tconstructor(name: string, key: string[]) {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"duplicate_key\",\n\t\t\t`Actor already exists with name '${name}' and key '${JSON.stringify(key)}' (https://www.rivet.dev/docs/clients/javascript)`,\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ActorStopping extends ActorError {\n\tconstructor(identifier?: string) {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"stopping\",\n\t\t\tidentifier ? `Actor stopping: ${identifier}` : \"Actor stopping\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ProxyError extends ActorError {\n\tconstructor(operation: string, error?: unknown) {\n\t\tsuper(\n\t\t\t\"proxy\",\n\t\t\t\"error\",\n\t\t\t`Error proxying ${operation}, this is likely an internal error: ${error}`,\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t\tcause: error,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class InvalidActionRequest extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"action\", \"invalid_request\", message, { public: true });\n\t}\n}\n\nexport class InvalidParams extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"params\", \"invalid\", message, { public: true });\n\t}\n}\n\nexport class DatabaseNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"database\",\n\t\t\t\"not_enabled\",\n\t\t\t\"Database not enabled. Must implement `database` to use database.\",\n\t\t);\n\t}\n}\n\nexport class RequestHandlerNotDefined extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"request_not_defined\",\n\t\t\t\"Raw request handler not defined. Actor must implement `onRequest` to handle raw HTTP requests. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 404;\n\t}\n}\n\nexport class WebSocketHandlerNotDefined extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"websocket_not_defined\",\n\t\t\t\"Raw WebSocket handler not defined. Actor must implement `onWebSocket` to handle raw WebSocket connections. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 404;\n\t}\n}\n\nexport class InvalidRequestHandlerResponse extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"invalid_request_handler_response\",\n\t\t\t\"Actor's onRequest handler must return a Response object. Returning void/undefined is not allowed. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 500;\n\t}\n}\n\nexport class InvalidCanSubscribeResponse extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"invalid_can_subscribe_response\",\n\t\t\t\"Event canSubscribe hook must return a boolean value.\",\n\t\t);\n\t\tthis.statusCode = 500;\n\t}\n}\n\nexport class InvalidCanPublishResponse extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"invalid_can_publish_response\",\n\t\t\t\"Queue canPublish hook must return a boolean value.\",\n\t\t);\n\t\tthis.statusCode = 500;\n\t}\n}\n\n// Manager-specific errors\nexport class MissingActorHeader extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"request\",\n\t\t\t\"missing_actor_header\",\n\t\t\t\"Missing x-rivet-actor header when x-rivet-target=actor\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n\nexport class WebSocketsNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"driver\",\n\t\t\t\"websockets_not_enabled\",\n\t\t\t\"WebSockets are not enabled for this driver\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n\nexport class FeatureNotImplemented extends ActorError {\n\tconstructor(feature: string) {\n\t\tsuper(\"feature\", \"not_implemented\", `${feature} is not implemented`, {\n\t\t\tpublic: true,\n\t\t});\n\t\tthis.statusCode = 501;\n\t}\n}\n\nexport class RouteNotFound extends ActorError {\n\tconstructor() {\n\t\tsuper(\"route\", \"not_found\", \"Route not found\", { public: true });\n\t\tthis.statusCode = 404;\n\t}\n}\n\nexport class RestrictedFeature extends ActorError {\n\tconstructor(feature: string) {\n\t\tsuper(\n\t\t\t\"feature\",\n\t\t\t\"restricted\",\n\t\t\t`Run this actor locally or set the token in run config to use the ${feature}`,\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 403;\n\t}\n}\n\nexport class Forbidden extends ActorError {\n\tconstructor() {\n\t\tsuper(\"auth\", \"forbidden\", \"Forbidden\", { public: true });\n\t\tthis.statusCode = 403;\n\t}\n}\n\nexport class EndpointMismatch extends ActorError {\n\tconstructor(expected: string, received: string) {\n\t\tsuper(\n\t\t\t\"config\",\n\t\t\t\"endpoint_mismatch\",\n\t\t\t`Endpoint mismatch: expected \"${expected}\", received \"${received}\"`,\n\t\t\t{ public: true, metadata: { expected, received } },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n\nexport class NamespaceMismatch extends ActorError {\n\tconstructor(expected: string, received: string) {\n\t\tsuper(\n\t\t\t\"config\",\n\t\t\t\"namespace_mismatch\",\n\t\t\t`Namespace mismatch: expected \"${expected}\", received \"${received}\"`,\n\t\t\t{ public: true, metadata: { expected, received } },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n","// This file consolidates all environment variables that affect RivetKit's behavior.\n//\n// IMPORTANT: When adding or modifying environment variables here, also update the\n// documentation at: website/src/content/docs/general/environment-variables.mdx\n\nimport { getEnvUniversal } from \"@/utils\";\n\n// Rivet configuration\nexport const getRivetEngine = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_ENGINE\");\nexport const getRivetEndpoint = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_ENDPOINT\");\nexport const getRivetToken = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_TOKEN\");\nexport const getRivetNamespace = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_NAMESPACE\");\nexport const getRivetRunner = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_RUNNER\");\nexport const getRivetTotalSlots = (): number | undefined => {\n\tconst value = getEnvUniversal(\"RIVET_TOTAL_SLOTS\");\n\treturn value !== undefined ? parseInt(value, 10) : undefined;\n};\nexport const getRivetRunnerKey = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_RUNNER_KEY\");\nexport const getRivetRunEngine = (): boolean =>\n\tgetEnvUniversal(\"RIVET_RUN_ENGINE\") === \"1\";\nexport const getRivetRunEngineVersion = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_RUN_ENGINE_VERSION\");\nexport const getRivetRunnerKind = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_RUNNER_KIND\");\nexport const getRivetRunnerVersion = (): number | undefined => {\n\tconst value = getEnvUniversal(\"RIVET_RUNNER_VERSION\");\n\treturn value !== undefined ? parseInt(value, 10) : undefined;\n};\nexport const getRivetPublicEndpoint = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_PUBLIC_ENDPOINT\");\nexport const getRivetPublicToken = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_PUBLIC_TOKEN\");\n// There is no RIVET_PUBLIC_NAMESPACE because the frontend and backend cannot\n// use different namespaces\n\n// RivetKit configuration\nexport const getRivetkitInspectorToken = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_INSPECTOR_TOKEN\");\nexport const getRivetkitInspectorDisable = (): boolean =>\n\tgetEnvUniversal(\"RIVET_INSPECTOR_DISABLE\") === \"1\";\nexport const getRivetkitStoragePath = (): string | undefined =>\n\tgetEnvUniversal(\"RIVETKIT_STORAGE_PATH\");\n\n// Logging configuration\n// DEPRECATED: LOG_LEVEL will be removed in a future version\nexport const getLogLevel = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_LOG_LEVEL\") ?? getEnvUniversal(\"LOG_LEVEL\");\nexport const getLogTarget = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_TARGET\") === \"1\";\nexport const getLogTimestamp = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_TIMESTAMP\") === \"1\";\nexport const getLogMessage = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_MESSAGE\") === \"1\";\nexport const getLogErrorStack = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_ERROR_STACK\") === \"1\";\nexport const getLogHeaders = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_HEADERS\") === \"1\";\n\n// Environment configuration\nexport const getNodeEnv = (): string | undefined => getEnvUniversal(\"NODE_ENV\");\nexport const getNextPhase = (): string | undefined =>\n\tgetEnvUniversal(\"NEXT_PHASE\");\nexport const isDev = (): boolean => getNodeEnv() !== \"production\";\n\n// Experimental\n/**\n * Enables experimental OTel tracing for Rivet Actors.\n *\n * When disabled, actors use an in-memory no-op traces implementation.\n */\nexport const getRivetExperimentalOtel = (): boolean =>\n\tgetEnvUniversal(\"RIVET_EXPERIMENTAL_OTEL\") === \"1\";\n","import type { Next } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport * as errors from \"@/actor/errors\";\nimport { EXTRA_ERROR_LOG, VERSION } from \"@/utils\";\nimport { getLogErrorStack } from \"@/utils/env-vars\";\nimport type { Logger } from \"./log\";\n\nexport function assertUnreachable(x: never): never {\n\tthrow new Error(`Unreachable case: ${x}`);\n}\n\n/**\n * Safely stringifies an object, ensuring that the stringified object is under a certain size.\n * @param obj any object to stringify\n * @param maxSize maximum size of the stringified object in bytes\n * @returns stringified object\n */\nexport function safeStringify(obj: unknown, maxSize: number) {\n\tlet size = 0;\n\n\tfunction replacer(key: string, value: unknown) {\n\t\tif (value === null || value === undefined) return value;\n\t\tconst valueSize =\n\t\t\ttypeof value === \"string\"\n\t\t\t\t? value.length\n\t\t\t\t: JSON.stringify(value).length;\n\t\tsize += key.length + valueSize;\n\n\t\tif (size > maxSize) {\n\t\t\tthrow new Error(\n\t\t\t\t`JSON object exceeds size limit of ${maxSize} bytes.`,\n\t\t\t);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\treturn JSON.stringify(obj, replacer);\n}\n\n// TODO: Instead of doing this, use a temp var for state and attempt to write\n// it. Roll back state if fails to serialize.\n\n/**\n * Check if a value is CBOR serializable.\n * Optionally pass an onInvalid callback to receive the path to invalid values.\n *\n * For a complete list of supported CBOR tags, see:\n * https://github.com/kriszyp/cbor-x/blob/cc1cf9df8ba72288c7842af1dd374d73e34cdbc1/README.md#list-of-supported-tags-for-decoding\n */\nexport function isCborSerializable(\n\tvalue: unknown,\n\tonInvalid?: (path: string) => void,\n\tcurrentPath = \"\",\n): boolean {\n\t// Handle primitive types directly\n\tif (value === null || value === undefined) {\n\t\treturn true;\n\t}\n\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) {\n\t\t\tonInvalid?.(currentPath);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tif (typeof value === \"boolean\" || typeof value === \"string\") {\n\t\treturn true;\n\t}\n\n\t// Handle BigInt (CBOR tags 2 and 3)\n\tif (typeof value === \"bigint\") {\n\t\treturn true;\n\t}\n\n\t// Handle Date objects (CBOR tags 0 and 1)\n\tif (value instanceof Date) {\n\t\treturn true;\n\t}\n\n\t// Handle typed arrays (CBOR tags 64-82)\n\tif (\n\t\tvalue instanceof Uint8Array ||\n\t\tvalue instanceof Uint8ClampedArray ||\n\t\tvalue instanceof Uint16Array ||\n\t\tvalue instanceof Uint32Array ||\n\t\tvalue instanceof BigUint64Array ||\n\t\tvalue instanceof Int8Array ||\n\t\tvalue instanceof Int16Array ||\n\t\tvalue instanceof Int32Array ||\n\t\tvalue instanceof BigInt64Array ||\n\t\tvalue instanceof Float32Array ||\n\t\tvalue instanceof Float64Array\n\t) {\n\t\treturn true;\n\t}\n\n\t// Handle Map (CBOR tag 259)\n\tif (value instanceof Map) {\n\t\tfor (const [key, val] of value.entries()) {\n\t\t\tconst keyPath = currentPath\n\t\t\t\t? `${currentPath}.key(${String(key)})`\n\t\t\t\t: `key(${String(key)})`;\n\t\t\tconst valPath = currentPath\n\t\t\t\t? `${currentPath}.value(${String(key)})`\n\t\t\t\t: `value(${String(key)})`;\n\t\t\tif (\n\t\t\t\t!isCborSerializable(key, onInvalid, keyPath) ||\n\t\t\t\t!isCborSerializable(val, onInvalid, valPath)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Handle Set (CBOR tag 258)\n\tif (value instanceof Set) {\n\t\tlet index = 0;\n\t\tfor (const item of value.values()) {\n\t\t\tconst itemPath = currentPath\n\t\t\t\t? `${currentPath}.set[${index}]`\n\t\t\t\t: `set[${index}]`;\n\t\t\tif (!isCborSerializable(item, onInvalid, itemPath)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tindex++;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Handle RegExp (CBOR tag 27)\n\tif (value instanceof RegExp) {\n\t\treturn true;\n\t}\n\n\t// Handle Error objects (CBOR tag 27)\n\tif (value instanceof Error) {\n\t\treturn true;\n\t}\n\n\t// Handle arrays\n\tif (Array.isArray(value)) {\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\tconst itemPath = currentPath ? `${currentPath}[${i}]` : `[${i}]`;\n\t\t\tif (!isCborSerializable(value[i], onInvalid, itemPath)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Handle plain objects and records (CBOR tags 105, 51, 57344-57599)\n\tif (typeof value === \"object\") {\n\t\t// Allow plain objects and objects with prototypes (for records and named objects)\n\t\tconst proto = Object.getPrototypeOf(value);\n\t\tif (proto !== null && proto !== Object.prototype) {\n\t\t\t// Check if it's a known serializable object type\n\t\t\tconst protoConstructor = value.constructor;\n\t\t\tif (protoConstructor && typeof protoConstructor.name === \"string\") {\n\t\t\t\t// Allow objects with named constructors (records, named objects)\n\t\t\t\t// This includes user-defined classes and built-in objects\n\t\t\t\t// that CBOR can serialize with tag 27 or record tags\n\t\t\t}\n\t\t}\n\n\t\t// Check all properties recursively\n\t\tfor (const key in value) {\n\t\t\tconst propPath = currentPath ? `${currentPath}.${key}` : key;\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\tvalue[key as keyof typeof value],\n\t\t\t\t\tonInvalid,\n\t\t\t\t\tpropPath,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Not serializable\n\tonInvalid?.(currentPath);\n\treturn false;\n}\n\nexport interface DeconstructedError {\n\t__type: \"ActorError\";\n\tstatusCode: ContentfulStatusCode;\n\tpublic: boolean;\n\tgroup: string;\n\tcode: string;\n\tmessage: string;\n\tmetadata?: unknown;\n}\n\n/** Deconstructs error in to components that are used to build responses. */\nexport function deconstructError(\n\terror: unknown,\n\tlogger: Logger,\n\textraLog: Record<string, unknown>,\n\texposeInternalError = false,\n): DeconstructedError {\n\t// Build response error information. Only return errors if flagged as public in order to prevent leaking internal behavior.\n\t//\n\t// We log the error here instead of after generating the code & message because we need to log the original error, not the masked internal error.\n\tlet statusCode: ContentfulStatusCode;\n\tlet public_: boolean;\n\tlet group: string;\n\tlet code: string;\n\tlet message: string;\n\tlet metadata: unknown;\n\tif (errors.ActorError.isActorError(error) && error.public) {\n\t\t// Check if error has statusCode (could be ActorError instance or DeconstructedError)\n\t\tstatusCode = (\n\t\t\t\"statusCode\" in error && error.statusCode ? error.statusCode : 400\n\t\t) as ContentfulStatusCode;\n\t\tpublic_ = true;\n\t\tgroup = error.group;\n\t\tcode = error.code;\n\t\tmessage = getErrorMessage(error);\n\t\tmetadata = error.metadata;\n\n\t\tlogger.info({\n\t\t\tmsg: \"public error\",\n\t\t\tgroup,\n\t\t\tcode,\n\t\t\tmessage,\n\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t...extraLog,\n\t\t});\n\t} else if (exposeInternalError) {\n\t\tif (errors.ActorError.isActorError(error)) {\n\t\t\tstatusCode = 500;\n\t\t\tpublic_ = false;\n\t\t\tgroup = error.group;\n\t\t\tcode = error.code;\n\t\t\tmessage = getErrorMessage(error);\n\t\t\tmetadata = error.metadata;\n\n\t\t\tlogger.info({\n\t\t\t\tmsg: \"internal error\",\n\t\t\t\tgroup,\n\t\t\t\tcode,\n\t\t\t\tmessage,\n\t\t\t\tstack: (error as Error)?.stack,\n\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t\t...extraLog,\n\t\t\t});\n\t\t} else {\n\t\t\tstatusCode = 500;\n\t\t\tpublic_ = false;\n\t\t\tgroup = \"rivetkit\";\n\t\t\tcode = errors.INTERNAL_ERROR_CODE;\n\t\t\tmessage = getErrorMessage(error);\n\n\t\t\tlogger.info({\n\t\t\t\tmsg: \"internal error\",\n\t\t\t\tgroup,\n\t\t\t\tcode,\n\t\t\t\tmessage,\n\t\t\t\tstack: (error as Error)?.stack,\n\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t\t...extraLog,\n\t\t\t});\n\t\t}\n\t} else {\n\t\tstatusCode = 500;\n\t\tpublic_ = false;\n\t\tgroup = \"rivetkit\";\n\t\tcode = errors.INTERNAL_ERROR_CODE;\n\t\tmessage = errors.INTERNAL_ERROR_DESCRIPTION;\n\t\tmetadata = {\n\t\t\t//url: `https://hub.rivet.dev/projects/${actorMetadata.project.slug}/environments/${actorMetadata.environment.slug}/actors?actorId=${actorMetadata.actor.id}`,\n\t\t} satisfies errors.InternalErrorMetadata;\n\n\t\tlogger.warn({\n\t\t\tmsg: \"internal error\",\n\t\t\terror: getErrorMessage(error),\n\t\t\tstack: (error as Error)?.stack,\n\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t...extraLog,\n\t\t});\n\t}\n\n\treturn {\n\t\t__type: \"ActorError\",\n\t\tstatusCode,\n\t\tpublic: public_,\n\t\tgroup,\n\t\tcode,\n\t\tmessage,\n\t\tmetadata,\n\t};\n}\n\nexport function stringifyError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\tif (\n\t\t\ttypeof process !== \"undefined\" &&\n\t\t\tgetLogErrorStack()\n\t\t) {\n\t\t\treturn `${error.name}: ${error.message}${error.stack ? `\\n${error.stack}` : \"\"}`;\n\t\t} else {\n\t\t\treturn `${error.name}: ${error.message}`;\n\t\t}\n\t} else if (typeof error === \"string\") {\n\t\treturn error;\n\t} else if (typeof error === \"object\" && error !== null) {\n\t\ttry {\n\t\t\treturn `${JSON.stringify(error)}`;\n\t\t} catch {\n\t\t\treturn \"[cannot stringify error]\";\n\t\t}\n\t} else {\n\t\treturn `Unknown error: ${getErrorMessage(error)}`;\n\t}\n}\n\nfunction getErrorMessage(err: unknown): string {\n\tif (\n\t\terr &&\n\t\ttypeof err === \"object\" &&\n\t\t\"message\" in err &&\n\t\ttypeof err.message === \"string\"\n\t) {\n\t\treturn err.message;\n\t} else {\n\t\treturn String(err);\n\t}\n}\n\n/** Generates a `Next` handler to pass to middleware in order to be able to call arbitrary middleware. */\nexport function noopNext(): Next {\n\treturn async () => { };\n}\n","{\n\t\"name\": \"rivetkit\",\n\t\"version\": \"2.1.2\",\n\t\"description\": \"Lightweight libraries for building stateful actors on edge platforms\",\n\t\"license\": \"Apache-2.0\",\n\t\"keywords\": [\n\t\t\"rivetkit\",\n\t\t\"stateful\",\n\t\t\"serverless\",\n\t\t\"actors\",\n\t\t\"agents\",\n\t\t\"realtime\",\n\t\t\"websocket\",\n\t\t\"actors\",\n\t\t\"framework\"\n\t],\n\t\"files\": [\n\t\t\"dist\",\n\t\t\"src\",\n\t\t\"deno.json\",\n\t\t\"bun.json\",\n\t\t\"package.json\"\n\t],\n\t\"type\": \"module\",\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./workflow\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/workflow/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/workflow/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/workflow/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/workflow/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./client\": {\n\t\t\t\"import\": {\n\t\t\t\t\"browser\": {\n\t\t\t\t\t\"types\": \"./dist/browser/client.d.ts\",\n\t\t\t\t\t\"default\": \"./dist/browser/client.js\"\n\t\t\t\t},\n\t\t\t\t\"types\": \"./dist/tsup/client/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/client/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/client/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/client/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./log\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/common/log.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/common/log.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/common/log.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/common/log.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./errors\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/actor/errors.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/actor/errors.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/actor/errors.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/actor/errors.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./utils\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/utils.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/utils.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/utils.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/utils.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./driver-helpers\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/driver-helpers/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/driver-helpers/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/driver-helpers/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/driver-helpers/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./driver-helpers/websocket\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/common/websocket.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/common/websocket.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/common/websocket.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/common/websocket.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./driver-test-suite\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/driver-test-suite/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/driver-test-suite/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/driver-test-suite/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/driver-test-suite/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./serve-test-suite\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/serve-test-suite/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/serve-test-suite/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/serve-test-suite/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/serve-test-suite/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./topologies/coordinate\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/topologies/coordinate/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/topologies/coordinate/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/topologies/coordinate/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/topologies/coordinate/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./topologies/partition\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/topologies/partition/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/topologies/partition/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/topologies/partition/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/topologies/partition/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./test\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/test/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/test/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/test/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/test/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./inspector\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/inspector/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/inspector/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/inspector/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/inspector/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./inspector/client\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/browser/inspector/client.d.ts\",\n\t\t\t\t\"default\": \"./dist/browser/inspector/client.js\"\n\t\t\t}\n\t\t},\n\t\t\"./db\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./db/drizzle\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/drizzle/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/drizzle/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/drizzle/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/drizzle/mod.cjs\"\n\t\t\t}\n\t\t}\n\t},\n\t\"engines\": {\n\t\t\"node\": \">=22.0.0\"\n\t},\n\t\"sideEffects\": [\n\t\t\"./dist/tsup/chunk-*.js\",\n\t\t\"./dist/tsup/chunk-*.cjs\"\n\t],\n\t\"scripts\": {\n \t\t\"build\": \"tsup src/mod.ts src/client/mod.ts src/common/log.ts src/common/websocket.ts src/actor/errors.ts src/topologies/coordinate/mod.ts src/topologies/partition/mod.ts src/utils.ts src/driver-helpers/mod.ts src/driver-test-suite/mod.ts src/serve-test-suite/mod.ts src/test/mod.ts src/inspector/mod.ts src/workflow/mod.ts src/db/mod.ts src/db/drizzle/mod.ts\",\n\t\t\"build:browser\": \"tsup --config tsup.browser.config.ts\",\n\t\t\"build:schema\": \"./scripts/compile-bare.ts compile schemas/client-protocol/v1.bare -o dist/schemas/client-protocol/v1.ts && ./scripts/compile-bare.ts compile schemas/client-protocol/v2.bare -o dist/schemas/client-protocol/v2.ts && ./scripts/compile-bare.ts compile schemas/client-protocol/v3.bare -o dist/schemas/client-protocol/v3.ts && ./scripts/compile-bare.ts compile schemas/file-system-driver/v1.bare -o dist/schemas/file-system-driver/v1.ts && ./scripts/compile-bare.ts compile schemas/file-system-driver/v2.bare -o dist/schemas/file-system-driver/v2.ts && ./scripts/compile-bare.ts compile schemas/file-system-driver/v3.bare -o dist/schemas/file-system-driver/v3.ts && ./scripts/compile-bare.ts compile schemas/actor-persist/v1.bare -o dist/schemas/actor-persist/v1.ts && ./scripts/compile-bare.ts compile schemas/actor-persist/v2.bare -o dist/schemas/actor-persist/v2.ts && ./scripts/compile-bare.ts compile schemas/actor-persist/v3.bare -o dist/schemas/actor-persist/v3.ts && ./scripts/compile-bare.ts compile schemas/actor-persist/v4.bare -o dist/schemas/actor-persist/v4.ts && ./scripts/compile-bare.ts compile schemas/persist/v1.bare -o dist/schemas/persist/v1.ts && ./scripts/compile-bare.ts compile schemas/transport/v1.bare -o dist/schemas/transport/v1.ts && ./scripts/compile-bare.ts compile schemas/actor-inspector/v1.bare -o dist/schemas/actor-inspector/v1.ts && ./scripts/compile-bare.ts compile schemas/actor-inspector/v2.bare -o dist/schemas/actor-inspector/v2.ts && ./scripts/compile-bare.ts compile schemas/actor-inspector/v3.bare -o dist/schemas/actor-inspector/v3.ts\",\n\t\t\"check-types\": \"tsc --noEmit\",\n\t\t\"lint\": \"biome check .\",\n\t\t\"lint:fix\": \"biome check --write .\",\n\t\t\"format\": \"biome format .\",\n\t\t\"format:write\": \"biome format --write .\",\n\t\t\"test\": \"vitest run\",\n\t\t\"test:watch\": \"vitest\",\n\t\t\"manager-openapi-gen\": \"tsx scripts/manager-openapi-gen.ts\",\n\t\t\"dump-asyncapi\": \"tsx scripts/dump-asyncapi.ts\",\n\t\t\"registry-config-schema-gen\": \"tsx scripts/registry-config-schema-gen.ts\",\n\t\t\"actor-config-schema-gen\": \"tsx scripts/actor-config-schema-gen.ts\",\n\t\t\"build:pack-inspector\": \"tsx scripts/pack-inspector.ts\"\n\t},\n\t\"dependencies\": {\n\t\t\"@hono/standard-validator\": \"^0.1.3\",\n\t\t\"@hono/zod-openapi\": \"^1.1.5\",\n\t\t\"@rivetkit/bare-ts\": \"^0.6.2\",\n\t\t\"@rivetkit/engine-runner\": \"workspace:*\",\n\t\t\"@rivetkit/fast-json-patch\": \"^3.1.2\",\n\t\t\"@rivetkit/on-change\": \"^6.0.2-rc.1\",\n\t\t\"@rivetkit/sqlite-vfs\": \"workspace:*\",\n\t\t\"@rivetkit/traces\": \"workspace:*\",\n\t\t\"@rivetkit/virtual-websocket\": \"workspace:*\",\n\t\t\"@rivetkit/workflow-engine\": \"workspace:*\",\n\t\t\"cbor-x\": \"^1.6.0\",\n\t\t\"get-port\": \"^7.1.0\",\n\t\t\"hono\": \"^4.7.0\",\n\t\t\"invariant\": \"^2.2.4\",\n\t\t\"nanoevents\": \"^9.1.0\",\n\t\t\"p-retry\": \"^6.2.1\",\n\t\t\"pino\": \"^9.5.0\",\n\t\t\"tar\": \"^7.5.0\",\n\t\t\"uuid\": \"^12.0.0\",\n\t\t\"vbare\": \"^0.0.4\",\n\t\t\"@rivetkit/sqlite\": \"^0.1.1\",\n\t\t\"zod\": \"^4.1.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@bare-ts/tools\": \"^0.13.0\",\n\t\t\"@biomejs/biome\": \"^2.3\",\n\t\t\"@hono/node-server\": \"^1.18.2\",\n\t\t\"@hono/node-ws\": \"^1.1.1\",\n\t\t\"@standard-schema/spec\": \"^1.0.0\",\n\t\t\"@types/invariant\": \"^2\",\n\t\t\"@types/node\": \"^22.13.1\",\n\t\t\"@types/ws\": \"^8\",\n\t\t\"@vitest/ui\": \"3.1.1\",\n\t\t\"cli-table3\": \"^0.6.5\",\n\t\t\"commander\": \"^12.1.0\",\n\t\t\"eventsource\": \"^4.0.0\",\n\t\t\"local-pkg\": \"^0.5.1\",\n\t\t\"tsup\": \"^8.4.0\",\n\t\t\"tsx\": \"^4.19.4\",\n\t\t\"typescript\": \"^5.7.3\",\n\t\t\"vite-tsconfig-paths\": \"^5.1.4\",\n\t\t\"vitest\": \"^3.1.1\",\n\t\t\"ws\": \"^8.18.1\",\n\t\t\"zod-to-json-schema\": \"^3.25.0\"\n\t},\n\t\"peerDependencies\": {\n\t\t\"@hono/node-server\": \"^1.14.0\",\n\t\t\"@hono/node-ws\": \"^1.1.1\",\n\t\t\"drizzle-kit\": \"^0.31.2\",\n\t\t\"drizzle-orm\": \"^0.44.2\",\n\t\t\"eventsource\": \"^4.0.0\",\n\t\t\"ws\": \"^8.0.0\"\n\t},\n\t\"peerDependenciesMeta\": {\n\t\t\"@hono/node-server\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@hono/node-ws\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"drizzle-kit\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"drizzle-orm\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eventsource\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"ws\": {\n\t\t\t\"optional\": true\n\t\t}\n\t},\n\t\"stableVersion\": \"0.8.0\"\n}\n","import {\n\ttype LevelWithSilent,\n\ttype Logger,\n\tpino,\n\tstdTimeFunctions,\n} from \"pino\";\nimport { z } from \"zod/v4\";\nimport { getLogLevel, getLogTarget, getLogTimestamp } from \"@/utils/env-vars\";\nimport {\n\tcastToLogValue,\n\tformatTimestamp,\n\tLOGGER_CONFIG,\n\tstringify,\n} from \"./logfmt\";\n\nexport type { Logger } from \"pino\";\n\nlet baseLogger: Logger | undefined;\nlet configuredLogLevel: LogLevel | undefined;\n\n/** Cache of child loggers by logger name. */\nconst loggerCache = new Map<string, Logger>();\n\nexport const LogLevelSchema = z.enum([\n\t\"trace\",\n\t\"debug\",\n\t\"info\",\n\t\"warn\",\n\t\"error\",\n\t\"fatal\",\n\t\"silent\",\n]);\n\nexport type LogLevel = z.infer<typeof LogLevelSchema>;\n\nexport function getPinoLevel(logLevel?: LogLevel): LevelWithSilent {\n\t// Priority: provided > configured > env > default\n\tif (logLevel) {\n\t\treturn logLevel;\n\t}\n\n\tif (configuredLogLevel) {\n\t\treturn configuredLogLevel;\n\t}\n\n\tconst raw = (getLogLevel() || \"warn\").toString().toLowerCase();\n\n\tconst parsed = LogLevelSchema.safeParse(raw);\n\tif (parsed.success) {\n\t\treturn parsed.data;\n\t}\n\n\t// Default to info if invalid\n\treturn \"info\";\n}\n\nexport function getIncludeTarget(): boolean {\n\treturn getLogTarget();\n}\n\n/**\n * Configure a custom base logger.\n */\nexport function configureBaseLogger(logger: Logger): void {\n\tbaseLogger = logger;\n\tloggerCache.clear();\n}\n\n// TODO: This can be simplified in logfmt.ts\nfunction customWrite(level: string, o: any) {\n\tconst entries: any = {};\n\n\t// Add timestamp if enabled\n\tif (getLogTimestamp() && o.time) {\n\t\tconst date = typeof o.time === \"number\" ? new Date(o.time) : new Date();\n\t\tentries.ts = formatTimestamp(date);\n\t}\n\n\t// Add level\n\tentries.level = level.toUpperCase();\n\n\t// Add target if present\n\tif (o.target) {\n\t\tentries.target = o.target;\n\t}\n\n\t// Add message\n\tif (o.msg) {\n\t\tentries.msg = o.msg;\n\t}\n\n\t// Add other properties\n\tfor (const [key, value] of Object.entries(o)) {\n\t\tif (\n\t\t\tkey !== \"time\" &&\n\t\t\tkey !== \"level\" &&\n\t\t\tkey !== \"target\" &&\n\t\t\tkey !== \"msg\" &&\n\t\t\tkey !== \"pid\" &&\n\t\t\tkey !== \"hostname\"\n\t\t) {\n\t\t\tentries[key] = castToLogValue(value);\n\t\t}\n\t}\n\n\tconst output = stringify(entries);\n\tconsole.log(output);\n}\n\n/**\n * Configure the default logger with optional log level.\n */\nexport function configureDefaultLogger(logLevel?: LogLevel) {\n\t// Store the configured log level\n\tif (logLevel) {\n\t\tconfiguredLogLevel = logLevel;\n\t}\n\n\tbaseLogger = pino({\n\t\tlevel: getPinoLevel(logLevel),\n\t\tmessageKey: \"msg\",\n\t\t// Do not include pid/hostname in output\n\t\tbase: {},\n\t\t// Keep a string level in the output\n\t\tformatters: {\n\t\t\tlevel(_label: string, number: number) {\n\t\t\t\treturn { level: number };\n\t\t\t},\n\t\t},\n\t\ttimestamp: getLogTimestamp() ? stdTimeFunctions.epochTime : false,\n\t\tbrowser: {\n\t\t\twrite: {\n\t\t\t\tfatal: customWrite.bind(null, \"fatal\"),\n\t\t\t\terror: customWrite.bind(null, \"error\"),\n\t\t\t\twarn: customWrite.bind(null, \"warn\"),\n\t\t\t\tinfo: customWrite.bind(null, \"info\"),\n\t\t\t\tdebug: customWrite.bind(null, \"debug\"),\n\t\t\t\ttrace: customWrite.bind(null, \"trace\"),\n\t\t\t},\n\t\t},\n\t\thooks: {\n\t\t\tlogMethod(inputArgs, method, level) {\n\t\t\t\t// TODO: This is a hack to not implement our own Pino transport target. We can get better perf if we have our own transport target.\n\n\t\t\t\tconst levelMap: Record<number, string> = {\n\t\t\t\t\t10: \"trace\",\n\t\t\t\t\t20: \"debug\",\n\t\t\t\t\t30: \"info\",\n\t\t\t\t\t40: \"warn\",\n\t\t\t\t\t50: \"error\",\n\t\t\t\t\t60: \"fatal\",\n\t\t\t\t};\n\t\t\t\tconst levelName = levelMap[level] || \"info\";\n\t\t\t\tconst time = getLogTimestamp() ? Date.now() : undefined;\n\n\t\t\t\t// Get bindings from the logger instance (child logger fields)\n\t\t\t\tconst bindings = (this as any).bindings?.() || {};\n\n\t\t\t\t// TODO: This can be simplified in logfmt.ts\n\t\t\t\tif (inputArgs.length >= 2) {\n\t\t\t\t\tconst [objOrMsg, msg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, {\n\t\t\t\t\t\t\t...bindings,\n\t\t\t\t\t\t\t...objOrMsg,\n\t\t\t\t\t\t\tmsg,\n\t\t\t\t\t\t\ttime,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, {\n\t\t\t\t\t\t\t...bindings,\n\t\t\t\t\t\t\tmsg: String(objOrMsg),\n\t\t\t\t\t\t\ttime,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (inputArgs.length === 1) {\n\t\t\t\t\tconst [objOrMsg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, {\n\t\t\t\t\t\t\t...bindings,\n\t\t\t\t\t\t\t...objOrMsg,\n\t\t\t\t\t\t\ttime,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, {\n\t\t\t\t\t\t\t...bindings,\n\t\t\t\t\t\t\tmsg: String(objOrMsg),\n\t\t\t\t\t\t\ttime,\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\tloggerCache.clear();\n}\n\n/**\n * Get or initialize the base logger.\n */\nexport function getBaseLogger(): Logger {\n\tif (!baseLogger) {\n\t\tconfigureDefaultLogger();\n\t}\n\treturn baseLogger!;\n}\n\n/**\n * Returns a child logger with `target` bound for the given name.\n */\nexport function getLogger(name = \"default\"): Logger {\n\t// Check cache first\n\tconst cached = loggerCache.get(name);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\t// Create\n\tconst base = getBaseLogger();\n\n\t// Add target to log if enabled\n\tconst child = getIncludeTarget() ? base.child({ target: name }) : base;\n\n\t// Cache the logger\n\tloggerCache.set(name, child);\n\n\treturn child;\n}\n","export type LogLevel =\n\t| \"TRACE\"\n\t| \"DEBUG\"\n\t| \"INFO\"\n\t| \"WARN\"\n\t| \"ERROR\"\n\t| \"CRITICAL\";\n\nexport const LogLevels: Record<LogLevel, LevelIndex> = {\n\tTRACE: 0,\n\tDEBUG: 1,\n\tINFO: 2,\n\tWARN: 3,\n\tERROR: 4,\n\tCRITICAL: 5,\n} as const;\n\nexport const LevelNameMap: Record<number, LogLevel> = {\n\t0: \"TRACE\",\n\t1: \"DEBUG\",\n\t2: \"INFO\",\n\t3: \"WARN\",\n\t4: \"ERROR\",\n\t5: \"CRITICAL\",\n};\n\nexport type LevelIndex = number;\n","import { type LogLevel, LogLevels } from \"./log-levels\";\n\nconst LOG_LEVEL_COLORS: Record<number, string> = {\n\t[LogLevels.CRITICAL]: \"\\x1b[31m\", // Red\n\t[LogLevels.ERROR]: \"\\x1b[31m\", // Red\n\t[LogLevels.WARN]: \"\\x1b[33m\", // Yellow\n\t[LogLevels.INFO]: \"\\x1b[32m\", // Green\n\t[LogLevels.DEBUG]: \"\\x1b[36m\", // Cyan\n\t[LogLevels.TRACE]: \"\\x1b[36m\", // Cyan\n};\n\nconst RESET_COLOR = \"\\x1b[0m\";\n\n/**\n * Serializes logfmt line from an object.\n *\n * ## Styling Methodology\n *\n * The three things you need to know for every log line is the level, the\n * message, and who called it. These properties are highlighted in different colros\n * and sorted in th eorder that you usually read them.\n *\n * Once you've found a log line you care about, then you want to find the\n * property you need to see. The property names are bolded and the default color\n * while the rest of the data is dim. This lets you scan to find the property\n * name quickly then look closer to read the data associated with the\n * property.\n */\nexport function stringify(data: any) {\n\tlet line = \"\";\n\tconst entries = Object.entries(data);\n\n\tfor (let i = 0; i < entries.length; i++) {\n\t\tconst [key, valueRaw] = entries[i];\n\n\t\tlet isNull = false;\n\t\tlet valueString: string;\n\t\tif (valueRaw == null) {\n\t\t\tisNull = true;\n\t\t\tvalueString = \"\";\n\t\t} else {\n\t\t\tvalueString = valueRaw.toString();\n\t\t}\n\n\t\t// Clip value unless specifically the error message\n\t\tif (valueString.length > 512 && key !== \"msg\" && key !== \"error\")\n\t\t\tvalueString = `${valueString.slice(0, 512)}...`;\n\n\t\tconst needsQuoting =\n\t\t\tvalueString.indexOf(\" \") > -1 || valueString.indexOf(\"=\") > -1;\n\t\tconst needsEscaping =\n\t\t\tvalueString.indexOf('\"') > -1 || valueString.indexOf(\"\\\\\") > -1;\n\n\t\tvalueString = valueString.replace(/\\n/g, \"\\\\n\");\n\t\tif (needsEscaping) valueString = valueString.replace(/[\"\\\\]/g, \"\\\\$&\");\n\t\tif (needsQuoting || needsEscaping) valueString = `\"${valueString}\"`;\n\t\tif (valueString === \"\" && !isNull) valueString = '\"\"';\n\n\t\tif (LOGGER_CONFIG.enableColor) {\n\t\t\t// With color\n\n\t\t\t// Special message colors\n\t\t\tlet color = \"\\x1b[2m\";\n\t\t\tif (key === \"level\") {\n\t\t\t\tconst level = LogLevels[valueString as LogLevel];\n\t\t\t\tconst levelColor = LOG_LEVEL_COLORS[level];\n\t\t\t\tif (levelColor) {\n\t\t\t\t\tcolor = levelColor;\n\t\t\t\t}\n\t\t\t} else if (key === \"msg\") {\n\t\t\t\tcolor = \"\\x1b[32m\";\n\t\t\t} else if (key === \"trace\") {\n\t\t\t\tcolor = \"\\x1b[34m\";\n\t\t\t}\n\n\t\t\t// Format line\n\t\t\tline += `\\x1b[0m\\x1b[1m${key}\\x1b[0m\\x1b[2m=\\x1b[0m${color}${valueString}${RESET_COLOR}`;\n\t\t} else {\n\t\t\t// No color\n\t\t\tline += `${key}=${valueString}`;\n\t\t}\n\n\t\tif (i !== entries.length - 1) {\n\t\t\tline += \" \";\n\t\t}\n\t}\n\n\treturn line;\n}\n\nexport function formatTimestamp(date: Date): string {\n\tconst year = date.getUTCFullYear();\n\tconst month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n\tconst day = String(date.getUTCDate()).padStart(2, \"0\");\n\tconst hours = String(date.getUTCHours()).padStart(2, \"0\");\n\tconst minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n\tconst seconds = String(date.getUTCSeconds()).padStart(2, \"0\");\n\tconst milliseconds = String(date.getUTCMilliseconds()).padStart(3, \"0\");\n\n\treturn `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}Z`;\n}\n\nexport function castToLogValue(v: unknown): any {\n\tif (\n\t\ttypeof v === \"string\" ||\n\t\ttypeof v === \"number\" ||\n\t\ttypeof v === \"bigint\" ||\n\t\ttypeof v === \"boolean\" ||\n\t\tv === null ||\n\t\tv === undefined\n\t) {\n\t\treturn v;\n\t}\n\tif (v instanceof Error) {\n\t\t//args.push(...errorToLogEntries(k, v));\n\t\treturn String(v);\n\t}\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch {\n\t\treturn \"[cannot stringify]\";\n\t}\n}\n\n// MARK: Config\ninterface GlobalLoggerConfig {\n\tenableColor: boolean;\n\tenableSpreadObject: boolean;\n\tenableErrorStack: boolean;\n}\n\nexport const LOGGER_CONFIG: GlobalLoggerConfig = {\n\tenableColor: false,\n\tenableSpreadObject: false,\n\tenableErrorStack: false,\n};\n\n// MARK: Utils\n/**\n * Converts an object in to an easier to read KV of entries.\n */\nexport function spreadObjectToLogEntries(base: string, data: unknown): any {\n\tif (\n\t\tLOGGER_CONFIG.enableSpreadObject &&\n\t\ttypeof data === \"object\" &&\n\t\t!Array.isArray(data) &&\n\t\tdata !== null &&\n\t\tObject.keys(data).length !== 0 &&\n\t\tObject.keys(data).length < 16\n\t) {\n\t\tconst logData: any = {};\n\t\tfor (const key in data) {\n\t\t\tObject.assign(\n\t\t\t\tlogData,\n\t\t\t\tspreadObjectToLogEntries(\n\t\t\t\t\t`${base}.${key}`,\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: FIXME\n\t\t\t\t\t(data as any)[key],\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn logData;\n\t}\n\n\treturn { [base]: JSON.stringify(data) };\n}\n\nexport function errorToLogEntries(base: string, error: unknown): any {\n\tif (error instanceof Error) {\n\t\treturn {\n\t\t\t[`${base}.message`]: error.message,\n\t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n\t\t\t\t? { [`${base}.stack`]: formatStackTrace(error.stack) }\n\t\t\t\t: {}),\n\t\t\t...(error.cause\n\t\t\t\t? errorToLogEntries(`${base}.cause`, error.cause)\n\t\t\t\t: {}),\n\t\t};\n\t}\n\treturn { [base]: `${error}` };\n}\n\n// export function errorToLogEntries(base: string, error: unknown): LogEntry[] {\n// \tif (error instanceof RuntimeError) {\n// \t\treturn [\n// \t\t\t[`${base}.code`, error.code],\n// \t\t\t[`${base}.description`, error.errorConfig?.description],\n// \t\t\t[`${base}.module`, error.moduleName],\n// \t\t\t...(error.trace ? [[`${base}.trace`, stringifyTrace(error.trace)] as LogEntry] : []),\n// \t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n// \t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n// \t\t\t\t: []),\n// \t\t\t...(error.meta ? [[`${base}.meta`, JSON.stringify(error.meta)] as LogEntry] : []),\n// \t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n// \t\t];\n// \t} else if (error instanceof Error) {\n// \t\treturn [\n// \t\t\t[`${base}.name`, error.name],\n// \t\t\t[`${base}.message`, error.message],\n// \t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n// \t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n// \t\t\t\t: []),\n// \t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n// \t\t];\n// \t} else {\n// \t\treturn [\n// \t\t\t[base, `${error}`],\n// \t\t];\n// \t}\n// }\n\n/**\n * Formats a JS stack trace in to a legible one-liner.\n */\nfunction formatStackTrace(stackTrace: string): string {\n\tconst regex = /at (.+?)$/gm;\n\tconst matches = [...stackTrace.matchAll(regex)];\n\t// Reverse array since the stack goes from top level -> bottom level\n\tmatches.reverse();\n\treturn matches.map((match) => match[1].trim()).join(\" > \");\n}\n","import { stringifyError } from \"@/common/utils\";\nimport type { Context as HonoContext, Handler as HonoHandler } from \"hono\";\nimport { stringify as uuidstringify } from \"uuid\";\nimport pkgJson from \"../package.json\" with { type: \"json\" };\nimport { getLogger } from \"./common/log\";\nimport { assertUnreachable } from \"./common/utils\";\n\n/** @experimental */\nexport { stringifyError };\n\n/** @experimental */\nexport { assertUnreachable };\n\n/**\n * Joins multiple abort signals into one.\n *\n * The returned signal aborts when the first input signal aborts.\n * Uses `AbortSignal.any(...)` when available, with a runtime fallback.\n *\n * @experimental\n */\nexport function joinSignals(\n\t...signals: Array<AbortSignal | undefined | null>\n): AbortSignal {\n\tconst validSignals = signals.filter(\n\t\t(signal): signal is AbortSignal => signal != null,\n\t);\n\n\tif (validSignals.length === 0) {\n\t\treturn new AbortController().signal;\n\t}\n\n\tif (validSignals.length === 1) {\n\t\treturn validSignals[0];\n\t}\n\n\tconst signalAny = (\n\t\tAbortSignal as typeof AbortSignal & {\n\t\t\tany?: (signals: AbortSignal[]) => AbortSignal;\n\t\t}\n\t).any;\n\tif (typeof signalAny === \"function\") {\n\t\treturn signalAny(validSignals);\n\t}\n\n\tconst controller = new AbortController();\n\tconst cleanups: Array<() => void> = [];\n\n\tconst abortWithSignal = (signal: AbortSignal) => {\n\t\tif (controller.signal.aborted) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const cleanup of cleanups) {\n\t\t\tcleanup();\n\t\t}\n\n\t\tconst reason = (signal as AbortSignal & { reason?: unknown }).reason;\n\t\tcontroller.abort(reason);\n\t};\n\n\tfor (const signal of validSignals) {\n\t\tif (signal.aborted) {\n\t\t\tabortWithSignal(signal);\n\t\t\tbreak;\n\t\t}\n\n\t\tconst onAbort = () => abortWithSignal(signal);\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tcleanups.push(() => signal.removeEventListener(\"abort\", onAbort));\n\t}\n\n\treturn controller.signal;\n}\n\n/**\n * Returns a promise that resolves after the given number of milliseconds.\n *\n * @experimental\n */\nexport function sleep(ms: number): Promise<void> {\n\treturn new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Creates a fixed-rate interval tick function that can be awaited in a loop.\n *\n * @example\n * const tick = interval(100);\n * while (!c.aborted) {\n * await tick();\n * if (c.aborted) break;\n * // ... game logic\n * }\n *\n * @experimental\n */\nexport function interval(ms: number): () => Promise<void> {\n\treturn () => sleep(ms);\n}\n\nexport const VERSION = pkgJson.version;\n\nlet _userAgent: string | undefined;\n\nfunction logger() {\n\treturn getLogger(\"utils\");\n}\n\n/**\n * Builds the HTTP user agent used by this library.\n *\n * @experimental\n */\nexport function httpUserAgent(): string {\n\t// Return cached value if already initialized\n\tif (_userAgent !== undefined) {\n\t\treturn _userAgent;\n\t}\n\n\t// Library\n\tlet userAgent = `RivetKit/${VERSION}`;\n\n\t// Navigator\n\tconst navigatorObj =\n\t\ttypeof navigator !== \"undefined\" ? navigator : undefined;\n\tif (navigatorObj?.userAgent) userAgent += ` ${navigatorObj.userAgent}`;\n\n\t_userAgent = userAgent;\n\n\treturn userAgent;\n}\n\nexport type UpgradeWebSocket = (\n\tcreateEvents: (c: HonoContext) => any,\n) => HonoHandler;\n\nexport type GetUpgradeWebSocket = () => UpgradeWebSocket;\n\n/**\n * Reads an environment variable from Deno or Node runtimes.\n *\n * @experimental\n */\nexport function getEnvUniversal(key: string): string | undefined {\n\tif (typeof Deno !== \"undefined\") {\n\t\treturn Deno.env.get(key);\n\t} else if (typeof process !== \"undefined\") {\n\t\t// Do this after Deno since `process` is sometimes polyfilled\n\t\treturn process.env[key];\n\t}\n}\n\n/**\n * Traces a debug value and returns it.\n *\n * @experimental\n */\nexport function dbg<T>(x: T): T {\n\tconsole.trace(`=== DEBUG ===\\n${x}`);\n\treturn x;\n}\n\n/**\n * Converts various ArrayBuffer-like types to Uint8Array.\n * Handles ArrayBuffer, ArrayBufferView (including typed arrays), and passes through existing Uint8Array.\n *\n * @param data - The ArrayBuffer or ArrayBufferView to convert\n * @returns A Uint8Array view of the data\n *\n * @experimental\n */\nexport function toUint8Array(data: ArrayBuffer | ArrayBufferView): Uint8Array {\n\tif (data instanceof Uint8Array) {\n\t\treturn data;\n\t} else if (data instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(data);\n\t} else if (ArrayBuffer.isView(data)) {\n\t\t// Handle other ArrayBufferView types (Int8Array, Uint16Array, DataView, etc.)\n\t\treturn new Uint8Array(\n\t\t\tdata.buffer.slice(\n\t\t\t\tdata.byteOffset,\n\t\t\t\tdata.byteOffset + data.byteLength,\n\t\t\t),\n\t\t);\n\t} else {\n\t\tthrow new TypeError(\"Input must be ArrayBuffer or ArrayBufferView\");\n\t}\n}\n\n// Long timeouts\n//\n// JavaScript timers use a signed 32-bit integer for delays, so values above 2^31-1 (~24.8 days)\n// are not reliable and may fire immediately or overflow.\n//\n// https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#maximum_delay_value\nconst TIMEOUT_MAX = 2147483647; // 2^31-1\n\nexport type LongTimeoutHandle = { abort: () => void };\n\n/**\n * Polyfill for Promise.withResolvers().\n *\n * This is specifically for Cloudflare Workers. Their implementation of Promise.withResolvers does not work correctly.\n *\n * @experimental\n */\nexport function promiseWithResolvers<T>(onReject: (reason?: any) => void): {\n\tpromise: Promise<T>;\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n} {\n\tlet resolve!: (value: T | PromiseLike<T>) => void;\n\tlet reject!: (reason?: any) => void;\n\tconst promise = new Promise<T>((res, rej) => {\n\t\tresolve = res;\n\t\treject = rej;\n\t});\n\tpromise.catch(onReject);\n\treturn { promise, resolve, reject };\n}\n\n/**\n * Sets a timeout that supports delays larger than the JavaScript timer limit.\n *\n * @experimental\n */\nexport function setLongTimeout(\n\tlistener: () => void,\n\tafter: number,\n): LongTimeoutHandle {\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\n\tfunction start(remaining: number) {\n\t\tif (remaining <= TIMEOUT_MAX) {\n\t\t\ttimeout = setTimeout(listener, remaining);\n\t\t} else {\n\t\t\ttimeout = setTimeout(() => {\n\t\t\t\tstart(remaining - TIMEOUT_MAX);\n\t\t\t}, TIMEOUT_MAX);\n\t\t}\n\t}\n\n\tstart(after);\n\n\treturn {\n\t\tabort: () => {\n\t\t\tif (timeout !== undefined) clearTimeout(timeout);\n\t\t},\n\t};\n}\n\n/**\n * A tiny utility that coalesces/enqueues async operations so only the latest\n * queued task runs per cycle, while callers receive a promise that resolves\n * when the task for the cycle they joined has completed.\n */\nexport class SinglePromiseQueue {\n\t/** Next operation to execute in the queue. If attempting to enqueue another op, it will override the existing op. */\n\t#queuedOp?: () => Promise<void>;\n\n\t/** The currently running promise of #drainLoop. Do not await this, instead await `pending` to await the current cycle. */\n\trunningDrainLoop?: Promise<void>;\n\n\t/** Pending resolver fro the currently queued entry. */\n\t#pending?: ReturnType<typeof promiseWithResolvers<void>>;\n\n\t/** Queue the next operation and return a promise that resolves when it flushes. */\n\tenqueue(op: () => Promise<void>): Promise<void> {\n\t\t// Replace any previously queued operation with the latest one\n\t\tthis.#queuedOp = op;\n\n\t\t// Ensure a shared resolver exists for all callers in this cycle\n\t\tif (!this.#pending) {\n\t\t\tthis.#pending = promiseWithResolvers<void>((reason) => logger().warn({ msg: \"unhandled single promise queue rejection\", reason }));\n\t\t}\n\n\t\tconst waitForThisCycle = this.#pending.promise;\n\n\t\t// Start runner if not already running\n\t\tif (!this.runningDrainLoop) {\n\t\t\tthis.runningDrainLoop = this.#drainLoop();\n\t\t}\n\n\t\treturn waitForThisCycle;\n\t}\n\n\t/** Drain queued operations sequentially until there is nothing left. */\n\tasync #drainLoop(): Promise<void> {\n\t\ttry {\n\t\t\twhile (this.#queuedOp) {\n\t\t\t\t// Capture current cycle resolver then reset for the next cycle\n\t\t\t\tconst resolver = this.#pending;\n\t\t\t\tthis.#pending = undefined;\n\n\t\t\t\t// Capture and clear the currently queued operation\n\t\t\t\tconst op = this.#queuedOp;\n\t\t\t\tthis.#queuedOp = undefined;\n\n\t\t\t\ttry {\n\t\t\t\t\tawait op();\n\t\t\t\t\t// Notify all waiters for this cycle\n\t\t\t\t\tresolver?.resolve();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error in SinglePromiseQueue drain loop\",\n\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t\t// Reject all waiters for this cycle\n\t\t\t\t\tresolver?.reject(err);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.runningDrainLoop = undefined;\n\t\t}\n\t}\n}\n\n/**\n * Converts a Buffer or Uint8Array into an ArrayBuffer view.\n *\n * @experimental\n */\nexport function bufferToArrayBuffer(buf: Buffer | Uint8Array): ArrayBuffer {\n\treturn buf.buffer.slice(\n\t\tbuf.byteOffset,\n\t\tbuf.byteOffset + buf.byteLength,\n\t) as ArrayBuffer;\n}\n\n/**\n * Properly combines a base URL endpoint with a path, preserving any base path in the endpoint.\n *\n * @example\n * combineUrlPath(\"http://localhost:8787/rivet\", \"/actors/action\")\n * // Returns: \"http://localhost:8787/rivet/actors/action\"\n *\n * @example\n * combineUrlPath(\"http://localhost:8787/rivet\", \"/actors?type=foo\", { namespace: \"test\" })\n * // Returns: \"http://localhost:8787/rivet/actors?type=foo&namespace=test\"\n *\n * @param endpoint The base URL endpoint that may contain a path component\n * @param path The path to append to the endpoint (may include query parameters)\n * @param queryParams Optional additional query parameters to append\n * @returns The properly combined URL string\n *\n * @experimental\n */\nexport function combineUrlPath(\n\tendpoint: string,\n\tpath: string,\n\tqueryParams?: Record<string, string | undefined>,\n): string {\n\tconst baseUrl = new URL(endpoint);\n\n\t// Extract path and query from the provided path\n\tconst pathParts = path.split(\"?\");\n\tconst pathOnly = pathParts[0];\n\tconst existingQuery = pathParts[1] || \"\";\n\n\t// Remove trailing slash from base path and ensure path starts with /\n\tconst basePath = baseUrl.pathname.replace(/\\/$/, \"\");\n\tconst cleanPath = pathOnly.startsWith(\"/\") ? pathOnly : `/${pathOnly}`;\n\t// Combine paths and remove any double slashes\n\tconst fullPath = (basePath + cleanPath).replace(/\\/\\//g, \"/\");\n\n\t// Build query string\n\tconst queryParts: string[] = [];\n\tif (existingQuery) {\n\t\tqueryParts.push(existingQuery);\n\t}\n\tif (queryParams) {\n\t\tfor (const [key, value] of Object.entries(queryParams)) {\n\t\t\tif (value !== undefined) {\n\t\t\t\tqueryParts.push(\n\t\t\t\t\t`${encodeURIComponent(key)}=${encodeURIComponent(value)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst fullQuery = queryParts.length > 0 ? `?${queryParts.join(\"&\")}` : \"\";\n\treturn `${baseUrl.protocol}//${baseUrl.host}${fullPath}${fullQuery}`;\n}\n\n/**\n * Compares two ArrayBuffer values by byte content.\n *\n * @experimental\n */\nexport function arrayBuffersEqual(\n\tbuf1: ArrayBuffer,\n\tbuf2: ArrayBuffer,\n): boolean {\n\tif (buf1.byteLength !== buf2.byteLength) return false;\n\n\tconst view1 = new Uint8Array(buf1);\n\tconst view2 = new Uint8Array(buf2);\n\n\tfor (let i = 0; i < view1.length; i++) {\n\t\tif (view1[i] !== view2[i]) return false;\n\t}\n\treturn true;\n}\n\nexport const EXTRA_ERROR_LOG = {\n\tissues: \"https://github.com/rivet-dev/rivetkit/issues\",\n\tsupport: \"https://rivet.dev/discord\",\n\tversion: VERSION,\n};\n\nexport type Runtime = \"deno\" | \"bun\" | \"node\";\n\n/**\n * Detects the current JavaScript runtime from the user agent.\n *\n * @experimental\n */\nexport function detectRuntime(): Runtime {\n\tconst userAgent =\n\t\ttypeof navigator !== \"undefined\" ? navigator.userAgent : \"\";\n\tif (userAgent.includes(\"Deno\")) {\n\t\treturn \"deno\";\n\t}\n\tif (userAgent.includes(\"Bun\")) {\n\t\treturn \"bun\";\n\t}\n\treturn \"node\";\n}\n\nexport type DeepReadonly<T> = {\n\treadonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];\n};\n\nexport type DeepMutable<T> = {\n\t-readonly [K in keyof T]: T[K] extends object ? DeepMutable<T[K]> : T[K];\n};\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"devtools\");\n}\n","import type { ClientConfigInput } from \"@/client/client\";\nimport { VERSION } from \"@/utils\";\nimport { logger } from \"./log\";\n\ndeclare global {\n\t// Injected via tsup config\n\t// biome-ignore lint/style/noVar: required for global declaration\n\tvar CUSTOM_RIVETKIT_DEVTOOLS_URL: string | undefined;\n}\n\nconst DEFAULT_DEVTOOLS_URL = (version = VERSION) =>\n\t`https://releases.rivet.dev/rivet/latest/devtools/mod.js?v=${version}`;\n\nconst scriptId = \"rivetkit-devtools-script\";\n\nexport function injectDevtools(config: ClientConfigInput) {\n\tif (!window) {\n\t\tlogger().warn(\"devtools not available outside browser environment\");\n\t\treturn;\n\t}\n\n\tif (!document.getElementById(scriptId)) {\n\t\tconst script = document.createElement(\"script\");\n\t\tscript.id = scriptId;\n\t\tscript.src =\n\t\t\tglobalThis.CUSTOM_RIVETKIT_DEVTOOLS_URL || DEFAULT_DEVTOOLS_URL();\n\t\tscript.async = true;\n\t\tdocument.head.appendChild(script);\n\t}\n\n\twindow.__rivetkit = window.__rivetkit || [];\n\twindow.__rivetkit.push(config);\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext } from \"hono\";\nimport invariant from \"invariant\";\nimport { deserializeActorKey, serializeActorKey } from \"@/actor/keys\";\nimport type { ClientConfig } from \"@/client/client\";\nimport { noopNext } from \"@/common/utils\";\nimport type {\n\tActorOutput,\n\tCreateInput,\n\tGetForIdInput,\n\tGetOrCreateWithKeyInput,\n\tGetWithKeyInput,\n\tListActorsInput,\n\tManagerDisplayInformation,\n\tManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport type { Actor as ApiActor } from \"@/manager-api/actors\";\nimport type { Encoding, UniversalWebSocket } from \"@/mod\";\nimport { uint8ArrayToBase64 } from \"@/serde\";\nimport { combineUrlPath, type GetUpgradeWebSocket } from \"@/utils\";\nimport { getNextPhase } from \"@/utils/env-vars\";\nimport { sendHttpRequestToActor } from \"./actor-http-client\";\nimport {\n\tbuildActorGatewayUrl,\n\tbuildWebSocketProtocols,\n\topenWebSocketToActor,\n} from \"./actor-websocket-client\";\nimport {\n\tcreateActor,\n\tdestroyActor,\n\tgetActor,\n\tgetActorByKey,\n\tgetOrCreateActor,\n\tkvGet,\n\tlistActorsByName,\n} from \"./api-endpoints\";\nimport { EngineApiError, getEndpoint } from \"./api-utils\";\nimport { logger } from \"./log\";\nimport { lookupMetadataCached } from \"./metadata\";\nimport { createWebSocketProxy } from \"./ws-proxy\";\n\n// TODO:\n// // Lazily import the dynamic imports so we don't have to turn `createClient` in to an async fn\n// const dynamicImports = (async () => {\n// \t// Import dynamic dependencies\n// \tconst [WebSocket, EventSource] = await Promise.all([\n// \t\timportWebSocket(),\n// \t\timportEventSource(),\n// \t]);\n// \treturn {\n// \t\tWebSocket,\n// \t\tEventSource,\n// \t};\n// })();\n\nexport class RemoteManagerDriver implements ManagerDriver {\n\t#config: ClientConfig;\n\t#metadataPromise: Promise<void> | undefined;\n\n\tconstructor(runConfig: ClientConfig) {\n\t\t// Disable health check if in Next.js build phase since there is no `/metadata` endpoint\n\t\t//\n\t\t// See https://github.com/vercel/next.js/blob/5e6b008b561caf2710ab7be63320a3d549474a5b/packages/next/shared/lib/constants.ts#L19-L23\n\t\tif (getNextPhase() === \"phase-production-build\") {\n\t\t\tlogger().info(\n\t\t\t\t\"detected next.js build phase, disabling health check\",\n\t\t\t);\n\t\t\trunConfig.disableMetadataLookup = true;\n\t\t}\n\n\t\t// Clone config so we can mutate the endpoint in #metadataPromise\n\t\t// NOTE: This is a shallow clone, so mutating nested properties will not do anything\n\t\tthis.#config = { ...runConfig };\n\n\t\t// Perform metadata check if enabled\n\t\tif (!runConfig.disableMetadataLookup) {\n\t\t\t// This should never error, since it uses pRetry. If it does for\n\t\t\t// any reason, we'll surface the error anywhere #metadataPromise is\n\t\t\t// awaited.\n\t\t\tthis.#metadataPromise = lookupMetadataCached(this.#config).then(\n\t\t\t\t(metadataData) => {\n\t\t\t\t\t// Override endpoint for all future requests\n\t\t\t\t\tif (metadataData.clientEndpoint) {\n\t\t\t\t\t\tthis.#config.endpoint = metadataData.clientEndpoint;\n\t\t\t\t\t\tif (metadataData.clientNamespace) {\n\t\t\t\t\t\t\tthis.#config.namespace =\n\t\t\t\t\t\t\t\tmetadataData.clientNamespace;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (metadataData.clientToken) {\n\t\t\t\t\t\t\tthis.#config.token = metadataData.clientToken;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlogger().info({\n\t\t\t\t\t\t\tmsg: \"overriding client endpoint\",\n\t\t\t\t\t\t\tendpoint: metadataData.clientEndpoint,\n\t\t\t\t\t\t\tnamespace: metadataData.clientNamespace,\n\t\t\t\t\t\t\ttoken: metadataData.clientToken,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlogger().info({\n\t\t\t\t\t\tmsg: \"connected to rivetkit manager\",\n\t\t\t\t\t\truntime: metadataData.runtime,\n\t\t\t\t\t\tversion: metadataData.version,\n\t\t\t\t\t\trunner: metadataData.runner,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n\n\tasync getForId({\n\t\tc,\n\t\tname,\n\t\tactorId,\n\t}: GetForIdInput): Promise<ActorOutput | undefined> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\t// Fetch from API if not in cache\n\t\tconst response = await getActor(this.#config, name, actorId);\n\t\tconst actor = response.actors[0];\n\t\tif (!actor) return undefined;\n\n\t\t// Validate name matches\n\t\tif (actor.name !== name) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"actor name mismatch from api\",\n\t\t\t\tactorId,\n\t\t\t\tapiName: actor.name,\n\t\t\t\trequestedName: name,\n\t\t\t});\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn apiActorToOutput(actor);\n\t}\n\n\tasync getWithKey({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t}: GetWithKeyInput): Promise<ActorOutput | undefined> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tlogger().debug({ msg: \"getWithKey: searching for actor\", name, key });\n\n\t\t// If not in local cache, fetch by key from API\n\t\ttry {\n\t\t\tconst response = await getActorByKey(this.#config, name, key);\n\t\t\tconst actor = response.actors[0];\n\t\t\tif (!actor) return undefined;\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"getWithKey: found actor via api\",\n\t\t\t\tactorId: actor.actor_id,\n\t\t\t\tname,\n\t\t\t\tkey,\n\t\t\t});\n\n\t\t\treturn apiActorToOutput(actor);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror instanceof EngineApiError &&\n\t\t\t\t(error as EngineApiError).group === \"actor\" &&\n\t\t\t\t(error as EngineApiError).code === \"not_found\"\n\t\t\t) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getOrCreateWithKey(\n\t\tinput: GetOrCreateWithKeyInput,\n\t): Promise<ActorOutput> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tconst { c, name, key, input: actorInput, region } = input;\n\n\t\tlogger().info({\n\t\t\tmsg: \"getOrCreateWithKey: getting or creating actor via engine api\",\n\t\t\tname,\n\t\t\tkey,\n\t\t});\n\n\t\tconst { actor, created } = await getOrCreateActor(this.#config, {\n\t\t\tdatacenter: region,\n\t\t\tname,\n\t\t\tkey: serializeActorKey(key),\n\t\t\trunner_name_selector: this.#config.runnerName,\n\t\t\tinput: actorInput\n\t\t\t\t? uint8ArrayToBase64(cbor.encode(actorInput))\n\t\t\t\t: undefined,\n\t\t\tcrash_policy: \"sleep\",\n\t\t});\n\n\t\tlogger().info({\n\t\t\tmsg: \"getOrCreateWithKey: actor ready\",\n\t\t\tactorId: actor.actor_id,\n\t\t\tname,\n\t\t\tkey,\n\t\t\tcreated,\n\t\t});\n\n\t\treturn apiActorToOutput(actor);\n\t}\n\n\tasync createActor({\n\t\tc,\n\t\tname,\n\t\tkey,\n\t\tinput,\n\t\tregion,\n\t}: CreateInput): Promise<ActorOutput> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tlogger().info({ msg: \"creating actor via engine api\", name, key });\n\n\t\t// Create actor via engine API\n\t\tconst result = await createActor(this.#config, {\n\t\t\tdatacenter: region,\n\t\t\tname,\n\t\t\trunner_name_selector: this.#config.runnerName,\n\t\t\tkey: serializeActorKey(key),\n\t\t\tinput: input ? uint8ArrayToBase64(cbor.encode(input)) : undefined,\n\t\t\tcrash_policy: \"sleep\",\n\t\t});\n\n\t\tlogger().info({\n\t\t\tmsg: \"actor created\",\n\t\t\tactorId: result.actor.actor_id,\n\t\t\tname,\n\t\t\tkey,\n\t\t});\n\n\t\treturn apiActorToOutput(result.actor);\n\t}\n\n\tasync listActors({ c, name }: ListActorsInput): Promise<ActorOutput[]> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tlogger().debug({ msg: \"listing actors via engine api\", name });\n\n\t\tconst response = await listActorsByName(this.#config, name);\n\n\t\treturn response.actors.map(apiActorToOutput);\n\t}\n\n\tasync destroyActor(actorId: string): Promise<void> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tlogger().info({ msg: \"destroying actor via engine api\", actorId });\n\n\t\tawait destroyActor(this.#config, actorId);\n\n\t\tlogger().info({ msg: \"actor destroyed\", actorId });\n\t}\n\n\tasync sendRequest(\n\t\tactorId: string,\n\t\tactorRequest: Request,\n\t): Promise<Response> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\treturn await sendHttpRequestToActor(\n\t\t\tthis.#config,\n\t\t\tactorId,\n\t\t\tactorRequest,\n\t\t);\n\t}\n\n\tasync openWebSocket(\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<UniversalWebSocket> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\treturn await openWebSocketToActor(\n\t\t\tthis.#config,\n\t\t\tpath,\n\t\t\tactorId,\n\t\t\tencoding,\n\t\t\tparams,\n\t\t);\n\t}\n\n\tasync buildGatewayUrl(actorId: string): Promise<string> {\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tconst endpoint = getEndpoint(this.#config);\n\t\treturn buildActorGatewayUrl(endpoint, actorId, this.#config.token);\n\t}\n\n\tasync proxyRequest(\n\t\t_c: HonoContext,\n\t\tactorRequest: Request,\n\t\tactorId: string,\n\t): Promise<Response> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\treturn await sendHttpRequestToActor(\n\t\t\tthis.#config,\n\t\t\tactorId,\n\t\t\tactorRequest,\n\t\t);\n\t}\n\n\tasync proxyWebSocket(\n\t\tc: HonoContext,\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<Response> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tconst upgradeWebSocket = this.#config.getUpgradeWebSocket?.();\n\t\tinvariant(upgradeWebSocket, \"missing getUpgradeWebSocket\");\n\n\t\tconst endpoint = getEndpoint(this.#config);\n\t\tconst guardUrl = combineUrlPath(endpoint, path);\n\t\tconst wsGuardUrl = guardUrl.replace(\"http://\", \"ws://\");\n\n\t\tlogger().debug({\n\t\t\tmsg: \"forwarding websocket to actor via guard\",\n\t\t\tactorId,\n\t\t\tpath,\n\t\t\tguardUrl,\n\t\t});\n\n\t\t// Build protocols\n\t\tconst protocols = buildWebSocketProtocols(\n\t\t\tthis.#config,\n\t\t\tencoding,\n\t\t\tparams,\n\t\t);\n\t\tconst args = await createWebSocketProxy(c, wsGuardUrl, protocols);\n\n\t\treturn await upgradeWebSocket(() => args)(c, noopNext());\n\t}\n\n\tasync kvGet(actorId: string, key: Uint8Array): Promise<string | null> {\n\t\t// Wait for metadata check to complete if in progress\n\t\tif (this.#metadataPromise) {\n\t\t\tawait this.#metadataPromise;\n\t\t}\n\n\t\tlogger().debug({ msg: \"getting kv value via engine api\", key });\n\n\t\tconst response = await kvGet(\n\t\t\tthis.#config,\n\t\t\tactorId,\n\t\t\tnew TextDecoder(\"utf8\").decode(key),\n\t\t);\n\n\t\treturn response.value;\n\t}\n\n\tdisplayInformation(): ManagerDisplayInformation {\n\t\treturn { properties: {} };\n\t}\n\n\tsetGetUpgradeWebSocket(getUpgradeWebSocket: GetUpgradeWebSocket): void {\n\t\tthis.#config.getUpgradeWebSocket = getUpgradeWebSocket;\n\t}\n}\n\nfunction apiActorToOutput(actor: ApiActor): ActorOutput {\n\treturn {\n\t\tactorId: actor.actor_id,\n\t\tname: actor.name,\n\t\tkey: deserializeActorKey(actor.key),\n\t\tcreateTs: actor.create_ts,\n\t\tstartTs: actor.start_ts ?? null,\n\t\tconnectableTs: actor.connectable_ts ?? null,\n\t\tsleepTs: actor.sleep_ts ?? null,\n\t\tdestroyTs: actor.destroy_ts ?? null,\n\t\terror: actor.error ?? undefined,\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 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 * 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 { getLogger } from \"@/common/log\";\n\n/** Prever to use ActorInstance.rlog child logger. This does not provide context in the log, should only be used as a last resort if you cannot pass the actor's child logger. */\nexport function loggerWithoutContext() {\n\treturn getLogger(\"actor-runtime\");\n}\n","import * as errors from \"./errors\";\nimport { loggerWithoutContext } from \"./log\";\n\nexport function assertUnreachable(x: never): never {\n\tloggerWithoutContext().error({\n\t\tmsg: \"unreachable\",\n\t\tvalue: `${x}`,\n\t\tstack: new Error().stack,\n\t});\n\tthrow new errors.Unreachable(x);\n}\n\nexport const throttle = <\n\t// biome-ignore lint/suspicious/noExplicitAny: we want to allow any function\n\tFn extends (...args: any) => any,\n>(\n\tfn: Fn,\n\tdelay: number,\n) => {\n\tlet lastRan = false;\n\tlet lastArgs: Parameters<Fn> | null = null;\n\n\treturn (...args: Parameters<Fn>) => {\n\t\tif (!lastRan) {\n\t\t\tfn.apply(this, args);\n\t\t\tlastRan = true;\n\t\t\tconst timer = () =>\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tlastRan = false;\n\t\t\t\t\tif (lastArgs) {\n\t\t\t\t\t\tfn.apply(this, lastArgs);\n\t\t\t\t\t\tlastRan = true;\n\t\t\t\t\t\tlastArgs = null;\n\t\t\t\t\t\ttimer();\n\t\t\t\t\t}\n\t\t\t\t}, delay);\n\t\t\ttimer();\n\t\t} else lastArgs = args;\n\t};\n};\n\nexport class DeadlineError extends Error {\n\tconstructor() {\n\t\tsuper(\"Promise did not complete before deadline.\");\n\t}\n}\n\nexport function deadline<T>(promise: Promise<T>, timeout: number): Promise<T> {\n\tconst controller = new AbortController();\n\tconst signal = controller.signal;\n\n\t// Set a timeout to abort the operation\n\tconst timeoutId = setTimeout(() => controller.abort(), timeout);\n\n\treturn Promise.race<T>([\n\t\tpromise,\n\t\tnew Promise<T>((_, reject) => {\n\t\t\tsignal.addEventListener(\"abort\", () => reject(new DeadlineError()));\n\t\t}),\n\t]).finally(() => {\n\t\tclearTimeout(timeoutId);\n\t});\n}\n\nexport class Lock<T> {\n\tprivate _locked = false;\n\tprivate _waiting: Array<() => void> = [];\n\n\tconstructor(private _value: T) {}\n\n\tasync lock(fn: (value: T) => Promise<void>): Promise<void> {\n\t\tif (this._locked) {\n\t\t\tawait new Promise<void>((resolve) => this._waiting.push(resolve));\n\t\t}\n\t\tthis._locked = true;\n\n\t\ttry {\n\t\t\tawait fn(this._value);\n\t\t} finally {\n\t\t\tthis._locked = false;\n\t\t\tconst next = this._waiting.shift();\n\t\t\tif (next) next();\n\t\t}\n\t}\n}\n\nexport interface JoinedAbortSignal {\n\tsignal?: AbortSignal;\n\tcleanup: () => void;\n}\n\nexport function joinAbortSignals(\n\t...signals: Array<AbortSignal | undefined>\n): JoinedAbortSignal {\n\tconst activeSignals = signals.filter(\n\t\t(signal): signal is AbortSignal => signal !== undefined,\n\t);\n\tif (activeSignals.length === 0) {\n\t\treturn { signal: undefined, cleanup: () => {} };\n\t}\n\tif (activeSignals.length === 1) {\n\t\treturn { signal: activeSignals[0], cleanup: () => {} };\n\t}\n\n\tconst controller = new AbortController();\n\tif (activeSignals.some((signal) => signal.aborted)) {\n\t\tcontroller.abort();\n\t\treturn { signal: controller.signal, cleanup: () => {} };\n\t}\n\n\tconst cleanup = () => {\n\t\tfor (const signal of activeSignals) {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t};\n\tconst onAbort = () => {\n\t\tcontroller.abort();\n\t\tcleanup();\n\t};\n\tfor (const signal of activeSignals) {\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t}\n\n\treturn { signal: controller.signal, cleanup };\n}\n\nexport function generateSecureToken(length = 32) {\n\tconst array = new Uint8Array(length);\n\tcrypto.getRandomValues(array);\n\t// Replace base64 chars that are not URL safe with URL-safe chars and strip padding\n\treturn btoa(String.fromCharCode(...array))\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=/g, \"\");\n}\n\n/**\n * Checks if a path is an actor state path within the persisted actor data.\n */\nexport function isStatePath(path: string): boolean {\n\treturn path === \"state\" || path.startsWith(\"state.\");\n}\n\n/**\n * Checks if a path is a connection state path within the persisted actor data.\n */\nexport function isConnStatePath(path: string): boolean {\n\tif (!path.startsWith(\"connections.\")) {\n\t\treturn false;\n\t}\n\tconst stateIndex = path.indexOf(\".state\", 12); // Start after \"connections.\"\n\tif (stateIndex === -1) {\n\t\treturn false;\n\t}\n\tconst afterState = stateIndex + 6; // \".state\".length = 6\n\t// Check if \".state\" is followed by end of string or \".\"\n\treturn path.length === afterState || path[afterState] === \".\";\n}\n","// 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 { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"actor-client\");\n}\n","import { logger } from \"@/client/log\";\n\n// Global singleton promise that will be reused for subsequent calls\nlet webSocketPromise: Promise<typeof WebSocket> | null = null;\n\nexport async function importWebSocket(): Promise<typeof WebSocket> {\n\t// Return existing promise if we already started loading\n\tif (webSocketPromise !== null) {\n\t\treturn webSocketPromise;\n\t}\n\n\t// Create and store the promise\n\twebSocketPromise = (async () => {\n\t\tlet _WebSocket: typeof WebSocket;\n\n\t\tif (typeof WebSocket !== \"undefined\") {\n\t\t\t// Browser environment\n\t\t\t_WebSocket = WebSocket as unknown as typeof WebSocket;\n\t\t} else {\n\t\t\t// Node.js environment\n\t\t\ttry {\n\t\t\t\tconst moduleName = \"ws\";\n\t\t\t\tconst ws = await import(/* webpackIgnore: true */ moduleName);\n\t\t\t\t_WebSocket = ws.default as unknown as typeof WebSocket;\n\t\t\t\tlogger().debug(\"using websocket from npm\");\n\t\t\t} catch {\n\t\t\t\t// WS not available\n\t\t\t\t_WebSocket = class MockWebSocket {\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t'WebSocket support requires installing the \"ws\" peer dependency.',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} as unknown as typeof WebSocket;\n\t\t\t\tlogger().debug(\"using mock websocket\");\n\t\t\t}\n\t\t}\n\n\t\treturn _WebSocket;\n\t})();\n\n\treturn webSocketPromise;\n}\n","import { z } from \"zod/v4\";\nimport type { ClientConfig } from \"@/client/config\";\nimport { sendHttpRequest } from \"@/client/utils\";\nimport { combineUrlPath } from \"@/utils\";\nimport { logger } from \"./log\";\nimport { RegistryConfig } from \"@/registry/config\";\n\n// Error class for Engine API errors\nexport class EngineApiError extends Error {\n\tconstructor(\n\t\tpublic readonly group: string,\n\t\tpublic readonly code: string,\n\t\tmessage?: string,\n\t) {\n\t\tsuper(message || `Engine API error: ${group}/${code}`);\n\t\tthis.name = \"EngineApiError\";\n\t}\n}\n\n// TODO: Remove getEndpoint, but it's used in a lot of places\nexport function getEndpoint(config: ClientConfig | RegistryConfig) {\n\t// Endpoint is always defined for ClientConfig (has default in schema).\n\t// RegistryConfig may not have endpoint if using local manager.\n\treturn config.endpoint ?? \"http://127.0.0.1:6420\";\n}\n\n// Helper function for making API calls\nexport async function apiCall<TInput = unknown, TOutput = unknown>(\n\tconfig: ClientConfig,\n\tmethod: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n\tpath: string,\n\tbody?: TInput,\n): Promise<TOutput> {\n\tconst endpoint = getEndpoint(config);\n\tconst url = combineUrlPath(endpoint, path, {\n\t\tnamespace: config.namespace,\n\t});\n\n\tlogger().debug({ msg: \"making api call\", method, url });\n\n\tconst headers: Record<string, string> = {\n\t\t...config.headers,\n\t};\n\n\t// Add Authorization header if token is provided\n\tif (config.token) {\n\t\theaders.Authorization = `Bearer ${config.token}`;\n\t}\n\n\treturn await sendHttpRequest<TInput, TOutput>({\n\t\tmethod,\n\t\turl,\n\t\theaders,\n\t\tbody,\n\t\tencoding: \"json\",\n\t\tskipParseResponse: false,\n\t\trequestVersionedDataHandler: undefined,\n\t\trequestVersion: undefined,\n\t\tresponseVersionedDataHandler: undefined,\n\t\tresponseVersion: undefined,\n\t\trequestZodSchema: z.any() as z.ZodType<TInput>,\n\t\tresponseZodSchema: z.any() as z.ZodType<TOutput>,\n\t\t// Identity conversions (passthrough for generic API calls)\n\t\trequestToJson: (value) => value,\n\t\trequestToBare: (value) => value,\n\t\tresponseFromJson: (value) => value,\n\t\tresponseFromBare: (value) => 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 type { Encoding } from \"@/actor/protocol/serde\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport type { HttpResponseError } from \"@/schemas/client-protocol/mod\";\nimport { HTTP_RESPONSE_ERROR_VERSIONED } from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype HttpResponseError as HttpResponseErrorJson,\n\tHttpResponseErrorSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport {\n\tcontentTypeForEncoding,\n\tdeserializeWithEncoding,\n\tencodingIsBinary,\n\tserializeWithEncoding,\n} from \"@/serde\";\nimport { httpUserAgent } from \"@/utils\";\nimport { ActorError, HttpRequestError } from \"./errors\";\nimport { logger } from \"./log\";\n\nexport interface ParsedCloseReason {\n\tgroup: string;\n\tcode: string;\n\trayId?: string;\n}\n\n/**\n * Parses WebSocket close reason string into structured data.\n *\n * Expected format examples:\n * - \"guard.actor_runner_failed#t1s80so6h3irenp8ymzltfoittcl00\"\n * - \"ws.client_closed\"\n *\n * Returns undefined if the format is invalid\n */\nexport function parseWebSocketCloseReason(\n\treason: string,\n): ParsedCloseReason | undefined {\n\tconst [mainPart, rayId] = reason.split(\"#\");\n\tconst [group, code] = mainPart.split(\".\");\n\n\tif (!group || !code) {\n\t\tlogger().warn({ msg: \"failed to parse close reason\", reason });\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tgroup,\n\t\tcode,\n\t\trayId,\n\t};\n}\n\nexport type WebSocketMessage = string | Blob | ArrayBuffer | Uint8Array;\n\nexport function messageLength(message: WebSocketMessage): number {\n\tif (message instanceof Blob) {\n\t\treturn message.size;\n\t}\n\tif (message instanceof ArrayBuffer) {\n\t\treturn message.byteLength;\n\t}\n\tif (message instanceof Uint8Array) {\n\t\treturn message.byteLength;\n\t}\n\tif (typeof message === \"string\") {\n\t\treturn message.length;\n\t}\n\tassertUnreachable(message);\n}\n\nexport interface HttpRequestOpts<\n\tRequestBare,\n\tResponseBare,\n\tRequestJson = RequestBare,\n\tResponseJson = ResponseBare,\n\tRequest = RequestBare,\n\tResponse = ResponseBare,\n> {\n\tmethod: string;\n\turl: string;\n\theaders: Record<string, string>;\n\tbody?: Request;\n\tencoding: Encoding;\n\tskipParseResponse?: boolean;\n\tsignal?: AbortSignal;\n\tcustomFetch?: (req: globalThis.Request) => Promise<globalThis.Response>;\n\trequestVersionedDataHandler: VersionedDataHandler<RequestBare> | undefined;\n\trequestVersion: number | undefined;\n\tresponseVersionedDataHandler:\n\t\t| VersionedDataHandler<ResponseBare>\n\t\t| undefined;\n\tresponseVersion: number | undefined;\n\trequestZodSchema: z.ZodType<RequestJson>;\n\tresponseZodSchema: z.ZodType<ResponseJson>;\n\trequestToJson: (value: Request) => RequestJson;\n\trequestToBare: (value: Request) => RequestBare;\n\tresponseFromJson: (value: ResponseJson) => Response;\n\tresponseFromBare: (value: ResponseBare) => Response;\n}\n\nexport async function sendHttpRequest<\n\tRequestBare = unknown,\n\tResponseBare = unknown,\n\tRequestJson = RequestBare,\n\tResponseJson = ResponseBare,\n\tRequest = RequestBare,\n\tResponse = ResponseBare,\n>(\n\topts: HttpRequestOpts<\n\t\tRequestBare,\n\t\tResponseBare,\n\t\tRequestJson,\n\t\tResponseJson,\n\t\tRequest,\n\t\tResponse\n\t>,\n): Promise<Response> {\n\tlogger().debug({\n\t\tmsg: \"sending http request\",\n\t\turl: opts.url,\n\t\tencoding: opts.encoding,\n\t});\n\n\t// Serialize body\n\tlet contentType: string | undefined;\n\tlet bodyData: string | Uint8Array | undefined;\n\tif (opts.method === \"POST\" || opts.method === \"PUT\") {\n\t\tinvariant(opts.body !== undefined, \"missing body\");\n\t\tcontentType = contentTypeForEncoding(opts.encoding);\n\t\tbodyData = serializeWithEncoding<RequestBare, RequestJson, Request>(\n\t\t\topts.encoding,\n\t\t\topts.body,\n\t\t\topts.requestVersionedDataHandler,\n\t\t\topts.requestVersion,\n\t\t\topts.requestZodSchema,\n\t\t\topts.requestToJson,\n\t\t\topts.requestToBare,\n\t\t);\n\t}\n\n\t// Send request\n\tlet response: globalThis.Response;\n\ttry {\n\t\t// Make the HTTP request\n\t\tresponse = await (opts.customFetch ?? fetch)(\n\t\t\tnew globalThis.Request(opts.url, {\n\t\t\t\tmethod: opts.method,\n\t\t\t\theaders: {\n\t\t\t\t\t...opts.headers,\n\t\t\t\t\t...(contentType\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\"Content-Type\": contentType,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t\"User-Agent\": httpUserAgent(),\n\t\t\t\t},\n\t\t\t\tbody: bodyData,\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tsignal: opts.signal,\n\t\t\t}),\n\t\t);\n\t} catch (error) {\n\t\tthrow new HttpRequestError(`Request failed: ${error}`, {\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\t// Parse response error\n\tif (!response.ok) {\n\t\tconst bufferResponse = await response.arrayBuffer();\n\t\tconst contentType = response.headers.get(\"content-type\");\n\t\tconst rayId = response.headers.get(\"x-rivet-ray-id\");\n\n\t\t// Determine encoding from Content-Type header, defaulting to provided encoding\n\t\tconst encoding: Encoding = contentType?.includes(\"application/json\")\n\t\t\t? \"json\"\n\t\t\t: opts.encoding;\n\n\t\t// Attempt to parse structured error data\n\t\ttry {\n\t\t\tconst responseData = deserializeWithEncoding(\n\t\t\t\tencoding,\n\t\t\t\tnew Uint8Array(bufferResponse),\n\t\t\t\tHTTP_RESPONSE_ERROR_VERSIONED,\n\t\t\t\tHttpResponseErrorSchema,\n\t\t\t\t// JSON: metadata is already unknown\n\t\t\t\t(json): HttpResponseErrorJson => json as HttpResponseErrorJson,\n\t\t\t\t// BARE: decode ArrayBuffer metadata to unknown\n\t\t\t\t(bare): any => ({\n\t\t\t\t\tgroup: bare.group,\n\t\t\t\t\tcode: bare.code,\n\t\t\t\t\tmessage: bare.message,\n\t\t\t\t\tmetadata: bare.metadata\n\t\t\t\t\t\t? cbor.decode(new Uint8Array(bare.metadata))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tthrow new ActorError(\n\t\t\t\tresponseData.group,\n\t\t\t\tresponseData.code,\n\t\t\t\tresponseData.message,\n\t\t\t\tresponseData.metadata,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\t// If it's already an ActorError, re-throw it\n\t\t\tif (error instanceof ActorError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\t// Otherwise, fall back to generic error with text response\n\t\t\tconst textResponse = new TextDecoder(\"utf-8\", {\n\t\t\t\tfatal: false,\n\t\t\t}).decode(bufferResponse);\n\n\t\t\tif (rayId) {\n\t\t\t\tthrow new HttpRequestError(\n\t\t\t\t\t`${response.statusText} (${response.status}) (Ray ID: ${rayId}):\\n${textResponse}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow new HttpRequestError(\n\t\t\t\t\t`${response.statusText} (${response.status}):\\n${textResponse}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Some requests don't need the success response to be parsed, so this can speed things up\n\tif (opts.skipParseResponse) {\n\t\treturn undefined as Response;\n\t}\n\n\t// Parse the response based on encoding\n\ttry {\n\t\tconst buffer = new Uint8Array(await response.arrayBuffer());\n\t\treturn deserializeWithEncoding<ResponseBare, ResponseJson, Response>(\n\t\t\topts.encoding,\n\t\t\tbuffer,\n\t\t\topts.responseVersionedDataHandler,\n\t\t\topts.responseZodSchema,\n\t\t\topts.responseFromJson,\n\t\t\topts.responseFromBare,\n\t\t);\n\t} catch (error) {\n\t\tthrow new HttpRequestError(`Failed to parse response: ${error}`, {\n\t\t\tcause: error,\n\t\t});\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","export class ActorClientError extends Error {}\n\nexport class InternalError extends ActorClientError {}\n\nexport class ManagerError extends ActorClientError {\n\tconstructor(error: string, opts?: ErrorOptions) {\n\t\tsuper(`Manager error: ${error}`, opts);\n\t}\n}\n\nexport class MalformedResponseMessage extends ActorClientError {\n\tconstructor(cause?: unknown) {\n\t\tsuper(`Malformed response message: ${cause}`, { cause });\n\t}\n}\n\nexport class ActorError extends ActorClientError {\n\t__type = \"ActorError\";\n\n\tconstructor(\n\t\tpublic readonly group: string,\n\t\tpublic readonly code: string,\n\t\tmessage: string,\n\t\tpublic readonly metadata?: unknown,\n\t) {\n\t\tsuper(message);\n\t}\n}\n\nexport class HttpRequestError extends ActorClientError {\n\tconstructor(message: string, opts?: { cause?: unknown }) {\n\t\tsuper(`HTTP request error: ${message}`, { cause: opts?.cause });\n\t}\n}\n\nexport class ActorConnDisposed extends ActorClientError {\n\tconstructor() {\n\t\tsuper(\"Attempting to interact with a disposed actor connection.\");\n\t}\n}\n\n/**\n * Checks if an error code indicates a scheduling error that may have more details.\n */\nexport function isSchedulingError(group: string, code: string): boolean {\n\treturn (\n\t\tgroup === \"guard\" &&\n\t\t(code === \"actor_ready_timeout\" || code === \"actor_runner_failed\")\n\t);\n}\n\n/**\n * Error thrown when actor scheduling fails.\n * Provides detailed information about why the actor failed to start.\n */\nexport class ActorSchedulingError extends ActorError {\n\tpublic readonly actorId: string;\n\tpublic readonly details: unknown;\n\n\tconstructor(\n\t\tgroup: string,\n\t\tcode: string,\n\t\tactorId: string,\n\t\tdetails: unknown,\n\t) {\n\t\tsuper(\n\t\t\tgroup,\n\t\t\tcode,\n\t\t\t`Actor failed to start (${actorId}): ${JSON.stringify(details)}`,\n\t\t\t{ actorId, details },\n\t\t);\n\t\tthis.name = \"ActorSchedulingError\";\n\t\tthis.actorId = actorId;\n\t\tthis.details = details;\n\t}\n}\n","import { getLogger } from \"@/common//log\";\n\nexport function logger() {\n\treturn getLogger(\"remote-manager-driver\");\n}\n","import type { ClientConfig } from \"@/client/config\";\nimport {\n\tHEADER_CONN_PARAMS,\n\tHEADER_ENCODING,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_STANDARD as WS_PROTOCOL_RIVETKIT,\n\tWS_PROTOCOL_TOKEN,\n} from \"@/common/actor-router-consts\";\nimport { importWebSocket } from \"@/common/websocket\";\nimport type { Encoding, UniversalWebSocket } from \"@/mod\";\nimport { combineUrlPath } from \"@/utils\";\nimport { getEndpoint } from \"./api-utils\";\nimport { logger } from \"./log\";\n\nexport function buildActorGatewayUrl(\n\tendpoint: string,\n\tactorId: string,\n\ttoken: string | undefined,\n\tpath = \"\",\n): string {\n\tconst tokenSegment =\n\t\ttoken !== undefined ? `@${encodeURIComponent(token)}` : \"\";\n\tconst gatewayPath = `/gateway/${encodeURIComponent(actorId)}${tokenSegment}${path}`;\n\treturn combineUrlPath(endpoint, gatewayPath);\n}\n\nexport async function openWebSocketToActor(\n\trunConfig: ClientConfig,\n\tpath: string,\n\tactorId: string,\n\tencoding: Encoding,\n\tparams: unknown,\n): Promise<UniversalWebSocket> {\n\tconst WebSocket = await importWebSocket();\n\n\t// WebSocket connections go through guard\n\tconst endpoint = getEndpoint(runConfig);\n\tconst guardUrl = buildActorGatewayUrl(\n\t\tendpoint,\n\t\tactorId,\n\t\trunConfig.token,\n\t\tpath,\n\t);\n\n\tlogger().debug({\n\t\tmsg: \"opening websocket to actor via guard\",\n\t\tactorId,\n\t\tpath,\n\t\tguardUrl,\n\t});\n\n\t// Create WebSocket connection\n\tconst ws = new WebSocket(\n\t\tguardUrl,\n\t\tbuildWebSocketProtocols(runConfig, encoding, params),\n\t);\n\n\t// Set binary type to arraybuffer for proper encoding support\n\tws.binaryType = \"arraybuffer\";\n\n\tlogger().debug({ msg: \"websocket connection opened\", actorId });\n\n\treturn ws as UniversalWebSocket;\n}\n\nexport function buildWebSocketProtocols(\n\trunConfig: ClientConfig,\n\tencoding: Encoding,\n\tparams?: unknown,\n): string[] {\n\tconst protocols: string[] = [];\n\tprotocols.push(WS_PROTOCOL_RIVETKIT);\n\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\tif (params) {\n\t\tprotocols.push(\n\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t);\n\t}\n\treturn protocols;\n}\n","import type { ClientConfig } from \"@/client/config\";\nimport { HEADER_RIVET_TOKEN } from \"@/common/actor-router-consts\";\nimport { buildActorGatewayUrl } from \"./actor-websocket-client\";\nimport { getEndpoint } from \"./api-utils\";\n\nexport async function sendHttpRequestToActor(\n\trunConfig: ClientConfig,\n\tactorId: string,\n\tactorRequest: Request,\n): Promise<Response> {\n\t// Route through guard port\n\tconst url = new URL(actorRequest.url);\n\tconst endpoint = getEndpoint(runConfig);\n\tconst guardUrl = buildActorGatewayUrl(\n\t\tendpoint,\n\t\tactorId,\n\t\trunConfig.token,\n\t\t`${url.pathname}${url.search}`,\n\t);\n\n\t// Handle body properly based on method and presence\n\tlet bodyToSend: ArrayBuffer | null = null;\n\tconst guardHeaders = buildGuardHeadersForHttp(\n\t\trunConfig,\n\t\tactorRequest,\n\t\tactorId,\n\t);\n\n\tif (actorRequest.method !== \"GET\" && actorRequest.method !== \"HEAD\") {\n\t\tif (actorRequest.bodyUsed) {\n\t\t\tthrow new Error(\"Request body has already been consumed\");\n\t\t}\n\n\t\t// TODO: This buffers the entire request in memory every time. We\n\t\t// need to properly implement streaming bodies.\n\t\tconst reqBody = await actorRequest.arrayBuffer();\n\n\t\tif (reqBody.byteLength !== 0) {\n\t\t\tbodyToSend = reqBody;\n\n\t\t\t// If this is a streaming request, we need to convert the headers\n\t\t\t// for the basic array buffer\n\t\t\tguardHeaders.delete(\"transfer-encoding\");\n\t\t\tguardHeaders.set(\"content-length\", String(bodyToSend.byteLength));\n\t\t}\n\t}\n\n\tconst guardRequest = new Request(guardUrl, {\n\t\tmethod: actorRequest.method,\n\t\theaders: guardHeaders,\n\t\tbody: bodyToSend,\n\t\tsignal: actorRequest.signal,\n\t});\n\n\treturn mutableResponse(await fetch(guardRequest));\n}\n\nfunction mutableResponse(fetchRes: Response): Response {\n\t// We cannot return the raw response from `fetch` since the response type is not mutable.\n\t//\n\t// In order for middleware to be able to mutate the response, we need to build a new Response object that is mutable.\n\treturn new Response(fetchRes.body, fetchRes);\n}\n\nfunction buildGuardHeadersForHttp(\n\trunConfig: ClientConfig,\n\tactorRequest: Request,\n\tactorId: string,\n): Headers {\n\tconst headers = new Headers();\n\t// Copy all headers from the original request\n\tactorRequest.headers.forEach((value, key) => {\n\t\theaders.set(key, value);\n\t});\n\t// Add extra headers from config\n\tfor (const [key, value] of Object.entries(runConfig.headers)) {\n\t\theaders.set(key, value as string);\n\t}\n\t// Add guard-specific headers\n\tif (runConfig.token) {\n\t\theaders.set(HEADER_RIVET_TOKEN, runConfig.token);\n\t}\n\treturn headers;\n}\n","import { serializeActorKey } from \"@/actor/keys\";\nimport type { ClientConfig } from \"@/client/client\";\nimport type { MetadataResponse } from \"@/common/router\";\nimport type {\n\tActorsCreateRequest,\n\tActorsCreateResponse,\n\tActorsDeleteResponse,\n\tActorsGetOrCreateRequest,\n\tActorsGetOrCreateResponse,\n\tActorsListResponse,\n} from \"@/manager-api/actors\";\nimport type { RivetId } from \"@/manager-api/common\";\nimport { apiCall } from \"./api-utils\";\n\n// MARK: Get actor\nexport async function getActor(\n\tconfig: ClientConfig,\n\t_: string,\n\tactorId: RivetId,\n): Promise<ActorsListResponse> {\n\treturn apiCall<never, ActorsListResponse>(\n\t\tconfig,\n\t\t\"GET\",\n\t\t`/actors?actor_ids=${encodeURIComponent(actorId)}`,\n\t);\n}\n\n// MARK: Get actor by key\nexport async function getActorByKey(\n\tconfig: ClientConfig,\n\tname: string,\n\tkey: string[],\n): Promise<ActorsListResponse> {\n\tconst serializedKey = serializeActorKey(key);\n\treturn apiCall<never, ActorsListResponse>(\n\t\tconfig,\n\t\t\"GET\",\n\t\t`/actors?name=${encodeURIComponent(name)}&key=${encodeURIComponent(serializedKey)}`,\n\t);\n}\n\n// MARK: List actors by name\nexport async function listActorsByName(\n\tconfig: ClientConfig,\n\tname: string,\n): Promise<ActorsListResponse> {\n\treturn apiCall<never, ActorsListResponse>(\n\t\tconfig,\n\t\t\"GET\",\n\t\t`/actors?name=${encodeURIComponent(name)}`,\n\t);\n}\n\n// MARK: Get or create actor by id\nexport async function getOrCreateActor(\n\tconfig: ClientConfig,\n\trequest: ActorsGetOrCreateRequest,\n): Promise<ActorsGetOrCreateResponse> {\n\treturn apiCall<ActorsGetOrCreateRequest, ActorsGetOrCreateResponse>(\n\t\tconfig,\n\t\t\"PUT\",\n\t\t`/actors`,\n\t\trequest,\n\t);\n}\n\n// MARK: Create actor\nexport async function createActor(\n\tconfig: ClientConfig,\n\trequest: ActorsCreateRequest,\n): Promise<ActorsCreateResponse> {\n\treturn apiCall<ActorsCreateRequest, ActorsCreateResponse>(\n\t\tconfig,\n\t\t\"POST\",\n\t\t`/actors`,\n\t\trequest,\n\t);\n}\n\n// MARK: Destroy actor\nexport async function destroyActor(\n\tconfig: ClientConfig,\n\tactorId: RivetId,\n): Promise<ActorsDeleteResponse> {\n\treturn apiCall<never, ActorsDeleteResponse>(\n\t\tconfig,\n\t\t\"DELETE\",\n\t\t`/actors/${encodeURIComponent(actorId)}`,\n\t);\n}\n\n// MARK: Get metadata\nexport async function getMetadata(\n\tconfig: ClientConfig,\n): Promise<MetadataResponse> {\n\treturn apiCall<never, MetadataResponse>(config, \"GET\", `/metadata`);\n}\n\n// MARK: Get datacenters\nexport interface DatacentersResponse {\n\tdatacenters: { name: string }[];\n}\n\nexport async function getDatacenters(\n\tconfig: ClientConfig,\n): Promise<DatacentersResponse> {\n\treturn apiCall<never, DatacentersResponse>(config, \"GET\", `/datacenters`);\n}\n\n// MARK: Update runner config\nexport interface RegistryConfigRequest {\n\tdatacenters: Record<\n\t\tstring,\n\t\t{\n\t\t\tserverless: {\n\t\t\t\turl: string;\n\t\t\t\theaders: Record<string, string>;\n\t\t\t\tmax_runners: number;\n\t\t\t\tmin_runners: number;\n\t\t\t\trequest_lifespan: number;\n\t\t\t\trunners_margin: number;\n\t\t\t\tslots_per_runner: number;\n\t\t\t\tmetadata_poll_interval?: number;\n\t\t\t};\n\t\t\tmetadata?: Record<string, unknown>;\n\t\t}\n\t>;\n}\n\nexport async function updateRunnerConfig(\n\tconfig: ClientConfig,\n\trunnerName: string,\n\trequest: RegistryConfigRequest,\n): Promise<void> {\n\treturn apiCall<RegistryConfigRequest, void>(\n\t\tconfig,\n\t\t\"PUT\",\n\t\t`/runner-configs/${runnerName}`,\n\t\trequest,\n\t);\n}\n\n// MARK: KV Get\ninterface KvGetResponse {\n\tupdate_ts: string;\n\tvalue: string | null;\n}\n\nexport async function kvGet(\n\tconfig: ClientConfig,\n\tactorId: RivetId,\n\tkey: string,\n): Promise<KvGetResponse> {\n\treturn apiCall<{}, KvGetResponse>(\n\t\tconfig,\n\t\t\"GET\",\n\t\t`/actors/${encodeURIComponent(actorId)}/kv/keys/${encodeURIComponent(key)}`,\n\t);\n}\n","import pRetry from \"p-retry\";\nimport type { ClientConfig } from \"@/client/client\";\nimport type { MetadataResponse } from \"@/common/router\";\nimport { stringifyError } from \"@/common/utils\";\nimport { getMetadata } from \"./api-endpoints\";\nimport { getEndpoint } from \"./api-utils\";\nimport { logger } from \"./log\";\n\n// Global cache to store metadata check promises for each endpoint\nconst metadataLookupCache = new Map<string, Promise<MetadataResponse>>();\n\nexport async function lookupMetadataCached(\n\tconfig: ClientConfig,\n): Promise<MetadataResponse> {\n\tconst endpoint = getEndpoint(config);\n\n\t// Check if metadata lookup is already in progress or completed for this endpoint\n\tconst existingPromise = metadataLookupCache.get(endpoint);\n\tif (existingPromise) {\n\t\treturn existingPromise;\n\t}\n\n\t// Create and store the promise immediately to prevent racing requests\n\tconst metadataLookupPromise = pRetry(\n\t\tasync () => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"fetching metadata\",\n\t\t\t\tendpoint,\n\t\t\t});\n\n\t\t\tconst metadataData = await getMetadata(config);\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"received metadata\",\n\t\t\t\tendpoint,\n\t\t\t\tclientEndpoint: metadataData.clientEndpoint,\n\t\t\t});\n\n\t\t\treturn metadataData;\n\t\t},\n\t\t{\n\t\t\tforever: true,\n\t\t\tminTimeout: 500,\n\t\t\tmaxTimeout: 15_000,\n\t\t\tonFailedAttempt: (error) => {\n\t\t\t\t// Skip logging warning on first attempt since this attempt\n\t\t\t\t// fails if called immediately on startup. This is because the\n\t\t\t\t// runtime startup is an async operation that will not be\n\t\t\t\t// available on the first tick.\n\t\t\t\tif (error.attemptNumber > 1) {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"failed to fetch metadata, retrying\",\n\t\t\t\t\t\tendpoint,\n\t\t\t\t\t\tattempt: error.attemptNumber,\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t);\n\n\tmetadataLookupCache.set(endpoint, metadataLookupPromise);\n\treturn metadataLookupPromise;\n}\n","import type { Context as HonoContext } from \"hono\";\nimport type { WSContext } from \"hono/ws\";\nimport type { UpgradeWebSocketArgs } from \"@/actor/router-websocket-endpoints\";\nimport { stringifyError } from \"@/common/utils\";\nimport { importWebSocket } from \"@/common/websocket\";\nimport { logger } from \"./log\";\n\n/**\n * Returns Hono `upgradeWebSocket` args that will proxy requests from the client to a destination address.\n */\nexport async function createWebSocketProxy(\n\tc: HonoContext,\n\ttargetUrl: string,\n\tprotocols: string[],\n): Promise<UpgradeWebSocketArgs> {\n\tconst WebSocket = await importWebSocket();\n\n\t// WebSocket state\n\tinterface WsState {\n\t\ttargetWs?: WebSocket;\n\t\tconnectPromise?: Promise<void>;\n\t}\n\tconst state: WsState = {};\n\n\treturn {\n\t\tonOpen: async (event: any, clientWs: WSContext) => {\n\t\t\tlogger().debug({ msg: \"client websocket connected\", targetUrl });\n\n\t\t\tif (clientWs.readyState !== 1) {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"client websocket not open on connection\",\n\t\t\t\t\ttargetUrl,\n\t\t\t\t\treadyState: clientWs.readyState,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create WebSocket\n\t\t\tconst targetWs = new WebSocket(targetUrl, protocols);\n\t\t\tstate.targetWs = targetWs;\n\n\t\t\t// Setup connection promise\n\t\t\tstate.connectPromise = new Promise<void>((resolve, reject) => {\n\t\t\t\ttargetWs.addEventListener(\"open\", () => {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"target websocket connected\",\n\t\t\t\t\t\ttargetUrl,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (clientWs.readyState !== 1) {\n\t\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\t\tmsg: \"client websocket closed before target connected\",\n\t\t\t\t\t\t\ttargetUrl,\n\t\t\t\t\t\t\tclientReadyState: clientWs.readyState,\n\t\t\t\t\t\t});\n\t\t\t\t\t\ttargetWs.close(1001, \"Client disconnected\");\n\t\t\t\t\t\treject(new Error(\"Client disconnected\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\n\t\t\t\ttargetWs.addEventListener(\"error\", (error) => {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"target websocket error during connection\",\n\t\t\t\t\t\ttargetUrl,\n\t\t\t\t\t});\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Setup bidirectional forwarding\n\t\t\tstate.targetWs.addEventListener(\"message\", (event) => {\n\t\t\t\tif (\n\t\t\t\t\ttypeof event.data === \"string\" ||\n\t\t\t\t\tevent.data instanceof ArrayBuffer\n\t\t\t\t) {\n\t\t\t\t\tclientWs.send(event.data);\n\t\t\t\t} else if (event.data instanceof Blob) {\n\t\t\t\t\tevent.data.arrayBuffer().then((buffer) => {\n\t\t\t\t\t\tclientWs.send(buffer);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tstate.targetWs.addEventListener(\"close\", (event) => {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"target websocket closed\",\n\t\t\t\t\ttargetUrl,\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t});\n\t\t\t\tcloseWebSocketIfOpen(clientWs, event.code, event.reason);\n\t\t\t});\n\n\t\t\tstate.targetWs.addEventListener(\"error\", (error) => {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"target websocket error\",\n\t\t\t\t\ttargetUrl,\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tcloseWebSocketIfOpen(clientWs, 1011, \"Target WebSocket error\");\n\t\t\t});\n\t\t},\n\n\t\tonMessage: async (event: any, clientWs: WSContext) => {\n\t\t\tif (!state.targetWs || !state.connectPromise) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"websocket state not initialized\",\n\t\t\t\t\ttargetUrl,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait state.connectPromise;\n\t\t\t\tif (state.targetWs.readyState === WebSocket.OPEN) {\n\t\t\t\t\tstate.targetWs.send(event.data);\n\t\t\t\t} else {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"target websocket not open\",\n\t\t\t\t\t\ttargetUrl,\n\t\t\t\t\t\treadyState: state.targetWs.readyState,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed to connect to target websocket\",\n\t\t\t\t\ttargetUrl,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\tcloseWebSocketIfOpen(\n\t\t\t\t\tclientWs,\n\t\t\t\t\t1011,\n\t\t\t\t\t\"Failed to connect to target\",\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tonClose: (event: any, clientWs: WSContext) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"client websocket closed\",\n\t\t\t\ttargetUrl,\n\t\t\t\tcode: event.code,\n\t\t\t\treason: event.reason,\n\t\t\t\twasClean: event.wasClean,\n\t\t\t});\n\n\t\t\tif (state.targetWs) {\n\t\t\t\tif (\n\t\t\t\t\tstate.targetWs.readyState === WebSocket.OPEN ||\n\t\t\t\t\tstate.targetWs.readyState === WebSocket.CONNECTING\n\t\t\t\t) {\n\t\t\t\t\tstate.targetWs.close(\n\t\t\t\t\t\t1000,\n\t\t\t\t\t\tevent.reason || \"Client disconnected\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonError: (event: any, clientWs: WSContext) => {\n\t\t\tlogger().error({ msg: \"client websocket error\", targetUrl, event });\n\n\t\t\tif (state.targetWs) {\n\t\t\t\tif (state.targetWs.readyState === WebSocket.OPEN) {\n\t\t\t\t\tstate.targetWs.close(1011, \"Client WebSocket error\");\n\t\t\t\t} else if (state.targetWs.readyState === WebSocket.CONNECTING) {\n\t\t\t\t\tstate.targetWs.close();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction closeWebSocketIfOpen(\n\tws: WebSocket | WSContext,\n\tcode: number,\n\treason: string,\n): void {\n\tif (ws.readyState === 1) {\n\t\tws.close(code, reason);\n\t} else if (\n\t\t\"close\" in ws &&\n\t\t(ws as WebSocket).readyState === WebSocket.OPEN\n\t) {\n\t\tws.close(code, reason);\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport pRetry from \"p-retry\";\nimport type { CloseEvent } from \"ws\";\nimport type { AnyActorDefinition } from \"@/actor/definition\";\nimport { inputDataToBuffer } from \"@/actor/protocol/old\";\nimport { type Encoding, jsonStringifyCompat } from \"@/actor/protocol/serde\";\nimport { PATH_CONNECT } from \"@/common/actor-router-consts\";\nimport { assertUnreachable, stringifyError } from \"@/common/utils\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport type { ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\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, serializeWithEncoding } from \"@/serde\";\nimport { bufferToArrayBuffer, promiseWithResolvers } from \"@/utils\";\nimport { getLogMessage } from \"@/utils/env-vars\";\nimport type { ActorDefinitionActions } from \"./actor-common\";\nimport { checkForSchedulingError, queryActor } from \"./actor-query\";\nimport { ACTOR_CONNS_SYMBOL, type ClientRaw } from \"./client\";\nimport * as errors from \"./errors\";\nimport { logger } from \"./log\";\nimport {\n\tcreateQueueSender,\n\ttype QueueSendNoWaitOptions,\n\ttype QueueSendOptions,\n\ttype QueueSendResult,\n\ttype QueueSendWaitOptions,\n} from \"./queue\";\nimport {\n\ttype WebSocketMessage as ConnMessage,\n\tmessageLength,\n\tparseWebSocketCloseReason,\n\tsendHttpRequest,\n} from \"./utils\";\n\n/**\n * Connection status for an actor connection.\n *\n * - `\"idle\"`: Not connected, no auto-reconnect (initial state, after dispose, or disabled)\n * - `\"connecting\"`: Attempting to establish connection\n * - `\"connected\"`: Connection is active\n * - `\"disconnected\"`: Connection was lost, will auto-reconnect\n */\nexport type ActorConnStatus =\n\t| \"idle\"\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"disconnected\";\n\ninterface ActionInFlight {\n\tname: string;\n\tresolve: (response: { id: bigint; output: unknown }) => void;\n\treject: (error: Error) => void;\n}\n\ninterface EventSubscriptions<Args extends Array<unknown>> {\n\tcallback: (...args: Args) => void;\n\tonce: boolean;\n}\n\n/**\n * A function that unsubscribes from an event.\n *\n * @typedef {Function} EventUnsubscribe\n */\nexport type EventUnsubscribe = () => void;\n\n/**\n * A function that handles connection errors.\n *\n * @typedef {Function} ActorErrorCallback\n */\nexport type ActorErrorCallback = (error: errors.ActorError) => void;\n\n/**\n * A callback for connection state changes.\n *\n * @typedef {Function} ConnectionStateCallback\n */\nexport type ConnectionStateCallback = () => void;\n\n/**\n * A callback for connection status changes.\n *\n * @typedef {Function} StatusChangeCallback\n */\nexport type StatusChangeCallback = (status: ActorConnStatus) => void;\n\nexport interface SendHttpMessageOpts {\n\tephemeral: boolean;\n\tsignal?: AbortSignal;\n}\n\nexport const CONNECT_SYMBOL = Symbol(\"connect\");\n\n/**\n * Provides underlying functions for {@link ActorConn}. See {@link ActorConn} for using type-safe remote procedure calls.\n *\n * @see {@link ActorConn}\n */\nexport class ActorConnRaw {\n\t#disposed = false;\n\n\t/* Will be aborted on dispose. */\n\t#abortController = new AbortController();\n\n\t#connStatus: ActorConnStatus = \"idle\";\n\n\t#actorId?: string;\n\t#connId?: string;\n\n\t#messageQueue: Array<{\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\t#actionsInFlight = new Map<number, ActionInFlight>();\n\n\t// biome-ignore lint/suspicious/noExplicitAny: Unknown subscription type\n\t#eventSubscriptions = new Map<string, Set<EventSubscriptions<any[]>>>();\n\n\t#errorHandlers = new Set<ActorErrorCallback>();\n\t#openHandlers = new Set<ConnectionStateCallback>();\n\t#openScheduled = false;\n\t#closeHandlers = new Set<ConnectionStateCallback>();\n\t#statusChangeHandlers = new Set<StatusChangeCallback>();\n\n\t#actionIdCounter = 0;\n\t#queueSender: ReturnType<typeof createQueueSender>;\n\n\t/**\n\t * Interval that keeps the NodeJS process alive if this is the only thing running.\n\t *\n\t * See ttps://github.com/nodejs/node/issues/22088\n\t */\n\t#keepNodeAliveInterval: NodeJS.Timeout;\n\n\t/** Promise used to indicate the socket has connected successfully. This will be rejected if the connection fails. */\n\t#onOpenPromise?: ReturnType<typeof promiseWithResolvers<undefined>>;\n\n\t#websocket?: UniversalWebSocket;\n\n\t#client: ClientRaw;\n\t#driver: ManagerDriver;\n\t#params: unknown;\n\t#encoding: Encoding;\n\t#actorQuery: ActorQuery;\n\n\t// TODO: ws message queue\n\n\t/**\n\t * Do not call this directly.\n\t *\n\t * Creates an instance of ActorConnRaw.\n\t *\n\t * @protected\n\t */\n\tpublic constructor(\n\t\tclient: ClientRaw,\n\t\tdriver: ManagerDriver,\n\t\tparams: unknown,\n\t\tencoding: Encoding,\n\t\tactorQuery: ActorQuery,\n\t) {\n\t\tthis.#client = client;\n\t\tthis.#driver = driver;\n\t\tthis.#params = params;\n\t\tthis.#encoding = encoding;\n\t\tthis.#actorQuery = actorQuery;\n\t\tthis.#queueSender = createQueueSender({\n\t\t\tencoding: this.#encoding,\n\t\t\tparams: this.#params,\n\t\t\tcustomFetch: async (request: Request) => {\n\t\t\t\tif (!this.#actorId) {\n\t\t\t\t\tconst { actorId } = await queryActor(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tthis.#actorQuery,\n\t\t\t\t\t\tthis.#driver,\n\t\t\t\t\t);\n\t\t\t\t\tthis.#actorId = actorId;\n\t\t\t\t}\n\t\t\t\treturn this.#driver.sendRequest(this.#actorId, request);\n\t\t\t},\n\t\t});\n\n\t\tthis.#keepNodeAliveInterval = setInterval(() => 60_000);\n\t}\n\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions: QueueSendWaitOptions,\n\t): Promise<QueueSendResult>;\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendNoWaitOptions,\n\t): Promise<void>;\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendOptions,\n\t): Promise<QueueSendResult | void> {\n\t\treturn this.#queueSender.send(name, body, options as any);\n\t}\n\n\t/**\n\t * Call a raw action connection. See {@link ActorConn} for type-safe action calls.\n\t *\n\t * @see {@link ActorConn}\n\t * @template Args - The type of arguments to pass to the action function.\n\t * @template Response - The type of the response returned by the action function.\n\t * @param {string} name - The name of the action function to call.\n\t * @param {...Args} args - The arguments to pass to the action function.\n\t * @returns {Promise<Response>} - A promise that resolves to the response of the action function.\n\t */\n\tasync action<\n\t\tArgs extends Array<unknown> = unknown[],\n\t\tResponse = unknown,\n\t>(opts: {\n\t\tname: string;\n\t\targs: Args;\n\t\tsignal?: AbortSignal;\n\t}): Promise<Response> {\n\t\tlogger().debug({ msg: \"action\", name: opts.name, args: opts.args });\n\n\t\t// If we have an active connection, use the websockactionId\n\t\tconst actionId = this.#actionIdCounter;\n\t\tthis.#actionIdCounter += 1;\n\n\t\tconst { promise, resolve, reject } = promiseWithResolvers<{\n\t\t\tid: bigint;\n\t\t\toutput: unknown;\n\t\t}>((reason) => logger().warn({ msg: \"unhandled action promise rejection\", reason }));\n\t\tthis.#actionsInFlight.set(actionId, {\n\t\t\tname: opts.name,\n\t\t\tresolve,\n\t\t\treject,\n\t\t});\n\t\tlogger().debug({\n\t\t\tmsg: \"added action to in-flight map\",\n\t\t\tactionId,\n\t\t\tactionName: opts.name,\n\t\t\tinFlightCount: this.#actionsInFlight.size,\n\t\t});\n\n\t\tthis.#sendMessage({\n\t\t\tbody: {\n\t\t\t\ttag: \"ActionRequest\",\n\t\t\t\tval: {\n\t\t\t\t\tid: BigInt(actionId),\n\t\t\t\t\tname: opts.name,\n\t\t\t\t\targs: opts.args,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\t// TODO: Throw error if disconnect is called\n\n\t\tconst { id: responseId, output } = await promise;\n\t\tif (responseId !== BigInt(actionId))\n\t\t\tthrow new Error(\n\t\t\t\t`Request ID ${actionId} does not match response ID ${responseId}`,\n\t\t\t);\n\n\t\treturn output as Response;\n\t}\n\n\t/**\n\t * Do not call this directly.\n\t * Establishes a connection to the server using the specified endpoint & encoding & driver.\n\t *\n\t * @protected\n\t */\n\tpublic [CONNECT_SYMBOL]() {\n\t\tthis.#connectWithRetry();\n\t}\n\n\t#setConnStatus(status: ActorConnStatus) {\n\t\tconst prevStatus = this.#connStatus;\n\t\tif (prevStatus === status) return;\n\t\tthis.#connStatus = status;\n\n\t\t// Notify status change handlers\n\t\tfor (const handler of [...this.#statusChangeHandlers]) {\n\t\t\ttry {\n\t\t\t\thandler(status);\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in status change handler\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Notify open handlers\n\t\tif (status === \"connected\") {\n\t\t\tfor (const handler of [...this.#openHandlers]) {\n\t\t\t\ttry {\n\t\t\t\t\thandler();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error in open handler\",\n\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Notify close handlers (only if transitioning from Connected to Disconnected or Idle)\n\t\tif (\n\t\t\t(status === \"disconnected\" || status === \"idle\") &&\n\t\t\tprevStatus === \"connected\"\n\t\t) {\n\t\t\tfor (const handler of [...this.#closeHandlers]) {\n\t\t\t\ttry {\n\t\t\t\t\thandler();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error in close handler\",\n\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#connectWithRetry() {\n\t\tthis.#setConnStatus(\"connecting\");\n\n\t\t// Attempt to reconnect indefinitely\n\t\t// This is intentionally not awaited - connection happens in background\n\t\tpRetry(this.#connectAndWait.bind(this), {\n\t\t\tforever: true,\n\t\t\tminTimeout: 250,\n\t\t\tmaxTimeout: 30_000,\n\n\t\t\tonFailedAttempt: (error) => {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"failed to reconnect\",\n\t\t\t\t\tattempt: error.attemptNumber,\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t// Cancel retry if aborted\n\t\t\tsignal: this.#abortController.signal,\n\t\t}).catch((err) => {\n\t\t\tif ((err as Error).name === \"AbortError\") {\n\t\t\t\tlogger().info({ msg: \"connection retry aborted\" });\n\t\t\t} else {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"unexpected error in connection retry\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync #connectAndWait() {\n\t\ttry {\n\t\t\t// Create promise for open\n\t\t\tif (this.#onOpenPromise)\n\t\t\t\tthrow new Error(\"#onOpenPromise already defined\");\n\t\t\tthis.#onOpenPromise = promiseWithResolvers((reason) => logger().warn({ msg: \"unhandled open promise rejection\", reason }));\n\n\t\t\tawait this.#connectWebSocket();\n\n\t\t\t// Wait for result\n\t\t\tawait this.#onOpenPromise.promise;\n\t\t} finally {\n\t\t\tthis.#onOpenPromise = undefined;\n\t\t}\n\t}\n\n\tasync #connectWebSocket() {\n\t\tconst { actorId } = await queryActor(\n\t\t\tundefined,\n\t\t\tthis.#actorQuery,\n\t\t\tthis.#driver,\n\t\t);\n\n\t\t// Store actorId early so we can use it for error lookups\n\t\tthis.#actorId = actorId;\n\n\t\tconst ws = await this.#driver.openWebSocket(\n\t\t\tPATH_CONNECT,\n\t\t\tactorId,\n\t\t\tthis.#encoding,\n\t\t\tthis.#params,\n\t\t);\n\t\tlogger().debug({\n\t\t\tmsg: \"opened websocket\",\n\t\t\tconnId: this.#connId,\n\t\t\treadyState: ws.readyState,\n\t\t\tmessageQueueLength: this.#messageQueue.length,\n\t\t});\n\t\tthis.#websocket = ws;\n\t\tws.addEventListener(\"open\", () => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"client websocket open\",\n\t\t\t\tconnId: this.#connId,\n\t\t\t});\n\t\t});\n\t\tws.addEventListener(\"message\", async (ev) => {\n\t\t\ttry {\n\t\t\t\tawait this.#handleOnMessage(ev.data);\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in websocket message handler\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tws.addEventListener(\"close\", async (ev) => {\n\t\t\ttry {\n\t\t\t\tawait this.#handleOnClose(ev);\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in websocket close handler\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tws.addEventListener(\"error\", (_ev) => {\n\t\t\ttry {\n\t\t\t\tthis.#handleOnError();\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in websocket error handler\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Called by the onopen event from drivers. */\n\t#handleOnOpen() {\n\t\t// Connection was disposed before Init message arrived - close the websocket to avoid leak\n\t\tif (this.#disposed) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"handleOnOpen called after dispose, closing websocket\",\n\t\t\t});\n\t\t\tif (this.#websocket) {\n\t\t\t\tthis.#websocket.close(1000, \"Disposed\");\n\t\t\t\tthis.#websocket = undefined;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#connStatus === \"connected\" || this.#openScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#openScheduled = true;\n\n\t\tqueueMicrotask(() => {\n\t\t\tthis.#openScheduled = false;\n\t\t\tif (this.#disposed) {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"handleOnOpen scheduled after dispose, closing websocket\",\n\t\t\t\t});\n\t\t\t\tif (this.#websocket) {\n\t\t\t\t\tthis.#websocket.close(1000, \"Disposed\");\n\t\t\t\t\tthis.#websocket = undefined;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"socket open\",\n\t\t\t\tmessageQueueLength: this.#messageQueue.length,\n\t\t\t\tconnId: this.#connId,\n\t\t\t});\n\n\t\t\t// Update connection state (this also notifies handlers)\n\t\t\tthis.#setConnStatus(\"connected\");\n\n\t\t\t// Resolve open promise\n\t\t\tif (this.#onOpenPromise) {\n\t\t\t\tthis.#onOpenPromise.resolve(undefined);\n\t\t\t} else {\n\t\t\t\tlogger().warn({ msg: \"#onOpenPromise is undefined\" });\n\t\t\t}\n\n\t\t\t// Resubscribe to all active events\n\t\t\tfor (const eventName of this.#eventSubscriptions.keys()) {\n\t\t\t\tthis.#sendSubscription(eventName, true);\n\t\t\t}\n\n\t\t\t// Flush queue\n\t\t\t//\n\t\t\t// If the message fails to send, the message will be re-queued\n\t\t\tconst queue = this.#messageQueue;\n\t\t\tthis.#messageQueue = [];\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"flushing message queue\",\n\t\t\t\tqueueLength: queue.length,\n\t\t\t});\n\t\t\tfor (const msg of queue) {\n\t\t\t\tthis.#sendMessage(msg);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Called by the onmessage event from drivers. */\n\tasync #handleOnMessage(data: any) {\n\t\tlogger().trace({\n\t\t\tmsg: \"received message\",\n\t\t\tdataType: typeof data,\n\t\t\tisBlob: data instanceof Blob,\n\t\t\tisArrayBuffer: data instanceof ArrayBuffer,\n\t\t});\n\n\t\tconst response = await this.#parseMessage(data as ConnMessage);\n\t\tlogger().trace(\n\t\t\tgetLogMessage()\n\t\t\t\t? {\n\t\t\t\t\t\tmsg: \"parsed message\",\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\tjsonStringifyCompat(response).substring(0, 100) +\n\t\t\t\t\t\t\t\"...\",\n\t\t\t\t\t}\n\t\t\t\t: { msg: \"parsed message\" },\n\t\t);\n\n\t\tif (response.body.tag === \"Init\") {\n\t\t\t// Store connection info\n\t\t\tthis.#actorId = response.body.val.actorId;\n\t\t\tthis.#connId = response.body.val.connectionId;\n\t\t\tlogger().trace({\n\t\t\t\tmsg: \"received init message\",\n\t\t\t\tactorId: this.#actorId,\n\t\t\t\tconnId: this.#connId,\n\t\t\t});\n\t\t\tthis.#handleOnOpen();\n\t\t} else if (response.body.tag === \"Error\") {\n\t\t\t// Connection error\n\t\t\tconst { group, code, message, metadata, actionId } =\n\t\t\t\tresponse.body.val;\n\n\t\t\tif (actionId) {\n\t\t\t\tconst inFlight = this.#takeActionInFlight(Number(actionId));\n\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"action error\",\n\t\t\t\t\tactionId: actionId,\n\t\t\t\t\tactionName: inFlight?.name,\n\t\t\t\t\tgroup,\n\t\t\t\t\tcode,\n\t\t\t\t\tmessage,\n\t\t\t\t\tmetadata,\n\t\t\t\t});\n\n\t\t\t\tinFlight.reject(\n\t\t\t\t\tnew errors.ActorError(group, code, message, metadata),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"connection error\",\n\t\t\t\t\tgroup,\n\t\t\t\t\tcode,\n\t\t\t\t\tmessage,\n\t\t\t\t\tmetadata,\n\t\t\t\t});\n\n\t\t\t\t// Check if this is an actor scheduling error and try to get more details\n\t\t\t\tlet errorToThrow = new errors.ActorError(\n\t\t\t\t\tgroup,\n\t\t\t\t\tcode,\n\t\t\t\t\tmessage,\n\t\t\t\t\tmetadata,\n\t\t\t\t);\n\t\t\t\tif (errors.isSchedulingError(group, code) && this.#actorId) {\n\t\t\t\t\tconst schedulingError = await checkForSchedulingError(\n\t\t\t\t\t\tgroup,\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\tthis.#actorId,\n\t\t\t\t\t\tthis.#actorQuery,\n\t\t\t\t\t\tthis.#driver,\n\t\t\t\t\t);\n\t\t\t\t\tif (schedulingError) {\n\t\t\t\t\t\terrorToThrow = schedulingError;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If we have an onOpenPromise, reject it with the error\n\t\t\t\tif (this.#onOpenPromise) {\n\t\t\t\t\tthis.#onOpenPromise.reject(errorToThrow);\n\t\t\t\t}\n\n\t\t\t\t// Reject any in-flight requests\n\t\t\t\tfor (const [id, inFlight] of this.#actionsInFlight.entries()) {\n\t\t\t\t\tinFlight.reject(errorToThrow);\n\t\t\t\t\tthis.#actionsInFlight.delete(id);\n\t\t\t\t}\n\n\t\t\t\tthis.#dispatchActorError(errorToThrow);\n\t\t\t}\n\t\t} else if (response.body.tag === \"ActionResponse\") {\n\t\t\t// Action response OK\n\t\t\tconst { id: actionId } = response.body.val;\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"received action response\",\n\t\t\t\tactionId: Number(actionId),\n\t\t\t\tinFlightCount: this.#actionsInFlight.size,\n\t\t\t\tinFlightIds: Array.from(this.#actionsInFlight.keys()),\n\t\t\t});\n\n\t\t\tconst inFlight = this.#takeActionInFlight(Number(actionId));\n\t\t\tlogger().trace({\n\t\t\t\tmsg: \"resolving action promise\",\n\t\t\t\tactionId,\n\t\t\t\tactionName: inFlight?.name,\n\t\t\t});\n\t\t\tinFlight.resolve(response.body.val);\n\t\t} else if (response.body.tag === \"Event\") {\n\t\t\tlogger().trace({\n\t\t\t\tmsg: \"received event\",\n\t\t\t\tname: response.body.val.name,\n\t\t\t});\n\t\t\tthis.#dispatchEvent(response.body.val);\n\t\t} else {\n\t\t\tassertUnreachable(response.body);\n\t\t}\n\t}\n\n\t/** Called by the onclose event from drivers. */\n\tasync #handleOnClose(event: Event | CloseEvent) {\n\t\t// We can't use `event instanceof CloseEvent` because it's not defined in NodeJS\n\t\tconst closeEvent = event as CloseEvent;\n\t\tconst wasClean = closeEvent.wasClean;\n\t\tconst wasConnected = this.#connStatus === \"connected\";\n\n\t\tlogger().info({\n\t\t\tmsg: \"socket closed\",\n\t\t\tcode: closeEvent.code,\n\t\t\treason: closeEvent.reason,\n\t\t\twasClean,\n\t\t\tdisposed: this.#disposed,\n\t\t\tconnId: this.#connId,\n\t\t});\n\n\t\tthis.#websocket = undefined;\n\n\t\tif (this.#disposed) {\n\t\t\t// Use ActorConnDisposed error and prevent unhandled rejection\n\t\t\tthis.#rejectPendingPromises(new errors.ActorConnDisposed(), true);\n\t\t} else {\n\t\t\tthis.#setConnStatus(\"disconnected\");\n\n\t\t\t// Build error from close event\n\t\t\tlet error: Error;\n\t\t\tconst reason = closeEvent.reason || \"\";\n\t\t\tconst parsed = parseWebSocketCloseReason(reason);\n\n\t\t\tif (parsed) {\n\t\t\t\tconst { group, code } = parsed;\n\n\t\t\t\t// Check if this is a scheduling error\n\t\t\t\tif (errors.isSchedulingError(group, code) && this.#actorId) {\n\t\t\t\t\tconst schedulingError = await checkForSchedulingError(\n\t\t\t\t\t\tgroup,\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\tthis.#actorId,\n\t\t\t\t\t\tthis.#actorQuery,\n\t\t\t\t\t\tthis.#driver,\n\t\t\t\t\t);\n\t\t\t\t\tif (schedulingError) {\n\t\t\t\t\t\terror = schedulingError;\n\t\t\t\t\t} else {\n\t\t\t\t\t\terror = new errors.ActorError(\n\t\t\t\t\t\t\tgroup,\n\t\t\t\t\t\t\tcode,\n\t\t\t\t\t\t\t`Connection closed: ${reason}`,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\terror = new errors.ActorError(\n\t\t\t\t\t\tgroup,\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\t`Connection closed: ${reason}`,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Default error for non-structured close reasons\n\t\t\t\terror = new Error(\n\t\t\t\t\t`${wasClean ? \"Connection closed\" : \"Connection lost\"} (code: ${closeEvent.code}, reason: ${reason})`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.#rejectPendingPromises(error, false);\n\n\t\t\t// Dispatch to error handler if it's an ActorError\n\t\t\tif (error instanceof errors.ActorError) {\n\t\t\t\tthis.#dispatchActorError(error);\n\t\t\t}\n\n\t\t\t// Automatically reconnect if we were connected\n\t\t\tif (wasConnected) {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"triggering reconnect\",\n\t\t\t\t\tconnId: this.#connId,\n\t\t\t\t});\n\t\t\t\tthis.#connectWithRetry();\n\t\t\t}\n\t\t}\n\t}\n\n\t#rejectPendingPromises(error: Error, suppressUnhandled: boolean) {\n\t\tif (this.#onOpenPromise) {\n\t\t\tif (suppressUnhandled) {\n\t\t\t\tthis.#onOpenPromise.promise.catch(() => {});\n\t\t\t}\n\t\t\tthis.#onOpenPromise.reject(error);\n\t\t}\n\n\t\tfor (const actionInfo of this.#actionsInFlight.values()) {\n\t\t\tactionInfo.reject(error);\n\t\t}\n\t\tthis.#actionsInFlight.clear();\n\t}\n\n\t/** Called by the onerror event from drivers. */\n\t#handleOnError() {\n\t\tif (this.#disposed) return;\n\n\t\t// More detailed information will be logged in onclose\n\t\tlogger().warn(\"socket error\");\n\t}\n\n\t#takeActionInFlight(id: number): ActionInFlight {\n\t\tconst inFlight = this.#actionsInFlight.get(id);\n\t\tif (!inFlight) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"action not found in in-flight map\",\n\t\t\t\tlookupId: id,\n\t\t\t\tinFlightCount: this.#actionsInFlight.size,\n\t\t\t\tinFlightIds: Array.from(this.#actionsInFlight.keys()),\n\t\t\t\tinFlightActions: Array.from(\n\t\t\t\t\tthis.#actionsInFlight.entries(),\n\t\t\t\t).map(([id, action]) => ({\n\t\t\t\t\tid,\n\t\t\t\t\tname: action.name,\n\t\t\t\t})),\n\t\t\t});\n\t\t\tthrow new errors.InternalError(`No in flight response for ${id}`);\n\t\t}\n\t\tthis.#actionsInFlight.delete(id);\n\t\tlogger().debug({\n\t\t\tmsg: \"removed action from in-flight map\",\n\t\t\tactionId: id,\n\t\t\tactionName: inFlight.name,\n\t\t\tinFlightCount: this.#actionsInFlight.size,\n\t\t});\n\t\treturn inFlight;\n\t}\n\n\t#dispatchEvent(event: { name: string; args: unknown }) {\n\t\tconst { name, args } = event;\n\n\t\tconst listeners = this.#eventSubscriptions.get(name);\n\t\tif (!listeners) return;\n\n\t\t// Create a new array to avoid issues with listeners being removed during iteration\n\t\tfor (const listener of [...listeners]) {\n\t\t\tlistener.callback(...(args as unknown[]));\n\n\t\t\t// Remove if this was a one-time listener\n\t\t\tif (listener.once) {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t}\n\t\t}\n\n\t\t// Clean up empty listener sets\n\t\tif (listeners.size === 0) {\n\t\t\tthis.#eventSubscriptions.delete(name);\n\t\t}\n\t}\n\n\t#dispatchActorError(error: errors.ActorError) {\n\t\t// Call all registered error handlers\n\t\tfor (const handler of [...this.#errorHandlers]) {\n\t\t\ttry {\n\t\t\t\thandler(error);\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in connection error handler\",\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t#addEventSubscription<Args extends Array<unknown>>(\n\t\teventName: string,\n\t\tcallback: (...args: Args) => void,\n\t\tonce: boolean,\n\t): EventUnsubscribe {\n\t\tconst listener: EventSubscriptions<Args> = {\n\t\t\tcallback,\n\t\t\tonce,\n\t\t};\n\n\t\tlet subscriptionSet = this.#eventSubscriptions.get(eventName);\n\t\tif (subscriptionSet === undefined) {\n\t\t\tsubscriptionSet = new Set();\n\t\t\tthis.#eventSubscriptions.set(eventName, subscriptionSet);\n\t\t\tthis.#sendSubscription(eventName, true);\n\t\t}\n\t\tsubscriptionSet.add(listener);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tconst listeners = this.#eventSubscriptions.get(eventName);\n\t\t\tif (listeners) {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t\tif (listeners.size === 0) {\n\t\t\t\t\tthis.#eventSubscriptions.delete(eventName);\n\t\t\t\t\tthis.#sendSubscription(eventName, false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Subscribes to an event that will happen repeatedly.\n\t *\n\t * @template Args - The type of arguments the event callback will receive.\n\t * @param {string} eventName - The name of the event to subscribe to.\n\t * @param {(...args: Args) => void} callback - The callback function to execute when the event is triggered.\n\t * @returns {EventUnsubscribe} - A function to unsubscribe from the event.\n\t * @see {@link https://rivet.dev/docs/events|Events Documentation}\n\t */\n\ton<Args extends Array<unknown> = unknown[]>(\n\t\teventName: string,\n\t\tcallback: (...args: Args) => void,\n\t): EventUnsubscribe {\n\t\treturn this.#addEventSubscription<Args>(eventName, callback, false);\n\t}\n\n\t/**\n\t * Subscribes to an event that will be triggered only once.\n\t *\n\t * @template Args - The type of arguments the event callback will receive.\n\t * @param {string} eventName - The name of the event to subscribe to.\n\t * @param {(...args: Args) => void} callback - The callback function to execute when the event is triggered.\n\t * @returns {EventUnsubscribe} - A function to unsubscribe from the event.\n\t * @see {@link https://rivet.dev/docs/events|Events Documentation}\n\t */\n\tonce<Args extends Array<unknown> = unknown[]>(\n\t\teventName: string,\n\t\tcallback: (...args: Args) => void,\n\t): EventUnsubscribe {\n\t\treturn this.#addEventSubscription<Args>(eventName, callback, true);\n\t}\n\n\t/**\n\t * Subscribes to connection errors.\n\t *\n\t * @param {ActorErrorCallback} callback - The callback function to execute when a connection error occurs.\n\t * @returns {() => void} - A function to unsubscribe from the error handler.\n\t */\n\tonError(callback: ActorErrorCallback): () => void {\n\t\tthis.#errorHandlers.add(callback);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tthis.#errorHandlers.delete(callback);\n\t\t};\n\t}\n\n\t/**\n\t * Returns the current connection status.\n\t *\n\t * @returns {ActorConnStatus} - The current connection status.\n\t */\n\tget connStatus(): ActorConnStatus {\n\t\treturn this.#connStatus;\n\t}\n\n\t/**\n\t * Returns whether the connection is currently open.\n\t *\n\t * @deprecated Use `connStatus` instead.\n\t * @returns {boolean} - True if the connection is open, false otherwise.\n\t */\n\tget isConnected(): boolean {\n\t\treturn this.#connStatus === \"connected\";\n\t}\n\n\t/**\n\t * Subscribes to connection open events.\n\t *\n\t * This is called when the WebSocket connection is established and the Init message is received.\n\t *\n\t * @param {ConnectionStateCallback} callback - The callback function to execute when the connection opens.\n\t * @returns {() => void} - A function to unsubscribe from the open handler.\n\t */\n\tonOpen(callback: ConnectionStateCallback): () => void {\n\t\tthis.#openHandlers.add(callback);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tthis.#openHandlers.delete(callback);\n\t\t};\n\t}\n\n\t/**\n\t * Subscribes to connection close events.\n\t *\n\t * This is called when the WebSocket connection is closed. The connection will automatically\n\t * attempt to reconnect unless disposed.\n\t *\n\t * @param {ConnectionStateCallback} callback - The callback function to execute when the connection closes.\n\t * @returns {() => void} - A function to unsubscribe from the close handler.\n\t */\n\tonClose(callback: ConnectionStateCallback): () => void {\n\t\tthis.#closeHandlers.add(callback);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tthis.#closeHandlers.delete(callback);\n\t\t};\n\t}\n\n\t/**\n\t * Subscribes to connection status changes.\n\t *\n\t * This is called whenever the connection status changes between Disconnected, Connecting, and Connected.\n\t *\n\t * @param {StatusChangeCallback} callback - The callback function to execute when the status changes.\n\t * @returns {() => void} - A function to unsubscribe from the status change handler.\n\t */\n\tonStatusChange(callback: StatusChangeCallback): () => void {\n\t\tthis.#statusChangeHandlers.add(callback);\n\n\t\t// Return unsubscribe function\n\t\treturn () => {\n\t\t\tthis.#statusChangeHandlers.delete(callback);\n\t\t};\n\t}\n\n\t#sendMessage(\n\t\tmessage: {\n\t\t\tbody:\n\t\t\t\t| {\n\t\t\t\t\t\ttag: \"ActionRequest\";\n\t\t\t\t\t\tval: { id: bigint; name: string; args: unknown };\n\t\t\t\t }\n\t\t\t\t| {\n\t\t\t\t\t\ttag: \"SubscriptionRequest\";\n\t\t\t\t\t\tval: { eventName: string; subscribe: boolean };\n\t\t\t\t };\n\t\t},\n\t\topts?: SendHttpMessageOpts,\n\t) {\n\t\tif (this.#disposed) {\n\t\t\tif (opts?.ephemeral) {\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tthrow new errors.ActorConnDisposed();\n\t\t\t}\n\t\t}\n\n\t\tlet queueMessage = false;\n\t\tif (this.#websocket) {\n\t\t\tconst readyState = this.#websocket.readyState;\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"websocket send attempt\",\n\t\t\t\treadyState,\n\t\t\t\treadyStateString:\n\t\t\t\t\treadyState === 0\n\t\t\t\t\t\t? \"CONNECTING\"\n\t\t\t\t\t\t: readyState === 1\n\t\t\t\t\t\t\t? \"OPEN\"\n\t\t\t\t\t\t\t: readyState === 2\n\t\t\t\t\t\t\t\t? \"CLOSING\"\n\t\t\t\t\t\t\t\t: \"CLOSED\",\n\t\t\t\tconnId: this.#connId,\n\t\t\t\tmessageType: (message.body as any).tag,\n\t\t\t\tactionName: (message.body as any).val?.name,\n\t\t\t});\n\t\t\tif (this.#connStatus !== \"connected\") {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"websocket init pending, queueing message\",\n\t\t\t\t\tconnStatus: this.#connStatus,\n\t\t\t\t\tmessageType: (message.body as any).tag,\n\t\t\t\t});\n\t\t\t\tqueueMessage = true;\n\t\t\t} else if (readyState === 1) {\n\t\t\t\ttry {\n\t\t\t\t\tconst messageSerialized = serializeWithEncoding(\n\t\t\t\t\t\tthis.#encoding,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\tTO_SERVER_VERSIONED,\n\t\t\t\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\t\t\tToServerSchema,\n\t\t\t\t\t\t// JSON: args is the raw value\n\t\t\t\t\t\t(msg): ToServerJson => msg as ToServerJson,\n\t\t\t\t\t\t// BARE: args needs to be CBOR-encoded to ArrayBuffer\n\t\t\t\t\t\t(msg): protocol.ToServer => {\n\t\t\t\t\t\t\tif (msg.body.tag === \"ActionRequest\") {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\t\ttag: \"ActionRequest\",\n\t\t\t\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\t\t\t\tid: msg.body.val.id,\n\t\t\t\t\t\t\t\t\t\t\tname: msg.body.val.name,\n\t\t\t\t\t\t\t\t\t\t\targs: bufferToArrayBuffer(\n\t\t\t\t\t\t\t\t\t\t\t\tcbor.encode(msg.body.val.args),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t},\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\t} else {\n\t\t\t\t\t\t\t\treturn msg as protocol.ToServer;\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\tthis.#websocket.send(messageSerialized);\n\t\t\t\t\tlogger().trace({\n\t\t\t\t\t\tmsg: \"sent websocket message\",\n\t\t\t\t\t\tlen: messageLength(messageSerialized),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"failed to send message, added to queue\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tconnId: this.#connId,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Assuming the socket is disconnected and will be reconnected soon\n\t\t\t\t\tqueueMessage = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"websocket not open, queueing message\",\n\t\t\t\t\treadyState,\n\t\t\t\t});\n\t\t\t\tqueueMessage = true;\n\t\t\t}\n\t\t} else {\n\t\t\t// No websocket connected yet\n\t\t\tlogger().debug({ msg: \"no websocket, queueing message\" });\n\t\t\tqueueMessage = true;\n\t\t}\n\n\t\tif (!opts?.ephemeral && queueMessage) {\n\t\t\tthis.#messageQueue.push(message);\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"queued connection message\",\n\t\t\t\tqueueLength: this.#messageQueue.length,\n\t\t\t\tconnId: this.#connId,\n\t\t\t\tmessageType: (message.body as any).tag,\n\t\t\t\tactionName: (message.body as any).val?.name,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync #parseMessage(data: ConnMessage): Promise<{\n\t\tbody:\n\t\t\t| { tag: \"Init\"; val: { actorId: string; connectionId: string } }\n\t\t\t| {\n\t\t\t\t\ttag: \"Error\";\n\t\t\t\t\tval: {\n\t\t\t\t\t\tgroup: string;\n\t\t\t\t\t\tcode: string;\n\t\t\t\t\t\tmessage: string;\n\t\t\t\t\t\tmetadata: unknown;\n\t\t\t\t\t\tactionId: bigint | null;\n\t\t\t\t\t};\n\t\t\t }\n\t\t\t| { tag: \"ActionResponse\"; val: { id: bigint; output: unknown } }\n\t\t\t| { tag: \"Event\"; val: { name: string; args: unknown } };\n\t}> {\n\t\tinvariant(this.#websocket, \"websocket must be defined\");\n\n\t\tconst buffer = await inputDataToBuffer(data);\n\n\t\treturn deserializeWithEncoding(\n\t\t\tthis.#encoding,\n\t\t\tbuffer,\n\t\t\tTO_CLIENT_VERSIONED,\n\t\t\tToClientSchema,\n\t\t\t// JSON: values are already the correct type\n\t\t\t(msg): ToClientJson => msg as ToClientJson,\n\t\t\t// BARE: need to decode ArrayBuffer fields back to unknown\n\t\t\t(msg): any => {\n\t\t\t\tif (msg.body.tag === \"Error\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Error\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tgroup: msg.body.val.group,\n\t\t\t\t\t\t\t\tcode: msg.body.val.code,\n\t\t\t\t\t\t\t\tmessage: msg.body.val.message,\n\t\t\t\t\t\t\t\tmetadata: msg.body.val.metadata\n\t\t\t\t\t\t\t\t\t? cbor.decode(\n\t\t\t\t\t\t\t\t\t\t\tnew Uint8Array(\n\t\t\t\t\t\t\t\t\t\t\t\tmsg.body.val.metadata,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\tactionId: msg.body.val.actionId,\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 (msg.body.tag === \"ActionResponse\") {\n\t\t\t\t\treturn {\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\tid: msg.body.val.id,\n\t\t\t\t\t\t\t\toutput: cbor.decode(\n\t\t\t\t\t\t\t\t\tnew Uint8Array(msg.body.val.output),\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 (msg.body.tag === \"Event\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Event\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tname: msg.body.val.name,\n\t\t\t\t\t\t\t\targs: cbor.decode(\n\t\t\t\t\t\t\t\t\tnew Uint8Array(msg.body.val.args),\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\t// Init has no ArrayBuffer fields\n\t\t\t\t\treturn msg;\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Get the actor ID (for testing purposes).\n\t * @internal\n\t */\n\tget actorId(): string | undefined {\n\t\treturn this.#actorId;\n\t}\n\n\t/**\n\t * Get the connection ID (for testing purposes).\n\t * @internal\n\t */\n\tget connId(): string | undefined {\n\t\treturn this.#connId;\n\t}\n\n\t/**\n\t * Get the connection ID (for testing purposes).\n\t * @internal\n\t * @deprecated Use `connId` instead.\n\t */\n\tget connectionId(): string | undefined {\n\t\treturn this.#connId;\n\t}\n\n\t/**\n\t * Disconnects from the actor.\n\t *\n\t * @returns {Promise<void>} A promise that resolves when the socket is gracefully closed.\n\t */\n\tasync dispose(): Promise<void> {\n\t\t// Internally, this \"disposes\" the connection\n\n\t\tif (this.#disposed) {\n\t\t\tlogger().warn({ msg: \"connection already disconnected\" });\n\t\t\treturn;\n\t\t}\n\t\tthis.#disposed = true;\n\n\t\tlogger().debug({ msg: \"disposing actor conn\" });\n\n\t\t// Set status to Idle (intentionally closed, no auto-reconnect)\n\t\tthis.#setConnStatus(\"idle\");\n\n\t\t// Clear interval so NodeJS process can exit\n\t\tclearInterval(this.#keepNodeAliveInterval);\n\n\t\t// Abort retry loop\n\t\tthis.#abortController.abort();\n\n\t\t// Remove from registry\n\t\tthis.#client[ACTOR_CONNS_SYMBOL].delete(this);\n\n\t\t// Close websocket (#handleOnClose will reject pending promises)\n\t\tif (this.#websocket) {\n\t\t\tconst ws = this.#websocket;\n\t\t\tif (\n\t\t\t\tws.readyState !== 2 /* CLOSING */ &&\n\t\t\t\tws.readyState !== 3 /* CLOSED */\n\t\t\t) {\n\t\t\t\tconst { promise, resolve } = promiseWithResolvers((reason) => logger().warn({ msg: \"unhandled websocket close promise rejection\", reason }));\n\t\t\t\tws.addEventListener(\"close\", () => resolve(undefined));\n\t\t\t\tws.close(1000, \"Disposed\");\n\t\t\t\tawait promise;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#rejectPendingPromises(new errors.ActorConnDisposed(), true);\n\t\t}\n\t\tthis.#websocket = undefined;\n\t}\n\n\t#sendSubscription(eventName: string, subscribe: boolean) {\n\t\tthis.#sendMessage(\n\t\t\t{\n\t\t\t\tbody: {\n\t\t\t\t\ttag: \"SubscriptionRequest\",\n\t\t\t\t\tval: {\n\t\t\t\t\t\teventName,\n\t\t\t\t\t\tsubscribe,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ ephemeral: true },\n\t\t);\n\t}\n}\n\n/**\n * Connection to a actor. Allows calling actor's remote procedure calls with inferred types. See {@link ActorConnRaw} for underlying methods.\n *\n * @example\n * ```\n * const room = client.connect<ChatRoom>(...etc...);\n * // This calls the action named `sendMessage` on the `ChatRoom` actor.\n * await room.sendMessage('Hello, world!');\n * ```\n *\n * Private methods (e.g. those starting with `_`) are automatically excluded.\n *\n * @template AD The actor class that this connection is for.\n * @see {@link ActorConnRaw}\n */\nexport type ActorConn<AD extends AnyActorDefinition> = ActorConnRaw &\n\tActorDefinitionActions<AD>;\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","export const KEYS = {\n\tPERSIST_DATA: Uint8Array.from([1]),\n\tCONN_PREFIX: Uint8Array.from([2]), // Prefix for connection keys\n\tINSPECTOR_TOKEN: Uint8Array.from([3]), // Inspector token key\n\tKV: Uint8Array.from([4]), // Prefix for user-facing KV storage\n\tQUEUE_PREFIX: Uint8Array.from([5]), // Prefix for queue storage\n\tWORKFLOW_PREFIX: Uint8Array.from([6]), // Prefix for workflow storage\n\tTRACES_PREFIX: Uint8Array.from([7]), // Prefix for traces storage\n\tSQLITE_PREFIX: Uint8Array.from([8]), // Prefix for SQLite VFS data\n};\n\nexport const STORAGE_VERSION = {\n\tQUEUE: 1,\n\tWORKFLOW: 1,\n\tTRACES: 1,\n\tSQLITE: 1,\n} as const;\n\nconst STORAGE_VERSION_BYTES = {\n\tQUEUE: Uint8Array.from([STORAGE_VERSION.QUEUE]),\n\tWORKFLOW: Uint8Array.from([STORAGE_VERSION.WORKFLOW]),\n\tTRACES: Uint8Array.from([STORAGE_VERSION.TRACES]),\n\tSQLITE: Uint8Array.from([STORAGE_VERSION.SQLITE]),\n} as const;\n\nconst QUEUE_NAMESPACE = {\n\tMETADATA: Uint8Array.from([1]),\n\tMESSAGES: Uint8Array.from([2]),\n} as const;\n\nconst QUEUE_ID_BYTES = 8;\n\nfunction concatPrefix(prefix: Uint8Array, suffix: Uint8Array): Uint8Array {\n\tconst merged = new Uint8Array(prefix.length + suffix.length);\n\tmerged.set(prefix, 0);\n\tmerged.set(suffix, prefix.length);\n\treturn merged;\n}\n\nconst QUEUE_STORAGE_PREFIX = concatPrefix(\n\tKEYS.QUEUE_PREFIX,\n\tSTORAGE_VERSION_BYTES.QUEUE,\n);\nconst QUEUE_METADATA_KEY = concatPrefix(\n\tQUEUE_STORAGE_PREFIX,\n\tQUEUE_NAMESPACE.METADATA,\n);\nconst QUEUE_MESSAGES_PREFIX = concatPrefix(\n\tQUEUE_STORAGE_PREFIX,\n\tQUEUE_NAMESPACE.MESSAGES,\n);\nconst WORKFLOW_STORAGE_PREFIX = concatPrefix(\n\tKEYS.WORKFLOW_PREFIX,\n\tSTORAGE_VERSION_BYTES.WORKFLOW,\n);\nconst TRACES_STORAGE_PREFIX = concatPrefix(\n\tKEYS.TRACES_PREFIX,\n\tSTORAGE_VERSION_BYTES.TRACES,\n);\nconst SQLITE_STORAGE_PREFIX = concatPrefix(\n\tKEYS.SQLITE_PREFIX,\n\tSTORAGE_VERSION_BYTES.SQLITE,\n);\n\n// Helper to create a prefixed key for user-facing KV storage\nexport function makePrefixedKey(key: Uint8Array): Uint8Array {\n\tconst prefixed = new Uint8Array(KEYS.KV.length + key.length);\n\tprefixed.set(KEYS.KV, 0);\n\tprefixed.set(key, KEYS.KV.length);\n\treturn prefixed;\n}\n\n// Helper to remove the prefix from a key\nexport function removePrefixFromKey(prefixedKey: Uint8Array): Uint8Array {\n\treturn prefixedKey.slice(KEYS.KV.length);\n}\n\nexport function makeWorkflowKey(key: Uint8Array): Uint8Array {\n\treturn concatPrefix(WORKFLOW_STORAGE_PREFIX, key);\n}\n\nexport function makeTracesKey(key: Uint8Array): Uint8Array {\n\treturn concatPrefix(TRACES_STORAGE_PREFIX, key);\n}\n\nexport function workflowStoragePrefix(): Uint8Array {\n\treturn Uint8Array.from(WORKFLOW_STORAGE_PREFIX);\n}\n\nexport function tracesStoragePrefix(): Uint8Array {\n\treturn Uint8Array.from(TRACES_STORAGE_PREFIX);\n}\n\nexport function sqliteStoragePrefix(): Uint8Array {\n\treturn Uint8Array.from(SQLITE_STORAGE_PREFIX);\n}\n\nexport function queueStoragePrefix(): Uint8Array {\n\treturn Uint8Array.from(QUEUE_STORAGE_PREFIX);\n}\n\nexport function queueMetadataKey(): Uint8Array {\n\treturn Uint8Array.from(QUEUE_METADATA_KEY);\n}\n\nexport function queueMessagesPrefix(): Uint8Array {\n\treturn Uint8Array.from(QUEUE_MESSAGES_PREFIX);\n}\n\n// Helper to create a connection key\nexport function makeConnKey(connId: string): Uint8Array {\n\tconst encoder = new TextEncoder();\n\tconst connIdBytes = encoder.encode(connId);\n\tconst key = new Uint8Array(KEYS.CONN_PREFIX.length + connIdBytes.length);\n\tkey.set(KEYS.CONN_PREFIX, 0);\n\tkey.set(connIdBytes, KEYS.CONN_PREFIX.length);\n\treturn key;\n}\n\n// Helper to create a queue message key\nexport function makeQueueMessageKey(id: bigint): Uint8Array {\n\tconst key = new Uint8Array(QUEUE_MESSAGES_PREFIX.length + QUEUE_ID_BYTES);\n\tkey.set(QUEUE_MESSAGES_PREFIX, 0);\n\tconst view = new DataView(key.buffer, key.byteOffset, key.byteLength);\n\tview.setBigUint64(QUEUE_MESSAGES_PREFIX.length, id, false);\n\treturn key;\n}\n\n// Helper to decode a queue message key\nexport function decodeQueueMessageKey(key: Uint8Array): bigint {\n\tconst offset = QUEUE_MESSAGES_PREFIX.length;\n\tif (key.length < offset + QUEUE_ID_BYTES) {\n\t\tthrow new Error(\"Queue key is too short\");\n\t}\n\tfor (let i = 0; i < QUEUE_MESSAGES_PREFIX.length; i++) {\n\t\tif (key[i] !== QUEUE_MESSAGES_PREFIX[i]) {\n\t\t\tthrow new Error(\"Queue key has invalid prefix\");\n\t\t}\n\t}\n\tconst view = new DataView(\n\t\tkey.buffer,\n\t\tkey.byteOffset + offset,\n\t\tQUEUE_ID_BYTES,\n\t);\n\treturn view.getBigUint64(0, false);\n}\n","import type { Context as HonoContext } from \"hono\";\nimport * as errors from \"@/actor/errors\";\nimport { stringifyError } from \"@/common/utils\";\nimport type { ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\nimport { ActorSchedulingError } from \"./errors\";\nimport { logger } from \"./log\";\n\n/**\n * Query the manager driver to get or create a actor based on the provided query\n */\nexport async function queryActor(\n\tc: HonoContext | undefined,\n\tquery: ActorQuery,\n\tmanagerDriver: ManagerDriver,\n): Promise<{ actorId: string }> {\n\tlogger().debug({ msg: \"querying actor\", query: JSON.stringify(query) });\n\tlet actorOutput: { actorId: string };\n\tif (\"getForId\" in query) {\n\t\tconst output = await managerDriver.getForId({\n\t\t\tc,\n\t\t\tname: query.getForId.name,\n\t\t\tactorId: query.getForId.actorId,\n\t\t});\n\t\tif (!output) throw new errors.ActorNotFound(query.getForId.actorId);\n\t\tactorOutput = output;\n\t} else if (\"getForKey\" in query) {\n\t\tconst existingActor = await managerDriver.getWithKey({\n\t\t\tc,\n\t\t\tname: query.getForKey.name,\n\t\t\tkey: query.getForKey.key,\n\t\t});\n\t\tif (!existingActor) {\n\t\t\tthrow new errors.ActorNotFound(\n\t\t\t\t`${query.getForKey.name}:${JSON.stringify(query.getForKey.key)}`,\n\t\t\t);\n\t\t}\n\t\tactorOutput = existingActor;\n\t} else if (\"getOrCreateForKey\" in query) {\n\t\tconst getOrCreateOutput = await managerDriver.getOrCreateWithKey({\n\t\t\tc,\n\t\t\tname: query.getOrCreateForKey.name,\n\t\t\tkey: query.getOrCreateForKey.key,\n\t\t\tinput: query.getOrCreateForKey.input,\n\t\t\tregion: query.getOrCreateForKey.region,\n\t\t});\n\t\tactorOutput = {\n\t\t\tactorId: getOrCreateOutput.actorId,\n\t\t};\n\t} else if (\"create\" in query) {\n\t\tconst createOutput = await managerDriver.createActor({\n\t\t\tc,\n\t\t\tname: query.create.name,\n\t\t\tkey: query.create.key,\n\t\t\tinput: query.create.input,\n\t\t\tregion: query.create.region,\n\t\t});\n\t\tactorOutput = {\n\t\t\tactorId: createOutput.actorId,\n\t\t};\n\t} else {\n\t\tthrow new errors.InvalidRequest(\"Invalid query format\");\n\t}\n\n\tlogger().debug({ msg: \"actor query result\", actorId: actorOutput.actorId });\n\treturn { actorId: actorOutput.actorId };\n}\n\n/**\n * Extract the actor name from a query.\n */\nexport function getActorNameFromQuery(query: ActorQuery): string {\n\tif (\"getForId\" in query) return query.getForId.name;\n\tif (\"getForKey\" in query) return query.getForKey.name;\n\tif (\"getOrCreateForKey\" in query) return query.getOrCreateForKey.name;\n\tif (\"create\" in query) return query.create.name;\n\tthrow new errors.InvalidRequest(\"Invalid query format\");\n}\n\n/**\n * Fetch actor details and check for scheduling errors.\n */\nexport async function checkForSchedulingError(\n\tgroup: string,\n\tcode: string,\n\tactorId: string,\n\tquery: ActorQuery,\n\tdriver: ManagerDriver,\n): Promise<ActorSchedulingError | null> {\n\tconst name = getActorNameFromQuery(query);\n\n\ttry {\n\t\tconst actor = await driver.getForId({ name, actorId });\n\n\t\tif (actor?.error) {\n\t\t\tlogger().info({\n\t\t\t\tmsg: \"found actor scheduling error\",\n\t\t\t\tactorId,\n\t\t\t\terror: actor.error,\n\t\t\t});\n\t\t\treturn new ActorSchedulingError(group, code, actorId, actor.error);\n\t\t}\n\t} catch (err) {\n\t\tlogger().warn({\n\t\t\tmsg: \"failed to fetch actor details for scheduling error check\",\n\t\t\tactorId,\n\t\t\terror: stringifyError(err),\n\t\t});\n\t}\n\n\treturn null;\n}\n","import * as cbor from \"cbor-x\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport { HEADER_CONN_PARAMS, HEADER_ENCODING } from \"@/driver-helpers/mod\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tHTTP_QUEUE_SEND_REQUEST_VERSIONED,\n\tHTTP_QUEUE_SEND_RESPONSE_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype HttpQueueSendRequest as HttpQueueSendRequestJson,\n\tHttpQueueSendRequestSchema,\n\ttype HttpQueueSendResponse as HttpQueueSendResponseJson,\n\tHttpQueueSendResponseSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport { sendHttpRequest } from \"./utils\";\n\nexport interface QueueSender {\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions: QueueSendWaitOptions,\n\t): Promise<QueueSendResult>;\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendNoWaitOptions,\n\t): Promise<void>;\n}\n\nexport interface QueueSendWaitOptions {\n\twait: true;\n\ttimeout?: number;\n\tsignal?: AbortSignal;\n}\n\nexport interface QueueSendNoWaitOptions {\n\twait?: false;\n\ttimeout?: never;\n\tsignal?: AbortSignal;\n}\n\nexport type QueueSendOptions = QueueSendWaitOptions | QueueSendNoWaitOptions;\n\nexport interface QueueSendResult {\n\tstatus: \"completed\" | \"timedOut\";\n\tresponse?: unknown;\n}\n\ninterface QueueSenderOptions {\n\tencoding: Encoding;\n\tparams: unknown;\n\tcustomFetch: (request: Request) => Promise<Response>;\n}\n\nexport function createQueueSender(senderOptions: QueueSenderOptions): QueueSender {\n\tasync function send(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions: QueueSendWaitOptions,\n\t): Promise<QueueSendResult>;\n\tasync function send(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendNoWaitOptions,\n\t): Promise<void>;\n\tasync function send(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendOptions,\n\t): Promise<QueueSendResult | void> {\n\t\tconst wait = options?.wait ?? false;\n\t\tconst timeout = options?.timeout;\n\n\t\tconst result = await sendHttpRequest<\n\t\t\tprotocol.HttpQueueSendRequest,\n\t\t\tprotocol.HttpQueueSendResponse,\n\t\t\tHttpQueueSendRequestJson,\n\t\t\tHttpQueueSendResponseJson,\n\t\t\t{ body: unknown; wait?: boolean; timeout?: number; name?: string },\n\t\t\tQueueSendResult\n\t\t>({\n\t\t\turl: `http://actor/queue/${encodeURIComponent(name)}`,\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t[HEADER_ENCODING]: senderOptions.encoding,\n\t\t\t\t...(senderOptions.params !== undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t[HEADER_CONN_PARAMS]: JSON.stringify(\n\t\t\t\t\t\t\t\tsenderOptions.params,\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},\n\t\t\tbody: { body, wait, timeout },\n\t\t\tencoding: senderOptions.encoding,\n\t\t\tcustomFetch: senderOptions.customFetch,\n\t\t\tsignal: options?.signal,\n\t\t\trequestVersion: CLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\trequestVersionedDataHandler: HTTP_QUEUE_SEND_REQUEST_VERSIONED,\n\t\t\tresponseVersion: CLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\tresponseVersionedDataHandler:\n\t\t\t\tHTTP_QUEUE_SEND_RESPONSE_VERSIONED,\n\t\t\trequestZodSchema: HttpQueueSendRequestSchema,\n\t\t\tresponseZodSchema: HttpQueueSendResponseSchema,\n\t\t\trequestToJson: (value): HttpQueueSendRequestJson => ({\n\t\t\t\t...value,\n\t\t\t\tname,\n\t\t\t}),\n\t\t\trequestToBare: (value): protocol.HttpQueueSendRequest => ({\n\t\t\t\tname: value.name ?? name,\n\t\t\t\tbody: bufferToArrayBuffer(cbor.encode(value.body)),\n\t\t\t\twait: value.wait ?? false,\n\t\t\t\ttimeout: value.timeout !== undefined ? BigInt(value.timeout) : null,\n\t\t\t}),\n\t\t\tresponseFromJson: (json): QueueSendResult => {\n\t\t\t\tif (json.response === undefined) {\n\t\t\t\t\treturn { status: json.status as \"completed\" | \"timedOut\" };\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: json.status as \"completed\" | \"timedOut\",\n\t\t\t\t\tresponse: json.response,\n\t\t\t\t};\n\t\t\t},\n\t\t\tresponseFromBare: (bare): QueueSendResult => {\n\t\t\t\tif (bare.response === null || bare.response === undefined) {\n\t\t\t\t\treturn { status: bare.status as \"completed\" | \"timedOut\" };\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: bare.status as \"completed\" | \"timedOut\",\n\t\t\t\t\tresponse: cbor.decode(new Uint8Array(bare.response)),\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\n\t\tif (wait) {\n\t\t\treturn result;\n\t\t}\n\t\treturn;\n\t}\n\n\treturn {\n\t\tsend,\n\t};\n}\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 * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport type { AnyActorDefinition } from \"@/actor/definition\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport { assertUnreachable } from \"@/actor/utils\";\nimport { deconstructError } from \"@/common/utils\";\nimport {\n\tHEADER_CONN_PARAMS,\n\tHEADER_ENCODING,\n\ttype ManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\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} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype HttpActionRequest as HttpActionRequestJson,\n\tHttpActionRequestSchema,\n\ttype HttpActionResponse as HttpActionResponseJson,\n\tHttpActionResponseSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { ActorDefinitionActions } from \"./actor-common\";\nimport { type ActorConn, ActorConnRaw } from \"./actor-conn\";\nimport { checkForSchedulingError, queryActor } from \"./actor-query\";\nimport { type ClientRaw, CREATE_ACTOR_CONN_PROXY } from \"./client\";\nimport { ActorError, isSchedulingError } from \"./errors\";\nimport { logger } from \"./log\";\nimport {\n\tcreateQueueSender,\n\ttype QueueSendNoWaitOptions,\n\ttype QueueSendOptions,\n\ttype QueueSendResult,\n\ttype QueueSendWaitOptions,\n} from \"./queue\";\nimport { rawHttpFetch, rawWebSocket } from \"./raw-utils\";\nimport { sendHttpRequest } from \"./utils\";\n\n/**\n * Provides underlying functions for stateless {@link ActorHandle} for action calls.\n * Similar to ActorConnRaw but doesn't maintain a connection.\n *\n * @see {@link ActorHandle}\n */\nexport class ActorHandleRaw {\n\t#client: ClientRaw;\n\t#driver: ManagerDriver;\n\t#encoding: Encoding;\n\t#actorQuery: ActorQuery;\n\t#params: unknown;\n\t#queueSender: ReturnType<typeof createQueueSender>;\n\n\t/**\n\t * Do not call this directly.\n\t *\n\t * Creates an instance of ActorHandleRaw.\n\t *\n\t * @protected\n\t */\n\tpublic constructor(\n\t\tclient: any,\n\t\tdriver: ManagerDriver,\n\t\tparams: unknown,\n\t\tencoding: Encoding,\n\t\tactorQuery: ActorQuery,\n\t) {\n\t\tthis.#client = client;\n\t\tthis.#driver = driver;\n\t\tthis.#encoding = encoding;\n\t\tthis.#actorQuery = actorQuery;\n\t\tthis.#params = params;\n\t\tthis.#queueSender = createQueueSender({\n\t\t\tencoding: this.#encoding,\n\t\t\tparams: this.#params,\n\t\t\tcustomFetch: async (request: Request) => {\n\t\t\t\tconst { actorId } = await queryActor(\n\t\t\t\t\tundefined,\n\t\t\t\t\tthis.#actorQuery,\n\t\t\t\t\tthis.#driver,\n\t\t\t\t);\n\t\t\t\treturn this.#driver.sendRequest(actorId, request);\n\t\t\t},\n\t\t});\n\t}\n\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions: QueueSendWaitOptions,\n\t): Promise<QueueSendResult>;\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendNoWaitOptions,\n\t): Promise<void>;\n\tsend(\n\t\tname: string,\n\t\tbody: unknown,\n\t\toptions?: QueueSendOptions,\n\t): Promise<QueueSendResult | void> {\n\t\treturn this.#queueSender.send(name, body, options as any);\n\t}\n\n\t/**\n\t * Call a raw action. This method sends an HTTP request to invoke the named action.\n\t *\n\t * @see {@link ActorHandle}\n\t * @template Args - The type of arguments to pass to the action function.\n\t * @template Response - The type of the response returned by the action function.\n\t */\n\tasync action<\n\t\tArgs extends Array<unknown> = unknown[],\n\t\tResponse = unknown,\n\t>(opts: {\n\t\tname: string;\n\t\targs: Args;\n\t\tsignal?: AbortSignal;\n\t}): Promise<Response> {\n\t\t// Track actorId for scheduling error lookups\n\t\tlet actorId: string | undefined;\n\n\t\ttry {\n\t\t\t// Get the actor ID\n\t\t\tconst result = await queryActor(\n\t\t\t\tundefined,\n\t\t\t\tthis.#actorQuery,\n\t\t\t\tthis.#driver,\n\t\t\t);\n\t\t\tactorId = result.actorId;\n\t\t\tlogger().debug({ msg: \"found actor for action\", actorId });\n\t\t\tinvariant(actorId, \"Missing actor ID\");\n\n\t\t\t// Invoke the action\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"handling action\",\n\t\t\t\tname: opts.name,\n\t\t\t\tencoding: this.#encoding,\n\t\t\t});\n\t\t\tconst responseData = await sendHttpRequest<\n\t\t\t\tprotocol.HttpActionRequest, // Bare type\n\t\t\t\tprotocol.HttpActionResponse, // Bare type\n\t\t\t\tHttpActionRequestJson, // Json type\n\t\t\t\tHttpActionResponseJson, // Json type\n\t\t\t\tunknown[], // Request type (the args array)\n\t\t\t\tResponse // Response type (the output value)\n\t\t\t>({\n\t\t\t\turl: `http://actor/action/${encodeURIComponent(opts.name)}`,\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t[HEADER_ENCODING]: this.#encoding,\n\t\t\t\t\t...(this.#params !== undefined\n\t\t\t\t\t\t? { [HEADER_CONN_PARAMS]: JSON.stringify(this.#params) }\n\t\t\t\t\t\t: {}),\n\t\t\t\t},\n\t\t\t\tbody: opts.args,\n\t\t\t\tencoding: this.#encoding,\n\t\t\t\tcustomFetch: this.#driver.sendRequest.bind(\n\t\t\t\t\tthis.#driver,\n\t\t\t\t\tactorId,\n\t\t\t\t),\n\t\t\t\tsignal: opts?.signal,\n\t\t\t\trequestVersion: CLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\trequestVersionedDataHandler: HTTP_ACTION_REQUEST_VERSIONED,\n\t\t\t\tresponseVersion: CLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\tresponseVersionedDataHandler: HTTP_ACTION_RESPONSE_VERSIONED,\n\t\t\t\trequestZodSchema: HttpActionRequestSchema,\n\t\t\t\tresponseZodSchema: HttpActionResponseSchema,\n\t\t\t\t// JSON Request: args is the raw value\n\t\t\t\trequestToJson: (args): HttpActionRequestJson => ({\n\t\t\t\t\targs,\n\t\t\t\t}),\n\t\t\t\t// BARE Request: args needs to be CBOR-encoded\n\t\t\t\trequestToBare: (args): protocol.HttpActionRequest => ({\n\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(args)),\n\t\t\t\t}),\n\t\t\t\t// JSON Response: output is the raw value\n\t\t\t\tresponseFromJson: (json): Response => json.output as Response,\n\t\t\t\t// BARE Response: output is ArrayBuffer that needs CBOR-decoding\n\t\t\t\tresponseFromBare: (bare): Response =>\n\t\t\t\t\tcbor.decode(new Uint8Array(bare.output)) as Response,\n\t\t\t});\n\n\t\t\treturn responseData;\n\t\t} catch (err) {\n\t\t\t// Standardize to ClientActorError instead of the native backend error\n\t\t\tconst { group, code, message, metadata } = deconstructError(\n\t\t\t\terr,\n\t\t\t\tlogger(),\n\t\t\t\t{},\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\t// Check if this is a scheduling error and try to get more details\n\t\t\tif (actorId && isSchedulingError(group, code)) {\n\t\t\t\tconst schedulingError = await checkForSchedulingError(\n\t\t\t\t\tgroup,\n\t\t\t\t\tcode,\n\t\t\t\t\tactorId,\n\t\t\t\t\tthis.#actorQuery,\n\t\t\t\t\tthis.#driver,\n\t\t\t\t);\n\t\t\t\tif (schedulingError) {\n\t\t\t\t\tthrow schedulingError;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow new ActorError(group, code, message, metadata);\n\t\t}\n\t}\n\n\t/**\n\t * Establishes a persistent connection to the actor.\n\t *\n\t * @template AD The actor class that this connection is for.\n\t * @returns {ActorConn<AD>} A connection to the actor.\n\t */\n\tconnect(): ActorConn<AnyActorDefinition> {\n\t\tlogger().debug({\n\t\t\tmsg: \"establishing connection from handle\",\n\t\t\tquery: this.#actorQuery,\n\t\t});\n\n\t\tconst conn = new ActorConnRaw(\n\t\t\tthis.#client,\n\t\t\tthis.#driver,\n\t\t\tthis.#params,\n\t\t\tthis.#encoding,\n\t\t\tthis.#actorQuery,\n\t\t);\n\n\t\treturn this.#client[CREATE_ACTOR_CONN_PROXY](\n\t\t\tconn,\n\t\t) as ActorConn<AnyActorDefinition>;\n\t}\n\n\t/**\n\t * Fetches a resource from this actor via the /request endpoint. This is a\n\t * convenience wrapper around the raw HTTP API.\n\t */\n\tfetch(input: string | URL | Request, init?: RequestInit) {\n\t\treturn rawHttpFetch(\n\t\t\tthis.#driver,\n\t\t\tthis.#actorQuery,\n\t\t\tthis.#params,\n\t\t\tinput,\n\t\t\tinit,\n\t\t);\n\t}\n\n\t/**\n\t * Opens a raw WebSocket connection to this actor.\n\t */\n\twebSocket(path?: string, protocols?: string | string[]) {\n\t\treturn rawWebSocket(\n\t\t\tthis.#driver,\n\t\t\tthis.#actorQuery,\n\t\t\tthis.#params,\n\t\t\tpath,\n\t\t\tprotocols,\n\t\t);\n\t}\n\n\t/**\n\t * Resolves the actor to get its unique actor ID.\n\t */\n\tasync resolve(): Promise<string> {\n\t\tif (\"getForKey\" in this.#actorQuery) {\n\t\t\tconst name = this.#actorQuery.getForKey.name;\n\n\t\t\t// Query the actor to get the id\n\t\t\tconst { actorId } = await queryActor(\n\t\t\t\tundefined,\n\t\t\t\tthis.#actorQuery,\n\t\t\t\tthis.#driver,\n\t\t\t);\n\n\t\t\tthis.#actorQuery = { getForId: { actorId, name } };\n\n\t\t\treturn actorId;\n\t\t} else if (\"getOrCreateForKey\" in this.#actorQuery) {\n\t\t\tconst name = this.#actorQuery.getOrCreateForKey.name;\n\n\t\t\t// Query the actor to get or create and get the id\n\t\t\tconst { actorId } = await queryActor(\n\t\t\t\tundefined,\n\t\t\t\tthis.#actorQuery,\n\t\t\t\tthis.#driver,\n\t\t\t);\n\n\t\t\tthis.#actorQuery = { getForId: { actorId, name } };\n\n\t\t\treturn actorId;\n\t\t} else if (\"getForId\" in this.#actorQuery) {\n\t\t\t// Skip since it's already resolved\n\t\t\treturn this.#actorQuery.getForId.actorId;\n\t\t} else if (\"create\" in this.#actorQuery) {\n\t\t\t// Cannot create a handle with this query\n\t\t\tinvariant(false, \"actorQuery cannot be create\");\n\t\t} else {\n\t\t\tassertUnreachable(this.#actorQuery);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the raw URL for routing traffic to the actor.\n\t */\n\tasync getGatewayUrl(): Promise<string> {\n\t\tconst { actorId } = await queryActor(\n\t\t\tundefined,\n\t\t\tthis.#actorQuery,\n\t\t\tthis.#driver,\n\t\t);\n\t\treturn await this.#driver.buildGatewayUrl(actorId);\n\t}\n}\n\n/**\n * Stateless handle to a actor. Allows calling actor's remote procedure calls with inferred types\n * without establishing a persistent connection.\n *\n * @example\n * ```\n * const room = client.get<ChatRoom>(...etc...);\n * // This calls the action named `sendMessage` on the `ChatRoom` actor without a connection.\n * await room.sendMessage('Hello, world!');\n * ```\n *\n * Private methods (e.g. those starting with `_`) are automatically excluded.\n *\n * @template AD The actor class that this handle is for.\n * @see {@link ActorHandleRaw}\n */\nexport type ActorHandle<AD extends AnyActorDefinition> = Omit<\n\tActorHandleRaw,\n\t\"connect\"\n> & {\n\t// Add typed version of ActorConn (instead of using AnyActorDefinition)\n\tconnect(): ActorConn<AD>;\n\t// Resolve method returns the actor ID\n\tresolve(): Promise<string>;\n} & ActorDefinitionActions<AD>;\n","import invariant from \"invariant\";\nimport { PATH_WEBSOCKET_PREFIX } from \"@/common/actor-router-consts\";\nimport { deconstructError } from \"@/common/utils\";\nimport { HEADER_CONN_PARAMS, type ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\nimport { queryActor } from \"./actor-query\";\nimport { ActorError } from \"./errors\";\nimport { logger } from \"./log\";\n\n/**\n * Shared implementation for raw HTTP fetch requests\n */\nexport async function rawHttpFetch(\n\tdriver: ManagerDriver,\n\tactorQuery: ActorQuery,\n\tparams: unknown,\n\tinput: string | URL | Request,\n\tinit?: RequestInit,\n): Promise<Response> {\n\t// Extract path and merge init options\n\tlet path: string;\n\tlet mergedInit: RequestInit = init || {};\n\n\tif (typeof input === \"string\") {\n\t\tpath = input;\n\t} else if (input instanceof URL) {\n\t\tpath = input.pathname + input.search;\n\t} else if (input instanceof Request) {\n\t\t// Extract path from Request URL\n\t\tconst url = new URL(input.url);\n\t\tpath = url.pathname + url.search;\n\t\t// Merge Request properties with init\n\t\tconst requestHeaders = new Headers(input.headers);\n\t\tconst initHeaders = new Headers(init?.headers || {});\n\n\t\t// Merge headers - init headers override request headers\n\t\tconst mergedHeaders = new Headers(requestHeaders);\n\t\tinitHeaders.forEach((value, key) => {\n\t\t\tmergedHeaders.set(key, value);\n\t\t});\n\n\t\tmergedInit = {\n\t\t\tmethod: input.method,\n\t\t\tbody: input.body,\n\t\t\tmode: input.mode,\n\t\t\tcredentials: input.credentials,\n\t\t\tredirect: input.redirect,\n\t\t\treferrer: input.referrer,\n\t\t\treferrerPolicy: input.referrerPolicy,\n\t\t\tintegrity: input.integrity,\n\t\t\tkeepalive: input.keepalive,\n\t\t\tsignal: input.signal,\n\t\t\t...mergedInit, // init overrides Request properties\n\t\t\theaders: mergedHeaders, // headers must be set after spread to ensure proper merge\n\t\t};\n\t\t// Add duplex if body is present\n\t\tif (mergedInit.body) {\n\t\t\t(mergedInit as any).duplex = \"half\";\n\t\t}\n\t} else {\n\t\tthrow new TypeError(\"Invalid input type for fetch\");\n\t}\n\n\ttry {\n\t\t// Get the actor ID\n\t\tconst { actorId } = await queryActor(undefined, actorQuery, driver);\n\t\tlogger().debug({ msg: \"found actor for raw http\", actorId });\n\t\tinvariant(actorId, \"Missing actor ID\");\n\n\t\t// Build the URL with normalized path\n\t\tconst normalizedPath = path.startsWith(\"/\") ? path.slice(1) : path;\n\t\tconst url = new URL(`http://actor/request/${normalizedPath}`);\n\n\t\t// Forward conn params if provided\n\t\tconst proxyRequestHeaders = new Headers(mergedInit.headers);\n\t\tif (params) {\n\t\t\tproxyRequestHeaders.set(HEADER_CONN_PARAMS, JSON.stringify(params));\n\t\t}\n\n\t\t// Forward the request to the actor\n\t\tconst proxyRequest = new Request(url, {\n\t\t\t...mergedInit,\n\t\t\theaders: proxyRequestHeaders,\n\t\t});\n\n\t\treturn driver.sendRequest(actorId, proxyRequest);\n\t} catch (err) {\n\t\t// Standardize to ClientActorError instead of the native backend error\n\t\tconst { group, code, message, metadata } = deconstructError(\n\t\t\terr,\n\t\t\tlogger(),\n\t\t\t{},\n\t\t\ttrue,\n\t\t);\n\t\tthrow new ActorError(group, code, message, metadata);\n\t}\n}\n\n/**\n * Shared implementation for raw WebSocket connections\n */\nexport async function rawWebSocket(\n\tdriver: ManagerDriver,\n\tactorQuery: ActorQuery,\n\tparams: unknown,\n\tpath?: string,\n\t// TODO: Supportp rotocols\n\tprotocols?: string | string[],\n): Promise<any> {\n\t// TODO: Do we need encoding in rawWebSocket?\n\tconst encoding = \"bare\";\n\n\t// Get the actor ID\n\tconst { actorId } = await queryActor(undefined, actorQuery, driver);\n\tlogger().debug({ msg: \"found actor for action\", actorId });\n\tinvariant(actorId, \"Missing actor ID\");\n\n\t// Parse path and query parameters\n\tlet pathPortion = \"\";\n\tlet queryPortion = \"\";\n\tif (path) {\n\t\tconst queryIndex = path.indexOf(\"?\");\n\t\tif (queryIndex !== -1) {\n\t\t\tpathPortion = path.substring(0, queryIndex);\n\t\t\tqueryPortion = path.substring(queryIndex); // includes the '?'\n\t\t} else {\n\t\t\tpathPortion = path;\n\t\t}\n\t\t// Remove leading slash if present\n\t\tif (pathPortion.startsWith(\"/\")) {\n\t\t\tpathPortion = pathPortion.slice(1);\n\t\t}\n\t}\n\n\tconst fullPath = `${PATH_WEBSOCKET_PREFIX}${pathPortion}${queryPortion}`;\n\n\tlogger().debug({\n\t\tmsg: \"opening websocket\",\n\t\tactorId,\n\t\tencoding,\n\t\tpath: fullPath,\n\t});\n\n\t// Open WebSocket\n\tconst ws = await driver.openWebSocket(fullPath, actorId, encoding, params);\n\n\t// Node & browser WebSocket types are incompatible\n\treturn ws as any;\n}\n","import type { AnyActorDefinition } from \"@/actor/definition\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport type { ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\nimport type { Registry } from \"@/registry\";\nimport type { ActorActionFunction } from \"./actor-common\";\nimport {\n\ttype ActorConn,\n\ttype ActorConnRaw,\n\tCONNECT_SYMBOL,\n} from \"./actor-conn\";\nimport { type ActorHandle, ActorHandleRaw } from \"./actor-handle\";\nimport { queryActor } from \"./actor-query\";\nimport type { ClientConfig } from \"./config\";\nimport { logger } from \"./log\";\n\nexport type { ClientConfig, ClientConfigInput } from \"./config\";\n\n/** Extract the actor registry from the registry definition. */\nexport type ExtractActorsFromRegistry<A extends Registry<any>> =\n\tA extends Registry<infer Actors> ? Actors : never;\n\n/** Extract the registry definition from the client. */\nexport type ExtractRegistryFromClient<C extends Client<Registry<{}>>> =\n\tC extends Client<infer A> ? A : never;\n\n/**\n * Represents a actor accessor that provides methods to interact with a specific actor.\n */\nexport interface ActorAccessor<AD extends AnyActorDefinition> {\n\t/**\n\t * Gets a stateless handle to a actor by its key, but does not create the actor if it doesn't exist.\n\t * The actor name is automatically injected from the property accessor.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {GetWithIdOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tget(key?: string | string[], opts?: GetWithIdOptions): ActorHandle<AD>;\n\n\t/**\n\t * Gets a stateless handle to a actor by its key, creating it if necessary.\n\t * The actor name is automatically injected from the property accessor.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {GetOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tgetOrCreate(\n\t\tkey?: string | string[],\n\t\topts?: GetOrCreateOptions,\n\t): ActorHandle<AD>;\n\n\t/**\n\t * Gets a stateless handle to a actor by its ID.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string} actorId - The ID of the actor.\n\t * @param {GetWithIdOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tgetForId(actorId: string, opts?: GetWithIdOptions): ActorHandle<AD>;\n\n\t/**\n\t * Creates a new actor with the name automatically injected from the property accessor,\n\t * and returns a stateless handle to it with the actor ID resolved.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string | string[]} key - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {CreateOptions} [opts] - Options for creating the actor (excluding name and key).\n\t * @returns {Promise<ActorHandle<AD>>} - A promise that resolves to a handle to the actor.\n\t */\n\tcreate(\n\t\tkey?: string | string[],\n\t\topts?: CreateOptions,\n\t): Promise<ActorHandle<AD>>;\n}\n\n/**\n * Options for querying actors.\n * @typedef {Object} QueryOptions\n * @property {unknown} [parameters] - Parameters to pass to the connection.\n */\nexport interface QueryOptions {\n\t/** Parameters to pass to the connection. */\n\tparams?: unknown;\n\t/** Signal to abort the request. */\n\tsignal?: AbortSignal;\n}\n\n/**\n * Options for getting a actor by ID.\n * @typedef {QueryOptions} GetWithIdOptions\n */\nexport interface GetWithIdOptions extends QueryOptions {}\n\n/**\n * Options for getting a actor.\n * @typedef {QueryOptions} GetOptions\n */\nexport interface GetOptions extends QueryOptions {}\n\n/**\n * Options for getting or creating a actor.\n * @typedef {QueryOptions} GetOrCreateOptions\n * @property {string} [createInRegion] - Region to create the actor in if it doesn't exist.\n */\nexport interface GetOrCreateOptions extends QueryOptions {\n\t/** Region to create the actor in if it doesn't exist. */\n\tcreateInRegion?: string;\n\t/** Input data to pass to the actor. */\n\tcreateWithInput?: unknown;\n}\n\n/**\n * Options for creating a actor.\n * @typedef {QueryOptions} CreateOptions\n * @property {string} [region] - The region to create the actor in.\n */\nexport interface CreateOptions extends QueryOptions {\n\t/** The region to create the actor in. */\n\tregion?: string;\n\t/** Input data to pass to the actor. */\n\tinput?: unknown;\n}\n\n/**\n * Represents a region to connect to.\n * @typedef {Object} Region\n * @property {string} id - The region ID.\n * @property {string} name - The region name.\n * @see {@link https://rivet.dev/docs/edge|Edge Networking}\n * @see {@link https://rivet.dev/docs/regions|Available Regions}\n */\nexport interface Region {\n\t/**\n\t * The region slug.\n\t */\n\tid: string;\n\n\t/**\n\t * The human-friendly region name.\n\t */\n\tname: string;\n}\n\nexport const ACTOR_CONNS_SYMBOL = Symbol(\"actorConns\");\nexport const CREATE_ACTOR_CONN_PROXY = Symbol(\"createActorConnProxy\");\n\n/**\n * Client for managing & connecting to actors.\n *\n * @template A The actors map type that defines the available actors.\n * @see {@link https://rivet.dev/docs/manage|Create & Manage Actors}\n */\nexport class ClientRaw {\n\t#disposed = false;\n\n\t[ACTOR_CONNS_SYMBOL] = new Set<ActorConnRaw>();\n\n\t#driver: ManagerDriver;\n\t#encodingKind: Encoding;\n\n\t/**\n\t * Creates an instance of Client.\n\t */\n\tpublic constructor(driver: ManagerDriver, encoding: Encoding | undefined) {\n\t\tthis.#driver = driver;\n\n\t\tthis.#encodingKind = encoding ?? \"bare\";\n\t}\n\n\t/**\n\t * Gets a stateless handle to a actor by its ID.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string} name - The name of the actor.\n\t * @param {string} actorId - The ID of the actor.\n\t * @param {GetWithIdOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tgetForId<AD extends AnyActorDefinition>(\n\t\tname: string,\n\t\tactorId: string,\n\t\topts?: GetWithIdOptions,\n\t): ActorHandle<AD> {\n\t\tlogger().debug({\n\t\t\tmsg: \"get handle to actor with id\",\n\t\t\tname,\n\t\t\tactorId,\n\t\t\tparams: opts?.params,\n\t\t});\n\n\t\tconst actorQuery: ActorQuery = {\n\t\t\tgetForId: {\n\t\t\t\tname,\n\t\t\t\tactorId,\n\t\t\t},\n\t\t};\n\n\t\tconst handle = this.#createHandle(opts?.params, actorQuery);\n\t\treturn createActorProxy(handle) as ActorHandle<AD>;\n\t}\n\n\t/**\n\t * Gets a stateless handle to a actor by its key, but does not create the actor if it doesn't exist.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string} name - The name of the actor.\n\t * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {GetWithIdOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tget<AD extends AnyActorDefinition>(\n\t\tname: string,\n\t\tkey?: string | string[],\n\t\topts?: GetWithIdOptions,\n\t): ActorHandle<AD> {\n\t\t// Convert string to array of strings\n\t\tconst keyArray: string[] = typeof key === \"string\" ? [key] : key || [];\n\n\t\tlogger().debug({\n\t\t\tmsg: \"get handle to actor\",\n\t\t\tname,\n\t\t\tkey: keyArray,\n\t\t\tparameters: opts?.params,\n\t\t});\n\n\t\tconst actorQuery: ActorQuery = {\n\t\t\tgetForKey: {\n\t\t\t\tname,\n\t\t\t\tkey: keyArray,\n\t\t\t},\n\t\t};\n\n\t\tconst handle = this.#createHandle(opts?.params, actorQuery);\n\t\treturn createActorProxy(handle) as ActorHandle<AD>;\n\t}\n\n\t/**\n\t * Gets a stateless handle to a actor by its key, creating it if necessary.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string} name - The name of the actor.\n\t * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {GetOptions} [opts] - Options for getting the actor.\n\t * @returns {ActorHandle<AD>} - A handle to the actor.\n\t */\n\tgetOrCreate<AD extends AnyActorDefinition>(\n\t\tname: string,\n\t\tkey?: string | string[],\n\t\topts?: GetOrCreateOptions,\n\t): ActorHandle<AD> {\n\t\t// Convert string to array of strings\n\t\tconst keyArray: string[] = typeof key === \"string\" ? [key] : key || [];\n\n\t\tlogger().debug({\n\t\t\tmsg: \"get or create handle to actor\",\n\t\t\tname,\n\t\t\tkey: keyArray,\n\t\t\tparameters: opts?.params,\n\t\t\tcreateInRegion: opts?.createInRegion,\n\t\t});\n\n\t\tconst actorQuery: ActorQuery = {\n\t\t\tgetOrCreateForKey: {\n\t\t\t\tname,\n\t\t\t\tkey: keyArray,\n\t\t\t\tinput: opts?.createWithInput,\n\t\t\t\tregion: opts?.createInRegion,\n\t\t\t},\n\t\t};\n\n\t\tconst handle = this.#createHandle(opts?.params, actorQuery);\n\t\treturn createActorProxy(handle) as ActorHandle<AD>;\n\t}\n\n\t/**\n\t * Creates a new actor with the provided key and returns a stateless handle to it.\n\t * Resolves the actor ID and returns a handle with getForId query.\n\t *\n\t * @template AD The actor class that this handle is for.\n\t * @param {string} name - The name of the actor.\n\t * @param {string | string[]} key - The key to identify the actor. Can be a single string or an array of strings.\n\t * @param {CreateOptions} [opts] - Options for creating the actor (excluding name and key).\n\t * @returns {Promise<ActorHandle<AD>>} - A promise that resolves to a handle to the actor.\n\t */\n\tasync create<AD extends AnyActorDefinition>(\n\t\tname: string,\n\t\tkey?: string | string[],\n\t\topts?: CreateOptions,\n\t): Promise<ActorHandle<AD>> {\n\t\t// Convert string to array of strings\n\t\tconst keyArray: string[] = typeof key === \"string\" ? [key] : key || [];\n\n\t\tconst createQuery = {\n\t\t\tcreate: {\n\t\t\t\t...opts,\n\t\t\t\t// Do these last to override `opts`\n\t\t\t\tname,\n\t\t\t\tkey: keyArray,\n\t\t\t},\n\t\t} satisfies ActorQuery;\n\n\t\tlogger().debug({\n\t\t\tmsg: \"create actor handle\",\n\t\t\tname,\n\t\t\tkey: keyArray,\n\t\t\tparameters: opts?.params,\n\t\t\tcreate: createQuery.create,\n\t\t});\n\n\t\t// Create the actor\n\t\tconst { actorId } = await queryActor(\n\t\t\tundefined,\n\t\t\tcreateQuery,\n\t\t\tthis.#driver,\n\t\t);\n\t\tlogger().debug({\n\t\t\tmsg: \"created actor with ID\",\n\t\t\tname,\n\t\t\tkey: keyArray,\n\t\t\tactorId,\n\t\t});\n\n\t\t// Create handle with actor ID\n\t\tconst getForIdQuery = {\n\t\t\tgetForId: {\n\t\t\t\tname,\n\t\t\t\tactorId,\n\t\t\t},\n\t\t} satisfies ActorQuery;\n\t\tconst handle = this.#createHandle(opts?.params, getForIdQuery);\n\n\t\tconst proxy = createActorProxy(handle) as ActorHandle<AD>;\n\n\t\treturn proxy;\n\t}\n\n\t#createHandle(params: unknown, actorQuery: ActorQuery): ActorHandleRaw {\n\t\treturn new ActorHandleRaw(\n\t\t\tthis,\n\t\t\tthis.#driver,\n\t\t\tparams,\n\t\t\tthis.#encodingKind,\n\t\t\tactorQuery,\n\t\t);\n\t}\n\n\t[CREATE_ACTOR_CONN_PROXY]<AD extends AnyActorDefinition>(\n\t\tconn: ActorConnRaw,\n\t): ActorConn<AD> {\n\t\t// Save to connection list\n\t\tthis[ACTOR_CONNS_SYMBOL].add(conn);\n\n\t\t// Start connection\n\t\tconn[CONNECT_SYMBOL]();\n\n\t\treturn createActorProxy(conn) as ActorConn<AD>;\n\t}\n\n\t/**\n\t * Disconnects from all actors.\n\t *\n\t * @returns {Promise<void>} A promise that resolves when all connections are closed.\n\t */\n\tasync dispose(): Promise<void> {\n\t\tif (this.#disposed) {\n\t\t\tlogger().warn({ msg: \"client already disconnected\" });\n\t\t\treturn;\n\t\t}\n\t\tthis.#disposed = true;\n\n\t\tlogger().debug({ msg: \"disposing client\" });\n\n\t\tconst disposePromises = [];\n\n\t\t// Dispose all connections\n\t\tfor (const conn of this[ACTOR_CONNS_SYMBOL].values()) {\n\t\t\tdisposePromises.push(conn.dispose());\n\t\t}\n\n\t\tawait Promise.all(disposePromises);\n\t}\n}\n\n/**\n * Client type with actor accessors.\n * This adds property accessors for actor names to the ClientRaw base class.\n *\n * @template A The actor registry type.\n */\nexport type Client<A extends Registry<any>> = ClientRaw & {\n\t[K in keyof ExtractActorsFromRegistry<A>]: ActorAccessor<\n\t\tExtractActorsFromRegistry<A>[K]\n\t>;\n};\n\nexport type AnyClient = Client<Registry<any>>;\n\nexport function createClientWithDriver<A extends Registry<any>>(\n\tdriver: ManagerDriver,\n\tconfig: { encoding?: Encoding } = {},\n): Client<A> {\n\tconst client = new ClientRaw(driver, config.encoding);\n\n\t// Create proxy for accessing actors by name\n\treturn new Proxy(client, {\n\t\tget: (target: ClientRaw, prop: string | symbol, receiver: unknown) => {\n\t\t\t// Get the real property if it exists\n\t\t\tif (typeof prop === \"symbol\" || prop in target) {\n\t\t\t\tconst value = Reflect.get(target, prop, receiver);\n\t\t\t\t// Preserve method binding\n\t\t\t\tif (typeof value === \"function\") {\n\t\t\t\t\treturn value.bind(target);\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\t// Handle actor accessor for string properties (actor names)\n\t\t\tif (typeof prop === \"string\") {\n\t\t\t\t// Return actor accessor object with methods\n\t\t\t\treturn {\n\t\t\t\t\t// Handle methods (stateless action)\n\t\t\t\t\tget: (\n\t\t\t\t\t\tkey?: string | string[],\n\t\t\t\t\t\topts?: GetWithIdOptions,\n\t\t\t\t\t): ActorHandle<\n\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t> => {\n\t\t\t\t\t\treturn target.get<\n\t\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t\t>(prop, key, opts);\n\t\t\t\t\t},\n\t\t\t\t\tgetOrCreate: (\n\t\t\t\t\t\tkey?: string | string[],\n\t\t\t\t\t\topts?: GetOptions,\n\t\t\t\t\t): ActorHandle<\n\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t> => {\n\t\t\t\t\t\treturn target.getOrCreate<\n\t\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t\t>(prop, key, opts);\n\t\t\t\t\t},\n\t\t\t\t\tgetForId: (\n\t\t\t\t\t\tactorId: string,\n\t\t\t\t\t\topts?: GetWithIdOptions,\n\t\t\t\t\t): ActorHandle<\n\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t> => {\n\t\t\t\t\t\treturn target.getForId<\n\t\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t\t>(prop, actorId, opts);\n\t\t\t\t\t},\n\t\t\t\t\tcreate: async (\n\t\t\t\t\t\tkey: string | string[],\n\t\t\t\t\t\topts: CreateOptions = {},\n\t\t\t\t\t): Promise<\n\t\t\t\t\t\tActorHandle<ExtractActorsFromRegistry<A>[typeof prop]>\n\t\t\t\t\t> => {\n\t\t\t\t\t\treturn await target.create<\n\t\t\t\t\t\t\tExtractActorsFromRegistry<A>[typeof prop]\n\t\t\t\t\t\t>(prop, key, opts);\n\t\t\t\t\t},\n\t\t\t\t} as ActorAccessor<ExtractActorsFromRegistry<A>[typeof prop]>;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t}) as Client<A>;\n}\n\n/**\n * Creates a proxy for a actor that enables calling actions without explicitly using `.action`.\n **/\nfunction createActorProxy<AD extends AnyActorDefinition>(\n\thandle: ActorHandleRaw | ActorConnRaw,\n): ActorHandle<AD> | ActorConn<AD> {\n\t// Stores returned action functions for faster calls\n\tconst methodCache = new Map<string, ActorActionFunction>();\n\treturn new Proxy(handle, {\n\t\tget(target: ActorHandleRaw, prop: string | symbol, receiver: unknown) {\n\t\t\t// Handle built-in Symbol properties\n\t\t\tif (typeof prop === \"symbol\") {\n\t\t\t\treturn Reflect.get(target, prop, receiver);\n\t\t\t}\n\n\t\t\t// Handle built-in Promise methods and existing properties\n\t\t\tif (prop === \"constructor\" || prop in target) {\n\t\t\t\tconst value = Reflect.get(target, prop, target);\n\t\t\t\t// Preserve method binding\n\t\t\t\tif (typeof value === \"function\") {\n\t\t\t\t\treturn value.bind(target);\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\t// Create action function that preserves 'this' context\n\t\t\tif (typeof prop === \"string\") {\n\t\t\t\t// If JS is attempting to calling this as a promise, ignore it\n\t\t\t\tif (prop === \"then\") return undefined;\n\n\t\t\t\tlet method = methodCache.get(prop);\n\t\t\t\tif (!method) {\n\t\t\t\t\tmethod = (...args: unknown[]) =>\n\t\t\t\t\t\ttarget.action({ name: prop, args });\n\t\t\t\t\tmethodCache.set(prop, method);\n\t\t\t\t}\n\t\t\t\treturn method;\n\t\t\t}\n\t\t},\n\n\t\t// Support for 'in' operator\n\t\thas(target: ActorHandleRaw, prop: string | symbol) {\n\t\t\t// All string properties are potentially action functions.\n\t\t\tif (typeof prop === \"string\") return true;\n\t\t\t// For symbols, defer to the target's own has behavior\n\t\t\treturn Reflect.has(target, prop);\n\t\t},\n\n\t\t// Support instanceof checks\n\t\tgetPrototypeOf(target: ActorHandleRaw) {\n\t\t\treturn Reflect.getPrototypeOf(target);\n\t\t},\n\n\t\t// Prevent property enumeration of non-existent action methods\n\t\townKeys(target: ActorHandleRaw) {\n\t\t\treturn Reflect.ownKeys(target);\n\t\t},\n\n\t\t// Support proper property descriptors\n\t\tgetOwnPropertyDescriptor(\n\t\t\ttarget: ActorHandleRaw,\n\t\t\tprop: string | symbol,\n\t\t) {\n\t\t\tconst targetDescriptor = Reflect.getOwnPropertyDescriptor(\n\t\t\t\ttarget,\n\t\t\t\tprop,\n\t\t\t);\n\t\t\tif (targetDescriptor) {\n\t\t\t\treturn targetDescriptor;\n\t\t\t}\n\t\t\tif (typeof prop === \"string\") {\n\t\t\t\t// Make action methods appear non-enumerable\n\t\t\t\treturn {\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\twritable: false,\n\t\t\t\t\tvalue: (...args: unknown[]) =>\n\t\t\t\t\t\ttarget.action({ name: prop, args }),\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t}) as ActorHandle<AD> | ActorConn<AD>;\n}\n","import z from \"zod/v4\";\nimport { EncodingSchema } from \"@/actor/protocol/serde\";\nimport { type GetUpgradeWebSocket } from \"@/utils\";\nimport {\n\tgetRivetEngine,\n\tgetRivetEndpoint,\n\tgetRivetToken,\n\tgetRivetNamespace,\n\tgetRivetRunner,\n} from \"@/utils/env-vars\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { tryParseEndpoint } from \"@/utils/endpoint-parser\";\n\n/**\n * Gets the default endpoint for the client.\n *\n * In browser: uses current origin + /api/rivet\n *\n * Server-side: uses 127.0.0.1:6420\n */\nfunction getDefaultEndpoint(): string {\n\tif (typeof window !== \"undefined\" && window.location?.origin) {\n\t\treturn `${window.location.origin}/api/rivet`;\n\t}\n\treturn \"http://127.0.0.1:6420\";\n}\n\n/**\n * Base client config schema without transforms so it can be merged in to other schemas.\n */\nexport const ClientConfigSchemaBase = z.object({\n\t/**\n\t * Endpoint to connect to for Rivet Engine or RivetKit manager API.\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 * Can also be set via RIVET_ENDPOINT environment variables.\n\t *\n\t * Defaults to current origin + /api/rivet in browser, or 127.0.0.1:6420 server-side.\n\t */\n\tendpoint: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform(\n\t\t\t(val) =>\n\t\t\t\tval ??\n\t\t\t\tgetRivetEngine() ??\n\t\t\t\tgetRivetEndpoint() ??\n\t\t\t\tgetDefaultEndpoint(),\n\t\t),\n\n\t/** Token to use to authenticate with the API. */\n\ttoken: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetToken()),\n\n\t/** Namespace to connect to. */\n\tnamespace: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetNamespace()),\n\n\t/** Name of the runner. This is used to group together runners in to different pools. */\n\trunnerName: z.string().default(() => getRivetRunner() ?? \"default\"),\n\n\tencoding: EncodingSchema.default(\"bare\"),\n\n\theaders: z\n\t\t.record(z.string(), z.string())\n\t\t.optional()\n\t\t.default(() => ({})),\n\n\t// See RunConfig.getUpgradeWebSocket\n\t//\n\t// This is required in the client config in order to support\n\t// `proxyWebSocket`\n\tgetUpgradeWebSocket: z.custom<GetUpgradeWebSocket>().optional(),\n\n\t/** Whether to automatically perform health checks when the client is created. */\n\tdisableMetadataLookup: z.boolean().optional().default(false),\n\n\t/** Whether to enable RivetKit Devtools integration. */\n\tdevtools: z\n\t\t.boolean()\n\t\t.default(\n\t\t\t() =>\n\t\t\t\ttypeof window !== \"undefined\" &&\n\t\t\t\t(window?.location?.hostname === \"127.0.0.1\" ||\n\t\t\t\t\twindow.location?.hostname === \"localhost\"),\n\t\t),\n});\n\nexport const ClientConfigSchema = ClientConfigSchemaBase.transform(\n\t(config, ctx) => transformClientConfig(config, ctx),\n);\n\nexport type ClientConfig = z.infer<typeof ClientConfigSchema>;\n\nexport type ClientConfigInput = z.input<typeof ClientConfigSchema>;\n\nexport function transformClientConfig(\n\tconfig: z.infer<typeof ClientConfigSchemaBase>,\n\tctx: z.RefinementCtx,\n) {\n\tconst parsedEndpoint = tryParseEndpoint(ctx, {\n\t\tendpoint: config.endpoint,\n\t\tpath: [\"endpoint\"],\n\t\tnamespace: config.namespace,\n\t\ttoken: config.token,\n\t});\n\n\treturn {\n\t\t...config,\n\t\tendpoint: parsedEndpoint?.endpoint,\n\t\tnamespace: parsedEndpoint?.namespace ?? config.namespace ?? \"default\",\n\t\ttoken: parsedEndpoint?.token ?? config.token,\n\t};\n}\n\n/**\n * Converts a base config in to a client config.\n *\n * The base config does not include all of the properties of the client config,\n * so this converts the subset of properties in to the client config.\n *\n * Note: We construct the object directly rather than using ClientConfigSchema.parse()\n * because RegistryConfig has already transformed the endpoint, namespace, and token.\n * Re-parsing would attempt to extract namespace/token from the endpoint URL again.\n */\nexport function convertRegistryConfigToClientConfig(\n\tconfig: RegistryConfig,\n): ClientConfig {\n\treturn {\n\t\tendpoint: config.endpoint,\n\t\ttoken: config.token,\n\t\tnamespace: config.namespace,\n\t\trunnerName: config.runner.runnerName,\n\t\theaders: config.headers,\n\t\tencoding: \"bare\",\n\t\tgetUpgradeWebSocket: undefined,\n\t\t// We don't need health checks for internal clients\n\t\tdisableMetadataLookup: true,\n\t\tdevtools:\n\t\t\ttypeof window !== \"undefined\" &&\n\t\t\t(window?.location?.hostname === \"127.0.0.1\" ||\n\t\t\t\twindow?.location?.hostname === \"localhost\"),\n\t};\n}\n","import { injectDevtools } from \"@/devtools-loader\";\nimport type { Registry } from \"@/registry\";\nimport { RemoteManagerDriver } from \"@/remote-manager-driver/mod\";\nimport {\n\ttype Client,\n\ttype ClientConfigInput,\n\tcreateClientWithDriver,\n} from \"./client\";\nimport { ClientConfigSchema } from \"./config\";\n\nexport type { ActorDefinition, AnyActorDefinition } from \"@/actor/definition\";\nexport type { Encoding } from \"@/actor/protocol/serde\";\nexport {\n\tActorClientError,\n\tActorConnDisposed,\n\tActorError,\n\tInternalError,\n\tMalformedResponseMessage,\n\tManagerError,\n} from \"@/client/errors\";\nexport type { CreateRequest } from \"@/manager/protocol/query\";\nexport { KEYS as KV_KEYS } from \"../actor/instance/keys\";\nexport type { ActorActionFunction } from \"./actor-common\";\nexport type {\n\tActorConn,\n\tActorConnStatus,\n\tConnectionStateCallback,\n\tEventUnsubscribe,\n\tStatusChangeCallback,\n} from \"./actor-conn\";\nexport { ActorConnRaw } from \"./actor-conn\";\nexport type { ActorHandle } from \"./actor-handle\";\nexport { ActorHandleRaw } from \"./actor-handle\";\nexport type {\n\tActorAccessor,\n\tClient,\n\tClientRaw,\n\tCreateOptions,\n\tExtractActorsFromRegistry,\n\tExtractRegistryFromClient,\n\tGetOptions,\n\tGetWithIdOptions,\n\tQueryOptions,\n\tRegion,\n} from \"./client\";\n\n/**\n * Creates a client with the actor accessor proxy.\n */\nexport function createClient<A extends Registry<any>>(\n\tendpointOrConfig?: string | ClientConfigInput,\n): Client<A> {\n\t// Parse config\n\tconst configInput =\n\t\tendpointOrConfig === undefined\n\t\t\t? {}\n\t\t\t: typeof endpointOrConfig === \"string\"\n\t\t\t\t? { endpoint: endpointOrConfig }\n\t\t\t\t: endpointOrConfig;\n\tconst config = ClientConfigSchema.parse(configInput);\n\n\t// Create client\n\tconst driver = new RemoteManagerDriver(config);\n\n\tif (config.devtools) {\n\t\tinjectDevtools(config);\n\t}\n\n\treturn createClientWithDriver<A>(driver, config);\n}\n"],"mappings":"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","names":["logger","VERSION","VERSION","VERSION","VERSION","config","cbor","invariant","z","assertUnreachable","z","logger","logger","z","cbor","invariant","bare","config","readInit","writeInit","read0","write0","read1","write1","readError","writeError","readActionResponse","writeActionResponse","readEvent","writeEvent","readToClientBody","writeToClientBody","readToClient","writeToClient","encodeToClient","decodeToClient","readActionRequest","writeActionRequest","readSubscriptionRequest","writeSubscriptionRequest","readToServerBody","writeToServerBody","readToServer","writeToServer","encodeToServer","decodeToServer","readHttpActionRequest","writeHttpActionRequest","encodeHttpActionRequest","decodeHttpActionRequest","readHttpActionResponse","writeHttpActionResponse","encodeHttpActionResponse","decodeHttpActionResponse","readHttpResponseError","writeHttpResponseError","encodeHttpResponseError","decodeHttpResponseError","readHttpResolveResponse","writeHttpResolveResponse","encodeHttpResolveResponse","decodeHttpResolveResponse","bare","config","readInit","writeInit","read0","write0","read1","write1","readError","writeError","readActionResponse","writeActionResponse","readEvent","writeEvent","readToClientBody","writeToClientBody","readToClient","writeToClient","encodeToClient","decodeToClient","readActionRequest","writeActionRequest","readSubscriptionRequest","writeSubscriptionRequest","readToServerBody","writeToServerBody","readToServer","writeToServer","encodeToServer","decodeToServer","readHttpActionRequest","writeHttpActionRequest","encodeHttpActionRequest","decodeHttpActionRequest","readHttpActionResponse","writeHttpActionResponse","encodeHttpActionResponse","decodeHttpActionResponse","readHttpResponseError","writeHttpResponseError","encodeHttpResponseError","decodeHttpResponseError","readHttpResolveResponse","writeHttpResolveResponse","encodeHttpResolveResponse","decodeHttpResolveResponse","decodeToServer","encodeToServer","decodeToClient","encodeToClient","decodeHttpActionRequest","encodeHttpActionRequest","decodeHttpActionResponse","encodeHttpActionResponse","decodeHttpResponseError","encodeHttpResponseError","decodeHttpResolveResponse","encodeHttpResolveResponse","z","InternalError","ActorError","logger","invariant","contentType","bare","ActorError","logger","config","logger","z","WebSocket","logger","config","config","config","logger","WebSocket","logger","event","logger","invariant","cbor","invariant","pRetry","cbor","logger","cbor","bare","logger","pRetry","ActorError","id","InternalError","invariant","cbor","invariant","invariant","logger","invariant","ActorError","logger","invariant","bare","ActorError","assertUnreachable","logger","config","z","z","config","config"]}