42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
import { VoiceOpcodes } from "../../deps.ts";
|
|
import { setDriftlessTimeout } from "npm:driftless";
|
|
import { ConnectionData } from "../mod.ts";
|
|
|
|
function sendHeartBeat(conn: ConnectionData) {
|
|
if (conn.context.lastHeart !== undefined) {
|
|
conn.context.missedHeart++;
|
|
}
|
|
conn.context.lastHeart = Date.now();
|
|
conn.ws?.send(
|
|
JSON.stringify({
|
|
op: VoiceOpcodes.Heartbeat,
|
|
d: conn.context.lastHeart,
|
|
})
|
|
);
|
|
}
|
|
|
|
export function sendHeart(conn: ConnectionData, interval: number) {
|
|
let last = Date.now();
|
|
if (conn.ws?.readyState === WebSocket.OPEN) {
|
|
sendHeartBeat(conn);
|
|
}
|
|
let done = false;
|
|
const repeatBeat = () => {
|
|
if (done || conn.ws?.readyState !== WebSocket.OPEN) {
|
|
return;
|
|
}
|
|
if (conn.context.missedHeart >= 3) {
|
|
console.log("Missed too many heartbeats, attempting reconnect");
|
|
conn.ws?.close();
|
|
return;
|
|
}
|
|
last = Date.now();
|
|
sendHeartBeat(conn);
|
|
setDriftlessTimeout(repeatBeat, interval + (last - Date.now()));
|
|
};
|
|
setDriftlessTimeout(repeatBeat, interval + (last - Date.now()));
|
|
return () => {
|
|
done = true;
|
|
};
|
|
}
|