rivetkit 2.0.23 → 2.0.24

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 (228) hide show
  1. package/dist/schemas/actor-persist/v2.ts +3 -3
  2. package/dist/schemas/actor-persist/v3.ts +274 -0
  3. package/dist/schemas/client-protocol/v2.ts +432 -0
  4. package/dist/schemas/file-system-driver/v2.ts +136 -0
  5. package/dist/tsup/actor/errors.cjs +2 -4
  6. package/dist/tsup/actor/errors.cjs.map +1 -1
  7. package/dist/tsup/actor/errors.d.cts +7 -10
  8. package/dist/tsup/actor/errors.d.ts +7 -10
  9. package/dist/tsup/actor/errors.js +9 -11
  10. package/dist/tsup/{actor-router-consts-B3Lu87yJ.d.cts → actor-router-consts-DzI2szci.d.cts} +5 -9
  11. package/dist/tsup/{actor-router-consts-B3Lu87yJ.d.ts → actor-router-consts-DzI2szci.d.ts} +5 -9
  12. package/dist/tsup/{chunk-3JYSUFET.cjs → chunk-3543NCSN.cjs} +45 -57
  13. package/dist/tsup/chunk-3543NCSN.cjs.map +1 -0
  14. package/dist/tsup/chunk-4SHILYS5.cjs +5694 -0
  15. package/dist/tsup/chunk-4SHILYS5.cjs.map +1 -0
  16. package/dist/tsup/{chunk-NCUALX2Q.cjs → chunk-5BZO5XPS.cjs} +3 -3
  17. package/dist/tsup/{chunk-NCUALX2Q.cjs.map → chunk-5BZO5XPS.cjs.map} +1 -1
  18. package/dist/tsup/{chunk-5PKKNNNS.js → chunk-BAIGSF64.js} +189 -187
  19. package/dist/tsup/chunk-BAIGSF64.js.map +1 -0
  20. package/dist/tsup/{chunk-HNYF4T36.cjs → chunk-CHLZBSI2.cjs} +17 -17
  21. package/dist/tsup/chunk-CHLZBSI2.cjs.map +1 -0
  22. package/dist/tsup/chunk-D3SLADUD.cjs +512 -0
  23. package/dist/tsup/chunk-D3SLADUD.cjs.map +1 -0
  24. package/dist/tsup/{chunk-KSRXX3Z4.cjs → chunk-D6762AOA.cjs} +20 -25
  25. package/dist/tsup/chunk-D6762AOA.cjs.map +1 -0
  26. package/dist/tsup/{chunk-C56XVVV4.cjs → chunk-DLK5YCTN.cjs} +187 -185
  27. package/dist/tsup/chunk-DLK5YCTN.cjs.map +1 -0
  28. package/dist/tsup/{chunk-DLYZKFRY.js → chunk-DUJQWGYD.js} +3 -7
  29. package/dist/tsup/chunk-DUJQWGYD.js.map +1 -0
  30. package/dist/tsup/{chunk-5UJQWWO3.js → chunk-EIPANQMF.js} +2 -2
  31. package/dist/tsup/{chunk-54DVMQPT.cjs → chunk-ESMTDP7G.cjs} +6 -6
  32. package/dist/tsup/chunk-ESMTDP7G.cjs.map +1 -0
  33. package/dist/tsup/{chunk-XYK5PY3B.cjs → chunk-FVAKREFB.cjs} +1900 -1737
  34. package/dist/tsup/chunk-FVAKREFB.cjs.map +1 -0
  35. package/dist/tsup/{chunk-PHNIVSG5.js → chunk-I3XT7WOF.js} +44 -56
  36. package/dist/tsup/chunk-I3XT7WOF.js.map +1 -0
  37. package/dist/tsup/{chunk-3I6ZIJVJ.js → chunk-IMDS5T42.js} +3 -3
  38. package/dist/tsup/chunk-IMDS5T42.js.map +1 -0
  39. package/dist/tsup/{chunk-SN4KWTRA.cjs → chunk-J3HZJF2P.cjs} +10 -14
  40. package/dist/tsup/chunk-J3HZJF2P.cjs.map +1 -0
  41. package/dist/tsup/{chunk-NOZSCUPQ.js → chunk-MBBJUHSP.js} +1844 -1681
  42. package/dist/tsup/chunk-MBBJUHSP.js.map +1 -0
  43. package/dist/tsup/{chunk-RVVUS4X6.js → chunk-MO5CB6MD.js} +9 -9
  44. package/dist/tsup/chunk-MO5CB6MD.js.map +1 -0
  45. package/dist/tsup/chunk-OFOTPKAH.js +512 -0
  46. package/dist/tsup/chunk-OFOTPKAH.js.map +1 -0
  47. package/dist/tsup/{chunk-G64QUEDJ.js → chunk-W6RDS6NW.js} +23 -28
  48. package/dist/tsup/chunk-W6RDS6NW.js.map +1 -0
  49. package/dist/tsup/{chunk-XSDSNHSE.cjs → chunk-YC5DUHPM.cjs} +4 -8
  50. package/dist/tsup/chunk-YC5DUHPM.cjs.map +1 -0
  51. package/dist/tsup/{chunk-YAYNBR37.js → chunk-YC7YPM2T.js} +2 -6
  52. package/dist/tsup/chunk-YC7YPM2T.js.map +1 -0
  53. package/dist/tsup/{chunk-FTQ62XTN.js → chunk-ZSPU5R4C.js} +3322 -2251
  54. package/dist/tsup/chunk-ZSPU5R4C.js.map +1 -0
  55. package/dist/tsup/client/mod.cjs +9 -9
  56. package/dist/tsup/client/mod.d.cts +5 -7
  57. package/dist/tsup/client/mod.d.ts +5 -7
  58. package/dist/tsup/client/mod.js +8 -8
  59. package/dist/tsup/common/log.cjs +3 -3
  60. package/dist/tsup/common/log.js +2 -2
  61. package/dist/tsup/common/websocket.cjs +4 -4
  62. package/dist/tsup/common/websocket.js +3 -3
  63. package/dist/tsup/{conn-B3Vhbgnd.d.ts → config-BRDYDraU.d.cts} +1119 -1047
  64. package/dist/tsup/{conn-DJWL3nGx.d.cts → config-Bo-blHpJ.d.ts} +1119 -1047
  65. package/dist/tsup/driver-helpers/mod.cjs +5 -13
  66. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  67. package/dist/tsup/driver-helpers/mod.d.cts +11 -9
  68. package/dist/tsup/driver-helpers/mod.d.ts +11 -9
  69. package/dist/tsup/driver-helpers/mod.js +14 -22
  70. package/dist/tsup/driver-test-suite/mod.cjs +474 -303
  71. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  72. package/dist/tsup/driver-test-suite/mod.d.cts +6 -9
  73. package/dist/tsup/driver-test-suite/mod.d.ts +6 -9
  74. package/dist/tsup/driver-test-suite/mod.js +1085 -914
  75. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  76. package/dist/tsup/inspector/mod.cjs +6 -6
  77. package/dist/tsup/inspector/mod.d.cts +5 -7
  78. package/dist/tsup/inspector/mod.d.ts +5 -7
  79. package/dist/tsup/inspector/mod.js +5 -5
  80. package/dist/tsup/mod.cjs +10 -16
  81. package/dist/tsup/mod.cjs.map +1 -1
  82. package/dist/tsup/mod.d.cts +23 -25
  83. package/dist/tsup/mod.d.ts +23 -25
  84. package/dist/tsup/mod.js +17 -23
  85. package/dist/tsup/test/mod.cjs +11 -11
  86. package/dist/tsup/test/mod.d.cts +4 -6
  87. package/dist/tsup/test/mod.d.ts +4 -6
  88. package/dist/tsup/test/mod.js +10 -10
  89. package/dist/tsup/utils.cjs +3 -5
  90. package/dist/tsup/utils.cjs.map +1 -1
  91. package/dist/tsup/utils.d.cts +1 -2
  92. package/dist/tsup/utils.d.ts +1 -2
  93. package/dist/tsup/utils.js +2 -4
  94. package/package.json +13 -6
  95. package/src/actor/config.ts +56 -44
  96. package/src/actor/conn/driver.ts +61 -0
  97. package/src/actor/conn/drivers/http.ts +17 -0
  98. package/src/actor/conn/drivers/raw-request.ts +24 -0
  99. package/src/actor/conn/drivers/raw-websocket.ts +65 -0
  100. package/src/actor/conn/drivers/websocket.ts +129 -0
  101. package/src/actor/conn/mod.ts +232 -0
  102. package/src/actor/conn/persisted.ts +81 -0
  103. package/src/actor/conn/state-manager.ts +196 -0
  104. package/src/actor/contexts/action.ts +23 -0
  105. package/src/actor/{context.ts → contexts/actor.ts} +19 -8
  106. package/src/actor/contexts/conn-init.ts +31 -0
  107. package/src/actor/contexts/conn.ts +48 -0
  108. package/src/actor/contexts/create-conn-state.ts +13 -0
  109. package/src/actor/contexts/on-before-connect.ts +13 -0
  110. package/src/actor/contexts/on-connect.ts +22 -0
  111. package/src/actor/contexts/request.ts +48 -0
  112. package/src/actor/contexts/websocket.ts +48 -0
  113. package/src/actor/definition.ts +3 -3
  114. package/src/actor/driver.ts +36 -5
  115. package/src/actor/errors.ts +19 -24
  116. package/src/actor/instance/connection-manager.ts +465 -0
  117. package/src/actor/instance/event-manager.ts +292 -0
  118. package/src/actor/instance/kv.ts +15 -0
  119. package/src/actor/instance/mod.ts +1107 -0
  120. package/src/actor/instance/persisted.ts +67 -0
  121. package/src/actor/instance/schedule-manager.ts +349 -0
  122. package/src/actor/instance/state-manager.ts +502 -0
  123. package/src/actor/mod.ts +13 -16
  124. package/src/actor/protocol/old.ts +131 -43
  125. package/src/actor/protocol/serde.ts +19 -4
  126. package/src/actor/router-endpoints.ts +61 -586
  127. package/src/actor/router-websocket-endpoints.ts +408 -0
  128. package/src/actor/router.ts +63 -197
  129. package/src/actor/schedule.ts +1 -1
  130. package/src/client/actor-conn.ts +183 -249
  131. package/src/client/actor-handle.ts +29 -6
  132. package/src/client/client.ts +0 -4
  133. package/src/client/config.ts +1 -4
  134. package/src/client/mod.ts +0 -1
  135. package/src/client/raw-utils.ts +3 -3
  136. package/src/client/utils.ts +85 -39
  137. package/src/common/actor-router-consts.ts +5 -12
  138. package/src/common/{inline-websocket-adapter2.ts → inline-websocket-adapter.ts} +26 -48
  139. package/src/common/log.ts +1 -1
  140. package/src/common/router.ts +28 -17
  141. package/src/common/utils.ts +2 -0
  142. package/src/driver-helpers/mod.ts +7 -10
  143. package/src/driver-helpers/utils.ts +18 -9
  144. package/src/driver-test-suite/mod.ts +26 -50
  145. package/src/driver-test-suite/test-inline-client-driver.ts +27 -51
  146. package/src/driver-test-suite/tests/actor-conn-hibernation.ts +150 -0
  147. package/src/driver-test-suite/tests/actor-conn-state.ts +1 -4
  148. package/src/driver-test-suite/tests/actor-conn.ts +5 -9
  149. package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
  150. package/src/driver-test-suite/tests/actor-driver.ts +0 -7
  151. package/src/driver-test-suite/tests/actor-handle.ts +12 -12
  152. package/src/driver-test-suite/tests/actor-metadata.ts +1 -1
  153. package/src/driver-test-suite/tests/manager-driver.ts +1 -1
  154. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +8 -8
  155. package/src/driver-test-suite/tests/raw-http-request-properties.ts +6 -5
  156. package/src/driver-test-suite/tests/raw-http.ts +5 -5
  157. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +7 -7
  158. package/src/driver-test-suite/tests/request-access.ts +4 -4
  159. package/src/driver-test-suite/utils.ts +6 -10
  160. package/src/drivers/engine/actor-driver.ts +614 -424
  161. package/src/drivers/engine/mod.ts +0 -1
  162. package/src/drivers/file-system/actor.ts +24 -12
  163. package/src/drivers/file-system/global-state.ts +427 -37
  164. package/src/drivers/file-system/manager.ts +71 -83
  165. package/src/drivers/file-system/mod.ts +3 -0
  166. package/src/drivers/file-system/utils.ts +18 -8
  167. package/src/engine-process/mod.ts +38 -38
  168. package/src/inspector/utils.ts +7 -5
  169. package/src/manager/driver.ts +11 -4
  170. package/src/manager/gateway.ts +4 -29
  171. package/src/manager/protocol/mod.ts +0 -2
  172. package/src/manager/protocol/query.ts +0 -4
  173. package/src/manager/router.ts +67 -64
  174. package/src/manager-api/actors.ts +13 -0
  175. package/src/mod.ts +1 -3
  176. package/src/registry/mod.ts +20 -20
  177. package/src/registry/serve.ts +9 -14
  178. package/src/remote-manager-driver/actor-websocket-client.ts +1 -16
  179. package/src/remote-manager-driver/api-endpoints.ts +13 -1
  180. package/src/remote-manager-driver/api-utils.ts +8 -0
  181. package/src/remote-manager-driver/metadata.ts +58 -0
  182. package/src/remote-manager-driver/mod.ts +47 -62
  183. package/src/remote-manager-driver/ws-proxy.ts +1 -1
  184. package/src/schemas/actor-persist/mod.ts +1 -1
  185. package/src/schemas/actor-persist/versioned.ts +56 -31
  186. package/src/schemas/client-protocol/mod.ts +1 -1
  187. package/src/schemas/client-protocol/versioned.ts +41 -21
  188. package/src/schemas/client-protocol-zod/mod.ts +103 -0
  189. package/src/schemas/file-system-driver/mod.ts +1 -1
  190. package/src/schemas/file-system-driver/versioned.ts +42 -19
  191. package/src/serde.ts +33 -11
  192. package/src/test/mod.ts +7 -3
  193. package/src/utils/node.ts +173 -0
  194. package/src/utils.ts +0 -4
  195. package/dist/tsup/chunk-3I6ZIJVJ.js.map +0 -1
  196. package/dist/tsup/chunk-3JYSUFET.cjs.map +0 -1
  197. package/dist/tsup/chunk-54DVMQPT.cjs.map +0 -1
  198. package/dist/tsup/chunk-5PKKNNNS.js.map +0 -1
  199. package/dist/tsup/chunk-C56XVVV4.cjs.map +0 -1
  200. package/dist/tsup/chunk-D6PCH7FR.cjs +0 -4623
  201. package/dist/tsup/chunk-D6PCH7FR.cjs.map +0 -1
  202. package/dist/tsup/chunk-DLYZKFRY.js.map +0 -1
  203. package/dist/tsup/chunk-FTQ62XTN.js.map +0 -1
  204. package/dist/tsup/chunk-G64QUEDJ.js.map +0 -1
  205. package/dist/tsup/chunk-HNYF4T36.cjs.map +0 -1
  206. package/dist/tsup/chunk-JMLTKMJ7.cjs +0 -1119
  207. package/dist/tsup/chunk-JMLTKMJ7.cjs.map +0 -1
  208. package/dist/tsup/chunk-KSRXX3Z4.cjs.map +0 -1
  209. package/dist/tsup/chunk-NOZSCUPQ.js.map +0 -1
  210. package/dist/tsup/chunk-PHNIVSG5.js.map +0 -1
  211. package/dist/tsup/chunk-RUTBXBRR.js +0 -1119
  212. package/dist/tsup/chunk-RUTBXBRR.js.map +0 -1
  213. package/dist/tsup/chunk-RVVUS4X6.js.map +0 -1
  214. package/dist/tsup/chunk-SN4KWTRA.cjs.map +0 -1
  215. package/dist/tsup/chunk-XSDSNHSE.cjs.map +0 -1
  216. package/dist/tsup/chunk-XYK5PY3B.cjs.map +0 -1
  217. package/dist/tsup/chunk-YAYNBR37.js.map +0 -1
  218. package/src/actor/action.ts +0 -178
  219. package/src/actor/conn-drivers.ts +0 -216
  220. package/src/actor/conn-socket.ts +0 -8
  221. package/src/actor/conn.ts +0 -272
  222. package/src/actor/instance.ts +0 -2336
  223. package/src/actor/persisted.ts +0 -49
  224. package/src/actor/unstable-react.ts +0 -110
  225. package/src/driver-test-suite/tests/actor-reconnect.ts +0 -170
  226. package/src/drivers/engine/kv.ts +0 -3
  227. package/src/manager/hono-websocket-adapter.ts +0 -393
  228. /package/dist/tsup/{chunk-5UJQWWO3.js.map → chunk-EIPANQMF.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/actor/instance/mod.ts","../../src/inspector/actor.ts","../../src/actor/conn/drivers/http.ts","../../src/actor/conn/mod.ts","../schemas/client-protocol/v2.ts","../../src/schemas/client-protocol/versioned.ts","../../src/schemas/client-protocol-zod/mod.ts","../../src/actor/conn/state-manager.ts","../../src/actor/conn/persisted.ts","../../src/actor/contexts/actor.ts","../../src/actor/contexts/conn.ts","../../src/actor/contexts/action.ts","../../src/actor/contexts/request.ts","../../src/actor/contexts/websocket.ts","../../src/actor/keys.ts","../../src/actor/protocol/old.ts","../../src/actor/schedule.ts","../../src/actor/instance/connection-manager.ts","../../src/actor/contexts/conn-init.ts","../../src/actor/contexts/create-conn-state.ts","../../src/actor/contexts/on-before-connect.ts","../../src/actor/contexts/on-connect.ts","../../src/actor/instance/event-manager.ts","../../src/actor/instance/persisted.ts","../../src/actor/instance/schedule-manager.ts","../../src/actor/instance/state-manager.ts","../../src/actor/definition.ts","../../src/client/errors.ts","../../src/client/actor-conn.ts","../../src/client/actor-query.ts","../../src/client/actor-handle.ts","../../src/client/raw-utils.ts","../../src/client/utils.ts","../../src/client/client.ts","../../src/remote-manager-driver/mod.ts","../../src/remote-manager-driver/api-utils.ts","../../src/remote-manager-driver/log.ts","../../src/remote-manager-driver/actor-http-client.ts","../../src/remote-manager-driver/actor-websocket-client.ts","../../src/remote-manager-driver/api-endpoints.ts","../../src/remote-manager-driver/metadata.ts","../../src/remote-manager-driver/ws-proxy.ts"],"sourcesContent":["import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport type { ActorKey } from \"@/actor/mod\";\nimport type { Client } from \"@/client/client\";\nimport { getBaseLogger, getIncludeTarget, type Logger } from \"@/common/log\";\nimport { stringifyError } from \"@/common/utils\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { ActorInspector } from \"@/inspector/actor\";\nimport type { Registry } from \"@/mod\";\nimport {\n\tACTOR_VERSIONED,\n\tCONN_VERSIONED,\n} from \"@/schemas/actor-persist/versioned\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport { TO_CLIENT_VERSIONED } from \"@/schemas/client-protocol/versioned\";\nimport { ToClientSchema } from \"@/schemas/client-protocol-zod/mod\";\nimport { EXTRA_ERROR_LOG } from \"@/utils\";\nimport type { ActorConfig, InitContext } from \"../config\";\nimport type { ConnDriver } from \"../conn/driver\";\nimport { createHttpDriver } from \"../conn/drivers/http\";\nimport {\n\tCONN_DRIVER_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\ttype Conn,\n\ttype ConnId,\n} from \"../conn/mod\";\nimport {\n\tconvertConnFromBarePersistedConn,\n\ttype PersistedConn,\n} from \"../conn/persisted\";\nimport { ActionContext } from \"../contexts/action\";\nimport { ActorContext } from \"../contexts/actor\";\nimport { RequestContext } from \"../contexts/request\";\nimport { WebSocketContext } from \"../contexts/websocket\";\nimport type { AnyDatabaseProvider, InferDatabaseClient } from \"../database\";\nimport type { ActorDriver } from \"../driver\";\nimport * as errors from \"../errors\";\nimport { serializeActorKey } from \"../keys\";\nimport { processMessage } from \"../protocol/old\";\nimport { CachedSerializer } from \"../protocol/serde\";\nimport { Schedule } from \"../schedule\";\nimport {\n\tassertUnreachable,\n\tDeadlineError,\n\tdeadline,\n\tgenerateSecureToken,\n} from \"../utils\";\nimport { ConnectionManager } from \"./connection-manager\";\nimport { EventManager } from \"./event-manager\";\nimport { KEYS } from \"./kv\";\nimport {\n\tconvertActorFromBarePersisted,\n\ttype PersistedActor,\n} from \"./persisted\";\nimport { ScheduleManager } from \"./schedule-manager\";\nimport { type SaveStateOptions, StateManager } from \"./state-manager\";\n\nexport type { SaveStateOptions };\n\nenum CanSleep {\n\tYes,\n\tNotReady,\n\tNotStarted,\n\tActiveConns,\n\tActiveHonoHttpRequests,\n}\n\n/** Actor type alias with all `any` types. Used for `extends` in classes referencing this actor. */\nexport type AnyActorInstance = ActorInstance<any, any, any, any, any, any>;\n\nexport type ExtractActorState<A extends AnyActorInstance> =\n\tA extends ActorInstance<infer State, any, any, any, any, any>\n\t\t? State\n\t\t: never;\n\nexport type ExtractActorConnParams<A extends AnyActorInstance> =\n\tA extends ActorInstance<any, infer ConnParams, any, any, any, any>\n\t\t? ConnParams\n\t\t: never;\n\nexport type ExtractActorConnState<A extends AnyActorInstance> =\n\tA extends ActorInstance<any, any, infer ConnState, any, any, any>\n\t\t? ConnState\n\t\t: never;\n\n// MARK: - Main ActorInstance Class\nexport class ActorInstance<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {\n\t// MARK: - Core Properties\n\tactorContext: ActorContext<S, CP, CS, V, I, DB>;\n\t#config: ActorConfig<S, CP, CS, V, I, DB>;\n\tdriver!: ActorDriver;\n\t#inlineClient!: Client<Registry<any>>;\n\t#actorId!: string;\n\t#name!: string;\n\t#key!: ActorKey;\n\t#region!: string;\n\n\t// MARK: - Managers\n\tconnectionManager!: ConnectionManager<S, CP, CS, V, I, DB>;\n\n\tstateManager!: StateManager<S, CP, CS, I>;\n\n\teventManager!: EventManager<S, CP, CS, V, I, DB>;\n\n\t#scheduleManager!: ScheduleManager<S, CP, CS, V, I, DB>;\n\n\t// MARK: - Logging\n\t#log!: Logger;\n\t#rLog!: Logger;\n\n\t// MARK: - Lifecycle State\n\t/**\n\t * If the core actor initiation has set up.\n\t *\n\t * Almost all actions on this actor will throw an error if false.\n\t **/\n\t#ready = false;\n\t/**\n\t * If the actor has fully started.\n\t *\n\t * The only purpose of this is to prevent sleeping until started.\n\t */\n\t#started = false;\n\t#sleepCalled = false;\n\t#destroyCalled = false;\n\t#stopCalled = false;\n\t#sleepTimeout?: NodeJS.Timeout;\n\t#abortController = new AbortController();\n\n\t// MARK: - Variables & Database\n\t#vars?: V;\n\t#db!: InferDatabaseClient<DB>;\n\n\t// MARK: - Background Tasks\n\t#backgroundPromises: Promise<void>[] = [];\n\n\t// MARK: - HTTP/WebSocket Tracking\n\t#activeHonoHttpRequests = 0;\n\n\t// MARK: - Deprecated (kept for compatibility)\n\t#schedule!: Schedule;\n\n\t// MARK: - Inspector\n\t#inspectorToken?: string;\n\t#inspector = new ActorInspector(() => {\n\t\treturn {\n\t\t\tisDbEnabled: async () => {\n\t\t\t\treturn this.#db !== undefined;\n\t\t\t},\n\t\t\tgetDb: async () => {\n\t\t\t\treturn this.db;\n\t\t\t},\n\t\t\tisStateEnabled: async () => {\n\t\t\t\treturn this.stateEnabled;\n\t\t\t},\n\t\t\tgetState: async () => {\n\t\t\t\tif (!this.stateEnabled) {\n\t\t\t\t\tthrow new errors.StateNotEnabled();\n\t\t\t\t}\n\t\t\t\treturn this.stateManager.persistRaw.state as Record<\n\t\t\t\t\tstring,\n\t\t\t\t\tany\n\t\t\t\t> as unknown;\n\t\t\t},\n\t\t\tgetRpcs: async () => {\n\t\t\t\treturn Object.keys(this.#config.actions);\n\t\t\t},\n\t\t\tgetConnections: async () => {\n\t\t\t\treturn Array.from(\n\t\t\t\t\tthis.connectionManager.connections.entries(),\n\t\t\t\t).map(([id, conn]) => {\n\t\t\t\t\tconst connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tparams: conn.params as any,\n\t\t\t\t\t\tstateEnabled: connStateManager.stateEnabled,\n\t\t\t\t\t\tstate: connStateManager.stateEnabled\n\t\t\t\t\t\t\t? connStateManager.state\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tsubscriptions: conn.subscriptions.size,\n\t\t\t\t\t\tisHibernatable: conn.isHibernatable,\n\t\t\t\t\t\t// TODO: Include underlying hibernatable metadata +\n\t\t\t\t\t\t// path + headers\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t},\n\t\t\tsetState: async (state: unknown) => {\n\t\t\t\tif (!this.stateEnabled) {\n\t\t\t\t\tthrow new errors.StateNotEnabled();\n\t\t\t\t}\n\t\t\t\tthis.stateManager.state = { ...(state as S) };\n\t\t\t\tawait this.stateManager.saveState({ immediate: true });\n\t\t\t},\n\t\t\texecuteAction: async (name, params) => {\n\t\t\t\tconst conn = await this.connectionManager.prepareAndConnectConn(\n\t\t\t\t\tcreateHttpDriver(),\n\t\t\t\t\t// TODO: This may cause issues\n\t\t\t\t\tundefined as unknown as CP,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\n\t\t\t\ttry {\n\t\t\t\t\treturn await this.executeAction(\n\t\t\t\t\t\tnew ActionContext(this, conn),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tparams || [],\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tconn.disconnect();\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t});\n\n\t// MARK: - Constructor\n\tconstructor(config: ActorConfig<S, CP, CS, V, I, DB>) {\n\t\tthis.#config = config;\n\t\tthis.actorContext = new ActorContext(this);\n\t}\n\n\t// MARK: - Public Getters\n\tget log(): Logger {\n\t\tinvariant(this.#log, \"log not configured\");\n\t\treturn this.#log;\n\t}\n\n\tget rLog(): Logger {\n\t\tinvariant(this.#rLog, \"log not configured\");\n\t\treturn this.#rLog;\n\t}\n\n\tget isStopping(): boolean {\n\t\treturn this.#stopCalled;\n\t}\n\n\tget id(): string {\n\t\treturn this.#actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#name;\n\t}\n\n\tget key(): ActorKey {\n\t\treturn this.#key;\n\t}\n\n\tget region(): string {\n\t\treturn this.#region;\n\t}\n\n\tget inlineClient(): Client<Registry<any>> {\n\t\treturn this.#inlineClient;\n\t}\n\n\tget inspector(): ActorInspector {\n\t\treturn this.#inspector;\n\t}\n\n\tget inspectorToken(): string | undefined {\n\t\treturn this.#inspectorToken;\n\t}\n\n\tget conns(): Map<ConnId, Conn<S, CP, CS, V, I, DB>> {\n\t\treturn this.connectionManager.connections;\n\t}\n\n\tget schedule(): Schedule {\n\t\treturn this.#schedule;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#abortController.signal;\n\t}\n\n\tget actions(): string[] {\n\t\treturn Object.keys(this.#config.actions);\n\t}\n\n\tget config(): ActorConfig<S, CP, CS, V, I, DB> {\n\t\treturn this.#config;\n\t}\n\n\t// MARK: - State Access\n\tget persist(): PersistedActor<S, I> {\n\t\treturn this.stateManager.persist;\n\t}\n\n\tget state(): S {\n\t\treturn this.stateManager.state;\n\t}\n\n\tset state(value: S) {\n\t\tthis.stateManager.state = value;\n\t}\n\n\tget stateEnabled(): boolean {\n\t\treturn this.stateManager.stateEnabled;\n\t}\n\n\tget connStateEnabled(): boolean {\n\t\treturn \"createConnState\" in this.#config || \"connState\" in this.#config;\n\t}\n\n\t// MARK: - Variables & Database\n\tget vars(): V {\n\t\tthis.#validateVarsEnabled();\n\t\tinvariant(this.#vars !== undefined, \"vars not enabled\");\n\t\treturn this.#vars;\n\t}\n\n\tget db(): InferDatabaseClient<DB> {\n\t\tif (!this.#db) {\n\t\t\tthrow new errors.DatabaseNotEnabled();\n\t\t}\n\t\treturn this.#db;\n\t}\n\n\t// MARK: - Initialization\n\tasync start(\n\t\tactorDriver: ActorDriver,\n\t\tinlineClient: Client<Registry<any>>,\n\t\tactorId: string,\n\t\tname: string,\n\t\tkey: ActorKey,\n\t\tregion: string,\n\t) {\n\t\t// Initialize properties\n\t\tthis.driver = actorDriver;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#actorId = actorId;\n\t\tthis.#name = name;\n\t\tthis.#key = key;\n\t\tthis.#region = region;\n\n\t\t// Initialize logging\n\t\tthis.#initializeLogging();\n\n\t\t// Initialize managers\n\t\tthis.connectionManager = new ConnectionManager(this);\n\t\tthis.stateManager = new StateManager(this, actorDriver, this.#config);\n\t\tthis.eventManager = new EventManager(this);\n\t\tthis.#scheduleManager = new ScheduleManager(\n\t\t\tthis,\n\t\t\tactorDriver,\n\t\t\tthis.#config,\n\t\t);\n\n\t\t// Legacy schedule object (for compatibility)\n\t\tthis.#schedule = new Schedule(this);\n\n\t\t// Load state\n\t\tawait this.#loadState();\n\n\t\t// Generate or load inspector token\n\t\tawait this.#initializeInspectorToken();\n\n\t\t// Initialize variables\n\t\tif (this.#varsEnabled) {\n\t\t\tawait this.#initializeVars();\n\t\t}\n\n\t\t// Call onStart lifecycle\n\t\tawait this.#callOnStart();\n\n\t\t// Setup database\n\t\tawait this.#setupDatabase();\n\n\t\t// Initialize alarms\n\t\tawait this.#scheduleManager.initializeAlarms();\n\n\t\t// Mark as ready\n\t\tthis.#ready = true;\n\n\t\t// Finish up any remaining initiation\n\t\t//\n\t\t// Do this after #ready = true since this can call any actor callbacks\n\t\t// (which require #assertReady)\n\t\tawait this.driver.onBeforeActorStart?.(this);\n\n\t\t// Mark as started\n\t\t//\n\t\t// We do this after onBeforeActorStart to prevent the actor from going\n\t\t// to sleep before finishing setup\n\t\tthis.#started = true;\n\t\tthis.#rLog.info({ msg: \"actor started\" });\n\n\t\t// Start sleep timer after setting #started since this affects the\n\t\t// timer\n\t\tthis.resetSleepTimer();\n\n\t\t// Trigger any pending alarms\n\t\tawait this.onAlarm();\n\t}\n\n\t// MARK: - Ready Check\n\tisReady(): boolean {\n\t\treturn this.#ready;\n\t}\n\n\tassertReady(allowStoppingState: boolean = false) {\n\t\tif (!this.#ready) throw new errors.InternalError(\"Actor not ready\");\n\t\tif (!allowStoppingState && this.#stopCalled)\n\t\t\tthrow new errors.InternalError(\"Actor is stopping\");\n\t}\n\n\t// MARK: - Stop\n\tasync onStop(mode: \"sleep\" | \"destroy\") {\n\t\tif (this.#stopCalled) {\n\t\t\tthis.#rLog.warn({ msg: \"already stopping actor\" });\n\t\t\treturn;\n\t\t}\n\t\tthis.#stopCalled = true;\n\t\tthis.#rLog.info({\n\t\t\tmsg: \"setting stopCalled=true\",\n\t\t\tmode,\n\t\t});\n\n\t\t// Clear sleep timeout\n\t\tif (this.#sleepTimeout) {\n\t\t\tclearTimeout(this.#sleepTimeout);\n\t\t\tthis.#sleepTimeout = undefined;\n\t\t}\n\n\t\t// Abort listeners\n\t\ttry {\n\t\t\tthis.#abortController.abort();\n\t\t} catch {}\n\n\t\t// Call onStop lifecycle\n\t\tif (mode === \"sleep\") {\n\t\t\tawait this.#callOnSleep();\n\t\t} else if (mode === \"destroy\") {\n\t\t\tawait this.#callOnDestroy();\n\t\t} else {\n\t\t\tassertUnreachable(mode);\n\t\t}\n\n\t\t// Disconnect non-hibernatable connections\n\t\tawait this.#disconnectConnections();\n\n\t\t// Wait for background tasks\n\t\tawait this.#waitBackgroundPromises(\n\t\t\tthis.#config.options.waitUntilTimeout,\n\t\t);\n\n\t\t// Clear timeouts and save state\n\t\tthis.#rLog.info({ msg: \"clearing pending save timeouts\" });\n\t\tthis.stateManager.clearPendingSaveTimeout();\n\t\tthis.#rLog.info({ msg: \"saving state immediately\" });\n\t\tawait this.stateManager.saveState({\n\t\t\timmediate: true,\n\t\t\tallowStoppingState: true,\n\t\t});\n\n\t\t// Wait for write queues\n\t\tawait this.stateManager.waitForPendingWrites();\n\t\tawait this.#scheduleManager.waitForPendingAlarmWrites();\n\t}\n\n\t// MARK: - Sleep\n\tstartSleep() {\n\t\tif (this.#stopCalled || this.#destroyCalled) {\n\t\t\tthis.#rLog.debug({\n\t\t\t\tmsg: \"cannot call startSleep if actor already stopping\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#sleepCalled) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"cannot call startSleep twice, actor already sleeping\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.#sleepCalled = true;\n\n\t\tconst sleep = this.driver.startSleep?.bind(this.driver, this.#actorId);\n\t\tinvariant(this.#sleepingSupported, \"sleeping not supported\");\n\t\tinvariant(sleep, \"no sleep on driver\");\n\n\t\tthis.#rLog.info({ msg: \"actor sleeping\" });\n\n\t\t// Start sleep on next tick so call site of startSleep can exit\n\t\tsetImmediate(() => {\n\t\t\tsleep();\n\t\t});\n\t}\n\n\t// MARK: - Destroy\n\tstartDestroy() {\n\t\tif (this.#stopCalled || this.#sleepCalled) {\n\t\t\tthis.#rLog.debug({\n\t\t\t\tmsg: \"cannot call startDestroy if actor already stopping or sleeping\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#destroyCalled) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"cannot call startDestroy twice, actor already destroying\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.#destroyCalled = true;\n\n\t\tconst destroy = this.driver.startDestroy.bind(\n\t\t\tthis.driver,\n\t\t\tthis.#actorId,\n\t\t);\n\n\t\tthis.#rLog.info({ msg: \"actor destroying\" });\n\n\t\t// Start destroy on next tick so call site of startDestroy can exit\n\t\tsetImmediate(() => {\n\t\t\tdestroy();\n\t\t});\n\t}\n\n\t// MARK: - HTTP Request Tracking\n\tbeginHonoHttpRequest() {\n\t\tthis.#activeHonoHttpRequests++;\n\t\tthis.resetSleepTimer();\n\t}\n\n\tendHonoHttpRequest() {\n\t\tthis.#activeHonoHttpRequests--;\n\t\tif (this.#activeHonoHttpRequests < 0) {\n\t\t\tthis.#activeHonoHttpRequests = 0;\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"active hono requests went below 0, this is a RivetKit bug\",\n\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t});\n\t\t}\n\t\tthis.resetSleepTimer();\n\t}\n\n\t// MARK: - Message Processing\n\tasync processMessage(\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\tconn: Conn<S, CP, CS, V, I, DB>,\n\t) {\n\t\tawait processMessage(message, this, conn, {\n\t\t\tonExecuteAction: async (ctx, name, args) => {\n\t\t\t\tthis.inspector.emitter.emit(\"eventFired\", {\n\t\t\t\t\ttype: \"action\",\n\t\t\t\t\tname,\n\t\t\t\t\targs,\n\t\t\t\t\tconnId: conn.id,\n\t\t\t\t});\n\t\t\t\treturn await this.executeAction(ctx, name, args);\n\t\t\t},\n\t\t\tonSubscribe: async (eventName, conn) => {\n\t\t\t\tthis.inspector.emitter.emit(\"eventFired\", {\n\t\t\t\t\ttype: \"subscribe\",\n\t\t\t\t\teventName,\n\t\t\t\t\tconnId: conn.id,\n\t\t\t\t});\n\t\t\t\tthis.eventManager.addSubscription(eventName, conn, false);\n\t\t\t},\n\t\t\tonUnsubscribe: async (eventName, conn) => {\n\t\t\t\tthis.inspector.emitter.emit(\"eventFired\", {\n\t\t\t\t\ttype: \"unsubscribe\",\n\t\t\t\t\teventName,\n\t\t\t\t\tconnId: conn.id,\n\t\t\t\t});\n\t\t\t\tthis.eventManager.removeSubscription(eventName, conn, false);\n\t\t\t},\n\t\t});\n\t}\n\n\t// MARK: - Action Execution\n\tasync executeAction(\n\t\tctx: ActionContext<S, CP, CS, V, I, DB>,\n\t\tactionName: string,\n\t\targs: unknown[],\n\t): Promise<unknown> {\n\t\tthis.assertReady();\n\n\t\tif (!(actionName in this.#config.actions)) {\n\t\t\tthis.#rLog.warn({ msg: \"action does not exist\", actionName });\n\t\t\tthrow new errors.ActionNotFound(actionName);\n\t\t}\n\n\t\tconst actionFunction = this.#config.actions[actionName];\n\t\tif (typeof actionFunction !== \"function\") {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"action is not a function\",\n\t\t\t\tactionName,\n\t\t\t\ttype: typeof actionFunction,\n\t\t\t});\n\t\t\tthrow new errors.ActionNotFound(actionName);\n\t\t}\n\n\t\ttry {\n\t\t\tthis.#rLog.debug({\n\t\t\t\tmsg: \"executing action\",\n\t\t\t\tactionName,\n\t\t\t\targs,\n\t\t\t});\n\n\t\t\tconst outputOrPromise = actionFunction.call(\n\t\t\t\tundefined,\n\t\t\t\tctx,\n\t\t\t\t...args,\n\t\t\t);\n\n\t\t\tlet output: unknown;\n\t\t\tif (outputOrPromise instanceof Promise) {\n\t\t\t\toutput = await deadline(\n\t\t\t\t\toutputOrPromise,\n\t\t\t\t\tthis.#config.options.actionTimeout,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\toutput = outputOrPromise;\n\t\t\t}\n\n\t\t\t// Process through onBeforeActionResponse if configured\n\t\t\tif (this.#config.onBeforeActionResponse) {\n\t\t\t\ttry {\n\t\t\t\t\tconst processedOutput = this.#config.onBeforeActionResponse(\n\t\t\t\t\t\tthis.actorContext,\n\t\t\t\t\t\tactionName,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\toutput,\n\t\t\t\t\t);\n\t\t\t\t\tif (processedOutput instanceof Promise) {\n\t\t\t\t\t\toutput = await processedOutput;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput = processedOutput;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"error in `onBeforeActionResponse`\",\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\n\t\t\treturn output;\n\t\t} catch (error) {\n\t\t\tif (error instanceof DeadlineError) {\n\t\t\t\tthrow new errors.ActionTimedOut();\n\t\t\t}\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"action error\",\n\t\t\t\tactionName,\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis.stateManager.savePersistThrottled();\n\t\t}\n\t}\n\n\t// MARK: - HTTP/WebSocket Handlers\n\tasync handleRawRequest(\n\t\tconn: Conn<S, CP, CS, V, I, DB>,\n\t\trequest: Request,\n\t): Promise<Response> {\n\t\tthis.assertReady();\n\n\t\tif (!this.#config.onRequest) {\n\t\t\tthrow new errors.RequestHandlerNotDfeined();\n\t\t}\n\n\t\ttry {\n\t\t\tconst ctx = new RequestContext(this, conn, request);\n\t\t\tconst response = await this.#config.onRequest(ctx, request);\n\t\t\tif (!response) {\n\t\t\t\tthrow new errors.InvalidRequestHandlerResponse();\n\t\t\t}\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"onRequest error\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis.stateManager.savePersistThrottled();\n\t\t}\n\t}\n\n\thandleRawWebSocket(\n\t\tconn: Conn<S, CP, CS, V, I, DB>,\n\t\twebsocket: UniversalWebSocket,\n\t\trequest?: Request,\n\t) {\n\t\t// NOTE: All code before `onWebSocket` must be synchronous in order to ensure the order of `open` events happen in the correct order.\n\n\t\tthis.assertReady();\n\n\t\tif (!this.#config.onWebSocket) {\n\t\t\tthrow new errors.InternalError(\"onWebSocket handler not defined\");\n\t\t}\n\n\t\ttry {\n\t\t\t// Reset sleep timer when handling WebSocket\n\t\t\tthis.resetSleepTimer();\n\n\t\t\t// Handle WebSocket\n\t\t\tconst ctx = new WebSocketContext(this, conn, request);\n\n\t\t\t// NOTE: This is async and will run in the background\n\t\t\tconst voidOrPromise = this.#config.onWebSocket(ctx, websocket);\n\n\t\t\t// Save changes from the WebSocket open\n\t\t\tif (voidOrPromise instanceof Promise) {\n\t\t\t\tvoidOrPromise.then(() => {\n\t\t\t\t\tthis.stateManager.savePersistThrottled();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.stateManager.savePersistThrottled();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"onWebSocket error\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// MARK: - Scheduling\n\tasync scheduleEvent(\n\t\ttimestamp: number,\n\t\taction: string,\n\t\targs: unknown[],\n\t): Promise<void> {\n\t\tawait this.#scheduleManager.scheduleEvent(timestamp, action, args);\n\t}\n\n\tasync onAlarm() {\n\t\tthis.resetSleepTimer();\n\t\tawait this.#scheduleManager.onAlarm();\n\t}\n\n\t// MARK: - Background Tasks\n\twaitUntil(promise: Promise<void>) {\n\t\tthis.assertReady();\n\n\t\tconst nonfailablePromise = promise\n\t\t\t.then(() => {\n\t\t\t\tthis.#rLog.debug({ msg: \"wait until promise complete\" });\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"wait until promise failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t});\n\t\tthis.#backgroundPromises.push(nonfailablePromise);\n\t}\n\n\t// MARK: - Private Helper Methods\n\t#initializeLogging() {\n\t\tconst logParams = {\n\t\t\tactor: this.#name,\n\t\t\tkey: serializeActorKey(this.#key),\n\t\t\tactorId: this.#actorId,\n\t\t};\n\n\t\tconst extraLogParams = this.driver.getExtraActorLogParams?.();\n\t\tif (extraLogParams) Object.assign(logParams, extraLogParams);\n\n\t\tthis.#log = getBaseLogger().child(\n\t\t\tObject.assign(\n\t\t\t\tgetIncludeTarget() ? { target: \"actor\" } : {},\n\t\t\t\tlogParams,\n\t\t\t),\n\t\t);\n\t\tthis.#rLog = getBaseLogger().child(\n\t\t\tObject.assign(\n\t\t\t\tgetIncludeTarget() ? { target: \"actor-runtime\" } : {},\n\t\t\t\tlogParams,\n\t\t\t),\n\t\t);\n\t}\n\n\tasync #loadState() {\n\t\t// Read initial state from KV\n\t\tconst [persistDataBuffer] = await this.driver.kvBatchGet(\n\t\t\tthis.#actorId,\n\t\t\t[KEYS.PERSIST_DATA],\n\t\t);\n\t\tinvariant(\n\t\t\tpersistDataBuffer !== null,\n\t\t\t\"persist data has not been set, it should be set when initialized\",\n\t\t);\n\n\t\tconst bareData =\n\t\t\tACTOR_VERSIONED.deserializeWithEmbeddedVersion(persistDataBuffer);\n\t\tconst persistData = convertActorFromBarePersisted<S, I>(bareData);\n\n\t\tif (persistData.hasInitialized) {\n\t\t\t// Restore existing actor\n\t\t\tawait this.#restoreExistingActor(persistData);\n\t\t} else {\n\t\t\t// Create new actor\n\t\t\tawait this.#createNewActor(persistData);\n\t\t}\n\n\t\t// Pass persist reference to schedule manager\n\t\tthis.#scheduleManager.setPersist(this.stateManager.persist);\n\t}\n\n\tasync #createNewActor(persistData: PersistedActor<S, I>) {\n\t\tthis.#rLog.info({ msg: \"actor creating\" });\n\n\t\t// Initialize state\n\t\tawait this.stateManager.initializeState(persistData);\n\n\t\t// Call onCreate lifecycle\n\t\tif (this.#config.onCreate) {\n\t\t\tawait this.#config.onCreate(this.actorContext, persistData.input!);\n\t\t}\n\t}\n\n\tasync #restoreExistingActor(persistData: PersistedActor<S, I>) {\n\t\t// List all connection keys\n\t\tconst connEntries = await this.driver.kvListPrefix(\n\t\t\tthis.#actorId,\n\t\t\tKEYS.CONN_PREFIX,\n\t\t);\n\n\t\t// Decode connections\n\t\tconst connections: PersistedConn<CP, CS>[] = [];\n\t\tfor (const [_key, value] of connEntries) {\n\t\t\ttry {\n\t\t\t\tconst bareData = CONN_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\tnew Uint8Array(value),\n\t\t\t\t);\n\t\t\t\tconst conn = convertConnFromBarePersistedConn<CP, CS>(bareData);\n\t\t\t\tconnections.push(conn);\n\t\t\t} catch (error) {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"failed to decode connection\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.#rLog.info({\n\t\t\tmsg: \"actor restoring\",\n\t\t\tconnections: connections.length,\n\t\t});\n\n\t\t// Initialize state\n\t\tthis.stateManager.initPersistProxy(persistData);\n\n\t\t// Restore connections\n\t\tthis.connectionManager.restoreConnections(connections);\n\t}\n\n\tasync #initializeInspectorToken() {\n\t\t// Try to load existing token\n\t\tconst [tokenBuffer] = await this.driver.kvBatchGet(this.#actorId, [\n\t\t\tKEYS.INSPECTOR_TOKEN,\n\t\t]);\n\n\t\tif (tokenBuffer !== null) {\n\t\t\t// Token exists, decode it\n\t\t\tconst decoder = new TextDecoder();\n\t\t\tthis.#inspectorToken = decoder.decode(tokenBuffer);\n\t\t\tthis.#rLog.debug({ msg: \"loaded existing inspector token\" });\n\t\t} else {\n\t\t\t// Generate new token\n\t\t\tthis.#inspectorToken = generateSecureToken();\n\t\t\tconst tokenBytes = new TextEncoder().encode(this.#inspectorToken);\n\t\t\tawait this.driver.kvBatchPut(this.#actorId, [\n\t\t\t\t[KEYS.INSPECTOR_TOKEN, tokenBytes],\n\t\t\t]);\n\t\t\tthis.#rLog.debug({ msg: \"generated new inspector token\" });\n\t\t}\n\t}\n\n\tasync #initializeVars() {\n\t\tlet vars: V | undefined;\n\t\tif (\"createVars\" in this.#config) {\n\t\t\tconst dataOrPromise = this.#config.createVars(\n\t\t\t\tthis.actorContext as unknown as InitContext,\n\t\t\t\tthis.driver.getContext(this.#actorId),\n\t\t\t);\n\t\t\tif (dataOrPromise instanceof Promise) {\n\t\t\t\tvars = await deadline(\n\t\t\t\t\tdataOrPromise,\n\t\t\t\t\tthis.#config.options.createVarsTimeout,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tvars = dataOrPromise;\n\t\t\t}\n\t\t} else if (\"vars\" in this.#config) {\n\t\t\tvars = structuredClone(this.#config.vars);\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t\"Could not create variables from 'createVars' or 'vars'\",\n\t\t\t);\n\t\t}\n\t\tthis.#vars = vars;\n\t}\n\n\tasync #callOnStart() {\n\t\tthis.#rLog.info({ msg: \"actor starting\" });\n\t\tif (this.#config.onWake) {\n\t\t\tconst result = this.#config.onWake(this.actorContext);\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tawait result;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #callOnSleep() {\n\t\tif (this.#config.onSleep) {\n\t\t\ttry {\n\t\t\t\tthis.#rLog.debug({ msg: \"calling onSleep\" });\n\t\t\t\tconst result = this.#config.onSleep(this.actorContext);\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tawait deadline(result, this.#config.options.onSleepTimeout);\n\t\t\t\t}\n\t\t\t\tthis.#rLog.debug({ msg: \"onSleep completed\" });\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DeadlineError) {\n\t\t\t\t\tthis.#rLog.error({ msg: \"onSleep timed out\" });\n\t\t\t\t} else {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"error in onSleep\",\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\tasync #callOnDestroy() {\n\t\tif (this.#config.onDestroy) {\n\t\t\ttry {\n\t\t\t\tthis.#rLog.debug({ msg: \"calling onDestroy\" });\n\t\t\t\tconst result = this.#config.onDestroy(this.actorContext);\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tawait deadline(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\tthis.#config.options.onDestroyTimeout,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.#rLog.debug({ msg: \"onDestroy completed\" });\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DeadlineError) {\n\t\t\t\t\tthis.#rLog.error({ msg: \"onDestroy timed out\" });\n\t\t\t\t} else {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"error in onDestroy\",\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\tasync #setupDatabase() {\n\t\tif (\"db\" in this.#config && this.#config.db) {\n\t\t\tconst client = await this.#config.db.createClient({\n\t\t\t\tgetDatabase: () => this.driver.getDatabase(this.#actorId),\n\t\t\t});\n\t\t\tthis.#rLog.info({ msg: \"database migration starting\" });\n\t\t\tawait this.#config.db.onMigrate?.(client);\n\t\t\tthis.#rLog.info({ msg: \"database migration complete\" });\n\t\t\tthis.#db = client;\n\t\t}\n\t}\n\n\tasync #disconnectConnections() {\n\t\tconst promises: Promise<unknown>[] = [];\n\t\tthis.#rLog.debug({\n\t\t\tmsg: \"disconnecting connections on actor stop\",\n\t\t\ttotalConns: this.connectionManager.connections.size,\n\t\t});\n\t\tfor (const connection of this.connectionManager.connections.values()) {\n\t\t\tthis.#rLog.debug({\n\t\t\t\tmsg: \"checking connection for disconnect\",\n\t\t\t\tconnId: connection.id,\n\t\t\t\tisHibernatable: connection.isHibernatable,\n\t\t\t});\n\t\t\tif (!connection.isHibernatable) {\n\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\tmsg: \"disconnecting non-hibernatable connection on actor stop\",\n\t\t\t\t\tconnId: connection.id,\n\t\t\t\t});\n\t\t\t\tpromises.push(connection.disconnect());\n\t\t\t} else {\n\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\tmsg: \"preserving hibernatable connection on actor stop\",\n\t\t\t\t\tconnId: connection.id,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Wait with timeout\n\t\tconst res = await Promise.race([\n\t\t\tPromise.all(promises).then(() => false),\n\t\t\tnew Promise<boolean>((res) =>\n\t\t\t\tglobalThis.setTimeout(() => res(true), 1500),\n\t\t\t),\n\t\t]);\n\n\t\tif (res) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"timed out waiting for connections to close, shutting down anyway\",\n\t\t\t});\n\t\t}\n\t}\n\n\tasync #waitBackgroundPromises(timeoutMs: number) {\n\t\tconst pending = this.#backgroundPromises;\n\t\tif (pending.length === 0) {\n\t\t\tthis.#rLog.debug({ msg: \"no background promises\" });\n\t\t\treturn;\n\t\t}\n\n\t\tconst timedOut = await Promise.race([\n\t\t\tPromise.allSettled(pending).then(() => false),\n\t\t\tnew Promise<true>((resolve) =>\n\t\t\t\tsetTimeout(() => resolve(true), timeoutMs),\n\t\t\t),\n\t\t]);\n\n\t\tif (timedOut) {\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"timed out waiting for background tasks\",\n\t\t\t\tcount: pending.length,\n\t\t\t\ttimeoutMs,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#rLog.debug({ msg: \"background promises finished\" });\n\t\t}\n\t}\n\n\tresetSleepTimer() {\n\t\tif (this.#config.options.noSleep || !this.#sleepingSupported) return;\n\t\tif (this.#stopCalled) return;\n\n\t\tconst canSleep = this.#canSleep();\n\n\t\tthis.#rLog.debug({\n\t\t\tmsg: \"resetting sleep timer\",\n\t\t\tcanSleep: CanSleep[canSleep],\n\t\t\texistingTimeout: !!this.#sleepTimeout,\n\t\t\ttimeout: this.#config.options.sleepTimeout,\n\t\t});\n\n\t\tif (this.#sleepTimeout) {\n\t\t\tclearTimeout(this.#sleepTimeout);\n\t\t\tthis.#sleepTimeout = undefined;\n\t\t}\n\n\t\tif (this.#sleepCalled) return;\n\n\t\tif (canSleep === CanSleep.Yes) {\n\t\t\tthis.#sleepTimeout = setTimeout(() => {\n\t\t\t\tthis.startSleep();\n\t\t\t}, this.#config.options.sleepTimeout);\n\t\t}\n\t}\n\n\t#canSleep(): CanSleep {\n\t\tif (!this.#ready) return CanSleep.NotReady;\n\t\tif (!this.#started) return CanSleep.NotReady;\n\t\tif (this.#activeHonoHttpRequests > 0)\n\t\t\treturn CanSleep.ActiveHonoHttpRequests;\n\n\t\tfor (const _conn of this.connectionManager.connections.values()) {\n\t\t\t// TODO: Add back\n\t\t\t// if (!_conn.isHibernatable) {\n\t\t\treturn CanSleep.ActiveConns;\n\t\t\t// }\n\t\t}\n\n\t\treturn CanSleep.Yes;\n\t}\n\n\tget #sleepingSupported(): boolean {\n\t\treturn this.driver.startSleep !== undefined;\n\t}\n\n\tget #varsEnabled(): boolean {\n\t\treturn \"createVars\" in this.#config || \"vars\" in this.#config;\n\t}\n\n\t#validateVarsEnabled() {\n\t\tif (!this.#varsEnabled) {\n\t\t\tthrow new errors.VarsNotEnabled();\n\t\t}\n\t}\n}\n","import { sValidator } from \"@hono/standard-validator\";\nimport jsonPatch from \"@rivetkit/fast-json-patch\";\nimport { Hono } from \"hono\";\nimport { streamSSE } from \"hono/streaming\";\nimport { createNanoEvents, type Unsubscribe } from \"nanoevents\";\nimport z from \"zod/v4\";\nimport type {\n\tAnyDatabaseProvider,\n\tInferDatabaseClient,\n} from \"@/actor/database\";\nimport { promiseWithResolvers } from \"@/utils\";\nimport {\n\tColumnsSchema,\n\ttype Connection,\n\tForeignKeysSchema,\n\tPatchSchema,\n\ttype RealtimeEvent,\n\ttype RecordedRealtimeEvent,\n\tTablesSchema,\n} from \"./protocol/common\";\n\nexport type ActorInspectorRouterEnv = {\n\tVariables: {\n\t\tinspector: ActorInspector;\n\t};\n};\n\n/**\n * Create a router for the Actor Inspector.\n * @internal\n */\nexport function createActorInspectorRouter() {\n\treturn new Hono<ActorInspectorRouterEnv>()\n\t\t.get(\"/ping\", (c) => {\n\t\t\treturn c.json({ message: \"pong\" }, 200);\n\t\t})\n\t\t.get(\"/state\", async (c) => {\n\t\t\tif (await c.var.inspector.accessors.isStateEnabled()) {\n\t\t\t\treturn c.json(\n\t\t\t\t\t{\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\tstate: await c.var.inspector.accessors.getState(),\n\t\t\t\t\t},\n\t\t\t\t\t200,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn c.json({ enabled: false, state: null }, 200);\n\t\t})\n\t\t.patch(\n\t\t\t\"/state\",\n\t\t\tsValidator(\n\t\t\t\t\"json\",\n\t\t\t\tz\n\t\t\t\t\t.object({ patch: PatchSchema })\n\t\t\t\t\t.or(z.object({ replace: z.any() })),\n\t\t\t),\n\t\t\tasync (c) => {\n\t\t\t\tif (!(await c.var.inspector.accessors.isStateEnabled())) {\n\t\t\t\t\treturn c.json({ enabled: false }, 200);\n\t\t\t\t}\n\n\t\t\t\tconst body = c.req.valid(\"json\");\n\t\t\t\tif (\"replace\" in body) {\n\t\t\t\t\tawait c.var.inspector.accessors.setState(body.replace);\n\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\t\tstate: await c.var.inspector.accessors.getState(),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t200,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst state = await c.var.inspector.accessors.getState();\n\n\t\t\t\tconst { newDocument: newState } = jsonPatch.applyPatch(\n\t\t\t\t\tstate,\n\t\t\t\t\tbody.patch,\n\t\t\t\t);\n\t\t\t\tawait c.var.inspector.accessors.setState(newState);\n\n\t\t\t\treturn c.json(\n\t\t\t\t\t{\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\tstate: await c.var.inspector.accessors.getState(),\n\t\t\t\t\t},\n\t\t\t\t\t200,\n\t\t\t\t);\n\t\t\t},\n\t\t)\n\t\t.get(\"/state/stream\", async (c) => {\n\t\t\tif (!(await c.var.inspector.accessors.isStateEnabled())) {\n\t\t\t\treturn c.json({ enabled: false }, 200);\n\t\t\t}\n\n\t\t\tlet id = 0;\n\t\t\tlet unsub: Unsubscribe;\n\t\t\treturn streamSSE(\n\t\t\t\tc,\n\t\t\t\tasync (stream) => {\n\t\t\t\t\tunsub = c.var.inspector.emitter.on(\n\t\t\t\t\t\t\"stateUpdated\",\n\t\t\t\t\t\tasync (state) => {\n\t\t\t\t\t\t\tstream.writeSSE({\n\t\t\t\t\t\t\t\tdata: JSON.stringify(state) || \"\",\n\t\t\t\t\t\t\t\tevent: \"state-update\",\n\t\t\t\t\t\t\t\tid: String(id++),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tconst { promise } = promiseWithResolvers<void>();\n\n\t\t\t\t\treturn promise;\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\tunsub?.();\n\t\t\t\t},\n\t\t\t);\n\t\t})\n\t\t.get(\"/connections\", async (c) => {\n\t\t\tconst connections =\n\t\t\t\tawait c.var.inspector.accessors.getConnections();\n\t\t\treturn c.json({ connections }, 200);\n\t\t})\n\t\t.get(\"/connections/stream\", async (c) => {\n\t\t\tlet id = 0;\n\t\t\tlet unsub: Unsubscribe;\n\t\t\treturn streamSSE(\n\t\t\t\tc,\n\t\t\t\tasync (stream) => {\n\t\t\t\t\tunsub = c.var.inspector.emitter.on(\n\t\t\t\t\t\t\"connectionUpdated\",\n\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\tstream.writeSSE({\n\t\t\t\t\t\t\t\tdata: JSON.stringify(\n\t\t\t\t\t\t\t\t\tawait c.var.inspector.accessors.getConnections(),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tevent: \"connection-update\",\n\t\t\t\t\t\t\t\tid: String(id++),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tconst { promise } = promiseWithResolvers<void>();\n\n\t\t\t\t\treturn promise;\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\tunsub?.();\n\t\t\t\t},\n\t\t\t);\n\t\t})\n\t\t.get(\"/events\", async (c) => {\n\t\t\tconst events = c.var.inspector.lastRealtimeEvents;\n\t\t\treturn c.json({ events }, 200);\n\t\t})\n\t\t.post(\"/events/clear\", async (c) => {\n\t\t\tc.var.inspector.lastRealtimeEvents.length = 0; // Clear the events\n\t\t\treturn c.json({ message: \"Events cleared\" }, 200);\n\t\t})\n\t\t.get(\"/events/stream\", async (c) => {\n\t\t\tlet id = 0;\n\t\t\tlet unsub: Unsubscribe;\n\t\t\treturn streamSSE(\n\t\t\t\tc,\n\t\t\t\tasync (stream) => {\n\t\t\t\t\tunsub = c.var.inspector.emitter.on(\"eventFired\", () => {\n\t\t\t\t\t\tstream.writeSSE({\n\t\t\t\t\t\t\tdata: JSON.stringify(\n\t\t\t\t\t\t\t\tc.var.inspector.lastRealtimeEvents,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tevent: \"realtime-event\",\n\t\t\t\t\t\t\tid: String(id++),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\tconst { promise } = promiseWithResolvers<void>();\n\n\t\t\t\t\treturn promise;\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\tunsub?.();\n\t\t\t\t},\n\t\t\t);\n\t\t})\n\t\t.get(\"/rpcs\", async (c) => {\n\t\t\tconst rpcs = await c.var.inspector.accessors.getRpcs();\n\t\t\treturn c.json({ rpcs }, 200);\n\t\t})\n\t\t.get(\"/db\", async (c) => {\n\t\t\tif (!(await c.var.inspector.accessors.isDbEnabled())) {\n\t\t\t\treturn c.json({ enabled: false, db: null }, 200);\n\t\t\t}\n\n\t\t\t// Access the SQLite database\n\t\t\tconst db = await c.var.inspector.accessors.getDb();\n\n\t\t\t// Get list of tables\n\t\t\tconst rows = await db.execute(`PRAGMA table_list`);\n\t\t\tconst tables = TablesSchema.parse(rows).filter(\n\t\t\t\t(table) =>\n\t\t\t\t\ttable.schema !== \"temp\" &&\n\t\t\t\t\t!table.name.startsWith(\"sqlite_\"),\n\t\t\t);\n\t\t\t// Get columns for each table\n\t\t\tconst tablesInfo = await Promise.all(\n\t\t\t\ttables.map((table) =>\n\t\t\t\t\tdb.execute(`PRAGMA table_info(${table.name})`),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst columns = tablesInfo.map((def) => ColumnsSchema.parse(def));\n\n\t\t\t// Get foreign keys for each table\n\t\t\tconst foreignKeysList = await Promise.all(\n\t\t\t\ttables.map((table) =>\n\t\t\t\t\tdb.execute(`PRAGMA foreign_key_list(${table.name})`),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst foreignKeys = foreignKeysList.map((def) =>\n\t\t\t\tForeignKeysSchema.parse(def),\n\t\t\t);\n\n\t\t\t// Get record counts for each table\n\t\t\tconst countInfo = await Promise.all(\n\t\t\t\ttables.map((table) =>\n\t\t\t\t\tdb.execute(`SELECT COUNT(*) as count FROM ${table.name}`),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst counts = countInfo.map((def) => {\n\t\t\t\treturn def[0].count || 0;\n\t\t\t});\n\n\t\t\treturn c.json(\n\t\t\t\t{\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tdb: tablesInfo.map((_, index) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttable: tables[index],\n\t\t\t\t\t\t\tcolumns: columns[index],\n\t\t\t\t\t\t\tforeignKeys: foreignKeys[index],\n\t\t\t\t\t\t\trecords: counts[index],\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t})\n\t\t.post(\n\t\t\t\"/db\",\n\t\t\tsValidator(\n\t\t\t\t\"json\",\n\t\t\t\tz.object({\n\t\t\t\t\tquery: z.string(),\n\t\t\t\t\tparams: z.array(z.any()).optional(),\n\t\t\t\t}),\n\t\t\t),\n\t\t\tasync (c) => {\n\t\t\t\tif (!(await c.var.inspector.accessors.isDbEnabled())) {\n\t\t\t\t\treturn c.json({ enabled: false }, 200);\n\t\t\t\t}\n\t\t\t\tconst db = await c.var.inspector.accessors.getDb();\n\n\t\t\t\ttry {\n\t\t\t\t\tconst result = (await db.execute(\n\t\t\t\t\t\tc.req.valid(\"json\").query,\n\t\t\t\t\t\t...(c.req.valid(\"json\").params || []),\n\t\t\t\t\t)) as unknown;\n\t\t\t\t\treturn c.json({ result }, 200);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tc;\n\t\t\t\t\treturn c.json({ error: (error as Error).message }, 500);\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\t.post(\n\t\t\t\"/action\",\n\t\t\tsValidator(\n\t\t\t\t\"json\",\n\t\t\t\tz.object({\n\t\t\t\t\tname: z.string(),\n\t\t\t\t\tparams: z.array(z.any()).optional(),\n\t\t\t\t}),\n\t\t\t),\n\t\t\tasync (c) => {\n\t\t\t\tconst { name, params } = c.req.valid(\"json\");\n\t\t\t\tconst result = await c.var.inspector.accessors.executeAction(\n\t\t\t\t\tname,\n\t\t\t\t\tparams,\n\t\t\t\t);\n\t\t\t\treturn c.json({ result }, 200);\n\t\t\t},\n\t\t);\n}\n\ninterface ActorInspectorAccessors {\n\tisStateEnabled: () => Promise<boolean>;\n\tgetState: () => Promise<unknown>;\n\tsetState: (state: unknown) => Promise<void>;\n\tisDbEnabled: () => Promise<boolean>;\n\tgetDb: () => Promise<InferDatabaseClient<AnyDatabaseProvider>>;\n\tgetRpcs: () => Promise<string[]>;\n\tgetConnections: () => Promise<Connection[]>;\n\texecuteAction: (name: string, params?: unknown[]) => Promise<unknown>;\n}\n\ninterface ActorInspectorEmitterEvents {\n\tstateUpdated: (state: unknown) => void;\n\tconnectionUpdated: () => void;\n\teventFired: (event: RealtimeEvent) => void;\n}\n\n/**\n * Provides a unified interface for inspecting actor external and internal state.\n */\nexport class ActorInspector {\n\tpublic readonly accessors: ActorInspectorAccessors;\n\tpublic readonly emitter = createNanoEvents<ActorInspectorEmitterEvents>();\n\n\t#lastRealtimeEvents: RecordedRealtimeEvent[] = [];\n\n\tget lastRealtimeEvents() {\n\t\treturn this.#lastRealtimeEvents;\n\t}\n\n\tconstructor(accessors: () => ActorInspectorAccessors) {\n\t\tthis.accessors = accessors();\n\t\tthis.emitter.on(\"eventFired\", (event) => {\n\t\t\tthis.#lastRealtimeEvents.push({\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t...event,\n\t\t\t});\n\t\t\t// keep the last 100 events\n\t\t\tif (this.#lastRealtimeEvents.length > 100) {\n\t\t\t\tthis.#lastRealtimeEvents = this.#lastRealtimeEvents.slice(-100);\n\t\t\t}\n\t\t});\n\t}\n}\n","import { type ConnDriver, DriverReadyState } from \"../driver\";\n\nexport type ConnHttpState = Record<never, never>;\n\nexport function createHttpDriver(): ConnDriver {\n\treturn {\n\t\ttype: \"http\",\n\t\tgetConnectionReadyState(_actor, _conn) {\n\t\t\t// TODO: This might not be the correct logic\n\t\t\treturn DriverReadyState.OPEN;\n\t\t},\n\t\tdisconnect: async () => {\n\t\t\t// Noop\n\t\t\t// TODO: Configure with abort signals to abort the request\n\t\t},\n\t};\n}\n","import * as cbor from \"cbor-x\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport { TO_CLIENT_VERSIONED } from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype ToClient as ToClientJson,\n\tToClientSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport { InternalError } from \"../errors\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport { CachedSerializer } from \"../protocol/serde\";\nimport type { ConnDriver } from \"./driver\";\nimport { type ConnDataInput, StateManager } from \"./state-manager\";\n\nexport type ConnId = string;\n\nexport type AnyConn = Conn<any, any, any, any, any, any>;\n\nexport const CONN_CONNECTED_SYMBOL = Symbol(\"connected\");\nexport const CONN_SPEAKS_RIVETKIT_SYMBOL = Symbol(\"speaksRivetKit\");\nexport const CONN_DRIVER_SYMBOL = Symbol(\"driver\");\nexport const CONN_ACTOR_SYMBOL = Symbol(\"actor\");\nexport const CONN_STATE_MANAGER_SYMBOL = Symbol(\"stateManager\");\nexport const CONN_SEND_MESSAGE_SYMBOL = Symbol(\"sendMessage\");\n\n/**\n * Represents a client connection to a actor.\n *\n * Manages connection-specific data and controls the connection lifecycle.\n *\n * @see {@link https://rivet.dev/docs/connections|Connection Documentation}\n */\nexport class Conn<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB>;\n\n\tget [CONN_ACTOR_SYMBOL](): ActorInstance<S, CP, CS, V, I, DB> {\n\t\treturn this.#actor;\n\t}\n\n\t#stateManager!: StateManager<CP, CS>;\n\n\tget [CONN_STATE_MANAGER_SYMBOL]() {\n\t\treturn this.#stateManager;\n\t}\n\n\t/**\n\t * Connections exist before being connected to an actor. If true, this\n\t * connection has been connected.\n\t **/\n\t[CONN_CONNECTED_SYMBOL] = false;\n\n\t/**\n\t * If undefined, then no socket is connected to this conn\n\t */\n\t[CONN_DRIVER_SYMBOL]?: ConnDriver;\n\n\t/**\n\t * If this connection is speaking the RivetKit protocol. If false, this is\n\t * a raw connection for WebSocket or fetch or inspector.\n\t **/\n\tget [CONN_SPEAKS_RIVETKIT_SYMBOL](): boolean {\n\t\treturn this[CONN_DRIVER_SYMBOL]?.rivetKitProtocol !== undefined;\n\t}\n\n\tsubscriptions: Set<string> = new Set<string>();\n\n\t#assertConnected() {\n\t\tif (!this[CONN_CONNECTED_SYMBOL])\n\t\t\tthrow new InternalError(\n\t\t\t\t\"Connection not connected yet. This happens when trying to use the connection in onBeforeConnect or createConnState.\",\n\t\t\t);\n\t}\n\n\t// MARK: - Public Getters\n\tget params(): CP {\n\t\treturn this.#stateManager.ephemeralData.parameters;\n\t}\n\n\t/**\n\t * Gets the current state of the connection.\n\t *\n\t * Throws an error if the state is not enabled.\n\t */\n\tget state(): CS {\n\t\treturn this.#stateManager.state;\n\t}\n\n\t/**\n\t * Sets the state of the connection.\n\t *\n\t * Throws an error if the state is not enabled.\n\t */\n\tset state(value: CS) {\n\t\tthis.#stateManager.state = value;\n\t}\n\n\t/**\n\t * Unique identifier for the connection.\n\t */\n\tget id(): ConnId {\n\t\treturn this.#stateManager.ephemeralData.id;\n\t}\n\n\t/**\n\t * @experimental\n\t *\n\t * If the underlying connection can hibernate.\n\t */\n\tget isHibernatable(): boolean {\n\t\treturn this[CONN_DRIVER_SYMBOL]?.hibernatable !== undefined;\n\t}\n\n\t/**\n\t * Initializes a new instance of the Connection class.\n\t *\n\t * This should only be constructed by {@link Actor}.\n\t *\n\t * @protected\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, DB>,\n\t\tdata: ConnDataInput<CP, CS>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#stateManager = new StateManager(this, data);\n\t}\n\n\t/**\n\t * Sends a raw message to the underlying connection.\n\t */\n\t[CONN_SEND_MESSAGE_SYMBOL](message: CachedSerializer<any, any, any>) {\n\t\tif (this[CONN_DRIVER_SYMBOL]) {\n\t\t\tconst driver = this[CONN_DRIVER_SYMBOL];\n\n\t\t\tif (driver.rivetKitProtocol) {\n\t\t\t\tdriver.rivetKitProtocol.sendMessage(this.#actor, this, message);\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.warn({\n\t\t\t\t\tmsg: \"attempting to send RivetKit protocol message to connection that does not support it\",\n\t\t\t\t\tconn: this.id,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"missing connection driver state for send message\",\n\t\t\t\tconn: this.id,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Sends an event with arguments to the client.\n\t *\n\t * @param eventName - The name of the event.\n\t * @param args - The arguments for the event.\n\t * @see {@link https://rivet.dev/docs/events|Events Documentation}\n\t */\n\tsend(eventName: string, ...args: unknown[]) {\n\t\tthis.#assertConnected();\n\t\tif (!this[CONN_SPEAKS_RIVETKIT_SYMBOL]) {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"cannot send messages to this connection type\",\n\t\t\t\tconnId: this.id,\n\t\t\t\tconnType: this[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t});\n\t\t}\n\n\t\tthis.#actor.inspector.emitter.emit(\"eventFired\", {\n\t\t\ttype: \"event\",\n\t\t\teventName,\n\t\t\targs,\n\t\t\tconnId: this.id,\n\t\t});\n\t\tconst eventData = { name: eventName, args };\n\t\tthis[CONN_SEND_MESSAGE_SYMBOL](\n\t\t\tnew CachedSerializer(\n\t\t\t\teventData,\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\tToClientSchema,\n\t\t\t\t// JSON: args is the raw value (array of arguments)\n\t\t\t\t(value): ToClientJson => ({\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\t\targs: value.args,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\t// BARE/CBOR: args needs to be CBOR-encoded to ArrayBuffer\n\t\t\t\t(value): protocol.ToClient => ({\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(value.args)),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * Disconnects the client with an optional reason.\n\t *\n\t * @param reason - The reason for disconnection.\n\t */\n\tasync disconnect(reason?: string) {\n\t\tif (this[CONN_DRIVER_SYMBOL]) {\n\t\t\tconst driver = this[CONN_DRIVER_SYMBOL];\n\t\t\tif (driver.disconnect) {\n\t\t\t\tdriver.disconnect(this.#actor, this, reason);\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.debug({\n\t\t\t\t\tmsg: \"no disconnect handler for conn driver\",\n\t\t\t\t\tconn: this.id,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.#actor.connectionManager.connDisconnected(this);\n\t\t} else {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"missing connection driver state for disconnect\",\n\t\t\t\tconn: this.id,\n\t\t\t});\n\t\t}\n\n\t\tthis[CONN_DRIVER_SYMBOL] = undefined;\n\t}\n}\n","import * as bare from \"@bare-ts/lib\"\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","import {\n\tcreateVersionedDataHandler,\n\ttype MigrationFn,\n} from \"@/common/versioned-data\";\nimport type * as v1 from \"../../../dist/schemas/client-protocol/v1\";\nimport * as v2 from \"../../../dist/schemas/client-protocol/v2\";\n\nexport const CURRENT_VERSION = 2;\n\nconst migrations = new Map<number, MigrationFn<any, any>>();\n\n// Migration from v1 to v2: Remove connectionToken from Init message\nmigrations.set(1, (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\nexport const TO_SERVER_VERSIONED = createVersionedDataHandler<v2.ToServer>({\n\tcurrentVersion: CURRENT_VERSION,\n\tmigrations,\n\tserializeVersion: (data) => v2.encodeToServer(data),\n\tdeserializeVersion: (bytes) => v2.decodeToServer(bytes),\n});\n\nexport const TO_CLIENT_VERSIONED = createVersionedDataHandler<v2.ToClient>({\n\tcurrentVersion: CURRENT_VERSION,\n\tmigrations,\n\tserializeVersion: (data) => v2.encodeToClient(data),\n\tdeserializeVersion: (bytes) => v2.decodeToClient(bytes),\n});\n\nexport const HTTP_ACTION_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v2.HttpActionRequest>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v2.encodeHttpActionRequest(data),\n\t\tdeserializeVersion: (bytes) => v2.decodeHttpActionRequest(bytes),\n\t});\n\nexport const HTTP_ACTION_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v2.HttpActionResponse>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v2.encodeHttpActionResponse(data),\n\t\tdeserializeVersion: (bytes) => v2.decodeHttpActionResponse(bytes),\n\t});\n\nexport const HTTP_RESPONSE_ERROR_VERSIONED =\n\tcreateVersionedDataHandler<v2.HttpResponseError>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v2.encodeHttpResponseError(data),\n\t\tdeserializeVersion: (bytes) => v2.decodeHttpResponseError(bytes),\n\t});\n\nexport const HTTP_RESOLVE_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v2.HttpResolveRequest>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (_) => new Uint8Array(),\n\t\tdeserializeVersion: (bytes) => null,\n\t});\n\nexport const HTTP_RESOLVE_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v2.HttpResolveResponse>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v2.encodeHttpResolveResponse(data),\n\t\tdeserializeVersion: (bytes) => v2.decodeHttpResolveResponse(bytes),\n\t});\n","import { z } from \"zod\";\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 Error\nexport const HttpResponseErrorSchema = z.object({\n\tgroup: z.string(),\n\tcode: z.string(),\n\tmessage: z.string(),\n\tmetadata: z.unknown().optional(),\n});\nexport type HttpResponseError = z.infer<typeof HttpResponseErrorSchema>;\n\n// MARK: HTTP Resolve\nexport const HttpResolveRequestSchema = z.null();\nexport type HttpResolveRequest = z.infer<typeof HttpResolveRequestSchema>;\n\nexport const HttpResolveResponseSchema = z.object({\n\tactorId: z.string(),\n});\nexport type HttpResolveResponse = z.infer<typeof HttpResolveResponseSchema>;\n","import type { HibernatingWebSocketMetadata } from \"@rivetkit/engine-runner\";\nimport * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport onChange from \"on-change\";\nimport { isCborSerializable } from \"@/common/utils\";\nimport * as errors from \"../errors\";\nimport { assertUnreachable } from \"../utils\";\nimport { CONN_ACTOR_SYMBOL, type Conn } from \"./mod\";\nimport type { PersistedConn } from \"./persisted\";\n\n/** Pick a subset of persisted data used to represent ephemeral connections */\nexport type EphemeralConn<CP, CS> = Pick<\n\tPersistedConn<CP, CS>,\n\t\"id\" | \"parameters\" | \"state\"\n>;\n\nexport type ConnDataInput<CP, CS> =\n\t| { ephemeral: EphemeralConn<CP, CS> }\n\t| { hibernatable: PersistedConn<CP, CS> };\n\nexport type ConnData<CP, CS> =\n\t| {\n\t\t\tephemeral: {\n\t\t\t\t/** In-memory data representing this connection */\n\t\t\t\tdata: EphemeralConn<CP, CS>;\n\t\t\t};\n\t }\n\t| {\n\t\t\thibernatable: {\n\t\t\t\t/** Persisted data with on-change proxy */\n\t\t\t\tdata: PersistedConn<CP, CS>;\n\t\t\t\t/** Raw persisted data without proxy */\n\t\t\t\tdataRaw: PersistedConn<CP, CS>;\n\t\t\t};\n\t };\n\n/**\n * Manages connection state persistence, proxying, and change tracking.\n * Handles automatic state change detection for connection-specific state.\n */\nexport class StateManager<CP, CS> {\n\t#conn: Conn<any, CP, CS, any, any, any>;\n\n\t/**\n\t * Data representing this connection.\n\t *\n\t * This is stored as a struct for both ephemeral and hibernatable conns in\n\t * order to keep the separation clear between the two.\n\t */\n\t#data!: ConnData<CP, CS>;\n\n\tconstructor(\n\t\tconn: Conn<any, CP, CS, any, any, any>,\n\t\tdata: ConnDataInput<CP, CS>,\n\t) {\n\t\tthis.#conn = conn;\n\n\t\tif (\"ephemeral\" in data) {\n\t\t\tthis.#data = { ephemeral: { data: data.ephemeral } };\n\t\t} else if (\"hibernatable\" in data) {\n\t\t\t// Listen for changes to the object\n\t\t\tconst persistRaw = data.hibernatable;\n\t\t\tconst persist = onChange(\n\t\t\t\tpersistRaw,\n\t\t\t\t(\n\t\t\t\t\tpath: string,\n\t\t\t\t\tvalue: any,\n\t\t\t\t\t_previousValue: any,\n\t\t\t\t\t_applyData: any,\n\t\t\t\t) => {\n\t\t\t\t\tthis.#handleChange(path, value);\n\t\t\t\t},\n\t\t\t\t{ ignoreDetached: true },\n\t\t\t);\n\t\t\tthis.#data = {\n\t\t\t\thibernatable: { data: persist, dataRaw: persistRaw },\n\t\t\t};\n\t\t} else {\n\t\t\tassertUnreachable(data);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the ephemeral or persisted data for this connectioned.\n\t *\n\t * This property is used to be able to treat both memory & persist conns\n\t * identical by looking up the correct underlying data structure.\n\t */\n\tget ephemeralData(): EphemeralConn<CP, CS> {\n\t\tif (\"hibernatable\" in this.#data) {\n\t\t\treturn this.#data.hibernatable.data;\n\t\t} else if (\"ephemeral\" in this.#data) {\n\t\t\treturn this.#data.ephemeral.data;\n\t\t} else {\n\t\t\treturn assertUnreachable(this.#data);\n\t\t}\n\t}\n\n\tget hibernatableData(): PersistedConn<CP, CS> | undefined {\n\t\tif (\"hibernatable\" in this.#data) {\n\t\t\treturn this.#data.hibernatable.data;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\thibernatableDataOrError(): PersistedConn<CP, CS> {\n\t\tconst hibernatable = this.hibernatableData;\n\t\tinvariant(hibernatable, \"missing hibernatable data\");\n\t\treturn hibernatable;\n\t}\n\n\tget hibernatableDataRaw(): PersistedConn<CP, CS> | undefined {\n\t\tif (\"hibernatable\" in this.#data) {\n\t\t\treturn this.#data.hibernatable.dataRaw;\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tget stateEnabled(): boolean {\n\t\treturn this.#conn[CONN_ACTOR_SYMBOL].connStateEnabled;\n\t}\n\n\tget state(): CS {\n\t\tthis.#validateStateEnabled();\n\t\tconst state = this.ephemeralData.state;\n\t\tif (!state) throw new Error(\"state should exists\");\n\t\treturn state;\n\t}\n\n\tset state(value: CS) {\n\t\tthis.#validateStateEnabled();\n\t\tthis.ephemeralData.state = value;\n\t}\n\n\t#validateStateEnabled() {\n\t\tif (!this.#conn[CONN_ACTOR_SYMBOL].connStateEnabled) {\n\t\t\tthrow new errors.ConnStateNotEnabled();\n\t\t}\n\t}\n\n\t#handleChange(path: string, value: any) {\n\t\t// NOTE: This will only be called for hibernatable conns since only\n\t\t// hibernatable conns have the on-change proxy\n\n\t\t// Validate CBOR serializability for state changes\n\t\tif (path.startsWith(\"state\")) {\n\t\t\tlet invalidPath = \"\";\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\tvalue,\n\t\t\t\t\t(invalidPathPart: string) => {\n\t\t\t\t\t\tinvalidPath = invalidPathPart;\n\t\t\t\t\t},\n\t\t\t\t\t\"\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new errors.InvalidStateType({\n\t\t\t\t\tpath: path + (invalidPath ? `.${invalidPath}` : \"\"),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.#conn[CONN_ACTOR_SYMBOL].rLog.debug({\n\t\t\tmsg: \"conn onChange triggered\",\n\t\t\tconnId: this.#conn.id,\n\t\t\tpath,\n\t\t});\n\n\t\t// Notify actor that this connection has changed\n\t\tthis.#conn[\n\t\t\tCONN_ACTOR_SYMBOL\n\t\t].connectionManager.markConnWithPersistChanged(this.#conn);\n\t}\n\n\taddSubscription({ eventName }: { eventName: string }) {\n\t\tconst hibernatable = this.hibernatableData;\n\t\tif (!hibernatable) return;\n\t\thibernatable.subscriptions.push({\n\t\t\teventName,\n\t\t});\n\t}\n\n\tremoveSubscription({ eventName }: { eventName: string }) {\n\t\tconst hibernatable = this.hibernatableData;\n\t\tif (!hibernatable) return;\n\t\tconst subIdx = hibernatable.subscriptions.findIndex(\n\t\t\t(s) => s.eventName === eventName,\n\t\t);\n\t\tif (subIdx !== -1) {\n\t\t\thibernatable.subscriptions.splice(subIdx, 1);\n\t\t}\n\t\treturn subIdx !== -1;\n\t}\n}\n","/**\n * Persisted data structures for connections.\n *\n * Keep this file in sync with the Connection section of rivetkit-typescript/packages/rivetkit/schemas/actor-persist/\n */\n\nimport * as cbor from \"cbor-x\";\nimport type * as persistSchema from \"@/schemas/actor-persist/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\n\nexport type GatewayId = ArrayBuffer;\nexport type RequestId = ArrayBuffer;\n\nexport type Cbor = ArrayBuffer;\n\n// MARK: Connection\n/** Event subscription for connection */\nexport interface PersistedSubscription {\n\teventName: string;\n}\n\n/** Connection associated with hibernatable WebSocket that should persist across lifecycles */\nexport interface PersistedConn<CP, CS> {\n\t/** Connection ID generated by RivetKit */\n\tid: string;\n\tparameters: CP;\n\tstate: CS;\n\tsubscriptions: PersistedSubscription[];\n\tgatewayId: GatewayId;\n\trequestId: RequestId;\n\tserverMessageIndex: number;\n\tclientMessageIndex: number;\n\trequestPath: string;\n\trequestHeaders: Record<string, string>;\n}\n\n/**\n * Converts persisted connection data to BARE schema format for serialization.\n * @throws {Error} If the connection is ephemeral (not hibernatable)\n */\nexport function convertConnToBarePersistedConn<CP, CS>(\n\tpersist: PersistedConn<CP, CS>,\n): persistSchema.Conn {\n\treturn {\n\t\tid: persist.id,\n\t\tparameters: bufferToArrayBuffer(cbor.encode(persist.parameters)),\n\t\tstate: bufferToArrayBuffer(cbor.encode(persist.state)),\n\t\tsubscriptions: persist.subscriptions.map((sub) => ({\n\t\t\teventName: sub.eventName,\n\t\t})),\n\t\tgatewayId: persist.gatewayId,\n\t\trequestId: persist.requestId,\n\t\tserverMessageIndex: persist.serverMessageIndex,\n\t\tclientMessageIndex: persist.clientMessageIndex,\n\t\trequestPath: persist.requestPath,\n\t\trequestHeaders: new Map(Object.entries(persist.requestHeaders)),\n\t};\n}\n\n/**\n * Converts BARE schema format to persisted connection data.\n * @throws {Error} If the connection is ephemeral (not hibernatable)\n */\nexport function convertConnFromBarePersistedConn<CP, CS>(\n\tbareData: persistSchema.Conn,\n): PersistedConn<CP, CS> {\n\treturn {\n\t\tid: bareData.id,\n\t\tparameters: cbor.decode(new Uint8Array(bareData.parameters)),\n\t\tstate: cbor.decode(new Uint8Array(bareData.state)),\n\t\tsubscriptions: bareData.subscriptions.map((sub) => ({\n\t\t\teventName: sub.eventName,\n\t\t})),\n\t\tgatewayId: bareData.gatewayId,\n\t\trequestId: bareData.requestId,\n\t\tserverMessageIndex: bareData.serverMessageIndex,\n\t\tclientMessageIndex: bareData.clientMessageIndex,\n\t\trequestPath: bareData.requestPath,\n\t\trequestHeaders: Object.fromEntries(bareData.requestHeaders),\n\t};\n}\n","import type { ActorKey } from \"@/actor/mod\";\nimport type { Client } from \"@/client/client\";\nimport type { Logger } from \"@/common/log\";\nimport type { Registry } from \"@/registry/mod\";\nimport type { Conn, ConnId } from \"../conn/mod\";\nimport type { AnyDatabaseProvider, InferDatabaseClient } from \"../database\";\nimport type { ActorInstance, SaveStateOptions } from \"../instance/mod\";\nimport type { Schedule } from \"../schedule\";\n\n/**\n * ActorContext class that provides access to actor methods and state\n */\nexport class ActorContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> {\n\t#actor: ActorInstance<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>;\n\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t) {\n\t\tthis.#actor = actor;\n\t}\n\n\t/**\n\t * Get the actor state\n\t */\n\tget state(): TState {\n\t\treturn this.#actor.state;\n\t}\n\n\t/**\n\t * Get the actor variables\n\t */\n\tget vars(): TVars {\n\t\treturn this.#actor.vars;\n\t}\n\n\t/**\n\t * Broadcasts an event to all connected clients.\n\t * @param name - The name of the event.\n\t * @param args - The arguments to send with the event.\n\t */\n\tbroadcast<Args extends Array<unknown>>(name: string, ...args: Args): void {\n\t\tthis.#actor.eventManager.broadcast(name, ...args);\n\t\treturn;\n\t}\n\n\t/**\n\t * Gets the logger instance.\n\t */\n\tget log(): Logger {\n\t\treturn this.#actor.log;\n\t}\n\n\t/**\n\t * Gets actor ID.\n\t */\n\tget actorId(): string {\n\t\treturn this.#actor.id;\n\t}\n\n\t/**\n\t * Gets the actor name.\n\t */\n\tget name(): string {\n\t\treturn this.#actor.name;\n\t}\n\n\t/**\n\t * Gets the actor key.\n\t */\n\tget key(): ActorKey {\n\t\treturn this.#actor.key;\n\t}\n\n\t/**\n\t * Gets the region.\n\t */\n\tget region(): string {\n\t\treturn this.#actor.region;\n\t}\n\n\t/**\n\t * Gets the scheduler.\n\t */\n\tget schedule(): Schedule {\n\t\treturn this.#actor.schedule;\n\t}\n\n\t/**\n\t * Gets the map of connections.\n\t */\n\tget conns(): Map<\n\t\tConnId,\n\t\tConn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>\n\t> {\n\t\treturn this.#actor.conns;\n\t}\n\n\t/**\n\t * Returns the client for the given registry.\n\t */\n\tclient<R extends Registry<any>>(): Client<R> {\n\t\treturn this.#actor.inlineClient as Client<R>;\n\t}\n\n\t/**\n\t * Gets the database.\n\t * @experimental\n\t * @throws {DatabaseNotEnabled} If the database is not enabled.\n\t */\n\tget db(): InferDatabaseClient<TDatabase> {\n\t\treturn this.#actor.db;\n\t}\n\n\t/**\n\t * Forces the state to get saved.\n\t *\n\t * @param opts - Options for saving the state.\n\t */\n\tasync saveState(opts: SaveStateOptions): Promise<void> {\n\t\treturn this.#actor.stateManager.saveState(opts);\n\t}\n\n\t/**\n\t * Prevents the actor from sleeping until promise is complete.\n\t */\n\twaitUntil(promise: Promise<void>): void {\n\t\tthis.#actor.waitUntil(promise);\n\t}\n\n\t/**\n\t * AbortSignal that fires when the actor is stopping.\n\t */\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#actor.abortSignal;\n\t}\n\n\t/**\n\t * Forces the actor to sleep.\n\t *\n\t * Not supported on all drivers.\n\t *\n\t * @experimental\n\t */\n\tsleep() {\n\t\tthis.#actor.startSleep();\n\t}\n\n\t/**\n\t * Forces the actor to destroy.\n\t *\n\t * This will return immediately, then call `onStop` and `onDestroy`.\n\t *\n\t * @experimental\n\t */\n\tdestroy() {\n\t\tthis.#actor.startDestroy();\n\t}\n}\n","import type { Conn } from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport { ActorContext } from \"./actor\";\n\n/**\n * Base context for connection-based handlers.\n * Extends ActorContext with connection-specific functionality.\n */\nexport abstract class ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> extends ActorContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase\n> {\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tpublic readonly conn: Conn<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t) {\n\t\tsuper(actor);\n\t}\n}\n","import type { Conn } from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport { ConnContext } from \"./conn\";\n\n/**\n * Context for a remote procedure call.\n */\nexport class ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase\n> {}\n","import type { Conn } from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport { ConnContext } from \"./conn\";\n\n/**\n * Context for raw HTTP request handlers (onRequest).\n */\nexport class RequestContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase\n> {\n\t/**\n\t * The incoming HTTP request.\n\t * May be undefined for request contexts initiated without a direct HTTP request.\n\t */\n\tpublic readonly request: Request | undefined;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tconn: Conn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>,\n\t\trequest?: Request,\n\t) {\n\t\tsuper(actor, conn);\n\t\tthis.request = request;\n\t}\n}\n","import type { Conn } from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport { ConnContext } from \"./conn\";\n\n/**\n * Context for raw WebSocket handlers (onWebSocket).\n */\nexport class WebSocketContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase\n> {\n\t/**\n\t * The incoming HTTP request that initiated the WebSocket upgrade.\n\t * May be undefined for WebSocket connections initiated without a direct HTTP request.\n\t */\n\tpublic readonly request: Request | undefined;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tconn: Conn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>,\n\t\trequest?: Request,\n\t) {\n\t\tsuper(actor, conn);\n\t\tthis.request = request;\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 { z } from \"zod\";\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\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 { assertUnreachable, bufferToArrayBuffer } from \"../../utils\";\nimport { CONN_SEND_MESSAGE_SYMBOL, type Conn } from \"../conn/mod\";\nimport { ActionContext } from \"../contexts/action\";\nimport type { ActorInstance } from \"../instance/mod\";\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.MessageTooLong();\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> {\n\tonExecuteAction?: (\n\t\tctx: ActionContext<S, CP, CS, V, I, DB>,\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>,\n\t) => Promise<void>;\n\tonUnsubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, DB>,\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>(\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>,\n\tconn: Conn<S, CP, CS, V, I, DB>,\n\thandler: ProcessMessageHandler<S, CP, CS, V, I, DB>,\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>(actor, conn);\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\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\tif (subscribe) {\n\t\t\t\tawait handler.onSubscribe(eventName, conn);\n\t\t\t} else {\n\t\t\t\tawait handler.onUnsubscribe(eventName, conn);\n\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);\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\tToClientSchema,\n\t\t\t\t// JSON: metadata is the raw value (keep as undefined if not present)\n\t\t\t\t(value): ToClientJson => {\n\t\t\t\t\tconst val: any = {\n\t\t\t\t\t\tgroup: value.group,\n\t\t\t\t\t\tcode: value.code,\n\t\t\t\t\t\tmessage: value.message,\n\t\t\t\t\t\tactionId:\n\t\t\t\t\t\t\tvalue.actionId !== undefined\n\t\t\t\t\t\t\t\t? value.actionId\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t};\n\t\t\t\t\tif (value.metadata !== undefined) {\n\t\t\t\t\t\tval.metadata = value.metadata;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Error\" as const,\n\t\t\t\t\t\t\tval,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\t// BARE/CBOR: metadata needs to be CBOR-encoded to ArrayBuffer\n\t\t\t\t// Note: protocol.Error expects `| null` for optional fields (BARE protocol)\n\t\t\t\t(value): protocol.ToClient => ({\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Error\" as const,\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tgroup: value.group,\n\t\t\t\t\t\t\tcode: value.code,\n\t\t\t\t\t\t\tmessage: value.message,\n\t\t\t\t\t\t\tmetadata: value.metadata\n\t\t\t\t\t\t\t\t? bufferToArrayBuffer(\n\t\t\t\t\t\t\t\t\t\tcbor.encode(value.metadata),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tactionId:\n\t\t\t\t\t\t\t\tvalue.actionId !== undefined\n\t\t\t\t\t\t\t\t\t? value.actionId\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\n\t\tactor.rLog.debug({ msg: \"error response sent\", actionId, actionName });\n\t}\n}\n\n///**\n// * Use `CachedSerializer` if serializing the same data repeatedly.\n// */\n//export function serialize<T>(value: T, encoding: Encoding): OutputData {\n//\tif (encoding === \"json\") {\n//\t\treturn JSON.stringify(value);\n//\t} else if (encoding === \"cbor\") {\n//\t\t// TODO: Remove this hack, but cbor-x can't handle anything extra in data structures\n//\t\tconst cleanValue = JSON.parse(JSON.stringify(value));\n//\t\treturn cbor.encode(cleanValue);\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n//\n//export async function deserialize(data: InputData, encoding: Encoding) {\n//\tif (encoding === \"json\") {\n//\t\tif (typeof data !== \"string\") {\n//\t\t\tactor.rLog.warn(\"received non-string for json parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t} else {\n//\t\t\treturn JSON.parse(data);\n//\t\t}\n//\t} else if (encoding === \"cbor\") {\n//\t\tif (data instanceof Blob) {\n//\t\t\tconst arrayBuffer = await data.arrayBuffer();\n//\t\t\treturn cbor.decode(new Uint8Array(arrayBuffer));\n//\t\t} else if (data instanceof Uint8Array) {\n//\t\t\treturn cbor.decode(data);\n//\t\t} else if (\n//\t\t\tdata instanceof ArrayBuffer ||\n//\t\t\tdata instanceof SharedArrayBuffer\n//\t\t) {\n//\t\t\treturn cbor.decode(new Uint8Array(data));\n//\t\t} else {\n//\t\t\tactor.rLog.warn(\"received non-binary type for cbor parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t}\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n","import type { AnyActorInstance } from \"./instance/mod\";\n\nexport class Schedule {\n\t#actor: AnyActorInstance;\n\n\tconstructor(actor: AnyActorInstance) {\n\t\tthis.#actor = actor;\n\t}\n\n\tasync after(duration: number, fn: string, ...args: unknown[]) {\n\t\tawait this.#actor.scheduleEvent(Date.now() + duration, fn, args);\n\t}\n\n\tasync at(timestamp: number, fn: string, ...args: unknown[]) {\n\t\tawait this.#actor.scheduleEvent(timestamp, fn, args);\n\t}\n}\n","import { HibernatingWebSocketMetadata } from \"@rivetkit/engine-runner\";\nimport * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport { CONN_VERSIONED } from \"@/schemas/actor-persist/versioned\";\nimport { TO_CLIENT_VERSIONED } from \"@/schemas/client-protocol/versioned\";\nimport { ToClientSchema } from \"@/schemas/client-protocol-zod/mod\";\nimport { arrayBuffersEqual, stringifyError } from \"@/utils\";\nimport type { ConnDriver } from \"../conn/driver\";\nimport {\n\tCONN_CONNECTED_SYMBOL,\n\tCONN_DRIVER_SYMBOL,\n\tCONN_SEND_MESSAGE_SYMBOL,\n\tCONN_SPEAKS_RIVETKIT_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\tConn,\n\ttype ConnId,\n} from \"../conn/mod\";\nimport {\n\tconvertConnToBarePersistedConn,\n\ttype PersistedConn,\n} from \"../conn/persisted\";\nimport type { ConnDataInput } from \"../conn/state-manager\";\nimport { CreateConnStateContext } from \"../contexts/create-conn-state\";\nimport { OnBeforeConnectContext } from \"../contexts/on-before-connect\";\nimport { OnConnectContext } from \"../contexts/on-connect\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport { CachedSerializer } from \"../protocol/serde\";\nimport { deadline } from \"../utils\";\nimport { makeConnKey } from \"./kv\";\nimport type { ActorInstance } from \"./mod\";\n/**\n * Manages all connection-related operations for an actor instance.\n * Handles connection creation, tracking, hibernation, and cleanup.\n */\nexport class ConnectionManager<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB>;\n\t#connections = new Map<ConnId, Conn<S, CP, CS, V, I, DB>>();\n\n\t/** Connections that have had their state changed and need to be persisted. */\n\t#connsWithPersistChanged = new Set<ConnId>();\n\n\tconstructor(actor: ActorInstance<S, CP, CS, V, I, DB>) {\n\t\tthis.#actor = actor;\n\t}\n\n\tget connections(): Map<ConnId, Conn<S, CP, CS, V, I, DB>> {\n\t\treturn this.#connections;\n\t}\n\n\tgetConnForId(id: string): Conn<S, CP, CS, V, I, DB> | undefined {\n\t\treturn this.#connections.get(id);\n\t}\n\n\tget connsWithPersistChanged(): Set<ConnId> {\n\t\treturn this.#connsWithPersistChanged;\n\t}\n\n\tclearConnWithPersistChanged() {\n\t\tthis.#connsWithPersistChanged.clear();\n\t}\n\n\tmarkConnWithPersistChanged(conn: Conn<S, CP, CS, V, I, DB>) {\n\t\tinvariant(\n\t\t\tconn.isHibernatable,\n\t\t\t\"cannot mark non-hibernatable conn for persist\",\n\t\t);\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"marked connection as changed\",\n\t\t\tconnId: conn.id,\n\t\t\ttotalChanged: this.#connsWithPersistChanged.size,\n\t\t});\n\n\t\tthis.#connsWithPersistChanged.add(conn.id);\n\n\t\tthis.#actor.stateManager.savePersistThrottled();\n\t}\n\n\t// MARK: - Connection Lifecycle\n\t/**\n\t * Handles pre-connection logic (i.e. auth & create state) before actually connecting the connection.\n\t */\n\tasync prepareConn(\n\t\tdriver: ConnDriver,\n\t\tparams: CP,\n\t\trequest: Request | undefined,\n\t\trequestPath: string | undefined,\n\t\trequestHeaders: Record<string, string> | undefined,\n\t\tisHibernatable: boolean,\n\t\tisRestoringHibernatable: boolean,\n\t): Promise<Conn<S, CP, CS, V, I, DB>> {\n\t\tthis.#actor.assertReady();\n\n\t\t// TODO: Add back\n\t\t// const url = request?.url;\n\t\t// invariant(\n\t\t// \turl?.startsWith(\"http://actor/\") ?? true,\n\t\t// \t`url ${url} must start with 'http://actor/'`,\n\t\t// );\n\n\t\t// Check for hibernatable websocket reconnection\n\t\tif (isRestoringHibernatable) {\n\t\t\treturn this.#reconnectHibernatableConn(driver);\n\t\t}\n\n\t\t// Create new connection\n\t\tif (this.#actor.config.onBeforeConnect) {\n\t\t\tconst ctx = new OnBeforeConnectContext(this.#actor, request);\n\t\t\tawait this.#actor.config.onBeforeConnect(ctx, params);\n\t\t}\n\n\t\t// Create connection state if enabled\n\t\tlet connState: CS | undefined;\n\t\tif (this.#actor.connStateEnabled) {\n\t\t\tconnState = await this.#createConnState(params, request);\n\t\t}\n\n\t\t// Create connection persist data\n\t\tlet connData: ConnDataInput<CP, CS>;\n\t\tif (isHibernatable) {\n\t\t\tconst hibernatable = driver.hibernatable;\n\t\t\tinvariant(hibernatable, \"must have hibernatable\");\n\t\t\tinvariant(requestPath, \"missing requestPath for hibernatable ws\");\n\t\t\tinvariant(\n\t\t\t\trequestHeaders,\n\t\t\t\t\"missing requestHeaders for hibernatable ws\",\n\t\t\t);\n\t\t\tconnData = {\n\t\t\t\thibernatable: {\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tparameters: params,\n\t\t\t\t\tstate: connState as CS,\n\t\t\t\t\tsubscriptions: [],\n\t\t\t\t\tgatewayId: hibernatable.gatewayId,\n\t\t\t\t\trequestId: hibernatable.requestId,\n\t\t\t\t\tclientMessageIndex: 0,\n\t\t\t\t\t// First message index will be 1, so we start at 0\n\t\t\t\t\tserverMessageIndex: 0,\n\t\t\t\t\trequestPath,\n\t\t\t\t\trequestHeaders,\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tconnData = {\n\t\t\t\tephemeral: {\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tparameters: params,\n\t\t\t\t\tstate: connState as CS,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// Create connection instance\n\t\tconst conn = new Conn<S, CP, CS, V, I, DB>(this.#actor, connData);\n\t\tconn[CONN_DRIVER_SYMBOL] = driver;\n\n\t\treturn conn;\n\t}\n\n\t/**\n\t * Adds a connection form prepareConn to the actor and calls onConnect.\n\t *\n\t * This method is intentionally not async since it needs to be called in\n\t * `onOpen` for WebSockets. If this is async, the order of open events will\n\t * be messed up and cause race conditions that can drop WebSocket messages.\n\t * So all async work in prepareConn.\n\t */\n\tconnectConn(conn: Conn<S, CP, CS, V, I, DB>) {\n\t\tinvariant(!this.#connections.has(conn.id), \"conn already connected\");\n\n\t\tthis.#connections.set(conn.id, conn);\n\n\t\t// Notify driver about new connection BEFORE marking as changed\n\t\t//\n\t\t// This ensures the driver can set up any necessary state (like #hwsMessageIndex)\n\t\t// before saveState is triggered by markConnWithPersistChanged\n\t\tif (this.#actor.driver.onCreateConn) {\n\t\t\tthis.#actor.driver.onCreateConn(conn);\n\t\t}\n\n\t\tif (conn.isHibernatable) {\n\t\t\tthis.markConnWithPersistChanged(conn);\n\t\t}\n\n\t\tthis.#callOnConnect(conn);\n\n\t\tthis.#actor.inspector.emitter.emit(\"connectionUpdated\");\n\n\t\tthis.#actor.resetSleepTimer();\n\n\t\tconn[CONN_CONNECTED_SYMBOL] = true;\n\n\t\t// Send init message\n\t\tif (conn[CONN_SPEAKS_RIVETKIT_SYMBOL]) {\n\t\t\tconst initData = { actorId: this.#actor.id, connectionId: conn.id };\n\t\t\tconn[CONN_SEND_MESSAGE_SYMBOL](\n\t\t\t\tnew CachedSerializer(\n\t\t\t\t\tinitData,\n\t\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\t\tToClientSchema,\n\t\t\t\t\t// JSON: identity conversion (no nested data to encode)\n\t\t\t\t\t(value) => ({\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Init\" as const,\n\t\t\t\t\t\t\tval: value,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\t// BARE/CBOR: identity conversion (no nested data to encode)\n\t\t\t\t\t(value) => ({\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Init\" as const,\n\t\t\t\t\t\t\tval: value,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t#reconnectHibernatableConn(driver: ConnDriver): Conn<S, CP, CS, V, I, DB> {\n\t\tinvariant(driver.hibernatable, \"missing requestIdBuf\");\n\t\tconst existingConn = this.findHibernatableConn(\n\t\t\tdriver.hibernatable.gatewayId,\n\t\t\tdriver.hibernatable.requestId,\n\t\t);\n\t\tinvariant(\n\t\t\texistingConn,\n\t\t\t\"cannot find connection for restoring connection\",\n\t\t);\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"reconnecting hibernatable websocket connection\",\n\t\t\tconnectionId: existingConn.id,\n\t\t});\n\n\t\t// Clean up existing driver state if present\n\t\tif (existingConn[CONN_DRIVER_SYMBOL]) {\n\t\t\tthis.#disconnectExistingDriver(existingConn);\n\t\t}\n\n\t\t// Update connection with new socket\n\t\texistingConn[CONN_DRIVER_SYMBOL] = driver;\n\n\t\t// Reset sleep timer since we have an active connection\n\t\tthis.#actor.resetSleepTimer();\n\n\t\t// Mark connection as connected\n\t\texistingConn[CONN_CONNECTED_SYMBOL] = true;\n\n\t\tthis.#actor.inspector.emitter.emit(\"connectionUpdated\");\n\n\t\treturn existingConn;\n\t}\n\n\t#disconnectExistingDriver(conn: Conn<S, CP, CS, V, I, DB>) {\n\t\tconst driver = conn[CONN_DRIVER_SYMBOL];\n\t\tif (driver?.disconnect) {\n\t\t\tdriver.disconnect(\n\t\t\t\tthis.#actor,\n\t\t\t\tconn,\n\t\t\t\t\"Reconnecting hibernatable websocket with new driver state\",\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handle connection disconnection.\n\t *\n\t * This is called by `Conn.disconnect`. This should not call `Conn.disconnect.`\n\t */\n\tasync connDisconnected(conn: Conn<S, CP, CS, V, I, DB>) {\n\t\t// Remove from tracking\n\t\tthis.#connections.delete(conn.id);\n\n\t\tthis.#actor.rLog.debug({ msg: \"removed conn\", connId: conn.id });\n\n\t\t// Notify driver about connection removal\n\t\tif (this.#actor.driver.onDestroyConn) {\n\t\t\tthis.#actor.driver.onDestroyConn(conn);\n\t\t}\n\n\t\tfor (const eventName of [...conn.subscriptions.values()]) {\n\t\t\tthis.#actor.eventManager.removeSubscription(eventName, conn, true);\n\t\t}\n\n\t\tthis.#actor.resetSleepTimer();\n\n\t\tthis.#actor.inspector.emitter.emit(\"connectionUpdated\");\n\n\t\t// Trigger disconnect\n\t\tif (this.#actor.config.onDisconnect) {\n\t\t\ttry {\n\t\t\t\tconst result = this.#actor.config.onDisconnect(\n\t\t\t\t\tthis.#actor.actorContext,\n\t\t\t\t\tconn,\n\t\t\t\t);\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tresult.catch((error) => {\n\t\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\t\tmsg: \"error in `onDisconnect`\",\n\t\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\tmsg: \"error in `onDisconnect`\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Remove from connsWithPersistChanged after onDisconnect to handle any\n\t\t// state changes made during the disconnect callback. Disconnected connections\n\t\t// are removed from KV storage via kvBatchDelete below, not through the\n\t\t// normal persist save flow, so they should not trigger persist saves.\n\t\tthis.#connsWithPersistChanged.delete(conn.id);\n\n\t\t// Remove from KV storage\n\t\tif (conn.isHibernatable) {\n\t\t\tconst key = makeConnKey(conn.id);\n\t\t\ttry {\n\t\t\t\tawait this.#actor.driver.kvBatchDelete(this.#actor.id, [key]);\n\t\t\t\tthis.#actor.rLog.debug({\n\t\t\t\t\tmsg: \"removed connection from KV\",\n\t\t\t\t\tconnId: conn.id,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\tmsg: \"kvBatchDelete failed for conn\",\n\t\t\t\t\terr: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Utilify function for call sites that don't need a separate prepare and connect phase.\n\t */\n\tasync prepareAndConnectConn(\n\t\tdriver: ConnDriver,\n\t\tparams: CP,\n\t\trequest: Request | undefined,\n\t\trequestPath: string | undefined,\n\t\trequestHeaders: Record<string, string> | undefined,\n\t): Promise<Conn<S, CP, CS, V, I, DB>> {\n\t\tconst conn = await this.prepareConn(\n\t\t\tdriver,\n\t\t\tparams,\n\t\t\trequest,\n\t\t\trequestPath,\n\t\t\trequestHeaders,\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t);\n\t\tthis.connectConn(conn);\n\t\treturn conn;\n\t}\n\n\t// MARK: - Persistence\n\n\t/**\n\t * Restores connections from persisted data during actor initialization.\n\t */\n\trestoreConnections(connections: PersistedConn<CP, CS>[]) {\n\t\tfor (const connPersist of connections) {\n\t\t\t// Create connection instance\n\t\t\tconst conn = new Conn<S, CP, CS, V, I, DB>(this.#actor, {\n\t\t\t\thibernatable: connPersist,\n\t\t\t});\n\t\t\tthis.#connections.set(conn.id, conn);\n\n\t\t\t// Notify driver about restored connection\n\t\t\tif (this.#actor.driver.onCreateConn) {\n\t\t\t\tthis.#actor.driver.onCreateConn(conn);\n\t\t\t}\n\n\t\t\t// Restore subscriptions\n\t\t\tfor (const sub of connPersist.subscriptions) {\n\t\t\t\tthis.#actor.eventManager.addSubscription(\n\t\t\t\t\tsub.eventName,\n\t\t\t\t\tconn,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// MARK: - Private Helpers\n\n\tfindHibernatableConn(\n\t\tgatewayIdBuf: ArrayBuffer,\n\t\trequestIdBuf: ArrayBuffer,\n\t): Conn<S, CP, CS, V, I, DB> | undefined {\n\t\treturn Array.from(this.#connections.values()).find((conn) => {\n\t\t\tconst connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\tconst h = connStateManager.hibernatableDataRaw;\n\t\t\treturn (\n\t\t\t\th &&\n\t\t\t\tarrayBuffersEqual(h.gatewayId, gatewayIdBuf) &&\n\t\t\t\tarrayBuffersEqual(h.requestId, requestIdBuf)\n\t\t\t);\n\t\t});\n\t}\n\n\tasync #createConnState(\n\t\tparams: CP,\n\t\trequest: Request | undefined,\n\t): Promise<CS | undefined> {\n\t\tif (\"createConnState\" in this.#actor.config) {\n\t\t\tconst ctx = new CreateConnStateContext(this.#actor, request);\n\t\t\tconst dataOrPromise = this.#actor.config.createConnState(\n\t\t\t\tctx,\n\t\t\t\tparams,\n\t\t\t);\n\t\t\tif (dataOrPromise instanceof Promise) {\n\t\t\t\treturn await deadline(\n\t\t\t\t\tdataOrPromise,\n\t\t\t\t\tthis.#actor.config.options.createConnStateTimeout,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn dataOrPromise;\n\t\t} else if (\"connState\" in this.#actor.config) {\n\t\t\treturn structuredClone(this.#actor.config.connState);\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t\"Could not create connection state from 'createConnState' or 'connState'\",\n\t\t);\n\t}\n\n\t#callOnConnect(conn: Conn<S, CP, CS, V, I, DB>) {\n\t\tif (this.#actor.config.onConnect) {\n\t\t\ttry {\n\t\t\t\tconst ctx = new OnConnectContext(this.#actor, conn);\n\t\t\t\tconst result = this.#actor.config.onConnect(ctx, conn);\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tdeadline(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\tthis.#actor.config.options.onConnectTimeout,\n\t\t\t\t\t).catch((error) => {\n\t\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\t\tmsg: \"error in `onConnect`, closing socket\",\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconn?.disconnect(\"`onConnect` failed\");\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\tmsg: \"error in `onConnect`\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tconn?.disconnect(\"`onConnect` failed\");\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorInstance } from \"../instance/mod\";\nimport { ActorContext } from \"./actor\";\n\n/**\n * Base context for connection initialization handlers.\n * Extends ActorContext with request-specific functionality for connection lifecycle events.\n */\nexport abstract class ConnInitContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> extends ActorContext<TState, undefined, undefined, TVars, TInput, TDatabase> {\n\t/**\n\t * The incoming request that initiated the connection.\n\t * May be undefined for connections initiated without a direct HTTP request.\n\t */\n\tpublic readonly request: Request | undefined;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tactor: ActorInstance<TState, any, any, TVars, TInput, TDatabase>,\n\t\trequest: Request | undefined,\n\t) {\n\t\tsuper(actor);\n\t\tthis.request = request;\n\t}\n}\n","import type { AnyDatabaseProvider } from \"../database\";\nimport { ConnInitContext } from \"./conn-init\";\n\n/**\n * Context for the createConnState lifecycle hook.\n * Called to initialize connection-specific state when a connection is created.\n */\nexport class CreateConnStateContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> extends ConnInitContext<TState, TVars, TInput, TDatabase> {}\n","import type { AnyDatabaseProvider } from \"../database\";\nimport { ConnInitContext } from \"./conn-init\";\n\n/**\n * Context for the onBeforeConnect lifecycle hook.\n * Called before a connection is established, allowing for validation and early rejection.\n */\nexport class OnBeforeConnectContext<\n\tTState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> extends ConnInitContext<TState, TVars, TInput, TDatabase> {}\n","import type { AnyDatabaseProvider } from \"../database\";\nimport { ConnContext } from \"./conn\";\n\n/**\n * Context for the onConnect lifecycle hook.\n * Called when a connection is successfully established.\n */\nexport class OnConnectContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> extends ConnContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase\n> {}\n","import * as cbor from \"cbor-x\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport { TO_CLIENT_VERSIONED } from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype ToClient as ToClientJson,\n\tToClientSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport {\n\tCONN_SEND_MESSAGE_SYMBOL,\n\tCONN_SPEAKS_RIVETKIT_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\ttype Conn,\n} from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport { CachedSerializer } from \"../protocol/serde\";\nimport type { ActorInstance } from \"./mod\";\n\n/**\n * Manages event subscriptions and broadcasting for actor instances.\n * Handles subscription tracking and efficient message distribution to connected clients.\n */\nexport class EventManager<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB>;\n\t#subscriptionIndex = new Map<string, Set<Conn<S, CP, CS, V, I, DB>>>();\n\n\tconstructor(actor: ActorInstance<S, CP, CS, V, I, DB>) {\n\t\tthis.#actor = actor;\n\t}\n\n\t// MARK: - Public API\n\n\t/**\n\t * Adds a subscription for a connection to an event.\n\t *\n\t * @param eventName - The name of the event to subscribe to\n\t * @param connection - The connection subscribing to the event\n\t * @param fromPersist - Whether this subscription is being restored from persistence\n\t */\n\taddSubscription(\n\t\teventName: string,\n\t\tconnection: Conn<S, CP, CS, V, I, DB>,\n\t\tfromPersist: boolean,\n\t) {\n\t\t// Check if already subscribed\n\t\tif (connection.subscriptions.has(eventName)) {\n\t\t\tthis.#actor.rLog.debug({\n\t\t\t\tmsg: \"connection already has subscription\",\n\t\t\t\teventName,\n\t\t\t\tconnId: connection.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Update connection's subscription list\n\t\tconnection.subscriptions.add(eventName);\n\n\t\t// Update subscription index\n\t\tlet subscribers = this.#subscriptionIndex.get(eventName);\n\t\tif (!subscribers) {\n\t\t\tsubscribers = new Set();\n\t\t\tthis.#subscriptionIndex.set(eventName, subscribers);\n\t\t}\n\t\tsubscribers.add(connection);\n\n\t\t// Persist subscription if not restoring from persistence\n\t\tif (!fromPersist) {\n\t\t\tconnection[CONN_STATE_MANAGER_SYMBOL].addSubscription({\n\t\t\t\teventName,\n\t\t\t});\n\n\t\t\t// Save state immediately\n\t\t\tthis.#actor.stateManager.saveState({ immediate: true });\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"subscription added\",\n\t\t\teventName,\n\t\t\tconnId: connection.id,\n\t\t\ttotalSubscribers: subscribers.size,\n\t\t});\n\t}\n\n\t/**\n\t * Removes a subscription for a connection from an event.\n\t *\n\t * @param eventName - The name of the event to unsubscribe from\n\t * @param connection - The connection unsubscribing from the event\n\t * @param fromRemoveConn - Whether this is being called as part of connection removal\n\t */\n\tremoveSubscription(\n\t\teventName: string,\n\t\tconnection: Conn<S, CP, CS, V, I, DB>,\n\t\tfromRemoveConn: boolean,\n\t) {\n\t\t// Check if subscription exists\n\t\tif (!connection.subscriptions.has(eventName)) {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"connection does not have subscription\",\n\t\t\t\teventName,\n\t\t\t\tconnId: connection.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove from connection's subscription list\n\t\tconnection.subscriptions.delete(eventName);\n\n\t\t// Update subscription index\n\t\tconst subscribers = this.#subscriptionIndex.get(eventName);\n\t\tif (subscribers) {\n\t\t\tsubscribers.delete(connection);\n\t\t\tif (subscribers.size === 0) {\n\t\t\t\tthis.#subscriptionIndex.delete(eventName);\n\t\t\t}\n\t\t}\n\n\t\t// Update persistence if not part of connection removal\n\t\tif (!fromRemoveConn) {\n\t\t\t// Remove from persisted subscriptions\n\t\t\tconst removed = connection[\n\t\t\t\tCONN_STATE_MANAGER_SYMBOL\n\t\t\t].removeSubscription({ eventName });\n\t\t\tif (!removed) {\n\t\t\t\tthis.#actor.rLog.warn({\n\t\t\t\t\tmsg: \"subscription does not exist in persist\",\n\t\t\t\t\teventName,\n\t\t\t\t\tconnId: connection.id,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Save state immediately\n\t\t\tthis.#actor.stateManager.saveState({ immediate: true });\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"subscription removed\",\n\t\t\teventName,\n\t\t\tconnId: connection.id,\n\t\t\tremainingSubscribers: subscribers?.size || 0,\n\t\t});\n\t}\n\n\t/**\n\t * Broadcasts an event to all subscribed connections.\n\t *\n\t * @param name - The name of the event to broadcast\n\t * @param args - The arguments to send with the event\n\t */\n\tbroadcast<Args extends Array<unknown>>(name: string, ...args: Args) {\n\t\tthis.#actor.assertReady();\n\n\t\t// Emit to inspector\n\t\tthis.#actor.inspector.emitter.emit(\"eventFired\", {\n\t\t\ttype: \"broadcast\",\n\t\t\teventName: name,\n\t\t\targs,\n\t\t});\n\n\t\t// Get subscribers for this event\n\t\tconst subscribers = this.#subscriptionIndex.get(name);\n\t\tif (!subscribers || subscribers.size === 0) {\n\t\t\tthis.#actor.rLog.debug({\n\t\t\t\tmsg: \"no subscribers for event\",\n\t\t\t\teventName: name,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Create serialized message\n\t\tconst eventData = { name, args };\n\t\tconst toClientSerializer = new CachedSerializer(\n\t\t\teventData,\n\t\t\tTO_CLIENT_VERSIONED,\n\t\t\tToClientSchema,\n\t\t\t// JSON: args is the raw value (array of arguments)\n\t\t\t(value): ToClientJson => ({\n\t\t\t\tbody: {\n\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\tval: {\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\targs: value.args,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t\t// BARE/CBOR: args needs to be CBOR-encoded to ArrayBuffer\n\t\t\t(value): protocol.ToClient => ({\n\t\t\t\tbody: {\n\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\tval: {\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(value.args)),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\t// Send to all subscribers\n\t\tlet sentCount = 0;\n\t\tfor (const connection of subscribers) {\n\t\t\tif (connection[CONN_SPEAKS_RIVETKIT_SYMBOL]) {\n\t\t\t\ttry {\n\t\t\t\t\tconnection[CONN_SEND_MESSAGE_SYMBOL](toClientSerializer);\n\t\t\t\t\tsentCount++;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\tmsg: \"failed to send event to connection\",\n\t\t\t\t\t\teventName: name,\n\t\t\t\t\t\tconnId: connection.id,\n\t\t\t\t\t\terror:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"event broadcasted\",\n\t\t\teventName: name,\n\t\t\tsubscriberCount: subscribers.size,\n\t\t\tsentCount,\n\t\t});\n\t}\n\n\t/**\n\t * Gets all subscribers for a specific event.\n\t *\n\t * @param eventName - The name of the event\n\t * @returns Set of connections subscribed to the event, or undefined if no subscribers\n\t */\n\tgetSubscribers(\n\t\teventName: string,\n\t): Set<Conn<S, CP, CS, V, I, DB>> | undefined {\n\t\treturn this.#subscriptionIndex.get(eventName);\n\t}\n\n\t/**\n\t * Gets all events and their subscriber counts.\n\t *\n\t * @returns Map of event names to subscriber counts\n\t */\n\tgetEventStats(): Map<string, number> {\n\t\tconst stats = new Map<string, number>();\n\t\tfor (const [eventName, subscribers] of this.#subscriptionIndex) {\n\t\t\tstats.set(eventName, subscribers.size);\n\t\t}\n\t\treturn stats;\n\t}\n\n\t/**\n\t * Clears all subscriptions for a connection.\n\t * Used during connection cleanup.\n\t *\n\t * @param connection - The connection to clear subscriptions for\n\t */\n\tclearConnectionSubscriptions(connection: Conn<S, CP, CS, V, I, DB>) {\n\t\tfor (const eventName of [...connection.subscriptions.values()]) {\n\t\t\tthis.removeSubscription(eventName, connection, true);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the total number of unique events being subscribed to.\n\t */\n\tget eventCount(): number {\n\t\treturn this.#subscriptionIndex.size;\n\t}\n\n\t/**\n\t * Gets the total number of subscriptions across all events.\n\t */\n\tget totalSubscriptionCount(): number {\n\t\tlet total = 0;\n\t\tfor (const subscribers of this.#subscriptionIndex.values()) {\n\t\t\ttotal += subscribers.size;\n\t\t}\n\t\treturn total;\n\t}\n\n\t/**\n\t * Checks if an event has any subscribers.\n\t *\n\t * @param eventName - The name of the event to check\n\t * @returns True if the event has at least one subscriber\n\t */\n\thasSubscribers(eventName: string): boolean {\n\t\tconst subscribers = this.#subscriptionIndex.get(eventName);\n\t\treturn subscribers !== undefined && subscribers.size > 0;\n\t}\n}\n","/**\n * Persisted data structures for actors.\n *\n * Keep this file in sync with the Connection section of rivetkit-typescript/packages/rivetkit/schemas/actor-persist/\n */\n\nimport * as cbor from \"cbor-x\";\nimport type * as persistSchema from \"@/schemas/actor-persist/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\n\nexport type Cbor = ArrayBuffer;\n\n// MARK: Schedule Event\n/** Scheduled event to be executed at a specific timestamp */\nexport interface PersistedScheduleEvent {\n\teventId: string;\n\ttimestamp: number;\n\taction: string;\n\targs?: Cbor;\n}\n\n// MARK: Actor\n/** State object that gets automatically persisted to storage */\nexport interface PersistedActor<S, I> {\n\t/** Input data passed to the actor on initialization */\n\tinput?: I;\n\thasInitialized: boolean;\n\tstate: S;\n\tscheduledEvents: PersistedScheduleEvent[];\n}\n\nexport function convertActorToBarePersisted<S, I>(\n\tpersist: PersistedActor<S, I>,\n): persistSchema.Actor {\n\treturn {\n\t\tinput:\n\t\t\tpersist.input !== undefined\n\t\t\t\t? bufferToArrayBuffer(cbor.encode(persist.input))\n\t\t\t\t: null,\n\t\thasInitialized: persist.hasInitialized,\n\t\tstate: bufferToArrayBuffer(cbor.encode(persist.state)),\n\t\tscheduledEvents: persist.scheduledEvents.map((event) => ({\n\t\t\teventId: event.eventId,\n\t\t\ttimestamp: BigInt(event.timestamp),\n\t\t\taction: event.action,\n\t\t\targs: event.args ?? null,\n\t\t})),\n\t};\n}\n\nexport function convertActorFromBarePersisted<S, I>(\n\tbareData: persistSchema.Actor,\n): PersistedActor<S, I> {\n\treturn {\n\t\tinput: bareData.input\n\t\t\t? cbor.decode(new Uint8Array(bareData.input))\n\t\t\t: undefined,\n\t\thasInitialized: bareData.hasInitialized,\n\t\tstate: cbor.decode(new Uint8Array(bareData.state)),\n\t\tscheduledEvents: bareData.scheduledEvents.map((event) => ({\n\t\t\teventId: event.eventId,\n\t\t\ttimestamp: Number(event.timestamp),\n\t\t\taction: event.action,\n\t\t\targs: event.args ?? undefined,\n\t\t})),\n\t};\n}\n","import * as cbor from \"cbor-x\";\nimport {\n\tbufferToArrayBuffer,\n\tSinglePromiseQueue,\n\tstringifyError,\n} from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDriver } from \"../driver\";\nimport type { ActorInstance } from \"./mod\";\nimport type { PersistedScheduleEvent } from \"./persisted\";\n\n/**\n * Manages scheduled events and alarms for actor instances.\n * Handles event scheduling, alarm triggers, and automatic event execution.\n */\nexport class ScheduleManager<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB>;\n\t#actorDriver: ActorDriver;\n\t#alarmWriteQueue = new SinglePromiseQueue();\n\t#config: any; // ActorConfig type\n\t#persist: any; // Reference to PersistedActor\n\n\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, DB>,\n\t\tactorDriver: ActorDriver,\n\t\tconfig: any,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#actorDriver = actorDriver;\n\t\tthis.#config = config;\n\t}\n\n\t// MARK: - Public API\n\n\t/**\n\t * Sets the persist object reference.\n\t * Called after StateManager initializes the persist proxy.\n\t */\n\tsetPersist(persist: any) {\n\t\tthis.#persist = persist;\n\t}\n\n\t/**\n\t * Schedules an event to be executed at a specific timestamp.\n\t *\n\t * @param timestamp - Unix timestamp in milliseconds when the event should fire\n\t * @param action - The name of the action to execute\n\t * @param args - Arguments to pass to the action\n\t */\n\tasync scheduleEvent(\n\t\ttimestamp: number,\n\t\taction: string,\n\t\targs: unknown[],\n\t): Promise<void> {\n\t\tconst newEvent: PersistedScheduleEvent = {\n\t\t\teventId: crypto.randomUUID(),\n\t\t\ttimestamp,\n\t\t\taction,\n\t\t\targs: bufferToArrayBuffer(cbor.encode(args)),\n\t\t};\n\n\t\tawait this.#scheduleEventInner(newEvent);\n\t}\n\n\t/**\n\t * Triggers any pending alarms that are due.\n\t * This method is idempotent and safe to call multiple times.\n\t */\n\tasync onAlarm(): Promise<void> {\n\t\tconst now = Date.now();\n\t\tthis.#actor.log.debug({\n\t\t\tmsg: \"alarm triggered\",\n\t\t\tnow,\n\t\t\tevents: this.#persist?.scheduledEvents?.length || 0,\n\t\t});\n\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\tthis.#actor.rLog.debug({ msg: \"no scheduled events\" });\n\t\t\treturn;\n\t\t}\n\n\t\t// Find events that are due\n\t\tconst dueIndex = this.#persist.scheduledEvents.findIndex(\n\t\t\t(x: PersistedScheduleEvent) => x.timestamp <= now,\n\t\t);\n\n\t\tif (dueIndex === -1) {\n\t\t\t// No events are due yet\n\t\t\tthis.#actor.rLog.debug({ msg: \"no events are due yet\" });\n\n\t\t\t// Reschedule alarm for next event if any exist\n\t\t\tif (this.#persist.scheduledEvents.length > 0) {\n\t\t\t\tconst nextTs = this.#persist.scheduledEvents[0].timestamp;\n\t\t\t\tthis.#actor.log.debug({\n\t\t\t\t\tmsg: \"alarm fired early, rescheduling for next event\",\n\t\t\t\t\tnow,\n\t\t\t\t\tnextTs,\n\t\t\t\t\tdelta: nextTs - now,\n\t\t\t\t});\n\t\t\t\tawait this.#queueSetAlarm(nextTs);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove and process due events\n\t\tconst dueEvents = this.#persist.scheduledEvents.splice(0, dueIndex + 1);\n\t\tthis.#actor.log.debug({\n\t\t\tmsg: \"running events\",\n\t\t\tcount: dueEvents.length,\n\t\t});\n\n\t\t// Schedule next alarm if more events remain\n\t\tif (this.#persist.scheduledEvents.length > 0) {\n\t\t\tconst nextTs = this.#persist.scheduledEvents[0].timestamp;\n\t\t\tthis.#actor.log.info({\n\t\t\t\tmsg: \"setting next alarm\",\n\t\t\t\tnextTs,\n\t\t\t\tremainingEvents: this.#persist.scheduledEvents.length,\n\t\t\t});\n\t\t\tawait this.#queueSetAlarm(nextTs);\n\t\t}\n\n\t\t// Execute due events\n\t\tawait this.#executeDueEvents(dueEvents);\n\t}\n\n\t/**\n\t * Initializes alarms on actor startup.\n\t * Sets the alarm for the next scheduled event if any exist.\n\t */\n\tasync initializeAlarms(): Promise<void> {\n\t\tif (this.#persist?.scheduledEvents?.length > 0) {\n\t\t\tawait this.#queueSetAlarm(\n\t\t\t\tthis.#persist.scheduledEvents[0].timestamp,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Waits for any pending alarm write operations to complete.\n\t */\n\tasync waitForPendingAlarmWrites(): Promise<void> {\n\t\tif (this.#alarmWriteQueue.runningDrainLoop) {\n\t\t\tawait this.#alarmWriteQueue.runningDrainLoop;\n\t\t}\n\t}\n\n\t/**\n\t * Gets statistics about scheduled events.\n\t */\n\tgetScheduleStats(): {\n\t\ttotalEvents: number;\n\t\tnextEventTime: number | null;\n\t\toverdueCount: number;\n\t} {\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\treturn {\n\t\t\t\ttotalEvents: 0,\n\t\t\t\tnextEventTime: null,\n\t\t\t\toverdueCount: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst now = Date.now();\n\t\tconst events = this.#persist.scheduledEvents;\n\n\t\treturn {\n\t\t\ttotalEvents: events.length,\n\t\t\tnextEventTime: events.length > 0 ? events[0].timestamp : null,\n\t\t\toverdueCount: events.filter(\n\t\t\t\t(e: PersistedScheduleEvent) => e.timestamp <= now,\n\t\t\t).length,\n\t\t};\n\t}\n\n\t/**\n\t * Cancels a scheduled event by its ID.\n\t *\n\t * @param eventId - The ID of the event to cancel\n\t * @returns True if the event was found and cancelled\n\t */\n\tasync cancelEvent(eventId: string): Promise<boolean> {\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst index = this.#persist.scheduledEvents.findIndex(\n\t\t\t(e: PersistedScheduleEvent) => e.eventId === eventId,\n\t\t);\n\n\t\tif (index === -1) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Remove the event\n\t\tconst wasFirst = index === 0;\n\t\tthis.#persist.scheduledEvents.splice(index, 1);\n\n\t\t// If we removed the first event, update the alarm\n\t\tif (wasFirst && this.#persist.scheduledEvents.length > 0) {\n\t\t\tawait this.#queueSetAlarm(\n\t\t\t\tthis.#persist.scheduledEvents[0].timestamp,\n\t\t\t);\n\t\t}\n\n\t\tthis.#actor.log.info({\n\t\t\tmsg: \"cancelled scheduled event\",\n\t\t\teventId,\n\t\t\tremainingEvents: this.#persist.scheduledEvents.length,\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t// MARK: - Private Helpers\n\n\tasync #scheduleEventInner(newEvent: PersistedScheduleEvent): Promise<void> {\n\t\tthis.#actor.log.info({\n\t\t\tmsg: \"scheduling event\",\n\t\t\teventId: newEvent.eventId,\n\t\t\ttimestamp: newEvent.timestamp,\n\t\t\taction: newEvent.action,\n\t\t});\n\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\tthrow new Error(\"Persist not initialized\");\n\t\t}\n\n\t\t// Find insertion point (events are sorted by timestamp)\n\t\tconst insertIndex = this.#persist.scheduledEvents.findIndex(\n\t\t\t(x: PersistedScheduleEvent) => x.timestamp > newEvent.timestamp,\n\t\t);\n\n\t\tif (insertIndex === -1) {\n\t\t\t// Add to end\n\t\t\tthis.#persist.scheduledEvents.push(newEvent);\n\t\t} else {\n\t\t\t// Insert at correct position\n\t\t\tthis.#persist.scheduledEvents.splice(insertIndex, 0, newEvent);\n\t\t}\n\n\t\t// Update alarm if this is the newest event\n\t\tif (insertIndex === 0 || this.#persist.scheduledEvents.length === 1) {\n\t\t\tthis.#actor.log.info({\n\t\t\t\tmsg: \"setting alarm for new event\",\n\t\t\t\ttimestamp: newEvent.timestamp,\n\t\t\t\teventCount: this.#persist.scheduledEvents.length,\n\t\t\t});\n\t\t\tawait this.#queueSetAlarm(newEvent.timestamp);\n\t\t}\n\t}\n\n\tasync #executeDueEvents(events: PersistedScheduleEvent[]): Promise<void> {\n\t\tfor (const event of events) {\n\t\t\ttry {\n\t\t\t\tthis.#actor.log.info({\n\t\t\t\t\tmsg: \"executing scheduled event\",\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\ttimestamp: event.timestamp,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\n\t\t\t\t// Look up the action function\n\t\t\t\tconst fn = this.#config.actions[event.action];\n\n\t\t\t\tif (!fn) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Missing action for scheduled event: ${event.action}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (typeof fn !== \"function\") {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Scheduled event action ${event.action} is not a function (got ${typeof fn})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Decode arguments and execute\n\t\t\t\tconst args = event.args\n\t\t\t\t\t? cbor.decode(new Uint8Array(event.args))\n\t\t\t\t\t: [];\n\n\t\t\t\tconst result = fn.call(\n\t\t\t\t\tundefined,\n\t\t\t\t\tthis.#actor.actorContext,\n\t\t\t\t\t...args,\n\t\t\t\t);\n\n\t\t\t\t// Handle async actions\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tawait result;\n\t\t\t\t}\n\n\t\t\t\tthis.#actor.log.debug({\n\t\t\t\t\tmsg: \"scheduled event completed\",\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tthis.#actor.log.error({\n\t\t\t\t\tmsg: \"error executing scheduled event\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\ttimestamp: event.timestamp,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\n\t\t\t\t// Continue processing other events even if one fails\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #queueSetAlarm(timestamp: number): Promise<void> {\n\t\tawait this.#alarmWriteQueue.enqueue(async () => {\n\t\t\tawait this.#actorDriver.setAlarm(this.#actor, timestamp);\n\t\t});\n\t}\n\n\t/**\n\t * Gets the next scheduled event, if any.\n\t */\n\tgetNextEvent(): PersistedScheduleEvent | null {\n\t\tif (\n\t\t\t!this.#persist?.scheduledEvents ||\n\t\t\tthis.#persist.scheduledEvents.length === 0\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.#persist.scheduledEvents[0];\n\t}\n\n\t/**\n\t * Gets all scheduled events.\n\t */\n\tgetAllEvents(): PersistedScheduleEvent[] {\n\t\treturn this.#persist?.scheduledEvents || [];\n\t}\n\n\t/**\n\t * Clears all scheduled events.\n\t * Use with caution - this removes all pending scheduled events.\n\t */\n\tclearAllEvents(): void {\n\t\tif (this.#persist?.scheduledEvents) {\n\t\t\tthis.#persist.scheduledEvents = [];\n\t\t\tthis.#actor.log.warn({ msg: \"cleared all scheduled events\" });\n\t\t}\n\t}\n}\n","import { idToStr } from \"@rivetkit/engine-runner\";\nimport onChange from \"on-change\";\nimport { isCborSerializable, stringifyError } from \"@/common/utils\";\nimport {\n\tACTOR_VERSIONED,\n\tCONN_VERSIONED,\n} from \"@/schemas/actor-persist/versioned\";\nimport { promiseWithResolvers, SinglePromiseQueue } from \"@/utils\";\nimport { type AnyConn, CONN_STATE_MANAGER_SYMBOL } from \"../conn/mod\";\nimport { convertConnToBarePersistedConn } from \"../conn/persisted\";\nimport type { ActorDriver } from \"../driver\";\nimport * as errors from \"../errors\";\nimport { isConnStatePath, isStatePath } from \"../utils\";\nimport { KEYS, makeConnKey } from \"./kv\";\nimport type { ActorInstance } from \"./mod\";\nimport { convertActorToBarePersisted, type PersistedActor } from \"./persisted\";\n\nexport interface SaveStateOptions {\n\t/**\n\t * Forces the state to be saved immediately. This function will return when the state has saved successfully.\n\t */\n\timmediate?: boolean;\n\t/** Bypass ready check for stopping. */\n\tallowStoppingState?: boolean;\n\t/**\n\t * Maximum time in milliseconds to wait before forcing a save.\n\t *\n\t * If a save is already scheduled to occur later than this deadline, it will be rescheduled earlier.\n\t */\n\tmaxWait?: number;\n}\n\n/**\n * Manages actor state persistence, proxying, and synchronization.\n * Handles automatic state change detection and throttled persistence to KV storage.\n */\nexport class StateManager<S, CP, CS, I> {\n\t#actor: ActorInstance<S, CP, CS, any, I, any>;\n\t#actorDriver: ActorDriver;\n\n\t// State tracking\n\t#persist!: PersistedActor<S, I>;\n\t#persistRaw!: PersistedActor<S, I>;\n\t#persistChanged = false;\n\t#isInOnStateChange = false;\n\n\t// Save management\n\t#persistWriteQueue = new SinglePromiseQueue();\n\t#lastSaveTime = 0;\n\t#pendingSaveTimeout?: NodeJS.Timeout;\n\t#pendingSaveScheduledTimestamp?: number;\n\t#onPersistSavedPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\n\t// Configuration\n\t#config: any; // ActorConfig type\n\t#stateSaveInterval: number;\n\n\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, any, I, any>,\n\t\tactorDriver: ActorDriver,\n\t\tconfig: any,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#actorDriver = actorDriver;\n\t\tthis.#config = config;\n\t\tthis.#stateSaveInterval = config.options.stateSaveInterval || 100;\n\t}\n\n\t// MARK: - Public API\n\n\tget persist(): PersistedActor<S, I> {\n\t\treturn this.#persist;\n\t}\n\n\tget persistRaw(): PersistedActor<S, I> {\n\t\treturn this.#persistRaw;\n\t}\n\n\tget persistChanged(): boolean {\n\t\treturn this.#persistChanged;\n\t}\n\n\tget state(): S {\n\t\tthis.#validateStateEnabled();\n\t\treturn this.#persist.state;\n\t}\n\n\tset state(value: S) {\n\t\tthis.#validateStateEnabled();\n\t\tthis.#persist.state = value;\n\t}\n\n\tget stateEnabled(): boolean {\n\t\treturn \"createState\" in this.#config || \"state\" in this.#config;\n\t}\n\n\t// MARK: - Initialization\n\n\t/**\n\t * Initializes state from persisted data or creates new state.\n\t */\n\tasync initializeState(persistData: PersistedActor<S, I>): Promise<void> {\n\t\tif (!persistData.hasInitialized) {\n\t\t\t// Create initial state\n\t\t\tlet stateData: unknown;\n\t\t\tif (this.stateEnabled) {\n\t\t\t\tthis.#actor.rLog.info({ msg: \"actor state initializing\" });\n\n\t\t\t\tif (\"createState\" in this.#config) {\n\t\t\t\t\tstateData = await this.#config.createState(\n\t\t\t\t\t\tthis.#actor.actorContext,\n\t\t\t\t\t\tpersistData.input!,\n\t\t\t\t\t);\n\t\t\t\t} else if (\"state\" in this.#config) {\n\t\t\t\t\tstateData = structuredClone(this.#config.state);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Both 'createState' or 'state' were not defined\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.debug({ msg: \"state not enabled\" });\n\t\t\t}\n\n\t\t\t// Update persisted data\n\t\t\tpersistData.state = stateData as S;\n\t\t\tpersistData.hasInitialized = true;\n\n\t\t\t// Save initial state\n\t\t\t//\n\t\t\t// We don't use #savePersistInner because the actor is not fully\n\t\t\t// initialized yet\n\t\t\tconst bareData = convertActorToBarePersisted<S, I>(persistData);\n\t\t\tawait this.#actorDriver.kvBatchPut(this.#actor.id, [\n\t\t\t\t[\n\t\t\t\t\tKEYS.PERSIST_DATA,\n\t\t\t\t\tACTOR_VERSIONED.serializeWithEmbeddedVersion(bareData),\n\t\t\t\t],\n\t\t\t]);\n\t\t}\n\n\t\t// Initialize proxy\n\t\tthis.initPersistProxy(persistData);\n\t}\n\n\t/**\n\t * Creates proxy for persist object that handles automatic state change detection.\n\t */\n\tinitPersistProxy(target: PersistedActor<S, I>) {\n\t\t// Set raw persist object\n\t\tthis.#persistRaw = target;\n\n\t\t// Validate serializability\n\t\tif (target === null || typeof target !== \"object\") {\n\t\t\tlet invalidPath = \"\";\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\ttarget,\n\t\t\t\t\t(path) => {\n\t\t\t\t\t\tinvalidPath = path;\n\t\t\t\t\t},\n\t\t\t\t\t\"\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new errors.InvalidStateType({ path: invalidPath });\n\t\t\t}\n\t\t\treturn target;\n\t\t}\n\n\t\t// Unsubscribe from old state\n\t\tif (this.#persist) {\n\t\t\tonChange.unsubscribe(this.#persist);\n\t\t}\n\n\t\t// Listen for changes to automatically write state\n\t\tthis.#persist = onChange(\n\t\t\ttarget,\n\t\t\t(\n\t\t\t\tpath: string,\n\t\t\t\tvalue: any,\n\t\t\t\t_previousValue: any,\n\t\t\t\t_applyData: any,\n\t\t\t) => {\n\t\t\t\tthis.#handleStateChange(path, value);\n\t\t\t},\n\t\t\t{ ignoreDetached: true },\n\t\t);\n\t}\n\n\t// MARK: - State Persistence\n\n\t/**\n\t * Forces the state to get saved.\n\t */\n\tasync saveState(opts: SaveStateOptions): Promise<void> {\n\t\tthis.#actor.assertReady(opts.allowStoppingState);\n\n\t\tif (this.#persistChanged) {\n\t\t\tif (opts.immediate) {\n\t\t\t\tawait this.#savePersistInner();\n\t\t\t} else {\n\t\t\t\t// Create promise for waiting\n\t\t\t\tif (!this.#onPersistSavedPromise) {\n\t\t\t\t\tthis.#onPersistSavedPromise = promiseWithResolvers();\n\t\t\t\t}\n\n\t\t\t\t// Save throttled\n\t\t\t\tthis.savePersistThrottled(opts.maxWait);\n\n\t\t\t\t// Wait for save\n\t\t\t\tawait this.#onPersistSavedPromise?.promise;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Throttled save state method. Used to write to KV at a reasonable cadence.\n\t *\n\t * Passing a maxWait will override the stateSaveInterval with the min\n\t * between that and the maxWait.\n\t */\n\tsavePersistThrottled(maxWait?: number) {\n\t\tconst now = Date.now();\n\t\tconst timeSinceLastSave = now - this.#lastSaveTime;\n\n\t\t// Calculate when the save should happen based on throttle interval\n\t\tlet saveDelay = Math.max(\n\t\t\t0,\n\t\t\tthis.#stateSaveInterval - timeSinceLastSave,\n\t\t);\n\t\tif (maxWait !== undefined) {\n\t\t\tsaveDelay = Math.min(saveDelay, maxWait);\n\t\t}\n\n\t\t// Check if we need to reschedule the same timeout\n\t\tif (\n\t\t\tthis.#pendingSaveTimeout !== undefined &&\n\t\t\tthis.#pendingSaveScheduledTimestamp !== undefined\n\t\t) {\n\t\t\t// Check if we have an earlier save deadline\n\t\t\tconst newScheduledTimestamp = now + saveDelay;\n\t\t\tif (newScheduledTimestamp < this.#pendingSaveScheduledTimestamp) {\n\t\t\t\t// Cancel existing timeout and reschedule\n\t\t\t\tclearTimeout(this.#pendingSaveTimeout);\n\t\t\t\tthis.#pendingSaveTimeout = undefined;\n\t\t\t\tthis.#pendingSaveScheduledTimestamp = undefined;\n\t\t\t} else {\n\t\t\t\t// Current schedule is fine, don't reschedule\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (saveDelay > 0) {\n\t\t\t// Schedule save\n\t\t\tthis.#pendingSaveScheduledTimestamp = now + saveDelay;\n\t\t\tthis.#pendingSaveTimeout = setTimeout(() => {\n\t\t\t\tthis.#pendingSaveTimeout = undefined;\n\t\t\t\tthis.#pendingSaveScheduledTimestamp = undefined;\n\t\t\t\tthis.#savePersistInner();\n\t\t\t}, saveDelay);\n\t\t} else {\n\t\t\t// Save immediately\n\t\t\tthis.#savePersistInner();\n\t\t}\n\t}\n\n\t/**\n\t * Clears any pending save timeout.\n\t */\n\tclearPendingSaveTimeout() {\n\t\tif (this.#pendingSaveTimeout) {\n\t\t\tclearTimeout(this.#pendingSaveTimeout);\n\t\t\tthis.#pendingSaveTimeout = undefined;\n\t\t\tthis.#pendingSaveScheduledTimestamp = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Waits for any pending write operations to complete.\n\t */\n\tasync waitForPendingWrites(): Promise<void> {\n\t\tif (this.#persistWriteQueue.runningDrainLoop) {\n\t\t\tawait this.#persistWriteQueue.runningDrainLoop;\n\t\t}\n\t}\n\n\t// MARK: - Private Helpers\n\n\t#validateStateEnabled() {\n\t\tif (!this.stateEnabled) {\n\t\t\tthrow new errors.StateNotEnabled();\n\t\t}\n\t}\n\n\t#handleStateChange(path: string, value: any) {\n\t\tconst actorStatePath = isStatePath(path);\n\t\tconst connStatePath = isConnStatePath(path);\n\n\t\t// Validate CBOR serializability\n\t\tif (actorStatePath || connStatePath) {\n\t\t\tlet invalidPath = \"\";\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\tvalue,\n\t\t\t\t\t(invalidPathPart) => {\n\t\t\t\t\t\tinvalidPath = invalidPathPart;\n\t\t\t\t\t},\n\t\t\t\t\t\"\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new errors.InvalidStateType({\n\t\t\t\t\tpath: path + (invalidPath ? `.${invalidPath}` : \"\"),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"onChange triggered, setting persistChanged=true\",\n\t\t\tpath,\n\t\t});\n\t\tthis.#persistChanged = true;\n\n\t\t// Inform inspector about state changes\n\t\tif (actorStatePath) {\n\t\t\tthis.#actor.inspector.emitter.emit(\n\t\t\t\t\"stateUpdated\",\n\t\t\t\tthis.#persist.state,\n\t\t\t);\n\t\t}\n\n\t\t// Call onStateChange lifecycle hook\n\t\tif (\n\t\t\tactorStatePath &&\n\t\t\tthis.#config.onStateChange &&\n\t\t\tthis.#actor.isReady() &&\n\t\t\t!this.#isInOnStateChange\n\t\t) {\n\t\t\ttry {\n\t\t\t\tthis.#isInOnStateChange = true;\n\t\t\t\tthis.#config.onStateChange(\n\t\t\t\t\tthis.#actor.actorContext,\n\t\t\t\t\tthis.#persistRaw.state,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\tmsg: \"error in `_onStateChange`\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tthis.#isInOnStateChange = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #savePersistInner() {\n\t\tthis.#actor.rLog.info({\n\t\t\tmsg: \"savePersistInner called\",\n\t\t\tpersistChanged: this.#persistChanged,\n\t\t\tconnsWithPersistChangedSize:\n\t\t\t\tthis.#actor.connectionManager.connsWithPersistChanged.size,\n\t\t\tconnsWithPersistChangedIds: Array.from(\n\t\t\t\tthis.#actor.connectionManager.connsWithPersistChanged,\n\t\t\t),\n\t\t});\n\n\t\ttry {\n\t\t\tthis.#lastSaveTime = Date.now();\n\n\t\t\t// Check if either actor state or connections have changed\n\t\t\tconst hasChanges =\n\t\t\t\tthis.#persistChanged ||\n\t\t\t\tthis.#actor.connectionManager.connsWithPersistChanged.size > 0;\n\n\t\t\tif (hasChanges) {\n\t\t\t\tawait this.#persistWriteQueue.enqueue(async () => {\n\t\t\t\t\tthis.#actor.rLog.debug({\n\t\t\t\t\t\tmsg: \"saving persist\",\n\t\t\t\t\t\tactorChanged: this.#persistChanged,\n\t\t\t\t\t\tconnectionsChanged:\n\t\t\t\t\t\t\tthis.#actor.connectionManager\n\t\t\t\t\t\t\t\t.connsWithPersistChanged.size,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst entries: Array<[Uint8Array, Uint8Array]> = [];\n\n\t\t\t\t\t// Build actor entries\n\t\t\t\t\tif (this.#persistChanged) {\n\t\t\t\t\t\tthis.#persistChanged = false;\n\t\t\t\t\t\tconst bareData = convertActorToBarePersisted<S, I>(\n\t\t\t\t\t\t\tthis.#persistRaw,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tentries.push([\n\t\t\t\t\t\t\tKEYS.PERSIST_DATA,\n\t\t\t\t\t\t\tACTOR_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\t\t\t\tbareData,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Build connection entries\n\t\t\t\t\tconst connections: Array<AnyConn> = [];\n\t\t\t\t\tfor (const connId of this.#actor.connectionManager\n\t\t\t\t\t\t.connsWithPersistChanged) {\n\t\t\t\t\t\tconst conn = this.#actor.conns.get(connId);\n\t\t\t\t\t\tif (!conn) {\n\t\t\t\t\t\t\tthis.#actor.rLog.warn({\n\t\t\t\t\t\t\t\tmsg: \"connection not found in conns map\",\n\t\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst connStateManager =\n\t\t\t\t\t\t\tconn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\t\t\t\tconst hibernatableDataRaw =\n\t\t\t\t\t\t\tconnStateManager.hibernatableDataRaw;\n\t\t\t\t\t\tif (!hibernatableDataRaw) {\n\t\t\t\t\t\t\tthis.#actor.log.warn({\n\t\t\t\t\t\t\t\tmsg: \"missing raw hibernatable data for conn in getChangedConnectionsData\",\n\t\t\t\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\t\tmsg: \"persisting connection\",\n\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\tgatewayId: idToStr(hibernatableDataRaw.requestId),\n\t\t\t\t\t\t\trequestId: idToStr(hibernatableDataRaw.requestId),\n\t\t\t\t\t\t\tserverMessageIndex:\n\t\t\t\t\t\t\t\thibernatableDataRaw.serverMessageIndex,\n\t\t\t\t\t\t\tclientMessageIndex:\n\t\t\t\t\t\t\t\thibernatableDataRaw.clientMessageIndex,\n\t\t\t\t\t\t\thasState: hibernatableDataRaw.state !== undefined,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst bareData = convertConnToBarePersistedConn<CP, CS>(\n\t\t\t\t\t\t\thibernatableDataRaw,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst connData =\n\t\t\t\t\t\t\tCONN_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\t\t\t\tbareData,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\tentries.push([makeConnKey(connId), connData]);\n\t\t\t\t\t\tconnections.push(conn);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\tmsg: \"prepared entries for kvBatchPut\",\n\t\t\t\t\t\ttotalEntries: entries.length,\n\t\t\t\t\t\tconnectionEntries: connections.length,\n\t\t\t\t\t\tconnectionIds: connections.map((c) => c.id),\n\t\t\t\t\t});\n\n\t\t\t\t\t// Notify driver before persisting connections\n\t\t\t\t\tif (this.#actorDriver.onBeforePersistConn) {\n\t\t\t\t\t\tfor (const conn of connections) {\n\t\t\t\t\t\t\tthis.#actorDriver.onBeforePersistConn(conn);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clear changed connections\n\t\t\t\t\tthis.#actor.connectionManager.clearConnWithPersistChanged();\n\n\t\t\t\t\t// Write data\n\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\tmsg: \"calling kvBatchPut\",\n\t\t\t\t\t\tactorId: this.#actor.id,\n\t\t\t\t\t\tentriesCount: entries.length,\n\t\t\t\t\t});\n\t\t\t\t\tawait this.#actorDriver.kvBatchPut(this.#actor.id, entries);\n\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\tmsg: \"kvBatchPut completed successfully\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Notify driver after persisting connections\n\t\t\t\t\tif (this.#actorDriver.onAfterPersistConn) {\n\t\t\t\t\t\tfor (const conn of connections) {\n\t\t\t\t\t\t\tthis.#actorDriver.onAfterPersistConn(conn);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#actor.rLog.debug({ msg: \"persist saved\" });\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\tmsg: \"savePersistInner skipped - no changes\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.#onPersistSavedPromise?.resolve();\n\t\t} catch (error) {\n\t\t\tthis.#actor.rLog.error({\n\t\t\t\tmsg: \"error saving persist\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tthis.#onPersistSavedPromise?.reject(error);\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n","import type { RegistryConfig } from \"@/registry/config\";\nimport type { Actions, ActorConfig } from \"./config\";\nimport type { ActionContext } from \"./contexts/action\";\nimport type { ActorContext } from \"./contexts/actor\";\nimport type { AnyDatabaseProvider } from \"./database\";\nimport { ActorInstance } from \"./instance/mod\";\n\nexport type AnyActorDefinition = ActorDefinition<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\n/**\n * Extracts the context type from an ActorDefinition\n */\nexport type ActorContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB,\n\t\tany\n\t>\n\t\t? ActorContext<S, CP, CS, V, I, DB>\n\t\t: never;\n\n/**\n * Extracts the context type from an ActorDefinition\n */\nexport type ActionContextOf<AD extends AnyActorDefinition> =\n\tAD extends ActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB,\n\t\tany\n\t>\n\t\t? ActionContext<S, CP, CS, V, I, DB>\n\t\t: never;\n\nexport class ActorDefinition<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tR extends Actions<S, CP, CS, V, I, DB>,\n> {\n\t#config: ActorConfig<S, CP, CS, V, I, DB>;\n\n\tconstructor(config: ActorConfig<S, CP, CS, V, I, DB>) {\n\t\tthis.#config = config;\n\t}\n\n\tget config(): ActorConfig<S, CP, CS, V, I, DB> {\n\t\treturn this.#config;\n\t}\n\n\tinstantiate(): ActorInstance<S, CP, CS, V, I, DB> {\n\t\treturn new ActorInstance(this.#config);\n\t}\n}\n\nexport function lookupInRegistry(\n\tregistryConfig: RegistryConfig,\n\tname: string,\n): AnyActorDefinition {\n\t// Build actor\n\tconst definition = registryConfig.use[name];\n\tif (!definition) throw new Error(`no actor in registry for name ${name}`);\n\treturn definition;\n}\n","import { MAX_CONN_PARAMS_SIZE } from \"@/common//network\";\n\nexport 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","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 {\n\tHEADER_CONN_PARAMS,\n\tHEADER_ENCODING,\n\tPATH_CONNECT,\n} from \"@/common/actor-router-consts\";\nimport { importEventSource } from \"@/common/eventsource\";\nimport type {\n\tUniversalErrorEvent,\n\tUniversalEventSource,\n\tUniversalMessageEvent,\n} from \"@/common/eventsource-interface\";\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\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 {\n\tdeserializeWithEncoding,\n\tencodingIsBinary,\n\tserializeWithEncoding,\n} from \"@/serde\";\nimport {\n\tbufferToArrayBuffer,\n\tgetEnvUniversal,\n\thttpUserAgent,\n\tpromiseWithResolvers,\n} from \"@/utils\";\nimport type { ActorDefinitionActions } from \"./actor-common\";\nimport { queryActor } from \"./actor-query\";\nimport { ACTOR_CONNS_SYMBOL, type ClientRaw } from \"./client\";\nimport * as errors from \"./errors\";\nimport { logger } from \"./log\";\nimport {\n\ttype WebSocketMessage as ConnMessage,\n\tmessageLength,\n\tsendHttpRequest,\n} from \"./utils\";\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\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#connecting = false;\n\n\t#actorId?: string;\n\t#connectionId?: 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\n\t#actionIdCounter = 0;\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\n\t\tthis.#keepNodeAliveInterval = setInterval(() => 60_000);\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}>();\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.\nenc\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\tasync #connectWithRetry() {\n\t\tthis.#connecting = true;\n\n\t\t// Attempt to reconnect indefinitely\n\t\ttry {\n\t\t\tawait pRetry(this.#connectAndWait.bind(this), {\n\t\t\t\tforever: true,\n\t\t\t\tminTimeout: 250,\n\t\t\t\tmaxTimeout: 30_000,\n\n\t\t\t\tonFailedAttempt: (error) => {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"failed to reconnect\",\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\n\t\t\t\t// Cancel retry if aborted\n\t\t\t\tsignal: this.#abortController.signal,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tif ((err as Error).name === \"AbortError\") {\n\t\t\t\t// Ignore abortions\n\t\t\t\tlogger().info({ msg: \"connection retry aborted\" });\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\t// Unknown error\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\tthis.#connecting = false;\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();\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\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\tconnectionId: this.#connectionId,\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\tconnectionId: this.#connectionId,\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\", (ev) => {\n\t\t\ttry {\n\t\t\t\tthis.#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\tlogger().debug({\n\t\t\tmsg: \"socket open\",\n\t\t\tmessageQueueLength: this.#messageQueue.length,\n\t\t\tconnectionId: this.#connectionId,\n\t\t});\n\n\t\t// Resolve open promise\n\t\tif (this.#onOpenPromise) {\n\t\t\tthis.#onOpenPromise.resolve(undefined);\n\t\t} else {\n\t\t\tlogger().warn({ msg: \"#onOpenPromise is undefined\" });\n\t\t}\n\n\t\t// Resubscribe to all active events\n\t\tfor (const eventName of this.#eventSubscriptions.keys()) {\n\t\t\tthis.#sendSubscription(eventName, true);\n\t\t}\n\n\t\t// Flush queue\n\t\t//\n\t\t// If the message fails to send, the message will be re-queued\n\t\tconst queue = this.#messageQueue;\n\t\tthis.#messageQueue = [];\n\t\tlogger().debug({\n\t\t\tmsg: \"flushing message queue\",\n\t\t\tqueueLength: queue.length,\n\t\t});\n\t\tfor (const msg of queue) {\n\t\t\tthis.#sendMessage(msg);\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\tgetEnvUniversal(\"_RIVETKIT_LOG_MESSAGE\")\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.#connectionId = 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\tconnectionId: this.#connectionId,\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// Create a connection error\n\t\t\t\tconst actorError = 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\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(actorError);\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(actorError);\n\t\t\t\t\tthis.#actionsInFlight.delete(id);\n\t\t\t\t}\n\n\t\t\t\t// Dispatch to error handler if registered\n\t\t\t\tthis.#dispatchActorError(actorError);\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\t#handleOnClose(event: Event | CloseEvent) {\n\t\t// TODO: Handle queue\n\t\t// TODO: Reconnect with backoff\n\n\t\t// We can't use `event instanceof CloseEvent` because it's not defined in NodeJS\n\t\t//\n\t\t// These properties will be undefined\n\t\tconst closeEvent = event as CloseEvent;\n\t\tconst wasClean = closeEvent.wasClean;\n\n\t\t// Reject open promise\n\t\tif (this.#onOpenPromise) {\n\t\t\tthis.#onOpenPromise.reject(\n\t\t\t\tnew Error(\n\t\t\t\t\t`websocket closed with code ${closeEvent.code}: ${closeEvent.reason}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\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: wasClean,\n\t\t\tconnectionId: this.#connectionId,\n\t\t\tmessageQueueLength: this.#messageQueue.length,\n\t\t\tactionsInFlight: this.#actionsInFlight.size,\n\t\t});\n\n\t\t// Reject all in-flight actions\n\t\tif (this.#actionsInFlight.size > 0) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"rejecting in-flight actions after disconnect\",\n\t\t\t\tcount: this.#actionsInFlight.size,\n\t\t\t\tconnectionId: this.#connectionId,\n\t\t\t\twasClean,\n\t\t\t});\n\n\t\t\tconst disconnectError = new Error(\n\t\t\t\t`${wasClean ? \"Connection closed\" : \"Connection lost\"} (code: ${closeEvent.code}, reason: ${closeEvent.reason})`,\n\t\t\t);\n\n\t\t\tfor (const actionInfo of this.#actionsInFlight.values()) {\n\t\t\t\tactionInfo.reject(disconnectError);\n\t\t\t}\n\t\t\tthis.#actionsInFlight.clear();\n\t\t}\n\n\t\tthis.#websocket = undefined;\n\n\t\t// Automatically reconnect. Skip if already attempting to connect.\n\t\tif (!this.#disposed && !this.#connecting) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"triggering reconnect\",\n\t\t\t\tconnectionId: this.#connectionId,\n\t\t\t\tmessageQueueLength: this.#messageQueue.length,\n\t\t\t});\n\t\t\t// TODO: Fetch actor to check if it's destroyed\n\t\t\t// TODO: Add backoff for reconnect\n\t\t\t// TODO: Add a way of preserving connection ID for connection state\n\n\t\t\t// Attempt to connect again\n\t\t\tthis.#connectWithRetry();\n\t\t}\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#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\tthrow new errors.ActorConnDisposed();\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\tconnectionId: this.#connectionId,\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 (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\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\tconnectionId: this.#connectionId,\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\tconnectionId: this.#connectionId,\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 connectionId(): string | undefined {\n\t\treturn this.#connectionId;\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// Clear interval so NodeJS process can exit\n\t\tclearInterval(this.#keepNodeAliveInterval);\n\n\t\t// Abort\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// Disconnect websocket cleanly\n\t\tif (this.#websocket) {\n\t\t\tlogger().debug(\"closing ws\");\n\n\t\t\tconst ws = this.#websocket;\n\t\t\t// Check if WebSocket is already closed or closing\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\tlogger().debug({ msg: \"ws already closed or closing\" });\n\t\t\t} else {\n\t\t\t\tconst { promise, resolve } = promiseWithResolvers();\n\t\t\t\tws.addEventListener(\"close\", () => {\n\t\t\t\t\tlogger().debug({ msg: \"ws closed\" });\n\t\t\t\t\tresolve(undefined);\n\t\t\t\t});\n\t\t\t\tws.close(1000, \"Normal closure\");\n\t\t\t\tawait promise;\n\t\t\t}\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 type { Context as HonoContext } from \"hono\";\nimport * as errors from \"@/actor/errors\";\nimport type { ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\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","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\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 { queryActor } from \"./actor-query\";\nimport { type ClientRaw, CREATE_ACTOR_CONN_PROXY } from \"./client\";\nimport { ActorError } from \"./errors\";\nimport { logger } from \"./log\";\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\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}\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// return await this.#driver.action<Args, Response>(\n\t\t// \tundefined,\n\t\t// \tthis.#actorQuery,\n\t\t// \tthis.#encodingKind,\n\t\t// \tthis.#params,\n\t\t// \topts.name,\n\t\t// \topts.args,\n\t\t// \t{ signal: opts.signal },\n\t\t// );\n\t\ttry {\n\t\t\t// Get the actor 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\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\trequestVersionedDataHandler: HTTP_ACTION_REQUEST_VERSIONED,\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\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 * Makes a raw HTTP request to the actor.\n\t *\n\t * @param input - The URL, path, or Request object\n\t * @param init - Standard fetch RequestInit options\n\t * @returns Promise<Response> - The raw HTTP response\n\t */\n\tasync fetch(\n\t\tinput: string | URL | Request,\n\t\tinit?: RequestInit,\n\t): Promise<Response> {\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 * Creates a raw WebSocket connection to the actor.\n\t *\n\t * @param path - The path for the WebSocket connection (e.g., \"stream\")\n\t * @param protocols - Optional WebSocket subprotocols\n\t * @returns WebSocket - A raw WebSocket connection\n\t */\n\tasync websocket(\n\t\tpath?: string,\n\t\tprotocols?: string | string[],\n\t): Promise<WebSocket> {\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\t * @returns {Promise<string>} - A promise that resolves to the actor's ID\n\t */\n\tasync resolve({ signal }: { signal?: AbortSignal } = {}): Promise<string> {\n\t\tif (\n\t\t\t\"getForKey\" in this.#actorQuery ||\n\t\t\t\"getOrCreateForKey\" in this.#actorQuery\n\t\t) {\n\t\t\t// TODO:\n\t\t\tlet name: string;\n\t\t\tif (\"getForKey\" in this.#actorQuery) {\n\t\t\t\tname = this.#actorQuery.getForKey.name;\n\t\t\t} else if (\"getOrCreateForKey\" in this.#actorQuery) {\n\t\t\t\tname = this.#actorQuery.getOrCreateForKey.name;\n\t\t\t} else {\n\t\t\t\tassertUnreachable(this.#actorQuery);\n\t\t\t}\n\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\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\tfor (const [key, value] of initHeaders) {\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 * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport type { z } from \"zod\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport type { VersionedDataHandler } from \"@/common/versioned-data\";\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 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\tresponseVersionedDataHandler:\n\t\t| VersionedDataHandler<ResponseBare>\n\t\t| 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.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 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/mod\";\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, config: ClientConfig) {\n\t\tthis.#driver = driver;\n\n\t\tthis.#encodingKind = config.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: ClientConfig,\n): Client<A> {\n\tconst client = new ClientRaw(driver, config);\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\") {\n\t\t\t\treturn true;\n\t\t\t}\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 * as cbor from \"cbor-x\";\nimport type { Context as HonoContext } from \"hono\";\nimport invariant from \"invariant\";\nimport { deserializeActorKey, serializeActorKey } from \"@/actor/keys\";\nimport { generateRandomString } from \"@/actor/utils\";\nimport type { ClientConfig } from \"@/client/client\";\nimport type { MetadataResponse } from \"@/common/router\";\nimport { noopNext, stringifyError } 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 { Encoding, UniversalWebSocket } from \"@/mod\";\nimport { uint8ArrayToBase64 } from \"@/serde\";\nimport { combineUrlPath, getEnvUniversal } from \"@/utils\";\nimport { sendHttpRequestToActor } from \"./actor-http-client\";\nimport {\n\tbuildWebSocketProtocols,\n\topenWebSocketToActor,\n} from \"./actor-websocket-client\";\nimport {\n\tcreateActor,\n\tdestroyActor,\n\tgetActor,\n\tgetActorByKey,\n\tgetMetadata,\n\tgetOrCreateActor,\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 (getEnvUniversal(\"NEXT_PHASE\") === \"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\tlogger().info({\n\t\t\t\t\t\t\tmsg: \"overriding cached client endpoint\",\n\t\t\t\t\t\t\tendpoint: metadataData.clientEndpoint,\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\tconst keyRaw = actor.key;\n\t\tinvariant(keyRaw, `actor ${actorId} should have key`);\n\t\tconst key = deserializeActorKey(keyRaw);\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t};\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\tconst actorId = actor.actor_id;\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"getWithKey: found actor via api\",\n\t\t\t\tactorId,\n\t\t\t\tname,\n\t\t\t\tkey,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tactorId,\n\t\t\t\tname,\n\t\t\t\tkey,\n\t\t\t};\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\tconst actorId = actor.actor_id;\n\n\t\tlogger().info({\n\t\t\tmsg: \"getOrCreateWithKey: actor ready\",\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t\tcreated,\n\t\t});\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t};\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\t\tconst actorId = result.actor.actor_id;\n\n\t\tlogger().info({ msg: \"actor created\", actorId, name, key });\n\n\t\treturn {\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t};\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((actor) => ({\n\t\t\tactorId: actor.actor_id,\n\t\t\tname: actor.name,\n\t\t\tkey: deserializeActorKey(actor.key),\n\t\t\tcreateTs: actor.create_ts,\n\t\t}));\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 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\tdisplayInformation(): ManagerDisplayInformation {\n\t\treturn { name: \"Remote\", properties: {} };\n\t}\n\n\tgetOrCreateInspectorAccessToken() {\n\t\treturn generateRandomString();\n\t}\n}\n","import { z } from \"zod\";\nimport type { ClientConfig } from \"@/client/config\";\nimport { sendHttpRequest } from \"@/client/utils\";\nimport { combineUrlPath } from \"@/utils\";\nimport { logger } from \"./log\";\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\nexport function getEndpoint(config: ClientConfig) {\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\tresponseVersionedDataHandler: 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 { getLogger } from \"@/common//log\";\n\nexport function logger() {\n\treturn getLogger(\"remote-manager-driver\");\n}\n","import type { ClientConfig } from \"@/client/config\";\nimport { HEADER_RIVET_TOKEN } from \"@/common/actor-router-consts\";\nimport { combineUrlPath } from \"@/utils\";\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 = combineUrlPath(\n\t\tendpoint,\n\t\t`/gateway/${actorId}${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\tfor (const [key, value] of actorRequest.headers.entries()) {\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);\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 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 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 = combineUrlPath(endpoint, `/gateway/${actorId}${path}`);\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 { 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 RunnerConfigRequest {\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};\n\t\t}\n\t>;\n}\n\nexport async function updateRunnerConfig(\n\tconfig: ClientConfig,\n\trunnerName: string,\n\trequest: RunnerConfigRequest,\n): Promise<void> {\n\treturn apiCall<RunnerConfigRequest, void>(\n\t\tconfig,\n\t\t\"PUT\",\n\t\t`/runner-configs/${runnerName}`,\n\t\trequest,\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\tlogger().warn({\n\t\t\t\t\tmsg: \"failed to fetch metadata, retrying\",\n\t\t\t\t\tendpoint,\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\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"],"mappings":"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","names":["invariant","z","assertUnreachable","cbor","cbor","bare","message","invariant","invariant","cbor","cbor","cbor","config","onChange","StateManager","config","onChange","CanSleep","config","invariant","StateManager","assertUnreachable","conn","res","config","InternalError","cbor","invariant","cbor","invariant","invariant","invariant","cbor","invariant","invariant","contentType","bare","invariant","bare","assertUnreachable","config","id","InternalError","invariant","cbor","invariant","z","logger","config","logger","z","WebSocket","logger","config","pRetry","config","pRetry","logger","WebSocket","logger","event","logger","invariant"]}