From c5ac3c34767ee54e08b7a7306c48539305775500 Mon Sep 17 00:00:00 2001 From: ITOH Date: Sat, 5 Jun 2021 11:44:29 +0200 Subject: [PATCH] improve startup time .-. --- src/handlers/guilds/GUILD_CREATE.ts | 4 +-- src/handlers/misc/READY.ts | 38 ++++++++++++----------------- src/ws/identify.ts | 1 - src/ws/resume.ts | 1 - src/ws/ws.ts | 3 +-- 5 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/handlers/guilds/GUILD_CREATE.ts b/src/handlers/guilds/GUILD_CREATE.ts index 2b6999194..12d945bcc 100644 --- a/src/handlers/guilds/GUILD_CREATE.ts +++ b/src/handlers/guilds/GUILD_CREATE.ts @@ -5,6 +5,7 @@ import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload. import type { Guild } from "../../types/guilds/guild.ts"; import { snowflakeToBigint } from "../../util/bigint.ts"; import { ws } from "../../ws/ws.ts"; +import { guildAvailable } from "../misc/READY.ts"; export async function handleGuildCreate(data: DiscordGatewayPayload, shardId: number) { const payload = data.d as Guild; @@ -18,8 +19,7 @@ export async function handleGuildCreate(data: DiscordGatewayPayload, shardId: nu if (shard?.unavailableGuildIds.has(guild.id)) { await cacheHandlers.delete("unavailableGuilds", guild.id); - shard.unavailableGuildIds.delete(guild.id); - shard.lastAvailable = Date.now(); + guildAvailable(shard, guild.id); return eventHandlers.guildAvailable?.(guild); } diff --git a/src/handlers/misc/READY.ts b/src/handlers/misc/READY.ts index 1109fb1d5..7c136f9d6 100644 --- a/src/handlers/misc/READY.ts +++ b/src/handlers/misc/READY.ts @@ -23,33 +23,27 @@ export function handleReady(data: DiscordGatewayPayload, shardId: number) { shard.ready = false; // All guilds are unavailable at first shard.unavailableGuildIds = new Set(payload.guilds.map((g) => snowflakeToBigint(g.id))); - // Set the last available to now - shard.lastAvailable = Date.now(); - // Start ready check in 2 seconds - setTimeout(() => { - eventHandlers.debug?.("loop", `1. Running setTimeout in READY file.`); - checkReady(payload, shard); - }, 2000); -} - -/** This function checks if the shard is fully loaded */ -function checkReady(payload: Ready, shard: DiscordenoShard) { - // Check if all guilds were loaded - if (!shard.unavailableGuildIds.size) return loaded(shard); - - // If the last GUILD_CREATE was received 5 seconds ago, the remaining guilds are most likely not available - if (shard.lastAvailable + 5000 < Date.now()) { + // Falied to load check + shard.failedToLoadTimeoutId = setTimeout(() => { eventHandlers.shardFailedToLoad?.(shard.id, shard.unavailableGuildIds); // Force execute the loaded function to prevent infinite loop return loaded(shard); - } + }, 5000); +} - // Not all guilds were loaded but 5 seconds haven't passed so check again - setTimeout(() => { - eventHandlers.debug?.("loop", `2. Running setTimeout in READY file.`); - checkReady(payload, shard); - }, 2000); +export function guildAvailable(shard: DiscordenoShard, guildId: bigint) { + if (!shard.failedToLoadTimeoutId) return; + + clearTimeout(shard.failedToLoadTimeoutId); + shard.unavailableGuildIds.delete(guildId); + if (!shard.unavailableGuildIds.size) return loaded(shard); + + shard.failedToLoadTimeoutId = setTimeout(() => { + eventHandlers.shardFailedToLoad?.(shard.id, shard.unavailableGuildIds); + // Force execute the loaded function to prevent infinite loop + return loaded(shard); + }, 5000); } function loaded(shard: DiscordenoShard) { diff --git a/src/ws/identify.ts b/src/ws/identify.ts index 2ee3a3877..f036b930e 100644 --- a/src/ws/identify.ts +++ b/src/ws/identify.ts @@ -24,7 +24,6 @@ export function identify(shardId: number, maxShards: number) { resuming: false, ready: false, unavailableGuildIds: new Set(), - lastAvailable: 0, heartbeat: { lastSentAt: 0, lastReceivedAt: 0, diff --git a/src/ws/resume.ts b/src/ws/resume.ts index fc1f57e86..038858247 100644 --- a/src/ws/resume.ts +++ b/src/ws/resume.ts @@ -30,7 +30,6 @@ export function resume(shardId: number) { resuming: false, ready: false, unavailableGuildIds: new Set(), - lastAvailable: 0, heartbeat: { lastSentAt: 0, lastReceivedAt: 0, diff --git a/src/ws/ws.ts b/src/ws/ws.ts index 8e0604035..f9af237e6 100644 --- a/src/ws/ws.ts +++ b/src/ws/ws.ts @@ -139,8 +139,7 @@ export interface DiscordenoShard { ready: boolean; /** The list of guild ids that are currently unavailable due to an outage. */ unavailableGuildIds: Set; - /** Last time when a GUILD_CREATE event has been received for an unavailable guild. This is used to prevent infinite loops in the READY event handler. */ - lastAvailable: number; + failedToLoadTimeoutId?: number; heartbeat: { /** The exact timestamp the last heartbeat was sent. */ lastSentAt: number;