/** * [Gitea #327] Room state Synapse does NOT copy into the replacement room on * `POST /rooms/{id}/upgrade` (it carries only power levels, join rules, * name/topic/avatar, history visibility, guest access, encryption, server ACL * and space parent/child). Lotus keeps call policy, voice limits, soundboard, * message retention, role tags and room emoji packs in state, so an upgrade * silently dropped all of them. */ const CARRIED_TYPES = new Set([ 'm.room.retention', 'in.cinny.room.power_level_tags', 'im.ponies.room_emotes', ]); const CARRIED_PREFIXES = ['io.lotus.']; export type StateToCarry = { type: string; stateKey: string; content: Record }; export const isCarriedStateType = (type: string): boolean => CARRIED_TYPES.has(type) || CARRIED_PREFIXES.some((p) => type.startsWith(p)); /** The state events to re-create in the replacement room (non-empty content only). */ export const stateToCarry = ( events: Array<{ getType: () => string; getStateKey: () => string | undefined; getContent: () => Record; }>, ): StateToCarry[] => events .filter((ev) => isCarriedStateType(ev.getType())) .map((ev) => ({ type: ev.getType(), stateKey: ev.getStateKey() ?? '', content: ev.getContent(), })) .filter((s) => s.content && Object.keys(s.content).length > 0);