fix(app): reconnect event stream on disconnect
This commit is contained in:
@@ -46,6 +46,7 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
|
|||||||
type Queued = { directory: string; payload: Event }
|
type Queued = { directory: string; payload: Event }
|
||||||
const FLUSH_FRAME_MS = 16
|
const FLUSH_FRAME_MS = 16
|
||||||
const STREAM_YIELD_MS = 8
|
const STREAM_YIELD_MS = 8
|
||||||
|
const RECONNECT_DELAY_MS = 250
|
||||||
|
|
||||||
let queue: Queued[] = []
|
let queue: Queued[] = []
|
||||||
let buffer: Queued[] = []
|
let buffer: Queued[] = []
|
||||||
@@ -91,8 +92,11 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
|
|||||||
}
|
}
|
||||||
|
|
||||||
let streamErrorLogged = false
|
let streamErrorLogged = false
|
||||||
|
const wait = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms))
|
||||||
|
|
||||||
void (async () => {
|
void (async () => {
|
||||||
|
while (!abort.signal.aborted) {
|
||||||
|
try {
|
||||||
const events = await eventSdk.global.event({
|
const events = await eventSdk.global.event({
|
||||||
onSseError: (error) => {
|
onSseError: (error) => {
|
||||||
if (streamErrorLogged) return
|
if (streamErrorLogged) return
|
||||||
@@ -106,6 +110,7 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
|
|||||||
})
|
})
|
||||||
let yielded = Date.now()
|
let yielded = Date.now()
|
||||||
for await (const event of events.stream) {
|
for await (const event of events.stream) {
|
||||||
|
streamErrorLogged = false
|
||||||
const directory = event.directory ?? "global"
|
const directory = event.directory ?? "global"
|
||||||
const payload = event.payload
|
const payload = event.payload
|
||||||
const k = key(directory, payload)
|
const k = key(directory, payload)
|
||||||
@@ -122,19 +127,23 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
|
|||||||
|
|
||||||
if (Date.now() - yielded < STREAM_YIELD_MS) continue
|
if (Date.now() - yielded < STREAM_YIELD_MS) continue
|
||||||
yielded = Date.now()
|
yielded = Date.now()
|
||||||
await new Promise<void>((resolve) => setTimeout(resolve, 0))
|
await wait(0)
|
||||||
}
|
}
|
||||||
})()
|
} catch (error) {
|
||||||
.finally(flush)
|
if (!streamErrorLogged) {
|
||||||
.catch((error) => {
|
|
||||||
if (streamErrorLogged) return
|
|
||||||
streamErrorLogged = true
|
streamErrorLogged = true
|
||||||
console.error("[global-sdk] event stream failed", {
|
console.error("[global-sdk] event stream failed", {
|
||||||
url: server.url,
|
url: server.url,
|
||||||
fetch: eventFetch ? "platform" : "webview",
|
fetch: eventFetch ? "platform" : "webview",
|
||||||
error,
|
error,
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (abort.signal.aborted) return
|
||||||
|
await wait(RECONNECT_DELAY_MS)
|
||||||
|
}
|
||||||
|
})().finally(flush)
|
||||||
|
|
||||||
onCleanup(() => {
|
onCleanup(() => {
|
||||||
abort.abort()
|
abort.abort()
|
||||||
|
|||||||
Reference in New Issue
Block a user