From 5a06be3208cd82ba221c19da82061e42994b8bb5 Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 6 Apr 2023 23:27:27 +0800 Subject: [PATCH] core: websocket: use conn.terminate for timeouts --- packages/hydrooj/src/service/server.ts | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index eeedd1723..fc2af3671 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -384,8 +384,21 @@ export function Connection( // eslint-disable-next-line @typescript-eslint/no-shadow for (const { name, target } of h.__subscribe || []) disposables.push(bus.on(name, target.bind(h))); let lastHeartbeat = Date.now(); - const interval = setInterval(() => { - if (Date.now() - lastHeartbeat > 80000) conn.close(4000, 'Heartbeat timeout'); + let closed = false; + let interval: NodeJS.Timer; + const clean = () => { + if (closed) return; + closed = true; + bus.emit('connection/close', h); + if (interval) clearInterval(interval); + disposables.forEach((d) => d()); + h.cleanup?.(args); + }; + interval = setInterval(() => { + if (Date.now() - lastHeartbeat > 80000) { + clean(); + conn.terminate(); + } if (Date.now() - lastHeartbeat > 30000) conn.send('ping'); }, 40000); conn.onmessage = (e) => { @@ -397,12 +410,7 @@ export function Connection( } h.message?.(JSON.parse(e.data.toString())); }; - conn.onclose = () => { - bus.emit('connection/close', h); - clearInterval(interval); - disposables.forEach((d) => d()); - h.cleanup?.(args); - }; + conn.onclose = clean; await bus.parallel('connection/active', h); } catch (e) { await h.onerror(e);