|
@@ -139,8 +139,22 @@ export namespace Server {
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
GlobalBus.on("event", handler)
|
|
GlobalBus.on("event", handler)
|
|
|
|
|
+
|
|
|
|
|
+ // Send heartbeat every 30s to prevent WKWebView timeout (60s default)
|
|
|
|
|
+ const heartbeat = setInterval(() => {
|
|
|
|
|
+ stream.writeSSE({
|
|
|
|
|
+ data: JSON.stringify({
|
|
|
|
|
+ payload: {
|
|
|
|
|
+ type: "server.heartbeat",
|
|
|
|
|
+ properties: {},
|
|
|
|
|
+ },
|
|
|
|
|
+ }),
|
|
|
|
|
+ })
|
|
|
|
|
+ }, 30000)
|
|
|
|
|
+
|
|
|
await new Promise<void>((resolve) => {
|
|
await new Promise<void>((resolve) => {
|
|
|
stream.onAbort(() => {
|
|
stream.onAbort(() => {
|
|
|
|
|
+ clearInterval(heartbeat)
|
|
|
GlobalBus.off("event", handler)
|
|
GlobalBus.off("event", handler)
|
|
|
resolve()
|
|
resolve()
|
|
|
log.info("global event disconnected")
|
|
log.info("global event disconnected")
|
|
@@ -2470,8 +2484,20 @@ export namespace Server {
|
|
|
stream.close()
|
|
stream.close()
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
|
|
+
|
|
|
|
|
+ // Send heartbeat every 30s to prevent WKWebView timeout (60s default)
|
|
|
|
|
+ const heartbeat = setInterval(() => {
|
|
|
|
|
+ stream.writeSSE({
|
|
|
|
|
+ data: JSON.stringify({
|
|
|
|
|
+ type: "server.heartbeat",
|
|
|
|
|
+ properties: {},
|
|
|
|
|
+ }),
|
|
|
|
|
+ })
|
|
|
|
|
+ }, 30000)
|
|
|
|
|
+
|
|
|
await new Promise<void>((resolve) => {
|
|
await new Promise<void>((resolve) => {
|
|
|
stream.onAbort(() => {
|
|
stream.onAbort(() => {
|
|
|
|
|
+ clearInterval(heartbeat)
|
|
|
unsub()
|
|
unsub()
|
|
|
resolve()
|
|
resolve()
|
|
|
log.info("event disconnected")
|
|
log.info("event disconnected")
|