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,333 @@
1
+ import type { WSContext } from "hono/ws";
2
+ import type {
3
+ RivetCloseEvent,
4
+ RivetEvent,
5
+ RivetMessageEvent,
6
+ UniversalWebSocket,
7
+ } from "@/common/websocket-interface";
8
+ import { logger } from "./log";
9
+
10
+ /**
11
+ * HonoWebSocketAdapter provides a WebSocket-like interface over WSContext
12
+ * for raw WebSocket handling in actors
13
+ */
14
+ export class HonoWebSocketAdapter implements UniversalWebSocket {
15
+ // WebSocket readyState values
16
+ readonly CONNECTING = 0 as const;
17
+ readonly OPEN = 1 as const;
18
+ readonly CLOSING = 2 as const;
19
+ readonly CLOSED = 3 as const;
20
+
21
+ #ws: WSContext;
22
+ #readyState: 0 | 1 | 2 | 3 = 1; // Start as OPEN since WSContext is already connected
23
+ #eventListeners: Map<string, Set<(event: any) => void>> = new Map();
24
+ #closeCode?: number;
25
+ #closeReason?: string;
26
+
27
+ constructor(ws: WSContext) {
28
+ this.#ws = ws;
29
+
30
+ // The WSContext is already open when we receive it
31
+ this.#readyState = this.OPEN;
32
+
33
+ // Immediately fire the open event
34
+ setTimeout(() => {
35
+ this.#fireEvent("open", { type: "open", target: this });
36
+ }, 0);
37
+ }
38
+
39
+ get readyState(): 0 | 1 | 2 | 3 {
40
+ return this.#readyState;
41
+ }
42
+
43
+ get binaryType(): "arraybuffer" | "blob" {
44
+ return "arraybuffer";
45
+ }
46
+
47
+ set binaryType(value: "arraybuffer" | "blob") {
48
+ // Ignored for now - always use arraybuffer
49
+ }
50
+
51
+ get bufferedAmount(): number {
52
+ return 0; // Not tracked in WSContext
53
+ }
54
+
55
+ get extensions(): string {
56
+ return ""; // Not available in WSContext
57
+ }
58
+
59
+ get protocol(): string {
60
+ return ""; // Not available in WSContext
61
+ }
62
+
63
+ get url(): string {
64
+ return ""; // Not available in WSContext
65
+ }
66
+
67
+ send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {
68
+ if (this.readyState !== this.OPEN) {
69
+ throw new Error("WebSocket is not open");
70
+ }
71
+
72
+ try {
73
+ logger().debug("bridge sending data", {
74
+ dataType: typeof data,
75
+ isString: typeof data === "string",
76
+ isArrayBuffer: data instanceof ArrayBuffer,
77
+ dataStr:
78
+ typeof data === "string" ? data.substring(0, 100) : "<non-string>",
79
+ });
80
+
81
+ if (typeof data === "string") {
82
+ (this.#ws as any).send(data);
83
+ } else if (data instanceof ArrayBuffer) {
84
+ (this.#ws as any).send(data);
85
+ } else if (ArrayBuffer.isView(data)) {
86
+ // Convert ArrayBufferView to ArrayBuffer
87
+ const buffer = data.buffer.slice(
88
+ data.byteOffset,
89
+ data.byteOffset + data.byteLength,
90
+ );
91
+ // Check if it's a SharedArrayBuffer and convert to ArrayBuffer
92
+ if (buffer instanceof SharedArrayBuffer) {
93
+ const arrayBuffer = new ArrayBuffer(buffer.byteLength);
94
+ new Uint8Array(arrayBuffer).set(new Uint8Array(buffer));
95
+ (this.#ws as any).send(arrayBuffer);
96
+ } else {
97
+ (this.#ws as any).send(buffer);
98
+ }
99
+ } else if (data instanceof Blob) {
100
+ // Convert Blob to ArrayBuffer
101
+ data
102
+ .arrayBuffer()
103
+ .then((buffer) => {
104
+ (this.#ws as any).send(buffer);
105
+ })
106
+ .catch((error) => {
107
+ logger().error("failed to convert blob to arraybuffer", { error });
108
+ this.#fireEvent("error", { type: "error", target: this, error });
109
+ });
110
+ } else {
111
+ // Try to convert to string as a fallback
112
+ logger().warn("unsupported data type, converting to string", {
113
+ dataType: typeof data,
114
+ data,
115
+ });
116
+ (this.#ws as any).send(String(data));
117
+ }
118
+ } catch (error) {
119
+ logger().error("error sending websocket data", { error });
120
+ this.#fireEvent("error", { type: "error", target: this, error });
121
+ throw error;
122
+ }
123
+ }
124
+
125
+ close(code = 1000, reason = ""): void {
126
+ if (this.readyState === this.CLOSING || this.readyState === this.CLOSED) {
127
+ return;
128
+ }
129
+
130
+ this.#readyState = this.CLOSING;
131
+ this.#closeCode = code;
132
+ this.#closeReason = reason;
133
+
134
+ try {
135
+ (this.#ws as any).close(code, reason);
136
+
137
+ // Update state and fire close event
138
+ this.#readyState = this.CLOSED;
139
+ this.#fireEvent("close", {
140
+ type: "close",
141
+ target: this,
142
+ code,
143
+ reason,
144
+ wasClean: code === 1000,
145
+ });
146
+ } catch (error) {
147
+ logger().error("error closing websocket", { error });
148
+ this.#readyState = this.CLOSED;
149
+ this.#fireEvent("close", {
150
+ type: "close",
151
+ target: this,
152
+ code: 1006,
153
+ reason: "Abnormal closure",
154
+ wasClean: false,
155
+ });
156
+ }
157
+ }
158
+
159
+ addEventListener(type: string, listener: (event: any) => void): void {
160
+ if (!this.#eventListeners.has(type)) {
161
+ this.#eventListeners.set(type, new Set());
162
+ }
163
+ this.#eventListeners.get(type)!.add(listener);
164
+ }
165
+
166
+ removeEventListener(type: string, listener: (event: any) => void): void {
167
+ const listeners = this.#eventListeners.get(type);
168
+ if (listeners) {
169
+ listeners.delete(listener);
170
+ }
171
+ }
172
+
173
+ dispatchEvent(event: RivetEvent): boolean {
174
+ const listeners = this.#eventListeners.get(event.type);
175
+ if (listeners) {
176
+ for (const listener of listeners) {
177
+ try {
178
+ listener(event);
179
+ } catch (error) {
180
+ logger().error(`error in ${event.type} event listener`, { error });
181
+ }
182
+ }
183
+ }
184
+ return true;
185
+ }
186
+
187
+ // Internal method to handle incoming messages from WSContext
188
+ _handleMessage(data: any): void {
189
+ // Hono may pass either raw data or a MessageEvent-like object
190
+ let messageData: string | ArrayBuffer | ArrayBufferView;
191
+
192
+ if (typeof data === "string") {
193
+ messageData = data;
194
+ } else if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
195
+ messageData = data;
196
+ } else if (data && typeof data === "object" && "data" in data) {
197
+ // Handle MessageEvent-like objects
198
+ messageData = data.data;
199
+ } else {
200
+ // Fallback - shouldn't happen in normal operation
201
+ messageData = String(data);
202
+ }
203
+
204
+ logger().debug("bridge handling message", {
205
+ dataType: typeof messageData,
206
+ isArrayBuffer: messageData instanceof ArrayBuffer,
207
+ dataStr: typeof messageData === "string" ? messageData : "<binary>",
208
+ });
209
+
210
+ this.#fireEvent("message", {
211
+ type: "message",
212
+ target: this,
213
+ data: messageData,
214
+ });
215
+ }
216
+
217
+ // Internal method to handle close from WSContext
218
+ _handleClose(code: number, reason: string): void {
219
+ // HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state
220
+ // https://github.com/cloudflare/workerd/issues/2569
221
+ (this.#ws as any).close(1000, "hack_force_close");
222
+
223
+ if (this.readyState === this.CLOSED) return;
224
+
225
+ this.#readyState = this.CLOSED;
226
+ this.#closeCode = code;
227
+ this.#closeReason = reason;
228
+
229
+ this.#fireEvent("close", {
230
+ type: "close",
231
+ target: this,
232
+ code,
233
+ reason,
234
+ wasClean: code === 1000,
235
+ });
236
+ }
237
+
238
+ // Internal method to handle errors from WSContext
239
+ _handleError(error: any): void {
240
+ this.#fireEvent("error", {
241
+ type: "error",
242
+ target: this,
243
+ error,
244
+ });
245
+ }
246
+
247
+ #fireEvent(type: string, event: any): void {
248
+ const listeners = this.#eventListeners.get(type);
249
+ if (listeners) {
250
+ for (const listener of listeners) {
251
+ try {
252
+ listener(event);
253
+ } catch (error) {
254
+ logger().error(`error in ${type} event listener`, { error });
255
+ }
256
+ }
257
+ }
258
+
259
+ // Also check for on* properties
260
+ switch (type) {
261
+ case "open":
262
+ if (this.#onopen) {
263
+ try {
264
+ this.#onopen(event);
265
+ } catch (error) {
266
+ logger().error("error in onopen handler", { error });
267
+ }
268
+ }
269
+ break;
270
+ case "close":
271
+ if (this.#onclose) {
272
+ try {
273
+ this.#onclose(event);
274
+ } catch (error) {
275
+ logger().error("error in onclose handler", { error });
276
+ }
277
+ }
278
+ break;
279
+ case "error":
280
+ if (this.#onerror) {
281
+ try {
282
+ this.#onerror(event);
283
+ } catch (error) {
284
+ logger().error("error in onerror handler", { error });
285
+ }
286
+ }
287
+ break;
288
+ case "message":
289
+ if (this.#onmessage) {
290
+ try {
291
+ this.#onmessage(event);
292
+ } catch (error) {
293
+ logger().error("error in onmessage handler", { error });
294
+ }
295
+ }
296
+ break;
297
+ }
298
+ }
299
+
300
+ // Event handler properties with getters/setters
301
+ #onopen: ((event: RivetEvent) => void) | null = null;
302
+ #onclose: ((event: RivetCloseEvent) => void) | null = null;
303
+ #onerror: ((event: RivetEvent) => void) | null = null;
304
+ #onmessage: ((event: RivetMessageEvent) => void) | null = null;
305
+
306
+ get onopen(): ((event: RivetEvent) => void) | null {
307
+ return this.#onopen;
308
+ }
309
+ set onopen(handler: ((event: RivetEvent) => void) | null) {
310
+ this.#onopen = handler;
311
+ }
312
+
313
+ get onclose(): ((event: RivetCloseEvent) => void) | null {
314
+ return this.#onclose;
315
+ }
316
+ set onclose(handler: ((event: RivetCloseEvent) => void) | null) {
317
+ this.#onclose = handler;
318
+ }
319
+
320
+ get onerror(): ((event: RivetEvent) => void) | null {
321
+ return this.#onerror;
322
+ }
323
+ set onerror(handler: ((event: RivetEvent) => void) | null) {
324
+ this.#onerror = handler;
325
+ }
326
+
327
+ get onmessage(): ((event: RivetMessageEvent) => void) | null {
328
+ return this.#onmessage;
329
+ }
330
+ set onmessage(handler: ((event: RivetMessageEvent) => void) | null) {
331
+ this.#onmessage = handler;
332
+ }
333
+ }
@@ -0,0 +1,7 @@
1
+ import { getLogger } from "@/common//log";
2
+
3
+ export const LOGGER_NAME = "actor-manager";
4
+
5
+ export function logger() {
6
+ return getLogger(LOGGER_NAME);
7
+ }
@@ -0,0 +1,2 @@
1
+ export { ManagerDriver } from "./driver";
2
+ export { createManagerRouter } from "./router";
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { TransportSchema } from "@/actor/protocol/old";
3
+ import { ActorQuerySchema } from "./query";
4
+
5
+ export * from "./query";
6
+
7
+ export const ActorsRequestSchema = z.object({
8
+ query: ActorQuerySchema,
9
+ });
10
+
11
+ export const ActorsResponseSchema = z.object({
12
+ actorId: z.string(),
13
+ supportedTransports: z.array(TransportSchema),
14
+ });
15
+
16
+ //export const RivetConfigResponseSchema = z.object({
17
+ // endpoint: z.string(),
18
+ // project: z.string().optional(),
19
+ // environment: z.string().optional(),
20
+ //});
21
+
22
+ export type ActorsRequest = z.infer<typeof ActorsRequestSchema>;
23
+ export type ActorsResponse = z.infer<typeof ActorsResponseSchema>;
24
+ //export type RivetConfigResponse = z.infer<typeof RivetConfigResponseSchema>;
@@ -0,0 +1,89 @@
1
+ import { z } from "zod";
2
+ import { EncodingSchema } from "@/actor/protocol/serde";
3
+ import {
4
+ HEADER_ACTOR_ID,
5
+ HEADER_ACTOR_QUERY,
6
+ HEADER_CONN_ID,
7
+ HEADER_CONN_PARAMS,
8
+ HEADER_CONN_TOKEN,
9
+ HEADER_ENCODING,
10
+ } from "@/actor/router-endpoints";
11
+
12
+ // Maximum size of a key component in bytes
13
+ // Set to 128 bytes to allow for separators and escape characters in the full key
14
+ // Cloudflare's maximum key size is 512 bytes, so we need to be significantly smaller
15
+ export const MAX_ACTOR_KEY_SIZE = 128;
16
+
17
+ export const ActorKeySchema = z.array(z.string().max(MAX_ACTOR_KEY_SIZE));
18
+
19
+ export type ActorKey = z.infer<typeof ActorKeySchema>;
20
+
21
+ export const CreateRequestSchema = z.object({
22
+ name: z.string(),
23
+ key: ActorKeySchema,
24
+ input: z.unknown().optional(),
25
+ region: z.string().optional(),
26
+ });
27
+
28
+ export const GetForKeyRequestSchema = z.object({
29
+ name: z.string(),
30
+ key: ActorKeySchema,
31
+ });
32
+
33
+ export const GetOrCreateRequestSchema = z.object({
34
+ name: z.string(),
35
+ key: ActorKeySchema,
36
+ input: z.unknown().optional(),
37
+ region: z.string().optional(),
38
+ });
39
+
40
+ export const ActorQuerySchema = z.union([
41
+ z.object({
42
+ getForId: z.object({
43
+ name: z.string(),
44
+ actorId: z.string(),
45
+ }),
46
+ }),
47
+ z.object({
48
+ getForKey: GetForKeyRequestSchema,
49
+ }),
50
+ z.object({
51
+ getOrCreateForKey: GetOrCreateRequestSchema,
52
+ }),
53
+ z.object({
54
+ create: CreateRequestSchema,
55
+ }),
56
+ ]);
57
+
58
+ export const ConnectRequestSchema = z.object({
59
+ query: ActorQuerySchema.describe(HEADER_ACTOR_QUERY),
60
+ encoding: EncodingSchema.describe(HEADER_ENCODING),
61
+ connParams: z.string().optional().describe(HEADER_CONN_PARAMS),
62
+ });
63
+
64
+ export const ConnectWebSocketRequestSchema = z.object({
65
+ query: ActorQuerySchema.describe("query"),
66
+ encoding: EncodingSchema.describe("encoding"),
67
+ connParams: z.unknown().optional().describe("conn_params"),
68
+ });
69
+
70
+ export const ConnMessageRequestSchema = z.object({
71
+ actorId: z.string().describe(HEADER_ACTOR_ID),
72
+ connId: z.string().describe(HEADER_CONN_ID),
73
+ encoding: EncodingSchema.describe(HEADER_ENCODING),
74
+ connToken: z.string().describe(HEADER_CONN_TOKEN),
75
+ });
76
+
77
+ export const ResolveRequestSchema = z.object({
78
+ query: ActorQuerySchema.describe(HEADER_ACTOR_QUERY),
79
+ connParams: z.string().optional().describe(HEADER_CONN_PARAMS),
80
+ });
81
+
82
+ export type ActorQuery = z.infer<typeof ActorQuerySchema>;
83
+ export type GetForKeyRequest = z.infer<typeof GetForKeyRequestSchema>;
84
+ export type GetOrCreateRequest = z.infer<typeof GetOrCreateRequestSchema>;
85
+ export type ConnectQuery = z.infer<typeof ConnectRequestSchema>;
86
+ /**
87
+ * Interface representing a request to create a actor.
88
+ */
89
+ export type CreateRequest = z.infer<typeof CreateRequestSchema>;