mirror of https://github.com/openclaw/openclaw.git
46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
export type SlackModalPrivateMetadata = {
|
|
sessionKey?: string;
|
|
channelId?: string;
|
|
channelType?: string;
|
|
userId?: string;
|
|
};
|
|
|
|
const SLACK_PRIVATE_METADATA_MAX = 3000;
|
|
|
|
function normalizeString(value: unknown) {
|
|
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
}
|
|
|
|
export function parseSlackModalPrivateMetadata(raw: unknown): SlackModalPrivateMetadata {
|
|
if (typeof raw !== "string" || raw.trim().length === 0) {
|
|
return {};
|
|
}
|
|
try {
|
|
const parsed = JSON.parse(raw) as Record<string, unknown>;
|
|
return {
|
|
sessionKey: normalizeString(parsed.sessionKey),
|
|
channelId: normalizeString(parsed.channelId),
|
|
channelType: normalizeString(parsed.channelType),
|
|
userId: normalizeString(parsed.userId),
|
|
};
|
|
} catch {
|
|
return {};
|
|
}
|
|
}
|
|
|
|
export function encodeSlackModalPrivateMetadata(input: SlackModalPrivateMetadata): string {
|
|
const payload: SlackModalPrivateMetadata = {
|
|
...(input.sessionKey ? { sessionKey: input.sessionKey } : {}),
|
|
...(input.channelId ? { channelId: input.channelId } : {}),
|
|
...(input.channelType ? { channelType: input.channelType } : {}),
|
|
...(input.userId ? { userId: input.userId } : {}),
|
|
};
|
|
const encoded = JSON.stringify(payload);
|
|
if (encoded.length > SLACK_PRIVATE_METADATA_MAX) {
|
|
throw new Error(
|
|
`Slack modal private_metadata cannot exceed ${SLACK_PRIVATE_METADATA_MAX} chars`,
|
|
);
|
|
}
|
|
return encoded;
|
|
}
|