37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
/**
|
|||
|
|
* [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<string, unknown> };
|
||
|
|
|
||
|
|
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<string, unknown>;
|
||
|
|
}>,
|
||
|
|
): 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);
|