openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
68 lines (67 loc) • 2.52 kB
JavaScript
//#region extensions/matrix/src/matrix/direct-room.ts
function trimMaybeString(value) {
if (typeof value !== "string") return null;
const trimmed = value.trim();
return trimmed.length > 0 ? trimmed : null;
}
function normalizeJoinedMatrixMembers(joinedMembers) {
if (!Array.isArray(joinedMembers)) return [];
return joinedMembers.map((entry) => trimMaybeString(entry)).filter((entry) => Boolean(entry));
}
function isStrictDirectMembership(params) {
const selfUserId = trimMaybeString(params.selfUserId);
const remoteUserId = trimMaybeString(params.remoteUserId);
const joinedMembers = params.joinedMembers ?? [];
return Boolean(selfUserId && remoteUserId && joinedMembers.length === 2 && joinedMembers.includes(selfUserId) && joinedMembers.includes(remoteUserId));
}
async function readJoinedMatrixMembers(client, roomId) {
try {
return normalizeJoinedMatrixMembers(await client.getJoinedRoomMembers(roomId));
} catch {
return null;
}
}
async function hasDirectMatrixMemberFlag(client, roomId, userId) {
const normalizedUserId = trimMaybeString(userId);
if (!normalizedUserId) return null;
try {
const state = await client.getRoomStateEvent(roomId, "m.room.member", normalizedUserId);
if (state?.is_direct === true) return true;
if (state?.is_direct === false) return false;
return null;
} catch {
return null;
}
}
async function inspectMatrixDirectRoomEvidence(params) {
const selfUserId = params.selfUserId !== void 0 ? trimMaybeString(params.selfUserId) : trimMaybeString(await params.client.getUserId().catch(() => null));
const joinedMembers = await readJoinedMatrixMembers(params.client, params.roomId);
const strict = isStrictDirectMembership({
selfUserId,
remoteUserId: params.remoteUserId,
joinedMembers
});
if (!strict) return {
joinedMembers,
strict: false,
viaMemberState: false,
memberStateFlag: null
};
const memberStateFlag = await hasDirectMatrixMemberFlag(params.client, params.roomId, selfUserId);
return {
joinedMembers,
strict,
viaMemberState: memberStateFlag === true,
memberStateFlag
};
}
async function isStrictDirectRoom(params) {
return (await inspectMatrixDirectRoomEvidence({
client: params.client,
roomId: params.roomId,
remoteUserId: params.remoteUserId,
selfUserId: params.selfUserId
})).strict;
}
//#endregion
export { normalizeJoinedMatrixMembers as a, isStrictDirectRoom as i, inspectMatrixDirectRoomEvidence as n, readJoinedMatrixMembers as o, isStrictDirectMembership as r, hasDirectMatrixMemberFlag as t };