swc/crates/swc_bundler/tests/.cache/deno/2bcc055889975fb5554056da7d75e08fa72ffcee.ts
2021-11-09 20:42:49 +09:00

66 lines
2.4 KiB
TypeScript

// Loaded from https://deno.land/x/discordeno@11.0.0-rc.2/src/ws/create_shard.ts
import { DiscordGatewayCloseEventCodes } from "../types/codes/gateway_close_event_codes.ts";
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 === 3064 || event.reason === "Discordeno Testing Finished! Do Not RESUME!") {
return;
}
if (event.code === 3065 || ["Resharded!", "Resuming the shard, closing old shard."].includes(event.reason)) {
return ws.log("CLOSED_RECONNECT", { shardId, payload: event });
}
switch (event.code) {
// Discordeno tests finished
case 3061:
return;
case 3063: // Resharded
case 3064: // Resuming
case 3065: // Reidentifying
case 3066: // Missing ACK
// Will restart shard manually
return ws.log("CLOSED_RECONNECT", { shardId, payload: event });
case DiscordGatewayCloseEventCodes.UnknownOpcode:
case DiscordGatewayCloseEventCodes.DecodeError:
case DiscordGatewayCloseEventCodes.AuthenticationFailed:
case DiscordGatewayCloseEventCodes.AlreadyAuthenticated:
case DiscordGatewayCloseEventCodes.InvalidShard:
case DiscordGatewayCloseEventCodes.ShardingRequired:
case DiscordGatewayCloseEventCodes.InvalidApiVersion:
case DiscordGatewayCloseEventCodes.InvalidIntents:
case DiscordGatewayCloseEventCodes.DisallowedIntents:
throw new Error(event.reason || "Discord gave no reason! GG! You broke Discord!");
// THESE ERRORS CAN NO BE RESUMED! THEY MUST RE-IDENTIFY!
case DiscordGatewayCloseEventCodes.NotAuthenticated:
case DiscordGatewayCloseEventCodes.InvalidSeq:
case DiscordGatewayCloseEventCodes.RateLimited:
case DiscordGatewayCloseEventCodes.SessionTimedOut:
identify(shardId, ws.maxShards);
break;
default:
resume(shardId);
break;
}
};
return socket;
}