@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 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/${encodeURIComponent(guid)}`, {
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/${encodeURIComponent(guid)}`, options);
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/${encodeURIComponent(guid)}`);
251
+ await this.http.delete(`/api/v1/chat/${guid}`);
249
252
  }
250
253
  async markChatRead(guid) {
251
- await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/read`);
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/${encodeURIComponent(guid)}/leave`);
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/${encodeURIComponent(chatGuid)}/participant`, {
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/${encodeURIComponent(chatGuid)}/participant`, {
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/${encodeURIComponent(chatGuid)}/message`, {
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/${encodeURIComponent(chatGuid)}/icon`, form, {
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/${encodeURIComponent(chatGuid)}/icon`);
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/${encodeURIComponent(chatGuid)}/icon`, {
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/${encodeURIComponent(chatGuid)}/typing`);
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/${encodeURIComponent(chatGuid)}/typing`);
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
 
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,IAAM,MAAA,GAAN,cAAqBA,6BAAA,CAAa;AAAA,EAKrC,WAAA,CAAY,GAAA,EAAa,KAAA,GAAkB,MAAA,EAAQ,YAAY,IAAA,EAAM;AACjE,IAAA,KAAA,EAAM;AALV,IAAA,aAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAA,EAAqB,MAAA,CAAA;AAC7B,IAAA,aAAA,CAAA,IAAA,EAAQ,SAAA,CAAA;AAIJ,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAEhB,IAAA,IAAI,SAAA,EAAW;AACX,MAAA,MAAM,SAAcC,eAAA,CAAA,IAAA,CAAQC,aAAA,CAAA,OAAA,EAAQ,EAAG,SAAA,EAAW,QAAQ,qBAAqB,CAAA;AAC/E,MAAA,IAAI,CAAIC,aAAA,CAAA,UAAA,CAAW,MAAM,CAAA,EAAG;AACxB,QAAGA,aAAA,CAAA,SAAA,CAAU,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MAC5C;AACA,MAAA,IAAA,CAAK,OAAA,GAAeF,eAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA;AAAA,IAC9C;AAAA,EACJ;AAAA,EAEA,YAAY,KAAA,EAAiB;AACzB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEQ,UAAU,KAAA,EAA0B;AACxC,IAAA,MAAM,MAAA,GAAqB,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAC5D,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACzC,IAAA,OAAO,YAAA,IAAgB,YAAA;AAAA,EAC3B;AAAA,EAEQ,aAAA,CAAc,OAAe,OAAA,EAAyB;AAC1D,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,IAAA,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAK,KAAA,CAAM,WAAA,EAAa,CAAA,EAAA,EAAK,IAAA,CAAK,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAAA,EACzE;AAAA,EAEQ,QAAA,CAAS,OAAiB,OAAA,EAAiB;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,OAAO,CAAA;AAEnD,IAAA,QAAQ,KAAA;AAAO,MACX,KAAK,OAAA;AACD,QAAA,OAAA,CAAQ,MAAM,SAAS,CAAA;AACvB,QAAA;AAAA,MACJ,KAAK,MAAA;AACD,QAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AACtB,QAAA;AAAA,MACJ,KAAK,OAAA;AACD,QAAA,OAAA,CAAQ,MAAM,SAAS,CAAA;AACvB,QAAA;AAAA,MACJ;AACI,QAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AAAA;AAG7B,IAAA,IAAI,KAAK,OAAA,EAAS;AACd,MAAA,IAAI;AACA,QAAGE,aAAA,CAAA,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,SAAS;AAAA,CAAI,CAAA;AAAA,MACpD,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACb;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,EAAE,KAAA,EAAO,SAAS,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EACtD;AAAA,EAEA,KAAK,OAAA,EAAiB;AAClB,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,OAAO,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,OAAA,EAAiB;AACnB,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,OAAA,EAAyB;AAC3B,IAAA,MAAM,GAAA,GAAM,OAAA,YAAmB,KAAA,GAAQ,OAAA,CAAQ,OAAA,GAAU,OAAA;AACzD,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,GAAG,CAAA;AAC1B,IAAA,IAAI,OAAA,YAAmB,KAAA,IAAS,OAAA,CAAQ,KAAA,EAAO;AAC3C,MAAA,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,KAAK,OAAA,EAAiB;AAClB,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,OAAO,CAAA;AAAA,EACjC;AAAA,EAEA,GAAA,CAAI,OAAA,EAAiB,KAAA,GAAkB,MAAA,EAAQ;AAC3C,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,EAChC;AACJ,CAAA;;;ACzFA,IAAM,UAAkC,EAAC;AACzC,IAAI,cAAA,GAA2B,MAAA;AAExB,IAAM,iBAAA,GAAoB,CAAC,KAAA,KAAoB;AAClD,EAAA,cAAA,GAAiB,KAAA;AACjB,EAAA,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,MAAA,KAAW;AACvC,IAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,EAC5B,CAAC,CAAA;AACL;AAEO,IAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AACtC,EAAA,IAAI,MAAA,GAAS,QAAQ,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACT,IAAA,MAAA,GAAS,IAAI,MAAA,CAAO,GAAA,EAAK,cAAc,CAAA;AACvC,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAA;AACX;ACfO,IAAM,mBAAN,MAAuB;AAAA,EAC1B,YACqB,IAAA,EACA,WAAA,GAAyD,CAAC,IAAA,KAAS,MAAK,EAC3F;AAFmB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAClB;AAAA,EAEH,MAAM,kBAAA,GAAsC;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,0BAA0B,CAAA;AAC/D,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,cAAc,IAAA,EAA2C;AAC3D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,CAAA;AACjE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,kBAAA,CACF,IAAA,EACA,OAAA,EAOe;AACf,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC/D,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,OAAA,KAAY,MAAA,EAAW,MAAA,CAAO,UAAU,OAAA,CAAQ,OAAA;AAE7D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,mBAAA,EAAsB,IAAI,CAAA,SAAA,CAAA,EAAa;AAAA,MACxE,MAAA;AAAA,MACA,YAAA,EAAc;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,uBAAuB,IAAA,EAA+B;AACxD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,mBAAA,EAAsB,IAAI,CAAA,KAAA,CAAA,EAAS;AAAA,MACpE,YAAA,EAAc;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,qBAAA,CACF,IAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,OAAA,KAAY,MAAA,EAAW,MAAA,CAAO,UAAU,OAAA,CAAQ,OAAA;AAE7D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,mBAAA,EAAsB,IAAI,CAAA,SAAA,CAAA,EAAa;AAAA,MACxE;AAAA,KACH,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,QAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,eAAe,OAAA,EAA0D;AAC3E,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,UAAA,GAAa,MAAMC,iBAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAClD,MAAA,MAAM,WAAW,OAAA,CAAQ,QAAA,IAAYH,uBAAAA,CAAK,QAAA,CAAS,QAAQ,QAAQ,CAAA;AAEnE,MAAA,MAAM,IAAA,GAAO,IAAII,yBAAA,EAAS;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AACxC,MAAA,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,UAAA,EAAY,QAAQ,CAAA;AAC9C,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAYC,iBAAA,EAAY,CAAA;AACpC,MAAA,IAAI,OAAA,CAAQ,mBAAmB,MAAA,EAAW;AACtC,QAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,OAAA,CAAQ,cAAA,CAAe,UAAU,CAAA;AAC/D,QAAA,IAAI,QAAQ,cAAA,EAAgB;AACxB,UAAA,IAAA,CAAK,MAAA,CAAO,UAAU,aAAa,CAAA;AAAA,QACvC;AAAA,MACJ;AAEA,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,8BAA8B,IAAA,EAAM;AAAA,QACtE,OAAA,EAAS,KAAK,UAAA;AAAW,OAC5B,CAAA;AAED,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,YAAY,OAAA,EAAuD;AACrE,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,WAAW,OAAA,CAAQ,QAAA,IAAYL,uBAAAA,CAAK,QAAA,CAAS,QAAQ,QAAQ,CAAA;AACnE,MAAA,MAAM,IAAA,GAAO,IAAII,yBAAA,EAAS;AAE1B,MAAA,IAAA,CAAK,OAAO,YAAA,EAAc,MAAMD,kBAAS,OAAA,CAAQ,QAAQ,GAAG,QAAQ,CAAA;AACpE,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AACxC,MAAA,IAAA,CAAK,MAAA,CAAO,aAAa,MAAM,CAAA;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,UAAU,aAAa,CAAA;AACnC,MAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC7B,QAAA,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAuB,OAAA,CAAQ,mBAAmB,CAAA;AAC9D,QAAA,IAAA,CAAK,MAAA,CAAO,aAAa,GAAG,CAAA;AAAA,MAChC;AACA,MAAA,IAAA,CAAK,OAAO,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAA,IAAY,GAAG,CAAC,CAAA;AACvD,MAAA,IAAA,CAAK,OAAO,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAA,IAAY,GAAG,CAAC,CAAA;AACvD,MAAA,IAAA,CAAK,OAAO,cAAA,EAAgB,MAAA,CAAO,OAAA,CAAQ,YAAA,IAAgB,IAAI,CAAC,CAAA;AAChE,MAAA,IAAA,CAAK,OAAO,iBAAA,EAAmB,MAAA,CAAO,OAAA,CAAQ,eAAA,IAAmB,CAAC,CAAC,CAAA;AACnE,MAAA,IAAA,CAAK,OAAO,cAAA,EAAgB,MAAA,CAAO,OAAA,CAAQ,YAAA,IAAgB,GAAG,CAAC,CAAA;AAE/D,MAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,8BAA8B,IAAA,EAAM;AAAA,QACtE,OAAA,EAAS,KAAK,UAAA;AAAW,OAC5B,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,IAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACL;AACJ,CAAA;ACnHO,IAAM,aAAN,MAAiB;AAAA,EACpB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,SAAS,OAAA,EAMa;AACxB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,oBAAA,EAAsB,OAAA,IAAW,EAAE,CAAA;AACzE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,WAAW,OAAA,EASS;AACtB,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,oBAAoB,OAAO,CAAA;AACjE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,OAAA,EAAsD;AAC9E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAC7E,MAAA,EAAQ,OAAA,EAAS,IAAA,GAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAE,GAAI;AAAC,KAC/D,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAA0D;AACrF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA;AACxF,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,WAAW,IAAA,EAA6B;AAC1C,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,aAAa,IAAA,EAA6B;AAC5C,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,EACxE;AAAA,EAEA,MAAM,UAAU,IAAA,EAA6B;AACzC,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,MAAA,CAAQ,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,cAAA,CAAe,QAAA,EAAkB,OAAA,EAAwC;AAC3E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,YAAA,CAAA,EAAgB;AAAA,MAC9F;AAAA,KACH,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,iBAAA,CAAkB,QAAA,EAAkB,OAAA,EAAwC;AAC9E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,YAAA,CAAA,EAAgB;AAAA,MAChG,IAAA,EAAM,EAAE,OAAA;AAAQ,KACnB,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,eAAA,CACF,QAAA,EACA,OAAA,EAQ0B;AAC1B,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,OAAA,CAAQ,IAAA;AACzC,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,SAAS,IAAA,EAAM,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,QAAA,CAAA,EAAY;AAAA,MACzF;AAAA,KACH,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,YAAA,CAAa,QAAA,EAAkB,QAAA,EAAiC;AAClE,IAAA,MAAM,UAAA,GAAa,MAAMA,iBAAAA,CAAS,QAAQ,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAWH,uBAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAII,yBAAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,UAAA,EAAY,QAAQ,CAAA;AAExC,IAAA,MAAM,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,mBAAmB,QAAQ,CAAC,SAAS,IAAA,EAAM;AAAA,MAC5E,OAAA,EAAS,KAAK,UAAA;AAAW,KAC5B,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,gBAAgB,QAAA,EAAiC;AACnD,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,gBAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,aAAa,QAAA,EAAmC;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,KAAA,CAAA,EAAS;AAAA,MACtF,YAAA,EAAc;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,aAAa,OAAA,EAGhB;AACC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,oBAAA,EAAsB;AAAA,MACvD,MAAA,EAAQ,SAAS,eAAA,KAAoB,MAAA,GAAY,EAAE,eAAA,EAAiB,OAAA,CAAQ,eAAA,EAAgB,GAAI;AAAC,KACpG,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,YAAY,QAAA,EAAiC;AAC/C,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,gBAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,WAAW,QAAA,EAAiC;AAC9C,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,gBAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAChF;AACJ,CAAA;;;ACtIO,IAAM,gBAAN,MAAoB;AAAA,EACvB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,WAAA,GAA8B;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAiB,CAAA;AACtD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,eAAe,OAAA,EAA+B;AAChD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,wBAAA,EAA0B;AAAA,MAC3D,MAAA,EAAQ,EAAE,OAAA;AAAQ,KACrB,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,iBAAiB,QAAA,EAAiC;AACpD,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,gBAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,cAAA,CAAgB,CAAA;AAAA,EACrF;AAAA,EAEA,MAAM,mBAAmB,QAAA,EAAoC;AACzD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,qBAAA,CAAuB,CAAA;AACxG,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AACJ,CAAA;;;ACvBO,IAAM,iBAAN,MAAqB;AAAA,EACxB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,kBAAA,GAAsC;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,0BAA0B,CAAA;AAChE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AACJ,CAAA;;;ACPO,IAAM,eAAN,MAAmB;AAAA,EACtB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,cAAA,GAAkC;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,sBAAsB,CAAA;AAC3D,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,aAAa,OAAA,EAGhB;AACC,IAAA,MAAM,OAA4B,EAAC;AACnC,IAAA,IAAI,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA;AAC7C,IAAA,IAAI,SAAS,IAAA,EAAM,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AACpD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACzD,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAEvD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,wBAAwB,IAAI,CAAA;AAClE,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA;AAAA,MACpB,QAAA,EAAU,SAAS,IAAA,CAAK;AAAA,KAC5B;AAAA,EACJ;AAAA,EAEA,MAAM,UAAU,IAAA,EAA4B;AACxC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,CAAA;AAC7D,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,qBAAA,CAAsB,OAAA,EAAiB,IAAA,EAAiD;AAC1F,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,EAAI;AAAA,MACxE,MAAA,EAAQ,EAAE,OAAA;AAAQ,KACrB,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,SAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,qBAAqB,IAAA,EAA+B;AACtD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,eAAA,EAAkB,IAAI,CAAA,MAAA,CAAQ,CAAA;AACnE,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,MAAA;AAAA,EAC9B;AACJ,CAAA;;;ACzCO,IAAM,eAAN,MAAmB;AAAA,EACtB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,gBAAA,GAAmC;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,+BAA+B,CAAA;AACpE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,oBAAA,GAAsC;AACxC,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,uCAAuC,CAAA;AAAA,EAChE;AACJ,CAAA;;;ACRO,SAAS,oBAAoB,KAAA,EAAyB;AACzD,EAAA,MAAM,UAAA,GAAa,KAAA;AACnB,EAAA,MAAM,QAAA,GAAW,YAAY,QAAA,EAAU,IAAA,EAAM,OAAO,OAAA,IAAW,UAAA,EAAY,QAAA,EAAU,IAAA,EAAM,OAAA,IAAW,EAAA;AACtG,EAAA,MAAM,QAAA,GAAW,SAAS,WAAA,EAAY;AACtC,EAAA,OAAO,SAAS,QAAA,CAAS,qBAAqB,CAAA,IAAK,QAAA,CAAS,SAAS,gBAAgB,CAAA;AACzF;AAQO,SAAS,eAAe,QAAA,EAAsC;AACjE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA;AAClC,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG;AACjC,IAAA,OAAO,MAAA;AAAA,EACX;AACA,EAAA,OAAO,MAAM,CAAC,CAAA;AAClB;AAMA,eAAsB,sBAAsB,OAAA,EAOxB;AAChB,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,QAAA,EAAU,OAAA,EAAS,UAAS,GAAI,OAAA;AAChE,EAAA,IAAI;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB;AAAA,MACjD,SAAA,EAAW,CAAC,OAAO,CAAA;AAAA,MACnB,OAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACH,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,EAAM,IAAA;AAAA,EAC/B,SAAS,KAAA,EAAO;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACN,CAAA,oCAAA,EAAuC,OAAO,CAAA,GAAA,EAC1C,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACzD,CAAA;AAAA,KACJ;AAAA,EACJ;AACJ;;;AClDO,IAAM,gBAAN,MAAoB;AAAA,EACvB,YACqB,IAAA,EACA,WAAA,GAAyD,CAAC,IAAA,KAAS,MAAK,EAC3F;AAFmB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAClB;AAAA,EAEH,MAAM,YAAY,OAAA,EAAuD;AACrE,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAYC,iBAAAA,EAAW;AAChD,MAAA,MAAM,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,QAAA,EAAS;AAEvC,MAAA,IAAI;AACA,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,wBAAwB,OAAO,CAAA;AACrE,QAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,MACzB,SAAS,KAAA,EAAgB;AACrB,QAAA,IAAI,CAAC,mBAAA,CAAoB,KAAK,CAAA,EAAG,MAAM,KAAA;AAEvC,QAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAC/C,QAAA,IAAI,CAAC,SAAS,MAAM,KAAA;AAEpB,QAAA,MAAM,qBAAA,CAAsB;AAAA,UACxB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAA;AAAA,UACA,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,QAAA;AAAA,UACA,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,UAAU,OAAA,CAAQ;AAAA,SACrB,CAAA;AACD,QAAA,OAAO,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,OAAA,EAAS,WAAA,EAAa,IAAA,CAAK,GAAA,EAAI,EAAE;AAAA,MAC5E;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,UAAA,CAAW,IAAA,EAAc,OAAA,EAAyD;AACpF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAA,EAAI;AAAA,MAC5D,MAAA,EAAQ,OAAA,EAAS,IAAA,GAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAE,GAAI;AAAC,KAC/D,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,YAAY,OAAA,EAQa;AAC3B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,uBAAA,EAAyB,OAAA,IAAW,EAAE,CAAA;AAC5E,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,gBAAgB,OAAA,EAMF;AAChB,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AACjD,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC/D,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAE/D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,uBAAA,EAAyB,EAAE,QAAQ,CAAA;AACxE,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,uBAAuB,OAAA,EAMT;AAChB,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AACjD,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC/D,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAE/D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,+BAAA,EAAiC;AAAA,MAClE;AAAA,KACH,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,oBAAoB,OAAA,EAMN;AAChB,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AACzD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAC3D,IAAA,IAAI,OAAA,EAAS,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AACjD,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC/D,IAAA,IAAI,OAAA,EAAS,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAE/D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,0BAAA,EAA4B;AAAA,MAC7D;AAAA,KACH,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,YAAY,OAAA,EAKW;AACzB,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,gBAAA,EAAmB,OAAA,CAAQ,WAAW,CAAA,KAAA,CAAA,EAAS;AAAA,QACjF,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,6BAAA,EAA+B,OAAA,CAAQ,6BAAA,IAAiC,OAAA,CAAQ,aAAA;AAAA,QAChF,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,OACnC,CAAA;AACD,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,aAAa,OAAA,EAKU;AACzB,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,uBAAA,EAAyB;AAAA,QAC3D,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,qBAAqB,OAAA,CAAQ,WAAA;AAAA,QAC7B,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,OACnC,CAAA;AACD,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,cAAc,OAAA,EAAgF;AAChG,IAAA,OAAO,IAAA,CAAK,YAAY,YAAY;AAChC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,gBAAA,EAAmB,OAAA,CAAQ,WAAW,CAAA,OAAA,CAAA,EAAW;AAAA,QACnF,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,OACnC,CAAA;AACD,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,cAAc,IAAA,EAA6B;AAC7C,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAI,CAAA,OAAA,CAAS,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAGpB;AACC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,IAAI,CAAA,eAAA,CAAiB,CAAA;AAC7E,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,eAAe,OAAA,EASU;AAC3B,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,0BAA0B,OAAO,CAAA;AACvE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AACJ,CAAA;;;ACpLO,IAAM,aAAN,MAAiB;AAAA,EACpB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,OAAO,OAAA,EAA0D;AACnE,IAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,qBAAA,EAAuB;AAAA,MACzD,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,SAAS,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAAA,EAAwD;AAC/D,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,MACvD,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,kBAAkB,OAAA,CAAQ;AAAA,KAC7B,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,OAAO,OAAA,EAAwD;AACjE,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,qBAAA,EAAuB;AAAA,MACzD,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,kBAAkB,OAAA,CAAQ;AAAA,KAC7B,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,UAAU,OAAA,EAA6D;AACzE,IAAA,IAAI,CAAC,QAAQ,UAAA,IAAc,OAAA,CAAQ,WAAW,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AAC/D,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,qBAAA,EAAuB;AAAA,MACzD,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,YAAY,OAAA,CAAQ;AAAA,KACvB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AACJ,CAAA;;;ACnDO,IAAM,yBAAN,MAA6B;AAAA,EAChC,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,uBAAuB,OAAA,EAA4B;AACrD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,4BAA4B,OAAO,CAAA;AACzE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,oBAAA,GAAuC;AACzC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,0BAA0B,CAAA;AAC/D,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,sBAAA,CAAuB,EAAA,EAAY,OAAA,EAA4B;AACjE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,yBAAA,EAA4B,EAAE,IAAI,OAAO,CAAA;AAC9E,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,uBAAuB,EAAA,EAA2B;AACpD,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAA,yBAAA,EAA4B,EAAE,CAAA,CAAE,CAAA;AAAA,EAC3D;AACJ,CAAA;;;ACrBO,IAAM,eAAN,MAAmB;AAAA,EACtB,YAA6B,IAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAEnD,MAAM,aAAA,GAA8B;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,qBAAqB,CAAA;AAC1D,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,eAAA,GAAgC;AAClC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,kCAAkC,CAAA;AACvE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,cAAc,KAAA,EAAmC;AACnD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,qBAAA,EAAuB;AAAA,MACxD,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU;AAAC,KAC9C,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,mBAAmB,OAAA,EAA6C;AAClE,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,IAAI,SAAS,IAAA,EAAM,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iCAAA,EAAmC;AAAA,MACpE;AAAA,KACH,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,yBAAyB,OAAA,EAA6C;AACxE,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,IAAI,SAAS,IAAA,EAAM,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,sCAAA,EAAwC;AAAA,MACzE;AAAA,KACH,CAAA;AACD,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AACJ,CAAA;;;ACtBO,IAAM,oBAAA,GAAN,MAAM,oBAAA,SAA4BN,yBAAAA,CAA0C;AAAA,EAsDvE,WAAA,CAAY,MAAA,GAAuB,EAAC,EAAG;AAC3C,IAAA,KAAA,EAAM;AAvCV;AAAA,IAAA,aAAA,CAAA,IAAA,EAAgB,QAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,QAAA,EAAS,UAAU,qBAAqB,CAAA,CAAA;AACxD,IAAA,aAAA,CAAA,IAAA,EAAgB,MAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,QAAA,CAAA;AAEhB,IAAA,aAAA,CAAA,IAAA,EAAgB,aAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,UAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,OAAA,CAAA;AAEhB,IAAA,aAAA,CAAA,IAAA,EAAgB,UAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,SAAA,CAAA;AAEhB,IAAA,aAAA,CAAA,IAAA,EAAgB,UAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,QAAA,CAAA;AAEhB,IAAA,aAAA,CAAA,IAAA,EAAgB,OAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,mBAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAgB,QAAA,CAAA;AAOhB;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,mBAAA,sBAAwB,GAAA,EAAY,CAAA;AAM5C;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,EAA8B,QAAQ,OAAA,EAAQ,CAAA;AAMtD;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,cAAA,EAAe,KAAA,CAAA;AAKnB,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACV,SAAA,EAAW,uBAAA;AAAA,MACX,QAAA,EAAU,MAAA;AAAA,MACV,GAAG;AAAA,KACP;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACtB,MAAA,iBAAA,CAAkB,IAAA,CAAK,OAAO,QAAoB,CAAA;AAAA,IACtD;AAEA,IAAA,IAAA,CAAK,IAAA,GAAOO,uBAAM,MAAA,CAAO;AAAA,MACrB,OAAA,EAAS,KAAK,MAAA,CAAO,SAAA;AAAA,MACrB,OAAA,EAAS,KAAK,MAAA,CAAO,MAAA,GAAS,EAAE,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,GAAI;AAAA,KACvE,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,GAASC,mBAAA,CAAG,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAAA,MACpC,IAAA,EAAM,KAAK,MAAA,CAAO,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,GAAI,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAc5D,UAAA,EAAY,CAAC,WAAW,CAAA;AAAA;AAAA,MACxB,OAAA,EAAS,GAAA;AAAA;AAAA,MACT,QAAA,EAAU;AAAA;AAAA,KACb,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAE9C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,gBAAA,CAAiB,IAAA,CAAK,MAAM,WAAW,CAAA;AAC9D,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,aAAA,CAAc,IAAA,CAAK,MAAM,WAAW,CAAA;AACxD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAErC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAEzC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAExC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AAC7D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAAA,EAC5C;AAAA,EAtGA,OAAc,YAAY,MAAA,EAA4C;AAClE,IAAA,MAAM,QAAA,GAAW,qBAAoB,YAAA,EAAa;AAClD,IAAA,IAAI,UAAU,OAAO,QAAA;AAErB,IAAA,MAAM,QAAA,GAAW,IAAI,oBAAA,CAAoB,MAAM,CAAA;AAC/C,IAAA,oBAAA,CAAoB,aAAa,QAAQ,CAAA;AACzC,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAqGS,IAAA,CAAK,UAA2B,IAAA,EAA0B;AAC/D,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,GAAI,IAAgC,CAAA;AAAA,EACjE;AAAA,EAMS,EAAA,CAAG,OAAwB,QAAA,EAA8C;AAC9E,IAAA,OAAO,KAAA,CAAM,EAAA,CAAG,KAAA,EAAO,QAAwC,CAAA;AAAA,EACnE;AAAA,EAMS,IAAA,CAAK,OAAwB,QAAA,EAA8C;AAChF,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,QAAwC,CAAA;AAAA,EACrE;AAAA,EAMS,GAAA,CAAI,OAAwB,QAAA,EAA8C;AAC/E,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO,QAAwC,CAAA;AAAA,EACpE;AAAA,EAMS,WAAA,CAAY,OAAwB,QAAA,EAA8C;AACvF,IAAA,OAAO,KAAA,CAAM,WAAA,CAAY,KAAA,EAAO,QAAwC,CAAA;AAAA,EAC5E;AAAA,EAMS,cAAA,CAAe,OAAwB,QAAA,EAA8C;AAC1F,IAAA,OAAO,KAAA,CAAM,cAAA,CAAe,KAAA,EAAO,QAAwC,CAAA;AAAA,EAC/E;AAAA,EAEA,MAAM,OAAA,GAAU;AACZ,IAAA,MAAM,YAAA,GAAyC;AAAA,MAC3C,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,0BAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,qBAAA;AAAA,MACA,kBAAA;AAAA,MACA,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,kBAAA;AAAA,MACA,YAAA;AAAA,MACA,mBAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,KAAA,MAAW,aAAa,YAAA,EAAc;AAClC,MAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,CAAA,GAAI,IAAA,KAAoB;AAQ9C,QAAA,IAAI,SAAA,KAAc,aAAA,IAAiB,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAChD,UAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AACtB,UAAA,IAAI,SAAS,IAAA,EAAM;AAEf,YAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC1C,cAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,+CAAA,EAAkD,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAClF,cAAA;AAAA,YACJ;AAEA,YAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAAA,UAC3C;AAAA,QACJ;AAEA,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACjB,UAAA,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,QACjC,CAAA,MAAO;AACH,UAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,QACxB;AAAA,MACJ,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,MAAM;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mCAAmC,CAAA;AACpD,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,MAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AAAA,IAC1B,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,MAAM;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,2BAA2B,CAAA;AAC5C,MAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACpB,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,QAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,MACrB;AAAA,IACJ,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,CAAC,KAAA,KAAgD;AAC1E,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,MAAA,GAAS,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AACtG,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAI,KAAA,CAAM,0BAA0B,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,IAC3E,CAAC,CAAA;AAED,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,sCAAsC,CAAA;AACvD,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,MAAM;AAC9B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,6DAA6D,CAAA;AAE9E,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACrB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mEAAmE,CAAA;AACpF,QAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACpB,UAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,UAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,QACrB;AAAA,MACJ;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AACxB,MAAA,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,IACxB;AAAA,EACJ;AAAA,EAEA,MAAM,KAAA,GAAQ;AACV,IAAA,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,sBAAA,CAAuB,UAAkB,GAAA,EAAM;AAClD,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,IAAA,GAAO,OAAA,EAAS;AACvC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,iBAAiB,CAAA;AAClD,MAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAE7B,MAAA,QAAA,CAAS,KAAA,CAAM,CAAC,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS;AACvD,QAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,IAAI,CAAA;AAAA,MACnC,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,4CAAA,EAA+C,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,IAC3G;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKO,wBAAA,GAAmC;AACtC,IAAA,OAAO,KAAK,iBAAA,CAAkB,IAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,YAAe,IAAA,EAAoC;AACtD,IAAA,MAAM,SAAS,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,MAAM,CAAA;AAE/C,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACtC,IAAA,OAAO,MAAA;AAAA,EACX;AACJ,CAAA;AAlSI,aAAA,CADS,oBAAA,EACM,cAAA,EAAe,MAAmC,UAAA,CAAmB,uBAAA,IAA2B,IAAA,CAAA;AAC/G,aAAA,CAFS,oBAAA,EAEM,cAAA,EAAe,CAAC,GAAA,KAA6B;AACxD,EAAC,WAAmB,uBAAA,GAA0B,GAAA;AAClD,CAAA,CAAA;AAJG,IAAM,mBAAA,GAAN;AAqSA,IAAM,MAAM,mBAAA,CAAoB;;;ACxThC,IAAM,uBAAA,GAA0B;AAChC,IAAM,sBAAA,GAAyB;AAC/B,IAAM,yBAAA,GAA4B;AAClC,IAAM,yBAAA,GAA4B;AAClC,IAAM,yBAAA,GAA4B;AAClC,IAAM,WAAA,GAAc;AACpB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,eAAA,GAAkB;AACxB,IAAM,UAAA,GAAa;AACnB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,iBAAA,GAAoB;AAC1B,IAAM,gBAAA,GAAmB;AACzB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,kBAAA,GAAqB;AAC3B,IAAM,wBAAA,GAA2B;AACjC,IAAM,WAAA,GAAc;AACpB,IAAM,gBAAA,GAAmB;AACzB,IAAM,aAAA,GAAgB;AACtB,IAAM,yBAAA,GAA4B;AAClC,IAAM,wBAAA,GAA2B;AACjC,IAAM,iBAAA,GAAoB;AAC1B,IAAM,iBAAA,GAAoB;AAC1B,IAAM,uBAAA,GAA0B;AAChC,IAAM,uBAAA,GAA0B;AAChC,IAAM,uBAAA,GAA0B;AAChC,IAAM,oBAAA,GAAuB;AAC7B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,wBAAA,GAA2B;AACjC,IAAM,sBAAA,GAAyB;AAC/B,IAAM,mBAAA,GAAsB;;;AC3B5B,IAAM,sBAAA,GACT,wFAAA;AAEJ,IAAM,SAAA,uBAAgB,GAAA,EAAwB;AAEvC,SAAS,SAAA,CAAU,aAAqB,IAAA,EAAwB;AACnE,EAAA,SAAA,CAAU,GAAA,CAAI,aAAa,IAAI,CAAA;AACnC;AAMO,SAAS,kBAAkB,QAAA,EAAiC;AAC/D,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,CAAU,MAAA,EAAO,EAAG;AACnC,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,qBAAqB,QAAQ,CAAA;AACvE,IAAA,IAAI,MAAA,SAAe,MAAA,CAAO,IAAA;AAAA,EAC9B;AACA,EAAA,OAAO,IAAA;AACX;AAEO,SAAS,cAAc,OAAA,EAAmC;AAC7D,EAAA,OAAO,QAAQ,eAAA,KAAoB,sBAAA;AACvC;AAEO,SAAS,WAAW,OAAA,EAAmC;AAC1D,EAAA,OAAO,aAAA,CAAc,OAAO,CAAA,IAAK,OAAA,CAAQ,qBAAA,KAA0B,MAAA;AACvE;AAYA,SAAS,eAAe,WAAA,EAAmE;AACvF,EAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,GAAG,OAAO,IAAA;AAErD,EAAA,MAAM,OAAA,GAAU,YAAY,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI,OAAA,CAAQ,GAAA,IAAO,OAAO,OAAA,CAAQ,QAAQ,QAAA,EAAU;AAChD,IAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,EACnB;AAEA,EAAA,MAAM,UAAU,OAAA,CAAQ,QAAA;AACxB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AACzC,QAAA,IAAI,IAAI,aAAa,CAAA,IAAK,OAAO,GAAA,CAAI,aAAa,MAAM,QAAA,EAAU;AAC9D,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,aAAa,EAAE,GAAG,CAAA;AAClD,UAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,EAAG;AACrE,YAAA,OAAO,WAAA;AAAA,UACX;AAAA,QACJ;AACA,QAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAA,EAAG;AACrD,UAAA,OAAO,GAAA;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,OAAO,IAAA;AACX;AAEA,SAAS,aAAa,OAAA,EAAiC;AACnD,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,QAAA;AACf,IAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,MAAM,GAAG,OAAO,IAAA;AAExC,IAAA,IAAI,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,IAAA,IAAI,eAAe,CAAA,CAAA,EAAI;AACnB,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AAAA,IACnC;AAEA,IAAA,IAAA,GAAO,mBAAmB,IAAI,CAAA;AAE9B,IAAA,IAAI;AACA,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACJ,MAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,QAAQ,CAAA,CAAE,SAAS,OAAO,CAAA;AAC5D,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC7B;AAAA,EACJ,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AAEO,SAAS,oBAAoB,OAAA,EAA6C;AAC7E,EAAA,IAAI,CAAC,aAAA,CAAc,OAAO,CAAA,EAAG,OAAO,IAAA;AACpC,EAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,WAAW,CAAA;AAClD,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AACjC,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAM,OAAO,IAAA;AAEhC,EAAA,MAAM,MAAA,GAAqB;AAAA,IACvB,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,KAAA,IAAS,EAAA;AAAA,IAC1B,aAAA,EAAe,IAAA,CAAK,IAAA,CAAK,aAAA,IAAiB,EAAA;AAAA,IAC1C,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,kBAAA,IAAsB;AAAC,GAC9C;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AACd,IAAA,SAAA,CAAU,OAAA,CAAQ,MAAM,MAAM,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAA;AACX;AAEO,SAAS,eAAe,OAAA,EAAiD;AAC5E,EAAA,IAAI,CAAC,aAAA,CAAc,OAAO,CAAA,EAAG,OAAO,IAAA;AACpC,EAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,WAAW,CAAA;AAClD,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AACjC,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAM,OAAO,IAAA;AAEhC,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,KAAA,IAAS;AAAC,GAC/B;AACJ;AAEO,SAAS,eAAe,OAAA,EAAkC;AAC7D,EAAA,IAAI,CAAC,aAAA,CAAc,OAAO,CAAA,EAAG;AACzB,IAAA,OAAO,QAAQ,IAAA,IAAQ,WAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACrB,IAAA,MAAM,QAAA,GAAW,eAAe,OAAO,CAAA;AACvC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAClB,GAAA,CAAI,CAAC,CAAA,KAAM;AACR,QAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,CAAA,CAAE,oBAAoB,CAAA;AAC3D,QAAA,MAAM,gBAAgB,UAAA,GAAa,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAA,GAAM,CAAA,OAAA,EAAU,EAAE,oBAAoB,CAAA,CAAA;AACvF,QAAA,OAAO,CAAA,EAAG,CAAA,CAAE,iBAAA,IAAqB,SAAS,UAAU,aAAa,CAAA,CAAA;AAAA,MACrE,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd,MAAA,OAAO,eAAe,KAAK,CAAA,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,aAAA;AAAA,EACX;AAEA,EAAA,MAAM,QAAA,GAAW,oBAAoB,OAAO,CAAA;AAC5C,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,MAAM,QAAQ,QAAA,CAAS,KAAA,GAAQ,CAAA,CAAA,EAAI,QAAA,CAAS,KAAK,CAAA,CAAA,CAAA,GAAM,iBAAA;AACvD,IAAA,MAAM,cAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,KAAK,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACzF,IAAA,OAAO,UAAU,KAAK;AAAA,EAAK,WAAW,CAAA,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,0BAAA;AACX;AAEO,SAAS,gBAAgB,OAAA,EAAkC;AAC9D,EAAA,IAAI,CAAC,aAAA,CAAc,OAAO,CAAA,EAAG;AACzB,IAAA,OAAO,QAAQ,IAAA,IAAQ,WAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACrB,IAAA,MAAM,QAAA,GAAW,eAAe,OAAO,CAAA;AACvC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,OAAO,CAAA,YAAA,EAAe,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,QAAA,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,aAAA;AAAA,EACX;AAEA,EAAA,MAAM,QAAA,GAAW,oBAAoB,OAAO,CAAA;AAC5C,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,MAAA;AAChC,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,OAAA,CAC3B,KAAA,CAAM,GAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,KAAK,IAAI,CAAA;AACd,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,KAAA,CAAA,GAAU,EAAA;AAC7F,IAAA,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,EAAA,EAAK,cAAc,GAAG,WAAW,CAAA,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,QAAA;AACX","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/${encodeURIComponent(guid)}`, {
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/${encodeURIComponent(guid)}`, options);
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/${encodeURIComponent(guid)}`);
222
+ await this.http.delete(`/api/v1/chat/${guid}`);
220
223
  }
221
224
  async markChatRead(guid) {
222
- await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/read`);
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/${encodeURIComponent(guid)}/leave`);
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/${encodeURIComponent(chatGuid)}/participant`, {
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/${encodeURIComponent(chatGuid)}/participant`, {
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/${encodeURIComponent(chatGuid)}/message`, {
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/${encodeURIComponent(chatGuid)}/icon`, form, {
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/${encodeURIComponent(chatGuid)}/icon`);
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/${encodeURIComponent(chatGuid)}/icon`, {
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/${encodeURIComponent(chatGuid)}/typing`);
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/${encodeURIComponent(chatGuid)}/typing`);
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.0",
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"