@photon-ai/advanced-imessage-kit 1.1.4 → 1.2.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.
Files changed (117) hide show
  1. package/README.md +8 -5
  2. package/dist/index.cjs +834 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +639 -0
  5. package/dist/index.d.ts +639 -6
  6. package/dist/index.js +770 -5
  7. package/dist/index.js.map +1 -1
  8. package/package.json +13 -6
  9. package/dist/events.d.ts +0 -32
  10. package/dist/events.d.ts.map +0 -1
  11. package/dist/events.js +0 -32
  12. package/dist/events.js.map +0 -1
  13. package/dist/index.d.ts.map +0 -1
  14. package/dist/lib/Loggable.d.ts +0 -16
  15. package/dist/lib/Loggable.d.ts.map +0 -1
  16. package/dist/lib/Loggable.js +0 -34
  17. package/dist/lib/Loggable.js.map +0 -1
  18. package/dist/lib/Logger.d.ts +0 -18
  19. package/dist/lib/Logger.d.ts.map +0 -1
  20. package/dist/lib/Logger.js +0 -77
  21. package/dist/lib/Logger.js.map +0 -1
  22. package/dist/mobai.d.ts +0 -44
  23. package/dist/mobai.d.ts.map +0 -1
  24. package/dist/mobai.js +0 -176
  25. package/dist/mobai.js.map +0 -1
  26. package/dist/modules/attachment.d.ts +0 -24
  27. package/dist/modules/attachment.d.ts.map +0 -1
  28. package/dist/modules/attachment.js +0 -88
  29. package/dist/modules/attachment.js.map +0 -1
  30. package/dist/modules/chat.d.ts +0 -55
  31. package/dist/modules/chat.d.ts.map +0 -1
  32. package/dist/modules/chat.js +0 -100
  33. package/dist/modules/chat.js.map +0 -1
  34. package/dist/modules/contact.d.ts +0 -10
  35. package/dist/modules/contact.d.ts.map +0 -1
  36. package/dist/modules/contact.js +0 -23
  37. package/dist/modules/contact.js.map +0 -1
  38. package/dist/modules/facetime.d.ts +0 -7
  39. package/dist/modules/facetime.d.ts.map +0 -1
  40. package/dist/modules/facetime.js +0 -10
  41. package/dist/modules/facetime.js.map +0 -1
  42. package/dist/modules/handle.d.ts +0 -24
  43. package/dist/modules/handle.d.ts.map +0 -1
  44. package/dist/modules/handle.js +0 -40
  45. package/dist/modules/handle.js.map +0 -1
  46. package/dist/modules/icloud.d.ts +0 -10
  47. package/dist/modules/icloud.d.ts.map +0 -1
  48. package/dist/modules/icloud.js +0 -20
  49. package/dist/modules/icloud.js.map +0 -1
  50. package/dist/modules/index.d.ts +0 -10
  51. package/dist/modules/index.d.ts.map +0 -1
  52. package/dist/modules/index.js +0 -10
  53. package/dist/modules/index.js.map +0 -1
  54. package/dist/modules/message.d.ts +0 -72
  55. package/dist/modules/message.d.ts.map +0 -1
  56. package/dist/modules/message.js +0 -108
  57. package/dist/modules/message.js.map +0 -1
  58. package/dist/modules/scheduled.d.ts +0 -10
  59. package/dist/modules/scheduled.d.ts.map +0 -1
  60. package/dist/modules/scheduled.js +0 -21
  61. package/dist/modules/scheduled.js.map +0 -1
  62. package/dist/modules/server.d.ts +0 -17
  63. package/dist/modules/server.d.ts.map +0 -1
  64. package/dist/modules/server.js +0 -46
  65. package/dist/modules/server.js.map +0 -1
  66. package/dist/types/attachment.d.ts +0 -37
  67. package/dist/types/attachment.d.ts.map +0 -1
  68. package/dist/types/attachment.js +0 -2
  69. package/dist/types/attachment.js.map +0 -1
  70. package/dist/types/chat.d.ts +0 -25
  71. package/dist/types/chat.d.ts.map +0 -1
  72. package/dist/types/chat.js +0 -2
  73. package/dist/types/chat.js.map +0 -1
  74. package/dist/types/client.d.ts +0 -5
  75. package/dist/types/client.d.ts.map +0 -1
  76. package/dist/types/client.js +0 -2
  77. package/dist/types/client.js.map +0 -1
  78. package/dist/types/events.d.ts +0 -71
  79. package/dist/types/events.d.ts.map +0 -1
  80. package/dist/types/events.js +0 -2
  81. package/dist/types/events.js.map +0 -1
  82. package/dist/types/facetime.d.ts +0 -16
  83. package/dist/types/facetime.d.ts.map +0 -1
  84. package/dist/types/facetime.js +0 -2
  85. package/dist/types/facetime.js.map +0 -1
  86. package/dist/types/findmy.d.ts +0 -12
  87. package/dist/types/findmy.d.ts.map +0 -1
  88. package/dist/types/findmy.js +0 -2
  89. package/dist/types/findmy.js.map +0 -1
  90. package/dist/types/handle.d.ts +0 -16
  91. package/dist/types/handle.d.ts.map +0 -1
  92. package/dist/types/handle.js +0 -2
  93. package/dist/types/handle.js.map +0 -1
  94. package/dist/types/index.d.ts +0 -13
  95. package/dist/types/index.d.ts.map +0 -1
  96. package/dist/types/index.js +0 -13
  97. package/dist/types/index.js.map +0 -1
  98. package/dist/types/message.d.ts +0 -101
  99. package/dist/types/message.d.ts.map +0 -1
  100. package/dist/types/message.js +0 -2
  101. package/dist/types/message.js.map +0 -1
  102. package/dist/types/scheduled.d.ts +0 -10
  103. package/dist/types/scheduled.d.ts.map +0 -1
  104. package/dist/types/scheduled.js +0 -2
  105. package/dist/types/scheduled.js.map +0 -1
  106. package/dist/types/server.d.ts +0 -24
  107. package/dist/types/server.d.ts.map +0 -1
  108. package/dist/types/server.js +0 -2
  109. package/dist/types/server.js.map +0 -1
  110. package/dist/types/sticker.d.ts +0 -7
  111. package/dist/types/sticker.d.ts.map +0 -1
  112. package/dist/types/sticker.js +0 -2
  113. package/dist/types/sticker.js.map +0 -1
  114. package/dist/types/tapback.d.ts +0 -3
  115. package/dist/types/tapback.d.ts.map +0 -1
  116. package/dist/types/tapback.js +0 -2
  117. package/dist/types/tapback.js.map +0 -1
package/dist/index.cjs ADDED
@@ -0,0 +1,834 @@
1
+ 'use strict';
2
+
3
+ require('reflect-metadata');
4
+ var EventEmitter = require('events');
5
+ var axios = require('axios');
6
+ var io = require('socket.io-client');
7
+ var fs = require('fs');
8
+ var os = require('os');
9
+ var path = require('path');
10
+ var crypto = require('crypto');
11
+ var promises = require('fs/promises');
12
+ var FormData = require('form-data');
13
+
14
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
+
16
+ function _interopNamespace(e) {
17
+ if (e && e.__esModule) return e;
18
+ var n = Object.create(null);
19
+ if (e) {
20
+ Object.keys(e).forEach(function (k) {
21
+ if (k !== 'default') {
22
+ var d = Object.getOwnPropertyDescriptor(e, k);
23
+ Object.defineProperty(n, k, d.get ? d : {
24
+ enumerable: true,
25
+ get: function () { return e[k]; }
26
+ });
27
+ }
28
+ });
29
+ }
30
+ n.default = e;
31
+ return Object.freeze(n);
32
+ }
33
+
34
+ var EventEmitter__default = /*#__PURE__*/_interopDefault(EventEmitter);
35
+ var axios__default = /*#__PURE__*/_interopDefault(axios);
36
+ var io__default = /*#__PURE__*/_interopDefault(io);
37
+ var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
38
+ var os__namespace = /*#__PURE__*/_interopNamespace(os);
39
+ var path__namespace = /*#__PURE__*/_interopNamespace(path);
40
+ var FormData__default = /*#__PURE__*/_interopDefault(FormData);
41
+
42
+ var __defProp = Object.defineProperty;
43
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
44
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
45
+ var Logger = class extends EventEmitter__default.default {
46
+ constructor(tag, level = "info", logToFile = true) {
47
+ super();
48
+ __publicField(this, "tag");
49
+ __publicField(this, "logLevel", "info");
50
+ __publicField(this, "logFile");
51
+ this.tag = tag;
52
+ this.logLevel = level;
53
+ if (logToFile) {
54
+ const logDir = path__namespace.join(os__namespace.homedir(), "Library", "Logs", "AdvancedIMessageKit");
55
+ if (!fs__namespace.existsSync(logDir)) {
56
+ fs__namespace.mkdirSync(logDir, { recursive: true });
57
+ }
58
+ this.logFile = path__namespace.join(logDir, "sdk.log");
59
+ }
60
+ }
61
+ setLogLevel(level) {
62
+ this.logLevel = level;
63
+ }
64
+ shouldLog(level) {
65
+ const levels = ["debug", "info", "warn", "error"];
66
+ const currentIndex = levels.indexOf(this.logLevel);
67
+ const messageIndex = levels.indexOf(level);
68
+ return messageIndex >= currentIndex;
69
+ }
70
+ formatMessage(level, message) {
71
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
72
+ return `[${timestamp}][${level.toUpperCase()}][${this.tag}] ${message}`;
73
+ }
74
+ writeLog(level, message) {
75
+ if (!this.shouldLog(level)) return;
76
+ const formatted = this.formatMessage(level, message);
77
+ switch (level) {
78
+ case "error":
79
+ console.error(formatted);
80
+ break;
81
+ case "warn":
82
+ console.warn(formatted);
83
+ break;
84
+ case "debug":
85
+ console.debug(formatted);
86
+ break;
87
+ default:
88
+ console.log(formatted);
89
+ }
90
+ if (this.logFile) {
91
+ try {
92
+ fs__namespace.appendFileSync(this.logFile, `${formatted}
93
+ `);
94
+ } catch {
95
+ }
96
+ }
97
+ this.emit("log", { level, message, tag: this.tag });
98
+ }
99
+ info(message) {
100
+ this.writeLog("info", message);
101
+ }
102
+ debug(message) {
103
+ this.writeLog("debug", message);
104
+ }
105
+ error(message) {
106
+ const msg = message instanceof Error ? message.message : message;
107
+ this.writeLog("error", msg);
108
+ if (message instanceof Error && message.stack) {
109
+ this.writeLog("error", message.stack);
110
+ }
111
+ }
112
+ warn(message) {
113
+ this.writeLog("warn", message);
114
+ }
115
+ log(message, level = "info") {
116
+ this.writeLog(level, message);
117
+ }
118
+ };
119
+
120
+ // lib/Loggable.ts
121
+ var loggers = {};
122
+ var globalLogLevel = "info";
123
+ var setGlobalLogLevel = (level) => {
124
+ globalLogLevel = level;
125
+ Object.values(loggers).forEach((logger) => {
126
+ logger.setLogLevel(level);
127
+ });
128
+ };
129
+ var getLogger = (tag) => {
130
+ let logger = loggers[tag];
131
+ if (!logger) {
132
+ logger = new Logger(tag, globalLogLevel);
133
+ loggers[tag] = logger;
134
+ }
135
+ return logger;
136
+ };
137
+ var AttachmentModule = class {
138
+ constructor(http, enqueueSend = (task) => task()) {
139
+ this.http = http;
140
+ this.enqueueSend = enqueueSend;
141
+ }
142
+ async getAttachmentCount() {
143
+ const response = await this.http.get("/api/v1/attachment/count");
144
+ return response.data.data.total;
145
+ }
146
+ async getAttachment(guid) {
147
+ const response = await this.http.get(`/api/v1/attachment/${guid}`);
148
+ return response.data.data;
149
+ }
150
+ async downloadAttachment(guid, options) {
151
+ const params = {};
152
+ if (options?.original !== void 0) params.original = options.original;
153
+ if (options?.force !== void 0) params.force = options.force;
154
+ if (options?.height !== void 0) params.height = options.height;
155
+ if (options?.width !== void 0) params.width = options.width;
156
+ if (options?.quality !== void 0) params.quality = options.quality;
157
+ const response = await this.http.get(`/api/v1/attachment/${guid}/download`, {
158
+ params,
159
+ responseType: "arraybuffer"
160
+ });
161
+ return Buffer.from(response.data);
162
+ }
163
+ async downloadAttachmentLive(guid) {
164
+ const response = await this.http.get(`/api/v1/attachment/${guid}/live`, {
165
+ responseType: "arraybuffer"
166
+ });
167
+ return Buffer.from(response.data);
168
+ }
169
+ async getAttachmentBlurhash(guid, options) {
170
+ const params = {};
171
+ if (options?.height !== void 0) params.height = options.height;
172
+ if (options?.width !== void 0) params.width = options.width;
173
+ if (options?.quality !== void 0) params.quality = options.quality;
174
+ const response = await this.http.get(`/api/v1/attachment/${guid}/blurhash`, {
175
+ params
176
+ });
177
+ return response.data.data.blurhash;
178
+ }
179
+ async sendAttachment(options) {
180
+ return this.enqueueSend(async () => {
181
+ const fileBuffer = await promises.readFile(options.filePath);
182
+ const fileName = options.fileName || path__namespace.default.basename(options.filePath);
183
+ const form = new FormData__default.default();
184
+ form.append("chatGuid", options.chatGuid);
185
+ form.append("attachment", fileBuffer, fileName);
186
+ form.append("name", fileName);
187
+ form.append("tempGuid", crypto.randomUUID());
188
+ if (options.isAudioMessage !== void 0) {
189
+ form.append("isAudioMessage", options.isAudioMessage.toString());
190
+ if (options.isAudioMessage) {
191
+ form.append("method", "private-api");
192
+ }
193
+ }
194
+ const response = await this.http.post("/api/v1/message/attachment", form, {
195
+ headers: form.getHeaders()
196
+ });
197
+ return response.data.data;
198
+ });
199
+ }
200
+ async sendSticker(options) {
201
+ return this.enqueueSend(async () => {
202
+ const fileName = options.fileName || path__namespace.default.basename(options.filePath);
203
+ const form = new FormData__default.default();
204
+ form.append("attachment", await promises.readFile(options.filePath), fileName);
205
+ const { data } = await this.http.post("/api/v1/attachment/upload", form, {
206
+ headers: form.getHeaders()
207
+ });
208
+ const response = await this.http.post("/api/v1/message/multipart", {
209
+ chatGuid: options.chatGuid,
210
+ selectedMessageGuid: options.selectedMessageGuid,
211
+ parts: [{ partIndex: 0, attachment: data.data.path, name: fileName }]
212
+ });
213
+ return response.data.data;
214
+ });
215
+ }
216
+ };
217
+ var ChatModule = class {
218
+ constructor(http) {
219
+ this.http = http;
220
+ }
221
+ async getChats(options) {
222
+ const response = await this.http.post("/api/v1/chat/query", options ?? {});
223
+ return response.data.data;
224
+ }
225
+ async createChat(options) {
226
+ const response = await this.http.post("/api/v1/chat/new", options);
227
+ return response.data.data;
228
+ }
229
+ async getChat(guid, options) {
230
+ const response = await this.http.get(`/api/v1/chat/${guid}`, {
231
+ params: options?.with ? { with: options.with.join(",") } : {}
232
+ });
233
+ return response.data.data;
234
+ }
235
+ async updateChat(guid, options) {
236
+ const response = await this.http.put(`/api/v1/chat/${guid}`, options);
237
+ return response.data.data;
238
+ }
239
+ async deleteChat(guid) {
240
+ await this.http.delete(`/api/v1/chat/${guid}`);
241
+ }
242
+ async markChatRead(guid) {
243
+ await this.http.post(`/api/v1/chat/${guid}/read`);
244
+ }
245
+ async markChatUnread(guid) {
246
+ await this.http.post(`/api/v1/chat/${guid}/unread`);
247
+ }
248
+ async leaveChat(guid) {
249
+ await this.http.post(`/api/v1/chat/${guid}/leave`);
250
+ }
251
+ async addParticipant(chatGuid, address) {
252
+ const response = await this.http.post(`/api/v1/chat/${chatGuid}/participant`, {
253
+ address
254
+ });
255
+ return response.data.data;
256
+ }
257
+ async removeParticipant(chatGuid, address) {
258
+ const response = await this.http.delete(`/api/v1/chat/${chatGuid}/participant`, {
259
+ data: { address }
260
+ });
261
+ return response.data.data;
262
+ }
263
+ async getChatMessages(chatGuid, options) {
264
+ const params = {};
265
+ if (options?.offset !== void 0) params.offset = options.offset;
266
+ if (options?.limit !== void 0) params.limit = options.limit;
267
+ if (options?.sort) params.sort = options.sort;
268
+ if (options?.before !== void 0) params.before = options.before;
269
+ if (options?.after !== void 0) params.after = options.after;
270
+ if (options?.with) params.with = options.with.join(",");
271
+ const response = await this.http.get(`/api/v1/chat/${chatGuid}/message`, {
272
+ params
273
+ });
274
+ return response.data.data;
275
+ }
276
+ async setGroupIcon(chatGuid, filePath) {
277
+ const fileBuffer = await promises.readFile(filePath);
278
+ const fileName = path__namespace.default.basename(filePath);
279
+ const form = new FormData__default.default();
280
+ form.append("icon", fileBuffer, fileName);
281
+ await this.http.post(`/api/v1/chat/${chatGuid}/icon`, form, {
282
+ headers: form.getHeaders()
283
+ });
284
+ }
285
+ async removeGroupIcon(chatGuid) {
286
+ await this.http.delete(`/api/v1/chat/${chatGuid}/icon`);
287
+ }
288
+ async getGroupIcon(chatGuid) {
289
+ const response = await this.http.get(`/api/v1/chat/${chatGuid}/icon`, {
290
+ responseType: "arraybuffer"
291
+ });
292
+ return Buffer.from(response.data);
293
+ }
294
+ async getChatCount(options) {
295
+ const response = await this.http.get("/api/v1/chat/count", {
296
+ params: options?.includeArchived !== void 0 ? { includeArchived: options.includeArchived } : {}
297
+ });
298
+ return response.data.data;
299
+ }
300
+ async startTyping(chatGuid) {
301
+ await this.http.post(`/api/v1/chat/${chatGuid}/typing`);
302
+ }
303
+ async stopTyping(chatGuid) {
304
+ await this.http.delete(`/api/v1/chat/${chatGuid}/typing`);
305
+ }
306
+ };
307
+
308
+ // modules/contact.ts
309
+ var ContactModule = class {
310
+ constructor(http) {
311
+ this.http = http;
312
+ }
313
+ async getContacts() {
314
+ const response = await this.http.get("/api/v1/contact");
315
+ return response.data.data;
316
+ }
317
+ async getContactCard(address) {
318
+ const response = await this.http.get("/api/v1/icloud/contact", {
319
+ params: { address }
320
+ });
321
+ return response.data.data;
322
+ }
323
+ async shareContactCard(chatGuid) {
324
+ await this.http.post(`/api/v1/chat/${chatGuid}/share/contact`);
325
+ }
326
+ async shouldShareContact(chatGuid) {
327
+ const response = await this.http.get(`/api/v1/chat/${chatGuid}/share/contact/status`);
328
+ return response.data.data;
329
+ }
330
+ };
331
+
332
+ // modules/facetime.ts
333
+ var FaceTimeModule = class {
334
+ constructor(http) {
335
+ this.http = http;
336
+ }
337
+ async createFaceTimeLink() {
338
+ const response = await this.http.post("/api/v1/facetime/session");
339
+ return response.data.data;
340
+ }
341
+ };
342
+
343
+ // modules/handle.ts
344
+ var HandleModule = class {
345
+ constructor(http) {
346
+ this.http = http;
347
+ }
348
+ async getHandleCount() {
349
+ const response = await this.http.get("/api/v1/handle/count");
350
+ return response.data.data.total;
351
+ }
352
+ async queryHandles(options) {
353
+ const body = {};
354
+ if (options?.address) body.address = options.address;
355
+ if (options?.with) body.with = options.with.join(",");
356
+ if (options?.offset !== void 0) body.offset = options.offset;
357
+ if (options?.limit !== void 0) body.limit = options.limit;
358
+ const response = await this.http.post("/api/v1/handle/query", body);
359
+ return {
360
+ data: response.data.data,
361
+ metadata: response.data.metadata
362
+ };
363
+ }
364
+ async getHandle(guid) {
365
+ const response = await this.http.get(`/api/v1/handle/${guid}`);
366
+ return response.data.data;
367
+ }
368
+ async getHandleAvailability(address, type) {
369
+ const response = await this.http.get(`/api/v1/handle/availability/${type}`, {
370
+ params: { address }
371
+ });
372
+ return response.data.data.available;
373
+ }
374
+ async getHandleFocusStatus(guid) {
375
+ const response = await this.http.get(`/api/v1/handle/${guid}/focus`);
376
+ return response.data.data.status;
377
+ }
378
+ };
379
+
380
+ // modules/icloud.ts
381
+ var ICloudModule = class {
382
+ constructor(http) {
383
+ this.http = http;
384
+ }
385
+ async getFindMyFriends() {
386
+ const response = await this.http.get("/api/v1/icloud/findmy/friends");
387
+ return response.data.data;
388
+ }
389
+ async refreshFindMyFriends() {
390
+ await this.http.post("/api/v1/icloud/findmy/friends/refresh");
391
+ }
392
+ };
393
+ var MessageModule = class {
394
+ constructor(http, enqueueSend = (task) => task()) {
395
+ this.http = http;
396
+ this.enqueueSend = enqueueSend;
397
+ }
398
+ async sendMessage(options) {
399
+ return this.enqueueSend(async () => {
400
+ const payload = {
401
+ ...options,
402
+ tempGuid: options.tempGuid || crypto.randomUUID()
403
+ };
404
+ const response = await this.http.post("/api/v1/message/text", payload);
405
+ return response.data.data;
406
+ });
407
+ }
408
+ async getMessage(guid, options) {
409
+ const response = await this.http.get(`/api/v1/message/${guid}`, {
410
+ params: options?.with ? { with: options.with.join(",") } : {}
411
+ });
412
+ return response.data.data;
413
+ }
414
+ async getMessages(options) {
415
+ const response = await this.http.post("/api/v1/message/query", options ?? {});
416
+ return response.data.data;
417
+ }
418
+ async getMessageCount(options) {
419
+ const params = {};
420
+ if (options?.after !== void 0) params.after = options.after;
421
+ if (options?.before !== void 0) params.before = options.before;
422
+ if (options?.chatGuid) params.chatGuid = options.chatGuid;
423
+ if (options?.minRowId !== void 0) params.minRowId = options.minRowId;
424
+ if (options?.maxRowId !== void 0) params.maxRowId = options.maxRowId;
425
+ const response = await this.http.get("/api/v1/message/count", { params });
426
+ return response.data.data.total;
427
+ }
428
+ async getUpdatedMessageCount(options) {
429
+ const params = {};
430
+ if (options?.after !== void 0) params.after = options.after;
431
+ if (options?.before !== void 0) params.before = options.before;
432
+ if (options?.chatGuid) params.chatGuid = options.chatGuid;
433
+ if (options?.minRowId !== void 0) params.minRowId = options.minRowId;
434
+ if (options?.maxRowId !== void 0) params.maxRowId = options.maxRowId;
435
+ const response = await this.http.get("/api/v1/message/count/updated", {
436
+ params
437
+ });
438
+ return response.data.data.total;
439
+ }
440
+ async getSentMessageCount(options) {
441
+ const params = {};
442
+ if (options?.after !== void 0) params.after = options.after;
443
+ if (options?.before !== void 0) params.before = options.before;
444
+ if (options?.chatGuid) params.chatGuid = options.chatGuid;
445
+ if (options?.minRowId !== void 0) params.minRowId = options.minRowId;
446
+ if (options?.maxRowId !== void 0) params.maxRowId = options.maxRowId;
447
+ const response = await this.http.get("/api/v1/message/count/me", {
448
+ params
449
+ });
450
+ return response.data.data.total;
451
+ }
452
+ async editMessage(options) {
453
+ return this.enqueueSend(async () => {
454
+ const response = await this.http.post(`/api/v1/message/${options.messageGuid}/edit`, {
455
+ editedMessage: options.editedMessage,
456
+ backwardsCompatibilityMessage: options.backwardsCompatibilityMessage || options.editedMessage,
457
+ partIndex: options.partIndex ?? 0
458
+ });
459
+ return response.data.data;
460
+ });
461
+ }
462
+ async sendReaction(options) {
463
+ return this.enqueueSend(async () => {
464
+ const response = await this.http.post("/api/v1/message/react", {
465
+ chatGuid: options.chatGuid,
466
+ selectedMessageGuid: options.messageGuid,
467
+ reaction: options.reaction,
468
+ partIndex: options.partIndex ?? 0
469
+ });
470
+ return response.data.data;
471
+ });
472
+ }
473
+ async unsendMessage(options) {
474
+ return this.enqueueSend(async () => {
475
+ const response = await this.http.post(`/api/v1/message/${options.messageGuid}/unsend`, {
476
+ partIndex: options.partIndex ?? 0
477
+ });
478
+ return response.data.data;
479
+ });
480
+ }
481
+ async notifyMessage(guid) {
482
+ await this.http.post(`/api/v1/message/${guid}/notify`);
483
+ }
484
+ async getEmbeddedMedia(guid) {
485
+ const response = await this.http.get(`/api/v1/message/${guid}/embedded-media`);
486
+ return response.data.data;
487
+ }
488
+ async searchMessages(options) {
489
+ const response = await this.http.post("/api/v1/message/search", options);
490
+ return response.data.data;
491
+ }
492
+ };
493
+
494
+ // modules/scheduled.ts
495
+ var ScheduledMessageModule = class {
496
+ constructor(http) {
497
+ this.http = http;
498
+ }
499
+ async createScheduledMessage(options) {
500
+ const response = await this.http.post("/api/v1/message/schedule", options);
501
+ return response.data.data;
502
+ }
503
+ async getScheduledMessages() {
504
+ const response = await this.http.get("/api/v1/message/schedule");
505
+ return response.data.data;
506
+ }
507
+ async updateScheduledMessage(id, options) {
508
+ const response = await this.http.put(`/api/v1/message/schedule/${id}`, options);
509
+ return response.data.data;
510
+ }
511
+ async deleteScheduledMessage(id) {
512
+ await this.http.delete(`/api/v1/message/schedule/${id}`);
513
+ }
514
+ };
515
+
516
+ // modules/server.ts
517
+ var ServerModule = class {
518
+ constructor(http) {
519
+ this.http = http;
520
+ }
521
+ async getServerInfo() {
522
+ const response = await this.http.get("/api/v1/server/info");
523
+ return response.data.data;
524
+ }
525
+ async getMessageStats() {
526
+ const response = await this.http.get("/api/v1/server/statistics/totals");
527
+ return response.data.data;
528
+ }
529
+ async getServerLogs(count) {
530
+ const response = await this.http.get("/api/v1/server/logs", {
531
+ params: count !== void 0 ? { count } : {}
532
+ });
533
+ return response.data.data;
534
+ }
535
+ async getAlerts() {
536
+ const response = await this.http.get("/api/v1/server/alert");
537
+ return response.data.data;
538
+ }
539
+ async markAlertAsRead(ids) {
540
+ const response = await this.http.post("/api/v1/server/alert/read", { ids });
541
+ return response.data.data;
542
+ }
543
+ async getMediaStatistics(options) {
544
+ const params = {};
545
+ if (options?.only) params.only = options.only.join(",");
546
+ const response = await this.http.get("/api/v1/server/statistics/media", {
547
+ params
548
+ });
549
+ return response.data.data;
550
+ }
551
+ async getMediaStatisticsByChat(options) {
552
+ const params = {};
553
+ if (options?.only) params.only = options.only.join(",");
554
+ const response = await this.http.get("/api/v1/server/statistics/media/chat", {
555
+ params
556
+ });
557
+ return response.data.data;
558
+ }
559
+ };
560
+
561
+ // client.ts
562
+ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter.EventEmitter {
563
+ constructor(config = {}) {
564
+ super();
565
+ // Core
566
+ __publicField(this, "config");
567
+ __publicField(this, "logger", getLogger("AdvancedIMessageKit"));
568
+ __publicField(this, "http");
569
+ __publicField(this, "socket");
570
+ __publicField(this, "attachments");
571
+ __publicField(this, "messages");
572
+ __publicField(this, "chats");
573
+ __publicField(this, "contacts");
574
+ __publicField(this, "handles");
575
+ __publicField(this, "facetime");
576
+ __publicField(this, "icloud");
577
+ __publicField(this, "scheduledMessages");
578
+ __publicField(this, "server");
579
+ // Message deduplication feature
580
+ //
581
+ // Purpose: Prevent message reply loops caused by server repeatedly pushing
582
+ // the same message content with different GUIDs due to unstable Socket.IO connections.
583
+ // This is especially problematic when the polling transport causes connection issues.
584
+ __publicField(this, "processedMessages", /* @__PURE__ */ new Set());
585
+ // Send queue for sequential message delivery
586
+ //
587
+ // Purpose: Ensure all outgoing messages (text, attachments, stickers, etc.) from
588
+ // a single user/SDK instance are sent in strict order, preventing race conditions.
589
+ __publicField(this, "sendQueue", Promise.resolve());
590
+ this.config = {
591
+ serverUrl: "http://localhost:1234",
592
+ logLevel: "info",
593
+ ...config
594
+ };
595
+ if (this.config.logLevel) {
596
+ setGlobalLogLevel(this.config.logLevel);
597
+ }
598
+ this.http = axios__default.default.create({
599
+ baseURL: this.config.serverUrl,
600
+ headers: this.config.apiKey ? { "X-API-Key": this.config.apiKey } : void 0
601
+ });
602
+ this.socket = io__default.default(this.config.serverUrl, {
603
+ auth: this.config.apiKey ? { apiKey: this.config.apiKey } : void 0,
604
+ // 🚨 IMPORTANT: Polling transport configuration notes
605
+ //
606
+ // Root cause analysis:
607
+ // 1. Socket.IO 'polling' transport can cause unstable connections in certain network environments
608
+ // 2. When "xhr poll error" occurs, Socket.IO attempts to reconnect
609
+ // 3. During reconnection, the server may repeatedly push the same message with different GUIDs
610
+ // 4. This is not simple client-side duplicate processing, but server-side message duplication
611
+ //
612
+ // Solutions:
613
+ // - Prioritize WebSocket transport, fallback to polling as backup
614
+ // - Set reasonable timeout to avoid frequent reconnections
615
+ // - Use forceNew to ensure fresh connections and avoid state pollution
616
+ // - Implement client-side message deduplication as the last line of defense
617
+ transports: ["websocket"],
618
+ // Only WebSocket - polling disabled to prevent message duplication
619
+ timeout: 1e4,
620
+ // 10 second timeout to avoid overly frequent reconnections
621
+ forceNew: true
622
+ // Force new connection to avoid connection state pollution
623
+ });
624
+ const enqueueSend = this.enqueueSend.bind(this);
625
+ this.attachments = new AttachmentModule(this.http, enqueueSend);
626
+ this.messages = new MessageModule(this.http, enqueueSend);
627
+ this.chats = new ChatModule(this.http);
628
+ this.contacts = new ContactModule(this.http);
629
+ this.handles = new HandleModule(this.http);
630
+ this.facetime = new FaceTimeModule(this.http);
631
+ this.icloud = new ICloudModule(this.http);
632
+ this.scheduledMessages = new ScheduledMessageModule(this.http);
633
+ this.server = new ServerModule(this.http);
634
+ }
635
+ static getInstance(config) {
636
+ const existing = _AdvancedIMessageKit.getGlobalSdk();
637
+ if (existing) return existing;
638
+ const instance = new _AdvancedIMessageKit(config);
639
+ _AdvancedIMessageKit.setGlobalSdk(instance);
640
+ return instance;
641
+ }
642
+ emit(event, ...args) {
643
+ return super.emit(event, ...args);
644
+ }
645
+ on(event, listener) {
646
+ return super.on(event, listener);
647
+ }
648
+ once(event, listener) {
649
+ return super.once(event, listener);
650
+ }
651
+ off(event, listener) {
652
+ return super.off(event, listener);
653
+ }
654
+ addListener(event, listener) {
655
+ return super.addListener(event, listener);
656
+ }
657
+ removeListener(event, listener) {
658
+ return super.removeListener(event, listener);
659
+ }
660
+ async connect() {
661
+ const serverEvents = [
662
+ "new-message",
663
+ "message-updated",
664
+ "updated-message",
665
+ "chat-read-status-changed",
666
+ "group-name-change",
667
+ "participant-added",
668
+ "participant-removed",
669
+ "participant-left",
670
+ "group-icon-changed",
671
+ "group-icon-removed",
672
+ "message-send-error",
673
+ "typing-indicator",
674
+ "new-server",
675
+ "incoming-facetime",
676
+ "ft-call-status-changed",
677
+ "hello-world"
678
+ ];
679
+ for (const eventName of serverEvents) {
680
+ this.socket.on(eventName, (...args) => {
681
+ if (eventName === "new-message" && args.length > 0) {
682
+ const message = args[0];
683
+ if (message?.guid) {
684
+ if (this.processedMessages.has(message.guid)) {
685
+ this.logger.debug(`Message already processed, skipping duplicate: ${message.guid}`);
686
+ return;
687
+ }
688
+ this.processedMessages.add(message.guid);
689
+ }
690
+ }
691
+ if (args.length > 0) {
692
+ super.emit(eventName, args[0]);
693
+ } else {
694
+ super.emit(eventName);
695
+ }
696
+ });
697
+ }
698
+ this.socket.on("disconnect", () => {
699
+ this.logger.info("Disconnected from iMessage server");
700
+ this.emit("disconnect");
701
+ });
702
+ this.socket.on("auth-ok", () => {
703
+ this.logger.info("Authentication successful");
704
+ this.emit("ready");
705
+ });
706
+ this.socket.on("auth-error", (error) => {
707
+ this.logger.error(`Authentication failed: ${error.message} ${error.reason ? `(${error.reason})` : ""}`);
708
+ this.emit("error", new Error(`Authentication failed: ${error.message}`));
709
+ });
710
+ if (this.socket.connected) {
711
+ this.logger.info("Already connected to iMessage server");
712
+ return;
713
+ }
714
+ this.socket.once("connect", () => {
715
+ this.logger.info("Connected to iMessage server, waiting for authentication...");
716
+ });
717
+ if (!this.socket.connected) {
718
+ this.socket.connect();
719
+ }
720
+ }
721
+ async close() {
722
+ this.socket.disconnect();
723
+ }
724
+ /**
725
+ * Clear processed message records (prevent memory leaks)
726
+ * @param maxSize Maximum number of messages to retain, default 1000
727
+ */
728
+ clearProcessedMessages(maxSize = 1e3) {
729
+ if (this.processedMessages.size > maxSize) {
730
+ const messages = Array.from(this.processedMessages);
731
+ this.processedMessages.clear();
732
+ messages.slice(-Math.floor(maxSize / 2)).forEach((guid) => {
733
+ this.processedMessages.add(guid);
734
+ });
735
+ this.logger.debug(`Cleared processed message records, retained ${this.processedMessages.size} messages`);
736
+ }
737
+ }
738
+ /**
739
+ * Get the count of processed messages
740
+ */
741
+ getProcessedMessageCount() {
742
+ return this.processedMessages.size;
743
+ }
744
+ /**
745
+ * Enqueue a send operation to ensure sequential delivery.
746
+ * All send operations (messages, attachments, stickers) should use this method
747
+ * to guarantee order for a single user.
748
+ * @param task The async send operation to enqueue
749
+ * @returns Promise that resolves with the task result
750
+ */
751
+ enqueueSend(task) {
752
+ const result = this.sendQueue.then(() => task());
753
+ this.sendQueue = result.catch(() => {
754
+ });
755
+ return result;
756
+ }
757
+ };
758
+ __publicField(_AdvancedIMessageKit, "getGlobalSdk", () => globalThis.__AdvancedIMessageKit__ ?? null);
759
+ __publicField(_AdvancedIMessageKit, "setGlobalSdk", (sdk) => {
760
+ globalThis.__AdvancedIMessageKit__ = sdk;
761
+ });
762
+ var AdvancedIMessageKit = _AdvancedIMessageKit;
763
+ var SDK = AdvancedIMessageKit.getInstance;
764
+
765
+ // events.ts
766
+ var SCHEDULED_MESSAGE_ERROR = "scheduled-message-error";
767
+ var SCHEDULED_MESSAGE_SENT = "scheduled-message-sent";
768
+ var SCHEDULED_MESSAGE_DELETED = "scheduled-message-deleted";
769
+ var SCHEDULED_MESSAGE_UPDATED = "scheduled-message-updated";
770
+ var SCHEDULED_MESSAGE_CREATED = "scheduled-message-created";
771
+ var NEW_MESSAGE = "new-message";
772
+ var MESSAGE_SEND_ERROR = "message-send-error";
773
+ var MESSAGE_UPDATED = "updated-message";
774
+ var NEW_SERVER = "new-server";
775
+ var PARTICIPANT_REMOVED = "participant-removed";
776
+ var PARTICIPANT_ADDED = "participant-added";
777
+ var PARTICIPANT_LEFT = "participant-left";
778
+ var GROUP_ICON_CHANGED = "group-icon-changed";
779
+ var GROUP_ICON_REMOVED = "group-icon-removed";
780
+ var CHAT_READ_STATUS_CHANGED = "chat-read-status-changed";
781
+ var HELLO_WORLD = "hello-world";
782
+ var TYPING_INDICATOR = "typing-indicator";
783
+ var SERVER_UPDATE = "server-update";
784
+ var SERVER_UPDATE_DOWNLOADING = "server-update-downloading";
785
+ var SERVER_UPDATE_INSTALLING = "server-update-installing";
786
+ var GROUP_NAME_CHANGE = "group-name-change";
787
+ var INCOMING_FACETIME = "incoming-facetime";
788
+ var SETTINGS_BACKUP_CREATED = "settings-backup-created";
789
+ var SETTINGS_BACKUP_DELETED = "settings-backup-deleted";
790
+ var SETTINGS_BACKUP_UPDATED = "settings-backup-updated";
791
+ var THEME_BACKUP_CREATED = "theme-backup-created";
792
+ var THEME_BACKUP_DELETED = "theme-backup-deleted";
793
+ var THEME_BACKUP_UPDATED = "theme-backup-updated";
794
+ var IMESSAGE_ALIASES_REMOVED = "imessage-aliases-removed";
795
+ var FT_CALL_STATUS_CHANGED = "ft-call-status-changed";
796
+ var NEW_FINDMY_LOCATION = "new-findmy-location";
797
+
798
+ exports.AdvancedIMessageKit = AdvancedIMessageKit;
799
+ exports.CHAT_READ_STATUS_CHANGED = CHAT_READ_STATUS_CHANGED;
800
+ exports.FT_CALL_STATUS_CHANGED = FT_CALL_STATUS_CHANGED;
801
+ exports.GROUP_ICON_CHANGED = GROUP_ICON_CHANGED;
802
+ exports.GROUP_ICON_REMOVED = GROUP_ICON_REMOVED;
803
+ exports.GROUP_NAME_CHANGE = GROUP_NAME_CHANGE;
804
+ exports.HELLO_WORLD = HELLO_WORLD;
805
+ exports.IMESSAGE_ALIASES_REMOVED = IMESSAGE_ALIASES_REMOVED;
806
+ exports.INCOMING_FACETIME = INCOMING_FACETIME;
807
+ exports.MESSAGE_SEND_ERROR = MESSAGE_SEND_ERROR;
808
+ exports.MESSAGE_UPDATED = MESSAGE_UPDATED;
809
+ exports.NEW_FINDMY_LOCATION = NEW_FINDMY_LOCATION;
810
+ exports.NEW_MESSAGE = NEW_MESSAGE;
811
+ exports.NEW_SERVER = NEW_SERVER;
812
+ exports.PARTICIPANT_ADDED = PARTICIPANT_ADDED;
813
+ exports.PARTICIPANT_LEFT = PARTICIPANT_LEFT;
814
+ exports.PARTICIPANT_REMOVED = PARTICIPANT_REMOVED;
815
+ exports.SCHEDULED_MESSAGE_CREATED = SCHEDULED_MESSAGE_CREATED;
816
+ exports.SCHEDULED_MESSAGE_DELETED = SCHEDULED_MESSAGE_DELETED;
817
+ exports.SCHEDULED_MESSAGE_ERROR = SCHEDULED_MESSAGE_ERROR;
818
+ exports.SCHEDULED_MESSAGE_SENT = SCHEDULED_MESSAGE_SENT;
819
+ exports.SCHEDULED_MESSAGE_UPDATED = SCHEDULED_MESSAGE_UPDATED;
820
+ exports.SDK = SDK;
821
+ exports.SERVER_UPDATE = SERVER_UPDATE;
822
+ exports.SERVER_UPDATE_DOWNLOADING = SERVER_UPDATE_DOWNLOADING;
823
+ exports.SERVER_UPDATE_INSTALLING = SERVER_UPDATE_INSTALLING;
824
+ exports.SETTINGS_BACKUP_CREATED = SETTINGS_BACKUP_CREATED;
825
+ exports.SETTINGS_BACKUP_DELETED = SETTINGS_BACKUP_DELETED;
826
+ exports.SETTINGS_BACKUP_UPDATED = SETTINGS_BACKUP_UPDATED;
827
+ exports.THEME_BACKUP_CREATED = THEME_BACKUP_CREATED;
828
+ exports.THEME_BACKUP_DELETED = THEME_BACKUP_DELETED;
829
+ exports.THEME_BACKUP_UPDATED = THEME_BACKUP_UPDATED;
830
+ exports.TYPING_INDICATOR = TYPING_INDICATOR;
831
+ exports.getLogger = getLogger;
832
+ exports.setGlobalLogLevel = setGlobalLogLevel;
833
+ //# sourceMappingURL=index.cjs.map
834
+ //# sourceMappingURL=index.cjs.map