@photon-ai/advanced-imessage-kit 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +35 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +35 -18
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -191,6 +191,9 @@ var AttachmentModule = class {
|
|
|
191
191
|
form.append("method", "private-api");
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
|
+
if (options.selectedMessageGuid) {
|
|
195
|
+
form.append("selectedMessageGuid", options.selectedMessageGuid);
|
|
196
|
+
}
|
|
194
197
|
const response = await this.http.post("/api/v1/message/attachment", form, {
|
|
195
198
|
headers: form.getHeaders()
|
|
196
199
|
});
|
|
@@ -209,12 +212,12 @@ var AttachmentModule = class {
|
|
|
209
212
|
if (options.selectedMessageGuid) {
|
|
210
213
|
form.append("selectedMessageGuid", options.selectedMessageGuid);
|
|
211
214
|
form.append("partIndex", "0");
|
|
215
|
+
form.append("stickerX", String(options.stickerX ?? 0.5));
|
|
216
|
+
form.append("stickerY", String(options.stickerY ?? 0.5));
|
|
217
|
+
form.append("stickerScale", String(options.stickerScale ?? 0.75));
|
|
218
|
+
form.append("stickerRotation", String(options.stickerRotation ?? 0));
|
|
219
|
+
form.append("stickerWidth", String(options.stickerWidth ?? 300));
|
|
212
220
|
}
|
|
213
|
-
form.append("stickerX", String(options.stickerX ?? 0.5));
|
|
214
|
-
form.append("stickerY", String(options.stickerY ?? 0.5));
|
|
215
|
-
form.append("stickerScale", String(options.stickerScale ?? 0.75));
|
|
216
|
-
form.append("stickerRotation", String(options.stickerRotation ?? 0));
|
|
217
|
-
form.append("stickerWidth", String(options.stickerWidth ?? 300));
|
|
218
221
|
const { data } = await this.http.post("/api/v1/message/attachment", form, {
|
|
219
222
|
headers: form.getHeaders()
|
|
220
223
|
});
|
|
@@ -235,32 +238,35 @@ var ChatModule = class {
|
|
|
235
238
|
return response.data.data;
|
|
236
239
|
}
|
|
237
240
|
async getChat(guid, options) {
|
|
238
|
-
const response = await this.http.get(`/api/v1/chat/${
|
|
241
|
+
const response = await this.http.get(`/api/v1/chat/${guid}`, {
|
|
239
242
|
params: options?.with ? { with: options.with.join(",") } : {}
|
|
240
243
|
});
|
|
241
244
|
return response.data.data;
|
|
242
245
|
}
|
|
243
246
|
async updateChat(guid, options) {
|
|
244
|
-
const response = await this.http.put(`/api/v1/chat/${
|
|
247
|
+
const response = await this.http.put(`/api/v1/chat/${guid}`, options);
|
|
245
248
|
return response.data.data;
|
|
246
249
|
}
|
|
247
250
|
async deleteChat(guid) {
|
|
248
|
-
await this.http.delete(`/api/v1/chat/${
|
|
251
|
+
await this.http.delete(`/api/v1/chat/${guid}`);
|
|
249
252
|
}
|
|
250
253
|
async markChatRead(guid) {
|
|
251
|
-
await this.http.post(`/api/v1/chat/${
|
|
254
|
+
await this.http.post(`/api/v1/chat/${guid}/read`);
|
|
255
|
+
}
|
|
256
|
+
async markChatUnread(guid) {
|
|
257
|
+
await this.http.post(`/api/v1/chat/${guid}/unread`);
|
|
252
258
|
}
|
|
253
259
|
async leaveChat(guid) {
|
|
254
|
-
await this.http.post(`/api/v1/chat/${
|
|
260
|
+
await this.http.post(`/api/v1/chat/${guid}/leave`);
|
|
255
261
|
}
|
|
256
262
|
async addParticipant(chatGuid, address) {
|
|
257
|
-
const response = await this.http.post(`/api/v1/chat/${
|
|
263
|
+
const response = await this.http.post(`/api/v1/chat/${chatGuid}/participant`, {
|
|
258
264
|
address
|
|
259
265
|
});
|
|
260
266
|
return response.data.data;
|
|
261
267
|
}
|
|
262
268
|
async removeParticipant(chatGuid, address) {
|
|
263
|
-
const response = await this.http.delete(`/api/v1/chat/${
|
|
269
|
+
const response = await this.http.delete(`/api/v1/chat/${chatGuid}/participant`, {
|
|
264
270
|
data: { address }
|
|
265
271
|
});
|
|
266
272
|
return response.data.data;
|
|
@@ -273,7 +279,7 @@ var ChatModule = class {
|
|
|
273
279
|
if (options?.before !== void 0) params.before = options.before;
|
|
274
280
|
if (options?.after !== void 0) params.after = options.after;
|
|
275
281
|
if (options?.with) params.with = options.with.join(",");
|
|
276
|
-
const response = await this.http.get(`/api/v1/chat/${
|
|
282
|
+
const response = await this.http.get(`/api/v1/chat/${chatGuid}/message`, {
|
|
277
283
|
params
|
|
278
284
|
});
|
|
279
285
|
return response.data.data;
|
|
@@ -283,15 +289,15 @@ var ChatModule = class {
|
|
|
283
289
|
const fileName = path__namespace.default.basename(filePath);
|
|
284
290
|
const form = new FormData__default.default();
|
|
285
291
|
form.append("icon", fileBuffer, fileName);
|
|
286
|
-
await this.http.post(`/api/v1/chat/${
|
|
292
|
+
await this.http.post(`/api/v1/chat/${chatGuid}/icon`, form, {
|
|
287
293
|
headers: form.getHeaders()
|
|
288
294
|
});
|
|
289
295
|
}
|
|
290
296
|
async removeGroupIcon(chatGuid) {
|
|
291
|
-
await this.http.delete(`/api/v1/chat/${
|
|
297
|
+
await this.http.delete(`/api/v1/chat/${chatGuid}/icon`);
|
|
292
298
|
}
|
|
293
299
|
async getGroupIcon(chatGuid) {
|
|
294
|
-
const response = await this.http.get(`/api/v1/chat/${
|
|
300
|
+
const response = await this.http.get(`/api/v1/chat/${chatGuid}/icon`, {
|
|
295
301
|
responseType: "arraybuffer"
|
|
296
302
|
});
|
|
297
303
|
return Buffer.from(response.data);
|
|
@@ -303,10 +309,21 @@ var ChatModule = class {
|
|
|
303
309
|
return response.data.data;
|
|
304
310
|
}
|
|
305
311
|
async startTyping(chatGuid) {
|
|
306
|
-
await this.http.post(`/api/v1/chat/${
|
|
312
|
+
await this.http.post(`/api/v1/chat/${chatGuid}/typing`);
|
|
307
313
|
}
|
|
308
314
|
async stopTyping(chatGuid) {
|
|
309
|
-
await this.http.delete(`/api/v1/chat/${
|
|
315
|
+
await this.http.delete(`/api/v1/chat/${chatGuid}/typing`);
|
|
316
|
+
}
|
|
317
|
+
async getBackground(chatGuid) {
|
|
318
|
+
const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);
|
|
319
|
+
return response.data.data;
|
|
320
|
+
}
|
|
321
|
+
async setBackground(chatGuid, options) {
|
|
322
|
+
const body = typeof options === "string" ? { imageUrl: options } : options;
|
|
323
|
+
await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`, body);
|
|
324
|
+
}
|
|
325
|
+
async removeBackground(chatGuid) {
|
|
326
|
+
await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);
|
|
310
327
|
}
|
|
311
328
|
};
|
|
312
329
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/Logger.ts","../lib/Loggable.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../lib/auto-create-chat.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","FormData","randomUUID","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 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 }\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\";\n\nexport const setGlobalLogLevel = (level: LogLevel) => {\n globalLogLevel = level;\n Object.values(loggers).forEach((logger) => {\n logger.setLogLevel(level);\n });\n};\n\nexport const getLogger = (tag: string) => {\n let logger = loggers[tag];\n if (!logger) {\n logger = new Logger(tag, globalLogLevel);\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 { 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 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/${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/${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/${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/${guid}/blurhash`, {\n params,\n });\n return response.data.data.blurhash;\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\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\", randomUUID());\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\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return response.data.data;\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 form = new FormData();\n\n form.append(\"attachment\", await readFile(options.filePath), fileName);\n form.append(\"name\", fileName);\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"isSticker\", \"true\");\n form.append(\"method\", \"private-api\");\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n form.append(\"partIndex\", \"0\");\n }\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 const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return data.data;\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 { 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 effectId?: string;\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 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.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n data: { 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","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.join(\",\");\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/${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/${guid}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ICloudModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getFindMyFriends(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/icloud/findmy/friends\");\n return response.data.data;\n }\n\n async refreshFindMyFriends(): Promise<void> {\n await this.http.post(\"/api/v1/icloud/findmy/friends/refresh\");\n }\n}\n","import type { AxiosInstance } from \"axios\";\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 * 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 effectId?: string;\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId } = options;\n try {\n const response = await http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n message,\n tempGuid,\n subject,\n effectId,\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 type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { MessageResponse, SendMessageOptions } 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 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 await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n });\n return { guid: tempGuid, text: options.message, dateCreated: Date.now() } as MessageResponse;\n }\n });\n }\n\n async getMessage(guid: string, options?: { with?: string[] }): Promise<MessageResponse> {\n const response = await this.http.get(`/api/v1/message/${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/${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/${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/${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/${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 matchType?: \"contains\" | \"exact\";\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/search\", options);\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/${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/${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 } 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 // 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 private constructor(config: ClientConfig = {}) {\n super();\n\n this.config = {\n serverUrl: \"http://localhost:1234\",\n logLevel: \"info\",\n ...config,\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 });\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 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 \"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 };\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 }\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\", () => {\n this.logger.info(\"Disconnected from iMessage server\");\n this.readyEmitted = false;\n this.emit(\"disconnect\");\n });\n\n // Listen for authentication success\n this.socket.on(\"auth-ok\", () => {\n this.logger.info(\"Authentication successful\");\n if (!this.readyEmitted) {\n this.readyEmitted = true;\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 if (this.socket.connected) {\n this.logger.info(\"Already connected to iMessage server\");\n return;\n }\n\n this.socket.once(\"connect\", () => {\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 this.emit(\"ready\");\n }\n }\n });\n\n if (!this.socket.connected) {\n this.socket.connect();\n }\n }\n\n async close() {\n this.socket.disconnect();\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 === \"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 if (typeof obj === \"string\" && obj.startsWith(\"data:,\")) {\n return obj;\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"]}
|
|
1
|
+
{"version":3,"sources":["../lib/Logger.ts","../lib/Loggable.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../lib/auto-create-chat.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","FormData","randomUUID","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 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 }\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\";\n\nexport const setGlobalLogLevel = (level: LogLevel) => {\n globalLogLevel = level;\n Object.values(loggers).forEach((logger) => {\n logger.setLogLevel(level);\n });\n};\n\nexport const getLogger = (tag: string) => {\n let logger = loggers[tag];\n if (!logger) {\n logger = new Logger(tag, globalLogLevel);\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 { 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 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/${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/${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/${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/${guid}/blurhash`, {\n params,\n });\n return response.data.data.blurhash;\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\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\", randomUUID());\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\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return response.data.data;\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 form = new FormData();\n\n form.append(\"attachment\", await readFile(options.filePath), 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\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return data.data;\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 { 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 effectId?: string;\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/${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/${guid}`, options);\n return response.data.data;\n }\n\n async deleteChat(guid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${guid}`);\n }\n\n async markChatRead(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${guid}/read`);\n }\n\n async markChatUnread(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${guid}/unread`);\n }\n\n async leaveChat(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${guid}/leave`);\n }\n\n async addParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${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.delete(`/api/v1/chat/${chatGuid}/participant`, {\n data: { 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/${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/${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/${chatGuid}/icon`);\n }\n\n async getGroupIcon(chatGuid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/chat/${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/${chatGuid}/typing`);\n }\n\n async stopTyping(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${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 const body = typeof options === \"string\" ? { imageUrl: options } : options;\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.join(\",\");\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/${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/${guid}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ICloudModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getFindMyFriends(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/icloud/findmy/friends\");\n return response.data.data;\n }\n\n async refreshFindMyFriends(): Promise<void> {\n await this.http.post(\"/api/v1/icloud/findmy/friends/refresh\");\n }\n}\n","import type { AxiosInstance } from \"axios\";\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 * 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 effectId?: string;\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId } = options;\n try {\n const response = await http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n message,\n tempGuid,\n subject,\n effectId,\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 type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { MessageResponse, SendMessageOptions } 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 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 await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n });\n return { guid: tempGuid, text: options.message, dateCreated: Date.now() } as MessageResponse;\n }\n });\n }\n\n async getMessage(guid: string, options?: { with?: string[] }): Promise<MessageResponse> {\n const response = await this.http.get(`/api/v1/message/${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/${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/${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/${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/${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 matchType?: \"contains\" | \"exact\";\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/search\", options);\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/${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/${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 } 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 // 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 private constructor(config: ClientConfig = {}) {\n super();\n\n this.config = {\n serverUrl: \"http://localhost:1234\",\n logLevel: \"info\",\n ...config,\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 });\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 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 \"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 };\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 }\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\", () => {\n this.logger.info(\"Disconnected from iMessage server\");\n this.readyEmitted = false;\n this.emit(\"disconnect\");\n });\n\n // Listen for authentication success\n this.socket.on(\"auth-ok\", () => {\n this.logger.info(\"Authentication successful\");\n if (!this.readyEmitted) {\n this.readyEmitted = true;\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 if (this.socket.connected) {\n this.logger.info(\"Already connected to iMessage server\");\n return;\n }\n\n this.socket.once(\"connect\", () => {\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 this.emit(\"ready\");\n }\n }\n });\n\n if (!this.socket.connected) {\n this.socket.connect();\n }\n }\n\n async close() {\n this.socket.disconnect();\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 === \"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 if (typeof obj === \"string\" && obj.startsWith(\"data:,\")) {\n return obj;\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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -24,6 +24,7 @@ interface SendAttachmentOptions {
|
|
|
24
24
|
filePath: string;
|
|
25
25
|
fileName?: string;
|
|
26
26
|
isAudioMessage?: boolean;
|
|
27
|
+
selectedMessageGuid?: string;
|
|
27
28
|
}
|
|
28
29
|
interface Attachment {
|
|
29
30
|
guid: string;
|
|
@@ -436,6 +437,7 @@ declare class ChatModule {
|
|
|
436
437
|
}): Promise<ChatResponse>;
|
|
437
438
|
deleteChat(guid: string): Promise<void>;
|
|
438
439
|
markChatRead(guid: string): Promise<void>;
|
|
440
|
+
markChatUnread(guid: string): Promise<void>;
|
|
439
441
|
leaveChat(guid: string): Promise<void>;
|
|
440
442
|
addParticipant(chatGuid: string, address: string): Promise<ChatResponse>;
|
|
441
443
|
removeParticipant(chatGuid: string, address: string): Promise<ChatResponse>;
|
|
@@ -458,6 +460,18 @@ declare class ChatModule {
|
|
|
458
460
|
}>;
|
|
459
461
|
startTyping(chatGuid: string): Promise<void>;
|
|
460
462
|
stopTyping(chatGuid: string): Promise<void>;
|
|
463
|
+
getBackground(chatGuid: string): Promise<{
|
|
464
|
+
hasBackground: boolean;
|
|
465
|
+
backgroundChannelGUID?: string | null;
|
|
466
|
+
imageUrl?: string | null;
|
|
467
|
+
backgroundId?: string | null;
|
|
468
|
+
}>;
|
|
469
|
+
setBackground(chatGuid: string, options: string | {
|
|
470
|
+
imageUrl?: string;
|
|
471
|
+
filePath?: string;
|
|
472
|
+
fileData?: string;
|
|
473
|
+
}): Promise<void>;
|
|
474
|
+
removeBackground(chatGuid: string): Promise<void>;
|
|
461
475
|
}
|
|
462
476
|
|
|
463
477
|
declare class ContactModule {
|
package/dist/index.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ interface SendAttachmentOptions {
|
|
|
24
24
|
filePath: string;
|
|
25
25
|
fileName?: string;
|
|
26
26
|
isAudioMessage?: boolean;
|
|
27
|
+
selectedMessageGuid?: string;
|
|
27
28
|
}
|
|
28
29
|
interface Attachment {
|
|
29
30
|
guid: string;
|
|
@@ -436,6 +437,7 @@ declare class ChatModule {
|
|
|
436
437
|
}): Promise<ChatResponse>;
|
|
437
438
|
deleteChat(guid: string): Promise<void>;
|
|
438
439
|
markChatRead(guid: string): Promise<void>;
|
|
440
|
+
markChatUnread(guid: string): Promise<void>;
|
|
439
441
|
leaveChat(guid: string): Promise<void>;
|
|
440
442
|
addParticipant(chatGuid: string, address: string): Promise<ChatResponse>;
|
|
441
443
|
removeParticipant(chatGuid: string, address: string): Promise<ChatResponse>;
|
|
@@ -458,6 +460,18 @@ declare class ChatModule {
|
|
|
458
460
|
}>;
|
|
459
461
|
startTyping(chatGuid: string): Promise<void>;
|
|
460
462
|
stopTyping(chatGuid: string): Promise<void>;
|
|
463
|
+
getBackground(chatGuid: string): Promise<{
|
|
464
|
+
hasBackground: boolean;
|
|
465
|
+
backgroundChannelGUID?: string | null;
|
|
466
|
+
imageUrl?: string | null;
|
|
467
|
+
backgroundId?: string | null;
|
|
468
|
+
}>;
|
|
469
|
+
setBackground(chatGuid: string, options: string | {
|
|
470
|
+
imageUrl?: string;
|
|
471
|
+
filePath?: string;
|
|
472
|
+
fileData?: string;
|
|
473
|
+
}): Promise<void>;
|
|
474
|
+
removeBackground(chatGuid: string): Promise<void>;
|
|
461
475
|
}
|
|
462
476
|
|
|
463
477
|
declare class ContactModule {
|
package/dist/index.js
CHANGED
|
@@ -162,6 +162,9 @@ var AttachmentModule = class {
|
|
|
162
162
|
form.append("method", "private-api");
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
|
+
if (options.selectedMessageGuid) {
|
|
166
|
+
form.append("selectedMessageGuid", options.selectedMessageGuid);
|
|
167
|
+
}
|
|
165
168
|
const response = await this.http.post("/api/v1/message/attachment", form, {
|
|
166
169
|
headers: form.getHeaders()
|
|
167
170
|
});
|
|
@@ -180,12 +183,12 @@ var AttachmentModule = class {
|
|
|
180
183
|
if (options.selectedMessageGuid) {
|
|
181
184
|
form.append("selectedMessageGuid", options.selectedMessageGuid);
|
|
182
185
|
form.append("partIndex", "0");
|
|
186
|
+
form.append("stickerX", String(options.stickerX ?? 0.5));
|
|
187
|
+
form.append("stickerY", String(options.stickerY ?? 0.5));
|
|
188
|
+
form.append("stickerScale", String(options.stickerScale ?? 0.75));
|
|
189
|
+
form.append("stickerRotation", String(options.stickerRotation ?? 0));
|
|
190
|
+
form.append("stickerWidth", String(options.stickerWidth ?? 300));
|
|
183
191
|
}
|
|
184
|
-
form.append("stickerX", String(options.stickerX ?? 0.5));
|
|
185
|
-
form.append("stickerY", String(options.stickerY ?? 0.5));
|
|
186
|
-
form.append("stickerScale", String(options.stickerScale ?? 0.75));
|
|
187
|
-
form.append("stickerRotation", String(options.stickerRotation ?? 0));
|
|
188
|
-
form.append("stickerWidth", String(options.stickerWidth ?? 300));
|
|
189
192
|
const { data } = await this.http.post("/api/v1/message/attachment", form, {
|
|
190
193
|
headers: form.getHeaders()
|
|
191
194
|
});
|
|
@@ -206,32 +209,35 @@ var ChatModule = class {
|
|
|
206
209
|
return response.data.data;
|
|
207
210
|
}
|
|
208
211
|
async getChat(guid, options) {
|
|
209
|
-
const response = await this.http.get(`/api/v1/chat/${
|
|
212
|
+
const response = await this.http.get(`/api/v1/chat/${guid}`, {
|
|
210
213
|
params: options?.with ? { with: options.with.join(",") } : {}
|
|
211
214
|
});
|
|
212
215
|
return response.data.data;
|
|
213
216
|
}
|
|
214
217
|
async updateChat(guid, options) {
|
|
215
|
-
const response = await this.http.put(`/api/v1/chat/${
|
|
218
|
+
const response = await this.http.put(`/api/v1/chat/${guid}`, options);
|
|
216
219
|
return response.data.data;
|
|
217
220
|
}
|
|
218
221
|
async deleteChat(guid) {
|
|
219
|
-
await this.http.delete(`/api/v1/chat/${
|
|
222
|
+
await this.http.delete(`/api/v1/chat/${guid}`);
|
|
220
223
|
}
|
|
221
224
|
async markChatRead(guid) {
|
|
222
|
-
await this.http.post(`/api/v1/chat/${
|
|
225
|
+
await this.http.post(`/api/v1/chat/${guid}/read`);
|
|
226
|
+
}
|
|
227
|
+
async markChatUnread(guid) {
|
|
228
|
+
await this.http.post(`/api/v1/chat/${guid}/unread`);
|
|
223
229
|
}
|
|
224
230
|
async leaveChat(guid) {
|
|
225
|
-
await this.http.post(`/api/v1/chat/${
|
|
231
|
+
await this.http.post(`/api/v1/chat/${guid}/leave`);
|
|
226
232
|
}
|
|
227
233
|
async addParticipant(chatGuid, address) {
|
|
228
|
-
const response = await this.http.post(`/api/v1/chat/${
|
|
234
|
+
const response = await this.http.post(`/api/v1/chat/${chatGuid}/participant`, {
|
|
229
235
|
address
|
|
230
236
|
});
|
|
231
237
|
return response.data.data;
|
|
232
238
|
}
|
|
233
239
|
async removeParticipant(chatGuid, address) {
|
|
234
|
-
const response = await this.http.delete(`/api/v1/chat/${
|
|
240
|
+
const response = await this.http.delete(`/api/v1/chat/${chatGuid}/participant`, {
|
|
235
241
|
data: { address }
|
|
236
242
|
});
|
|
237
243
|
return response.data.data;
|
|
@@ -244,7 +250,7 @@ var ChatModule = class {
|
|
|
244
250
|
if (options?.before !== void 0) params.before = options.before;
|
|
245
251
|
if (options?.after !== void 0) params.after = options.after;
|
|
246
252
|
if (options?.with) params.with = options.with.join(",");
|
|
247
|
-
const response = await this.http.get(`/api/v1/chat/${
|
|
253
|
+
const response = await this.http.get(`/api/v1/chat/${chatGuid}/message`, {
|
|
248
254
|
params
|
|
249
255
|
});
|
|
250
256
|
return response.data.data;
|
|
@@ -254,15 +260,15 @@ var ChatModule = class {
|
|
|
254
260
|
const fileName = path__default.basename(filePath);
|
|
255
261
|
const form = new FormData();
|
|
256
262
|
form.append("icon", fileBuffer, fileName);
|
|
257
|
-
await this.http.post(`/api/v1/chat/${
|
|
263
|
+
await this.http.post(`/api/v1/chat/${chatGuid}/icon`, form, {
|
|
258
264
|
headers: form.getHeaders()
|
|
259
265
|
});
|
|
260
266
|
}
|
|
261
267
|
async removeGroupIcon(chatGuid) {
|
|
262
|
-
await this.http.delete(`/api/v1/chat/${
|
|
268
|
+
await this.http.delete(`/api/v1/chat/${chatGuid}/icon`);
|
|
263
269
|
}
|
|
264
270
|
async getGroupIcon(chatGuid) {
|
|
265
|
-
const response = await this.http.get(`/api/v1/chat/${
|
|
271
|
+
const response = await this.http.get(`/api/v1/chat/${chatGuid}/icon`, {
|
|
266
272
|
responseType: "arraybuffer"
|
|
267
273
|
});
|
|
268
274
|
return Buffer.from(response.data);
|
|
@@ -274,10 +280,21 @@ var ChatModule = class {
|
|
|
274
280
|
return response.data.data;
|
|
275
281
|
}
|
|
276
282
|
async startTyping(chatGuid) {
|
|
277
|
-
await this.http.post(`/api/v1/chat/${
|
|
283
|
+
await this.http.post(`/api/v1/chat/${chatGuid}/typing`);
|
|
278
284
|
}
|
|
279
285
|
async stopTyping(chatGuid) {
|
|
280
|
-
await this.http.delete(`/api/v1/chat/${
|
|
286
|
+
await this.http.delete(`/api/v1/chat/${chatGuid}/typing`);
|
|
287
|
+
}
|
|
288
|
+
async getBackground(chatGuid) {
|
|
289
|
+
const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);
|
|
290
|
+
return response.data.data;
|
|
291
|
+
}
|
|
292
|
+
async setBackground(chatGuid, options) {
|
|
293
|
+
const body = typeof options === "string" ? { imageUrl: options } : options;
|
|
294
|
+
await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`, body);
|
|
295
|
+
}
|
|
296
|
+
async removeBackground(chatGuid) {
|
|
297
|
+
await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);
|
|
281
298
|
}
|
|
282
299
|
};
|
|
283
300
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/Logger.ts","../lib/Loggable.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../lib/auto-create-chat.ts","../modules/message.ts","../modules/poll.ts","../modules/scheduled.ts","../modules/server.ts","../client.ts","../events.ts","../lib/poll-utils.ts"],"names":["EventEmitter","path","readFile","FormData","randomUUID"],"mappings":"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","file":"index.js","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 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 }\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\";\n\nexport const setGlobalLogLevel = (level: LogLevel) => {\n globalLogLevel = level;\n Object.values(loggers).forEach((logger) => {\n logger.setLogLevel(level);\n });\n};\n\nexport const getLogger = (tag: string) => {\n let logger = loggers[tag];\n if (!logger) {\n logger = new Logger(tag, globalLogLevel);\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 { 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 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/${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/${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/${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/${guid}/blurhash`, {\n params,\n });\n return response.data.data.blurhash;\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\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\", randomUUID());\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\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return response.data.data;\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 form = new FormData();\n\n form.append(\"attachment\", await readFile(options.filePath), fileName);\n form.append(\"name\", fileName);\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"isSticker\", \"true\");\n form.append(\"method\", \"private-api\");\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n form.append(\"partIndex\", \"0\");\n }\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 const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return data.data;\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 { 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 effectId?: string;\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 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.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n data: { 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","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.join(\",\");\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/${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/${guid}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ICloudModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getFindMyFriends(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/icloud/findmy/friends\");\n return response.data.data;\n }\n\n async refreshFindMyFriends(): Promise<void> {\n await this.http.post(\"/api/v1/icloud/findmy/friends/refresh\");\n }\n}\n","import type { AxiosInstance } from \"axios\";\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 * 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 effectId?: string;\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId } = options;\n try {\n const response = await http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n message,\n tempGuid,\n subject,\n effectId,\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 type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { MessageResponse, SendMessageOptions } 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 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 await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n });\n return { guid: tempGuid, text: options.message, dateCreated: Date.now() } as MessageResponse;\n }\n });\n }\n\n async getMessage(guid: string, options?: { with?: string[] }): Promise<MessageResponse> {\n const response = await this.http.get(`/api/v1/message/${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/${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/${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/${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/${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 matchType?: \"contains\" | \"exact\";\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/search\", options);\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/${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/${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 } 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 // 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 private constructor(config: ClientConfig = {}) {\n super();\n\n this.config = {\n serverUrl: \"http://localhost:1234\",\n logLevel: \"info\",\n ...config,\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 });\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 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 \"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 };\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 }\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\", () => {\n this.logger.info(\"Disconnected from iMessage server\");\n this.readyEmitted = false;\n this.emit(\"disconnect\");\n });\n\n // Listen for authentication success\n this.socket.on(\"auth-ok\", () => {\n this.logger.info(\"Authentication successful\");\n if (!this.readyEmitted) {\n this.readyEmitted = true;\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 if (this.socket.connected) {\n this.logger.info(\"Already connected to iMessage server\");\n return;\n }\n\n this.socket.once(\"connect\", () => {\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 this.emit(\"ready\");\n }\n }\n });\n\n if (!this.socket.connected) {\n this.socket.connect();\n }\n }\n\n async close() {\n this.socket.disconnect();\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 === \"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 if (typeof obj === \"string\" && obj.startsWith(\"data:,\")) {\n return obj;\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"]}
|
|
1
|
+
{"version":3,"sources":["../lib/Logger.ts","../lib/Loggable.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../lib/auto-create-chat.ts","../modules/message.ts","../modules/poll.ts","../modules/scheduled.ts","../modules/server.ts","../client.ts","../events.ts","../lib/poll-utils.ts"],"names":["EventEmitter","path","readFile","FormData","randomUUID"],"mappings":"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","file":"index.js","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 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 }\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\";\n\nexport const setGlobalLogLevel = (level: LogLevel) => {\n globalLogLevel = level;\n Object.values(loggers).forEach((logger) => {\n logger.setLogLevel(level);\n });\n};\n\nexport const getLogger = (tag: string) => {\n let logger = loggers[tag];\n if (!logger) {\n logger = new Logger(tag, globalLogLevel);\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 { 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 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/${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/${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/${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/${guid}/blurhash`, {\n params,\n });\n return response.data.data.blurhash;\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\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\", randomUUID());\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\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return response.data.data;\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 form = new FormData();\n\n form.append(\"attachment\", await readFile(options.filePath), 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\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n\n return data.data;\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 { 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 effectId?: string;\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/${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/${guid}`, options);\n return response.data.data;\n }\n\n async deleteChat(guid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${guid}`);\n }\n\n async markChatRead(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${guid}/read`);\n }\n\n async markChatUnread(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${guid}/unread`);\n }\n\n async leaveChat(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${guid}/leave`);\n }\n\n async addParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${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.delete(`/api/v1/chat/${chatGuid}/participant`, {\n data: { 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/${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/${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/${chatGuid}/icon`);\n }\n\n async getGroupIcon(chatGuid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/chat/${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/${chatGuid}/typing`);\n }\n\n async stopTyping(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${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 const body = typeof options === \"string\" ? { imageUrl: options } : options;\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.join(\",\");\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/${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/${guid}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ICloudModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getFindMyFriends(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/icloud/findmy/friends\");\n return response.data.data;\n }\n\n async refreshFindMyFriends(): Promise<void> {\n await this.http.post(\"/api/v1/icloud/findmy/friends/refresh\");\n }\n}\n","import type { AxiosInstance } from \"axios\";\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 * 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 effectId?: string;\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId } = options;\n try {\n const response = await http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n message,\n tempGuid,\n subject,\n effectId,\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 type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { MessageResponse, SendMessageOptions } 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 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 await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n });\n return { guid: tempGuid, text: options.message, dateCreated: Date.now() } as MessageResponse;\n }\n });\n }\n\n async getMessage(guid: string, options?: { with?: string[] }): Promise<MessageResponse> {\n const response = await this.http.get(`/api/v1/message/${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/${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/${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/${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/${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 matchType?: \"contains\" | \"exact\";\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/search\", options);\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/${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/${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 } 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 // 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 private constructor(config: ClientConfig = {}) {\n super();\n\n this.config = {\n serverUrl: \"http://localhost:1234\",\n logLevel: \"info\",\n ...config,\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 });\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 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 \"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 };\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 }\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\", () => {\n this.logger.info(\"Disconnected from iMessage server\");\n this.readyEmitted = false;\n this.emit(\"disconnect\");\n });\n\n // Listen for authentication success\n this.socket.on(\"auth-ok\", () => {\n this.logger.info(\"Authentication successful\");\n if (!this.readyEmitted) {\n this.readyEmitted = true;\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 if (this.socket.connected) {\n this.logger.info(\"Already connected to iMessage server\");\n return;\n }\n\n this.socket.once(\"connect\", () => {\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 this.emit(\"ready\");\n }\n }\n });\n\n if (!this.socket.connected) {\n this.socket.connect();\n }\n }\n\n async close() {\n this.socket.disconnect();\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 === \"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 if (typeof obj === \"string\" && obj.startsWith(\"data:,\")) {\n return obj;\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@photon-ai/advanced-imessage-kit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Powerful TypeScript iMessage SDK with real-time message processing",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"imessage",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"format": "bunx @biomejs/biome check . --write",
|
|
61
61
|
"lint": "bunx @biomejs/biome check .",
|
|
62
62
|
"type-check": "bunx tsc --noEmit",
|
|
63
|
-
"build": "tsup",
|
|
63
|
+
"build": "bunx tsup",
|
|
64
64
|
"test": "echo \"No tests specified\" && exit 0",
|
|
65
65
|
"prepublishOnly": "bun run format && bun run lint && bun run type-check && bun run build",
|
|
66
66
|
"publish:npm": "npm publish --access public"
|