From 4464328c0af381f8ec60aeb800dcfb73248cd9f6 Mon Sep 17 00:00:00 2001 From: Wind-Explorer Date: Sun, 29 Mar 2026 19:29:02 +0800 Subject: [PATCH] perf(ws): reduce user lookups and cache sender metadata --- src/ws/state/interaction/handler.ts | 34 ++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/ws/state/interaction/handler.ts b/src/ws/state/interaction/handler.ts index ea5619e..66942c9 100644 --- a/src/ws/state/interaction/handler.ts +++ b/src/ws/state/interaction/handler.ts @@ -9,6 +9,8 @@ import { WsNotificationService } from '../ws-notification.service'; import { WS_EVENT } from '../ws-events'; import { Validator } from '../utils/validation'; +const SENDER_NAME_CACHE_TTL_MS = 10 * 60 * 1000; + export class InteractionHandler { private readonly logger = new Logger(InteractionHandler.name); @@ -18,6 +20,32 @@ export class InteractionHandler { private readonly wsNotificationService: WsNotificationService, ) {} + private async resolveSenderName( + client: AuthenticatedSocket, + userId: string, + ): Promise { + const cachedName = client.data.senderName; + const cachedAt = client.data.senderNameCachedAt; + const cacheIsFresh = + cachedName && + typeof cachedAt === 'number' && + Date.now() - cachedAt < SENDER_NAME_CACHE_TTL_MS; + + if (cacheIsFresh) { + return cachedName; + } + + const sender = await this.prisma.user.findUnique({ + where: { id: userId }, + select: { name: true, username: true }, + }); + + const senderName = sender?.name || sender?.username || 'Unknown'; + client.data.senderName = senderName; + client.data.senderNameCachedAt = Date.now(); + return senderName; + } + async handleSendInteraction( client: AuthenticatedSocket, data: SendInteractionDto, @@ -61,11 +89,7 @@ export class InteractionHandler { } // 3. Construct payload - const sender = await this.prisma.user.findUnique({ - where: { id: currentUserId }, - select: { name: true, username: true }, - }); - const senderName = sender?.name || sender?.username || 'Unknown'; + const senderName = await this.resolveSenderName(client, currentUserId); const payload: InteractionPayloadDto = { senderUserId: currentUserId,