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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/inspector/protocol/actor.ts","../../src/inspector/protocol/manager.ts","../../src/inspector/utils.ts","../../src/inspector/log.ts"],"sourcesContent":["import { hc } from \"hono/client\";\nimport type { createActorInspectorRouter } from \"../actor\";\n\ntype ActorInspectorRouter = ReturnType<typeof createActorInspectorRouter>;\nconst client = hc<ActorInspectorRouter>(\"\");\nexport type ActorInspectorClient = typeof client;\n\nexport const createActorInspectorClient = (\n\t...args: Parameters<typeof hc>\n): ActorInspectorClient => hc<ActorInspectorRouter>(...args);\n","import { hc } from \"hono/client\";\nimport type { createManagerInspectorRouter } from \"../manager\";\n\ntype ManagerInspectorRouter = ReturnType<typeof createManagerInspectorRouter>;\nconst client = hc<ManagerInspectorRouter>(\"\");\nexport type ManagerInspectorClient = typeof client;\n\nexport const createManagerInspectorClient = (\n\t...args: Parameters<typeof hc>\n): ManagerInspectorClient => hc<ManagerInspectorRouter>(...args);\n","import crypto from \"node:crypto\";\nimport { createMiddleware } from \"hono/factory\";\nimport type { ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { RunConfig } from \"@/mod\";\nimport type { RunnerConfigInput } from \"@/registry/run-config\";\nimport { inspectorLogger } from \"./log\";\n\nexport function compareSecrets(providedSecret: string, validSecret: string) {\n\t// Early length check to avoid unnecessary processing\n\tif (providedSecret.length !== validSecret.length) {\n\t\treturn false;\n\t}\n\n\tconst encoder = new TextEncoder();\n\n\tconst a = encoder.encode(providedSecret);\n\tconst b = encoder.encode(validSecret);\n\n\tif (a.byteLength !== b.byteLength) {\n\t\treturn false;\n\t}\n\n\t// Perform timing-safe comparison\n\tif (!crypto.timingSafeEqual(a, b)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport const secureInspector = (runConfig: RunConfig) =>\n\tcreateMiddleware(async (c, next) => {\n\t\tconst userToken = c.req.header(\"Authorization\")?.replace(\"Bearer \", \"\");\n\t\tif (!userToken) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\n\t\tconst inspectorToken = runConfig.inspector.token?.();\n\t\tif (!inspectorToken) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\n\t\tconst isValid = compareSecrets(userToken, inspectorToken);\n\n\t\tif (!isValid) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\t\tawait next();\n\t});\n\nexport function getInspectorUrl(runConfig: RunnerConfigInput | undefined) {\n\tif (!runConfig?.inspector?.enabled) {\n\t\treturn \"disabled\";\n\t}\n\n\tconst accessToken = runConfig?.inspector?.token?.();\n\n\tif (!accessToken) {\n\t\tinspectorLogger().warn(\n\t\t\t\"Inspector Token is not set, but Inspector is enabled. Please set it in the run configuration `inspector.token` or via `RIVETKIT_INSPECTOR_TOKEN` environment variable. Inspector will not be accessible.\",\n\t\t);\n\t\treturn \"disabled\";\n\t}\n\n\tconst url = new URL(\"https://inspect.rivet.dev\");\n\n\turl.searchParams.set(\"t\", accessToken);\n\n\tconst overrideDefaultEndpoint =\n\t\trunConfig?.inspector?.defaultEndpoint ??\n\t\trunConfig.overrideServerAddress;\n\tif (overrideDefaultEndpoint) {\n\t\turl.searchParams.set(\"u\", overrideDefaultEndpoint);\n\t}\n\n\treturn url.href;\n}\n\nexport const isInspectorEnabled = (\n\trunConfig: RunConfig,\n\tcontext: \"actor\" | \"manager\",\n) => {\n\tif (typeof runConfig.inspector?.enabled === \"boolean\") {\n\t\treturn runConfig.inspector.enabled;\n\t} else if (typeof runConfig.inspector?.enabled === \"object\") {\n\t\treturn runConfig.inspector.enabled[context];\n\t}\n\treturn false;\n};\n\nexport const configureInspectorAccessToken = (\n\trunConfig: RunConfig,\n\tmanagerDriver: ManagerDriver,\n) => {\n\tif (!runConfig.inspector?.token()) {\n\t\tconst token = managerDriver.getOrCreateInspectorAccessToken();\n\t\trunConfig.inspector.token = () => token;\n\t}\n};\n","import { getLogger } from \"@/common/log\";\n\nexport function inspectorLogger() {\n\treturn getLogger(\"inspector\");\n}\n"],"mappings":";;;;;AAAA,SAAS,UAAU;AAInB,IAAM,SAAS,GAAyB,EAAE;AAGnC,IAAM,6BAA6B,IACtC,SACuB,GAAyB,GAAG,IAAI;;;ACT3D,SAAS,MAAAA,WAAU;AAInB,IAAMC,UAASD,IAA2B,EAAE;AAGrC,IAAM,+BAA+B,IACxC,SACyBA,IAA2B,GAAG,IAAI;;;ACT/D,OAAO,YAAY;AACnB,SAAS,wBAAwB;;;ACC1B,SAAS,kBAAkB;AACjC,SAAO,UAAU,WAAW;AAC7B;;;ADGO,SAAS,eAAe,gBAAwB,aAAqB;AAE3E,MAAI,eAAe,WAAW,YAAY,QAAQ;AACjD,WAAO;AAAA,EACR;AAEA,QAAM,UAAU,IAAI,YAAY;AAEhC,QAAM,IAAI,QAAQ,OAAO,cAAc;AACvC,QAAM,IAAI,QAAQ,OAAO,WAAW;AAEpC,MAAI,EAAE,eAAe,EAAE,YAAY;AAClC,WAAO;AAAA,EACR;AAGA,MAAI,CAAC,OAAO,gBAAgB,GAAG,CAAC,GAAG;AAClC,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAEO,IAAM,kBAAkB,CAAC,cAC/B,iBAAiB,OAAO,GAAG,SAAS;AA9BrC;AA+BE,QAAM,aAAY,OAAE,IAAI,OAAO,eAAe,MAA5B,mBAA+B,QAAQ,WAAW;AACpE,MAAI,CAAC,WAAW;AACf,WAAO,EAAE,KAAK,gBAAgB,GAAG;AAAA,EAClC;AAEA,QAAM,kBAAiB,qBAAU,WAAU,UAApB;AACvB,MAAI,CAAC,gBAAgB;AACpB,WAAO,EAAE,KAAK,gBAAgB,GAAG;AAAA,EAClC;AAEA,QAAM,UAAU,eAAe,WAAW,cAAc;AAExD,MAAI,CAAC,SAAS;AACb,WAAO,EAAE,KAAK,gBAAgB,GAAG;AAAA,EAClC;AACA,QAAM,KAAK;AACZ,CAAC;AAEK,SAAS,gBAAgB,WAA0C;AAjD1E;AAkDC,MAAI,GAAC,4CAAW,cAAX,mBAAsB,UAAS;AACnC,WAAO;AAAA,EACR;AAEA,QAAM,eAAc,kDAAW,cAAX,mBAAsB,UAAtB;AAEpB,MAAI,CAAC,aAAa;AACjB,oBAAgB,EAAE;AAAA,MACjB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAEA,QAAM,MAAM,IAAI,IAAI,2BAA2B;AAE/C,MAAI,aAAa,IAAI,KAAK,WAAW;AAErC,QAAM,4BACL,4CAAW,cAAX,mBAAsB,oBACtB,UAAU;AACX,MAAI,yBAAyB;AAC5B,QAAI,aAAa,IAAI,KAAK,uBAAuB;AAAA,EAClD;AAEA,SAAO,IAAI;AACZ;AAEO,IAAM,qBAAqB,CACjC,WACA,YACI;AAhFL;AAiFC,MAAI,SAAO,eAAU,cAAV,mBAAqB,aAAY,WAAW;AACtD,WAAO,UAAU,UAAU;AAAA,EAC5B,WAAW,SAAO,eAAU,cAAV,mBAAqB,aAAY,UAAU;AAC5D,WAAO,UAAU,UAAU,QAAQ,OAAO;AAAA,EAC3C;AACA,SAAO;AACR;AAEO,IAAM,gCAAgC,CAC5C,WACA,kBACI;AA5FL;AA6FC,MAAI,GAAC,eAAU,cAAV,mBAAqB,UAAS;AAClC,UAAM,QAAQ,cAAc,gCAAgC;AAC5D,cAAU,UAAU,QAAQ,MAAM;AAAA,EACnC;AACD;","names":["hc","client"]}
@@ -1,178 +0,0 @@
1
- import type { ActorKey } from "@/actor/mod";
2
- import type { Client } from "@/client/client";
3
- import type { Logger } from "@/common/log";
4
- import type { Registry } from "@/registry/mod";
5
- import type { Conn, ConnId } from "./conn";
6
- import type { ActorContext } from "./context";
7
- import type { AnyDatabaseProvider, InferDatabaseClient } from "./database";
8
- import type { SaveStateOptions } from "./instance";
9
- import type { Schedule } from "./schedule";
10
-
11
- /**
12
- * Context for a remote procedure call.
13
- *
14
- * @typeParam A Actor this action belongs to
15
- */
16
- export class ActionContext<
17
- TState,
18
- TConnParams,
19
- TConnState,
20
- TVars,
21
- TInput,
22
- TDatabase extends AnyDatabaseProvider,
23
- > {
24
- #actorContext: ActorContext<
25
- TState,
26
- TConnParams,
27
- TConnState,
28
- TVars,
29
- TInput,
30
- TDatabase
31
- >;
32
-
33
- /**
34
- * Should not be called directly.
35
- *
36
- * @param actorContext - The actor context
37
- * @param conn - The connection associated with the action
38
- */
39
- constructor(
40
- actorContext: ActorContext<
41
- TState,
42
- TConnParams,
43
- TConnState,
44
- TVars,
45
- TInput,
46
- TDatabase
47
- >,
48
- public readonly conn: Conn<
49
- TState,
50
- TConnParams,
51
- TConnState,
52
- TVars,
53
- TInput,
54
- TDatabase
55
- >,
56
- ) {
57
- this.#actorContext = actorContext;
58
- }
59
-
60
- /**
61
- * Get the actor state
62
- */
63
- get state(): TState {
64
- return this.#actorContext.state;
65
- }
66
-
67
- /**
68
- * Get the actor variables
69
- */
70
- get vars(): TVars {
71
- return this.#actorContext.vars;
72
- }
73
-
74
- /**
75
- * Broadcasts an event to all connected clients.
76
- */
77
- broadcast(name: string, ...args: any[]): void {
78
- this.#actorContext.broadcast(name, ...args);
79
- }
80
-
81
- /**
82
- * Gets the logger instance.
83
- */
84
- get log(): Logger {
85
- return this.#actorContext.log;
86
- }
87
-
88
- /**
89
- * Gets actor ID.
90
- */
91
- get actorId(): string {
92
- return this.#actorContext.actorId;
93
- }
94
-
95
- /**
96
- * Gets the actor name.
97
- */
98
- get name(): string {
99
- return this.#actorContext.name;
100
- }
101
-
102
- /**
103
- * Gets the actor key.
104
- */
105
- get key(): ActorKey {
106
- return this.#actorContext.key;
107
- }
108
-
109
- /**
110
- * Gets the region.
111
- */
112
- get region(): string {
113
- return this.#actorContext.region;
114
- }
115
-
116
- /**
117
- * Gets the scheduler.
118
- */
119
- get schedule(): Schedule {
120
- return this.#actorContext.schedule;
121
- }
122
-
123
- /**
124
- * Gets the map of connections.
125
- */
126
- get conns(): Map<
127
- ConnId,
128
- Conn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>
129
- > {
130
- return this.#actorContext.conns;
131
- }
132
-
133
- /**
134
- * Returns the client for the given registry.
135
- */
136
- client<R extends Registry<any>>(): Client<R> {
137
- return this.#actorContext.client<R>();
138
- }
139
-
140
- /**
141
- * @experimental
142
- */
143
- get db(): InferDatabaseClient<TDatabase> {
144
- return this.#actorContext.db;
145
- }
146
-
147
- /**
148
- * Forces the state to get saved.
149
- */
150
- async saveState(opts: SaveStateOptions): Promise<void> {
151
- return this.#actorContext.saveState(opts);
152
- }
153
-
154
- /**
155
- * Prevents the actor from sleeping until promise is complete.
156
- */
157
- waitUntil(promise: Promise<void>): void {
158
- this.#actorContext.waitUntil(promise);
159
- }
160
-
161
- /**
162
- * AbortSignal that fires when the actor is stopping.
163
- */
164
- get abortSignal(): AbortSignal {
165
- return this.#actorContext.abortSignal;
166
- }
167
-
168
- /**
169
- * Forces the actor to sleep.
170
- *
171
- * Not supported on all drivers.
172
- *
173
- * @experimental
174
- */
175
- sleep() {
176
- this.#actorContext.sleep();
177
- }
178
- }
@@ -1,216 +0,0 @@
1
- import type { SSEStreamingApi } from "hono/streaming";
2
- import type { WSContext } from "hono/ws";
3
- import type { WebSocket } from "ws";
4
- import type { AnyConn } from "@/actor/conn";
5
- import type { AnyActorInstance } from "@/actor/instance";
6
- import type { CachedSerializer, Encoding } from "@/actor/protocol/serde";
7
- import { encodeDataToString } from "@/actor/protocol/serde";
8
- import type { HonoWebSocketAdapter } from "@/manager/hono-websocket-adapter";
9
- import type * as protocol from "@/schemas/client-protocol/mod";
10
- import { assertUnreachable, type promiseWithResolvers } from "@/utils";
11
-
12
- export enum ConnDriverKind {
13
- WEBSOCKET = 0,
14
- SSE = 1,
15
- HTTP = 2,
16
- }
17
-
18
- export enum ConnReadyState {
19
- UNKNOWN = -1,
20
- CONNECTING = 0,
21
- OPEN = 1,
22
- CLOSING = 2,
23
- CLOSED = 3,
24
- }
25
-
26
- export interface ConnDriverWebSocketState {
27
- encoding: Encoding;
28
- websocket: WSContext;
29
- closePromise: ReturnType<typeof promiseWithResolvers<void>>;
30
- }
31
-
32
- export interface ConnDriverSseState {
33
- encoding: Encoding;
34
- stream: SSEStreamingApi;
35
- }
36
-
37
- export type ConnDriverHttpState = Record<never, never>;
38
-
39
- export type ConnDriverState =
40
- | { [ConnDriverKind.WEBSOCKET]: ConnDriverWebSocketState }
41
- | { [ConnDriverKind.SSE]: ConnDriverSseState }
42
- | { [ConnDriverKind.HTTP]: ConnDriverHttpState };
43
-
44
- export interface ConnDriver<State> {
45
- sendMessage?(
46
- actor: AnyActorInstance,
47
- conn: AnyConn,
48
- state: State,
49
- message: CachedSerializer<protocol.ToClient>,
50
- ): void;
51
-
52
- /**
53
- * This returns a promise since we commonly disconnect at the end of a program, and not waiting will cause the socket to not close cleanly.
54
- */
55
- disconnect(
56
- actor: AnyActorInstance,
57
- conn: AnyConn,
58
- state: State,
59
- reason?: string,
60
- ): Promise<void>;
61
-
62
- /**
63
- * Returns the ready state of the connection.
64
- * This is used to determine if the connection is ready to send messages, or if the connection is stale.
65
- */
66
- getConnectionReadyState(
67
- actor: AnyActorInstance,
68
- conn: AnyConn,
69
- state: State,
70
- ): ConnReadyState | undefined;
71
- }
72
-
73
- // MARK: WebSocket
74
- const WEBSOCKET_DRIVER: ConnDriver<ConnDriverWebSocketState> = {
75
- sendMessage: (
76
- actor: AnyActorInstance,
77
- conn: AnyConn,
78
- state: ConnDriverWebSocketState,
79
- message: CachedSerializer<protocol.ToClient>,
80
- ) => {
81
- if (state.websocket.readyState !== ConnReadyState.OPEN) {
82
- actor.rLog.warn({
83
- msg: "attempting to send message to closed websocket, this is likely a bug in RivetKit",
84
- connId: conn.id,
85
- wsReadyState: state.websocket.readyState,
86
- });
87
- return;
88
- }
89
-
90
- const serialized = message.serialize(state.encoding);
91
-
92
- actor.rLog.debug({
93
- msg: "sending websocket message",
94
- encoding: state.encoding,
95
- dataType: typeof serialized,
96
- isUint8Array: serialized instanceof Uint8Array,
97
- isArrayBuffer: serialized instanceof ArrayBuffer,
98
- dataLength:
99
- (serialized as any).byteLength || (serialized as any).length,
100
- });
101
-
102
- // Convert Uint8Array to ArrayBuffer for proper transmission
103
- if (serialized instanceof Uint8Array) {
104
- const buffer = serialized.buffer.slice(
105
- serialized.byteOffset,
106
- serialized.byteOffset + serialized.byteLength,
107
- );
108
- // Handle SharedArrayBuffer case
109
- if (buffer instanceof SharedArrayBuffer) {
110
- const arrayBuffer = new ArrayBuffer(buffer.byteLength);
111
- new Uint8Array(arrayBuffer).set(new Uint8Array(buffer));
112
- actor.rLog.debug({
113
- msg: "converted SharedArrayBuffer to ArrayBuffer",
114
- byteLength: arrayBuffer.byteLength,
115
- });
116
- state.websocket.send(arrayBuffer);
117
- } else {
118
- actor.rLog.debug({
119
- msg: "sending ArrayBuffer",
120
- byteLength: buffer.byteLength,
121
- });
122
- state.websocket.send(buffer);
123
- }
124
- } else {
125
- actor.rLog.debug({
126
- msg: "sending string data",
127
- length: (serialized as string).length,
128
- });
129
- state.websocket.send(serialized);
130
- }
131
- },
132
-
133
- disconnect: async (
134
- _actor: AnyActorInstance,
135
- _conn: AnyConn,
136
- state: ConnDriverWebSocketState,
137
- reason?: string,
138
- ) => {
139
- // Close socket
140
- state.websocket.close(1000, reason);
141
-
142
- // Create promise to wait for socket to close gracefully
143
- await state.closePromise.promise;
144
- },
145
-
146
- getConnectionReadyState: (
147
- _actor: AnyActorInstance,
148
- _conn: AnyConn,
149
- state: ConnDriverWebSocketState,
150
- ): ConnReadyState | undefined => {
151
- return state.websocket.readyState;
152
- },
153
- };
154
-
155
- // MARK: SSE
156
- const SSE_DRIVER: ConnDriver<ConnDriverSseState> = {
157
- sendMessage: (
158
- _actor: AnyActorInstance,
159
- _conn: AnyConn,
160
- state: ConnDriverSseState,
161
- message: CachedSerializer<protocol.ToClient>,
162
- ) => {
163
- state.stream.writeSSE({
164
- data: encodeDataToString(message.serialize(state.encoding)),
165
- });
166
- },
167
-
168
- disconnect: async (
169
- _actor: AnyActorInstance,
170
- _conn: AnyConn,
171
- state: ConnDriverSseState,
172
- _reason?: string,
173
- ) => {
174
- state.stream.close();
175
- },
176
-
177
- getConnectionReadyState: (
178
- _actor: AnyActorInstance,
179
- _conn: AnyConn,
180
- state: ConnDriverSseState,
181
- ): ConnReadyState | undefined => {
182
- if (state.stream.aborted || state.stream.closed) {
183
- return ConnReadyState.CLOSED;
184
- }
185
-
186
- return ConnReadyState.OPEN;
187
- },
188
- };
189
-
190
- // MARK: HTTP
191
- const HTTP_DRIVER: ConnDriver<ConnDriverHttpState> = {
192
- getConnectionReadyState(_actor, _conn) {
193
- // TODO: This might not be the correct logic
194
- return ConnReadyState.OPEN;
195
- },
196
- disconnect: async () => {
197
- // Noop
198
- // TODO: Abort the request
199
- },
200
- };
201
-
202
- /** List of all connection drivers. */
203
- export const CONN_DRIVERS: Record<ConnDriverKind, ConnDriver<unknown>> = {
204
- [ConnDriverKind.WEBSOCKET]: WEBSOCKET_DRIVER,
205
- [ConnDriverKind.SSE]: SSE_DRIVER,
206
- [ConnDriverKind.HTTP]: HTTP_DRIVER,
207
- };
208
-
209
- export function getConnDriverKindFromState(
210
- state: ConnDriverState,
211
- ): ConnDriverKind {
212
- if (ConnDriverKind.WEBSOCKET in state) return ConnDriverKind.WEBSOCKET;
213
- else if (ConnDriverKind.SSE in state) return ConnDriverKind.SSE;
214
- else if (ConnDriverKind.HTTP in state) return ConnDriverKind.HTTP;
215
- else assertUnreachable(state);
216
- }
@@ -1,8 +0,0 @@
1
- import type { ConnDriverState } from "./conn-drivers";
2
-
3
- export interface ConnSocket {
4
- requestId: string;
5
- requestIdBuf?: ArrayBuffer;
6
- hibernatable: boolean;
7
- driverState: ConnDriverState;
8
- }
package/src/actor/conn.ts DELETED
@@ -1,272 +0,0 @@
1
- import * as cbor from "cbor-x";
2
- import invariant from "invariant";
3
- import { PersistedHibernatableWebSocket } from "@/schemas/actor-persist/mod";
4
- import type * as protocol from "@/schemas/client-protocol/mod";
5
- import { TO_CLIENT_VERSIONED } from "@/schemas/client-protocol/versioned";
6
- import { arrayBuffersEqual, bufferToArrayBuffer } from "@/utils";
7
- import {
8
- CONN_DRIVERS,
9
- ConnDriverKind,
10
- type ConnDriverState,
11
- ConnReadyState,
12
- getConnDriverKindFromState,
13
- } from "./conn-drivers";
14
- import type { ConnSocket } from "./conn-socket";
15
- import type { AnyDatabaseProvider } from "./database";
16
- import * as errors from "./errors";
17
- import { type ActorInstance, PERSIST_SYMBOL } from "./instance";
18
- import type { PersistedConn } from "./persisted";
19
- import { CachedSerializer } from "./protocol/serde";
20
- import { generateSecureToken } from "./utils";
21
-
22
- export function generateConnId(): string {
23
- return crypto.randomUUID();
24
- }
25
-
26
- export function generateConnToken(): string {
27
- return generateSecureToken(32);
28
- }
29
-
30
- export function generateConnRequestId(): string {
31
- return crypto.randomUUID();
32
- }
33
-
34
- export type ConnId = string;
35
-
36
- export type AnyConn = Conn<any, any, any, any, any, any>;
37
-
38
- export type ConnectionStatus = "connected" | "reconnecting";
39
-
40
- /**
41
- * Represents a client connection to a actor.
42
- *
43
- * Manages connection-specific data and controls the connection lifecycle.
44
- *
45
- * @see {@link https://rivet.dev/docs/connections|Connection Documentation}
46
- */
47
- export class Conn<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {
48
- subscriptions: Set<string> = new Set<string>();
49
-
50
- // TODO: Remove this cyclical reference
51
- #actor: ActorInstance<S, CP, CS, V, I, DB>;
52
-
53
- /**
54
- * The proxied state that notifies of changes automatically.
55
- *
56
- * Any data that should be stored indefinitely should be held within this object.
57
- */
58
- __persist: PersistedConn<CP, CS>;
59
-
60
- get __driverState(): ConnDriverState | undefined {
61
- return this.__socket?.driverState;
62
- }
63
-
64
- /**
65
- * Socket connected to this connection.
66
- *
67
- * If undefined, then nothing is connected to this.
68
- */
69
- __socket?: ConnSocket;
70
-
71
- get __status(): ConnectionStatus {
72
- // TODO: isHibernatible might be true while the actual hibernatable websocket has disconnected
73
- if (this.__socket || this.isHibernatable) {
74
- return "connected";
75
- } else {
76
- return "reconnecting";
77
- }
78
- }
79
-
80
- public get params(): CP {
81
- return this.__persist.params;
82
- }
83
-
84
- public get __stateEnabled() {
85
- return this.#actor.connStateEnabled;
86
- }
87
-
88
- /**
89
- * Gets the current state of the connection.
90
- *
91
- * Throws an error if the state is not enabled.
92
- */
93
- public get state(): CS {
94
- this.#validateStateEnabled();
95
- if (!this.__persist.state) throw new Error("state should exists");
96
- return this.__persist.state;
97
- }
98
-
99
- /**
100
- * Sets the state of the connection.
101
- *
102
- * Throws an error if the state is not enabled.
103
- */
104
- public set state(value: CS) {
105
- this.#validateStateEnabled();
106
- this.__persist.state = value;
107
- }
108
-
109
- /**
110
- * Unique identifier for the connection.
111
- */
112
- public get id(): ConnId {
113
- return this.__persist.connId;
114
- }
115
-
116
- /**
117
- * Token used to authenticate this request.
118
- */
119
- public get _token(): string {
120
- return this.__persist.token;
121
- }
122
-
123
- /**
124
- * Status of the connection.
125
- */
126
- public get status(): ConnectionStatus {
127
- return this.__status;
128
- }
129
-
130
- /**
131
- * @experimental
132
- *
133
- * If the underlying connection can hibernate.
134
- */
135
- public get isHibernatable(): boolean {
136
- if (!this.__persist.hibernatableRequestId) {
137
- return false;
138
- }
139
- return (
140
- this.#actor[PERSIST_SYMBOL].hibernatableWebSocket.findIndex((x) =>
141
- arrayBuffersEqual(
142
- x.requestId,
143
- this.__persist.hibernatableRequestId!,
144
- ),
145
- ) > -1
146
- );
147
- }
148
-
149
- /**
150
- * Timestamp of the last time the connection was seen, i.e. the last time the connection was active and checked for liveness.
151
- */
152
- public get lastSeen(): number {
153
- return this.__persist.lastSeen;
154
- }
155
-
156
- /**
157
- * Initializes a new instance of the Connection class.
158
- *
159
- * This should only be constructed by {@link Actor}.
160
- *
161
- * @protected
162
- */
163
- public constructor(
164
- actor: ActorInstance<S, CP, CS, V, I, DB>,
165
- persist: PersistedConn<CP, CS>,
166
- ) {
167
- this.#actor = actor;
168
- this.__persist = persist;
169
- }
170
-
171
- #validateStateEnabled() {
172
- if (!this.__stateEnabled) {
173
- throw new errors.ConnStateNotEnabled();
174
- }
175
- }
176
-
177
- /**
178
- * Sends a WebSocket message to the client.
179
- *
180
- * @param message - The message to send.
181
- *
182
- * @protected
183
- */
184
- public _sendMessage(message: CachedSerializer<protocol.ToClient>) {
185
- if (this.__driverState) {
186
- const driverKind = getConnDriverKindFromState(this.__driverState);
187
- const driver = CONN_DRIVERS[driverKind];
188
- if (driver.sendMessage) {
189
- driver.sendMessage(
190
- this.#actor,
191
- this,
192
- (this.__driverState as any)[driverKind],
193
- message,
194
- );
195
- } else {
196
- this.#actor.rLog.debug({
197
- msg: "conn driver does not support sending messages",
198
- conn: this.id,
199
- });
200
- }
201
- } else {
202
- this.#actor.rLog.warn({
203
- msg: "missing connection driver state for send message",
204
- conn: this.id,
205
- });
206
- }
207
- }
208
-
209
- /**
210
- * Sends an event with arguments to the client.
211
- *
212
- * @param eventName - The name of the event.
213
- * @param args - The arguments for the event.
214
- * @see {@link https://rivet.dev/docs/events|Events Documentation}
215
- */
216
- public send(eventName: string, ...args: unknown[]) {
217
- this.#actor.inspector.emitter.emit("eventFired", {
218
- type: "event",
219
- eventName,
220
- args,
221
- connId: this.id,
222
- });
223
- this._sendMessage(
224
- new CachedSerializer<protocol.ToClient>(
225
- {
226
- body: {
227
- tag: "Event",
228
- val: {
229
- name: eventName,
230
- args: bufferToArrayBuffer(cbor.encode(args)),
231
- },
232
- },
233
- },
234
- TO_CLIENT_VERSIONED,
235
- ),
236
- );
237
- }
238
-
239
- /**
240
- * Disconnects the client with an optional reason.
241
- *
242
- * @param reason - The reason for disconnection.
243
- */
244
- public async disconnect(reason?: string) {
245
- if (this.__socket && this.__driverState) {
246
- const driverKind = getConnDriverKindFromState(this.__driverState);
247
- const driver = CONN_DRIVERS[driverKind];
248
- if (driver.disconnect) {
249
- driver.disconnect(
250
- this.#actor,
251
- this,
252
- (this.__driverState as any)[driverKind],
253
- reason,
254
- );
255
- } else {
256
- this.#actor.rLog.debug({
257
- msg: "no disconnect handler for conn driver",
258
- conn: this.id,
259
- });
260
- }
261
-
262
- this.#actor.__connDisconnected(this, true, this.__socket.requestId);
263
- } else {
264
- this.#actor.rLog.warn({
265
- msg: "missing connection driver state for disconnect",
266
- conn: this.id,
267
- });
268
- }
269
-
270
- this.__socket = undefined;
271
- }
272
- }