Files
discordeno/src/ws/create_shard.ts
T
Skillz4Killz ad87124bca more stuff
2021-04-08 19:26:38 +00:00

52 lines
1.3 KiB
TypeScript

import { identify } from "./identify.ts";
import { resume } from "./resume.ts";
import { ws } from "./ws.ts";
// deno-lint-ignore require-await
export async function createShard(shardId: number) {
const socket = new WebSocket(ws.botGatewayData.url);
socket.binaryType = "arraybuffer";
socket.onerror = (errorEvent) => {
ws.log("ERROR", { shardId, error: errorEvent });
};
socket.onmessage = ({ data: message }) =>
ws.handleOnMessage(message, shardId);
socket.onclose = (event) => {
ws.log("CLOSED", { shardId, payload: event });
if (event.code === 4009 && ["Resharded!", "Resuming the shard, closing old shard."].includes(event.reason)) {
return ws.log("CLOSED_RECONNECT", { shardId, payload: event });
}
// TODO: ENUM FOR THESE CODES?
switch (event.code) {
case 4001:
case 4002:
case 4004:
case 4005:
case 4010:
case 4011:
case 4012:
case 4013:
case 4014:
throw new Error(
event.reason || "Discord gave no reason! GG! You broke Discord!"
);
// THESE ERRORS CAN NO BE RESUMED! THEY MUST RE-IDENTIFY!
case 4003:
case 4007:
case 4008:
case 4009:
identify(shardId, ws.maxShards);
break;
default:
resume(shardId);
break;
}
};
return socket;
}