Skip to content

Commit dd296f7

Browse files
committed
fix(app): reconnect event stream on disconnect
1 parent fb7b2f6 commit dd296f7

1 file changed

Lines changed: 46 additions & 37 deletions

File tree

packages/app/src/context/global-sdk.tsx

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
4646
type Queued = { directory: string; payload: Event }
4747
const FLUSH_FRAME_MS = 16
4848
const STREAM_YIELD_MS = 8
49+
const RECONNECT_DELAY_MS = 250
4950

5051
let queue: Queued[] = []
5152
let buffer: Queued[] = []
@@ -91,50 +92,58 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
9192
}
9293

9394
let streamErrorLogged = false
95+
const wait = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms))
9496

9597
void (async () => {
96-
const events = await eventSdk.global.event({
97-
onSseError: (error) => {
98-
if (streamErrorLogged) return
99-
streamErrorLogged = true
100-
console.error("[global-sdk] event stream error", {
101-
url: server.url,
102-
fetch: eventFetch ? "platform" : "webview",
103-
error,
98+
while (!abort.signal.aborted) {
99+
try {
100+
const events = await eventSdk.global.event({
101+
onSseError: (error) => {
102+
if (streamErrorLogged) return
103+
streamErrorLogged = true
104+
console.error("[global-sdk] event stream error", {
105+
url: server.url,
106+
fetch: eventFetch ? "platform" : "webview",
107+
error,
108+
})
109+
},
104110
})
105-
},
106-
})
107-
let yielded = Date.now()
108-
for await (const event of events.stream) {
109-
const directory = event.directory ?? "global"
110-
const payload = event.payload
111-
const k = key(directory, payload)
112-
if (k) {
113-
const i = coalesced.get(k)
114-
if (i !== undefined) {
115-
queue[i] = { directory, payload }
116-
continue
111+
let yielded = Date.now()
112+
for await (const event of events.stream) {
113+
streamErrorLogged = false
114+
const directory = event.directory ?? "global"
115+
const payload = event.payload
116+
const k = key(directory, payload)
117+
if (k) {
118+
const i = coalesced.get(k)
119+
if (i !== undefined) {
120+
queue[i] = { directory, payload }
121+
continue
122+
}
123+
coalesced.set(k, queue.length)
124+
}
125+
queue.push({ directory, payload })
126+
schedule()
127+
128+
if (Date.now() - yielded < STREAM_YIELD_MS) continue
129+
yielded = Date.now()
130+
await wait(0)
131+
}
132+
} catch (error) {
133+
if (!streamErrorLogged) {
134+
streamErrorLogged = true
135+
console.error("[global-sdk] event stream failed", {
136+
url: server.url,
137+
fetch: eventFetch ? "platform" : "webview",
138+
error,
139+
})
117140
}
118-
coalesced.set(k, queue.length)
119141
}
120-
queue.push({ directory, payload })
121-
schedule()
122142

123-
if (Date.now() - yielded < STREAM_YIELD_MS) continue
124-
yielded = Date.now()
125-
await new Promise<void>((resolve) => setTimeout(resolve, 0))
143+
if (abort.signal.aborted) return
144+
await wait(RECONNECT_DELAY_MS)
126145
}
127-
})()
128-
.finally(flush)
129-
.catch((error) => {
130-
if (streamErrorLogged) return
131-
streamErrorLogged = true
132-
console.error("[global-sdk] event stream failed", {
133-
url: server.url,
134-
fetch: eventFetch ? "platform" : "webview",
135-
error,
136-
})
137-
})
146+
})().finally(flush)
138147

139148
onCleanup(() => {
140149
abort.abort()

0 commit comments

Comments
 (0)