improve startup time .-.

This commit is contained in:
ITOH
2021-06-05 11:44:29 +02:00
parent 534cdabce8
commit c5ac3c3476
5 changed files with 19 additions and 28 deletions
+2 -2
View File
@@ -5,6 +5,7 @@ import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.
import type { Guild } from "../../types/guilds/guild.ts"; import type { Guild } from "../../types/guilds/guild.ts";
import { snowflakeToBigint } from "../../util/bigint.ts"; import { snowflakeToBigint } from "../../util/bigint.ts";
import { ws } from "../../ws/ws.ts"; import { ws } from "../../ws/ws.ts";
import { guildAvailable } from "../misc/READY.ts";
export async function handleGuildCreate(data: DiscordGatewayPayload, shardId: number) { export async function handleGuildCreate(data: DiscordGatewayPayload, shardId: number) {
const payload = data.d as Guild; const payload = data.d as Guild;
@@ -18,8 +19,7 @@ export async function handleGuildCreate(data: DiscordGatewayPayload, shardId: nu
if (shard?.unavailableGuildIds.has(guild.id)) { if (shard?.unavailableGuildIds.has(guild.id)) {
await cacheHandlers.delete("unavailableGuilds", guild.id); await cacheHandlers.delete("unavailableGuilds", guild.id);
shard.unavailableGuildIds.delete(guild.id); guildAvailable(shard, guild.id);
shard.lastAvailable = Date.now();
return eventHandlers.guildAvailable?.(guild); return eventHandlers.guildAvailable?.(guild);
} }
+15 -21
View File
@@ -23,33 +23,27 @@ export function handleReady(data: DiscordGatewayPayload, shardId: number) {
shard.ready = false; shard.ready = false;
// All guilds are unavailable at first // All guilds are unavailable at first
shard.unavailableGuildIds = new Set(payload.guilds.map((g) => snowflakeToBigint(g.id))); 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 // Falied to load check
setTimeout(() => { shard.failedToLoadTimeoutId = 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()) {
eventHandlers.shardFailedToLoad?.(shard.id, shard.unavailableGuildIds); eventHandlers.shardFailedToLoad?.(shard.id, shard.unavailableGuildIds);
// Force execute the loaded function to prevent infinite loop // Force execute the loaded function to prevent infinite loop
return loaded(shard); return loaded(shard);
}, 5000);
} }
// Not all guilds were loaded but 5 seconds haven't passed so check again export function guildAvailable(shard: DiscordenoShard, guildId: bigint) {
setTimeout(() => { if (!shard.failedToLoadTimeoutId) return;
eventHandlers.debug?.("loop", `2. Running setTimeout in READY file.`);
checkReady(payload, shard); clearTimeout(shard.failedToLoadTimeoutId);
}, 2000); 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) { function loaded(shard: DiscordenoShard) {
-1
View File
@@ -24,7 +24,6 @@ export function identify(shardId: number, maxShards: number) {
resuming: false, resuming: false,
ready: false, ready: false,
unavailableGuildIds: new Set(), unavailableGuildIds: new Set(),
lastAvailable: 0,
heartbeat: { heartbeat: {
lastSentAt: 0, lastSentAt: 0,
lastReceivedAt: 0, lastReceivedAt: 0,
-1
View File
@@ -30,7 +30,6 @@ export function resume(shardId: number) {
resuming: false, resuming: false,
ready: false, ready: false,
unavailableGuildIds: new Set(), unavailableGuildIds: new Set(),
lastAvailable: 0,
heartbeat: { heartbeat: {
lastSentAt: 0, lastSentAt: 0,
lastReceivedAt: 0, lastReceivedAt: 0,
+1 -2
View File
@@ -139,8 +139,7 @@ export interface DiscordenoShard {
ready: boolean; ready: boolean;
/** The list of guild ids that are currently unavailable due to an outage. */ /** The list of guild ids that are currently unavailable due to an outage. */
unavailableGuildIds: Set<bigint>; unavailableGuildIds: Set<bigint>;
/** 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. */ failedToLoadTimeoutId?: number;
lastAvailable: number;
heartbeat: { heartbeat: {
/** The exact timestamp the last heartbeat was sent. */ /** The exact timestamp the last heartbeat was sent. */
lastSentAt: number; lastSentAt: number;