@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 +1 -0
- package/dist/index.cjs +53 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +53 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
55
|
-
|
|
56
|
-
fs__namespace.
|
|
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
|