aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/lib/realtime.ts
diff options
context:
space:
mode:
authorzwlucas <lucas.fariamo08@gmail.com>2026-05-29 18:57:37 +0000
committerzwlucas <lucas.fariamo08@gmail.com>2026-05-29 18:57:37 +0000
commit6cc0bfd1d79074df790272b8091b1f0226d14283 (patch)
treecab18b0f708cf3b0eaeeeb98e2cf81459365b33e /frontend/src/lib/realtime.ts
downloadyaum-6cc0bfd1d79074df790272b8091b1f0226d14283.tar.gz
yaum-6cc0bfd1d79074df790272b8091b1f0226d14283.zip
feat: upload project
Signed-off-by: zwlucas <lucas.fariamo08@gmail.com>
Diffstat (limited to 'frontend/src/lib/realtime.ts')
-rw-r--r--frontend/src/lib/realtime.ts42
1 files changed, 42 insertions, 0 deletions
diff --git a/frontend/src/lib/realtime.ts b/frontend/src/lib/realtime.ts
new file mode 100644
index 0000000..fb9c75c
--- /dev/null
+++ b/frontend/src/lib/realtime.ts
@@ -0,0 +1,42 @@
+import type { Heartbeat } from '$lib/types';
+
+type Listener = (hb: Heartbeat) => void;
+
+const listeners = new Set<Listener>();
+let es: EventSource | null = null;
+
+function connect() {
+ if (es) return;
+
+ es = new EventSource('/api/stream');
+
+ es.addEventListener('connected', () => {
+ console.log('[sse] conectado');
+ });
+
+ es.addEventListener('heartbeat', (event: MessageEvent) => {
+ try {
+ const hb: Heartbeat = JSON.parse(event.data);
+ listeners.forEach((fn) => fn(hb));
+ } catch {
+ // ignore parse errors
+ }
+ });
+
+ es.onerror = () => {
+ console.warn('[sse] erro — reconectando...');
+ };
+}
+
+export function subscribeHeartbeats(fn: Listener) {
+ listeners.add(fn);
+ connect();
+
+ return () => {
+ listeners.delete(fn);
+ if (listeners.size === 0 && es) {
+ es.close();
+ es = null;
+ }
+ };
+}