rivetkit 2.0.1 → 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,95 @@
1
+ export interface VersionedData<T> {
2
+ version: number;
3
+ data: T;
4
+ }
5
+
6
+ export type MigrationFn<TFrom, TTo> = (data: TFrom) => TTo;
7
+
8
+ export interface VersionedDataConfig<T> {
9
+ currentVersion: number;
10
+ migrations: Map<number, MigrationFn<any, any>>;
11
+ serializeVersion: (data: T) => Uint8Array;
12
+ deserializeVersion: (bytes: Uint8Array) => T;
13
+ }
14
+
15
+ export class VersionedDataHandler<T> {
16
+ constructor(private config: VersionedDataConfig<T>) {}
17
+
18
+ serializeWithEmbeddedVersion(data: T): Uint8Array {
19
+ const versioned: VersionedData<Uint8Array> = {
20
+ version: this.config.currentVersion,
21
+ data: this.config.serializeVersion(data),
22
+ };
23
+
24
+ return this.embedVersion(versioned);
25
+ }
26
+
27
+ deserializeWithEmbeddedVersion(bytes: Uint8Array): T {
28
+ const versioned = this.extractVersion(bytes);
29
+ return this.deserialize(versioned.data, versioned.version);
30
+ }
31
+
32
+ serialize(data: T, version: number): Uint8Array {
33
+ return this.config.serializeVersion(data);
34
+ }
35
+
36
+ deserialize(bytes: Uint8Array, version: number): T {
37
+ if (version === this.config.currentVersion) {
38
+ return this.config.deserializeVersion(bytes);
39
+ }
40
+
41
+ if (version > this.config.currentVersion) {
42
+ throw new Error(
43
+ `Cannot decode data from version ${version}, current version is ${this.config.currentVersion}`,
44
+ );
45
+ }
46
+
47
+ let currentData: any = this.config.deserializeVersion(bytes);
48
+ let currentVersion = version;
49
+
50
+ while (currentVersion < this.config.currentVersion) {
51
+ const migration = this.config.migrations.get(currentVersion);
52
+ if (!migration) {
53
+ throw new Error(
54
+ `No migration found from version ${currentVersion} to ${currentVersion + 1}`,
55
+ );
56
+ }
57
+
58
+ currentData = migration(currentData);
59
+ currentVersion++;
60
+ }
61
+
62
+ return currentData;
63
+ }
64
+
65
+ private embedVersion(data: VersionedData<Uint8Array>): Uint8Array {
66
+ const versionBytes = new Uint8Array(4);
67
+ new DataView(versionBytes.buffer).setUint32(0, data.version, true);
68
+
69
+ const result = new Uint8Array(versionBytes.length + data.data.length);
70
+ result.set(versionBytes);
71
+ result.set(data.data, versionBytes.length);
72
+
73
+ return result;
74
+ }
75
+
76
+ private extractVersion(bytes: Uint8Array): VersionedData<Uint8Array> {
77
+ if (bytes.length < 4) {
78
+ throw new Error("Invalid versioned data: too short");
79
+ }
80
+
81
+ const version = new DataView(bytes.buffer, bytes.byteOffset).getUint32(
82
+ 0,
83
+ true,
84
+ );
85
+ const data = bytes.slice(4);
86
+
87
+ return { version, data };
88
+ }
89
+ }
90
+
91
+ export function createVersionedDataHandler<T>(
92
+ config: VersionedDataConfig<T>,
93
+ ): VersionedDataHandler<T> {
94
+ return new VersionedDataHandler(config);
95
+ }
@@ -0,0 +1,49 @@
1
+ // Define minimal event interfaces to avoid conflicts between different WebSocket implementations
2
+ export interface RivetEvent {
3
+ type: string;
4
+ target?: any;
5
+ currentTarget?: any;
6
+ }
7
+
8
+ export interface RivetMessageEvent extends RivetEvent {
9
+ data: any;
10
+ }
11
+
12
+ export interface RivetCloseEvent extends RivetEvent {
13
+ code: number;
14
+ reason: string;
15
+ wasClean: boolean;
16
+ }
17
+
18
+ /**
19
+ * Common WebSocket interface that can be implemented by different WebSocket-like classes
20
+ * This is compatible with the standard WebSocket API but allows for custom implementations
21
+ */
22
+ export interface UniversalWebSocket {
23
+ // WebSocket readyState values
24
+ readonly CONNECTING: 0;
25
+ readonly OPEN: 1;
26
+ readonly CLOSING: 2;
27
+ readonly CLOSED: 3;
28
+
29
+ // Properties
30
+ readonly readyState: 0 | 1 | 2 | 3;
31
+ binaryType: "arraybuffer" | "blob";
32
+ readonly bufferedAmount: number;
33
+ readonly extensions: string;
34
+ readonly protocol: string;
35
+ readonly url: string;
36
+
37
+ // Methods
38
+ send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
39
+ close(code?: number, reason?: string): void;
40
+ addEventListener(type: string, listener: (event: any) => void): void;
41
+ removeEventListener(type: string, listener: (event: any) => void): void;
42
+ dispatchEvent(event: RivetEvent): boolean;
43
+
44
+ // Event handlers (optional)
45
+ onopen?: ((event: RivetEvent) => void) | null;
46
+ onclose?: ((event: RivetCloseEvent) => void) | null;
47
+ onerror?: ((event: RivetEvent) => void) | null;
48
+ onmessage?: ((event: RivetMessageEvent) => void) | null;
49
+ }
@@ -0,0 +1,43 @@
1
+ import { logger } from "@/client/log";
2
+
3
+ // Global singleton promise that will be reused for subsequent calls
4
+ let webSocketPromise: Promise<typeof WebSocket> | null = null;
5
+
6
+ export async function importWebSocket(): Promise<typeof WebSocket> {
7
+ // Return existing promise if we already started loading
8
+ if (webSocketPromise !== null) {
9
+ return webSocketPromise;
10
+ }
11
+
12
+ // Create and store the promise
13
+ webSocketPromise = (async () => {
14
+ let _WebSocket: typeof WebSocket;
15
+
16
+ if (typeof WebSocket !== "undefined") {
17
+ // Browser environment
18
+ _WebSocket = WebSocket as unknown as typeof WebSocket;
19
+ logger().debug("using native websocket");
20
+ } else {
21
+ // Node.js environment
22
+ try {
23
+ const ws = await import("ws");
24
+ _WebSocket = ws.default as unknown as typeof WebSocket;
25
+ logger().debug("using websocket from npm");
26
+ } catch {
27
+ // WS not available
28
+ _WebSocket = class MockWebSocket {
29
+ constructor() {
30
+ throw new Error(
31
+ 'WebSocket support requires installing the "ws" peer dependency.',
32
+ );
33
+ }
34
+ } as unknown as typeof WebSocket;
35
+ logger().debug("using mock websocket");
36
+ }
37
+ }
38
+
39
+ return _WebSocket;
40
+ })();
41
+
42
+ return webSocketPromise;
43
+ }
@@ -0,0 +1,22 @@
1
+ export type { ActorDriver } from "@/actor/driver";
2
+ export type { ActorInstance, AnyActorInstance } from "@/actor/instance";
3
+ export {
4
+ HEADER_ACTOR_ID,
5
+ HEADER_ACTOR_QUERY,
6
+ HEADER_AUTH_DATA,
7
+ HEADER_CONN_ID,
8
+ HEADER_CONN_PARAMS,
9
+ HEADER_CONN_TOKEN,
10
+ HEADER_ENCODING,
11
+ HEADER_EXPOSE_INTERNAL_ERROR,
12
+ } from "@/actor/router-endpoints";
13
+ export type {
14
+ ActorOutput,
15
+ CreateInput,
16
+ GetForIdInput,
17
+ GetOrCreateWithKeyInput,
18
+ GetWithKeyInput,
19
+ ManagerDriver,
20
+ } from "@/manager/driver";
21
+ export { DriverConfigSchema, RunConfigSchema } from "@/registry/run-config";
22
+ export { serializeEmptyPersistData } from "./utils";
@@ -0,0 +1,17 @@
1
+ import * as cbor from "cbor-x";
2
+ import type * as schema from "@/schemas/actor-persist/mod";
3
+ import { PERSISTED_ACTOR_VERSIONED } from "@/schemas/actor-persist/versioned";
4
+ import { bufferToArrayBuffer } from "@/utils";
5
+
6
+ export function serializeEmptyPersistData(
7
+ input: unknown | undefined,
8
+ ): Uint8Array {
9
+ const persistData: schema.PersistedActor = {
10
+ input: input !== undefined ? bufferToArrayBuffer(cbor.encode(input)) : null,
11
+ hasInitialized: false,
12
+ state: bufferToArrayBuffer(cbor.encode(undefined)),
13
+ connections: [],
14
+ scheduledEvents: [],
15
+ };
16
+ return PERSISTED_ACTOR_VERSIONED.serializeWithEmbeddedVersion(persistData);
17
+ }
@@ -0,0 +1,7 @@
1
+ import { getLogger } from "@/common/log";
2
+
3
+ export const LOGGER_NAME = "test-suite";
4
+
5
+ export function logger() {
6
+ return getLogger(LOGGER_NAME);
7
+ }
@@ -0,0 +1,213 @@
1
+ import { serve as honoServe } from "@hono/node-server";
2
+ import { createNodeWebSocket, type NodeWebSocket } from "@hono/node-ws";
3
+ import { bundleRequire } from "bundle-require";
4
+ import invariant from "invariant";
5
+ import { describe } from "vitest";
6
+ import type { Transport } from "@/client/mod";
7
+ import { createInlineClientDriver } from "@/inline-client-driver/mod";
8
+ import { createManagerRouter } from "@/manager/router";
9
+ import type { DriverConfig, Registry, RunConfig } from "@/mod";
10
+ import { RunConfigSchema } from "@/registry/run-config";
11
+ import { getPort } from "@/test/mod";
12
+ import { runActionFeaturesTests } from "./tests/action-features";
13
+ import { runActorAuthTests } from "./tests/actor-auth";
14
+ import { runActorConnTests } from "./tests/actor-conn";
15
+ import { runActorConnStateTests } from "./tests/actor-conn-state";
16
+ import {
17
+ runActorDriverTests,
18
+ runActorDriverTestsWithTransport,
19
+ } from "./tests/actor-driver";
20
+ import { runActorErrorHandlingTests } from "./tests/actor-error-handling";
21
+ import { runActorHandleTests } from "./tests/actor-handle";
22
+ import { runActorInlineClientTests } from "./tests/actor-inline-client";
23
+ import { runActorInspectorTests } from "./tests/actor-inspector";
24
+ import { runActorMetadataTests } from "./tests/actor-metadata";
25
+ import { runActorOnStateChangeTests } from "./tests/actor-onstatechange";
26
+ import { runActorVarsTests } from "./tests/actor-vars";
27
+ import { runManagerDriverTests } from "./tests/manager-driver";
28
+ import { runRawHttpTests } from "./tests/raw-http";
29
+ import { runRawHttpDirectRegistryTests } from "./tests/raw-http-direct-registry";
30
+ import { runRawHttpRequestPropertiesTests } from "./tests/raw-http-request-properties";
31
+ import { runRawWebSocketTests } from "./tests/raw-websocket";
32
+ import { runRawWebSocketDirectRegistryTests } from "./tests/raw-websocket-direct-registry";
33
+ import { runRequestAccessTests } from "./tests/request-access";
34
+
35
+ export interface SkipTests {
36
+ schedule?: boolean;
37
+ sleep?: boolean;
38
+ }
39
+
40
+ export interface DriverTestConfig {
41
+ /** Deploys an registry and returns the connection endpoint. */
42
+ start(projectDir: string): Promise<DriverDeployOutput>;
43
+
44
+ /**
45
+ * If we're testing with an external system, we should use real timers
46
+ * instead of Vitest's mocked timers.
47
+ **/
48
+ useRealTimers?: boolean;
49
+
50
+ /** Cloudflare Workers has some bugs with cleanup. */
51
+ HACK_skipCleanupNet?: boolean;
52
+
53
+ skip?: SkipTests;
54
+
55
+ transport?: Transport;
56
+
57
+ clientType: ClientType;
58
+
59
+ cleanup?: () => Promise<void>;
60
+ }
61
+
62
+ /**
63
+ * The type of client to run the test with.
64
+ *
65
+ * The logic for HTTP vs inline is very different, so this helps validate all behavior matches.
66
+ **/
67
+ type ClientType = "http" | "inline";
68
+
69
+ export interface DriverDeployOutput {
70
+ endpoint: string;
71
+
72
+ /** Cleans up the test. */
73
+ cleanup(): Promise<void>;
74
+ }
75
+
76
+ /** Runs all Vitest tests against the provided drivers. */
77
+ export function runDriverTests(
78
+ driverTestConfigPartial: Omit<DriverTestConfig, "clientType" | "transport">,
79
+ ) {
80
+ for (const clientType of ["http", "inline"] as ClientType[]) {
81
+ const driverTestConfig: DriverTestConfig = {
82
+ ...driverTestConfigPartial,
83
+ clientType,
84
+ };
85
+
86
+ describe(`client type (${clientType})`, () => {
87
+ runActorDriverTests(driverTestConfig);
88
+ runManagerDriverTests(driverTestConfig);
89
+
90
+ for (const transport of ["websocket", "sse"] as Transport[]) {
91
+ describe(`transport (${transport})`, () => {
92
+ runActorConnTests({
93
+ ...driverTestConfig,
94
+ transport,
95
+ });
96
+
97
+ runActorConnStateTests({ ...driverTestConfig, transport });
98
+
99
+ runRequestAccessTests({ ...driverTestConfig, transport });
100
+
101
+ runActorDriverTestsWithTransport({ ...driverTestConfig, transport });
102
+ });
103
+ }
104
+
105
+ runActorHandleTests(driverTestConfig);
106
+
107
+ runActionFeaturesTests(driverTestConfig);
108
+
109
+ runActorVarsTests(driverTestConfig);
110
+
111
+ runActorMetadataTests(driverTestConfig);
112
+
113
+ runActorOnStateChangeTests(driverTestConfig);
114
+
115
+ runActorErrorHandlingTests(driverTestConfig);
116
+
117
+ runActorAuthTests(driverTestConfig);
118
+
119
+ runActorInlineClientTests(driverTestConfig);
120
+
121
+ runRawHttpTests(driverTestConfig);
122
+
123
+ runRawHttpRequestPropertiesTests(driverTestConfig);
124
+
125
+ runRawWebSocketTests(driverTestConfig);
126
+
127
+ runRawHttpDirectRegistryTests(driverTestConfig);
128
+
129
+ runRawWebSocketDirectRegistryTests(driverTestConfig);
130
+
131
+ runActorInspectorTests(driverTestConfig);
132
+ });
133
+ }
134
+ }
135
+
136
+ /**
137
+ * Helper function to adapt the drivers to the Node.js runtime for tests.
138
+ *
139
+ * This is helpful for drivers that run in-process as opposed to drivers that rely on external tools.
140
+ */
141
+ export async function createTestRuntime(
142
+ registryPath: string,
143
+ driverFactory: (registry: Registry<any>) => Promise<{
144
+ driver: DriverConfig;
145
+ cleanup?: () => Promise<void>;
146
+ }>,
147
+ ): Promise<DriverDeployOutput> {
148
+ const {
149
+ mod: { registry },
150
+ } = await bundleRequire<{ registry: Registry<any> }>({
151
+ filepath: registryPath,
152
+ });
153
+
154
+ // TODO: Find a cleaner way of flagging an registry as test mode (ideally not in the config itself)
155
+ // Force enable test
156
+ registry.config.test.enabled = true;
157
+
158
+ // Build drivers
159
+ const { driver, cleanup: driverCleanup } = await driverFactory(registry);
160
+
161
+ // Build driver config
162
+ let injectWebSocket: NodeWebSocket["injectWebSocket"] | undefined;
163
+ let upgradeWebSocket: any;
164
+ const config: RunConfig = RunConfigSchema.parse({
165
+ driver,
166
+ getUpgradeWebSocket: () => upgradeWebSocket!,
167
+ inspector: {
168
+ enabled: true,
169
+ token: () => "token",
170
+ },
171
+ });
172
+
173
+ // Create router
174
+ const managerDriver = driver.manager(registry.config, config);
175
+ const inlineDriver = createInlineClientDriver(managerDriver);
176
+ const { router } = createManagerRouter(
177
+ registry.config,
178
+ config,
179
+ inlineDriver,
180
+ managerDriver,
181
+ false,
182
+ );
183
+
184
+ // Inject WebSocket
185
+ const nodeWebSocket = createNodeWebSocket({ app: router });
186
+ upgradeWebSocket = nodeWebSocket.upgradeWebSocket;
187
+ injectWebSocket = nodeWebSocket.injectWebSocket;
188
+
189
+ // Start server
190
+ const port = await getPort();
191
+ const server = honoServe({
192
+ fetch: router.fetch,
193
+ hostname: "127.0.0.1",
194
+ port,
195
+ });
196
+ invariant(injectWebSocket !== undefined, "should have injectWebSocket");
197
+ injectWebSocket(server);
198
+ const endpoint = `http://127.0.0.1:${port}`;
199
+
200
+ // Cleanup
201
+ const cleanup = async () => {
202
+ // Stop server
203
+ await new Promise((resolve) => server.close(() => resolve(undefined)));
204
+
205
+ // Extra cleanup
206
+ await driverCleanup?.();
207
+ };
208
+
209
+ return {
210
+ endpoint,
211
+ cleanup,
212
+ };
213
+ }