{"version":3,"sources":["../lib/Logger.ts","../lib/Loggable.ts","../lib/auto-create-chat.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../modules/message.ts","../modules/poll.ts","../modules/scheduled.ts","../modules/server.ts","../client.ts","../events.ts","../lib/poll-utils.ts"],"names":["EventEmitter","path","os","fs","readFile","randomUUID","FormData","axios","io"],"mappings":"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","file":"index.cjs","sourcesContent":["import EventEmitter from \"node:events\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport class Logger extends EventEmitter {\n    tag: string;\n    private logLevel: LogLevel = \"info\";\n    private logFile?: string;\n\n    constructor(tag: string, level: LogLevel = \"info\", logToFile = true) {\n        super();\n        this.tag = tag;\n        this.logLevel = level;\n\n        if (logToFile) {\n            try {\n                const logDir = path.join(os.homedir(), \"Library\", \"Logs\", \"AdvancedIMessageKit\");\n                if (!fs.existsSync(logDir)) {\n                    fs.mkdirSync(logDir, { recursive: true });\n                }\n                this.logFile = path.join(logDir, \"sdk.log\");\n            } catch {\n                // Silently disable file logging if directory creation fails\n                // (e.g., read-only filesystem)\n            }\n        }\n    }\n\n    setLogLevel(level: LogLevel) {\n        this.logLevel = level;\n    }\n\n    private shouldLog(level: LogLevel): boolean {\n        const levels: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n        const currentIndex = levels.indexOf(this.logLevel);\n        const messageIndex = levels.indexOf(level);\n        return messageIndex >= currentIndex;\n    }\n\n    private formatMessage(level: string, message: string): string {\n        const timestamp = new Date().toISOString();\n        return `[${timestamp}][${level.toUpperCase()}][${this.tag}] ${message}`;\n    }\n\n    private writeLog(level: LogLevel, message: string) {\n        if (!this.shouldLog(level)) return;\n\n        const formatted = this.formatMessage(level, message);\n\n        switch (level) {\n            case \"error\":\n                console.error(formatted);\n                break;\n            case \"warn\":\n                console.warn(formatted);\n                break;\n            case \"debug\":\n                console.debug(formatted);\n                break;\n            default:\n                console.log(formatted);\n        }\n\n        if (this.logFile) {\n            try {\n                fs.appendFileSync(this.logFile, `${formatted}\\n`);\n            } catch {}\n        }\n\n        this.emit(\"log\", { level, message, tag: this.tag });\n    }\n\n    info(message: string) {\n        this.writeLog(\"info\", message);\n    }\n\n    debug(message: string) {\n        this.writeLog(\"debug\", message);\n    }\n\n    error(message: string | Error) {\n        const msg = message instanceof Error ? message.message : message;\n        this.writeLog(\"error\", msg);\n        if (message instanceof Error && message.stack) {\n            this.writeLog(\"error\", message.stack);\n        }\n    }\n\n    warn(message: string) {\n        this.writeLog(\"warn\", message);\n    }\n\n    log(message: string, level: LogLevel = \"info\") {\n        this.writeLog(level, message);\n    }\n}\n","import { EventEmitter as EventEmitterClass } from \"node:events\";\nimport type { LogLevel } from \"./Logger\";\nimport { Logger } from \"./Logger\";\n\nconst loggers: Record<string, Logger> = {};\nlet globalLogLevel: LogLevel = \"info\";\nlet globalLogToFile = true;\n\nexport const setGlobalLogLevel = (level: LogLevel) => {\n    globalLogLevel = level;\n    Object.values(loggers).forEach((logger) => {\n        logger.setLogLevel(level);\n    });\n};\n\nexport const setGlobalLogToFile = (logToFile: boolean) => {\n    globalLogToFile = logToFile;\n};\n\nexport const getLogger = (tag: string) => {\n    let logger = loggers[tag];\n    if (!logger) {\n        logger = new Logger(tag, globalLogLevel, globalLogToFile);\n        loggers[tag] = logger;\n    }\n\n    return logger;\n};\n\nexport class Loggable extends EventEmitterClass {\n    tag?: string;\n\n    get log() {\n        const name = this.tag ?? this.constructor.name;\n        return getLogger(name);\n    }\n\n    constructor(tag?: string) {\n        super();\n\n        if (tag) {\n            this.tag = tag;\n        }\n    }\n\n    onLog(listener: (data: { level: string; message: string; tag: string }) => void) {\n        this.log.on(\"log\", listener);\n    }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { BubbleEffect, TextAnimation, TextStyle } from \"../types\";\n\n/**\n * Checks if an error indicates that a chat does not exist.\n */\nexport function isChatNotExistError(error: unknown): boolean {\n    const axiosError = error as { response?: { data?: { error?: { message?: string }; message?: string } } };\n    const errorMsg = axiosError?.response?.data?.error?.message || axiosError?.response?.data?.message || \"\";\n    const lowerMsg = errorMsg.toLowerCase();\n    return lowerMsg.includes(\"chat does not exist\") || lowerMsg.includes(\"chat not found\");\n}\n\n/**\n * Extracts the address from a chatGuid.\n * Expected format: \"service;-;address\"\n * e.g., \"any;-;+1xxxxxxxxxx\" -> \"+1xxxxxxxxxx\"\n * Returns undefined if chatGuid is malformed.\n */\nexport function extractAddress(chatGuid: string): string | undefined {\n    const parts = chatGuid.split(\";-;\");\n    if (parts.length !== 2 || !parts[1]) {\n        return undefined;\n    }\n    return parts[1];\n}\n\n/**\n * Extracts the service type from a chatGuid.\n * Expected format: \"service;-;address\" or \"service;+;groupId\"\n * e.g., \"iMessage;-;+1234567890\" -> \"iMessage\"\n *       \"SMS;-;+1234567890\" -> \"SMS\"\n *       \"any;-;+1234567890\" -> undefined (let server decide)\n *\n * Any prefix other than \"iMessage\" or \"SMS\" (case-insensitive) will return undefined,\n * allowing the server to decide the service type.\n */\nexport function extractService(chatGuid: string): \"iMessage\" | \"SMS\" | undefined {\n    if (!chatGuid) return undefined;\n    const prefix = chatGuid.split(\";\")[0]?.toLowerCase();\n    if (prefix === \"imessage\") return \"iMessage\";\n    if (prefix === \"sms\") return \"SMS\";\n    return undefined;\n}\n\n/**\n * Creates a chat with an initial message.\n * Returns the created chat's GUID.\n */\nexport async function createChatWithMessage(options: {\n    http: AxiosInstance;\n    address: string;\n    message: string;\n    tempGuid?: string;\n    subject?: string;\n    bubbleEffect?: BubbleEffect;\n    textStyles?: TextStyle[];\n    textAnimation?: TextAnimation;\n    service?: \"iMessage\" | \"SMS\";\n}): Promise<string> {\n    const { http, address, message, tempGuid, subject, bubbleEffect, textStyles, textAnimation, service } = options;\n    try {\n        const response = await http.post(\"/api/v1/chat/new\", {\n            addresses: [address],\n            message,\n            tempGuid,\n            subject,\n            bubbleEffect,\n            textStyles,\n            textAnimation,\n            ...(service && { service }),\n        });\n        return response.data.data?.guid;\n    } catch (error) {\n        throw new Error(\n            `Failed to create chat with address \"${address}\": ${\n                error instanceof Error ? error.message : String(error)\n            }`,\n        );\n    }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport { extractAddress, extractService, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { AttachmentResponse, MessageResponse, SendAttachmentOptions, SendStickerOptions } from \"../types\";\n\nexport class AttachmentModule {\n    constructor(\n        private readonly http: AxiosInstance,\n        private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n    ) {}\n\n    async getAttachmentCount(): Promise<number> {\n        const response = await this.http.get(\"/api/v1/attachment/count\");\n        return response.data.data.total;\n    }\n\n    async getAttachment(guid: string): Promise<AttachmentResponse> {\n        const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}`);\n        return response.data.data;\n    }\n\n    async downloadAttachment(\n        guid: string,\n        options?: {\n            original?: boolean;\n            force?: boolean;\n            height?: number;\n            width?: number;\n            quality?: number;\n        },\n    ): Promise<Buffer> {\n        const params: Record<string, unknown> = {};\n        if (options?.original !== undefined) params.original = options.original;\n        if (options?.force !== undefined) params.force = options.force;\n        if (options?.height !== undefined) params.height = options.height;\n        if (options?.width !== undefined) params.width = options.width;\n        if (options?.quality !== undefined) params.quality = options.quality;\n\n        const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/download`, {\n            params,\n            responseType: \"arraybuffer\",\n        });\n        return Buffer.from(response.data);\n    }\n\n    async downloadAttachmentLive(guid: string): Promise<Buffer> {\n        const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/live`, {\n            responseType: \"arraybuffer\",\n        });\n        return Buffer.from(response.data);\n    }\n\n    async getAttachmentBlurhash(\n        guid: string,\n        options?: { height?: number; width?: number; quality?: number },\n    ): Promise<string> {\n        const params: Record<string, unknown> = {};\n        if (options?.height !== undefined) params.height = options.height;\n        if (options?.width !== undefined) params.width = options.width;\n        if (options?.quality !== undefined) params.quality = options.quality;\n\n        const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/blurhash`, {\n            params,\n        });\n        return response.data.data.blurhash;\n    }\n\n    /**\n     * Ensures the chat exists by creating it if it doesn't already exist.\n     */\n    private async ensureChatExists(chatGuid: string): Promise<void> {\n        const address = extractAddress(chatGuid);\n        if (!address) return;\n\n        const service = extractService(chatGuid);\n        await this.http.post(\"/api/v1/chat/new\", {\n            addresses: [address],\n            ...(service && { service }),\n        });\n    }\n\n    async sendAttachment(options: SendAttachmentOptions): Promise<MessageResponse> {\n        return this.enqueueSend(async () => {\n            const fileBuffer = await readFile(options.filePath);\n            const fileName = options.fileName || path.basename(options.filePath);\n            const tempGuid = randomUUID();\n\n            const buildForm = () => {\n                const form = new FormData();\n                form.append(\"chatGuid\", options.chatGuid);\n                form.append(\"attachment\", fileBuffer, fileName);\n                form.append(\"name\", fileName);\n                form.append(\"tempGuid\", tempGuid);\n                if (options.isAudioMessage !== undefined) {\n                    form.append(\"isAudioMessage\", options.isAudioMessage.toString());\n                    if (options.isAudioMessage) {\n                        form.append(\"method\", \"private-api\");\n                    }\n                }\n                if (options.selectedMessageGuid) {\n                    form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n                }\n                return form;\n            };\n\n            try {\n                const form = buildForm();\n                const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n                    headers: form.getHeaders(),\n                });\n                return response.data.data;\n            } catch (error: unknown) {\n                if (!isChatNotExistError(error)) throw error;\n\n                await this.ensureChatExists(options.chatGuid);\n\n                const form = buildForm();\n                const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n                    headers: form.getHeaders(),\n                });\n                return response.data.data;\n            }\n        });\n    }\n\n    async sendSticker(options: SendStickerOptions): Promise<MessageResponse> {\n        return this.enqueueSend(async () => {\n            const fileName = options.fileName || path.basename(options.filePath);\n            const fileBuffer = await readFile(options.filePath);\n\n            const buildForm = () => {\n                const form = new FormData();\n                form.append(\"attachment\", fileBuffer, fileName);\n                form.append(\"name\", fileName);\n                form.append(\"chatGuid\", options.chatGuid);\n                form.append(\"isSticker\", \"true\");\n                form.append(\"method\", \"private-api\"); // Sticker requires Private API\n                if (options.selectedMessageGuid) {\n                    form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n                    form.append(\"partIndex\", \"0\");\n                    form.append(\"stickerX\", String(options.stickerX ?? 0.5));\n                    form.append(\"stickerY\", String(options.stickerY ?? 0.5));\n                    form.append(\"stickerScale\", String(options.stickerScale ?? 0.75));\n                    form.append(\"stickerRotation\", String(options.stickerRotation ?? 0));\n                    form.append(\"stickerWidth\", String(options.stickerWidth ?? 300));\n                }\n                return form;\n            };\n\n            try {\n                const form = buildForm();\n                const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n                    headers: form.getHeaders(),\n                });\n                return data.data;\n            } catch (error: unknown) {\n                if (!isChatNotExistError(error)) throw error;\n\n                await this.ensureChatExists(options.chatGuid);\n\n                const form = buildForm();\n                const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n                    headers: form.getHeaders(),\n                });\n                return data.data;\n            }\n        });\n    }\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport type { BubbleEffect, ChatResponse, MessageResponse } from \"../types\";\n\nexport class ChatModule {\n    constructor(private readonly http: AxiosInstance) {}\n\n    async getChats(options?: {\n        withLastMessage?: boolean;\n        withArchived?: boolean;\n        offset?: number;\n        limit?: number;\n        sort?: string;\n    }): Promise<ChatResponse[]> {\n        const response = await this.http.post(\"/api/v1/chat/query\", options ?? {});\n        return response.data.data;\n    }\n\n    async createChat(options: {\n        addresses: string[];\n        message?: string;\n        method?: \"apple-script\" | \"private-api\";\n        service?: \"iMessage\" | \"SMS\";\n        tempGuid?: string;\n        subject?: string;\n        bubbleEffect?: BubbleEffect;\n        attributedBody?: Record<string, unknown>;\n    }): Promise<ChatResponse> {\n        const response = await this.http.post(\"/api/v1/chat/new\", options);\n        return response.data.data;\n    }\n\n    async getChat(guid: string, options?: { with?: string[] }): Promise<ChatResponse> {\n        const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(guid)}`, {\n            params: options?.with ? { with: options.with.join(\",\") } : {},\n        });\n        return response.data.data;\n    }\n\n    async updateChat(guid: string, options: { displayName?: string }): Promise<ChatResponse> {\n        const response = await this.http.put(`/api/v1/chat/${encodeURIComponent(guid)}`, options);\n        return response.data.data;\n    }\n\n    async deleteChat(guid: string): Promise<void> {\n        await this.http.delete(`/api/v1/chat/${encodeURIComponent(guid)}`);\n    }\n\n    async markChatRead(guid: string): Promise<void> {\n        await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/read`);\n    }\n\n    async markChatUnread(guid: string): Promise<void> {\n        await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/unread`);\n    }\n\n    async leaveChat(guid: string): Promise<void> {\n        await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/leave`);\n    }\n\n    async addParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n        const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n            address,\n        });\n        return response.data.data;\n    }\n\n    async removeParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n        const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant/remove`, {\n            address,\n        });\n        return response.data.data;\n    }\n\n    async getChatMessages(\n        chatGuid: string,\n        options?: {\n            offset?: number;\n            limit?: number;\n            sort?: \"ASC\" | \"DESC\";\n            before?: number;\n            after?: number;\n            with?: string[];\n        },\n    ): Promise<MessageResponse[]> {\n        const params: Record<string, unknown> = {};\n        if (options?.offset !== undefined) params.offset = options.offset;\n        if (options?.limit !== undefined) params.limit = options.limit;\n        if (options?.sort) params.sort = options.sort;\n        if (options?.before !== undefined) params.before = options.before;\n        if (options?.after !== undefined) params.after = options.after;\n        if (options?.with) params.with = options.with.join(\",\");\n\n        const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/message`, {\n            params,\n        });\n        return response.data.data;\n    }\n\n    async setGroupIcon(chatGuid: string, filePath: string): Promise<void> {\n        const fileBuffer = await readFile(filePath);\n        const fileName = path.basename(filePath);\n        const form = new FormData();\n        form.append(\"icon\", fileBuffer, fileName);\n\n        await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, form, {\n            headers: form.getHeaders(),\n        });\n    }\n\n    async removeGroupIcon(chatGuid: string): Promise<void> {\n        await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`);\n    }\n\n    async getGroupIcon(chatGuid: string): Promise<Buffer> {\n        const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, {\n            responseType: \"arraybuffer\",\n        });\n        return Buffer.from(response.data);\n    }\n\n    async getChatCount(options?: { includeArchived?: boolean }): Promise<{\n        total: number;\n        breakdown: Record<string, number>;\n    }> {\n        const response = await this.http.get(\"/api/v1/chat/count\", {\n            params: options?.includeArchived !== undefined ? { includeArchived: options.includeArchived } : {},\n        });\n        return response.data.data;\n    }\n\n    async startTyping(chatGuid: string): Promise<void> {\n        await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n    }\n\n    async stopTyping(chatGuid: string): Promise<void> {\n        await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n    }\n\n    async getBackground(chatGuid: string): Promise<{\n        hasBackground: boolean;\n        backgroundChannelGUID?: string | null;\n        imageUrl?: string | null;\n        backgroundId?: string | null;\n    }> {\n        const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);\n        return response.data.data;\n    }\n\n    async setBackground(\n        chatGuid: string,\n        options: string | { imageUrl?: string; filePath?: string; fileData?: string },\n    ): Promise<void> {\n        let body: { imageUrl?: string; fileData?: string };\n\n        if (typeof options === \"string\") {\n            body = { imageUrl: options };\n        } else if (options.filePath) {\n            const fileBuffer = await readFile(options.filePath);\n            body = { fileData: fileBuffer.toString(\"base64\") };\n        } else if (options.fileData) {\n            body = { fileData: options.fileData };\n        } else if (options.imageUrl) {\n            body = { imageUrl: options.imageUrl };\n        } else {\n            throw new Error(\"Either filePath, fileData, or imageUrl must be provided\");\n        }\n\n        await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`, body);\n    }\n\n    async removeBackground(chatGuid: string): Promise<void> {\n        await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);\n    }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ContactModule {\n    constructor(private readonly http: AxiosInstance) {}\n\n    async getContacts(): Promise<any[]> {\n        const response = await this.http.get(\"/api/v1/contact\");\n        return response.data.data;\n    }\n\n    async getContactCard(address: string): Promise<any> {\n        const response = await this.http.get(\"/api/v1/icloud/contact\", {\n            params: { address },\n        });\n        return response.data.data;\n    }\n\n    async shareContactCard(chatGuid: string): Promise<void> {\n        await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/share/contact`);\n    }\n\n    async shouldShareContact(chatGuid: string): Promise<boolean> {\n        const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/share/contact/status`);\n        return response.data.data;\n    }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class FaceTimeModule {\n    constructor(private readonly http: AxiosInstance) {}\n\n    async createFaceTimeLink(): Promise<string> {\n        const response = await this.http.post(\"/api/v1/facetime/session\");\n        return response.data.data;\n    }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class HandleModule {\n    constructor(private readonly http: AxiosInstance) {}\n\n    async getHandleCount(): Promise<number> {\n        const response = await this.http.get(\"/api/v1/handle/count\");\n        return response.data.data.total;\n    }\n\n    async queryHandles(options?: { address?: string; with?: string[]; offset?: number; limit?: number }): Promise<{\n        data: any[];\n        metadata: { total: number; offset: number; limit: number; count: number };\n    }> {\n        const body: Record<string, any> = {};\n        if (options?.address) body.address = options.address;\n        if (options?.with) body.with = options.with;\n        if (options?.offset !== undefined) body.offset = options.offset;\n        if (options?.limit !== undefined) body.limit = options.limit;\n\n        const response = await this.http.post(\"/api/v1/handle/query\", body);\n        return {\n            data: response.data.data,\n            metadata: response.data.metadata,\n        };\n    }\n\n    async getHandle(guid: string): Promise<any> {\n        const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}`);\n        return response.data.data;\n    }\n\n    async getHandleAvailability(address: string, type: \"imessage\" | \"facetime\"): Promise<boolean> {\n        const response = await this.http.get(`/api/v1/handle/availability/${type}`, {\n            params: { address },\n        });\n        return response.data.data.available;\n    }\n\n    async getHandleFocusStatus(guid: string): Promise<string> {\n        const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}/focus`);\n        return response.data.data.status;\n    }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { FindMyLocationItem } from \"../types/findmy\";\n\nexport class ICloudModule {\n    constructor(private readonly http: AxiosInstance) {}\n\n    async getFindMyFriends(): Promise<FindMyLocationItem[]> {\n        const response = await this.http.get(\"/api/v1/icloud/findmy/friends\");\n        return response.data.data;\n    }\n\n    async refreshFindMyFriends(): Promise<FindMyLocationItem[]> {\n        const response = await this.http.post(\"/api/v1/icloud/findmy/friends/refresh\");\n        return response.data.data;\n    }\n\n    async getLocationForHandle(handle: string): Promise<FindMyLocationItem | null> {\n        const friends = await this.getFindMyFriends();\n        return friends.find((f) => f.handle === handle) ?? null;\n    }\n\n    async isHandleSharingLocation(handle: string): Promise<boolean> {\n        const location = await this.getLocationForHandle(handle);\n        return location !== null;\n    }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport { createChatWithMessage, extractAddress, extractService, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type {\n    MessageResponse,\n    SendMessageOptions,\n    SendMultipartMessageOptions,\n    SendMultipartMessagePart,\n} from \"../types\";\n\nexport class MessageModule {\n    constructor(\n        private readonly http: AxiosInstance,\n        private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n    ) {}\n\n    private async uploadMultipartAttachment(\n        part: Extract<SendMultipartMessagePart, { filePath: string }>,\n        fileName = part.fileName || path.basename(part.filePath),\n    ) {\n        const fileBuffer = await readFile(part.filePath);\n        const form = new FormData();\n        form.append(\"attachment\", fileBuffer, fileName);\n\n        const response = await this.http.post(\"/api/v1/attachment/upload\", form, {\n            headers: form.getHeaders(),\n        });\n\n        return response.data.data.path as string;\n    }\n\n    async sendMessage(options: SendMessageOptions): Promise<MessageResponse> {\n        return this.enqueueSend(async () => {\n            const tempGuid = options.tempGuid || randomUUID();\n            const payload = { ...options, tempGuid };\n\n            try {\n                const response = await this.http.post(\"/api/v1/message/text\", payload);\n                return response.data.data;\n            } catch (error: unknown) {\n                if (!isChatNotExistError(error)) throw error;\n\n                const address = extractAddress(options.chatGuid);\n                if (!address) throw error;\n\n                const service = extractService(options.chatGuid);\n\n                await createChatWithMessage({\n                    http: this.http,\n                    address,\n                    message: options.message,\n                    tempGuid,\n                    subject: options.subject,\n                    bubbleEffect: options.bubbleEffect,\n                    textStyles: options.textStyles,\n                    textAnimation: options.textAnimation,\n                    service,\n                });\n                return { guid: tempGuid, text: options.message, dateCreated: Date.now() } as MessageResponse;\n            }\n        });\n    }\n\n    async sendMultipartMessage(options: SendMultipartMessageOptions): Promise<MessageResponse> {\n        return this.enqueueSend(async () => {\n            const tempGuid = options.tempGuid || randomUUID();\n\n            const buildPayloadPart = async (part: SendMultipartMessagePart, index: number) => {\n                const resolvedPartIndex = part.partIndex ?? index;\n\n                if (\"text\" in part) {\n                    return {\n                        partIndex: resolvedPartIndex,\n                        text: part.text,\n                        ...(part.mention ? { mention: part.mention } : {}),\n                    };\n                }\n\n                const fileName = part.fileName || path.basename(part.filePath);\n                const uploadedPath = await this.uploadMultipartAttachment(part, fileName);\n\n                return {\n                    partIndex: resolvedPartIndex,\n                    attachment: uploadedPath,\n                    name: fileName,\n                };\n            };\n\n            const uploadParts = async () => {\n                const parts: Awaited<ReturnType<typeof buildPayloadPart>>[] = [];\n\n                for (const [index, part] of options.parts.entries()) {\n                    parts.push(await buildPayloadPart(part, index));\n                }\n\n                return parts;\n            };\n\n            const send = async (chatGuid: string) => {\n                const parts = await uploadParts();\n                const payload = {\n                    chatGuid,\n                    tempGuid,\n                    parts,\n                    subject: options.subject,\n                    effectId: options.effectId,\n                    selectedMessageGuid: options.selectedMessageGuid,\n                    partIndex: options.partIndex ?? 0,\n                    ddScan: options.ddScan ?? false,\n                    attributedBody: options.attributedBody,\n                };\n\n                const response = await this.http.post(\"/api/v1/message/multipart\", payload);\n                return response.data.data as MessageResponse;\n            };\n\n            try {\n                return await send(options.chatGuid);\n            } catch (error: unknown) {\n                if (isChatNotExistError(error)) {\n                    throw new Error(\n                        \"Chat does not exist for multipart send. Use an existing chatGuid, or create the chat first before calling sendMultipartMessage().\",\n                    );\n                }\n\n                throw error;\n            }\n        });\n    }\n\n    async getMessage(guid: string, options?: { with?: string[] }): Promise<MessageResponse> {\n        const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}`, {\n            params: options?.with ? { with: options.with.join(\",\") } : {},\n        });\n        return response.data.data;\n    }\n\n    async getMessages(options?: {\n        chatGuid?: string;\n        offset?: number;\n        limit?: number;\n        sort?: \"ASC\" | \"DESC\";\n        before?: number;\n        after?: number;\n        with?: string[];\n    }): Promise<MessageResponse[]> {\n        const response = await this.http.post(\"/api/v1/message/query\", options ?? {});\n        return response.data.data;\n    }\n\n    async getMessageCount(options?: {\n        after?: number;\n        before?: number;\n        chatGuid?: string;\n        minRowId?: number;\n        maxRowId?: number;\n    }): Promise<number> {\n        const params: Record<string, unknown> = {};\n        if (options?.after !== undefined) params.after = options.after;\n        if (options?.before !== undefined) params.before = options.before;\n        if (options?.chatGuid) params.chatGuid = options.chatGuid;\n        if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n        if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n        const response = await this.http.get(\"/api/v1/message/count\", { params });\n        return response.data.data.total;\n    }\n\n    async getUpdatedMessageCount(options?: {\n        after?: number;\n        before?: number;\n        chatGuid?: string;\n        minRowId?: number;\n        maxRowId?: number;\n    }): Promise<number> {\n        const params: Record<string, unknown> = {};\n        if (options?.after !== undefined) params.after = options.after;\n        if (options?.before !== undefined) params.before = options.before;\n        if (options?.chatGuid) params.chatGuid = options.chatGuid;\n        if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n        if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n        const response = await this.http.get(\"/api/v1/message/count/updated\", {\n            params,\n        });\n        return response.data.data.total;\n    }\n\n    async getSentMessageCount(options?: {\n        after?: number;\n        before?: number;\n        chatGuid?: string;\n        minRowId?: number;\n        maxRowId?: number;\n    }): Promise<number> {\n        const params: Record<string, unknown> = {};\n        if (options?.after !== undefined) params.after = options.after;\n        if (options?.before !== undefined) params.before = options.before;\n        if (options?.chatGuid) params.chatGuid = options.chatGuid;\n        if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n        if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n        const response = await this.http.get(\"/api/v1/message/count/me\", {\n            params,\n        });\n        return response.data.data.total;\n    }\n\n    async editMessage(options: {\n        messageGuid: string;\n        editedMessage: string;\n        backwardsCompatibilityMessage?: string;\n        partIndex?: number;\n    }): Promise<MessageResponse> {\n        return this.enqueueSend(async () => {\n            const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/edit`, {\n                editedMessage: options.editedMessage,\n                backwardsCompatibilityMessage: options.backwardsCompatibilityMessage || options.editedMessage,\n                partIndex: options.partIndex ?? 0,\n            });\n            return response.data.data;\n        });\n    }\n\n    async sendReaction(options: {\n        chatGuid: string;\n        messageGuid: string;\n        reaction: string;\n        partIndex?: number;\n    }): Promise<MessageResponse> {\n        return this.enqueueSend(async () => {\n            const response = await this.http.post(\"/api/v1/message/react\", {\n                chatGuid: options.chatGuid,\n                selectedMessageGuid: options.messageGuid,\n                reaction: options.reaction,\n                partIndex: options.partIndex ?? 0,\n            });\n            return response.data.data;\n        });\n    }\n\n    async unsendMessage(options: { messageGuid: string; partIndex?: number }): Promise<MessageResponse> {\n        return this.enqueueSend(async () => {\n            const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/unsend`, {\n                partIndex: options.partIndex ?? 0,\n            });\n            return response.data.data;\n        });\n    }\n\n    async notifyMessage(guid: string): Promise<void> {\n        await this.http.post(`/api/v1/message/${encodeURIComponent(guid)}/notify`);\n    }\n\n    async getEmbeddedMedia(guid: string): Promise<{\n        path?: string;\n        data?: string;\n    }> {\n        const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}/embedded-media`);\n        return response.data.data;\n    }\n\n    async searchMessages(options: {\n        query: string;\n        chatGuid?: string;\n        offset?: number;\n        limit?: number;\n        sort?: \"ASC\" | \"DESC\";\n        before?: number;\n        after?: number;\n    }): Promise<MessageResponse[]> {\n        // Use MessageRouter.query (POST /api/v1/message/query) and a message.text LIKE condition to perform server-side text search\n        const { query, chatGuid, offset, limit, sort, before, after } = options;\n\n        // Validate: empty query would match all messages\n        if (!query || query.trim().length === 0) {\n            throw new Error(\"Search query cannot be empty\");\n        }\n\n        // Note: We don't escape % and _ here because:\n        // 1. Server uses Spotlight API (on macOS 13+) which is token-based, not substring-based.\n        //    - Matches \"Hello\" -> \"Hello world\" (Word match)\n        //    - No match \"Hell\" -> \"Hello\" (Partial word mismatch)\n        //    - Matches \"测试\" -> \"这是一个测试\" (Chinese token match)\n        // 2. Spotlight doesn't understand SQL ESCAPE syntax.\n        // 3. Parameterized queries already prevent SQL injection.\n        const where = [\n            {\n                statement: \"message.text LIKE :text\",\n                args: { text: `%${query}%` },\n            },\n        ];\n\n        const payload: Record<string, unknown> = {\n            where,\n        };\n\n        if (chatGuid) payload.chatGuid = chatGuid;\n        if (offset !== undefined) payload.offset = offset;\n        if (limit !== undefined) payload.limit = limit;\n        if (sort) payload.sort = sort;\n        if (before !== undefined) payload.before = before;\n        if (after !== undefined) payload.after = after;\n\n        const response = await this.http.post(\"/api/v1/message/query\", payload);\n        return response.data.data;\n    }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AddPollOptionOptions, CreatePollOptions, PollMessageResponse, VotePollOptions } from \"../types/poll\";\n\nexport class PollModule {\n    constructor(private readonly http: AxiosInstance) {}\n\n    async create(options: CreatePollOptions): Promise<PollMessageResponse> {\n        if (options.options.length < 2) {\n            throw new Error(\"Poll must have at least 2 options\");\n        }\n\n        const { data } = await this.http.post(\"/api/v1/poll/create\", {\n            chatGuid: options.chatGuid,\n            title: options.title ?? \"\",\n            options: options.options,\n        });\n\n        return data.data;\n    }\n\n    async vote(options: VotePollOptions): Promise<PollMessageResponse> {\n        const { data } = await this.http.post(\"/api/v1/poll/vote\", {\n            chatGuid: options.chatGuid,\n            pollMessageGuid: options.pollMessageGuid,\n            optionIdentifier: options.optionIdentifier,\n        });\n\n        return data.data;\n    }\n\n    async unvote(options: VotePollOptions): Promise<PollMessageResponse> {\n        const { data } = await this.http.post(\"/api/v1/poll/unvote\", {\n            chatGuid: options.chatGuid,\n            pollMessageGuid: options.pollMessageGuid,\n            optionIdentifier: options.optionIdentifier,\n        });\n\n        return data.data;\n    }\n\n    async addOption(options: AddPollOptionOptions): Promise<PollMessageResponse> {\n        if (!options.optionText || options.optionText.trim().length === 0) {\n            throw new Error(\"Option text cannot be empty\");\n        }\n\n        const { data } = await this.http.post(\"/api/v1/poll/option\", {\n            chatGuid: options.chatGuid,\n            pollMessageGuid: options.pollMessageGuid,\n            optionText: options.optionText,\n        });\n\n        return data.data;\n    }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ScheduledMessageModule {\n    constructor(private readonly http: AxiosInstance) {}\n\n    async createScheduledMessage(options: any): Promise<any> {\n        const response = await this.http.post(\"/api/v1/message/schedule\", options);\n        return response.data.data;\n    }\n\n    async getScheduledMessages(): Promise<any[]> {\n        const response = await this.http.get(\"/api/v1/message/schedule\");\n        return response.data.data;\n    }\n\n    async updateScheduledMessage(id: string, options: any): Promise<any> {\n        const response = await this.http.put(`/api/v1/message/schedule/${encodeURIComponent(id)}`, options);\n        return response.data.data;\n    }\n\n    async deleteScheduledMessage(id: string): Promise<void> {\n        await this.http.delete(`/api/v1/message/schedule/${encodeURIComponent(id)}`);\n    }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ServerModule {\n    constructor(private readonly http: AxiosInstance) {}\n\n    async getServerInfo(): Promise<any> {\n        const response = await this.http.get(\"/api/v1/server/info\");\n        return response.data.data;\n    }\n\n    async getMessageStats(): Promise<any> {\n        const response = await this.http.get(\"/api/v1/server/statistics/totals\");\n        return response.data.data;\n    }\n\n    async getServerLogs(count?: number): Promise<string[]> {\n        const response = await this.http.get(\"/api/v1/server/logs\", {\n            params: count !== undefined ? { count } : {},\n        });\n        return response.data.data;\n    }\n\n    async getMediaStatistics(options?: { only?: string[] }): Promise<any> {\n        const params: Record<string, any> = {};\n        if (options?.only) params.only = options.only.join(\",\");\n\n        const response = await this.http.get(\"/api/v1/server/statistics/media\", {\n            params,\n        });\n        return response.data.data;\n    }\n\n    async getMediaStatisticsByChat(options?: { only?: string[] }): Promise<any> {\n        const params: Record<string, any> = {};\n        if (options?.only) params.only = options.only.join(\",\");\n\n        const response = await this.http.get(\"/api/v1/server/statistics/media/chat\", {\n            params,\n        });\n        return response.data.data;\n    }\n}\n","import { EventEmitter } from \"node:events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport io from \"socket.io-client\";\nimport { getLogger, setGlobalLogLevel, setGlobalLogToFile } from \"./lib/Loggable\";\nimport type { LogLevel } from \"./lib/Logger\";\nimport {\n    AttachmentModule,\n    ChatModule,\n    ContactModule,\n    FaceTimeModule,\n    HandleModule,\n    ICloudModule,\n    MessageModule,\n    PollModule,\n    ScheduledMessageModule,\n    ServerModule,\n} from \"./modules\";\nimport type { ClientConfig, PhotonEventMap, TypedEventEmitter } from \"./types\";\n\nexport class AdvancedIMessageKit extends EventEmitter implements TypedEventEmitter {\n    private static getGlobalSdk = (): AdvancedIMessageKit | null => (globalThis as any).__AdvancedIMessageKit__ ?? null;\n    private static setGlobalSdk = (sdk: AdvancedIMessageKit) => {\n        (globalThis as any).__AdvancedIMessageKit__ = sdk;\n    };\n\n    public static getInstance(config?: ClientConfig): AdvancedIMessageKit {\n        const existing = AdvancedIMessageKit.getGlobalSdk();\n        if (existing) return existing;\n\n        const instance = new AdvancedIMessageKit(config);\n        AdvancedIMessageKit.setGlobalSdk(instance);\n        return instance;\n    }\n\n    // Core\n    public readonly config: ClientConfig;\n    public readonly logger = getLogger(\"AdvancedIMessageKit\");\n    public readonly http: AxiosInstance;\n    public readonly socket: ReturnType<typeof io>;\n\n    public readonly attachments: AttachmentModule;\n    public readonly messages: MessageModule;\n    public readonly chats: ChatModule;\n\n    public readonly contacts: ContactModule;\n    public readonly handles: HandleModule;\n\n    public readonly facetime: FaceTimeModule;\n    public readonly icloud: ICloudModule;\n\n    public readonly polls: PollModule;\n    public readonly scheduledMessages: ScheduledMessageModule;\n    public readonly server: ServerModule;\n\n    // Message deduplication feature\n    //\n    // Purpose: Prevent message reply loops caused by server repeatedly pushing\n    // the same message content with different GUIDs due to unstable Socket.IO connections.\n    // This is especially problematic when the polling transport causes connection issues.\n    private processedMessages = new Set<string>();\n\n    // Last message timestamp for reconnect recovery\n    private lastMessageTime = 0;\n\n    // Send queue for sequential message delivery\n    //\n    // Purpose: Ensure all outgoing messages (text, attachments, stickers, etc.) from\n    // a single user/SDK instance are sent in strict order, preventing race conditions.\n    private sendQueue: Promise<unknown> = Promise.resolve();\n\n    // Flag to track if 'ready' event has been emitted\n    //\n    // Purpose: Prevent duplicate 'ready' events when both legacy mode (no API key)\n    // and auth-ok events occur, which would cause user callbacks to fire twice.\n    private readyEmitted = false;\n\n    // Flag to track if socket event listeners have been attached\n    //\n    // Purpose: Prevent duplicate event listeners when connect() is called multiple times\n    // or after close(). Without this, each connect() call would add new listeners,\n    // causing events to fire multiple times.\n    private listenersAttached = false;\n\n    constructor(config: ClientConfig = {}) {\n        super();\n\n        this.config = {\n            serverUrl: \"http://localhost:1234\",\n            logLevel: \"info\",\n            logToFile: true,\n            ...config,\n        };\n\n        if (this.config.logToFile === false) {\n            setGlobalLogToFile(false);\n        }\n\n        if (this.config.logLevel) {\n            setGlobalLogLevel(this.config.logLevel as LogLevel);\n        }\n\n        this.http = axios.create({\n            baseURL: this.config.serverUrl,\n            headers: this.config.apiKey ? { \"X-API-Key\": this.config.apiKey } : undefined,\n        });\n\n        this.socket = io(this.config.serverUrl, {\n            auth: this.config.apiKey ? { apiKey: this.config.apiKey } : undefined,\n            // 🚨 IMPORTANT: Polling transport configuration notes\n            //\n            // Root cause analysis:\n            // 1. Socket.IO 'polling' transport can cause unstable connections in certain network environments\n            // 2. When \"xhr poll error\" occurs, Socket.IO attempts to reconnect\n            // 3. During reconnection, the server may repeatedly push the same message with different GUIDs\n            // 4. This is not simple client-side duplicate processing, but server-side message duplication\n            //\n            // Solutions:\n            // - Prioritize WebSocket transport, fallback to polling as backup\n            // - Set reasonable timeout to avoid frequent reconnections\n            // - Use forceNew to ensure fresh connections and avoid state pollution\n            // - Implement client-side message deduplication as the last line of defense\n            transports: [\"websocket\"], // Only WebSocket - polling disabled to prevent message duplication\n            timeout: 10000, // 10 second timeout to avoid overly frequent reconnections\n            forceNew: true, // Force new connection to avoid connection state pollution\n            reconnection: true, // Enable auto-reconnection (default, but explicit for clarity)\n            reconnectionAttempts: Number.POSITIVE_INFINITY, // Never give up\n            reconnectionDelay: 100, // Start with 100ms delay (fast initial reconnect)\n            reconnectionDelayMax: 2000, // Max 2 seconds between attempts\n            randomizationFactor: 0.1, // Low randomization for more consistent reconnect timing\n        });\n\n        // Bind enqueueSend to this instance for use in modules\n        const enqueueSend = this.enqueueSend.bind(this);\n\n        this.attachments = new AttachmentModule(this.http, enqueueSend);\n        this.messages = new MessageModule(this.http, enqueueSend);\n        this.chats = new ChatModule(this.http);\n\n        this.contacts = new ContactModule(this.http);\n        this.handles = new HandleModule(this.http);\n\n        this.facetime = new FaceTimeModule(this.http);\n        this.icloud = new ICloudModule(this.http);\n\n        this.polls = new PollModule(this.http);\n        this.scheduledMessages = new ScheduledMessageModule(this.http);\n        this.server = new ServerModule(this.http);\n    }\n\n    override emit<K extends keyof PhotonEventMap>(\n        event: K,\n        ...args: PhotonEventMap[K] extends undefined ? [] : [PhotonEventMap[K]]\n    ): boolean;\n    override emit(event: string | symbol, ...args: unknown[]): boolean {\n        return super.emit(event, ...(args as [unknown, ...unknown[]]));\n    }\n\n    override on<K extends keyof PhotonEventMap>(\n        event: K,\n        listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n    ): this;\n    override on(event: string | symbol, listener: (...args: unknown[]) => void): this {\n        return super.on(event, listener as (...args: unknown[]) => void);\n    }\n\n    override once<K extends keyof PhotonEventMap>(\n        event: K,\n        listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n    ): this;\n    override once(event: string | symbol, listener: (...args: unknown[]) => void): this {\n        return super.once(event, listener as (...args: unknown[]) => void);\n    }\n\n    override off<K extends keyof PhotonEventMap>(\n        event: K,\n        listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n    ): this;\n    override off(event: string | symbol, listener: (...args: unknown[]) => void): this {\n        return super.off(event, listener as (...args: unknown[]) => void);\n    }\n\n    override addListener<K extends keyof PhotonEventMap>(\n        event: K,\n        listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n    ): this;\n    override addListener(event: string | symbol, listener: (...args: unknown[]) => void): this {\n        return super.addListener(event, listener as (...args: unknown[]) => void);\n    }\n\n    override removeListener<K extends keyof PhotonEventMap>(\n        event: K,\n        listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n    ): this;\n    override removeListener(event: string | symbol, listener: (...args: unknown[]) => void): this {\n        return super.removeListener(event, listener as (...args: unknown[]) => void);\n    }\n\n    async connect() {\n        if (!this.listenersAttached) {\n            this.listenersAttached = true;\n            this.attachSocketListeners();\n        }\n\n        if (this.socket.connected) {\n            this.logger.info(\"Already connected to iMessage server\");\n            return;\n        }\n\n        this.socket.connect();\n    }\n\n    private attachSocketListeners() {\n        const serverEvents: (keyof PhotonEventMap)[] = [\n            \"new-message\",\n            \"message-updated\",\n            \"updated-message\",\n            \"chat-read-status-changed\",\n            \"group-name-change\",\n            \"participant-added\",\n            \"participant-removed\",\n            \"participant-left\",\n            \"group-icon-changed\",\n            \"group-icon-removed\",\n            \"message-send-error\",\n            \"typing-indicator\",\n            \"new-server\",\n            \"incoming-facetime\",\n            \"ft-call-status-changed\",\n            \"new-findmy-location\",\n            \"hello-world\",\n        ];\n\n        for (const eventName of serverEvents) {\n            this.socket.on(eventName, (...args: unknown[]) => {\n                // Message deduplication logic\n                //\n                // Problem: When Socket.IO connection is unstable (especially with polling transport),\n                // the server may repeatedly push the same message content with different GUIDs.\n                // This bypasses traditional GUID-based deduplication and causes message reply loops.\n                //\n                // Solution: Use GUID as unique identifier for deduplication\n                if (eventName === \"new-message\" && args.length > 0) {\n                    const message = args[0] as { guid?: string; dateCreated?: number };\n                    if (message?.guid) {\n                        // Check if this message has already been processed\n                        if (this.processedMessages.has(message.guid)) {\n                            this.logger.debug(`Message already processed, skipping duplicate: ${message.guid}`);\n                            return;\n                        }\n                        // Mark message as processed\n                        this.processedMessages.add(message.guid);\n                        if (message.dateCreated && message.dateCreated > this.lastMessageTime) {\n                            this.lastMessageTime = message.dateCreated;\n                        }\n                    }\n                }\n\n                if (args.length > 0) {\n                    super.emit(eventName, args[0]);\n                } else {\n                    super.emit(eventName);\n                }\n            });\n        }\n\n        this.socket.on(\"disconnect\", (reason) => {\n            this.logger.info(`Disconnected from iMessage server (reason: ${reason})`);\n            this.readyEmitted = false;\n            this.emit(\"disconnect\");\n\n            if (reason === \"io server disconnect\") {\n                this.logger.info(\"Server disconnected, manually triggering reconnect...\");\n                this.socket.connect();\n            }\n        });\n\n        this.socket.io.on(\"reconnect_attempt\", (attempt) => {\n            this.logger.info(`Reconnection attempt #${attempt}...`);\n        });\n\n        this.socket.io.on(\"reconnect\", (attempt) => {\n            this.logger.info(`Reconnected successfully after ${attempt} attempt(s)`);\n        });\n\n        this.socket.io.on(\"reconnect_error\", (error) => {\n            this.logger.warn(`Reconnection error: ${error.message}`);\n        });\n\n        this.socket.io.on(\"reconnect_failed\", () => {\n            this.logger.error(\"All reconnection attempts failed\");\n        });\n\n        // Listen for authentication success\n        this.socket.on(\"auth-ok\", async () => {\n            this.logger.info(\"Authentication successful\");\n            if (!this.readyEmitted) {\n                this.readyEmitted = true;\n                await this.recoverMissedMessages();\n                this.emit(\"ready\");\n            }\n        });\n\n        // Listen for authentication errors\n        this.socket.on(\"auth-error\", (error: { message: string; reason?: string }) => {\n            this.logger.error(`Authentication failed: ${error.message} ${error.reason ? `(${error.reason})` : \"\"}`);\n            this.emit(\"error\", new Error(`Authentication failed: ${error.message}`));\n        });\n\n        this.socket.on(\"connect\", async () => {\n            this.logger.info(\"Connected to iMessage server, waiting for authentication...\");\n            // If no apiKey, assume legacy server that doesn't require auth - emit ready immediately\n            if (!this.config.apiKey) {\n                this.logger.info(\"No API key provided, skipping authentication (legacy server mode)\");\n                if (!this.readyEmitted) {\n                    this.readyEmitted = true;\n                    await this.recoverMissedMessages();\n                    this.emit(\"ready\");\n                }\n            }\n        });\n\n        this.socket.on(\"connect_error\", (error) => {\n            this.logger.warn(`Connection error: ${error.message}`);\n        });\n    }\n\n    async close() {\n        this.socket.disconnect();\n    }\n\n    private async recoverMissedMessages() {\n        if (this.lastMessageTime <= 0) return;\n\n        try {\n            const after = this.lastMessageTime;\n            const messages = await this.messages.getMessages({\n                after,\n                sort: \"ASC\",\n                limit: 100,\n            });\n\n            if (messages.length === 0) {\n                this.logger.debug(\"No missed messages to recover\");\n                return;\n            }\n\n            this.logger.info(`Recovering ${messages.length} missed message(s)`);\n            for (const msg of messages) {\n                if (msg.guid && !this.processedMessages.has(msg.guid)) {\n                    this.processedMessages.add(msg.guid);\n                    if (msg.dateCreated && msg.dateCreated > this.lastMessageTime) {\n                        this.lastMessageTime = msg.dateCreated;\n                    }\n                    super.emit(\"new-message\", msg);\n                }\n            }\n        } catch (e) {\n            this.logger.warn(`Failed to recover missed messages: ${e}`);\n        }\n    }\n\n    /**\n     * Clear processed message records (prevent memory leaks)\n     * @param maxSize Maximum number of messages to retain, default 1000\n     */\n    public clearProcessedMessages(maxSize: number = 1000) {\n        if (this.processedMessages.size > maxSize) {\n            const messages = Array.from(this.processedMessages);\n            this.processedMessages.clear();\n            // Keep the most recent portion of messages\n            messages.slice(-Math.floor(maxSize / 2)).forEach((guid) => {\n                this.processedMessages.add(guid);\n            });\n            this.logger.debug(`Cleared processed message records, retained ${this.processedMessages.size} messages`);\n        }\n    }\n\n    /**\n     * Get the count of processed messages\n     */\n    public getProcessedMessageCount(): number {\n        return this.processedMessages.size;\n    }\n\n    /**\n     * Enqueue a send operation to ensure sequential delivery.\n     * All send operations (messages, attachments, stickers) should use this method\n     * to guarantee order for a single user.\n     * @param task The async send operation to enqueue\n     * @returns Promise that resolves with the task result\n     */\n    public enqueueSend<T>(task: () => Promise<T>): Promise<T> {\n        const result = this.sendQueue.then(() => task());\n        // Update queue, swallow errors to not block subsequent sends\n        this.sendQueue = result.catch(() => {});\n        return result;\n    }\n}\n\nexport const SDK = AdvancedIMessageKit.getInstance;\n","export const SCHEDULED_MESSAGE_ERROR = \"scheduled-message-error\";\nexport const SCHEDULED_MESSAGE_SENT = \"scheduled-message-sent\";\nexport const SCHEDULED_MESSAGE_DELETED = \"scheduled-message-deleted\";\nexport const SCHEDULED_MESSAGE_UPDATED = \"scheduled-message-updated\";\nexport const SCHEDULED_MESSAGE_CREATED = \"scheduled-message-created\";\nexport const NEW_MESSAGE = \"new-message\";\nexport const MESSAGE_SEND_ERROR = \"message-send-error\";\nexport const MESSAGE_UPDATED = \"updated-message\";\nexport const NEW_SERVER = \"new-server\";\nexport const PARTICIPANT_REMOVED = \"participant-removed\";\nexport const PARTICIPANT_ADDED = \"participant-added\";\nexport const PARTICIPANT_LEFT = \"participant-left\";\nexport const GROUP_ICON_CHANGED = \"group-icon-changed\";\nexport const GROUP_ICON_REMOVED = \"group-icon-removed\";\nexport const CHAT_READ_STATUS_CHANGED = \"chat-read-status-changed\";\nexport const HELLO_WORLD = \"hello-world\";\nexport const TYPING_INDICATOR = \"typing-indicator\";\nexport const SERVER_UPDATE = \"server-update\";\nexport const SERVER_UPDATE_DOWNLOADING = \"server-update-downloading\";\nexport const SERVER_UPDATE_INSTALLING = \"server-update-installing\";\nexport const GROUP_NAME_CHANGE = \"group-name-change\";\nexport const INCOMING_FACETIME = \"incoming-facetime\";\nexport const SETTINGS_BACKUP_CREATED = \"settings-backup-created\";\nexport const SETTINGS_BACKUP_DELETED = \"settings-backup-deleted\";\nexport const SETTINGS_BACKUP_UPDATED = \"settings-backup-updated\";\nexport const THEME_BACKUP_CREATED = \"theme-backup-created\";\nexport const THEME_BACKUP_DELETED = \"theme-backup-deleted\";\nexport const THEME_BACKUP_UPDATED = \"theme-backup-updated\";\nexport const IMESSAGE_ALIASES_REMOVED = \"imessage-aliases-removed\";\nexport const FT_CALL_STATUS_CHANGED = \"ft-call-status-changed\";\nexport const NEW_FINDMY_LOCATION = \"new-findmy-location\";\n","import type { MessageResponse } from \"../types/message\";\nimport type { PollDefinition, PollOption, PollVote, PollVoteResponse } from \"../types/poll\";\n\nexport const POLL_BALLOON_BUNDLE_ID =\n    \"com.apple.messages.MSMessageExtensionBalloonPlugin:0000000000:com.apple.messages.Polls\";\n\nconst pollCache = new Map<string, ParsedPoll>();\n\nexport function cachePoll(messageGuid: string, poll: ParsedPoll): void {\n    pollCache.set(messageGuid, poll);\n}\n\nexport function getCachedPoll(messageGuid: string): ParsedPoll | null {\n    return pollCache.get(messageGuid) ?? null;\n}\n\nexport function getOptionTextById(optionId: string): string | null {\n    for (const poll of pollCache.values()) {\n        const option = poll.options.find((o) => o.optionIdentifier === optionId);\n        if (option) return option.text;\n    }\n    return null;\n}\n\nexport function isPollMessage(message: MessageResponse): boolean {\n    return message.balloonBundleId === POLL_BALLOON_BUNDLE_ID;\n}\n\nexport function isPollVote(message: MessageResponse): boolean {\n    return isPollMessage(message) && message.associatedMessageType === \"4000\";\n}\n\nexport interface ParsedPoll {\n    title: string;\n    creatorHandle: string;\n    options: PollOption[];\n}\n\nexport interface ParsedPollVote {\n    votes: PollVote[];\n}\n\nfunction extractDataUrl(payloadData: NodeJS.Dict<any>[] | null | undefined): string | null {\n    if (!payloadData || payloadData.length === 0) return null;\n\n    const payload = payloadData[0];\n    if (!payload) return null;\n\n    if (payload.URL && typeof payload.URL === \"string\") {\n        return payload.URL;\n    }\n\n    const objects = payload.$objects;\n    if (Array.isArray(objects)) {\n        for (const obj of objects) {\n            if (typeof obj === \"string\" && obj.startsWith(\"data:,\")) {\n                return obj;\n            }\n            if (typeof obj === \"object\" && obj !== null) {\n                if (obj[\"NS.relative\"] && typeof obj[\"NS.relative\"] === \"object\") {\n                    const relativeObj = objects[obj[\"NS.relative\"].UID];\n                    if (typeof relativeObj === \"string\" && relativeObj.startsWith(\"data:,\")) {\n                        return relativeObj;\n                    }\n                }\n            }\n        }\n    }\n\n    return null;\n}\n\nfunction parseDataUrl(dataUrl: string): unknown | null {\n    try {\n        const prefix = \"data:,\";\n        if (!dataUrl.startsWith(prefix)) return null;\n\n        let data = dataUrl.slice(prefix.length);\n        const queryIndex = data.indexOf(\"?\");\n        if (queryIndex !== -1) {\n            data = data.slice(0, queryIndex);\n        }\n\n        data = decodeURIComponent(data);\n\n        try {\n            return JSON.parse(data);\n        } catch {\n            const decoded = Buffer.from(data, \"base64\").toString(\"utf-8\");\n            return JSON.parse(decoded);\n        }\n    } catch {\n        return null;\n    }\n}\n\nexport function parsePollDefinition(message: MessageResponse): ParsedPoll | null {\n    if (!isPollMessage(message)) return null;\n    if (isPollVote(message)) return null; // Vote messages don't contain the poll definition\n\n    const dataUrl = extractDataUrl(message.payloadData);\n    if (!dataUrl) return null;\n\n    const data = parseDataUrl(dataUrl) as PollDefinition | null;\n    if (!data || !data.item) return null;\n\n    const parsed: ParsedPoll = {\n        title: data.item.title || \"\",\n        creatorHandle: data.item.creatorHandle || \"\",\n        options: data.item.orderedPollOptions || [],\n    };\n\n    if (message.guid) {\n        cachePoll(message.guid, parsed);\n    }\n\n    return parsed;\n}\n\nexport function parsePollVotes(message: MessageResponse): ParsedPollVote | null {\n    if (!isPollMessage(message)) return null;\n    if (!isPollVote(message)) return null;\n\n    const dataUrl = extractDataUrl(message.payloadData);\n    if (!dataUrl) return null;\n\n    const data = parseDataUrl(dataUrl) as PollVoteResponse | null;\n    if (!data || !data.item) return null;\n\n    return {\n        votes: data.item.votes || [],\n    };\n}\n\nexport function getPollSummary(message: MessageResponse): string {\n    if (!isPollMessage(message)) {\n        return message.text || \"(no text)\";\n    }\n\n    if (isPollVote(message)) {\n        const voteData = parsePollVotes(message);\n        if (voteData && voteData.votes.length > 0) {\n            const votes = voteData.votes\n                .map((v) => {\n                    const optionText = getOptionTextById(v.voteOptionIdentifier);\n                    const optionDisplay = optionText ? `\"${optionText}\"` : `option ${v.voteOptionIdentifier}`;\n                    return `${v.participantHandle || \"Someone\"} voted ${optionDisplay}`;\n                })\n                .join(\", \");\n            return `[Poll Vote] ${votes}`;\n        }\n        return \"[Poll Vote]\";\n    }\n\n    const pollData = parsePollDefinition(message);\n    if (pollData) {\n        const title = pollData.title ? `\"${pollData.title}\"` : \"(untitled poll)\";\n        const optionsList = pollData.options.map((opt, i) => `  ${i + 1}. ${opt.text}`).join(\"\\n\");\n        return `[Poll] ${title}\\n${optionsList}`;\n    }\n\n    return \"[Poll] (unable to parse)\";\n}\n\nexport function getPollOneLiner(message: MessageResponse): string {\n    if (!isPollMessage(message)) {\n        return message.text || \"(no text)\";\n    }\n\n    if (isPollVote(message)) {\n        const voteData = parsePollVotes(message);\n        if (voteData && voteData.votes.length > 0) {\n            return `[Poll Vote] ${voteData.votes.length} vote(s)`;\n        }\n        return \"[Poll Vote]\";\n    }\n\n    const pollData = parsePollDefinition(message);\n    if (pollData) {\n        const title = pollData.title || \"Poll\";\n        const optionsPreview = pollData.options\n            .slice(0, 2)\n            .map((o) => o.text)\n            .join(\", \");\n        const moreOptions = pollData.options.length > 2 ? `, +${pollData.options.length - 2} more` : \"\";\n        return `[${title}] ${optionsPreview}${moreOptions}`;\n    }\n\n    return \"[Poll]\";\n}\n"]}