From f5288f4922d04702cc9a2ed4f6af67078408449e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 21 Oct 2024 23:28:41 +0300 Subject: [PATCH] web/statestore: also notify state subscribers when fetching whole state --- web/src/api/client.ts | 18 ++---------------- web/src/api/statestore/room.ts | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/web/src/api/client.ts b/web/src/api/client.ts index e898bd6..55e0377 100644 --- a/web/src/api/client.ts +++ b/web/src/api/client.ts @@ -16,7 +16,7 @@ import { CachedEventDispatcher } from "../util/eventdispatcher.ts" import RPCClient, { SendMessageParams } from "./rpc.ts" import { RoomStateStore, StateStore } from "./statestore" -import type { ClientState, EventID, EventRowID, EventType, RPCEvent, RoomID, UserID } from "./types" +import type { ClientState, EventID, RPCEvent, RoomID, UserID } from "./types" export default class Client { readonly state = new CachedEventDispatcher() @@ -81,21 +81,7 @@ export default class Client { throw new Error("Room not found") } const state = await this.rpc.getRoomState(roomID, room.meta.current.has_member_list, refetch) - const newStateMap: Map> = new Map() - for (const evt of state) { - if (evt.state_key === undefined) { - throw new Error(`Event ${evt.event_id} is missing state key`) - } - room.applyEvent(evt) - let stateMap = newStateMap.get(evt.type) - if (!stateMap) { - stateMap = new Map() - newStateMap.set(evt.type, stateMap) - } - stateMap.set(evt.state_key, evt.rowid) - } - room.state = newStateMap - room.stateLoaded = true + room.applyFullState(state) } async loadMoreHistory(roomID: RoomID): Promise { diff --git a/web/src/api/statestore/room.ts b/web/src/api/statestore/room.ts index b1b073c..43eb120 100644 --- a/web/src/api/statestore/room.ts +++ b/web/src/api/statestore/room.ts @@ -234,6 +234,29 @@ export class RoomStateStore { this.notifyTimelineSubscribers() } + applyFullState(state: RawDBEvent[]) { + const newStateMap: Map> = new Map() + for (const evt of state) { + if (evt.state_key === undefined) { + throw new Error(`Event ${evt.event_id} is missing state key`) + } + this.applyEvent(evt) + let stateMap = newStateMap.get(evt.type) + if (!stateMap) { + stateMap = new Map() + newStateMap.set(evt.type, stateMap) + } + stateMap.set(evt.state_key, evt.rowid) + } + this.state = newStateMap + this.stateLoaded = true + for (const [evtType, stateMap] of newStateMap) { + for (const [key] of stateMap) { + this.notifyStateSubscribers(evtType, key) + } + } + } + applyDecrypted(decrypted: EventsDecryptedData) { let timelineChanged = false for (const evt of decrypted.events) {