From d58d3a043ae570b3c7a680344abd4e171f0a548f Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sat, 15 May 2021 19:52:23 +0000 Subject: [PATCH] 1 sec faster --- src/handlers/misc/READY.ts | 2 +- src/ws/create_shard.ts | 3 +-- src/ws/handle_on_message.ts | 4 +++- src/ws/identify.ts | 2 +- src/ws/resume.ts | 4 ++-- src/ws/spawn_shards.ts | 22 ++++++++-------------- src/ws/ws.ts | 5 ++++- 7 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/handlers/misc/READY.ts b/src/handlers/misc/READY.ts index 1f2c2ab74..9f8a3b762 100644 --- a/src/handlers/misc/READY.ts +++ b/src/handlers/misc/READY.ts @@ -10,7 +10,7 @@ export function handleReady( shardId: number, ) { // Triggered on each shard - eventHandlers.shardReady?.(shardId); + // eventHandlers.shardReady?.(shardId); // The bot has already started, the last shard is resumed, however. if (cache.isReady) return; diff --git a/src/ws/create_shard.ts b/src/ws/create_shard.ts index 59843e66d..52e026f58 100644 --- a/src/ws/create_shard.ts +++ b/src/ws/create_shard.ts @@ -3,8 +3,7 @@ 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) { +export function createShard(shardId: number) { const socket = new WebSocket(ws.botGatewayData.url); socket.binaryType = "arraybuffer"; diff --git a/src/ws/handle_on_message.ts b/src/ws/handle_on_message.ts index 4a3a3e0b2..8c56dc2bf 100644 --- a/src/ws/handle_on_message.ts +++ b/src/ws/handle_on_message.ts @@ -93,6 +93,8 @@ export async function handleOnMessage(message: any, shardId: number) { // Important for RESUME if (messageData.t === "READY") { + eventHandlers.shardReady?.(shardId); + const shard = ws.shards.get(shardId); if (shard) { shard.sessionId = (messageData.d as DiscordReady).session_id; @@ -105,7 +107,7 @@ export async function handleOnMessage(message: any, shardId: number) { const bucket = ws.buckets.get( shardId % ws.botGatewayData.sessionStartLimit.maxConcurrency, ); - if (bucket) bucket.createNextShard = true; + if (bucket) bucket.createNextShard[0]?.(); }, 5000); } diff --git a/src/ws/identify.ts b/src/ws/identify.ts index 68fc669cf..43c7d18e5 100644 --- a/src/ws/identify.ts +++ b/src/ws/identify.ts @@ -12,7 +12,7 @@ export async function identify(shardId: number, maxShards: number) { } // CREATE A SHARD - const socket = await ws.createShard(shardId); + const socket = ws.createShard(shardId); // Identify can just set/reset the settings for the shard ws.shards.set(shardId, { diff --git a/src/ws/resume.ts b/src/ws/resume.ts index ce47f63ff..ed5b45e70 100644 --- a/src/ws/resume.ts +++ b/src/ws/resume.ts @@ -1,7 +1,7 @@ import { DiscordGatewayOpcodes } from "../types/codes/gateway_opcodes.ts"; import { ws } from "./ws.ts"; -export async function resume(shardId: number) { +export function resume(shardId: number) { ws.log("RESUMING", { shardId }); // NOW WE HANDLE RESUMING THIS SHARD @@ -16,7 +16,7 @@ export async function resume(shardId: number) { } // CREATE A SHARD - const socket = await ws.createShard(shardId); + const socket = ws.createShard(shardId); const sessionId = oldShard?.sessionId || ""; const previousSequenceNumber = oldShard?.previousSequenceNumber || 0; diff --git a/src/ws/spawn_shards.ts b/src/ws/spawn_shards.ts index 7dd24eff2..a5d4fe0fa 100644 --- a/src/ws/spawn_shards.ts +++ b/src/ws/spawn_shards.ts @@ -1,4 +1,3 @@ -import { delay } from "../util/utils.ts"; import { ws } from "./ws.ts"; /** Begin spawning shards. */ @@ -29,7 +28,7 @@ export function spawnShards(firstShardId = 0) { // Create the bucket since it doesnt exist ws.buckets.set(bucketId, { clusters: [[cluster, i]], - createNextShard: true, + createNextShard: [], }); if (cluster + 1 <= ws.maxClusters) cluster++; @@ -51,7 +50,7 @@ export function spawnShards(firstShardId = 0) { } // SPREAD THIS OUT TO DIFFERENT CLUSTERS TO BEGIN STARTING UP - ws.buckets.forEach(async (bucket, bucketId) => { + ws.buckets.forEach((bucket, bucketId) => { ws.log( "DEBUG", `3. Running forEach loop in spawnShards function.`, @@ -61,19 +60,14 @@ export function spawnShards(firstShardId = 0) { "DEBUG", `4. Running for of loop in spawnShards function.`, ); - let shardId = queue.shift(); - while (shardId !== undefined) { - ws.log("DEBUG", "5. Running while loop in spawnShards function."); - if (!bucket.createNextShard) { - await delay(100); - continue; - } + queue.forEach(shardId => { + bucket.createNextShard.push(async () => { + await ws.tellClusterToIdentify(clusterId, shardId, bucketId); + }) + }) - bucket.createNextShard = false; - await ws.tellClusterToIdentify(clusterId, shardId, bucketId); - shardId = queue.shift(); - } + bucket.createNextShard[0]?.(); } }); } diff --git a/src/ws/ws.ts b/src/ws/ws.ts index 34f060029..349c6a4b8 100644 --- a/src/ws/ws.ts +++ b/src/ws/ws.ts @@ -82,7 +82,10 @@ export const ws = { /** Stored as bucketId: { clusters: [clusterId, [ShardIds]], createNextShard: boolean } */ buckets: new Collection< number, - { clusters: number[][]; createNextShard: boolean } + { + clusters: number[][]; + createNextShard: (() => unknown)[]; + } >(), utf8decoder: new TextDecoder(),