@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/README.md CHANGED
@@ -94,6 +94,7 @@ interface ClientConfig {
94
94
  serverUrl?: string; // Server URL, defaults to "http://localhost:1234"
95
95
  apiKey?: string; // API key (if server requires authentication)
96
96
  logLevel?: "debug" | "info" | "warn" | "error"; // Log level, defaults to "info"
97
+ logToFile?: boolean; // Enable writing logs to ~/Library/Logs/AdvancedIMessageKit (default true)
97
98
  }
98
99
  ```
99
100
 
package/dist/index.cjs CHANGED
@@ -51,11 +51,14 @@ var Logger = class extends EventEmitter__default.default {
51
51
  this.tag = tag;
52
52
  this.logLevel = level;
53
53
  if (logToFile) {
54
- const logDir = path__namespace.join(os__namespace.homedir(), "Library", "Logs", "AdvancedIMessageKit");
55
- if (!fs__namespace.existsSync(logDir)) {
56
- fs__namespace.mkdirSync(logDir, { recursive: true });
54
+ try {
55
+ const logDir = path__namespace.join(os__namespace.homedir(), "Library", "Logs", "AdvancedIMessageKit");
56
+ if (!fs__namespace.existsSync(logDir)) {
57
+ fs__namespace.mkdirSync(logDir, { recursive: true });
58
+ }
59
+ this.logFile = path__namespace.join(logDir, "sdk.log");
60
+ } catch {
57
61
  }
58
- this.logFile = path__namespace.join(logDir, "sdk.log");
59
62
  }
60
63
  }
61
64
  setLogLevel(level) {
@@ -120,16 +123,20 @@ var Logger = class extends EventEmitter__default.default {
120
123
  // lib/Loggable.ts
121
124
  var loggers = {};
122
125
  var globalLogLevel = "info";
126
+ var globalLogToFile = true;
123
127
  var setGlobalLogLevel = (level) => {
124
128
  globalLogLevel = level;
125
129
  Object.values(loggers).forEach((logger) => {
126
130
  logger.setLogLevel(level);
127
131
  });
128
132
  };
133
+ var setGlobalLogToFile = (logToFile) => {
134
+ globalLogToFile = logToFile;
135
+ };
129
136
  var getLogger = (tag) => {
130
137
  let logger = loggers[tag];
131
138
  if (!logger) {
132
- logger = new Logger(tag, globalLogLevel);
139
+ logger = new Logger(tag, globalLogLevel, globalLogToFile);
133
140
  loggers[tag] = logger;
134
141
  }
135
142
  return logger;
@@ -769,6 +776,8 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter.Event
769
776
  // the same message content with different GUIDs due to unstable Socket.IO connections.
770
777
  // This is especially problematic when the polling transport causes connection issues.
771
778
  __publicField(this, "processedMessages", /* @__PURE__ */ new Set());
779
+ // Last message timestamp for reconnect recovery
780
+ __publicField(this, "lastMessageTime", 0);
772
781
  // Send queue for sequential message delivery
773
782
  //
774
783
  // Purpose: Ensure all outgoing messages (text, attachments, stickers, etc.) from
@@ -788,8 +797,12 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter.Event
788
797
  this.config = {
789
798
  serverUrl: "http://localhost:1234",
790
799
  logLevel: "info",
800
+ logToFile: true,
791
801
  ...config
792
802
  };
803
+ if (this.config.logToFile === false) {
804
+ setGlobalLogToFile(false);
805
+ }
793
806
  if (this.config.logLevel) {
794
807
  setGlobalLogLevel(this.config.logLevel);
795
808
  }
@@ -906,6 +919,9 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter.Event
906
919
  return;
907
920
  }
908
921
  this.processedMessages.add(message.guid);
922
+ if (message.dateCreated && message.dateCreated > this.lastMessageTime) {
923
+ this.lastMessageTime = message.dateCreated;
924
+ }
909
925
  }
910
926
  }
911
927
  if (args.length > 0) {
@@ -936,10 +952,11 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter.Event
936
952
  this.socket.io.on("reconnect_failed", () => {
937
953
  this.logger.error("All reconnection attempts failed");
938
954
  });
939
- this.socket.on("auth-ok", () => {
955
+ this.socket.on("auth-ok", async () => {
940
956
  this.logger.info("Authentication successful");
941
957
  if (!this.readyEmitted) {
942
958
  this.readyEmitted = true;
959
+ await this.recoverMissedMessages();
943
960
  this.emit("ready");
944
961
  }
945
962
  });
@@ -947,12 +964,13 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter.Event
947
964
  this.logger.error(`Authentication failed: ${error.message} ${error.reason ? `(${error.reason})` : ""}`);
948
965
  this.emit("error", new Error(`Authentication failed: ${error.message}`));
949
966
  });
950
- this.socket.on("connect", () => {
967
+ this.socket.on("connect", async () => {
951
968
  this.logger.info("Connected to iMessage server, waiting for authentication...");
952
969
  if (!this.config.apiKey) {
953
970
  this.logger.info("No API key provided, skipping authentication (legacy server mode)");
954
971
  if (!this.readyEmitted) {
955
972
  this.readyEmitted = true;
973
+ await this.recoverMissedMessages();
956
974
  this.emit("ready");
957
975
  }
958
976
  }
@@ -964,6 +982,33 @@ var _AdvancedIMessageKit = class _AdvancedIMessageKit extends EventEmitter.Event
964
982
  async close() {
965
983
  this.socket.disconnect();
966
984
  }
985
+ async recoverMissedMessages() {
986
+ if (this.lastMessageTime <= 0) return;
987
+ try {
988
+ const after = this.lastMessageTime;
989
+ const messages = await this.messages.getMessages({
990
+ after,
991
+ sort: "ASC",
992
+ limit: 100
993
+ });
994
+ if (messages.length === 0) {
995
+ this.logger.debug("No missed messages to recover");
996
+ return;
997
+ }
998
+ this.logger.info(`Recovering ${messages.length} missed message(s)`);
999
+ for (const msg of messages) {
1000
+ if (msg.guid && !this.processedMessages.has(msg.guid)) {
1001
+ this.processedMessages.add(msg.guid);
1002
+ if (msg.dateCreated && msg.dateCreated > this.lastMessageTime) {
1003
+ this.lastMessageTime = msg.dateCreated;
1004
+ }
1005
+ super.emit("new-message", msg);
1006
+ }
1007
+ }
1008
+ } catch (e) {
1009
+ this.logger.warn(`Failed to recover missed messages: ${e}`);
1010
+ }
1011
+ }
967
1012
  /**
968
1013
  * Clear processed message records (prevent memory leaks)
969
1014
  * @param maxSize Maximum number of messages to retain, default 1000
@@ -1218,5 +1263,6 @@ exports.isPollVote = isPollVote;
1218
1263
  exports.parsePollDefinition = parsePollDefinition;
1219
1264
  exports.parsePollVotes = parsePollVotes;
1220
1265
  exports.setGlobalLogLevel = setGlobalLogLevel;
1266
+ exports.setGlobalLogToFile = setGlobalLogToFile;
1221
1267
  //# sourceMappingURL=index.cjs.map
1222
1268
  //# sourceMappingURL=index.cjs.map