whalibmob 5.5.73 → 5.5.75

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.
@@ -44,12 +44,18 @@ function jidStrToObj(jidStr) {
44
44
  if (server === 's.whatsapp.net' && device > 0) {
45
45
  return { user, agent: 0, device, server, toString() { return self; } };
46
46
  }
47
- // @lid multi-device (e.g. "112713111982325:2@lid"): JID_PAIR with user="112713111982325:2"
48
- // so the server receives the colon-device in the user string, not stripped.
49
- // Without this, ":2@lid" is encoded as device-0 "@lid" and the server
50
- // returns the wrong bundle (or ignores device 2 entirely).
47
+ // @lid multi-device (e.g. "112713111982325:2@lid"): AD_JID with the domain in
48
+ // the agent byte — 1 for lid, matching Baileys' writeJid, which emits AD_JID
49
+ // with domainType whenever a device is present.
50
+ //
51
+ // This previously packed the device into the user string as a JID_PAIR
52
+ // ("112713111982325:2"), a workaround from when the encoder could not express
53
+ // a LID agent at all and would otherwise have flattened the JID to device 0.
54
+ // The server does not recognise that shape: a prekey IQ addressed with it got
55
+ // no reply whatsoever and timed out, so no session was ever built for the
56
+ // contact's linked devices and sends failed with NO_OPEN_SESSION.
51
57
  if (server === 'lid' && device > 0) {
52
- return { user: raw, server, toString() { return self; } };
58
+ return { user, agent: 1, device, server, toString() { return self; } };
53
59
  }
54
60
  // JID_PAIR: used for @lid device-0, @g.us, and primary (device-0) @s.whatsapp.net
55
61
  return { user, server, toString() { return self; } };
@@ -749,8 +755,37 @@ class DeviceManager {
749
755
  }
750
756
 
751
757
  if (allowPkmsg && fetchJids.length > 0) {
752
- const bundles = await this.fetchBundles(fetchJids);
753
- for (const [jid, bundle] of bundles) {
758
+ // Ask for the bundles by phone JID. The encrypt IQ is not answered at all
759
+ // when its <user> entries are @lid — it just times out — while the same
760
+ // request in phone form comes back in full. Translate through the known
761
+ // LID→PN mapping, keeping a link back so each bundle is installed under
762
+ // the LID address the participants node will use.
763
+ const pnForLid = this._client._lidToPn && this._client._lidToPn.get(lidUser);
764
+ const wireToLid = new Map();
765
+ let wireJids = fetchJids;
766
+ if (pnForLid) {
767
+ wireJids = fetchJids.map(j => {
768
+ const at = j.indexOf('@');
769
+ const base = at >= 0 ? j.slice(0, at) : j;
770
+ const colon = base.indexOf(':');
771
+ const dev = colon >= 0 ? (parseInt(base.slice(colon + 1), 10) || 0) : 0;
772
+ const wire = makeDeviceJid(pnForLid, dev, 's.whatsapp.net');
773
+ wireToLid.set(wire, j);
774
+ return wire;
775
+ });
776
+ _whaDbg('[DBG] LID_BUNDLE_VIA_PN lid=' + lidUser + ' pn=' + pnForLid +
777
+ ' jids=[' + wireJids.join(',') + ']\n');
778
+ } else {
779
+ _whaDbg('[DBG] LID_BUNDLE_NO_PN lid=' + lidUser + ' — requesting by LID\n');
780
+ }
781
+
782
+ const bundles = await this.fetchBundles(wireJids);
783
+ for (const [wireJid, bundle] of bundles) {
784
+ // Install under the @lid address: that is what the outgoing
785
+ // participants node — and therefore the encrypt step — looks the
786
+ // session up by. Stored under the phone user it is a different Signal
787
+ // address and would never be found.
788
+ const jid = wireToLid.get(wireJid) || wireJid;
754
789
  try {
755
790
  await signalProto.buildSessionFromBundle(jid, bundle);
756
791
  // ── CRITICAL: remap bundle JID back to @lid format ────────────────────
@@ -760,14 +795,13 @@ class DeviceManager {
760
795
  // nodes to also use @lid format — mixing @s.whatsapp.net participants with
761
796
  // a @lid routing address causes the server to close the connection.
762
797
  //
763
- // The Signal session address is keyed only by (user, device) — the @server
764
- // suffix is stripped by jidToAddress() — so the session is reachable via
765
- // either @lid or @s.whatsapp.net. We push the @lid form so the participants
766
- // node is consistent with the routing.
767
- //
768
- // Mapping: strip @s.whatsapp.net / @lid suffix from jid, re-append @lid
769
- // e.g. "112713111982325@s.whatsapp.net" → "112713111982325@lid"
770
- // "112713111982325:2@s.whatsapp.net" → "112713111982325:2@lid"
798
+ // A Signal address is (user, device) with the @server stripped — but
799
+ // the user of a LID and the user of a phone JID are different strings,
800
+ // so a session is NOT reachable under both. That assumption is what
801
+ // left sends failing: bundles fetched in phone form were stored under
802
+ // the phone user while the participants node looked them up by LID.
803
+ // The session is installed under the @lid address above; this only
804
+ // normalises the JID pushed into readyJids.
771
805
  const jidBase = jid.replace(/@(?:s\.whatsapp\.net|lid)$/, '');
772
806
  const lidJidForDevice = jidBase + '@lid';
773
807
  readyJids.push(lidJidForDevice);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whalibmob",
3
- "version": "5.5.73",
3
+ "version": "5.5.75",
4
4
  "description": "WhatsApp library for interaction with WhatsApp Mobile API no web",
5
5
  "author": "Kunboruto50",
6
6
  "main": "index.js",