Files
discordeno/src/ws/identify.ts
2021-04-14 21:05:40 +02:00

58 lines
1.4 KiB
TypeScript

import { DiscordGatewayOpcodes } from "../types/codes/gateway_opcodes.ts";
import { ws } from "./ws.ts";
export async function identify(shardId: number, maxShards: number) {
ws.log("IDENTIFYING", { shardId, maxShards });
// Need to clear the old heartbeat interval
const oldShard = ws.shards.get(shardId);
if (oldShard) {
clearInterval(oldShard.heartbeat.intervalId);
}
// CREATE A SHARD
const socket = await ws.createShard(shardId);
// Identify can just set/reset the settings for the shard
ws.shards.set(shardId, {
id: shardId,
ws: socket,
resumeInterval: 0,
sessionId: "",
previousSequenceNumber: 0,
resuming: false,
ready: false,
unavailableGuildIds: new Set(),
heartbeat: {
lastSentAt: 0,
lastReceivedAt: 0,
acknowledged: false,
keepAlive: false,
interval: 0,
intervalId: 0,
},
queue: [],
processingQueue: false,
queueStartedAt: Date.now(),
});
socket.onopen = () => {
ws.shards.get(shardId)?.queue.unshift({
op: DiscordGatewayOpcodes.Identify,
d: { ...ws.identifyPayload, shard: [shardId, maxShards] },
});
ws.processQueue(shardId);
};
return new Promise((resolve, reject) => {
ws.loadingShards.set(shardId, {
shardId,
resolve,
reject,
startedAt: Date.now(),
});
ws.cleanupLoadingShards();
});
}