fb-messenger-e2ee 0.1.5 → 0.1.6
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/DOCS.md +2 -2
- package/README.md +2 -2
- package/dist/index.cjs +33 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +33 -15
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -6001,6 +6001,9 @@ var EncryptedFrameSocket = class {
|
|
|
6001
6001
|
const len = header.readUIntBE(0, 3);
|
|
6002
6002
|
logger.debug("FacebookE2EESocket", `RAW frame header: ${header.toString("hex")} (len=${len})`);
|
|
6003
6003
|
const payload = await this.ws.readRaw(len);
|
|
6004
|
+
if (!payload) {
|
|
6005
|
+
throw new Error("Socket closed while reading frame payload");
|
|
6006
|
+
}
|
|
6004
6007
|
try {
|
|
6005
6008
|
const decrypted = this.decryptFrame(payload);
|
|
6006
6009
|
logger.debug("FacebookE2EESocket", `Decrypt successful, result length: ${decrypted.length}`);
|
|
@@ -6140,11 +6143,12 @@ var FacebookE2EESocket = class extends EventEmitter2 {
|
|
|
6140
6143
|
url;
|
|
6141
6144
|
heartbeatInterval = null;
|
|
6142
6145
|
isConnected = false;
|
|
6146
|
+
cookieHeader = "";
|
|
6143
6147
|
constructor(endpoint) {
|
|
6144
6148
|
super();
|
|
6145
6149
|
this.url = endpoint;
|
|
6146
6150
|
}
|
|
6147
|
-
async connect(noisePrivKey, authPayload) {
|
|
6151
|
+
async connect(noisePrivKey, authPayload, cookies) {
|
|
6148
6152
|
return new Promise((resolve, reject) => {
|
|
6149
6153
|
try {
|
|
6150
6154
|
let readFromBuffer2 = function(len) {
|
|
@@ -6169,19 +6173,25 @@ var FacebookE2EESocket = class extends EventEmitter2 {
|
|
|
6169
6173
|
return res;
|
|
6170
6174
|
};
|
|
6171
6175
|
var readFromBuffer = readFromBuffer2;
|
|
6176
|
+
if (cookies) this.cookieHeader = cookies;
|
|
6172
6177
|
const wsUrl = new URL(this.url);
|
|
6173
6178
|
wsUrl.searchParams.set("cid", "client-" + Date.now());
|
|
6174
6179
|
const UserAgentStr = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36";
|
|
6180
|
+
const wsHeaders = {
|
|
6181
|
+
"Origin": "https://www.facebook.com",
|
|
6182
|
+
"User-Agent": UserAgentStr
|
|
6183
|
+
};
|
|
6184
|
+
if (this.cookieHeader) {
|
|
6185
|
+
wsHeaders["Cookie"] = this.cookieHeader;
|
|
6186
|
+
}
|
|
6175
6187
|
this.ws = new WebSocket(wsUrl.toString(), void 0, {
|
|
6176
|
-
headers:
|
|
6177
|
-
"Origin": "https://www.facebook.com",
|
|
6178
|
-
"User-Agent": UserAgentStr
|
|
6179
|
-
}
|
|
6188
|
+
headers: wsHeaders
|
|
6180
6189
|
});
|
|
6181
6190
|
this.ws.binaryType = "arraybuffer";
|
|
6182
6191
|
let handshakeResolved = false;
|
|
6183
6192
|
let streamBuffer = [];
|
|
6184
6193
|
let streamLen = 0;
|
|
6194
|
+
let waitingRejectFn = null;
|
|
6185
6195
|
let waitingResolver = null;
|
|
6186
6196
|
let waitingLen = 0;
|
|
6187
6197
|
this.ws.addEventListener("message", (ev) => {
|
|
@@ -6206,8 +6216,9 @@ var FacebookE2EESocket = class extends EventEmitter2 {
|
|
|
6206
6216
|
const targetLen = len || 0;
|
|
6207
6217
|
if (targetLen === 0) {
|
|
6208
6218
|
if (streamLen > 0) return Promise.resolve(readFromBuffer2(streamLen));
|
|
6209
|
-
return new Promise((resolve2) => {
|
|
6219
|
+
return new Promise((resolve2, reject2) => {
|
|
6210
6220
|
waitingLen = 1;
|
|
6221
|
+
waitingRejectFn = reject2;
|
|
6211
6222
|
waitingResolver = () => resolve2(readFromBuffer2(streamLen));
|
|
6212
6223
|
});
|
|
6213
6224
|
}
|
|
@@ -6217,8 +6228,9 @@ var FacebookE2EESocket = class extends EventEmitter2 {
|
|
|
6217
6228
|
if (this.ws?.readyState !== WebSocket.OPEN) {
|
|
6218
6229
|
return Promise.reject(new Error("WebSocket not open"));
|
|
6219
6230
|
}
|
|
6220
|
-
return new Promise((resolve2) => {
|
|
6231
|
+
return new Promise((resolve2, reject2) => {
|
|
6221
6232
|
waitingLen = targetLen;
|
|
6233
|
+
waitingRejectFn = reject2;
|
|
6222
6234
|
waitingResolver = resolve2;
|
|
6223
6235
|
});
|
|
6224
6236
|
},
|
|
@@ -6227,10 +6239,11 @@ var FacebookE2EESocket = class extends EventEmitter2 {
|
|
|
6227
6239
|
this.ws.addEventListener("close", () => {
|
|
6228
6240
|
this.isConnected = false;
|
|
6229
6241
|
this.stopHeartbeat();
|
|
6230
|
-
if (
|
|
6231
|
-
|
|
6232
|
-
|
|
6242
|
+
if (waitingRejectFn) {
|
|
6243
|
+
waitingRejectFn(new Error("WebSocket closed while waiting for data"));
|
|
6244
|
+
waitingRejectFn = null;
|
|
6233
6245
|
}
|
|
6246
|
+
waitingResolver = null;
|
|
6234
6247
|
this.emit("disconnected");
|
|
6235
6248
|
});
|
|
6236
6249
|
this.ws.addEventListener("open", async () => {
|
|
@@ -8082,10 +8095,10 @@ var ClientController = class {
|
|
|
8082
8095
|
logger.debug("ClientController", "Fetching CAT...");
|
|
8083
8096
|
const fbCat = await this.gateway.fetchCAT(this.requireApi());
|
|
8084
8097
|
if (!ds.jidDevice) {
|
|
8085
|
-
const
|
|
8086
|
-
const
|
|
8087
|
-
const
|
|
8088
|
-
this.icdcService.setCookies(
|
|
8098
|
+
const api2 = this.requireApi();
|
|
8099
|
+
const appState2 = api2.getAppState?.() || [];
|
|
8100
|
+
const cookieStr2 = appState2.map((c) => `${c.key}=${c.value}`).join("; ");
|
|
8101
|
+
this.icdcService.setCookies(cookieStr2);
|
|
8089
8102
|
logger.info("ClientController", "Registering new device via ICDC...");
|
|
8090
8103
|
const waDeviceId = await this.icdcService.register(userId, fbCat, "2220391788200892", ds);
|
|
8091
8104
|
ds.jidDevice = waDeviceId;
|
|
@@ -8134,7 +8147,12 @@ var ClientController = class {
|
|
|
8134
8147
|
logger.error("E2EE", "Frame error:", err);
|
|
8135
8148
|
}
|
|
8136
8149
|
});
|
|
8137
|
-
|
|
8150
|
+
const api = this.requireApi();
|
|
8151
|
+
const appState = api.getAppState?.() || [];
|
|
8152
|
+
const cookieStr = appState.map((c) => `${c.key}=${c.value}`).join("; ");
|
|
8153
|
+
logger.info("ClientController", "FCA appState length:", appState.length);
|
|
8154
|
+
logger.info("ClientController", "Cookie string snippet:", cookieStr.substring(0, 100));
|
|
8155
|
+
await noiseSocket.connect(ds.noiseKeyPriv, clientPayload, cookieStr || void 0);
|
|
8138
8156
|
this.e2eeSocket = noiseSocket;
|
|
8139
8157
|
await new Promise((resolve, reject) => {
|
|
8140
8158
|
const timeout = setTimeout(() => reject(new Error("Handshake timeout")), 1e4);
|