// If it's a string, try to parse as JSON if (typeof value === "string") { try { const parsed = JSON.parse(value); if (isChannelRulesObject(parsed)) { return parsed;
}
} catch { return undefined;
}
}
// If it's already an object, use directly if (isChannelRulesObject(value)) { return value;
}
return undefined;
}
/** *ParsesettingsfromtherawUrbitsettings-storeresponse. *Theresponseshapeis:{[bucket]:{[key]:value}}
*/ function parseSettingsResponse(raw: unknown): TlonSettingsStore { if (!raw || typeof raw !== "object") { return {};
}
const desk = raw as Record<string, unknown>; const bucket = desk[SETTINGS_BUCKET]; if (!bucket || typeof bucket !== "object") { return {};
}
const settings = bucket as Record<string, unknown>;
return {
groupChannels: Array.isArray(settings.groupChannels)
? settings.groupChannels.filter((x): x is string => typeof x === "string")
: undefined,
dmAllowlist: Array.isArray(settings.dmAllowlist)
? settings.dmAllowlist.filter((x): x is string => typeof x === "string")
: undefined,
autoDiscover: typeof settings.autoDiscover === "boolean" ? settings.autoDiscover : undefined,
showModelSig: typeof settings.showModelSig === "boolean" ? settings.showModelSig : undefined,
autoAcceptDmInvites: typeof settings.autoAcceptDmInvites === "boolean" ? settings.autoAcceptDmInvites : undefined,
autoAcceptGroupInvites: typeof settings.autoAcceptGroupInvites === "boolean"
? settings.autoAcceptGroupInvites
: undefined,
groupInviteAllowlist: Array.isArray(settings.groupInviteAllowlist)
? settings.groupInviteAllowlist.filter((x): x is string => typeof x === "string")
: undefined,
channelRules: parseChannelRules(settings.channelRules),
defaultAuthorizedShips: Array.isArray(settings.defaultAuthorizedShips)
? settings.defaultAuthorizedShips.filter((x): x is string => typeof x === "string")
: undefined,
ownerShip: typeof settings.ownerShip === "string" ? settings.ownerShip : undefined,
pendingApprovals: parsePendingApprovals(settings.pendingApprovals),
};
}
function isChannelRulesObject(
val: unknown,
): val is Record<string, { mode?: "restricted" | "open"; allowedShips?: string[] }> { if (!val || typeof val !== "object" || Array.isArray(val)) { returnfalse;
} for (const [, rule] of Object.entries(val)) { if (!rule || typeof rule !== "object") { returnfalse;
}
} returntrue;
}
/** *ParsependingApprovals-handlesbothJSONstringandarrayformats. *Settings-storestorescomplexobjectsasJSONstrings.
*/ function parsePendingApprovals(value: unknown): PendingApproval[] | undefined { if (!value) { return undefined;
}
// If it's a string, try to parse as JSON
let parsed: unknown = value; if (typeof value === "string") { try {
parsed = JSON.parse(value);
} catch { return undefined;
}
}
// Validate it's an array if (!Array.isArray(parsed)) { return undefined;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.