Files
discordeno/src/ws/heartbeat.ts
T
2021-04-09 21:37:13 +02:00

45 lines
1.2 KiB
TypeScript

import { DiscordGatewayOpcodes } from "../types/codes/gateway_opcodes.ts";
import { ws } from "./ws.ts";
export function heartbeat(shardId: number, interval: number) {
ws.log("HEARTBEATING_STARTED", { shardId, interval });
const shard = ws.shards.get(shardId);
if (!shard) return;
ws.log("HEARTBEATING_DETAILS", { shardId, interval, shard });
shard.heartbeat.keepAlive = true;
shard.heartbeat.acknowledged = false;
shard.heartbeat.lastSentAt = Date.now();
shard.heartbeat.interval = interval;
shard.heartbeat.intervalId = setInterval(() => {
ws.log(
"DEBUG",
`Running setInterval in heartbeat file.`,
);
const currentShard = ws.shards.get(shardId);
if (!currentShard) return;
ws.log("HEARTBEATING", { shardId, shard: currentShard });
if (
currentShard.ws.readyState === WebSocket.CLOSED ||
!currentShard.heartbeat.keepAlive
) {
ws.log("HEARTBEATING_CLOSED", { shardId, shard: currentShard });
// STOP THE HEARTBEAT
return clearInterval(currentShard.heartbeat.intervalId);
}
currentShard.ws.send(
JSON.stringify({
op: DiscordGatewayOpcodes.Heartbeat,
d: currentShard.previousSequenceNumber,
}),
);
}, interval);
}