@photon-ai/advanced-imessage-kit 1.8.0 → 1.10.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/README.md +34 -13
- package/dist/index.cjs +10 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -3
- package/dist/index.d.ts +6 -3
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -45,7 +45,7 @@ Advanced iMessage Kit is a full-featured iMessage SDK for **reading**, **sending
|
|
|
45
45
|
| [Create Polls](#create-polls) | Create interactive polls in chat | `polls.create()` | [poll-create.ts](./examples/poll-create.ts) |
|
|
46
46
|
| [Vote on Polls](#vote-on-polls) | Vote or unvote on poll options | `polls.vote()` | [poll-vote.ts](./examples/poll-vote.ts) |
|
|
47
47
|
| [Add Poll Options](#add-poll-options) | Add options to existing polls | `polls.addOption()` | [poll-add-option.ts](./examples/poll-add-option.ts) |
|
|
48
|
-
| [Find My Friends](#find-my-friends)
|
|
48
|
+
| [Find My Friends](#find-my-friends) | Get friends' locations | `icloud.refreshFindMyFriends()` | [findmy-friends.ts](./examples/findmy-friends.ts) |
|
|
49
49
|
| [Real-time Events](#real-time-events) | Listen for new messages, typing, etc. | `sdk.on()` | [listen-simple.ts](./examples/listen-simple.ts) |
|
|
50
50
|
| [Auto Reply](#real-time-events) | Build automated reply bots | `sdk.on()` | [auto-reply-hey.ts](./examples/auto-reply-hey.ts) |
|
|
51
51
|
|
|
@@ -740,18 +740,39 @@ sdk.on("new-message", (message) => {
|
|
|
740
740
|
|
|
741
741
|
---
|
|
742
742
|
|
|
743
|
-
## iCloud
|
|
743
|
+
## iCloud
|
|
744
744
|
|
|
745
745
|
> Example: [findmy-friends.ts](./examples/findmy-friends.ts)
|
|
746
746
|
|
|
747
747
|
### Find My Friends
|
|
748
748
|
|
|
749
749
|
```typescript
|
|
750
|
-
//
|
|
751
|
-
const
|
|
750
|
+
// Refresh and get friends' locations
|
|
751
|
+
const locations = await sdk.icloud.refreshFindMyFriends();
|
|
752
|
+
|
|
753
|
+
// Each location contains:
|
|
754
|
+
// - handle: phone number or email
|
|
755
|
+
// - coordinates: [latitude, longitude]
|
|
756
|
+
// - long_address: street address (optional)
|
|
757
|
+
// - expiry: timestamp when location expires (optional)
|
|
758
|
+
|
|
759
|
+
// Find specific friend
|
|
760
|
+
const friend = locations.find((loc) => loc.handle === "+1234567890");
|
|
761
|
+
if (friend) {
|
|
762
|
+
console.log(
|
|
763
|
+
`Coordinates: ${friend.coordinates[0]}, ${friend.coordinates[1]}`
|
|
764
|
+
);
|
|
765
|
+
console.log(
|
|
766
|
+
`Maps: https://maps.google.com/?q=${friend.coordinates[0]},${friend.coordinates[1]}`
|
|
767
|
+
);
|
|
768
|
+
if (friend.long_address) console.log(`Address: ${friend.long_address}`);
|
|
769
|
+
}
|
|
752
770
|
|
|
753
|
-
//
|
|
754
|
-
|
|
771
|
+
// List all friends
|
|
772
|
+
console.log(`All Friends (${locations.length}):`);
|
|
773
|
+
for (const loc of locations) {
|
|
774
|
+
console.log(`${loc.handle}: ${loc.coordinates[0]}, ${loc.coordinates[1]}`);
|
|
775
|
+
}
|
|
755
776
|
```
|
|
756
777
|
|
|
757
778
|
> Example: [findmy-friends.ts](./examples/findmy-friends.ts)
|
|
@@ -847,7 +868,7 @@ sdk.on("group-icon-removed", (message) => {
|
|
|
847
868
|
});
|
|
848
869
|
```
|
|
849
870
|
|
|
850
|
-
### Find My Friends Events
|
|
871
|
+
### Find My Friends Events
|
|
851
872
|
|
|
852
873
|
```typescript
|
|
853
874
|
sdk.on("new-findmy-location", (location) => {
|
|
@@ -993,12 +1014,12 @@ bun run examples/<filename>.ts
|
|
|
993
1014
|
|
|
994
1015
|
### Server & Advanced
|
|
995
1016
|
|
|
996
|
-
| File | Description
|
|
997
|
-
| ------------------------------------------------- |
|
|
998
|
-
| [server-info.ts](./examples/server-info.ts) | Server info and logs
|
|
999
|
-
| [message-stats.ts](./examples/message-stats.ts) | Message statistics
|
|
1000
|
-
| [findmy-friends.ts](./examples/findmy-friends.ts) | Find My Friends
|
|
1001
|
-
| [auto-reply-hey.ts](./examples/auto-reply-hey.ts) | Auto reply bot
|
|
1017
|
+
| File | Description |
|
|
1018
|
+
| ------------------------------------------------- | -------------------- |
|
|
1019
|
+
| [server-info.ts](./examples/server-info.ts) | Server info and logs |
|
|
1020
|
+
| [message-stats.ts](./examples/message-stats.ts) | Message statistics |
|
|
1021
|
+
| [findmy-friends.ts](./examples/findmy-friends.ts) | Find My Friends |
|
|
1022
|
+
| [auto-reply-hey.ts](./examples/auto-reply-hey.ts) | Auto reply bot |
|
|
1002
1023
|
|
|
1003
1024
|
---
|
|
1004
1025
|
|
package/dist/index.cjs
CHANGED
|
@@ -493,7 +493,16 @@ var ICloudModule = class {
|
|
|
493
493
|
return response.data.data;
|
|
494
494
|
}
|
|
495
495
|
async refreshFindMyFriends() {
|
|
496
|
-
await this.http.post("/api/v1/icloud/findmy/friends/refresh");
|
|
496
|
+
const response = await this.http.post("/api/v1/icloud/findmy/friends/refresh");
|
|
497
|
+
return response.data.data;
|
|
498
|
+
}
|
|
499
|
+
async getLocationForHandle(handle) {
|
|
500
|
+
const friends = await this.getFindMyFriends();
|
|
501
|
+
return friends.find((f) => f.handle === handle) ?? null;
|
|
502
|
+
}
|
|
503
|
+
async isHandleSharingLocation(handle) {
|
|
504
|
+
const location = await this.getLocationForHandle(handle);
|
|
505
|
+
return location !== null;
|
|
497
506
|
}
|
|
498
507
|
};
|
|
499
508
|
var MessageModule = class {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/Logger.ts","../lib/Loggable.ts","../lib/auto-create-chat.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../modules/message.ts","../modules/poll.ts","../modules/scheduled.ts","../modules/server.ts","../client.ts","../events.ts","../lib/poll-utils.ts"],"names":["EventEmitter","path","os","fs","readFile","randomUUID","FormData","axios","io"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;ACjBO,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;AAYO,SAAS,eAAe,QAAA,EAAkD;AAC7E,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,EAAA,MAAM,SAAS,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAG,WAAA,EAAY;AACnD,EAAA,IAAI,MAAA,KAAW,YAAY,OAAO,UAAA;AAClC,EAAA,IAAI,MAAA,KAAW,OAAO,OAAO,KAAA;AAC7B,EAAA,OAAO,MAAA;AACX;AAMA,eAAsB,sBAAsB,OAAA,EAQxB;AAChB,EAAA,MAAM,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,UAAU,OAAA,EAAS,QAAA,EAAU,SAAQ,GAAI,OAAA;AACzE,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,QAAA;AAAA,MACA,GAAI,OAAA,IAAW,EAAE,OAAA;AAAQ,KAC5B,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;;;ACnEO,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,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AACrF,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,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,IAAI,CAAC,CAAA,SAAA,CAAA,EAAa;AAAA,MAC5F,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,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,IAAI,CAAC,CAAA,KAAA,CAAA,EAAS;AAAA,MACxF,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,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,IAAI,CAAC,CAAA,SAAA,CAAA,EAAa;AAAA,MAC5F;AAAA,KACH,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,QAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,QAAA,EAAiC;AAC5D,IAAA,MAAM,OAAA,GAAU,eAAe,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,OAAA,GAAU,eAAe,QAAQ,CAAA;AACvC,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB;AAAA,MACrC,SAAA,EAAW,CAAC,OAAO,CAAA;AAAA,MACnB,GAAI,OAAA,IAAW,EAAE,OAAA;AAAQ,KAC5B,CAAA;AAAA,EACL;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;AACnE,MAAA,MAAM,WAAWI,iBAAA,EAAW;AAE5B,MAAA,MAAM,YAAY,MAAM;AACpB,QAAA,MAAM,IAAA,GAAO,IAAIC,yBAAA,EAAS;AAC1B,QAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AACxC,QAAA,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,UAAA,EAAY,QAAQ,CAAA;AAC9C,QAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC5B,QAAA,IAAA,CAAK,MAAA,CAAO,YAAY,QAAQ,CAAA;AAChC,QAAA,IAAI,OAAA,CAAQ,mBAAmB,MAAA,EAAW;AACtC,UAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,OAAA,CAAQ,cAAA,CAAe,UAAU,CAAA;AAC/D,UAAA,IAAI,QAAQ,cAAA,EAAgB;AACxB,YAAA,IAAA,CAAK,MAAA,CAAO,UAAU,aAAa,CAAA;AAAA,UACvC;AAAA,QACJ;AACA,QAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC7B,UAAA,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAuB,OAAA,CAAQ,mBAAmB,CAAA;AAAA,QAClE;AACA,QAAA,OAAO,IAAA;AAAA,MACX,CAAA;AAEA,MAAA,IAAI;AACA,QAAA,MAAM,OAAO,SAAA,EAAU;AACvB,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,8BAA8B,IAAA,EAAM;AAAA,UACtE,OAAA,EAAS,KAAK,UAAA;AAAW,SAC5B,CAAA;AACD,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,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAA;AAE5C,QAAA,MAAM,OAAO,SAAA,EAAU;AACvB,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,8BAA8B,IAAA,EAAM;AAAA,UACtE,OAAA,EAAS,KAAK,UAAA;AAAW,SAC5B,CAAA;AACD,QAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,MACzB;AAAA,IACJ,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,UAAA,GAAa,MAAMG,iBAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAElD,MAAA,MAAM,YAAY,MAAM;AACpB,QAAA,MAAM,IAAA,GAAO,IAAIE,yBAAA,EAAS;AAC1B,QAAA,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,UAAA,EAAY,QAAQ,CAAA;AAC9C,QAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC5B,QAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AACxC,QAAA,IAAA,CAAK,MAAA,CAAO,aAAa,MAAM,CAAA;AAC/B,QAAA,IAAA,CAAK,MAAA,CAAO,UAAU,aAAa,CAAA;AACnC,QAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC7B,UAAA,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAuB,OAAA,CAAQ,mBAAmB,CAAA;AAC9D,UAAA,IAAA,CAAK,MAAA,CAAO,aAAa,GAAG,CAAA;AAC5B,UAAA,IAAA,CAAK,OAAO,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAA,IAAY,GAAG,CAAC,CAAA;AACvD,UAAA,IAAA,CAAK,OAAO,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAA,IAAY,GAAG,CAAC,CAAA;AACvD,UAAA,IAAA,CAAK,OAAO,cAAA,EAAgB,MAAA,CAAO,OAAA,CAAQ,YAAA,IAAgB,IAAI,CAAC,CAAA;AAChE,UAAA,IAAA,CAAK,OAAO,iBAAA,EAAmB,MAAA,CAAO,OAAA,CAAQ,eAAA,IAAmB,CAAC,CAAC,CAAA;AACnE,UAAA,IAAA,CAAK,OAAO,cAAA,EAAgB,MAAA,CAAO,OAAA,CAAQ,YAAA,IAAgB,GAAG,CAAC,CAAA;AAAA,QACnE;AACA,QAAA,OAAO,IAAA;AAAA,MACX,CAAA;AAEA,MAAA,IAAI;AACA,QAAA,MAAM,OAAO,SAAA,EAAU;AACvB,QAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,8BAA8B,IAAA,EAAM;AAAA,UACtE,OAAA,EAAS,KAAK,UAAA;AAAW,SAC5B,CAAA;AACD,QAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MAChB,SAAS,KAAA,EAAgB;AACrB,QAAA,IAAI,CAAC,mBAAA,CAAoB,KAAK,CAAA,EAAG,MAAM,KAAA;AAEvC,QAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAA;AAE5C,QAAA,MAAM,OAAO,SAAA,EAAU;AACvB,QAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,8BAA8B,IAAA,EAAM;AAAA,UACtE,OAAA,EAAS,KAAK,UAAA;AAAW,SAC5B,CAAA;AACD,QAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MAChB;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AACJ,CAAA;ACrKO,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,eAAe,IAAA,EAA6B;AAC9C,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAC1E;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,KAAK,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,mBAAA,CAAA,EAAuB;AAAA,MACrG;AAAA,KACH,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,MAAMF,iBAAAA,CAAS,QAAQ,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAWH,uBAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAIK,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;AAAA,EAEA,MAAM,cAAc,QAAA,EAKjB;AACC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,WAAA,CAAa,CAAA;AAC9F,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,aAAA,CACF,QAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,OAAO,OAAO,OAAA,KAAY,WAAW,EAAE,QAAA,EAAU,SAAQ,GAAI,OAAA;AACnE,IAAA,MAAM,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,aAAA,EAAgB,mBAAmB,QAAQ,CAAC,eAAe,IAAI,CAAA;AAAA,EACxF;AAAA,EAEA,MAAM,iBAAiB,QAAA,EAAiC;AACpD,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,gBAAgB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,WAAA,CAAa,CAAA;AAAA,EACpF;AACJ,CAAA;;;AChKO,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,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,eAAA,EAAkB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AACjF,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,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,eAAA,EAAkB,kBAAA,CAAmB,IAAI,CAAC,CAAA,MAAA,CAAQ,CAAA;AACvF,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,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,IAAYD,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,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAE/C,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,QAAA;AAAA,UAClB;AAAA,SACH,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,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAChF,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,IAAA,CAAK,mBAAmB,kBAAA,CAAmB,OAAA,CAAQ,WAAW,CAAC,CAAA,KAAA,CAAA,EAAS;AAAA,QACrG,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,IAAA,CAAK,mBAAmB,kBAAA,CAAmB,OAAA,CAAQ,WAAW,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,QACvG,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,KAAK,IAAA,CAAK,IAAA,CAAK,mBAAmB,kBAAA,CAAmB,IAAI,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAGpB;AACC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,IAAI,CAAC,CAAA,eAAA,CAAiB,CAAA;AACjG,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,eAAe,OAAA,EAQU;AAE3B,IAAA,MAAM,EAAE,OAAO,QAAA,EAAU,MAAA,EAAQ,OAAO,IAAA,EAAM,MAAA,EAAQ,OAAM,GAAI,OAAA;AAGhE,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAClD;AASA,IAAA,MAAM,KAAA,GAAQ;AAAA,MACV;AAAA,QACI,SAAA,EAAW,yBAAA;AAAA,QACX,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAI;AAC/B,KACJ;AAEA,IAAA,MAAM,OAAA,GAAmC;AAAA,MACrC;AAAA,KACJ;AAEA,IAAA,IAAI,QAAA,UAAkB,QAAA,GAAW,QAAA;AACjC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,MAAA,GAAS,MAAA;AAC3C,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,KAAA,GAAQ,KAAA;AACzC,IAAA,IAAI,IAAA,UAAc,IAAA,GAAO,IAAA;AACzB,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,MAAA,GAAS,MAAA;AAC3C,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,KAAA,GAAQ,KAAA;AAEzC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,yBAAyB,OAAO,CAAA;AACtE,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AACJ,CAAA;;;ACvNO,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,GAAA,CAAI,4BAA4B,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA;AAClG,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,EACzB;AAAA,EAEA,MAAM,uBAAuB,EAAA,EAA2B;AACpD,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,4BAA4B,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/E;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,SAA4BL,yBAAAA,CAA0C;AAAA,EAsD/E,WAAA,CAAY,MAAA,GAAuB,EAAC,EAAG;AACnC,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 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 * Extracts the service type from a chatGuid.\n * Expected format: \"service;-;address\" or \"service;+;groupId\"\n * e.g., \"iMessage;-;+1234567890\" -> \"iMessage\"\n * \"SMS;-;+1234567890\" -> \"SMS\"\n * \"any;-;+1234567890\" -> undefined (let server decide)\n *\n * Any prefix other than \"iMessage\" or \"SMS\" (case-insensitive) will return undefined,\n * allowing the server to decide the service type.\n */\nexport function extractService(chatGuid: string): \"iMessage\" | \"SMS\" | undefined {\n if (!chatGuid) return undefined;\n const prefix = chatGuid.split(\";\")[0]?.toLowerCase();\n if (prefix === \"imessage\") return \"iMessage\";\n if (prefix === \"sms\") return \"SMS\";\n return undefined;\n}\n\n/**\n * Creates a chat with an initial message.\n * Returns the created chat's GUID.\n */\nexport async function createChatWithMessage(options: {\n http: AxiosInstance;\n address: string;\n message: string;\n tempGuid?: string;\n subject?: string;\n effectId?: string;\n service?: \"iMessage\" | \"SMS\";\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId, service } = 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 ...(service && { service }),\n });\n return response.data.data?.guid;\n } catch (error) {\n throw new Error(\n `Failed to create chat with address \"${address}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport { extractAddress, extractService, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { AttachmentResponse, MessageResponse, SendAttachmentOptions, SendStickerOptions } from \"../types\";\n\nexport class AttachmentModule {\n constructor(\n private readonly http: AxiosInstance,\n private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n ) {}\n\n async getAttachmentCount(): Promise<number> {\n const response = await this.http.get(\"/api/v1/attachment/count\");\n return response.data.data.total;\n }\n\n async getAttachment(guid: string): Promise<AttachmentResponse> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async downloadAttachment(\n guid: string,\n options?: {\n original?: boolean;\n force?: boolean;\n height?: number;\n width?: number;\n quality?: number;\n },\n ): Promise<Buffer> {\n const params: Record<string, unknown> = {};\n if (options?.original !== undefined) params.original = options.original;\n if (options?.force !== undefined) params.force = options.force;\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/download`, {\n params,\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async downloadAttachmentLive(guid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/live`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getAttachmentBlurhash(\n guid: string,\n options?: { height?: number; width?: number; quality?: number },\n ): Promise<string> {\n const params: Record<string, unknown> = {};\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/blurhash`, {\n params,\n });\n return response.data.data.blurhash;\n }\n\n /**\n * Ensures the chat exists by creating it if it doesn't already exist.\n */\n private async ensureChatExists(chatGuid: string): Promise<void> {\n const address = extractAddress(chatGuid);\n if (!address) return;\n\n const service = extractService(chatGuid);\n await this.http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n ...(service && { service }),\n });\n }\n\n async sendAttachment(options: SendAttachmentOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileBuffer = await readFile(options.filePath);\n const fileName = options.fileName || path.basename(options.filePath);\n const tempGuid = randomUUID();\n\n const buildForm = () => {\n const form = new FormData();\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"tempGuid\", tempGuid);\n if (options.isAudioMessage !== undefined) {\n form.append(\"isAudioMessage\", options.isAudioMessage.toString());\n if (options.isAudioMessage) {\n form.append(\"method\", \"private-api\");\n }\n }\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n }\n return form;\n };\n\n try {\n const form = buildForm();\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return response.data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n await this.ensureChatExists(options.chatGuid);\n\n const form = buildForm();\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return response.data.data;\n }\n });\n }\n\n async sendSticker(options: SendStickerOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileName = options.fileName || path.basename(options.filePath);\n const fileBuffer = await readFile(options.filePath);\n\n const buildForm = () => {\n const form = new FormData();\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"isSticker\", \"true\");\n form.append(\"method\", \"private-api\"); // Sticker requires Private API\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n form.append(\"partIndex\", \"0\");\n form.append(\"stickerX\", String(options.stickerX ?? 0.5));\n form.append(\"stickerY\", String(options.stickerY ?? 0.5));\n form.append(\"stickerScale\", String(options.stickerScale ?? 0.75));\n form.append(\"stickerRotation\", String(options.stickerRotation ?? 0));\n form.append(\"stickerWidth\", String(options.stickerWidth ?? 300));\n }\n return form;\n };\n\n try {\n const form = buildForm();\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n await this.ensureChatExists(options.chatGuid);\n\n const form = buildForm();\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return data.data;\n }\n });\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport type { 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 markChatUnread(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/unread`);\n }\n\n async leaveChat(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/leave`);\n }\n\n async addParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n address,\n });\n return response.data.data;\n }\n\n async removeParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant/remove`, {\n address,\n });\n return response.data.data;\n }\n\n async getChatMessages(\n chatGuid: string,\n options?: {\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n },\n ): Promise<MessageResponse[]> {\n const params: Record<string, unknown> = {};\n if (options?.offset !== undefined) params.offset = options.offset;\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.sort) params.sort = options.sort;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.after !== undefined) params.after = options.after;\n if (options?.with) params.with = options.with.join(\",\");\n\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/message`, {\n params,\n });\n return response.data.data;\n }\n\n async setGroupIcon(chatGuid: string, filePath: string): Promise<void> {\n const fileBuffer = await readFile(filePath);\n const fileName = path.basename(filePath);\n const form = new FormData();\n form.append(\"icon\", fileBuffer, fileName);\n\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, form, {\n headers: form.getHeaders(),\n });\n }\n\n async removeGroupIcon(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`);\n }\n\n async getGroupIcon(chatGuid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getChatCount(options?: { includeArchived?: boolean }): Promise<{\n total: number;\n breakdown: Record<string, number>;\n }> {\n const response = await this.http.get(\"/api/v1/chat/count\", {\n params: options?.includeArchived !== undefined ? { includeArchived: options.includeArchived } : {},\n });\n return response.data.data;\n }\n\n async startTyping(chatGuid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async stopTyping(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async getBackground(chatGuid: string): Promise<{\n hasBackground: boolean;\n backgroundChannelGUID?: string | null;\n imageUrl?: string | null;\n backgroundId?: string | null;\n }> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);\n return response.data.data;\n }\n\n async setBackground(\n chatGuid: string,\n options: string | { imageUrl?: string; filePath?: string; fileData?: string },\n ): Promise<void> {\n 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/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async getHandleAvailability(address: string, type: \"imessage\" | \"facetime\"): Promise<boolean> {\n const response = await this.http.get(`/api/v1/handle/availability/${type}`, {\n params: { address },\n });\n return response.data.data.available;\n }\n\n async getHandleFocusStatus(guid: string): Promise<string> {\n const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\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 { randomUUID } from \"node:crypto\";\nimport type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, extractService, 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 const service = extractService(options.chatGuid);\n\n await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n service,\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/${encodeURIComponent(guid)}`, {\n params: options?.with ? { with: options.with.join(\",\") } : {},\n });\n return response.data.data;\n }\n\n async getMessages(options?: {\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/query\", options ?? {});\n return response.data.data;\n }\n\n async getMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count\", { params });\n return response.data.data.total;\n }\n\n async getUpdatedMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/updated\", {\n params,\n });\n return response.data.data.total;\n }\n\n async getSentMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/me\", {\n params,\n });\n return response.data.data.total;\n }\n\n async editMessage(options: {\n messageGuid: string;\n editedMessage: string;\n backwardsCompatibilityMessage?: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/edit`, {\n editedMessage: options.editedMessage,\n backwardsCompatibilityMessage: options.backwardsCompatibilityMessage || options.editedMessage,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async sendReaction(options: {\n chatGuid: string;\n messageGuid: string;\n reaction: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(\"/api/v1/message/react\", {\n chatGuid: options.chatGuid,\n selectedMessageGuid: options.messageGuid,\n reaction: options.reaction,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async unsendMessage(options: { messageGuid: string; partIndex?: number }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/unsend`, {\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async notifyMessage(guid: string): Promise<void> {\n await this.http.post(`/api/v1/message/${encodeURIComponent(guid)}/notify`);\n }\n\n async getEmbeddedMedia(guid: string): Promise<{\n path?: string;\n data?: string;\n }> {\n const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}/embedded-media`);\n return response.data.data;\n }\n\n async searchMessages(options: {\n query: string;\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n }): Promise<MessageResponse[]> {\n // Use MessageRouter.query (POST /api/v1/message/query) and a message.text LIKE condition to perform server-side text search\n const { query, chatGuid, offset, limit, sort, before, after } = options;\n\n // Validate: empty query would match all messages\n if (!query || query.trim().length === 0) {\n throw new Error(\"Search query cannot be empty\");\n }\n\n // Note: We don't escape % and _ here because:\n // 1. Server uses Spotlight API (on macOS 13+) which is token-based, not substring-based.\n // - Matches \"Hello\" -> \"Hello world\" (Word match)\n // - No match \"Hell\" -> \"Hello\" (Partial word mismatch)\n // - Matches \"测试\" -> \"这是一个测试\" (Chinese token match)\n // 2. Spotlight doesn't understand SQL ESCAPE syntax.\n // 3. Parameterized queries already prevent SQL injection.\n const where = [\n {\n statement: \"message.text LIKE :text\",\n args: { text: `%${query}%` },\n },\n ];\n\n const payload: Record<string, unknown> = {\n where,\n };\n\n if (chatGuid) payload.chatGuid = chatGuid;\n if (offset !== undefined) payload.offset = offset;\n if (limit !== undefined) payload.limit = limit;\n if (sort) payload.sort = sort;\n if (before !== undefined) payload.before = before;\n if (after !== undefined) payload.after = after;\n\n const response = await this.http.post(\"/api/v1/message/query\", payload);\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AddPollOptionOptions, CreatePollOptions, PollMessageResponse, VotePollOptions } from \"../types/poll\";\n\nexport class PollModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async create(options: CreatePollOptions): Promise<PollMessageResponse> {\n if (options.options.length < 2) {\n throw new Error(\"Poll must have at least 2 options\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/create\", {\n chatGuid: options.chatGuid,\n title: options.title ?? \"\",\n options: options.options,\n });\n\n return data.data;\n }\n\n async vote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/vote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async unvote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/unvote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async addOption(options: AddPollOptionOptions): Promise<PollMessageResponse> {\n if (!options.optionText || options.optionText.trim().length === 0) {\n throw new Error(\"Option text cannot be empty\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/option\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionText: options.optionText,\n });\n\n return data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ScheduledMessageModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async createScheduledMessage(options: any): Promise<any> {\n const response = await this.http.post(\"/api/v1/message/schedule\", options);\n return response.data.data;\n }\n\n async getScheduledMessages(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/message/schedule\");\n return response.data.data;\n }\n\n async updateScheduledMessage(id: string, options: any): Promise<any> {\n const response = await this.http.put(`/api/v1/message/schedule/${encodeURIComponent(id)}`, options);\n return response.data.data;\n }\n\n async deleteScheduledMessage(id: string): Promise<void> {\n await this.http.delete(`/api/v1/message/schedule/${encodeURIComponent(id)}`);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ServerModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getServerInfo(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/info\");\n return response.data.data;\n }\n\n async getMessageStats(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/statistics/totals\");\n return response.data.data;\n }\n\n async getServerLogs(count?: number): Promise<string[]> {\n const response = await this.http.get(\"/api/v1/server/logs\", {\n params: count !== undefined ? { count } : {},\n });\n return response.data.data;\n }\n\n async getMediaStatistics(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media\", {\n params,\n });\n return response.data.data;\n }\n\n async getMediaStatisticsByChat(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media/chat\", {\n params,\n });\n return response.data.data;\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport io from \"socket.io-client\";\nimport { getLogger, setGlobalLogLevel } 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 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","../lib/auto-create-chat.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../modules/message.ts","../modules/poll.ts","../modules/scheduled.ts","../modules/server.ts","../client.ts","../events.ts","../lib/poll-utils.ts"],"names":["EventEmitter","path","os","fs","readFile","randomUUID","FormData","axios","io"],"mappings":"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","file":"index.cjs","sourcesContent":["import EventEmitter from \"node:events\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport class Logger extends EventEmitter {\n tag: string;\n private logLevel: LogLevel = \"info\";\n private logFile?: string;\n\n constructor(tag: string, level: LogLevel = \"info\", logToFile = true) {\n super();\n this.tag = tag;\n this.logLevel = level;\n\n if (logToFile) {\n 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 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 * Extracts the service type from a chatGuid.\n * Expected format: \"service;-;address\" or \"service;+;groupId\"\n * e.g., \"iMessage;-;+1234567890\" -> \"iMessage\"\n * \"SMS;-;+1234567890\" -> \"SMS\"\n * \"any;-;+1234567890\" -> undefined (let server decide)\n *\n * Any prefix other than \"iMessage\" or \"SMS\" (case-insensitive) will return undefined,\n * allowing the server to decide the service type.\n */\nexport function extractService(chatGuid: string): \"iMessage\" | \"SMS\" | undefined {\n if (!chatGuid) return undefined;\n const prefix = chatGuid.split(\";\")[0]?.toLowerCase();\n if (prefix === \"imessage\") return \"iMessage\";\n if (prefix === \"sms\") return \"SMS\";\n return undefined;\n}\n\n/**\n * Creates a chat with an initial message.\n * Returns the created chat's GUID.\n */\nexport async function createChatWithMessage(options: {\n http: AxiosInstance;\n address: string;\n message: string;\n tempGuid?: string;\n subject?: string;\n effectId?: string;\n service?: \"iMessage\" | \"SMS\";\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId, service } = 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 ...(service && { service }),\n });\n return response.data.data?.guid;\n } catch (error) {\n throw new Error(\n `Failed to create chat with address \"${address}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport { extractAddress, extractService, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { AttachmentResponse, MessageResponse, SendAttachmentOptions, SendStickerOptions } from \"../types\";\n\nexport class AttachmentModule {\n constructor(\n private readonly http: AxiosInstance,\n private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n ) {}\n\n async getAttachmentCount(): Promise<number> {\n const response = await this.http.get(\"/api/v1/attachment/count\");\n return response.data.data.total;\n }\n\n async getAttachment(guid: string): Promise<AttachmentResponse> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async downloadAttachment(\n guid: string,\n options?: {\n original?: boolean;\n force?: boolean;\n height?: number;\n width?: number;\n quality?: number;\n },\n ): Promise<Buffer> {\n const params: Record<string, unknown> = {};\n if (options?.original !== undefined) params.original = options.original;\n if (options?.force !== undefined) params.force = options.force;\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/download`, {\n params,\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async downloadAttachmentLive(guid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/live`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getAttachmentBlurhash(\n guid: string,\n options?: { height?: number; width?: number; quality?: number },\n ): Promise<string> {\n const params: Record<string, unknown> = {};\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/blurhash`, {\n params,\n });\n return response.data.data.blurhash;\n }\n\n /**\n * Ensures the chat exists by creating it if it doesn't already exist.\n */\n private async ensureChatExists(chatGuid: string): Promise<void> {\n const address = extractAddress(chatGuid);\n if (!address) return;\n\n const service = extractService(chatGuid);\n await this.http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n ...(service && { service }),\n });\n }\n\n async sendAttachment(options: SendAttachmentOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileBuffer = await readFile(options.filePath);\n const fileName = options.fileName || path.basename(options.filePath);\n const tempGuid = randomUUID();\n\n const buildForm = () => {\n const form = new FormData();\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"tempGuid\", tempGuid);\n if (options.isAudioMessage !== undefined) {\n form.append(\"isAudioMessage\", options.isAudioMessage.toString());\n if (options.isAudioMessage) {\n form.append(\"method\", \"private-api\");\n }\n }\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n }\n return form;\n };\n\n try {\n const form = buildForm();\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return response.data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n await this.ensureChatExists(options.chatGuid);\n\n const form = buildForm();\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return response.data.data;\n }\n });\n }\n\n async sendSticker(options: SendStickerOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileName = options.fileName || path.basename(options.filePath);\n const fileBuffer = await readFile(options.filePath);\n\n const buildForm = () => {\n const form = new FormData();\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"isSticker\", \"true\");\n form.append(\"method\", \"private-api\"); // Sticker requires Private API\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n form.append(\"partIndex\", \"0\");\n form.append(\"stickerX\", String(options.stickerX ?? 0.5));\n form.append(\"stickerY\", String(options.stickerY ?? 0.5));\n form.append(\"stickerScale\", String(options.stickerScale ?? 0.75));\n form.append(\"stickerRotation\", String(options.stickerRotation ?? 0));\n form.append(\"stickerWidth\", String(options.stickerWidth ?? 300));\n }\n return form;\n };\n\n try {\n const form = buildForm();\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n await this.ensureChatExists(options.chatGuid);\n\n const form = buildForm();\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return data.data;\n }\n });\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport type { 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 markChatUnread(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/unread`);\n }\n\n async leaveChat(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/leave`);\n }\n\n async addParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n address,\n });\n return response.data.data;\n }\n\n async removeParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant/remove`, {\n address,\n });\n return response.data.data;\n }\n\n async getChatMessages(\n chatGuid: string,\n options?: {\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n },\n ): Promise<MessageResponse[]> {\n const params: Record<string, unknown> = {};\n if (options?.offset !== undefined) params.offset = options.offset;\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.sort) params.sort = options.sort;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.after !== undefined) params.after = options.after;\n if (options?.with) params.with = options.with.join(\",\");\n\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/message`, {\n params,\n });\n return response.data.data;\n }\n\n async setGroupIcon(chatGuid: string, filePath: string): Promise<void> {\n const fileBuffer = await readFile(filePath);\n const fileName = path.basename(filePath);\n const form = new FormData();\n form.append(\"icon\", fileBuffer, fileName);\n\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, form, {\n headers: form.getHeaders(),\n });\n }\n\n async removeGroupIcon(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`);\n }\n\n async getGroupIcon(chatGuid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getChatCount(options?: { includeArchived?: boolean }): Promise<{\n total: number;\n breakdown: Record<string, number>;\n }> {\n const response = await this.http.get(\"/api/v1/chat/count\", {\n params: options?.includeArchived !== undefined ? { includeArchived: options.includeArchived } : {},\n });\n return response.data.data;\n }\n\n async startTyping(chatGuid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async stopTyping(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async getBackground(chatGuid: string): Promise<{\n hasBackground: boolean;\n backgroundChannelGUID?: string | null;\n imageUrl?: string | null;\n backgroundId?: string | null;\n }> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);\n return response.data.data;\n }\n\n async setBackground(\n chatGuid: string,\n options: string | { imageUrl?: string; filePath?: string; fileData?: string },\n ): Promise<void> {\n 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/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async getHandleAvailability(address: string, type: \"imessage\" | \"facetime\"): Promise<boolean> {\n const response = await this.http.get(`/api/v1/handle/availability/${type}`, {\n params: { address },\n });\n return response.data.data.available;\n }\n\n async getHandleFocusStatus(guid: string): Promise<string> {\n const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { FindMyLocationItem } from \"../types/findmy\";\n\nexport class ICloudModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getFindMyFriends(): Promise<FindMyLocationItem[]> {\n const response = await this.http.get(\"/api/v1/icloud/findmy/friends\");\n return response.data.data;\n }\n\n async refreshFindMyFriends(): Promise<FindMyLocationItem[]> {\n const response = await this.http.post(\"/api/v1/icloud/findmy/friends/refresh\");\n return response.data.data;\n }\n\n async getLocationForHandle(handle: string): Promise<FindMyLocationItem | null> {\n const friends = await this.getFindMyFriends();\n return friends.find((f) => f.handle === handle) ?? null;\n }\n\n async isHandleSharingLocation(handle: string): Promise<boolean> {\n const location = await this.getLocationForHandle(handle);\n return location !== null;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, extractService, 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 const service = extractService(options.chatGuid);\n\n await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n service,\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/${encodeURIComponent(guid)}`, {\n params: options?.with ? { with: options.with.join(\",\") } : {},\n });\n return response.data.data;\n }\n\n async getMessages(options?: {\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/query\", options ?? {});\n return response.data.data;\n }\n\n async getMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count\", { params });\n return response.data.data.total;\n }\n\n async getUpdatedMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/updated\", {\n params,\n });\n return response.data.data.total;\n }\n\n async getSentMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/me\", {\n params,\n });\n return response.data.data.total;\n }\n\n async editMessage(options: {\n messageGuid: string;\n editedMessage: string;\n backwardsCompatibilityMessage?: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/edit`, {\n editedMessage: options.editedMessage,\n backwardsCompatibilityMessage: options.backwardsCompatibilityMessage || options.editedMessage,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async sendReaction(options: {\n chatGuid: string;\n messageGuid: string;\n reaction: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(\"/api/v1/message/react\", {\n chatGuid: options.chatGuid,\n selectedMessageGuid: options.messageGuid,\n reaction: options.reaction,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async unsendMessage(options: { messageGuid: string; partIndex?: number }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/unsend`, {\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async notifyMessage(guid: string): Promise<void> {\n await this.http.post(`/api/v1/message/${encodeURIComponent(guid)}/notify`);\n }\n\n async getEmbeddedMedia(guid: string): Promise<{\n path?: string;\n data?: string;\n }> {\n const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}/embedded-media`);\n return response.data.data;\n }\n\n async searchMessages(options: {\n query: string;\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n }): Promise<MessageResponse[]> {\n // Use MessageRouter.query (POST /api/v1/message/query) and a message.text LIKE condition to perform server-side text search\n const { query, chatGuid, offset, limit, sort, before, after } = options;\n\n // Validate: empty query would match all messages\n if (!query || query.trim().length === 0) {\n throw new Error(\"Search query cannot be empty\");\n }\n\n // Note: We don't escape % and _ here because:\n // 1. Server uses Spotlight API (on macOS 13+) which is token-based, not substring-based.\n // - Matches \"Hello\" -> \"Hello world\" (Word match)\n // - No match \"Hell\" -> \"Hello\" (Partial word mismatch)\n // - Matches \"测试\" -> \"这是一个测试\" (Chinese token match)\n // 2. Spotlight doesn't understand SQL ESCAPE syntax.\n // 3. Parameterized queries already prevent SQL injection.\n const where = [\n {\n statement: \"message.text LIKE :text\",\n args: { text: `%${query}%` },\n },\n ];\n\n const payload: Record<string, unknown> = {\n where,\n };\n\n if (chatGuid) payload.chatGuid = chatGuid;\n if (offset !== undefined) payload.offset = offset;\n if (limit !== undefined) payload.limit = limit;\n if (sort) payload.sort = sort;\n if (before !== undefined) payload.before = before;\n if (after !== undefined) payload.after = after;\n\n const response = await this.http.post(\"/api/v1/message/query\", payload);\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AddPollOptionOptions, CreatePollOptions, PollMessageResponse, VotePollOptions } from \"../types/poll\";\n\nexport class PollModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async create(options: CreatePollOptions): Promise<PollMessageResponse> {\n if (options.options.length < 2) {\n throw new Error(\"Poll must have at least 2 options\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/create\", {\n chatGuid: options.chatGuid,\n title: options.title ?? \"\",\n options: options.options,\n });\n\n return data.data;\n }\n\n async vote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/vote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async unvote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/unvote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async addOption(options: AddPollOptionOptions): Promise<PollMessageResponse> {\n if (!options.optionText || options.optionText.trim().length === 0) {\n throw new Error(\"Option text cannot be empty\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/option\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionText: options.optionText,\n });\n\n return data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ScheduledMessageModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async createScheduledMessage(options: any): Promise<any> {\n const response = await this.http.post(\"/api/v1/message/schedule\", options);\n return response.data.data;\n }\n\n async getScheduledMessages(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/message/schedule\");\n return response.data.data;\n }\n\n async updateScheduledMessage(id: string, options: any): Promise<any> {\n const response = await this.http.put(`/api/v1/message/schedule/${encodeURIComponent(id)}`, options);\n return response.data.data;\n }\n\n async deleteScheduledMessage(id: string): Promise<void> {\n await this.http.delete(`/api/v1/message/schedule/${encodeURIComponent(id)}`);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ServerModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getServerInfo(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/info\");\n return response.data.data;\n }\n\n async getMessageStats(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/statistics/totals\");\n return response.data.data;\n }\n\n async getServerLogs(count?: number): Promise<string[]> {\n const response = await this.http.get(\"/api/v1/server/logs\", {\n params: count !== undefined ? { count } : {},\n });\n return response.data.data;\n }\n\n async getMediaStatistics(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media\", {\n params,\n });\n return response.data.data;\n }\n\n async getMediaStatisticsByChat(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media/chat\", {\n params,\n });\n return response.data.data;\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport io from \"socket.io-client\";\nimport { getLogger, setGlobalLogLevel } 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 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
|
@@ -224,8 +224,9 @@ interface FindMyLocationItem {
|
|
|
224
224
|
subtitle: string | null;
|
|
225
225
|
title: string | null;
|
|
226
226
|
last_updated: number;
|
|
227
|
-
is_locating_in_progress: 0 | 1;
|
|
227
|
+
is_locating_in_progress: 0 | 1 | boolean;
|
|
228
228
|
status: "legacy" | "live" | "shallow";
|
|
229
|
+
expiry?: number | null;
|
|
229
230
|
}
|
|
230
231
|
|
|
231
232
|
interface ScheduledMessageData {
|
|
@@ -519,8 +520,10 @@ declare class HandleModule {
|
|
|
519
520
|
declare class ICloudModule {
|
|
520
521
|
private readonly http;
|
|
521
522
|
constructor(http: AxiosInstance);
|
|
522
|
-
getFindMyFriends(): Promise<
|
|
523
|
-
refreshFindMyFriends(): Promise<
|
|
523
|
+
getFindMyFriends(): Promise<FindMyLocationItem[]>;
|
|
524
|
+
refreshFindMyFriends(): Promise<FindMyLocationItem[]>;
|
|
525
|
+
getLocationForHandle(handle: string): Promise<FindMyLocationItem | null>;
|
|
526
|
+
isHandleSharingLocation(handle: string): Promise<boolean>;
|
|
524
527
|
}
|
|
525
528
|
|
|
526
529
|
declare class MessageModule {
|
package/dist/index.d.ts
CHANGED
|
@@ -224,8 +224,9 @@ interface FindMyLocationItem {
|
|
|
224
224
|
subtitle: string | null;
|
|
225
225
|
title: string | null;
|
|
226
226
|
last_updated: number;
|
|
227
|
-
is_locating_in_progress: 0 | 1;
|
|
227
|
+
is_locating_in_progress: 0 | 1 | boolean;
|
|
228
228
|
status: "legacy" | "live" | "shallow";
|
|
229
|
+
expiry?: number | null;
|
|
229
230
|
}
|
|
230
231
|
|
|
231
232
|
interface ScheduledMessageData {
|
|
@@ -519,8 +520,10 @@ declare class HandleModule {
|
|
|
519
520
|
declare class ICloudModule {
|
|
520
521
|
private readonly http;
|
|
521
522
|
constructor(http: AxiosInstance);
|
|
522
|
-
getFindMyFriends(): Promise<
|
|
523
|
-
refreshFindMyFriends(): Promise<
|
|
523
|
+
getFindMyFriends(): Promise<FindMyLocationItem[]>;
|
|
524
|
+
refreshFindMyFriends(): Promise<FindMyLocationItem[]>;
|
|
525
|
+
getLocationForHandle(handle: string): Promise<FindMyLocationItem | null>;
|
|
526
|
+
isHandleSharingLocation(handle: string): Promise<boolean>;
|
|
524
527
|
}
|
|
525
528
|
|
|
526
529
|
declare class MessageModule {
|
package/dist/index.js
CHANGED
|
@@ -464,7 +464,16 @@ var ICloudModule = class {
|
|
|
464
464
|
return response.data.data;
|
|
465
465
|
}
|
|
466
466
|
async refreshFindMyFriends() {
|
|
467
|
-
await this.http.post("/api/v1/icloud/findmy/friends/refresh");
|
|
467
|
+
const response = await this.http.post("/api/v1/icloud/findmy/friends/refresh");
|
|
468
|
+
return response.data.data;
|
|
469
|
+
}
|
|
470
|
+
async getLocationForHandle(handle) {
|
|
471
|
+
const friends = await this.getFindMyFriends();
|
|
472
|
+
return friends.find((f) => f.handle === handle) ?? null;
|
|
473
|
+
}
|
|
474
|
+
async isHandleSharingLocation(handle) {
|
|
475
|
+
const location = await this.getLocationForHandle(handle);
|
|
476
|
+
return location !== null;
|
|
468
477
|
}
|
|
469
478
|
};
|
|
470
479
|
var MessageModule = class {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/Logger.ts","../lib/Loggable.ts","../lib/auto-create-chat.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../modules/message.ts","../modules/poll.ts","../modules/scheduled.ts","../modules/server.ts","../client.ts","../events.ts","../lib/poll-utils.ts"],"names":["EventEmitter","path","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 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 * Extracts the service type from a chatGuid.\n * Expected format: \"service;-;address\" or \"service;+;groupId\"\n * e.g., \"iMessage;-;+1234567890\" -> \"iMessage\"\n * \"SMS;-;+1234567890\" -> \"SMS\"\n * \"any;-;+1234567890\" -> undefined (let server decide)\n *\n * Any prefix other than \"iMessage\" or \"SMS\" (case-insensitive) will return undefined,\n * allowing the server to decide the service type.\n */\nexport function extractService(chatGuid: string): \"iMessage\" | \"SMS\" | undefined {\n if (!chatGuid) return undefined;\n const prefix = chatGuid.split(\";\")[0]?.toLowerCase();\n if (prefix === \"imessage\") return \"iMessage\";\n if (prefix === \"sms\") return \"SMS\";\n return undefined;\n}\n\n/**\n * Creates a chat with an initial message.\n * Returns the created chat's GUID.\n */\nexport async function createChatWithMessage(options: {\n http: AxiosInstance;\n address: string;\n message: string;\n tempGuid?: string;\n subject?: string;\n effectId?: string;\n service?: \"iMessage\" | \"SMS\";\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId, service } = 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 ...(service && { service }),\n });\n return response.data.data?.guid;\n } catch (error) {\n throw new Error(\n `Failed to create chat with address \"${address}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport { extractAddress, extractService, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { AttachmentResponse, MessageResponse, SendAttachmentOptions, SendStickerOptions } from \"../types\";\n\nexport class AttachmentModule {\n constructor(\n private readonly http: AxiosInstance,\n private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n ) {}\n\n async getAttachmentCount(): Promise<number> {\n const response = await this.http.get(\"/api/v1/attachment/count\");\n return response.data.data.total;\n }\n\n async getAttachment(guid: string): Promise<AttachmentResponse> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async downloadAttachment(\n guid: string,\n options?: {\n original?: boolean;\n force?: boolean;\n height?: number;\n width?: number;\n quality?: number;\n },\n ): Promise<Buffer> {\n const params: Record<string, unknown> = {};\n if (options?.original !== undefined) params.original = options.original;\n if (options?.force !== undefined) params.force = options.force;\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/download`, {\n params,\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async downloadAttachmentLive(guid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/live`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getAttachmentBlurhash(\n guid: string,\n options?: { height?: number; width?: number; quality?: number },\n ): Promise<string> {\n const params: Record<string, unknown> = {};\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/blurhash`, {\n params,\n });\n return response.data.data.blurhash;\n }\n\n /**\n * Ensures the chat exists by creating it if it doesn't already exist.\n */\n private async ensureChatExists(chatGuid: string): Promise<void> {\n const address = extractAddress(chatGuid);\n if (!address) return;\n\n const service = extractService(chatGuid);\n await this.http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n ...(service && { service }),\n });\n }\n\n async sendAttachment(options: SendAttachmentOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileBuffer = await readFile(options.filePath);\n const fileName = options.fileName || path.basename(options.filePath);\n const tempGuid = randomUUID();\n\n const buildForm = () => {\n const form = new FormData();\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"tempGuid\", tempGuid);\n if (options.isAudioMessage !== undefined) {\n form.append(\"isAudioMessage\", options.isAudioMessage.toString());\n if (options.isAudioMessage) {\n form.append(\"method\", \"private-api\");\n }\n }\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n }\n return form;\n };\n\n try {\n const form = buildForm();\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return response.data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n await this.ensureChatExists(options.chatGuid);\n\n const form = buildForm();\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return response.data.data;\n }\n });\n }\n\n async sendSticker(options: SendStickerOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileName = options.fileName || path.basename(options.filePath);\n const fileBuffer = await readFile(options.filePath);\n\n const buildForm = () => {\n const form = new FormData();\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"isSticker\", \"true\");\n form.append(\"method\", \"private-api\"); // Sticker requires Private API\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n form.append(\"partIndex\", \"0\");\n form.append(\"stickerX\", String(options.stickerX ?? 0.5));\n form.append(\"stickerY\", String(options.stickerY ?? 0.5));\n form.append(\"stickerScale\", String(options.stickerScale ?? 0.75));\n form.append(\"stickerRotation\", String(options.stickerRotation ?? 0));\n form.append(\"stickerWidth\", String(options.stickerWidth ?? 300));\n }\n return form;\n };\n\n try {\n const form = buildForm();\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n await this.ensureChatExists(options.chatGuid);\n\n const form = buildForm();\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return data.data;\n }\n });\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport type { 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 markChatUnread(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/unread`);\n }\n\n async leaveChat(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/leave`);\n }\n\n async addParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n address,\n });\n return response.data.data;\n }\n\n async removeParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant/remove`, {\n address,\n });\n return response.data.data;\n }\n\n async getChatMessages(\n chatGuid: string,\n options?: {\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n },\n ): Promise<MessageResponse[]> {\n const params: Record<string, unknown> = {};\n if (options?.offset !== undefined) params.offset = options.offset;\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.sort) params.sort = options.sort;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.after !== undefined) params.after = options.after;\n if (options?.with) params.with = options.with.join(\",\");\n\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/message`, {\n params,\n });\n return response.data.data;\n }\n\n async setGroupIcon(chatGuid: string, filePath: string): Promise<void> {\n const fileBuffer = await readFile(filePath);\n const fileName = path.basename(filePath);\n const form = new FormData();\n form.append(\"icon\", fileBuffer, fileName);\n\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, form, {\n headers: form.getHeaders(),\n });\n }\n\n async removeGroupIcon(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`);\n }\n\n async getGroupIcon(chatGuid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getChatCount(options?: { includeArchived?: boolean }): Promise<{\n total: number;\n breakdown: Record<string, number>;\n }> {\n const response = await this.http.get(\"/api/v1/chat/count\", {\n params: options?.includeArchived !== undefined ? { includeArchived: options.includeArchived } : {},\n });\n return response.data.data;\n }\n\n async startTyping(chatGuid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async stopTyping(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async getBackground(chatGuid: string): Promise<{\n hasBackground: boolean;\n backgroundChannelGUID?: string | null;\n imageUrl?: string | null;\n backgroundId?: string | null;\n }> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);\n return response.data.data;\n }\n\n async setBackground(\n chatGuid: string,\n options: string | { imageUrl?: string; filePath?: string; fileData?: string },\n ): Promise<void> {\n 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/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async getHandleAvailability(address: string, type: \"imessage\" | \"facetime\"): Promise<boolean> {\n const response = await this.http.get(`/api/v1/handle/availability/${type}`, {\n params: { address },\n });\n return response.data.data.available;\n }\n\n async getHandleFocusStatus(guid: string): Promise<string> {\n const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\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 { randomUUID } from \"node:crypto\";\nimport type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, extractService, 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 const service = extractService(options.chatGuid);\n\n await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n service,\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/${encodeURIComponent(guid)}`, {\n params: options?.with ? { with: options.with.join(\",\") } : {},\n });\n return response.data.data;\n }\n\n async getMessages(options?: {\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/query\", options ?? {});\n return response.data.data;\n }\n\n async getMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count\", { params });\n return response.data.data.total;\n }\n\n async getUpdatedMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/updated\", {\n params,\n });\n return response.data.data.total;\n }\n\n async getSentMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/me\", {\n params,\n });\n return response.data.data.total;\n }\n\n async editMessage(options: {\n messageGuid: string;\n editedMessage: string;\n backwardsCompatibilityMessage?: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/edit`, {\n editedMessage: options.editedMessage,\n backwardsCompatibilityMessage: options.backwardsCompatibilityMessage || options.editedMessage,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async sendReaction(options: {\n chatGuid: string;\n messageGuid: string;\n reaction: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(\"/api/v1/message/react\", {\n chatGuid: options.chatGuid,\n selectedMessageGuid: options.messageGuid,\n reaction: options.reaction,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async unsendMessage(options: { messageGuid: string; partIndex?: number }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/unsend`, {\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async notifyMessage(guid: string): Promise<void> {\n await this.http.post(`/api/v1/message/${encodeURIComponent(guid)}/notify`);\n }\n\n async getEmbeddedMedia(guid: string): Promise<{\n path?: string;\n data?: string;\n }> {\n const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}/embedded-media`);\n return response.data.data;\n }\n\n async searchMessages(options: {\n query: string;\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n }): Promise<MessageResponse[]> {\n // Use MessageRouter.query (POST /api/v1/message/query) and a message.text LIKE condition to perform server-side text search\n const { query, chatGuid, offset, limit, sort, before, after } = options;\n\n // Validate: empty query would match all messages\n if (!query || query.trim().length === 0) {\n throw new Error(\"Search query cannot be empty\");\n }\n\n // Note: We don't escape % and _ here because:\n // 1. Server uses Spotlight API (on macOS 13+) which is token-based, not substring-based.\n // - Matches \"Hello\" -> \"Hello world\" (Word match)\n // - No match \"Hell\" -> \"Hello\" (Partial word mismatch)\n // - Matches \"测试\" -> \"这是一个测试\" (Chinese token match)\n // 2. Spotlight doesn't understand SQL ESCAPE syntax.\n // 3. Parameterized queries already prevent SQL injection.\n const where = [\n {\n statement: \"message.text LIKE :text\",\n args: { text: `%${query}%` },\n },\n ];\n\n const payload: Record<string, unknown> = {\n where,\n };\n\n if (chatGuid) payload.chatGuid = chatGuid;\n if (offset !== undefined) payload.offset = offset;\n if (limit !== undefined) payload.limit = limit;\n if (sort) payload.sort = sort;\n if (before !== undefined) payload.before = before;\n if (after !== undefined) payload.after = after;\n\n const response = await this.http.post(\"/api/v1/message/query\", payload);\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AddPollOptionOptions, CreatePollOptions, PollMessageResponse, VotePollOptions } from \"../types/poll\";\n\nexport class PollModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async create(options: CreatePollOptions): Promise<PollMessageResponse> {\n if (options.options.length < 2) {\n throw new Error(\"Poll must have at least 2 options\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/create\", {\n chatGuid: options.chatGuid,\n title: options.title ?? \"\",\n options: options.options,\n });\n\n return data.data;\n }\n\n async vote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/vote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async unvote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/unvote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async addOption(options: AddPollOptionOptions): Promise<PollMessageResponse> {\n if (!options.optionText || options.optionText.trim().length === 0) {\n throw new Error(\"Option text cannot be empty\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/option\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionText: options.optionText,\n });\n\n return data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ScheduledMessageModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async createScheduledMessage(options: any): Promise<any> {\n const response = await this.http.post(\"/api/v1/message/schedule\", options);\n return response.data.data;\n }\n\n async getScheduledMessages(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/message/schedule\");\n return response.data.data;\n }\n\n async updateScheduledMessage(id: string, options: any): Promise<any> {\n const response = await this.http.put(`/api/v1/message/schedule/${encodeURIComponent(id)}`, options);\n return response.data.data;\n }\n\n async deleteScheduledMessage(id: string): Promise<void> {\n await this.http.delete(`/api/v1/message/schedule/${encodeURIComponent(id)}`);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ServerModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getServerInfo(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/info\");\n return response.data.data;\n }\n\n async getMessageStats(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/statistics/totals\");\n return response.data.data;\n }\n\n async getServerLogs(count?: number): Promise<string[]> {\n const response = await this.http.get(\"/api/v1/server/logs\", {\n params: count !== undefined ? { count } : {},\n });\n return response.data.data;\n }\n\n async getMediaStatistics(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media\", {\n params,\n });\n return response.data.data;\n }\n\n async getMediaStatisticsByChat(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media/chat\", {\n params,\n });\n return response.data.data;\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport io from \"socket.io-client\";\nimport { getLogger, setGlobalLogLevel } 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 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","../lib/auto-create-chat.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../modules/message.ts","../modules/poll.ts","../modules/scheduled.ts","../modules/server.ts","../client.ts","../events.ts","../lib/poll-utils.ts"],"names":["EventEmitter","path","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 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 * Extracts the service type from a chatGuid.\n * Expected format: \"service;-;address\" or \"service;+;groupId\"\n * e.g., \"iMessage;-;+1234567890\" -> \"iMessage\"\n * \"SMS;-;+1234567890\" -> \"SMS\"\n * \"any;-;+1234567890\" -> undefined (let server decide)\n *\n * Any prefix other than \"iMessage\" or \"SMS\" (case-insensitive) will return undefined,\n * allowing the server to decide the service type.\n */\nexport function extractService(chatGuid: string): \"iMessage\" | \"SMS\" | undefined {\n if (!chatGuid) return undefined;\n const prefix = chatGuid.split(\";\")[0]?.toLowerCase();\n if (prefix === \"imessage\") return \"iMessage\";\n if (prefix === \"sms\") return \"SMS\";\n return undefined;\n}\n\n/**\n * Creates a chat with an initial message.\n * Returns the created chat's GUID.\n */\nexport async function createChatWithMessage(options: {\n http: AxiosInstance;\n address: string;\n message: string;\n tempGuid?: string;\n subject?: string;\n effectId?: string;\n service?: \"iMessage\" | \"SMS\";\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId, service } = 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 ...(service && { service }),\n });\n return response.data.data?.guid;\n } catch (error) {\n throw new Error(\n `Failed to create chat with address \"${address}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport { extractAddress, extractService, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { AttachmentResponse, MessageResponse, SendAttachmentOptions, SendStickerOptions } from \"../types\";\n\nexport class AttachmentModule {\n constructor(\n private readonly http: AxiosInstance,\n private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n ) {}\n\n async getAttachmentCount(): Promise<number> {\n const response = await this.http.get(\"/api/v1/attachment/count\");\n return response.data.data.total;\n }\n\n async getAttachment(guid: string): Promise<AttachmentResponse> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async downloadAttachment(\n guid: string,\n options?: {\n original?: boolean;\n force?: boolean;\n height?: number;\n width?: number;\n quality?: number;\n },\n ): Promise<Buffer> {\n const params: Record<string, unknown> = {};\n if (options?.original !== undefined) params.original = options.original;\n if (options?.force !== undefined) params.force = options.force;\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/download`, {\n params,\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async downloadAttachmentLive(guid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/live`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getAttachmentBlurhash(\n guid: string,\n options?: { height?: number; width?: number; quality?: number },\n ): Promise<string> {\n const params: Record<string, unknown> = {};\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/blurhash`, {\n params,\n });\n return response.data.data.blurhash;\n }\n\n /**\n * Ensures the chat exists by creating it if it doesn't already exist.\n */\n private async ensureChatExists(chatGuid: string): Promise<void> {\n const address = extractAddress(chatGuid);\n if (!address) return;\n\n const service = extractService(chatGuid);\n await this.http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n ...(service && { service }),\n });\n }\n\n async sendAttachment(options: SendAttachmentOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileBuffer = await readFile(options.filePath);\n const fileName = options.fileName || path.basename(options.filePath);\n const tempGuid = randomUUID();\n\n const buildForm = () => {\n const form = new FormData();\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"tempGuid\", tempGuid);\n if (options.isAudioMessage !== undefined) {\n form.append(\"isAudioMessage\", options.isAudioMessage.toString());\n if (options.isAudioMessage) {\n form.append(\"method\", \"private-api\");\n }\n }\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n }\n return form;\n };\n\n try {\n const form = buildForm();\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return response.data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n await this.ensureChatExists(options.chatGuid);\n\n const form = buildForm();\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return response.data.data;\n }\n });\n }\n\n async sendSticker(options: SendStickerOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileName = options.fileName || path.basename(options.filePath);\n const fileBuffer = await readFile(options.filePath);\n\n const buildForm = () => {\n const form = new FormData();\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"isSticker\", \"true\");\n form.append(\"method\", \"private-api\"); // Sticker requires Private API\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n form.append(\"partIndex\", \"0\");\n form.append(\"stickerX\", String(options.stickerX ?? 0.5));\n form.append(\"stickerY\", String(options.stickerY ?? 0.5));\n form.append(\"stickerScale\", String(options.stickerScale ?? 0.75));\n form.append(\"stickerRotation\", String(options.stickerRotation ?? 0));\n form.append(\"stickerWidth\", String(options.stickerWidth ?? 300));\n }\n return form;\n };\n\n try {\n const form = buildForm();\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n await this.ensureChatExists(options.chatGuid);\n\n const form = buildForm();\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return data.data;\n }\n });\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport type { 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 markChatUnread(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/unread`);\n }\n\n async leaveChat(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/leave`);\n }\n\n async addParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n address,\n });\n return response.data.data;\n }\n\n async removeParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant/remove`, {\n address,\n });\n return response.data.data;\n }\n\n async getChatMessages(\n chatGuid: string,\n options?: {\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n },\n ): Promise<MessageResponse[]> {\n const params: Record<string, unknown> = {};\n if (options?.offset !== undefined) params.offset = options.offset;\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.sort) params.sort = options.sort;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.after !== undefined) params.after = options.after;\n if (options?.with) params.with = options.with.join(\",\");\n\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/message`, {\n params,\n });\n return response.data.data;\n }\n\n async setGroupIcon(chatGuid: string, filePath: string): Promise<void> {\n const fileBuffer = await readFile(filePath);\n const fileName = path.basename(filePath);\n const form = new FormData();\n form.append(\"icon\", fileBuffer, fileName);\n\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, form, {\n headers: form.getHeaders(),\n });\n }\n\n async removeGroupIcon(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`);\n }\n\n async getGroupIcon(chatGuid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getChatCount(options?: { includeArchived?: boolean }): Promise<{\n total: number;\n breakdown: Record<string, number>;\n }> {\n const response = await this.http.get(\"/api/v1/chat/count\", {\n params: options?.includeArchived !== undefined ? { includeArchived: options.includeArchived } : {},\n });\n return response.data.data;\n }\n\n async startTyping(chatGuid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async stopTyping(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n\n async getBackground(chatGuid: string): Promise<{\n hasBackground: boolean;\n backgroundChannelGUID?: string | null;\n imageUrl?: string | null;\n backgroundId?: string | null;\n }> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/background`);\n return response.data.data;\n }\n\n async setBackground(\n chatGuid: string,\n options: string | { imageUrl?: string; filePath?: string; fileData?: string },\n ): Promise<void> {\n 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/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async getHandleAvailability(address: string, type: \"imessage\" | \"facetime\"): Promise<boolean> {\n const response = await this.http.get(`/api/v1/handle/availability/${type}`, {\n params: { address },\n });\n return response.data.data.available;\n }\n\n async getHandleFocusStatus(guid: string): Promise<string> {\n const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { FindMyLocationItem } from \"../types/findmy\";\n\nexport class ICloudModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getFindMyFriends(): Promise<FindMyLocationItem[]> {\n const response = await this.http.get(\"/api/v1/icloud/findmy/friends\");\n return response.data.data;\n }\n\n async refreshFindMyFriends(): Promise<FindMyLocationItem[]> {\n const response = await this.http.post(\"/api/v1/icloud/findmy/friends/refresh\");\n return response.data.data;\n }\n\n async getLocationForHandle(handle: string): Promise<FindMyLocationItem | null> {\n const friends = await this.getFindMyFriends();\n return friends.find((f) => f.handle === handle) ?? null;\n }\n\n async isHandleSharingLocation(handle: string): Promise<boolean> {\n const location = await this.getLocationForHandle(handle);\n return location !== null;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, extractService, 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 const service = extractService(options.chatGuid);\n\n await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n service,\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/${encodeURIComponent(guid)}`, {\n params: options?.with ? { with: options.with.join(\",\") } : {},\n });\n return response.data.data;\n }\n\n async getMessages(options?: {\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/query\", options ?? {});\n return response.data.data;\n }\n\n async getMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count\", { params });\n return response.data.data.total;\n }\n\n async getUpdatedMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/updated\", {\n params,\n });\n return response.data.data.total;\n }\n\n async getSentMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/me\", {\n params,\n });\n return response.data.data.total;\n }\n\n async editMessage(options: {\n messageGuid: string;\n editedMessage: string;\n backwardsCompatibilityMessage?: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/edit`, {\n editedMessage: options.editedMessage,\n backwardsCompatibilityMessage: options.backwardsCompatibilityMessage || options.editedMessage,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async sendReaction(options: {\n chatGuid: string;\n messageGuid: string;\n reaction: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(\"/api/v1/message/react\", {\n chatGuid: options.chatGuid,\n selectedMessageGuid: options.messageGuid,\n reaction: options.reaction,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async unsendMessage(options: { messageGuid: string; partIndex?: number }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const response = await this.http.post(`/api/v1/message/${encodeURIComponent(options.messageGuid)}/unsend`, {\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data;\n });\n }\n\n async notifyMessage(guid: string): Promise<void> {\n await this.http.post(`/api/v1/message/${encodeURIComponent(guid)}/notify`);\n }\n\n async getEmbeddedMedia(guid: string): Promise<{\n path?: string;\n data?: string;\n }> {\n const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}/embedded-media`);\n return response.data.data;\n }\n\n async searchMessages(options: {\n query: string;\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n }): Promise<MessageResponse[]> {\n // Use MessageRouter.query (POST /api/v1/message/query) and a message.text LIKE condition to perform server-side text search\n const { query, chatGuid, offset, limit, sort, before, after } = options;\n\n // Validate: empty query would match all messages\n if (!query || query.trim().length === 0) {\n throw new Error(\"Search query cannot be empty\");\n }\n\n // Note: We don't escape % and _ here because:\n // 1. Server uses Spotlight API (on macOS 13+) which is token-based, not substring-based.\n // - Matches \"Hello\" -> \"Hello world\" (Word match)\n // - No match \"Hell\" -> \"Hello\" (Partial word mismatch)\n // - Matches \"测试\" -> \"这是一个测试\" (Chinese token match)\n // 2. Spotlight doesn't understand SQL ESCAPE syntax.\n // 3. Parameterized queries already prevent SQL injection.\n const where = [\n {\n statement: \"message.text LIKE :text\",\n args: { text: `%${query}%` },\n },\n ];\n\n const payload: Record<string, unknown> = {\n where,\n };\n\n if (chatGuid) payload.chatGuid = chatGuid;\n if (offset !== undefined) payload.offset = offset;\n if (limit !== undefined) payload.limit = limit;\n if (sort) payload.sort = sort;\n if (before !== undefined) payload.before = before;\n if (after !== undefined) payload.after = after;\n\n const response = await this.http.post(\"/api/v1/message/query\", payload);\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AddPollOptionOptions, CreatePollOptions, PollMessageResponse, VotePollOptions } from \"../types/poll\";\n\nexport class PollModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async create(options: CreatePollOptions): Promise<PollMessageResponse> {\n if (options.options.length < 2) {\n throw new Error(\"Poll must have at least 2 options\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/create\", {\n chatGuid: options.chatGuid,\n title: options.title ?? \"\",\n options: options.options,\n });\n\n return data.data;\n }\n\n async vote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/vote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async unvote(options: VotePollOptions): Promise<PollMessageResponse> {\n const { data } = await this.http.post(\"/api/v1/poll/unvote\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionIdentifier: options.optionIdentifier,\n });\n\n return data.data;\n }\n\n async addOption(options: AddPollOptionOptions): Promise<PollMessageResponse> {\n if (!options.optionText || options.optionText.trim().length === 0) {\n throw new Error(\"Option text cannot be empty\");\n }\n\n const { data } = await this.http.post(\"/api/v1/poll/option\", {\n chatGuid: options.chatGuid,\n pollMessageGuid: options.pollMessageGuid,\n optionText: options.optionText,\n });\n\n return data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ScheduledMessageModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async createScheduledMessage(options: any): Promise<any> {\n const response = await this.http.post(\"/api/v1/message/schedule\", options);\n return response.data.data;\n }\n\n async getScheduledMessages(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/message/schedule\");\n return response.data.data;\n }\n\n async updateScheduledMessage(id: string, options: any): Promise<any> {\n const response = await this.http.put(`/api/v1/message/schedule/${encodeURIComponent(id)}`, options);\n return response.data.data;\n }\n\n async deleteScheduledMessage(id: string): Promise<void> {\n await this.http.delete(`/api/v1/message/schedule/${encodeURIComponent(id)}`);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ServerModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getServerInfo(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/info\");\n return response.data.data;\n }\n\n async getMessageStats(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/statistics/totals\");\n return response.data.data;\n }\n\n async getServerLogs(count?: number): Promise<string[]> {\n const response = await this.http.get(\"/api/v1/server/logs\", {\n params: count !== undefined ? { count } : {},\n });\n return response.data.data;\n }\n\n async getMediaStatistics(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media\", {\n params,\n });\n return response.data.data;\n }\n\n async getMediaStatisticsByChat(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media/chat\", {\n params,\n });\n return response.data.data;\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport io from \"socket.io-client\";\nimport { getLogger, setGlobalLogLevel } 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 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"]}
|