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/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 (waitingResolver) {
6231
- waitingResolver(null);
6232
- waitingResolver = null;
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 api = this.requireApi();
8086
- const appState = api.getAppState?.() || [];
8087
- const cookieStr = appState.map((c) => `${c.key}=${c.value}`).join("; ");
8088
- this.icdcService.setCookies(cookieStr);
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
- await noiseSocket.connect(ds.noiseKeyPriv, clientPayload);
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);