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,47 @@
1
+ // Define minimal event interfaces to avoid conflicts between different EventSource implementations
2
+ export interface UniversalEvent {
3
+ type: string;
4
+ target?: any;
5
+ currentTarget?: any;
6
+ }
7
+
8
+ export interface UniversalMessageEvent extends UniversalEvent {
9
+ data: string;
10
+ lastEventId: string;
11
+ origin: string;
12
+ }
13
+
14
+ export interface UniversalErrorEvent extends UniversalEvent {
15
+ message: string;
16
+ filename?: string;
17
+ lineno?: number;
18
+ colno?: number;
19
+ error?: any;
20
+ }
21
+
22
+ /**
23
+ * Common EventSource interface that can be implemented by different EventSource-like classes
24
+ * This is compatible with the standard EventSource API but allows for custom implementations
25
+ */
26
+ export interface UniversalEventSource {
27
+ // EventSource readyState values
28
+ readonly CONNECTING: 0;
29
+ readonly OPEN: 1;
30
+ readonly CLOSED: 2;
31
+
32
+ // Properties
33
+ readonly readyState: 0 | 1 | 2;
34
+ readonly url: string;
35
+ readonly withCredentials: boolean;
36
+
37
+ // Methods
38
+ close(): void;
39
+ addEventListener(type: string, listener: (event: any) => void): void;
40
+ removeEventListener(type: string, listener: (event: any) => void): void;
41
+ dispatchEvent(event: UniversalEvent): boolean;
42
+
43
+ // Event handlers (optional)
44
+ onopen?: ((event: UniversalEvent) => void) | null;
45
+ onmessage?: ((event: UniversalMessageEvent) => void) | null;
46
+ onerror?: ((event: UniversalErrorEvent) => void) | null;
47
+ }
@@ -0,0 +1,80 @@
1
+ import type { EventSource } from "eventsource";
2
+ import { logger } from "@/client/log";
3
+
4
+ // Global singleton promise that will be reused for subsequent calls
5
+ let eventSourcePromise: Promise<typeof EventSource> | null = null;
6
+
7
+ /**
8
+ * Import `eventsource` from the custom `eventsource` library. We need a custom implemnetation since we need to attach our own custom headers to the request.
9
+ **/
10
+ export async function importEventSource(): Promise<typeof EventSource> {
11
+ // Return existing promise if we already started loading
12
+ if (eventSourcePromise !== null) {
13
+ return eventSourcePromise;
14
+ }
15
+
16
+ // Create and store the promise
17
+ eventSourcePromise = (async () => {
18
+ let _EventSource: typeof EventSource;
19
+
20
+ // Node.js environment
21
+ try {
22
+ const es = await import("eventsource");
23
+ _EventSource = es.EventSource;
24
+ logger().debug("using eventsource from npm");
25
+ } catch (err) {
26
+ // EventSource not available
27
+ _EventSource = class MockEventSource {
28
+ constructor() {
29
+ throw new Error(
30
+ 'EventSource support requires installing the "eventsource" peer dependency.',
31
+ );
32
+ }
33
+ } as unknown as typeof EventSource;
34
+ logger().debug("using mock eventsource");
35
+ }
36
+
37
+ return _EventSource;
38
+ })();
39
+
40
+ return eventSourcePromise;
41
+ }
42
+
43
+ //export async function importEventSource(): Promise<typeof EventSource> {
44
+ // // Return existing promise if we already started loading
45
+ // if (eventSourcePromise !== null) {
46
+ // return eventSourcePromise;
47
+ // }
48
+ //
49
+ // // Create and store the promise
50
+ // eventSourcePromise = (async () => {
51
+ // let _EventSource: typeof EventSource;
52
+ //
53
+ // if (typeof EventSource !== "undefined") {
54
+ // // Browser environment
55
+ // _EventSource = EventSource;
56
+ // logger().debug("using native eventsource");
57
+ // } else {
58
+ // // Node.js environment
59
+ // try {
60
+ // const es = await import("eventsource");
61
+ // _EventSource = es.EventSource;
62
+ // logger().debug("using eventsource from npm");
63
+ // } catch (err) {
64
+ // // EventSource not available
65
+ // _EventSource = class MockEventSource {
66
+ // constructor() {
67
+ // throw new Error(
68
+ // 'EventSource support requires installing the "eventsource" peer dependency.',
69
+ // );
70
+ // }
71
+ // } as unknown as typeof EventSource;
72
+ // logger().debug("using mock eventsource");
73
+ // }
74
+ // }
75
+ //
76
+ // return _EventSource;
77
+ // })();
78
+ //
79
+ // return eventSourcePromise;
80
+ //}
@@ -0,0 +1,266 @@
1
+ import type { EventListener } from "eventsource";
2
+ import type { SSEStreamingApi } from "hono/streaming";
3
+ import { getLogger } from "@/common//log";
4
+ import type {
5
+ UniversalEvent,
6
+ UniversalEventSource,
7
+ UniversalMessageEvent,
8
+ } from "@/common/eventsource-interface";
9
+
10
+ export const LOGGER_NAME = "fake-event-source";
11
+
12
+ export function logger() {
13
+ return getLogger(LOGGER_NAME);
14
+ }
15
+
16
+ /**
17
+ * FakeEventSource provides a minimal implementation of an SSE stream
18
+ * that handles events for the inline client driver
19
+ */
20
+ export class FakeEventSource implements UniversalEventSource {
21
+ // EventSource readyState values
22
+ readonly CONNECTING = 0 as const;
23
+ readonly OPEN = 1 as const;
24
+ readonly CLOSED = 2 as const;
25
+
26
+ url = "http://internal-sse-endpoint";
27
+ readyState: 0 | 1 | 2 = 1; // OPEN
28
+ withCredentials = false;
29
+
30
+ // Event handlers
31
+ onopen: ((event: UniversalEvent) => void) | null = null;
32
+ onmessage: ((event: UniversalMessageEvent) => void) | null = null;
33
+ onerror: ((event: UniversalEvent) => void) | null = null;
34
+
35
+ // Private event listeners
36
+ #listeners: Record<string, Set<EventListener>> = {
37
+ open: new Set(),
38
+ message: new Set(),
39
+ error: new Set(),
40
+ close: new Set(),
41
+ };
42
+
43
+ // Stream that will be passed to the handler
44
+ #stream: SSEStreamingApi;
45
+ #onCloseCallback: () => Promise<void>;
46
+
47
+ /**
48
+ * Creates a new FakeEventSource
49
+ */
50
+ constructor(onCloseCallback: () => Promise<void>) {
51
+ this.#onCloseCallback = onCloseCallback;
52
+
53
+ this.#stream = this.#createStreamApi();
54
+
55
+ // Trigger open event on next tick
56
+ setTimeout(() => {
57
+ if (this.readyState === 1) {
58
+ this.#dispatchEvent("open");
59
+ }
60
+ }, 0);
61
+
62
+ logger().debug("FakeEventSource created");
63
+ }
64
+
65
+ // Creates the SSE streaming API implementation
66
+ #createStreamApi(): SSEStreamingApi {
67
+ // Create self-reference for closures
68
+ const self = this;
69
+
70
+ const streamApi: SSEStreamingApi = {
71
+ write: async (input) => {
72
+ const data =
73
+ typeof input === "string" ? input : new TextDecoder().decode(input);
74
+ self.#dispatchEvent("message", { data });
75
+ return streamApi;
76
+ },
77
+
78
+ writeln: async (input: string) => {
79
+ await streamApi.write(input + "\n");
80
+ return streamApi;
81
+ },
82
+
83
+ writeSSE: async (message: {
84
+ data: string | Promise<string>;
85
+ event?: string;
86
+ id?: string;
87
+ retry?: number;
88
+ }): Promise<void> => {
89
+ const data = await message.data;
90
+
91
+ if (message.event) {
92
+ self.#dispatchEvent(message.event, { data });
93
+ } else {
94
+ self.#dispatchEvent("message", { data });
95
+ }
96
+ },
97
+
98
+ sleep: async (ms: number) => {
99
+ await new Promise((resolve) => setTimeout(resolve, ms));
100
+ return streamApi;
101
+ },
102
+
103
+ close: async () => {
104
+ self.close();
105
+ },
106
+
107
+ pipe: async (_body: ReadableStream) => {
108
+ // No-op implementation
109
+ },
110
+
111
+ onAbort: async (cb: () => void) => {
112
+ self.addEventListener("error", () => {
113
+ cb();
114
+ });
115
+ return streamApi;
116
+ },
117
+
118
+ abort: async () => {
119
+ self.#dispatchEvent("error");
120
+ return streamApi;
121
+ },
122
+
123
+ // Additional required properties
124
+ get responseReadable() {
125
+ return null as unknown as ReadableStream;
126
+ },
127
+
128
+ get aborted() {
129
+ return self.readyState === 2; // CLOSED
130
+ },
131
+
132
+ get closed() {
133
+ return self.readyState === 2; // CLOSED
134
+ },
135
+ };
136
+
137
+ return streamApi;
138
+ }
139
+
140
+ /**
141
+ * Closes the connection
142
+ */
143
+ close(): void {
144
+ if (this.readyState === 2) {
145
+ // CLOSED
146
+ return;
147
+ }
148
+
149
+ logger().debug("closing FakeEventSource");
150
+ this.readyState = 2; // CLOSED
151
+
152
+ // Call the close callback
153
+ this.#onCloseCallback().catch((err) => {
154
+ logger().error("error in onClose callback", { error: err });
155
+ });
156
+
157
+ // Dispatch close event
158
+ this.#dispatchEvent("close");
159
+ }
160
+
161
+ /**
162
+ * Get the stream API to pass to the handler
163
+ */
164
+ getStream(): SSEStreamingApi {
165
+ return this.#stream;
166
+ }
167
+
168
+ // Implementation of EventTarget-like interface
169
+ addEventListener(type: string, listener: EventListener): void {
170
+ if (!this.#listeners[type]) {
171
+ this.#listeners[type] = new Set();
172
+ }
173
+ this.#listeners[type].add(listener);
174
+ }
175
+
176
+ removeEventListener(type: string, listener: EventListener): void {
177
+ if (this.#listeners[type]) {
178
+ this.#listeners[type].delete(listener);
179
+ }
180
+ }
181
+
182
+ dispatchEvent(event: UniversalEvent): boolean {
183
+ this.#dispatchEvent(event.type, event);
184
+ return true;
185
+ }
186
+
187
+ // Internal method to dispatch events
188
+ #dispatchEvent(type: string, detail?: Record<string, any>): void {
189
+ // Create appropriate event object
190
+ let event: any;
191
+ if (type === "message") {
192
+ event = {
193
+ type: "message",
194
+ target: this,
195
+ data: detail?.data || "",
196
+ origin: "",
197
+ lastEventId: "",
198
+ };
199
+ } else if (type === "close") {
200
+ event = {
201
+ type: "close",
202
+ target: this,
203
+ code: detail?.code || 1000,
204
+ reason: detail?.reason || "",
205
+ wasClean: detail?.wasClean ?? true,
206
+ };
207
+ } else if (type === "error") {
208
+ event = {
209
+ type: "error",
210
+ target: this,
211
+ error: detail?.error,
212
+ };
213
+ } else {
214
+ event = {
215
+ type: type,
216
+ target: this,
217
+ };
218
+ }
219
+
220
+ // Call all listeners first
221
+ if (this.#listeners[type]) {
222
+ for (const listener of this.#listeners[type]) {
223
+ try {
224
+ listener.call(this, event);
225
+ } catch (err) {
226
+ logger().error(`error in ${type} event listener`, { error: err });
227
+ }
228
+ }
229
+ }
230
+
231
+ // Then call specific handler
232
+ switch (type) {
233
+ case "open":
234
+ if (this.onopen) {
235
+ try {
236
+ this.onopen.call(this as any, event);
237
+ } catch (err) {
238
+ logger().error("error in onopen handler", { error: err });
239
+ }
240
+ }
241
+ break;
242
+ case "message":
243
+ if (this.onmessage) {
244
+ try {
245
+ this.onmessage.call(this as any, event);
246
+ } catch (err) {
247
+ logger().error("error in onmessage handler", { error: err });
248
+ }
249
+ }
250
+ break;
251
+ case "error":
252
+ if (this.onerror) {
253
+ try {
254
+ this.onerror.call(this as any, event);
255
+ } catch (err) {
256
+ logger().error("error in onerror handler", { error: err });
257
+ }
258
+ }
259
+ break;
260
+ case "close":
261
+ // Note: EventSource doesn't have onclose in the standard API
262
+ // but we handle it here for consistency
263
+ break;
264
+ }
265
+ }
266
+ }