mirror of
https://github.com/discordeno/discordeno.git
synced 2026-06-16 11:28:15 +00:00
52 lines
1.3 KiB
TypeScript
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;
|
|
}
|