Real heartbeat timeouts server -> client

This commit is contained in:
Ian Gulliver
2020-11-25 23:34:09 +00:00
parent 7d1035f751
commit a95fdbbf10
3 changed files with 26 additions and 2 deletions

View File

@@ -623,8 +623,7 @@ func writeInitial(client *client, w http.ResponseWriter, flusher http.Flusher) {
} }
func writeHeartbeat(w http.ResponseWriter, flusher http.Flusher) { func writeHeartbeat(w http.ResponseWriter, flusher http.Flusher) {
fmt.Fprintf(w, ":\n\n") writeEvent(&event{}, w, flusher)
flusher.Flush()
} }
func writeEvent(e *event, w http.ResponseWriter, flusher http.Flusher) { func writeEvent(e *event, w http.ResponseWriter, flusher http.Flusher) {

View File

@@ -74,7 +74,15 @@ function watch(roomId, clientId, adminSecret, prnt) {
} }
function createEventSource(url) { function createEventSource(url) {
const es = new EventSource(url.toString()); const es = new EventSource(url.toString());
let lastMessage = performance.now();
const intId = setInterval(() => {
if (performance.now() - lastMessage > 10000) {
console.warn("timeout");
es.dispatchEvent(new Event("error"));
}
}, 1000);
es.addEventListener("open", () => { es.addEventListener("open", () => {
console.info("connected");
messageBus.dispatchEvent(new Event("open")); messageBus.dispatchEvent(new Event("open"));
}); });
es.addEventListener("message", (e) => { es.addEventListener("message", (e) => {
@@ -82,10 +90,12 @@ function createEventSource(url) {
data: e.data, data: e.data,
lastEventId: e.lastEventId, lastEventId: e.lastEventId,
})); }));
lastMessage = performance.now();
}); });
es.addEventListener("error", () => { es.addEventListener("error", () => {
console.warn("disconnected"); console.warn("disconnected");
es.close(); es.close();
clearInterval(intId);
setTimeout(() => createEventSource(url), 3000); setTimeout(() => createEventSource(url), 3000);
messageBus.dispatchEvent(new Event("error")); messageBus.dispatchEvent(new Event("error"));
}); });

View File

@@ -159,7 +159,17 @@ function watch(roomId: string, clientId: string, adminSecret: string | null, prn
function createEventSource(url: URL) { function createEventSource(url: URL) {
const es = new EventSource(url.toString()); const es = new EventSource(url.toString());
let lastMessage = performance.now();
const intId = setInterval(() => {
if (performance.now() - lastMessage > 10000) {
console.warn("timeout");
es.dispatchEvent(new Event("error"));
}
}, 1000);
es.addEventListener("open", () => { es.addEventListener("open", () => {
console.info("connected");
messageBus.dispatchEvent(new Event("open")); messageBus.dispatchEvent(new Event("open"));
}); });
@@ -168,11 +178,16 @@ function createEventSource(url: URL) {
data: e.data, data: e.data,
lastEventId: e.lastEventId, lastEventId: e.lastEventId,
})); }));
lastMessage = performance.now();
}); });
es.addEventListener("error", () => { es.addEventListener("error", () => {
console.warn("disconnected"); console.warn("disconnected");
es.close(); es.close();
clearInterval(intId);
setTimeout(() => createEventSource(url), 3000); setTimeout(() => createEventSource(url), 3000);
messageBus.dispatchEvent(new Event("error")); messageBus.dispatchEvent(new Event("error"));