rivetkit 2.0.24-rc.1 → 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-HHFKKVLR.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-ZTH3KYFH.cjs → chunk-5BZO5XPS.cjs} +3 -3
  17. package/dist/tsup/{chunk-ZTH3KYFH.cjs.map → chunk-5BZO5XPS.cjs.map} +1 -1
  18. package/dist/tsup/{chunk-PLUN2NQT.js → chunk-BAIGSF64.js} +189 -187
  19. package/dist/tsup/chunk-BAIGSF64.js.map +1 -0
  20. package/dist/tsup/{chunk-SHVX2QUR.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-7L65NNWP.cjs → chunk-DLK5YCTN.cjs} +187 -185
  27. package/dist/tsup/chunk-DLK5YCTN.cjs.map +1 -0
  28. package/dist/tsup/{chunk-YBG6R7LX.js → chunk-DUJQWGYD.js} +3 -7
  29. package/dist/tsup/chunk-DUJQWGYD.js.map +1 -0
  30. package/dist/tsup/{chunk-CD33GT6Z.js → chunk-EIPANQMF.js} +2 -2
  31. package/dist/tsup/{chunk-2JYPS5YM.cjs → chunk-ESMTDP7G.cjs} +6 -6
  32. package/dist/tsup/chunk-ESMTDP7G.cjs.map +1 -0
  33. package/dist/tsup/{chunk-VHGY7PU5.cjs → chunk-FVAKREFB.cjs} +1900 -1737
  34. package/dist/tsup/chunk-FVAKREFB.cjs.map +1 -0
  35. package/dist/tsup/{chunk-BLK27ES3.js → chunk-I3XT7WOF.js} +44 -56
  36. package/dist/tsup/chunk-I3XT7WOF.js.map +1 -0
  37. package/dist/tsup/{chunk-YBHYXIP6.js → chunk-IMDS5T42.js} +3 -3
  38. package/dist/tsup/chunk-IMDS5T42.js.map +1 -0
  39. package/dist/tsup/{chunk-INNFK746.cjs → chunk-J3HZJF2P.cjs} +10 -14
  40. package/dist/tsup/chunk-J3HZJF2P.cjs.map +1 -0
  41. package/dist/tsup/{chunk-BYMKMOBS.js → chunk-MBBJUHSP.js} +1844 -1681
  42. package/dist/tsup/chunk-MBBJUHSP.js.map +1 -0
  43. package/dist/tsup/{chunk-BOMZS2TJ.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-36JJ4IQB.cjs → chunk-YC5DUHPM.cjs} +4 -8
  50. package/dist/tsup/chunk-YC5DUHPM.cjs.map +1 -0
  51. package/dist/tsup/{chunk-FX7TWFQR.js → chunk-YC7YPM2T.js} +2 -6
  52. package/dist/tsup/chunk-YC7YPM2T.js.map +1 -0
  53. package/dist/tsup/{chunk-227FEWMB.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-227FEWMB.js.map +0 -1
  196. package/dist/tsup/chunk-2JYPS5YM.cjs.map +0 -1
  197. package/dist/tsup/chunk-36JJ4IQB.cjs.map +0 -1
  198. package/dist/tsup/chunk-7L65NNWP.cjs.map +0 -1
  199. package/dist/tsup/chunk-BLK27ES3.js.map +0 -1
  200. package/dist/tsup/chunk-BOMZS2TJ.js.map +0 -1
  201. package/dist/tsup/chunk-BYMKMOBS.js.map +0 -1
  202. package/dist/tsup/chunk-FX7TWFQR.js.map +0 -1
  203. package/dist/tsup/chunk-G64QUEDJ.js.map +0 -1
  204. package/dist/tsup/chunk-HHFKKVLR.cjs.map +0 -1
  205. package/dist/tsup/chunk-INNFK746.cjs.map +0 -1
  206. package/dist/tsup/chunk-KSRXX3Z4.cjs.map +0 -1
  207. package/dist/tsup/chunk-O44LFKSB.cjs +0 -4623
  208. package/dist/tsup/chunk-O44LFKSB.cjs.map +0 -1
  209. package/dist/tsup/chunk-PLUN2NQT.js.map +0 -1
  210. package/dist/tsup/chunk-S4UJG7ZE.js +0 -1119
  211. package/dist/tsup/chunk-S4UJG7ZE.js.map +0 -1
  212. package/dist/tsup/chunk-SHVX2QUR.cjs.map +0 -1
  213. package/dist/tsup/chunk-VFB23BYZ.cjs +0 -1119
  214. package/dist/tsup/chunk-VFB23BYZ.cjs.map +0 -1
  215. package/dist/tsup/chunk-VHGY7PU5.cjs.map +0 -1
  216. package/dist/tsup/chunk-YBG6R7LX.js.map +0 -1
  217. package/dist/tsup/chunk-YBHYXIP6.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-CD33GT6Z.js.map → chunk-EIPANQMF.js.map} +0 -0
@@ -1,393 +0,0 @@
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
- readonly rivetRequestId?: ArrayBuffer;
27
- readonly isHibernatable: boolean;
28
-
29
- constructor(
30
- ws: WSContext,
31
- rivetRequestId: ArrayBuffer | undefined,
32
- isHibernatable: boolean,
33
- ) {
34
- this.#ws = ws;
35
- this.rivetRequestId = rivetRequestId;
36
- this.isHibernatable = isHibernatable;
37
-
38
- // The WSContext is already open when we receive it
39
- this.#readyState = this.OPEN;
40
-
41
- // Immediately fire the open event
42
- setTimeout(() => {
43
- this.#fireEvent("open", {
44
- type: "open",
45
- target: this,
46
- rivetRequestId: this.rivetRequestId,
47
- });
48
- }, 0);
49
- }
50
-
51
- get readyState(): 0 | 1 | 2 | 3 {
52
- return this.#readyState;
53
- }
54
-
55
- get binaryType(): "arraybuffer" | "blob" {
56
- return "arraybuffer";
57
- }
58
-
59
- set binaryType(value: "arraybuffer" | "blob") {
60
- // Ignored for now - always use arraybuffer
61
- }
62
-
63
- get bufferedAmount(): number {
64
- return 0; // Not tracked in WSContext
65
- }
66
-
67
- get extensions(): string {
68
- return ""; // Not available in WSContext
69
- }
70
-
71
- get protocol(): string {
72
- return ""; // Not available in WSContext
73
- }
74
-
75
- get url(): string {
76
- return ""; // Not available in WSContext
77
- }
78
-
79
- send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {
80
- if (this.readyState !== this.OPEN) {
81
- throw new Error("WebSocket is not open");
82
- }
83
-
84
- try {
85
- logger().debug({
86
- msg: "bridge sending data",
87
- dataType: typeof data,
88
- isString: typeof data === "string",
89
- isArrayBuffer: data instanceof ArrayBuffer,
90
- dataStr:
91
- typeof data === "string"
92
- ? data.substring(0, 100)
93
- : "<non-string>",
94
- });
95
-
96
- if (typeof data === "string") {
97
- (this.#ws as any).send(data);
98
- } else if (data instanceof ArrayBuffer) {
99
- (this.#ws as any).send(data);
100
- } else if (ArrayBuffer.isView(data)) {
101
- // Convert ArrayBufferView to ArrayBuffer
102
- const buffer = data.buffer.slice(
103
- data.byteOffset,
104
- data.byteOffset + data.byteLength,
105
- );
106
- // Check if it's a SharedArrayBuffer and convert to ArrayBuffer
107
- if (buffer instanceof SharedArrayBuffer) {
108
- const arrayBuffer = new ArrayBuffer(buffer.byteLength);
109
- new Uint8Array(arrayBuffer).set(new Uint8Array(buffer));
110
- (this.#ws as any).send(arrayBuffer);
111
- } else {
112
- (this.#ws as any).send(buffer);
113
- }
114
- } else if (data instanceof Blob) {
115
- // Convert Blob to ArrayBuffer
116
- data.arrayBuffer()
117
- .then((buffer) => {
118
- (this.#ws as any).send(buffer);
119
- })
120
- .catch((error) => {
121
- logger().error({
122
- msg: "failed to convert blob to arraybuffer",
123
- error,
124
- });
125
- this.#fireEvent("error", {
126
- type: "error",
127
- target: this,
128
- error,
129
- });
130
- });
131
- } else {
132
- // Try to convert to string as a fallback
133
- logger().warn({
134
- msg: "unsupported data type, converting to string",
135
- dataType: typeof data,
136
- data,
137
- });
138
- (this.#ws as any).send(String(data));
139
- }
140
- } catch (error) {
141
- logger().error({ msg: "error sending websocket data", error });
142
- this.#fireEvent("error", { type: "error", target: this, error });
143
- throw error;
144
- }
145
- }
146
-
147
- close(code = 1000, reason = ""): void {
148
- if (
149
- this.readyState === this.CLOSING ||
150
- this.readyState === this.CLOSED
151
- ) {
152
- return;
153
- }
154
-
155
- this.#readyState = this.CLOSING;
156
- this.#closeCode = code;
157
- this.#closeReason = reason;
158
-
159
- try {
160
- (this.#ws as any).close(code, reason);
161
-
162
- // Update state and fire close event
163
- this.#readyState = this.CLOSED;
164
- this.#fireEvent("close", {
165
- type: "close",
166
- target: this,
167
- code,
168
- reason,
169
- wasClean: code === 1000,
170
- rivetRequestId: this.rivetRequestId,
171
- });
172
- } catch (error) {
173
- logger().error({ msg: "error closing websocket", error });
174
- this.#readyState = this.CLOSED;
175
- this.#fireEvent("close", {
176
- type: "close",
177
- target: this,
178
- code: 1006,
179
- reason: "Abnormal closure",
180
- wasClean: false,
181
- rivetRequestId: this.rivetRequestId,
182
- });
183
- }
184
- }
185
-
186
- addEventListener(type: string, listener: (event: any) => void): void {
187
- if (!this.#eventListeners.has(type)) {
188
- this.#eventListeners.set(type, new Set());
189
- }
190
- this.#eventListeners.get(type)!.add(listener);
191
- }
192
-
193
- removeEventListener(type: string, listener: (event: any) => void): void {
194
- const listeners = this.#eventListeners.get(type);
195
- if (listeners) {
196
- listeners.delete(listener);
197
- }
198
- }
199
-
200
- dispatchEvent(event: RivetEvent): boolean {
201
- const listeners = this.#eventListeners.get(event.type);
202
- if (listeners) {
203
- for (const listener of listeners) {
204
- try {
205
- listener(event);
206
- } catch (error) {
207
- logger().error({
208
- msg: `error in ${event.type} event listener`,
209
- error,
210
- });
211
- }
212
- }
213
- }
214
- return true;
215
- }
216
-
217
- // Internal method to handle incoming messages from WSContext
218
- _handleMessage(data: any): void {
219
- // Hono may pass either raw data or a MessageEvent-like object
220
- let messageData: string | ArrayBuffer | ArrayBufferView;
221
- let rivetRequestId: ArrayBuffer | undefined;
222
- let rivetMessageIndex: number | undefined;
223
-
224
- if (typeof data === "string") {
225
- messageData = data;
226
- } else if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
227
- messageData = data;
228
- } else if (data && typeof data === "object" && "data" in data) {
229
- // Handle MessageEvent-like objects
230
- messageData = data.data;
231
-
232
- // Preserve hibernation-related properties from engine runner
233
- if ("rivetRequestId" in data) {
234
- rivetRequestId = data.rivetRequestId;
235
- }
236
- if ("rivetMessageIndex" in data) {
237
- rivetMessageIndex = data.rivetMessageIndex;
238
- }
239
- } else {
240
- // Fallback - shouldn't happen in normal operation
241
- messageData = String(data);
242
- }
243
-
244
- logger().debug({
245
- msg: "bridge handling message",
246
- dataType: typeof messageData,
247
- isArrayBuffer: messageData instanceof ArrayBuffer,
248
- dataStr: typeof messageData === "string" ? messageData : "<binary>",
249
- rivetMessageIndex,
250
- });
251
-
252
- this.#fireEvent("message", {
253
- type: "message",
254
- target: this,
255
- data: messageData,
256
- rivetRequestId,
257
- rivetMessageIndex,
258
- });
259
- }
260
-
261
- // Internal method to handle close from WSContext
262
- _handleClose(code: number, reason: string): void {
263
- // HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state
264
- // https://github.com/cloudflare/workerd/issues/2569
265
- (this.#ws as any).close(1000, "hack_force_close");
266
-
267
- if (this.readyState === this.CLOSED) return;
268
-
269
- this.#readyState = this.CLOSED;
270
- this.#closeCode = code;
271
- this.#closeReason = reason;
272
-
273
- this.#fireEvent("close", {
274
- type: "close",
275
- target: this,
276
- code,
277
- reason,
278
- wasClean: code === 1000,
279
- rivetRequestId: this.rivetRequestId,
280
- });
281
- }
282
-
283
- // Internal method to handle errors from WSContext
284
- _handleError(error: any): void {
285
- this.#fireEvent("error", {
286
- type: "error",
287
- target: this,
288
- error,
289
- });
290
- }
291
-
292
- #fireEvent(type: string, event: any): void {
293
- const listeners = this.#eventListeners.get(type);
294
- if (listeners) {
295
- for (const listener of listeners) {
296
- try {
297
- listener(event);
298
- } catch (error) {
299
- logger().error({
300
- msg: `error in ${type} event listener`,
301
- error,
302
- });
303
- }
304
- }
305
- }
306
-
307
- // Also check for on* properties
308
- switch (type) {
309
- case "open":
310
- if (this.#onopen) {
311
- try {
312
- this.#onopen(event);
313
- } catch (error) {
314
- logger().error({
315
- msg: "error in onopen handler",
316
- error,
317
- });
318
- }
319
- }
320
- break;
321
- case "close":
322
- if (this.#onclose) {
323
- try {
324
- this.#onclose(event);
325
- } catch (error) {
326
- logger().error({
327
- msg: "error in onclose handler",
328
- error,
329
- });
330
- }
331
- }
332
- break;
333
- case "error":
334
- if (this.#onerror) {
335
- try {
336
- this.#onerror(event);
337
- } catch (error) {
338
- logger().error({
339
- msg: "error in onerror handler",
340
- error,
341
- });
342
- }
343
- }
344
- break;
345
- case "message":
346
- if (this.#onmessage) {
347
- try {
348
- this.#onmessage(event);
349
- } catch (error) {
350
- logger().error({
351
- msg: "error in onmessage handler",
352
- error,
353
- });
354
- }
355
- }
356
- break;
357
- }
358
- }
359
-
360
- // Event handler properties with getters/setters
361
- #onopen: ((event: RivetEvent) => void) | null = null;
362
- #onclose: ((event: RivetCloseEvent) => void) | null = null;
363
- #onerror: ((event: RivetEvent) => void) | null = null;
364
- #onmessage: ((event: RivetMessageEvent) => void) | null = null;
365
-
366
- get onopen(): ((event: RivetEvent) => void) | null {
367
- return this.#onopen;
368
- }
369
- set onopen(handler: ((event: RivetEvent) => void) | null) {
370
- this.#onopen = handler;
371
- }
372
-
373
- get onclose(): ((event: RivetCloseEvent) => void) | null {
374
- return this.#onclose;
375
- }
376
- set onclose(handler: ((event: RivetCloseEvent) => void) | null) {
377
- this.#onclose = handler;
378
- }
379
-
380
- get onerror(): ((event: RivetEvent) => void) | null {
381
- return this.#onerror;
382
- }
383
- set onerror(handler: ((event: RivetEvent) => void) | null) {
384
- this.#onerror = handler;
385
- }
386
-
387
- get onmessage(): ((event: RivetMessageEvent) => void) | null {
388
- return this.#onmessage;
389
- }
390
- set onmessage(handler: ((event: RivetMessageEvent) => void) | null) {
391
- this.#onmessage = handler;
392
- }
393
- }