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.
- package/dist/schemas/actor-persist/v1.ts +228 -0
- package/dist/schemas/client-protocol/v1.ts +429 -0
- package/dist/schemas/file-system-driver/v1.ts +102 -0
- package/dist/tsup/actor/errors.cjs +69 -0
- package/dist/tsup/actor/errors.cjs.map +1 -0
- package/dist/tsup/actor/errors.d.cts +143 -0
- package/dist/tsup/actor/errors.d.ts +143 -0
- package/dist/tsup/actor/errors.js +69 -0
- package/dist/tsup/actor/errors.js.map +1 -0
- package/dist/tsup/chunk-2CRLFV6Z.cjs +202 -0
- package/dist/tsup/chunk-2CRLFV6Z.cjs.map +1 -0
- package/dist/tsup/chunk-3H7O2A7I.js +525 -0
- package/dist/tsup/chunk-3H7O2A7I.js.map +1 -0
- package/dist/tsup/chunk-42I3OZ3Q.js +15 -0
- package/dist/tsup/chunk-42I3OZ3Q.js.map +1 -0
- package/dist/tsup/chunk-4NSUQZ2H.js +1790 -0
- package/dist/tsup/chunk-4NSUQZ2H.js.map +1 -0
- package/dist/tsup/chunk-6PDXBYI5.js +132 -0
- package/dist/tsup/chunk-6PDXBYI5.js.map +1 -0
- package/dist/tsup/chunk-6WKQDDUD.cjs +1790 -0
- package/dist/tsup/chunk-6WKQDDUD.cjs.map +1 -0
- package/dist/tsup/chunk-CTBOSFUH.cjs +116 -0
- package/dist/tsup/chunk-CTBOSFUH.cjs.map +1 -0
- package/dist/tsup/chunk-EGVZZFE2.js +2857 -0
- package/dist/tsup/chunk-EGVZZFE2.js.map +1 -0
- package/dist/tsup/chunk-FCCPJNMA.cjs +132 -0
- package/dist/tsup/chunk-FCCPJNMA.cjs.map +1 -0
- package/dist/tsup/chunk-FLMTTN27.js +244 -0
- package/dist/tsup/chunk-FLMTTN27.js.map +1 -0
- package/dist/tsup/chunk-GIR3AFFI.cjs +315 -0
- package/dist/tsup/chunk-GIR3AFFI.cjs.map +1 -0
- package/dist/tsup/chunk-INGJP237.js +315 -0
- package/dist/tsup/chunk-INGJP237.js.map +1 -0
- package/dist/tsup/chunk-KJCJLKRM.js +116 -0
- package/dist/tsup/chunk-KJCJLKRM.js.map +1 -0
- package/dist/tsup/chunk-KUPQZYUQ.cjs +15 -0
- package/dist/tsup/chunk-KUPQZYUQ.cjs.map +1 -0
- package/dist/tsup/chunk-O2MBYIXO.cjs +2857 -0
- package/dist/tsup/chunk-O2MBYIXO.cjs.map +1 -0
- package/dist/tsup/chunk-OGAPU3UG.cjs +525 -0
- package/dist/tsup/chunk-OGAPU3UG.cjs.map +1 -0
- package/dist/tsup/chunk-OV6AYD4S.js +4406 -0
- package/dist/tsup/chunk-OV6AYD4S.js.map +1 -0
- package/dist/tsup/chunk-PO4VLDWA.js +47 -0
- package/dist/tsup/chunk-PO4VLDWA.js.map +1 -0
- package/dist/tsup/chunk-R2OPSKIV.cjs +244 -0
- package/dist/tsup/chunk-R2OPSKIV.cjs.map +1 -0
- package/dist/tsup/chunk-TZJKSBUQ.cjs +47 -0
- package/dist/tsup/chunk-TZJKSBUQ.cjs.map +1 -0
- package/dist/tsup/chunk-UBUC5C3G.cjs +189 -0
- package/dist/tsup/chunk-UBUC5C3G.cjs.map +1 -0
- package/dist/tsup/chunk-UIM22YJL.cjs +4406 -0
- package/dist/tsup/chunk-UIM22YJL.cjs.map +1 -0
- package/dist/tsup/chunk-URVFQMYI.cjs +230 -0
- package/dist/tsup/chunk-URVFQMYI.cjs.map +1 -0
- package/dist/tsup/chunk-UVUPOS46.js +230 -0
- package/dist/tsup/chunk-UVUPOS46.js.map +1 -0
- package/dist/tsup/chunk-VRRHBNJC.js +189 -0
- package/dist/tsup/chunk-VRRHBNJC.js.map +1 -0
- package/dist/tsup/chunk-XFSS33EQ.js +202 -0
- package/dist/tsup/chunk-XFSS33EQ.js.map +1 -0
- package/dist/tsup/client/mod.cjs +32 -0
- package/dist/tsup/client/mod.cjs.map +1 -0
- package/dist/tsup/client/mod.d.cts +26 -0
- package/dist/tsup/client/mod.d.ts +26 -0
- package/dist/tsup/client/mod.js +32 -0
- package/dist/tsup/client/mod.js.map +1 -0
- package/dist/tsup/common/log.cjs +13 -0
- package/dist/tsup/common/log.cjs.map +1 -0
- package/dist/tsup/common/log.d.cts +20 -0
- package/dist/tsup/common/log.d.ts +20 -0
- package/dist/tsup/common/log.js +13 -0
- package/dist/tsup/common/log.js.map +1 -0
- package/dist/tsup/common/websocket.cjs +10 -0
- package/dist/tsup/common/websocket.cjs.map +1 -0
- package/dist/tsup/common/websocket.d.cts +3 -0
- package/dist/tsup/common/websocket.d.ts +3 -0
- package/dist/tsup/common/websocket.js +10 -0
- package/dist/tsup/common/websocket.js.map +1 -0
- package/dist/tsup/common-CpqORuCq.d.cts +218 -0
- package/dist/tsup/common-CpqORuCq.d.ts +218 -0
- package/dist/tsup/connection-BR_Ve4ku.d.cts +2117 -0
- package/dist/tsup/connection-BwUMoe6n.d.ts +2117 -0
- package/dist/tsup/driver-helpers/mod.cjs +33 -0
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
- package/dist/tsup/driver-helpers/mod.d.cts +18 -0
- package/dist/tsup/driver-helpers/mod.d.ts +18 -0
- package/dist/tsup/driver-helpers/mod.js +33 -0
- package/dist/tsup/driver-helpers/mod.js.map +1 -0
- package/dist/tsup/driver-test-suite/mod.cjs +4619 -0
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
- package/dist/tsup/driver-test-suite/mod.d.cts +57 -0
- package/dist/tsup/driver-test-suite/mod.d.ts +57 -0
- package/dist/tsup/driver-test-suite/mod.js +4619 -0
- package/dist/tsup/driver-test-suite/mod.js.map +1 -0
- package/dist/tsup/inspector/mod.cjs +53 -0
- package/dist/tsup/inspector/mod.cjs.map +1 -0
- package/dist/tsup/inspector/mod.d.cts +408 -0
- package/dist/tsup/inspector/mod.d.ts +408 -0
- package/dist/tsup/inspector/mod.js +53 -0
- package/dist/tsup/inspector/mod.js.map +1 -0
- package/dist/tsup/mod.cjs +73 -0
- package/dist/tsup/mod.cjs.map +1 -0
- package/dist/tsup/mod.d.cts +100 -0
- package/dist/tsup/mod.d.ts +100 -0
- package/dist/tsup/mod.js +73 -0
- package/dist/tsup/mod.js.map +1 -0
- package/dist/tsup/router-endpoints-AYkXG8Tl.d.cts +66 -0
- package/dist/tsup/router-endpoints-DAbqVFx2.d.ts +66 -0
- package/dist/tsup/test/mod.cjs +21 -0
- package/dist/tsup/test/mod.cjs.map +1 -0
- package/dist/tsup/test/mod.d.cts +27 -0
- package/dist/tsup/test/mod.d.ts +27 -0
- package/dist/tsup/test/mod.js +21 -0
- package/dist/tsup/test/mod.js.map +1 -0
- package/dist/tsup/utils-CT0cv4jd.d.cts +17 -0
- package/dist/tsup/utils-CT0cv4jd.d.ts +17 -0
- package/dist/tsup/utils.cjs +26 -0
- package/dist/tsup/utils.cjs.map +1 -0
- package/dist/tsup/utils.d.cts +36 -0
- package/dist/tsup/utils.d.ts +36 -0
- package/dist/tsup/utils.js +26 -0
- package/dist/tsup/utils.js.map +1 -0
- package/package.json +208 -5
- package/src/actor/action.ts +182 -0
- package/src/actor/config.ts +765 -0
- package/src/actor/connection.ts +260 -0
- package/src/actor/context.ts +171 -0
- package/src/actor/database.ts +23 -0
- package/src/actor/definition.ts +86 -0
- package/src/actor/driver.ts +84 -0
- package/src/actor/errors.ts +360 -0
- package/src/actor/generic-conn-driver.ts +234 -0
- package/src/actor/instance.ts +1800 -0
- package/src/actor/log.ts +15 -0
- package/src/actor/mod.ts +113 -0
- package/src/actor/persisted.ts +42 -0
- package/src/actor/protocol/old.ts +281 -0
- package/src/actor/protocol/serde.ts +131 -0
- package/src/actor/router-endpoints.ts +685 -0
- package/src/actor/router.ts +263 -0
- package/src/actor/schedule.ts +17 -0
- package/src/actor/unstable-react.ts +110 -0
- package/src/actor/utils.ts +98 -0
- package/src/client/actor-common.ts +30 -0
- package/src/client/actor-conn.ts +804 -0
- package/src/client/actor-handle.ts +208 -0
- package/src/client/client.ts +623 -0
- package/src/client/errors.ts +41 -0
- package/src/client/http-client-driver.ts +326 -0
- package/src/client/log.ts +7 -0
- package/src/client/mod.ts +56 -0
- package/src/client/raw-utils.ts +92 -0
- package/src/client/test.ts +44 -0
- package/src/client/utils.ts +150 -0
- package/src/common/eventsource-interface.ts +47 -0
- package/src/common/eventsource.ts +80 -0
- package/src/common/fake-event-source.ts +266 -0
- package/src/common/inline-websocket-adapter2.ts +445 -0
- package/src/common/log-levels.ts +27 -0
- package/src/common/log.ts +139 -0
- package/src/common/logfmt.ts +228 -0
- package/src/common/network.ts +2 -0
- package/src/common/router.ts +87 -0
- package/src/common/utils.ts +322 -0
- package/src/common/versioned-data.ts +95 -0
- package/src/common/websocket-interface.ts +49 -0
- package/src/common/websocket.ts +43 -0
- package/src/driver-helpers/mod.ts +22 -0
- package/src/driver-helpers/utils.ts +17 -0
- package/src/driver-test-suite/log.ts +7 -0
- package/src/driver-test-suite/mod.ts +213 -0
- package/src/driver-test-suite/test-inline-client-driver.ts +402 -0
- package/src/driver-test-suite/tests/action-features.ts +136 -0
- package/src/driver-test-suite/tests/actor-auth.ts +591 -0
- package/src/driver-test-suite/tests/actor-conn-state.ts +249 -0
- package/src/driver-test-suite/tests/actor-conn.ts +349 -0
- package/src/driver-test-suite/tests/actor-driver.ts +25 -0
- package/src/driver-test-suite/tests/actor-error-handling.ts +158 -0
- package/src/driver-test-suite/tests/actor-handle.ts +259 -0
- package/src/driver-test-suite/tests/actor-inline-client.ts +152 -0
- package/src/driver-test-suite/tests/actor-inspector.ts +570 -0
- package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
- package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +108 -0
- package/src/driver-test-suite/tests/actor-sleep.ts +413 -0
- package/src/driver-test-suite/tests/actor-state.ts +54 -0
- package/src/driver-test-suite/tests/actor-vars.ts +93 -0
- package/src/driver-test-suite/tests/manager-driver.ts +365 -0
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +226 -0
- package/src/driver-test-suite/tests/raw-http-request-properties.ts +414 -0
- package/src/driver-test-suite/tests/raw-http.ts +347 -0
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +392 -0
- package/src/driver-test-suite/tests/raw-websocket.ts +484 -0
- package/src/driver-test-suite/tests/request-access.ts +244 -0
- package/src/driver-test-suite/utils.ts +68 -0
- package/src/drivers/default.ts +31 -0
- package/src/drivers/engine/actor-driver.ts +360 -0
- package/src/drivers/engine/api-endpoints.ts +128 -0
- package/src/drivers/engine/api-utils.ts +70 -0
- package/src/drivers/engine/config.ts +39 -0
- package/src/drivers/engine/keys.test.ts +266 -0
- package/src/drivers/engine/keys.ts +89 -0
- package/src/drivers/engine/kv.ts +3 -0
- package/src/drivers/engine/log.ts +7 -0
- package/src/drivers/engine/manager-driver.ts +391 -0
- package/src/drivers/engine/mod.ts +36 -0
- package/src/drivers/engine/ws-proxy.ts +170 -0
- package/src/drivers/file-system/actor.ts +91 -0
- package/src/drivers/file-system/global-state.ts +673 -0
- package/src/drivers/file-system/log.ts +7 -0
- package/src/drivers/file-system/manager.ts +306 -0
- package/src/drivers/file-system/mod.ts +48 -0
- package/src/drivers/file-system/utils.ts +109 -0
- package/src/globals.d.ts +6 -0
- package/src/inline-client-driver/log.ts +7 -0
- package/src/inline-client-driver/mod.ts +385 -0
- package/src/inspector/actor.ts +298 -0
- package/src/inspector/config.ts +83 -0
- package/src/inspector/log.ts +5 -0
- package/src/inspector/manager.ts +86 -0
- package/src/inspector/mod.ts +2 -0
- package/src/inspector/protocol/actor.ts +10 -0
- package/src/inspector/protocol/common.ts +196 -0
- package/src/inspector/protocol/manager.ts +10 -0
- package/src/inspector/protocol/mod.ts +2 -0
- package/src/inspector/utils.ts +76 -0
- package/src/manager/auth.ts +121 -0
- package/src/manager/driver.ts +80 -0
- package/src/manager/hono-websocket-adapter.ts +333 -0
- package/src/manager/log.ts +7 -0
- package/src/manager/mod.ts +2 -0
- package/src/manager/protocol/mod.ts +24 -0
- package/src/manager/protocol/query.ts +89 -0
- package/src/manager/router.ts +1792 -0
- package/src/mod.ts +20 -0
- package/src/registry/config.ts +32 -0
- package/src/registry/log.ts +7 -0
- package/src/registry/mod.ts +124 -0
- package/src/registry/run-config.ts +54 -0
- package/src/registry/serve.ts +53 -0
- package/src/schemas/actor-persist/mod.ts +1 -0
- package/src/schemas/actor-persist/versioned.ts +25 -0
- package/src/schemas/client-protocol/mod.ts +1 -0
- package/src/schemas/client-protocol/versioned.ts +63 -0
- package/src/schemas/file-system-driver/mod.ts +1 -0
- package/src/schemas/file-system-driver/versioned.ts +28 -0
- package/src/serde.ts +84 -0
- package/src/test/config.ts +16 -0
- package/src/test/log.ts +7 -0
- package/src/test/mod.ts +153 -0
- package/src/utils.ts +172 -0
- 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
|
+
}
|