From 3ce15e58199761cb73becfbcd34214a4db8b5692 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sat, 13 Jun 2026 15:15:13 +0200 Subject: [PATCH] fix(session): invalidate RoomSession snapshot on room-data and permission changes getActiveRoomSessionSnapshot() caches the frozen snapshot keyed on the session reference, but RoomDataHandler (tradeMode/groupId/isGuildRoom/doorMode/allowPets) and RoomPermissionsHandler (controllerLevel/owner) mutate those fields on the same session object without invalidating the cache. Any consumer reading a mutable field via useActiveRoomSessionSnapshot would get stale data and never re-render. Expose invalidateRoomSessionSnapshot() on IRoomHandlerListener and call it from both handlers after they mutate the session. --- packages/api/src/nitro/session/IRoomHandlerListener.ts | 1 + packages/session/src/RoomSessionManager.ts | 2 +- packages/session/src/handler/RoomDataHandler.ts | 2 ++ packages/session/src/handler/RoomPermissionsHandler.ts | 6 ++++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/api/src/nitro/session/IRoomHandlerListener.ts b/packages/api/src/nitro/session/IRoomHandlerListener.ts index affd923..6f18255 100644 --- a/packages/api/src/nitro/session/IRoomHandlerListener.ts +++ b/packages/api/src/nitro/session/IRoomHandlerListener.ts @@ -5,4 +5,5 @@ export interface IRoomHandlerListener getSession(id: number): IRoomSession; sessionUpdate(id: number, type: string): void; sessionReinitialize(fromRoomId: number, toRoomId: number): void; + invalidateRoomSessionSnapshot(): void; } diff --git a/packages/session/src/RoomSessionManager.ts b/packages/session/src/RoomSessionManager.ts index 52b206f..20e513c 100644 --- a/packages/session/src/RoomSessionManager.ts +++ b/packages/session/src/RoomSessionManager.ts @@ -28,7 +28,7 @@ export class RoomSessionManager implements IRoomSessionManager, IRoomHandlerList private _savedPosY: number = -1; private _activeRoomSessionSnapshot: Readonly | null = null; - private invalidateRoomSessionSnapshot(): void + public invalidateRoomSessionSnapshot(): void { this._activeRoomSessionSnapshot = null; diff --git a/packages/session/src/handler/RoomDataHandler.ts b/packages/session/src/handler/RoomDataHandler.ts index 0cd169e..0fd4e42 100644 --- a/packages/session/src/handler/RoomDataHandler.ts +++ b/packages/session/src/handler/RoomDataHandler.ts @@ -39,6 +39,8 @@ export class RoomDataHandler extends BaseHandler roomSession.allowPets = roomData.allowPets; roomSession.moderationSettings = parser.moderation; + this.listener.invalidateRoomSessionSnapshot(); + GetEventDispatcher().dispatchEvent(new RoomSessionPropertyUpdateEvent(RoomSessionPropertyUpdateEvent.RSDUE_ALLOW_PETS, roomSession)); GetEventDispatcher().dispatchEvent(new RoomSessionEvent(RoomSessionEvent.ROOM_DATA, roomSession)); } diff --git a/packages/session/src/handler/RoomPermissionsHandler.ts b/packages/session/src/handler/RoomPermissionsHandler.ts index 3655cde..123f26f 100644 --- a/packages/session/src/handler/RoomPermissionsHandler.ts +++ b/packages/session/src/handler/RoomPermissionsHandler.ts @@ -22,6 +22,8 @@ export class RoomPermissionsHandler extends BaseHandler if(!session) return; session.setControllerLevel(event.getParser().controllerLevel); + + this.listener.invalidateRoomSessionSnapshot(); } private onRoomRightsClearEvent(event: RoomRightsClearEvent): void @@ -33,6 +35,8 @@ export class RoomPermissionsHandler extends BaseHandler if(!session) return; session.setControllerLevel(RoomControllerLevel.NONE); + + this.listener.invalidateRoomSessionSnapshot(); } private onRoomRightsOwnerEvent(event: RoomRightsOwnerEvent): void @@ -44,5 +48,7 @@ export class RoomPermissionsHandler extends BaseHandler if(!session) return; session.setRoomOwner(); + + this.listener.invalidateRoomSessionSnapshot(); } }