// EventSource mock
// https://html.spec.whatwg.org/multipage/server-sent-events.html#eventsource
export const sources: { [key: string]: MockEventSource } = {};
class MockEventSource {
private url: string;
private listeners: { [event: string]: Array<(event: MessageEvent) => void> };
public readyState: number;
constructor(url: string) {
this.listeners = {};
this.readyState = 1;
this.url = url;
sources[url] = this;
}
addEventListener(event: string, callback: (event: MessageEvent) => void) {
if (!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event].push(callback);
}
removeEventListener(event: string, callback: (event: MessageEvent) => void) {
if (this.listeners[event]) {
const index = this.listeners[event].indexOf(callback);
if (index !== -1) {
this.listeners[event].splice(index, 1);
}
}
}
dispatchEvent(event: MessageEvent) {
if (this.listeners[event.type]) {
this.listeners[event.type].forEach((callback) => {
callback(event);
});
}
}
close() {
delete sources[this.url];
}
set onmessage(callback: (this: EventSource, ev: MessageEvent) => unknown) {
this.addEventListener("message", callback);
}
// Simulate receiving an SSE event
receiveEvent(eventName: string, eventData: unknown) {
const event = new MessageEvent(eventName, { data: eventData });
this.dispatchEvent(event);
}
}
export default MockEventSource;