rivetkit 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/dist/schemas/actor-persist/v1.ts +228 -0
  2. package/dist/schemas/client-protocol/v1.ts +429 -0
  3. package/dist/schemas/file-system-driver/v1.ts +102 -0
  4. package/dist/tsup/actor/errors.cjs +69 -0
  5. package/dist/tsup/actor/errors.cjs.map +1 -0
  6. package/dist/tsup/actor/errors.d.cts +143 -0
  7. package/dist/tsup/actor/errors.d.ts +143 -0
  8. package/dist/tsup/actor/errors.js +69 -0
  9. package/dist/tsup/actor/errors.js.map +1 -0
  10. package/dist/tsup/chunk-2CRLFV6Z.cjs +202 -0
  11. package/dist/tsup/chunk-2CRLFV6Z.cjs.map +1 -0
  12. package/dist/tsup/chunk-3H7O2A7I.js +525 -0
  13. package/dist/tsup/chunk-3H7O2A7I.js.map +1 -0
  14. package/dist/tsup/chunk-42I3OZ3Q.js +15 -0
  15. package/dist/tsup/chunk-42I3OZ3Q.js.map +1 -0
  16. package/dist/tsup/chunk-4NSUQZ2H.js +1790 -0
  17. package/dist/tsup/chunk-4NSUQZ2H.js.map +1 -0
  18. package/dist/tsup/chunk-6PDXBYI5.js +132 -0
  19. package/dist/tsup/chunk-6PDXBYI5.js.map +1 -0
  20. package/dist/tsup/chunk-6WKQDDUD.cjs +1790 -0
  21. package/dist/tsup/chunk-6WKQDDUD.cjs.map +1 -0
  22. package/dist/tsup/chunk-CTBOSFUH.cjs +116 -0
  23. package/dist/tsup/chunk-CTBOSFUH.cjs.map +1 -0
  24. package/dist/tsup/chunk-EGVZZFE2.js +2857 -0
  25. package/dist/tsup/chunk-EGVZZFE2.js.map +1 -0
  26. package/dist/tsup/chunk-FCCPJNMA.cjs +132 -0
  27. package/dist/tsup/chunk-FCCPJNMA.cjs.map +1 -0
  28. package/dist/tsup/chunk-FLMTTN27.js +244 -0
  29. package/dist/tsup/chunk-FLMTTN27.js.map +1 -0
  30. package/dist/tsup/chunk-GIR3AFFI.cjs +315 -0
  31. package/dist/tsup/chunk-GIR3AFFI.cjs.map +1 -0
  32. package/dist/tsup/chunk-INGJP237.js +315 -0
  33. package/dist/tsup/chunk-INGJP237.js.map +1 -0
  34. package/dist/tsup/chunk-KJCJLKRM.js +116 -0
  35. package/dist/tsup/chunk-KJCJLKRM.js.map +1 -0
  36. package/dist/tsup/chunk-KUPQZYUQ.cjs +15 -0
  37. package/dist/tsup/chunk-KUPQZYUQ.cjs.map +1 -0
  38. package/dist/tsup/chunk-O2MBYIXO.cjs +2857 -0
  39. package/dist/tsup/chunk-O2MBYIXO.cjs.map +1 -0
  40. package/dist/tsup/chunk-OGAPU3UG.cjs +525 -0
  41. package/dist/tsup/chunk-OGAPU3UG.cjs.map +1 -0
  42. package/dist/tsup/chunk-OV6AYD4S.js +4406 -0
  43. package/dist/tsup/chunk-OV6AYD4S.js.map +1 -0
  44. package/dist/tsup/chunk-PO4VLDWA.js +47 -0
  45. package/dist/tsup/chunk-PO4VLDWA.js.map +1 -0
  46. package/dist/tsup/chunk-R2OPSKIV.cjs +244 -0
  47. package/dist/tsup/chunk-R2OPSKIV.cjs.map +1 -0
  48. package/dist/tsup/chunk-TZJKSBUQ.cjs +47 -0
  49. package/dist/tsup/chunk-TZJKSBUQ.cjs.map +1 -0
  50. package/dist/tsup/chunk-UBUC5C3G.cjs +189 -0
  51. package/dist/tsup/chunk-UBUC5C3G.cjs.map +1 -0
  52. package/dist/tsup/chunk-UIM22YJL.cjs +4406 -0
  53. package/dist/tsup/chunk-UIM22YJL.cjs.map +1 -0
  54. package/dist/tsup/chunk-URVFQMYI.cjs +230 -0
  55. package/dist/tsup/chunk-URVFQMYI.cjs.map +1 -0
  56. package/dist/tsup/chunk-UVUPOS46.js +230 -0
  57. package/dist/tsup/chunk-UVUPOS46.js.map +1 -0
  58. package/dist/tsup/chunk-VRRHBNJC.js +189 -0
  59. package/dist/tsup/chunk-VRRHBNJC.js.map +1 -0
  60. package/dist/tsup/chunk-XFSS33EQ.js +202 -0
  61. package/dist/tsup/chunk-XFSS33EQ.js.map +1 -0
  62. package/dist/tsup/client/mod.cjs +32 -0
  63. package/dist/tsup/client/mod.cjs.map +1 -0
  64. package/dist/tsup/client/mod.d.cts +26 -0
  65. package/dist/tsup/client/mod.d.ts +26 -0
  66. package/dist/tsup/client/mod.js +32 -0
  67. package/dist/tsup/client/mod.js.map +1 -0
  68. package/dist/tsup/common/log.cjs +13 -0
  69. package/dist/tsup/common/log.cjs.map +1 -0
  70. package/dist/tsup/common/log.d.cts +20 -0
  71. package/dist/tsup/common/log.d.ts +20 -0
  72. package/dist/tsup/common/log.js +13 -0
  73. package/dist/tsup/common/log.js.map +1 -0
  74. package/dist/tsup/common/websocket.cjs +10 -0
  75. package/dist/tsup/common/websocket.cjs.map +1 -0
  76. package/dist/tsup/common/websocket.d.cts +3 -0
  77. package/dist/tsup/common/websocket.d.ts +3 -0
  78. package/dist/tsup/common/websocket.js +10 -0
  79. package/dist/tsup/common/websocket.js.map +1 -0
  80. package/dist/tsup/common-CpqORuCq.d.cts +218 -0
  81. package/dist/tsup/common-CpqORuCq.d.ts +218 -0
  82. package/dist/tsup/connection-BR_Ve4ku.d.cts +2117 -0
  83. package/dist/tsup/connection-BwUMoe6n.d.ts +2117 -0
  84. package/dist/tsup/driver-helpers/mod.cjs +33 -0
  85. package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
  86. package/dist/tsup/driver-helpers/mod.d.cts +18 -0
  87. package/dist/tsup/driver-helpers/mod.d.ts +18 -0
  88. package/dist/tsup/driver-helpers/mod.js +33 -0
  89. package/dist/tsup/driver-helpers/mod.js.map +1 -0
  90. package/dist/tsup/driver-test-suite/mod.cjs +4619 -0
  91. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
  92. package/dist/tsup/driver-test-suite/mod.d.cts +57 -0
  93. package/dist/tsup/driver-test-suite/mod.d.ts +57 -0
  94. package/dist/tsup/driver-test-suite/mod.js +4619 -0
  95. package/dist/tsup/driver-test-suite/mod.js.map +1 -0
  96. package/dist/tsup/inspector/mod.cjs +53 -0
  97. package/dist/tsup/inspector/mod.cjs.map +1 -0
  98. package/dist/tsup/inspector/mod.d.cts +408 -0
  99. package/dist/tsup/inspector/mod.d.ts +408 -0
  100. package/dist/tsup/inspector/mod.js +53 -0
  101. package/dist/tsup/inspector/mod.js.map +1 -0
  102. package/dist/tsup/mod.cjs +73 -0
  103. package/dist/tsup/mod.cjs.map +1 -0
  104. package/dist/tsup/mod.d.cts +100 -0
  105. package/dist/tsup/mod.d.ts +100 -0
  106. package/dist/tsup/mod.js +73 -0
  107. package/dist/tsup/mod.js.map +1 -0
  108. package/dist/tsup/router-endpoints-AYkXG8Tl.d.cts +66 -0
  109. package/dist/tsup/router-endpoints-DAbqVFx2.d.ts +66 -0
  110. package/dist/tsup/test/mod.cjs +21 -0
  111. package/dist/tsup/test/mod.cjs.map +1 -0
  112. package/dist/tsup/test/mod.d.cts +27 -0
  113. package/dist/tsup/test/mod.d.ts +27 -0
  114. package/dist/tsup/test/mod.js +21 -0
  115. package/dist/tsup/test/mod.js.map +1 -0
  116. package/dist/tsup/utils-CT0cv4jd.d.cts +17 -0
  117. package/dist/tsup/utils-CT0cv4jd.d.ts +17 -0
  118. package/dist/tsup/utils.cjs +26 -0
  119. package/dist/tsup/utils.cjs.map +1 -0
  120. package/dist/tsup/utils.d.cts +36 -0
  121. package/dist/tsup/utils.d.ts +36 -0
  122. package/dist/tsup/utils.js +26 -0
  123. package/dist/tsup/utils.js.map +1 -0
  124. package/package.json +208 -5
  125. package/src/actor/action.ts +182 -0
  126. package/src/actor/config.ts +765 -0
  127. package/src/actor/connection.ts +260 -0
  128. package/src/actor/context.ts +171 -0
  129. package/src/actor/database.ts +23 -0
  130. package/src/actor/definition.ts +86 -0
  131. package/src/actor/driver.ts +84 -0
  132. package/src/actor/errors.ts +360 -0
  133. package/src/actor/generic-conn-driver.ts +234 -0
  134. package/src/actor/instance.ts +1800 -0
  135. package/src/actor/log.ts +15 -0
  136. package/src/actor/mod.ts +113 -0
  137. package/src/actor/persisted.ts +42 -0
  138. package/src/actor/protocol/old.ts +281 -0
  139. package/src/actor/protocol/serde.ts +131 -0
  140. package/src/actor/router-endpoints.ts +685 -0
  141. package/src/actor/router.ts +263 -0
  142. package/src/actor/schedule.ts +17 -0
  143. package/src/actor/unstable-react.ts +110 -0
  144. package/src/actor/utils.ts +98 -0
  145. package/src/client/actor-common.ts +30 -0
  146. package/src/client/actor-conn.ts +804 -0
  147. package/src/client/actor-handle.ts +208 -0
  148. package/src/client/client.ts +623 -0
  149. package/src/client/errors.ts +41 -0
  150. package/src/client/http-client-driver.ts +326 -0
  151. package/src/client/log.ts +7 -0
  152. package/src/client/mod.ts +56 -0
  153. package/src/client/raw-utils.ts +92 -0
  154. package/src/client/test.ts +44 -0
  155. package/src/client/utils.ts +150 -0
  156. package/src/common/eventsource-interface.ts +47 -0
  157. package/src/common/eventsource.ts +80 -0
  158. package/src/common/fake-event-source.ts +266 -0
  159. package/src/common/inline-websocket-adapter2.ts +445 -0
  160. package/src/common/log-levels.ts +27 -0
  161. package/src/common/log.ts +139 -0
  162. package/src/common/logfmt.ts +228 -0
  163. package/src/common/network.ts +2 -0
  164. package/src/common/router.ts +87 -0
  165. package/src/common/utils.ts +322 -0
  166. package/src/common/versioned-data.ts +95 -0
  167. package/src/common/websocket-interface.ts +49 -0
  168. package/src/common/websocket.ts +43 -0
  169. package/src/driver-helpers/mod.ts +22 -0
  170. package/src/driver-helpers/utils.ts +17 -0
  171. package/src/driver-test-suite/log.ts +7 -0
  172. package/src/driver-test-suite/mod.ts +213 -0
  173. package/src/driver-test-suite/test-inline-client-driver.ts +402 -0
  174. package/src/driver-test-suite/tests/action-features.ts +136 -0
  175. package/src/driver-test-suite/tests/actor-auth.ts +591 -0
  176. package/src/driver-test-suite/tests/actor-conn-state.ts +249 -0
  177. package/src/driver-test-suite/tests/actor-conn.ts +349 -0
  178. package/src/driver-test-suite/tests/actor-driver.ts +25 -0
  179. package/src/driver-test-suite/tests/actor-error-handling.ts +158 -0
  180. package/src/driver-test-suite/tests/actor-handle.ts +259 -0
  181. package/src/driver-test-suite/tests/actor-inline-client.ts +152 -0
  182. package/src/driver-test-suite/tests/actor-inspector.ts +570 -0
  183. package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
  184. package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
  185. package/src/driver-test-suite/tests/actor-schedule.ts +108 -0
  186. package/src/driver-test-suite/tests/actor-sleep.ts +413 -0
  187. package/src/driver-test-suite/tests/actor-state.ts +54 -0
  188. package/src/driver-test-suite/tests/actor-vars.ts +93 -0
  189. package/src/driver-test-suite/tests/manager-driver.ts +365 -0
  190. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +226 -0
  191. package/src/driver-test-suite/tests/raw-http-request-properties.ts +414 -0
  192. package/src/driver-test-suite/tests/raw-http.ts +347 -0
  193. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +392 -0
  194. package/src/driver-test-suite/tests/raw-websocket.ts +484 -0
  195. package/src/driver-test-suite/tests/request-access.ts +244 -0
  196. package/src/driver-test-suite/utils.ts +68 -0
  197. package/src/drivers/default.ts +31 -0
  198. package/src/drivers/engine/actor-driver.ts +360 -0
  199. package/src/drivers/engine/api-endpoints.ts +128 -0
  200. package/src/drivers/engine/api-utils.ts +70 -0
  201. package/src/drivers/engine/config.ts +39 -0
  202. package/src/drivers/engine/keys.test.ts +266 -0
  203. package/src/drivers/engine/keys.ts +89 -0
  204. package/src/drivers/engine/kv.ts +3 -0
  205. package/src/drivers/engine/log.ts +7 -0
  206. package/src/drivers/engine/manager-driver.ts +391 -0
  207. package/src/drivers/engine/mod.ts +36 -0
  208. package/src/drivers/engine/ws-proxy.ts +170 -0
  209. package/src/drivers/file-system/actor.ts +91 -0
  210. package/src/drivers/file-system/global-state.ts +673 -0
  211. package/src/drivers/file-system/log.ts +7 -0
  212. package/src/drivers/file-system/manager.ts +306 -0
  213. package/src/drivers/file-system/mod.ts +48 -0
  214. package/src/drivers/file-system/utils.ts +109 -0
  215. package/src/globals.d.ts +6 -0
  216. package/src/inline-client-driver/log.ts +7 -0
  217. package/src/inline-client-driver/mod.ts +385 -0
  218. package/src/inspector/actor.ts +298 -0
  219. package/src/inspector/config.ts +83 -0
  220. package/src/inspector/log.ts +5 -0
  221. package/src/inspector/manager.ts +86 -0
  222. package/src/inspector/mod.ts +2 -0
  223. package/src/inspector/protocol/actor.ts +10 -0
  224. package/src/inspector/protocol/common.ts +196 -0
  225. package/src/inspector/protocol/manager.ts +10 -0
  226. package/src/inspector/protocol/mod.ts +2 -0
  227. package/src/inspector/utils.ts +76 -0
  228. package/src/manager/auth.ts +121 -0
  229. package/src/manager/driver.ts +80 -0
  230. package/src/manager/hono-websocket-adapter.ts +333 -0
  231. package/src/manager/log.ts +7 -0
  232. package/src/manager/mod.ts +2 -0
  233. package/src/manager/protocol/mod.ts +24 -0
  234. package/src/manager/protocol/query.ts +89 -0
  235. package/src/manager/router.ts +1792 -0
  236. package/src/mod.ts +20 -0
  237. package/src/registry/config.ts +32 -0
  238. package/src/registry/log.ts +7 -0
  239. package/src/registry/mod.ts +124 -0
  240. package/src/registry/run-config.ts +54 -0
  241. package/src/registry/serve.ts +53 -0
  242. package/src/schemas/actor-persist/mod.ts +1 -0
  243. package/src/schemas/actor-persist/versioned.ts +25 -0
  244. package/src/schemas/client-protocol/mod.ts +1 -0
  245. package/src/schemas/client-protocol/versioned.ts +63 -0
  246. package/src/schemas/file-system-driver/mod.ts +1 -0
  247. package/src/schemas/file-system-driver/versioned.ts +28 -0
  248. package/src/serde.ts +84 -0
  249. package/src/test/config.ts +16 -0
  250. package/src/test/log.ts +7 -0
  251. package/src/test/mod.ts +153 -0
  252. package/src/utils.ts +172 -0
  253. package/README.md +0 -13
@@ -0,0 +1,306 @@
1
+ import type { Context as HonoContext } from "hono";
2
+ import invariant from "invariant";
3
+ import { type ActorRouter, createActorRouter } from "@/actor/router";
4
+ import {
5
+ handleRawWebSocketHandler,
6
+ handleWebSocketConnect,
7
+ } from "@/actor/router-endpoints";
8
+ import { createClientWithDriver } from "@/client/client";
9
+ import { InlineWebSocketAdapter2 } from "@/common/inline-websocket-adapter2";
10
+ import { noopNext } from "@/common/utils";
11
+ import type {
12
+ ActorDriver,
13
+ ActorOutput,
14
+ CreateInput,
15
+ GetForIdInput,
16
+ GetOrCreateWithKeyInput,
17
+ GetWithKeyInput,
18
+ ManagerDriver,
19
+ } from "@/driver-helpers/mod";
20
+ import { createInlineClientDriver } from "@/inline-client-driver/mod";
21
+ import { ManagerInspector } from "@/inspector/manager";
22
+ import { type Actor, ActorFeature, type ActorId } from "@/inspector/mod";
23
+ import {
24
+ type DriverConfig,
25
+ type Encoding,
26
+ PATH_CONNECT_WEBSOCKET,
27
+ PATH_RAW_WEBSOCKET_PREFIX,
28
+ type RegistryConfig,
29
+ type RunConfig,
30
+ } from "@/mod";
31
+ import type * as schema from "@/schemas/file-system-driver/mod";
32
+ import type { FileSystemGlobalState } from "./global-state";
33
+ import { logger } from "./log";
34
+ import { generateActorId } from "./utils";
35
+
36
+ export class FileSystemManagerDriver implements ManagerDriver {
37
+ #registryConfig: RegistryConfig;
38
+ #runConfig: RunConfig;
39
+ #state: FileSystemGlobalState;
40
+ #driverConfig: DriverConfig;
41
+
42
+ #actorDriver: ActorDriver;
43
+ #actorRouter: ActorRouter;
44
+
45
+ inspector?: ManagerInspector;
46
+
47
+ constructor(
48
+ registryConfig: RegistryConfig,
49
+ runConfig: RunConfig,
50
+ state: FileSystemGlobalState,
51
+ driverConfig: DriverConfig,
52
+ ) {
53
+ this.#registryConfig = registryConfig;
54
+ this.#runConfig = runConfig;
55
+ this.#state = state;
56
+ this.#driverConfig = driverConfig;
57
+
58
+ if (runConfig.inspector.enabled) {
59
+ if (!this.#runConfig.inspector.token()) {
60
+ this.#runConfig.inspector.token = () =>
61
+ this.#state.getOrCreateInspectorAccessToken();
62
+ }
63
+ const startedAt = new Date().toISOString();
64
+ function transformActor(actorState: schema.ActorState): Actor {
65
+ return {
66
+ id: actorState.actorId as ActorId,
67
+ name: actorState.name,
68
+ key: actorState.key as string[],
69
+ startedAt: startedAt,
70
+ createdAt: new Date(Number(actorState.createdAt)).toISOString(),
71
+ features: [
72
+ ActorFeature.State,
73
+ ActorFeature.Connections,
74
+ ActorFeature.Console,
75
+ ActorFeature.EventsMonitoring,
76
+ ActorFeature.Database,
77
+ ],
78
+ };
79
+ }
80
+
81
+ this.inspector = new ManagerInspector(() => {
82
+ return {
83
+ getAllActors: async ({ cursor, limit }) => {
84
+ const itr = this.#state.getActorsIterator({ cursor });
85
+ const actors: Actor[] = [];
86
+
87
+ for await (const actor of itr) {
88
+ actors.push(transformActor(actor));
89
+ if (limit && actors.length >= limit) {
90
+ break;
91
+ }
92
+ }
93
+ return actors;
94
+ },
95
+ getActorById: async (id) => {
96
+ try {
97
+ const result = await this.#state.loadActorStateOrError(id);
98
+ return transformActor(result);
99
+ } catch {
100
+ return null;
101
+ }
102
+ },
103
+ getBuilds: async () => {
104
+ return Object.keys(this.#registryConfig.use).map((name) => ({
105
+ name,
106
+ }));
107
+ },
108
+ createActor: async (input) => {
109
+ const { actorId } = await this.createActor(input);
110
+ try {
111
+ const result = await this.#state.loadActorStateOrError(actorId);
112
+ return transformActor(result);
113
+ } catch {
114
+ return null;
115
+ }
116
+ },
117
+ };
118
+ });
119
+ }
120
+
121
+ // Actors run on the same node as the manager, so we create a dummy actor router that we route requests to
122
+ const inlineClient = createClientWithDriver(createInlineClientDriver(this));
123
+ this.#actorDriver = this.#driverConfig.actor(
124
+ registryConfig,
125
+ runConfig,
126
+ this,
127
+ inlineClient,
128
+ );
129
+ this.#actorRouter = createActorRouter(this.#runConfig, this.#actorDriver);
130
+ }
131
+
132
+ async sendRequest(actorId: string, actorRequest: Request): Promise<Response> {
133
+ return await this.#actorRouter.fetch(actorRequest, {
134
+ actorId,
135
+ });
136
+ }
137
+
138
+ async openWebSocket(
139
+ path: string,
140
+ actorId: string,
141
+ encoding: Encoding,
142
+ params: unknown,
143
+ ): Promise<WebSocket> {
144
+ // TODO:
145
+
146
+ // Handle raw WebSocket paths
147
+ if (path === PATH_CONNECT_WEBSOCKET) {
148
+ // Handle standard connect
149
+ const wsHandler = await handleWebSocketConnect(
150
+ undefined,
151
+ this.#runConfig,
152
+ this.#actorDriver,
153
+ actorId,
154
+ encoding,
155
+ params,
156
+ undefined,
157
+ );
158
+ return new InlineWebSocketAdapter2(wsHandler);
159
+ } else if (path.startsWith(PATH_RAW_WEBSOCKET_PREFIX)) {
160
+ // Handle websocket proxy
161
+ const wsHandler = await handleRawWebSocketHandler(
162
+ undefined,
163
+ path,
164
+ this.#actorDriver,
165
+ actorId,
166
+ undefined,
167
+ );
168
+ return new InlineWebSocketAdapter2(wsHandler);
169
+ } else {
170
+ throw new Error(`Unreachable path: ${path}`);
171
+ }
172
+ }
173
+
174
+ async proxyRequest(
175
+ c: HonoContext,
176
+ actorRequest: Request,
177
+ actorId: string,
178
+ ): Promise<Response> {
179
+ return await this.#actorRouter.fetch(actorRequest, {
180
+ actorId,
181
+ });
182
+ }
183
+
184
+ async proxyWebSocket(
185
+ c: HonoContext,
186
+ path: string,
187
+ actorId: string,
188
+ encoding: Encoding,
189
+ connParams: unknown,
190
+ authData: unknown,
191
+ ): Promise<Response> {
192
+ const upgradeWebSocket = this.#runConfig.getUpgradeWebSocket?.();
193
+ invariant(upgradeWebSocket, "missing getUpgradeWebSocket");
194
+
195
+ // Handle raw WebSocket paths
196
+ if (path === PATH_CONNECT_WEBSOCKET) {
197
+ // Handle standard connect
198
+ const wsHandler = await handleWebSocketConnect(
199
+ c.req.raw,
200
+ this.#runConfig,
201
+ this.#actorDriver,
202
+ actorId,
203
+ encoding,
204
+ connParams,
205
+ authData,
206
+ );
207
+
208
+ return upgradeWebSocket(() => wsHandler)(c, noopNext());
209
+ } else if (path.startsWith(PATH_RAW_WEBSOCKET_PREFIX)) {
210
+ // Handle websocket proxy
211
+ const wsHandler = await handleRawWebSocketHandler(
212
+ c.req.raw,
213
+ path,
214
+ this.#actorDriver,
215
+ actorId,
216
+ authData,
217
+ );
218
+
219
+ return upgradeWebSocket(() => wsHandler)(c, noopNext());
220
+ } else {
221
+ throw new Error(`Unreachable path: ${path}`);
222
+ }
223
+ }
224
+
225
+ async getForId({ actorId }: GetForIdInput): Promise<ActorOutput | undefined> {
226
+ // Validate the actor exists
227
+ const actor = await this.#state.loadActor(actorId);
228
+ if (!actor.state) {
229
+ return undefined;
230
+ }
231
+
232
+ try {
233
+ // Load actor state
234
+ return {
235
+ actorId,
236
+ name: actor.state.name,
237
+ key: actor.state.key as string[],
238
+ };
239
+ } catch (error) {
240
+ logger().error("failed to read actor state", { actorId, error });
241
+ return undefined;
242
+ }
243
+ }
244
+
245
+ async getWithKey({
246
+ name,
247
+ key,
248
+ }: GetWithKeyInput): Promise<ActorOutput | undefined> {
249
+ // Generate the deterministic actor ID
250
+ const actorId = generateActorId(name, key);
251
+
252
+ // Check if actor exists
253
+ const actor = await this.#state.loadActor(actorId);
254
+ if (actor.state) {
255
+ return {
256
+ actorId,
257
+ name,
258
+ key,
259
+ };
260
+ }
261
+
262
+ return undefined;
263
+ }
264
+
265
+ async getOrCreateWithKey(
266
+ input: GetOrCreateWithKeyInput,
267
+ ): Promise<ActorOutput> {
268
+ // Generate the deterministic actor ID
269
+ const actorId = generateActorId(input.name, input.key);
270
+
271
+ // Use the atomic getOrCreateActor method
272
+ const actorEntry = await this.#state.loadOrCreateActor(
273
+ actorId,
274
+ input.name,
275
+ input.key,
276
+ input.input,
277
+ );
278
+ invariant(actorEntry.state, "must have state");
279
+
280
+ return {
281
+ actorId: actorEntry.state.actorId,
282
+ name: actorEntry.state.name,
283
+ key: actorEntry.state.key as string[],
284
+ };
285
+ }
286
+
287
+ async createActor({ name, key, input }: CreateInput): Promise<ActorOutput> {
288
+ // Generate the deterministic actor ID
289
+ const actorId = generateActorId(name, key);
290
+
291
+ await this.#state.createActor(actorId, name, key, input);
292
+
293
+ return {
294
+ actorId,
295
+ name,
296
+ key,
297
+ };
298
+ }
299
+
300
+ extraStartupLog() {
301
+ return {
302
+ instances: this.#state.actorCountOnStartup,
303
+ data: this.#state.storagePath,
304
+ };
305
+ }
306
+ }
@@ -0,0 +1,48 @@
1
+ import type { DriverConfig } from "@/registry/run-config";
2
+ import { FileSystemActorDriver } from "./actor";
3
+ import { FileSystemGlobalState } from "./global-state";
4
+ import { FileSystemManagerDriver } from "./manager";
5
+
6
+ export { FileSystemActorDriver } from "./actor";
7
+ export { FileSystemGlobalState } from "./global-state";
8
+ export { FileSystemManagerDriver } from "./manager";
9
+ export { getStoragePath } from "./utils";
10
+
11
+ export function createFileSystemOrMemoryDriver(
12
+ persist: boolean = true,
13
+ customPath?: string,
14
+ ): DriverConfig {
15
+ const state = new FileSystemGlobalState(persist, customPath);
16
+ const driverConfig: DriverConfig = {
17
+ name: persist ? "file-system" : "memory",
18
+ manager: (registryConfig, runConfig) =>
19
+ new FileSystemManagerDriver(
20
+ registryConfig,
21
+ runConfig,
22
+ state,
23
+ driverConfig,
24
+ ),
25
+ actor: (registryConfig, runConfig, managerDriver, inlineClient) => {
26
+ const actorDriver = new FileSystemActorDriver(
27
+ registryConfig,
28
+ runConfig,
29
+ managerDriver,
30
+ inlineClient,
31
+ state,
32
+ );
33
+
34
+ state.onRunnerStart(registryConfig, runConfig, inlineClient, actorDriver);
35
+
36
+ return actorDriver;
37
+ },
38
+ };
39
+ return driverConfig;
40
+ }
41
+
42
+ export function createFileSystemDriver(opts?: { path?: string }): DriverConfig {
43
+ return createFileSystemOrMemoryDriver(true, opts?.path);
44
+ }
45
+
46
+ export function createMemoryDriver(): DriverConfig {
47
+ return createFileSystemOrMemoryDriver(false);
48
+ }
@@ -0,0 +1,109 @@
1
+ import * as crypto from "node:crypto";
2
+ import * as fsSync from "node:fs";
3
+ import * as fs from "node:fs/promises";
4
+ import * as os from "node:os";
5
+ import * as path from "node:path";
6
+ import type { ActorKey } from "@/actor/mod";
7
+
8
+ /**
9
+ * Generate a deterministic actor ID from name and key
10
+ */
11
+ export function generateActorId(name: string, key: ActorKey): string {
12
+ // Generate deterministic key string
13
+ const jsonString = JSON.stringify([name, key]);
14
+
15
+ // Hash to ensure safe file system names
16
+ const hash = crypto
17
+ .createHash("sha256")
18
+ .update(jsonString)
19
+ .digest("hex")
20
+ .substring(0, 16);
21
+
22
+ return hash;
23
+ }
24
+
25
+ /**
26
+ * Create a hash for a path, normalizing it first
27
+ */
28
+ function createHashForPath(dirPath: string): string {
29
+ // Normalize the path first
30
+ const normalizedPath = path.normalize(dirPath);
31
+
32
+ // Extract the last path component for readability
33
+ const lastComponent = path.basename(normalizedPath);
34
+
35
+ // Create SHA-256 hash
36
+ const hash = crypto
37
+ .createHash("sha256")
38
+ .update(normalizedPath)
39
+ .digest("hex")
40
+ .substring(0, 8); // Take first 8 characters for brevity
41
+
42
+ return `${lastComponent}-${hash}`;
43
+ }
44
+
45
+ /**
46
+ * Get the storage path for the current working directory or a specified path
47
+ */
48
+ export function getStoragePath(customPath?: string): string {
49
+ const dataPath = getDataPath("rivetkit");
50
+ const pathToHash = customPath || process.cwd();
51
+ const dirHash = createHashForPath(pathToHash);
52
+ return path.join(dataPath, dirHash);
53
+ }
54
+
55
+ /**
56
+ * Check if a path exists
57
+ */
58
+ export async function pathExists(path: string): Promise<boolean> {
59
+ try {
60
+ await fs.access(path);
61
+ return true;
62
+ } catch {
63
+ return false;
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Ensure a directory exists, creating it if necessary
69
+ */
70
+ export async function ensureDirectoryExists(
71
+ directoryPath: string,
72
+ ): Promise<void> {
73
+ if (!(await pathExists(directoryPath))) {
74
+ await fs.mkdir(directoryPath, { recursive: true });
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Ensure a directory exists synchronously - only used during initialization
80
+ * All other operations use the async version
81
+ */
82
+ export function ensureDirectoryExistsSync(directoryPath: string): void {
83
+ if (!fsSync.existsSync(directoryPath)) {
84
+ fsSync.mkdirSync(directoryPath, { recursive: true });
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Returns platform-specific data directory
90
+ */
91
+ function getDataPath(appName: string): string {
92
+ const platform = process.platform;
93
+ const homeDir = os.homedir();
94
+
95
+ switch (platform) {
96
+ case "win32":
97
+ return path.join(
98
+ process.env.APPDATA || path.join(homeDir, "AppData", "Roaming"),
99
+ appName,
100
+ );
101
+ case "darwin":
102
+ return path.join(homeDir, "Library", "Application Support", appName);
103
+ default: // linux and others
104
+ return path.join(
105
+ process.env.XDG_DATA_HOME || path.join(homeDir, ".local", "share"),
106
+ appName,
107
+ );
108
+ }
109
+ }
@@ -0,0 +1,6 @@
1
+ declare global {
2
+ const Deno: any;
3
+ const navigator: any;
4
+ }
5
+
6
+ export {};
@@ -0,0 +1,7 @@
1
+ import { getLogger } from "@/common//log";
2
+
3
+ export const LOGGER_NAME = "inline-client-driver";
4
+
5
+ export function logger() {
6
+ return getLogger(LOGGER_NAME);
7
+ }