From 379838d0f7451b72607cb7b435d06194f06d2a34 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Tue, 18 Feb 2025 04:22:29 +0000 Subject: [PATCH] added sseevents --- packages/app/src/classes/SSEEvents/index.js | 47 +++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 packages/app/src/classes/SSEEvents/index.js diff --git a/packages/app/src/classes/SSEEvents/index.js b/packages/app/src/classes/SSEEvents/index.js new file mode 100644 index 00000000..bd3ee2b4 --- /dev/null +++ b/packages/app/src/classes/SSEEvents/index.js @@ -0,0 +1,47 @@ +export default class SSEEvents { + constructor(url, events) { + this.url = url + + for (const [event, handler] of Object.entries(events)) { + this.handlers.set(event, handler) + } + + this.eventSource = new EventSource(url) + + this.eventSource.onmessage = (event) => { + const parsed = JSON.parse(event.data) + + console.debug(`[SSE] Message received`, parsed) + + if (typeof parsed.event !== "string") { + console.error(`[SSE] Invalid event type: ${parsed.event}`) + return + } + + this.trigger(parsed.event, parsed.data) + } + } + + handlers = new Map() + + on = (event, fn) => { + this.handlers.set(event, fn) + } + + off = (event) => { + this.handlers.delete(event) + } + + trigger = (event, data) => { + const handler = this.handlers.get(event) + + if (handler) { + handler(data) + } + } + + close = () => { + console.log(`[SSE] Closing connection`) + this.eventSource.close() + } +}