From 68f346acbf790bab41597811e3d34a9ef5b7accf Mon Sep 17 00:00:00 2001 From: Buck Doyle Date: Fri, 28 Feb 2025 15:30:12 -0800 Subject: [PATCH] Restore some eventSource code --- packages/host/app/services/message-service.ts | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/host/app/services/message-service.ts b/packages/host/app/services/message-service.ts index 5589115e84..8083a2c1db 100644 --- a/packages/host/app/services/message-service.ts +++ b/packages/host/app/services/message-service.ts @@ -1,9 +1,17 @@ import Service, { service } from '@ember/service'; +import { isTesting } from '@embroider/macros'; + import { tracked } from '@glimmer/tracking'; +import window from 'ember-window-mock'; + +import qs from 'qs'; + import type { RealmEventEventContent } from 'https://cardstack.com/base/matrix-event'; +import { SessionLocalStorageKey } from '../utils/local-storage-keys'; + import type NetworkService from './network'; export default class MessageService extends Service { @@ -26,14 +34,46 @@ export default class MessageService extends Service { this.listenerCallbacks.set(realmURL, []); } this.listenerCallbacks.get(realmURL)?.push(cb); + + let maybeEventSource = this.subscriptions.get(realmURL); + + if (!maybeEventSource) { + let token = getPersistedTokenForRealm(realmURL); + if (!token) { + throw new Error(`Could not find JWT for realm ${realmURL}`); + } + let urlWithAuth = `${realmURL}_message?${qs.stringify({ + authHeader: 'Bearer ' + token, + })}`; + maybeEventSource = this.network.createEventSource(urlWithAuth); + + if (maybeEventSource) { + maybeEventSource.onerror = () => maybeEventSource?.close(); + maybeEventSource.onmessage = (ev) => { + throw new Error('received unexpected server-sent event: ' + ev); + }; + + this.subscriptions.set(realmURL, maybeEventSource); + } + } + return () => {}; } relayMatrixSSE(realmURL: string, event: RealmEventEventContent) { console.log('relaying matrix sse event', realmURL, event); - console.log('listener callbacks', this.listenerCallbacks); this.listenerCallbacks.get(realmURL)?.forEach((cb) => { cb(event); }); } } + +function getPersistedTokenForRealm(realmURL: string) { + if (isTesting()) { + return 'TEST_TOKEN'; + } + + let sessionStr = window.localStorage.getItem(SessionLocalStorageKey) ?? '{}'; + let session = JSON.parse(sessionStr); + return session[realmURL] as string | undefined; +}