rivetkit 2.0.24-rc.1 → 2.0.25-rc.1

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 (231) hide show
  1. package/dist/schemas/actor-persist/v1.ts +6 -0
  2. package/dist/schemas/actor-persist/v2.ts +9 -3
  3. package/dist/schemas/actor-persist/v3.ts +280 -0
  4. package/dist/schemas/client-protocol/v1.ts +6 -0
  5. package/dist/schemas/client-protocol/v2.ts +438 -0
  6. package/dist/schemas/file-system-driver/v1.ts +6 -0
  7. package/dist/schemas/file-system-driver/v2.ts +142 -0
  8. package/dist/tsup/actor/errors.cjs +2 -4
  9. package/dist/tsup/actor/errors.cjs.map +1 -1
  10. package/dist/tsup/actor/errors.d.cts +7 -10
  11. package/dist/tsup/actor/errors.d.ts +7 -10
  12. package/dist/tsup/actor/errors.js +9 -11
  13. package/dist/tsup/{actor-router-consts-B3Lu87yJ.d.cts → actor-router-consts-DzI2szci.d.cts} +5 -9
  14. package/dist/tsup/{actor-router-consts-B3Lu87yJ.d.ts → actor-router-consts-DzI2szci.d.ts} +5 -9
  15. package/dist/tsup/{chunk-ZTH3KYFH.cjs → chunk-3FG5OJ3G.cjs} +3 -3
  16. package/dist/tsup/{chunk-ZTH3KYFH.cjs.map → chunk-3FG5OJ3G.cjs.map} +1 -1
  17. package/dist/tsup/{chunk-BLK27ES3.js → chunk-6JN6W6G3.js} +44 -56
  18. package/dist/tsup/chunk-6JN6W6G3.js.map +1 -0
  19. package/dist/tsup/chunk-7IBNNGQ2.js +514 -0
  20. package/dist/tsup/chunk-7IBNNGQ2.js.map +1 -0
  21. package/dist/tsup/{chunk-36JJ4IQB.cjs → chunk-AZATXPR4.cjs} +4 -8
  22. package/dist/tsup/chunk-AZATXPR4.cjs.map +1 -0
  23. package/dist/tsup/chunk-B7MENRD5.cjs +5694 -0
  24. package/dist/tsup/chunk-B7MENRD5.cjs.map +1 -0
  25. package/dist/tsup/{chunk-BOMZS2TJ.js → chunk-BBVFDEYD.js} +9 -9
  26. package/dist/tsup/chunk-BBVFDEYD.js.map +1 -0
  27. package/dist/tsup/{chunk-KSRXX3Z4.cjs → chunk-D6762AOA.cjs} +20 -25
  28. package/dist/tsup/chunk-D6762AOA.cjs.map +1 -0
  29. package/dist/tsup/{chunk-2JYPS5YM.cjs → chunk-E63WZNMR.cjs} +6 -6
  30. package/dist/tsup/chunk-E63WZNMR.cjs.map +1 -0
  31. package/dist/tsup/{chunk-YBG6R7LX.js → chunk-EDGN4OC7.js} +3 -7
  32. package/dist/tsup/chunk-EDGN4OC7.js.map +1 -0
  33. package/dist/tsup/{chunk-BYMKMOBS.js → chunk-FLOQ3UWM.js} +1844 -1681
  34. package/dist/tsup/chunk-FLOQ3UWM.js.map +1 -0
  35. package/dist/tsup/{chunk-7L65NNWP.cjs → chunk-H7GV5DIW.cjs} +187 -185
  36. package/dist/tsup/chunk-H7GV5DIW.cjs.map +1 -0
  37. package/dist/tsup/{chunk-227FEWMB.js → chunk-HZYZ7JSF.js} +3322 -2251
  38. package/dist/tsup/chunk-HZYZ7JSF.js.map +1 -0
  39. package/dist/tsup/{chunk-FX7TWFQR.js → chunk-IDJK7ILQ.js} +2 -6
  40. package/dist/tsup/chunk-IDJK7ILQ.js.map +1 -0
  41. package/dist/tsup/{chunk-VHGY7PU5.cjs → chunk-ILFXA4AL.cjs} +1900 -1737
  42. package/dist/tsup/chunk-ILFXA4AL.cjs.map +1 -0
  43. package/dist/tsup/chunk-MV6M3FDL.cjs +514 -0
  44. package/dist/tsup/chunk-MV6M3FDL.cjs.map +1 -0
  45. package/dist/tsup/{chunk-PLUN2NQT.js → chunk-NWBKMCWC.js} +189 -187
  46. package/dist/tsup/chunk-NWBKMCWC.js.map +1 -0
  47. package/dist/tsup/{chunk-CD33GT6Z.js → chunk-QIHBDXTO.js} +2 -2
  48. package/dist/tsup/{chunk-G64QUEDJ.js → chunk-W6RDS6NW.js} +23 -28
  49. package/dist/tsup/chunk-W6RDS6NW.js.map +1 -0
  50. package/dist/tsup/{chunk-INNFK746.cjs → chunk-WQU4M4ZC.cjs} +10 -14
  51. package/dist/tsup/chunk-WQU4M4ZC.cjs.map +1 -0
  52. package/dist/tsup/{chunk-SHVX2QUR.cjs → chunk-XKZA47XS.cjs} +17 -17
  53. package/dist/tsup/chunk-XKZA47XS.cjs.map +1 -0
  54. package/dist/tsup/{chunk-HHFKKVLR.cjs → chunk-YHWIOWVA.cjs} +45 -57
  55. package/dist/tsup/chunk-YHWIOWVA.cjs.map +1 -0
  56. package/dist/tsup/{chunk-YBHYXIP6.js → chunk-YVL6IRUM.js} +3 -3
  57. package/dist/tsup/chunk-YVL6IRUM.js.map +1 -0
  58. package/dist/tsup/client/mod.cjs +9 -9
  59. package/dist/tsup/client/mod.d.cts +5 -7
  60. package/dist/tsup/client/mod.d.ts +5 -7
  61. package/dist/tsup/client/mod.js +8 -8
  62. package/dist/tsup/common/log.cjs +3 -3
  63. package/dist/tsup/common/log.js +2 -2
  64. package/dist/tsup/common/websocket.cjs +4 -4
  65. package/dist/tsup/common/websocket.js +3 -3
  66. package/dist/tsup/{conn-B3Vhbgnd.d.ts → config-BRDYDraU.d.cts} +1119 -1047
  67. package/dist/tsup/{conn-DJWL3nGx.d.cts → config-Bo-blHpJ.d.ts} +1119 -1047
  68. package/dist/tsup/driver-helpers/mod.cjs +5 -13
  69. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  70. package/dist/tsup/driver-helpers/mod.d.cts +11 -9
  71. package/dist/tsup/driver-helpers/mod.d.ts +11 -9
  72. package/dist/tsup/driver-helpers/mod.js +14 -22
  73. package/dist/tsup/driver-test-suite/mod.cjs +474 -303
  74. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  75. package/dist/tsup/driver-test-suite/mod.d.cts +6 -9
  76. package/dist/tsup/driver-test-suite/mod.d.ts +6 -9
  77. package/dist/tsup/driver-test-suite/mod.js +1085 -914
  78. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  79. package/dist/tsup/inspector/mod.cjs +6 -6
  80. package/dist/tsup/inspector/mod.d.cts +5 -7
  81. package/dist/tsup/inspector/mod.d.ts +5 -7
  82. package/dist/tsup/inspector/mod.js +5 -5
  83. package/dist/tsup/mod.cjs +10 -16
  84. package/dist/tsup/mod.cjs.map +1 -1
  85. package/dist/tsup/mod.d.cts +23 -25
  86. package/dist/tsup/mod.d.ts +23 -25
  87. package/dist/tsup/mod.js +17 -23
  88. package/dist/tsup/test/mod.cjs +11 -11
  89. package/dist/tsup/test/mod.d.cts +4 -6
  90. package/dist/tsup/test/mod.d.ts +4 -6
  91. package/dist/tsup/test/mod.js +10 -10
  92. package/dist/tsup/utils.cjs +3 -5
  93. package/dist/tsup/utils.cjs.map +1 -1
  94. package/dist/tsup/utils.d.cts +1 -2
  95. package/dist/tsup/utils.d.ts +1 -2
  96. package/dist/tsup/utils.js +2 -4
  97. package/package.json +13 -6
  98. package/src/actor/config.ts +56 -44
  99. package/src/actor/conn/driver.ts +61 -0
  100. package/src/actor/conn/drivers/http.ts +17 -0
  101. package/src/actor/conn/drivers/raw-request.ts +24 -0
  102. package/src/actor/conn/drivers/raw-websocket.ts +65 -0
  103. package/src/actor/conn/drivers/websocket.ts +129 -0
  104. package/src/actor/conn/mod.ts +232 -0
  105. package/src/actor/conn/persisted.ts +81 -0
  106. package/src/actor/conn/state-manager.ts +196 -0
  107. package/src/actor/contexts/action.ts +23 -0
  108. package/src/actor/{context.ts → contexts/actor.ts} +19 -8
  109. package/src/actor/contexts/conn-init.ts +31 -0
  110. package/src/actor/contexts/conn.ts +48 -0
  111. package/src/actor/contexts/create-conn-state.ts +13 -0
  112. package/src/actor/contexts/on-before-connect.ts +13 -0
  113. package/src/actor/contexts/on-connect.ts +22 -0
  114. package/src/actor/contexts/request.ts +48 -0
  115. package/src/actor/contexts/websocket.ts +48 -0
  116. package/src/actor/definition.ts +3 -3
  117. package/src/actor/driver.ts +36 -5
  118. package/src/actor/errors.ts +19 -24
  119. package/src/actor/instance/connection-manager.ts +465 -0
  120. package/src/actor/instance/event-manager.ts +292 -0
  121. package/src/actor/instance/kv.ts +15 -0
  122. package/src/actor/instance/mod.ts +1107 -0
  123. package/src/actor/instance/persisted.ts +67 -0
  124. package/src/actor/instance/schedule-manager.ts +349 -0
  125. package/src/actor/instance/state-manager.ts +502 -0
  126. package/src/actor/mod.ts +13 -16
  127. package/src/actor/protocol/old.ts +131 -43
  128. package/src/actor/protocol/serde.ts +19 -4
  129. package/src/actor/router-endpoints.ts +61 -586
  130. package/src/actor/router-websocket-endpoints.ts +408 -0
  131. package/src/actor/router.ts +63 -197
  132. package/src/actor/schedule.ts +1 -1
  133. package/src/client/actor-conn.ts +183 -249
  134. package/src/client/actor-handle.ts +29 -6
  135. package/src/client/client.ts +0 -4
  136. package/src/client/config.ts +1 -4
  137. package/src/client/mod.ts +0 -1
  138. package/src/client/raw-utils.ts +3 -3
  139. package/src/client/utils.ts +85 -39
  140. package/src/common/actor-router-consts.ts +5 -12
  141. package/src/common/{inline-websocket-adapter2.ts → inline-websocket-adapter.ts} +26 -48
  142. package/src/common/log.ts +1 -1
  143. package/src/common/router.ts +28 -17
  144. package/src/common/utils.ts +2 -0
  145. package/src/driver-helpers/mod.ts +7 -10
  146. package/src/driver-helpers/utils.ts +18 -9
  147. package/src/driver-test-suite/mod.ts +26 -50
  148. package/src/driver-test-suite/test-inline-client-driver.ts +27 -51
  149. package/src/driver-test-suite/tests/actor-conn-hibernation.ts +150 -0
  150. package/src/driver-test-suite/tests/actor-conn-state.ts +1 -4
  151. package/src/driver-test-suite/tests/actor-conn.ts +5 -9
  152. package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
  153. package/src/driver-test-suite/tests/actor-driver.ts +0 -7
  154. package/src/driver-test-suite/tests/actor-handle.ts +12 -12
  155. package/src/driver-test-suite/tests/actor-metadata.ts +1 -1
  156. package/src/driver-test-suite/tests/manager-driver.ts +1 -1
  157. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +8 -8
  158. package/src/driver-test-suite/tests/raw-http-request-properties.ts +6 -5
  159. package/src/driver-test-suite/tests/raw-http.ts +5 -5
  160. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +7 -7
  161. package/src/driver-test-suite/tests/request-access.ts +4 -4
  162. package/src/driver-test-suite/utils.ts +6 -10
  163. package/src/drivers/engine/actor-driver.ts +614 -424
  164. package/src/drivers/engine/mod.ts +0 -1
  165. package/src/drivers/file-system/actor.ts +24 -12
  166. package/src/drivers/file-system/global-state.ts +427 -37
  167. package/src/drivers/file-system/manager.ts +71 -83
  168. package/src/drivers/file-system/mod.ts +3 -0
  169. package/src/drivers/file-system/utils.ts +18 -8
  170. package/src/engine-process/mod.ts +38 -38
  171. package/src/inspector/utils.ts +7 -5
  172. package/src/manager/driver.ts +11 -4
  173. package/src/manager/gateway.ts +4 -29
  174. package/src/manager/protocol/mod.ts +0 -2
  175. package/src/manager/protocol/query.ts +0 -4
  176. package/src/manager/router.ts +67 -64
  177. package/src/manager-api/actors.ts +13 -0
  178. package/src/mod.ts +1 -3
  179. package/src/registry/mod.ts +20 -20
  180. package/src/registry/serve.ts +9 -14
  181. package/src/remote-manager-driver/actor-websocket-client.ts +1 -16
  182. package/src/remote-manager-driver/api-endpoints.ts +13 -1
  183. package/src/remote-manager-driver/api-utils.ts +8 -0
  184. package/src/remote-manager-driver/metadata.ts +58 -0
  185. package/src/remote-manager-driver/mod.ts +47 -62
  186. package/src/remote-manager-driver/ws-proxy.ts +1 -1
  187. package/src/schemas/actor-persist/mod.ts +1 -1
  188. package/src/schemas/actor-persist/versioned.ts +56 -31
  189. package/src/schemas/client-protocol/mod.ts +1 -1
  190. package/src/schemas/client-protocol/versioned.ts +41 -21
  191. package/src/schemas/client-protocol-zod/mod.ts +103 -0
  192. package/src/schemas/file-system-driver/mod.ts +1 -1
  193. package/src/schemas/file-system-driver/versioned.ts +42 -19
  194. package/src/serde.ts +33 -11
  195. package/src/test/mod.ts +7 -3
  196. package/src/utils/node.ts +173 -0
  197. package/src/utils.ts +0 -4
  198. package/dist/tsup/chunk-227FEWMB.js.map +0 -1
  199. package/dist/tsup/chunk-2JYPS5YM.cjs.map +0 -1
  200. package/dist/tsup/chunk-36JJ4IQB.cjs.map +0 -1
  201. package/dist/tsup/chunk-7L65NNWP.cjs.map +0 -1
  202. package/dist/tsup/chunk-BLK27ES3.js.map +0 -1
  203. package/dist/tsup/chunk-BOMZS2TJ.js.map +0 -1
  204. package/dist/tsup/chunk-BYMKMOBS.js.map +0 -1
  205. package/dist/tsup/chunk-FX7TWFQR.js.map +0 -1
  206. package/dist/tsup/chunk-G64QUEDJ.js.map +0 -1
  207. package/dist/tsup/chunk-HHFKKVLR.cjs.map +0 -1
  208. package/dist/tsup/chunk-INNFK746.cjs.map +0 -1
  209. package/dist/tsup/chunk-KSRXX3Z4.cjs.map +0 -1
  210. package/dist/tsup/chunk-O44LFKSB.cjs +0 -4623
  211. package/dist/tsup/chunk-O44LFKSB.cjs.map +0 -1
  212. package/dist/tsup/chunk-PLUN2NQT.js.map +0 -1
  213. package/dist/tsup/chunk-S4UJG7ZE.js +0 -1119
  214. package/dist/tsup/chunk-S4UJG7ZE.js.map +0 -1
  215. package/dist/tsup/chunk-SHVX2QUR.cjs.map +0 -1
  216. package/dist/tsup/chunk-VFB23BYZ.cjs +0 -1119
  217. package/dist/tsup/chunk-VFB23BYZ.cjs.map +0 -1
  218. package/dist/tsup/chunk-VHGY7PU5.cjs.map +0 -1
  219. package/dist/tsup/chunk-YBG6R7LX.js.map +0 -1
  220. package/dist/tsup/chunk-YBHYXIP6.js.map +0 -1
  221. package/src/actor/action.ts +0 -178
  222. package/src/actor/conn-drivers.ts +0 -216
  223. package/src/actor/conn-socket.ts +0 -8
  224. package/src/actor/conn.ts +0 -272
  225. package/src/actor/instance.ts +0 -2336
  226. package/src/actor/persisted.ts +0 -49
  227. package/src/actor/unstable-react.ts +0 -110
  228. package/src/driver-test-suite/tests/actor-reconnect.ts +0 -170
  229. package/src/drivers/engine/kv.ts +0 -3
  230. package/src/manager/hono-websocket-adapter.ts +0 -393
  231. /package/dist/tsup/{chunk-CD33GT6Z.js.map → chunk-QIHBDXTO.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
- }