import type { IMessagePayload } from "./types.js"; function isRecord(value: unknown): value is Record { return Boolean(value) && typeof value === "object" && !Array.isArray(value); } function isOptionalString(value: unknown): value is string | null | undefined { return value === undefined || value === null || typeof value === "string"; } function isOptionalStringOrNumber(value: unknown): value is string | number | null | undefined { return ( value === undefined || value === null || typeof value === "string" || typeof value === "number" ); } function isOptionalNumber(value: unknown): value is number | null | undefined { return value === undefined || value === null || typeof value === "number"; } function isOptionalBoolean(value: unknown): value is boolean | null | undefined { return value === undefined || value === null || typeof value === "boolean"; } function isOptionalStringArray(value: unknown): value is string[] | null | undefined { return ( value === undefined || value === null || (Array.isArray(value) && value.every((entry) => typeof entry === "string")) ); } function isOptionalAttachments(value: unknown): value is IMessagePayload["attachments"] { if (value === undefined || value === null) { return true; } if (!Array.isArray(value)) { return false; } return value.every((attachment) => { if (!isRecord(attachment)) { return false; } return ( isOptionalString(attachment.original_path) && isOptionalString(attachment.mime_type) && isOptionalBoolean(attachment.missing) ); }); } export function parseIMessageNotification(raw: unknown): IMessagePayload | null { if (!isRecord(raw)) { return null; } const maybeMessage = raw.message; if (!isRecord(maybeMessage)) { return null; } const message: IMessagePayload = maybeMessage; if ( !isOptionalNumber(message.id) || !isOptionalNumber(message.chat_id) || !isOptionalString(message.sender) || !isOptionalBoolean(message.is_from_me) || !isOptionalString(message.text) || !isOptionalStringOrNumber(message.reply_to_id) || !isOptionalString(message.reply_to_text) || !isOptionalString(message.reply_to_sender) || !isOptionalString(message.created_at) || !isOptionalAttachments(message.attachments) || !isOptionalString(message.chat_identifier) || !isOptionalString(message.chat_guid) || !isOptionalString(message.chat_name) || !isOptionalStringArray(message.participants) || !isOptionalBoolean(message.is_group) ) { return null; } return message; }