perf(gateway): speed up presence and harden guild queries (#3072)

This commit is contained in:
Hampus authored and GitHub committed 2026-09-30 21:12:13 +02:00
1 parent 6e2f90b03c
commit ab0b483fbe
44 files changed
+2166 -144

No files matched your search

@@ -20,6 +20,7 @@ import {handleGuildCountsUpdate} from '@app/features/guild/events/GuildCountsUpd
import {handleGuildCreate} from '@app/features/guild/events/GuildCreate';
import {handleGuildDelete} from '@app/features/guild/events/GuildDelete';
import {handleGuildEmojisUpdate} from '@app/features/guild/events/GuildEmojisUpdate';
import {handleGuildHealthUpdate} from '@app/features/guild/events/GuildHealthUpdate';
import {handleGuildMemberAdd} from '@app/features/guild/events/GuildMemberAdd';
import {handleGuildMemberListUpdate} from '@app/features/guild/events/GuildMemberListUpdate';
import {handleGuildMemberRemove} from '@app/features/guild/events/GuildMemberRemove';
@@ -112,6 +113,7 @@ export function createHandlerRegistry(): GatewayHandlerRegistry {
registry.set('GUILD_MEMBERS_CHUNK', handleGuildMembersChunk as GatewayEventHandler);
registry.set('GUILD_MEMBER_LIST_UPDATE', handleGuildMemberListUpdate as GatewayEventHandler);
registry.set('GUILD_COUNTS_UPDATE', handleGuildCountsUpdate as GatewayEventHandler);
registry.set('GUILD_HEALTH_UPDATE', handleGuildHealthUpdate as GatewayEventHandler);
registry.set('CHANNEL_MEMBER_COUNTS_UPDATE', handleChannelMemberCountsUpdate as GatewayEventHandler);
registry.set('GUILD_ROLE_CREATE', handleGuildRoleCreate as GatewayEventHandler);
registry.set('GUILD_ROLE_UPDATE', handleGuildRoleUpdate as GatewayEventHandler);
@@ -23,4 +23,5 @@ export type GuildReadyData = Readonly<{
joined_at: string;
unavailable?: boolean;
unavailable_hidden?: boolean;
degraded?: boolean;
}>;
@@ -48,6 +48,9 @@ export function handleGuildCreate(data: GuildReadyData, _context: GatewayHandler
return;
}
GuildAvailability.setGuildAvailable(data.id);
if (!isSync || data.degraded !== undefined) {
GuildAvailability.setGuildDegraded(data.id, data.degraded === true);
}
Guilds.handleGuildCreate(data);
GuildCount.handleGuildCreate(data);
if (!isSync) {
@@ -32,6 +32,7 @@ interface GuildDeletePayload {
}
export function handleGuildDelete(data: GuildDeletePayload, _context: GatewayHandlerContext): void {
GuildAvailability.setGuildDegraded(data.id, false);
GuildAvailability.handleGuildAvailability(data.id, data.unavailable, data.unavailable_hidden);
Guilds.handleGuildDelete({guildId: data.id, unavailable: data.unavailable});
GuildList.handleGuildDelete(data.id, data.unavailable);
@@ -0,0 +1,10 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import GuildAvailability from '@app/features/guild/state/GuildAvailability';
import Guilds from '@app/features/guild/state/Guilds';
export function handleGuildHealthUpdate(data: {guild_id: string; degraded: boolean}): void {
if (Guilds.getGuild(data.guild_id)) {
GuildAvailability.setGuildDegraded(data.guild_id, data.degraded);
}
}
@@ -5,12 +5,14 @@ import {makeAutoObservable, observable} from 'mobx';
class GuildAvailability {
unavailableGuilds: Set<string> = observable.set();
degradedGuilds: Set<string> = observable.set();
constructor() {
makeAutoObservable(
this,
{
unavailableGuilds: false,
degradedGuilds: false,
},
{autoBind: true},
);
@@ -23,11 +25,20 @@ class GuildAvailability {
}
setGuildUnavailable(guildId: string): void {
this.degradedGuilds.delete(guildId);
if (!this.unavailableGuilds.has(guildId)) {
this.unavailableGuilds.add(guildId);
}
}
setGuildDegraded(guildId: string, degraded: boolean): void {
if (degraded) {
this.degradedGuilds.add(guildId);
} else {
this.degradedGuilds.delete(guildId);
}
}
handleGuildAvailability(guildId: string, unavailable = false, unavailableHidden = false): void {
if (unavailable && !unavailableHidden) {
this.setGuildUnavailable(guildId);
@@ -38,7 +49,11 @@ class GuildAvailability {
loadUnavailableGuilds(guilds: ReadonlyArray<GuildReadyData>): void {
this.unavailableGuilds.clear();
this.degradedGuilds.clear();
for (const guild of guilds) {
if (guild.degraded && !guild.unavailable) {
this.degradedGuilds.add(guild.id);
}
if (guild.unavailable && !guild.unavailable_hidden) {
this.unavailableGuilds.add(guild.id);
}