@photon-ai/advanced-imessage-kit 1.11.1 → 1.11.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -22,11 +22,14 @@ var Logger = class extends EventEmitter$1 {
22
22
  this.tag = tag;
23
23
  this.logLevel = level;
24
24
  if (logToFile) {
25
- const logDir = path.join(os.homedir(), "Library", "Logs", "AdvancedIMessageKit");
26
- if (!fs.existsSync(logDir)) {
27
- fs.mkdirSync(logDir, { recursive: true });
25
+ try {
26
+ const logDir = path.join(os.homedir(), "Library", "Logs", "AdvancedIMessageKit");
27
+ if (!fs.existsSync(logDir)) {
28
+ fs.mkdirSync(logDir, { recursive: true });
29
+ }
30
+ this.logFile = path.join(logDir, "sdk.log");
31
+ } catch {
28
32
  }
29
- this.logFile = path.join(logDir, "sdk.log");
30
33
  }
31
34
  }
32
35
  setLogLevel(level) {
@@ -91,16 +94,20 @@ var Logger = class extends EventEmitter$1 {
91
94
  // lib/Loggable.ts
92
95
  var loggers = {};
93
96
  var globalLogLevel = "info";
97
+ var globalLogToFile = true;
94
98
  var setGlobalLogLevel = (level) => {
95
99
  globalLogLevel = level;
96
100
  Object.values(loggers).forEach((logger) => {
97
101
  logger.setLogLevel(level);
98
102
  });
99
103
  };
104
+ var setGlobalLogToFile = (logToFile) => {
105
+ globalLogToFile = logToFile;
106
+ };
100
107
  var getLogger = (tag) => {
101
108
  let logger = loggers[tag];
102
109
  if (!logger) {
103
- logger = new Logger(tag, globalLogLevel);
110
+ logger = new Logger(tag, globalLogLevel, globalLogToFile);
104
111
  loggers[tag] = logger;
105
112
  }
106
113
  return logger;
@@ -740,6 +747,8 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter {
740
747
  // the same message content with different GUIDs due to unstable Socket.IO connections.
741
748
  // This is especially problematic when the polling transport causes connection issues.
742
749
  __publicField(this, "processedMessages", /* @__PURE__ */ new Set());
750
+ // Last message timestamp for reconnect recovery
751
+ __publicField(this, "lastMessageTime", 0);
743
752
  // Send queue for sequential message delivery
744
753
  //
745
754
  // Purpose: Ensure all outgoing messages (text, attachments, stickers, etc.) from
@@ -759,8 +768,12 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter {
759
768
  this.config = {
760
769
  serverUrl: "http://localhost:1234",
761
770
  logLevel: "info",
771
+ logToFile: true,
762
772
  ...config
763
773
  };
774
+ if (this.config.logToFile === false) {
775
+ setGlobalLogToFile(false);
776
+ }
764
777
  if (this.config.logLevel) {
765
778
  setGlobalLogLevel(this.config.logLevel);
766
779
  }
@@ -877,6 +890,9 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter {
877
890
  return;
878
891
  }
879
892
  this.processedMessages.add(message.guid);
893
+ if (message.dateCreated && message.dateCreated > this.lastMessageTime) {
894
+ this.lastMessageTime = message.dateCreated;
895
+ }
880
896
  }
881
897
  }
882
898
  if (args.length > 0) {
@@ -907,10 +923,11 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter {
907
923
  this.socket.io.on("reconnect_failed", () => {
908
924
  this.logger.error("All reconnection attempts failed");
909
925
  });
910
- this.socket.on("auth-ok", () => {
926
+ this.socket.on("auth-ok", async () => {
911
927
  this.logger.info("Authentication successful");
912
928
  if (!this.readyEmitted) {
913
929
  this.readyEmitted = true;
930
+ await this.recoverMissedMessages();
914
931
  this.emit("ready");
915
932
  }
916
933
  });
@@ -918,12 +935,13 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter {
918
935
  this.logger.error(`Authentication failed: ${error.message} ${error.reason ? `(${error.reason})` : ""}`);
919
936
  this.emit("error", new Error(`Authentication failed: ${error.message}`));
920
937
  });
921
- this.socket.on("connect", () => {
938
+ this.socket.on("connect", async () => {
922
939
  this.logger.info("Connected to iMessage server, waiting for authentication...");
923
940
  if (!this.config.apiKey) {
924
941
  this.logger.info("No API key provided, skipping authentication (legacy server mode)");
925
942
  if (!this.readyEmitted) {
926
943
  this.readyEmitted = true;
944
+ await this.recoverMissedMessages();
927
945
  this.emit("ready");
928
946
  }
929
947
  }
@@ -935,6 +953,33 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter {
935
953
  async close() {
936
954
  this.socket.disconnect();
937
955
  }
956
+ async recoverMissedMessages() {
957
+ if (this.lastMessageTime <= 0) return;
958
+ try {
959
+ const after = this.lastMessageTime;
960
+ const messages = await this.messages.getMessages({
961
+ after,
962
+ sort: "ASC",
963
+ limit: 100
964
+ });
965
+ if (messages.length === 0) {
966
+ this.logger.debug("No missed messages to recover");
967
+ return;
968
+ }
969
+ this.logger.info(`Recovering ${messages.length} missed message(s)`);
970
+ for (const msg of messages) {
971
+ if (msg.guid && !this.processedMessages.has(msg.guid)) {
972
+ this.processedMessages.add(msg.guid);
973
+ if (msg.dateCreated && msg.dateCreated > this.lastMessageTime) {
974
+ this.lastMessageTime = msg.dateCreated;
975
+ }
976
+ super.emit("new-message", msg);
977
+ }
978
+ }
979
+ } catch (e) {
980
+ this.logger.warn(`Failed to recover missed messages: ${e}`);
981
+ }
982
+ }
938
983
  /**
939
984
  * Clear processed message records (prevent memory leaks)
940
985
  * @param maxSize Maximum number of messages to retain, default 1000
@@ -1147,6 +1192,6 @@ function getPollOneLiner(message) {
1147
1192
  return "[Poll]";
1148
1193
  }
1149
1194
 
1150
- export { AdvancedIMessageKit, CHAT_READ_STATUS_CHANGED, FT_CALL_STATUS_CHANGED, GROUP_ICON_CHANGED, GROUP_ICON_REMOVED, GROUP_NAME_CHANGE, HELLO_WORLD, IMESSAGE_ALIASES_REMOVED, INCOMING_FACETIME, MESSAGE_SEND_ERROR, MESSAGE_UPDATED, NEW_FINDMY_LOCATION, NEW_MESSAGE, NEW_SERVER, PARTICIPANT_ADDED, PARTICIPANT_LEFT, PARTICIPANT_REMOVED, SCHEDULED_MESSAGE_CREATED, SCHEDULED_MESSAGE_DELETED, SCHEDULED_MESSAGE_ERROR, SCHEDULED_MESSAGE_SENT, SCHEDULED_MESSAGE_UPDATED, SDK, SERVER_UPDATE, SERVER_UPDATE_DOWNLOADING, SERVER_UPDATE_INSTALLING, SETTINGS_BACKUP_CREATED, SETTINGS_BACKUP_DELETED, SETTINGS_BACKUP_UPDATED, THEME_BACKUP_CREATED, THEME_BACKUP_DELETED, THEME_BACKUP_UPDATED, TYPING_INDICATOR, getLogger, getOptionTextById, getPollOneLiner, getPollSummary, isPollMessage, isPollVote, parsePollDefinition, parsePollVotes, setGlobalLogLevel };
1195
+ export { AdvancedIMessageKit, CHAT_READ_STATUS_CHANGED, FT_CALL_STATUS_CHANGED, GROUP_ICON_CHANGED, GROUP_ICON_REMOVED, GROUP_NAME_CHANGE, HELLO_WORLD, IMESSAGE_ALIASES_REMOVED, INCOMING_FACETIME, MESSAGE_SEND_ERROR, MESSAGE_UPDATED, NEW_FINDMY_LOCATION, NEW_MESSAGE, NEW_SERVER, PARTICIPANT_ADDED, PARTICIPANT_LEFT, PARTICIPANT_REMOVED, SCHEDULED_MESSAGE_CREATED, SCHEDULED_MESSAGE_DELETED, SCHEDULED_MESSAGE_ERROR, SCHEDULED_MESSAGE_SENT, SCHEDULED_MESSAGE_UPDATED, SDK, SERVER_UPDATE, SERVER_UPDATE_DOWNLOADING, SERVER_UPDATE_INSTALLING, SETTINGS_BACKUP_CREATED, SETTINGS_BACKUP_DELETED, SETTINGS_BACKUP_UPDATED, THEME_BACKUP_CREATED, THEME_BACKUP_DELETED, THEME_BACKUP_UPDATED, TYPING_INDICATOR, getLogger, getOptionTextById, getPollOneLiner, getPollSummary, isPollMessage, isPollVote, parsePollDefinition, parsePollVotes, setGlobalLogLevel, setGlobalLogToFile };
1151
1196
  //# sourceMappingURL=index.js.map
1152
1197
  //# sourceMappingURL=index.js.map