@alannxd/baileys 6.0.6 → 6.0.9

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.
Files changed (220) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +341 -286
  3. package/WAProto/GenerateStatics.sh +3 -0
  4. package/WAProto/WAProto.proto +6902 -0
  5. package/WAProto/fix-imports.js +85 -0
  6. package/WAProto/index.d.ts +79257 -0
  7. package/WAProto/index.js +205861 -60565
  8. package/engine-requirements.js +1 -1
  9. package/lib/Defaults/index.js +119 -136
  10. package/lib/Signal/Group/ciphertext-message.js +2 -5
  11. package/lib/Signal/Group/group-session-builder.js +7 -41
  12. package/lib/Signal/Group/group_cipher.js +37 -51
  13. package/lib/Signal/Group/index.js +12 -57
  14. package/lib/Signal/Group/keyhelper.js +7 -44
  15. package/lib/Signal/Group/sender-chain-key.js +7 -15
  16. package/lib/Signal/Group/sender-key-distribution-message.js +8 -11
  17. package/lib/Signal/Group/sender-key-message.js +9 -12
  18. package/lib/Signal/Group/sender-key-name.js +2 -5
  19. package/lib/Signal/Group/sender-key-record.js +9 -21
  20. package/lib/Signal/Group/sender-key-state.js +27 -42
  21. package/lib/Signal/Group/sender-message-key.js +4 -7
  22. package/lib/Signal/libsignal.js +347 -90
  23. package/lib/Signal/lid-mapping.js +277 -0
  24. package/lib/Socket/Client/index.js +3 -19
  25. package/lib/Socket/Client/types.js +11 -0
  26. package/lib/Socket/Client/websocket.js +54 -0
  27. package/lib/Socket/business.js +162 -43
  28. package/lib/Socket/chats.js +627 -427
  29. package/lib/Socket/communities.js +90 -80
  30. package/lib/Socket/groups.js +154 -161
  31. package/lib/Socket/index.js +11 -10
  32. package/lib/Socket/luxu.js +315 -469
  33. package/lib/Socket/messages-recv.js +1421 -615
  34. package/lib/Socket/messages-send.js +1150 -799
  35. package/lib/Socket/mex.js +42 -0
  36. package/lib/Socket/newsletter.js +152 -204
  37. package/lib/Socket/socket.js +544 -313
  38. package/lib/Store/index.js +10 -10
  39. package/lib/Store/keyed-db.js +108 -0
  40. package/lib/Store/make-cache-manager-store.js +43 -41
  41. package/lib/Store/make-in-memory-store.js +112 -341
  42. package/lib/Store/make-ordered-dictionary.js +14 -20
  43. package/lib/Store/object-repository.js +11 -6
  44. package/lib/Types/Auth.js +2 -2
  45. package/lib/Types/Bussines.js +2 -0
  46. package/lib/Types/Call.js +2 -2
  47. package/lib/Types/Chat.js +8 -4
  48. package/lib/Types/Contact.js +2 -2
  49. package/lib/Types/Events.js +2 -2
  50. package/lib/Types/GroupMetadata.js +2 -2
  51. package/lib/Types/Label.js +3 -5
  52. package/lib/Types/LabelAssociation.js +3 -5
  53. package/lib/Types/Message.js +11 -9
  54. package/lib/Types/Mex.js +37 -0
  55. package/lib/Types/Product.js +2 -2
  56. package/lib/Types/Signal.js +2 -2
  57. package/lib/Types/Socket.js +3 -2
  58. package/lib/Types/State.js +56 -2
  59. package/lib/Types/USync.js +2 -2
  60. package/lib/Types/index.js +15 -31
  61. package/lib/Utils/auth-utils.js +239 -143
  62. package/lib/Utils/browser-utils.js +48 -0
  63. package/lib/Utils/business.js +66 -69
  64. package/lib/Utils/chat-utils.js +396 -253
  65. package/lib/Utils/companion-reg-client-utils.js +35 -0
  66. package/lib/Utils/crypto.js +57 -90
  67. package/lib/Utils/decode-wa-message.js +236 -84
  68. package/lib/Utils/event-buffer.js +185 -77
  69. package/lib/Utils/generics.js +189 -209
  70. package/lib/Utils/history.js +93 -55
  71. package/lib/Utils/identity-change-handler.js +50 -0
  72. package/lib/Utils/index.js +23 -33
  73. package/lib/Utils/link-preview.js +16 -24
  74. package/lib/Utils/logger.js +3 -7
  75. package/lib/Utils/lt-hash.js +3 -46
  76. package/lib/Utils/make-mutex.js +24 -34
  77. package/lib/Utils/message-composer.js +273 -0
  78. package/lib/Utils/message-retry-manager.js +265 -0
  79. package/lib/Utils/messages-media.js +451 -482
  80. package/lib/Utils/messages.js +795 -369
  81. package/lib/Utils/noise-handler.js +145 -99
  82. package/lib/Utils/offline-node-processor.js +40 -0
  83. package/lib/Utils/pre-key-manager.js +106 -0
  84. package/lib/Utils/process-message.js +459 -150
  85. package/lib/Utils/reporting-utils.js +258 -0
  86. package/lib/Utils/signal.js +120 -72
  87. package/lib/Utils/stanza-ack.js +38 -0
  88. package/lib/Utils/sync-action-utils.js +49 -0
  89. package/lib/Utils/tc-token-utils.js +163 -0
  90. package/lib/Utils/use-multi-file-auth-state.js +29 -27
  91. package/lib/Utils/validate-connection.js +73 -99
  92. package/lib/WABinary/constants.js +1281 -20
  93. package/lib/WABinary/decode.js +52 -42
  94. package/lib/WABinary/encode.js +110 -155
  95. package/lib/WABinary/generic-utils.js +55 -49
  96. package/lib/WABinary/index.js +6 -21
  97. package/lib/WABinary/jid-utils.js +76 -40
  98. package/lib/WABinary/types.js +2 -2
  99. package/lib/WAM/BinaryInfo.js +2 -5
  100. package/lib/WAM/constants.js +19071 -11568
  101. package/lib/WAM/encode.js +17 -22
  102. package/lib/WAM/index.js +4 -19
  103. package/lib/WAUSync/Protocols/USyncContactProtocol.js +33 -13
  104. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +11 -14
  105. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +9 -12
  106. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +9 -13
  107. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
  108. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +20 -22
  109. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +13 -8
  110. package/lib/WAUSync/Protocols/index.js +6 -20
  111. package/lib/WAUSync/USyncQuery.js +44 -35
  112. package/lib/WAUSync/USyncUser.js +10 -5
  113. package/lib/WAUSync/index.js +4 -19
  114. package/lib/index.js +13 -36
  115. package/package.json +85 -51
  116. package/WAProto/fix-import.js +0 -29
  117. package/lib/Defaults/baileys-version.json +0 -3
  118. package/lib/Defaults/index.d.ts +0 -53
  119. package/lib/Defaults/phonenumber-mcc.json +0 -223
  120. package/lib/Signal/Group/ciphertext-message.d.ts +0 -9
  121. package/lib/Signal/Group/group-session-builder.d.ts +0 -14
  122. package/lib/Signal/Group/group_cipher.d.ts +0 -17
  123. package/lib/Signal/Group/index.d.ts +0 -11
  124. package/lib/Signal/Group/keyhelper.d.ts +0 -10
  125. package/lib/Signal/Group/queue-job.d.ts +0 -1
  126. package/lib/Signal/Group/queue-job.js +0 -57
  127. package/lib/Signal/Group/sender-chain-key.d.ts +0 -13
  128. package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -16
  129. package/lib/Signal/Group/sender-key-message.d.ts +0 -18
  130. package/lib/Signal/Group/sender-key-name.d.ts +0 -17
  131. package/lib/Signal/Group/sender-key-record.d.ts +0 -30
  132. package/lib/Signal/Group/sender-key-state.d.ts +0 -38
  133. package/lib/Signal/Group/sender-message-key.d.ts +0 -11
  134. package/lib/Signal/libsignal.d.ts +0 -3
  135. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -17
  136. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  137. package/lib/Socket/Client/index.d.ts +0 -3
  138. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
  139. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  140. package/lib/Socket/Client/web-socket-client.d.ts +0 -12
  141. package/lib/Socket/Client/web-socket-client.js +0 -62
  142. package/lib/Socket/business.d.ts +0 -171
  143. package/lib/Socket/chats.d.ts +0 -267
  144. package/lib/Socket/communities.d.ts +0 -180
  145. package/lib/Socket/groups.d.ts +0 -115
  146. package/lib/Socket/index.d.ts +0 -173
  147. package/lib/Socket/luxu.d.ts +0 -266
  148. package/lib/Socket/messages-recv.d.ts +0 -161
  149. package/lib/Socket/messages-send.d.ts +0 -183
  150. package/lib/Socket/newsletter.d.ts +0 -134
  151. package/lib/Socket/registration.d.ts +0 -267
  152. package/lib/Socket/registration.js +0 -166
  153. package/lib/Socket/socket.d.ts +0 -44
  154. package/lib/Socket/usync.d.ts +0 -36
  155. package/lib/Socket/usync.js +0 -70
  156. package/lib/Store/index.d.ts +0 -3
  157. package/lib/Store/make-cache-manager-store.d.ts +0 -13
  158. package/lib/Store/make-in-memory-store.d.ts +0 -118
  159. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  160. package/lib/Store/object-repository.d.ts +0 -10
  161. package/lib/Types/Auth.d.ts +0 -110
  162. package/lib/Types/Call.d.ts +0 -13
  163. package/lib/Types/Chat.d.ts +0 -102
  164. package/lib/Types/Contact.d.ts +0 -19
  165. package/lib/Types/Events.d.ts +0 -157
  166. package/lib/Types/GroupMetadata.d.ts +0 -55
  167. package/lib/Types/Label.d.ts +0 -35
  168. package/lib/Types/LabelAssociation.d.ts +0 -29
  169. package/lib/Types/Message.d.ts +0 -273
  170. package/lib/Types/Newsletter.d.ts +0 -103
  171. package/lib/Types/Newsletter.js +0 -38
  172. package/lib/Types/Product.d.ts +0 -78
  173. package/lib/Types/Signal.d.ts +0 -57
  174. package/lib/Types/Socket.d.ts +0 -111
  175. package/lib/Types/State.d.ts +0 -27
  176. package/lib/Types/USync.d.ts +0 -25
  177. package/lib/Types/index.d.ts +0 -57
  178. package/lib/Utils/auth-utils.d.ts +0 -18
  179. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  180. package/lib/Utils/baileys-event-stream.js +0 -63
  181. package/lib/Utils/business.d.ts +0 -22
  182. package/lib/Utils/chat-utils.d.ts +0 -71
  183. package/lib/Utils/crypto.d.ts +0 -41
  184. package/lib/Utils/decode-wa-message.d.ts +0 -19
  185. package/lib/Utils/event-buffer.d.ts +0 -35
  186. package/lib/Utils/generics.d.ts +0 -92
  187. package/lib/Utils/history.d.ts +0 -15
  188. package/lib/Utils/index.d.ts +0 -17
  189. package/lib/Utils/link-preview.d.ts +0 -21
  190. package/lib/Utils/logger.d.ts +0 -4
  191. package/lib/Utils/lt-hash.d.ts +0 -12
  192. package/lib/Utils/make-mutex.d.ts +0 -7
  193. package/lib/Utils/messages-media.d.ts +0 -116
  194. package/lib/Utils/messages.d.ts +0 -77
  195. package/lib/Utils/noise-handler.d.ts +0 -21
  196. package/lib/Utils/process-message.d.ts +0 -41
  197. package/lib/Utils/signal.d.ts +0 -32
  198. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
  199. package/lib/Utils/validate-connection.d.ts +0 -11
  200. package/lib/WABinary/constants.d.ts +0 -30
  201. package/lib/WABinary/decode.d.ts +0 -7
  202. package/lib/WABinary/encode.d.ts +0 -3
  203. package/lib/WABinary/generic-utils.d.ts +0 -17
  204. package/lib/WABinary/index.d.ts +0 -5
  205. package/lib/WABinary/jid-utils.d.ts +0 -31
  206. package/lib/WABinary/types.d.ts +0 -18
  207. package/lib/WAM/BinaryInfo.d.ts +0 -17
  208. package/lib/WAM/constants.d.ts +0 -38
  209. package/lib/WAM/encode.d.ts +0 -3
  210. package/lib/WAM/index.d.ts +0 -3
  211. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
  212. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
  213. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
  214. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
  215. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -25
  216. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -8
  217. package/lib/WAUSync/Protocols/index.d.ts +0 -4
  218. package/lib/WAUSync/USyncQuery.d.ts +0 -28
  219. package/lib/WAUSync/USyncUser.d.ts +0 -12
  220. package/lib/index.d.ts +0 -12
@@ -0,0 +1,277 @@
1
+ import { LRUCache } from 'lru-cache';
2
+ import { isHostedPnUser, isLidUser, isPnUser, jidDecode, jidNormalizedUser, WAJIDDomains } from '../WABinary/index.js';
3
+ export class LIDMappingStore {
4
+ constructor(keys, logger, pnToLIDFunc) {
5
+ this.mappingCache = new LRUCache({
6
+ ttl: 3 * 24 * 60 * 60 * 1000, // 7 days
7
+ ttlAutopurge: true,
8
+ updateAgeOnGet: true
9
+ });
10
+ this.inflightLIDLookups = new Map();
11
+ this.inflightPNLookups = new Map();
12
+ this.keys = keys;
13
+ this.pnToLIDFunc = pnToLIDFunc;
14
+ this.logger = logger;
15
+ }
16
+ async storeLIDPNMappings(pairs) {
17
+ if (pairs.length === 0)
18
+ return;
19
+ const validatedPairs = [];
20
+ for (const { lid, pn } of pairs) {
21
+ if (!((isLidUser(lid) && isPnUser(pn)) || (isPnUser(lid) && isLidUser(pn)))) {
22
+ this.logger.warn(`Invalid LID-PN mapping: ${lid}, ${pn}`);
23
+ continue;
24
+ }
25
+ const lidDecoded = jidDecode(lid);
26
+ const pnDecoded = jidDecode(pn);
27
+ if (!lidDecoded || !pnDecoded)
28
+ continue;
29
+ validatedPairs.push({ pnUser: pnDecoded.user, lidUser: lidDecoded.user });
30
+ }
31
+ if (validatedPairs.length === 0)
32
+ return;
33
+ const cacheMissSet = new Set();
34
+ const existingMappings = new Map();
35
+ for (const { pnUser } of validatedPairs) {
36
+ const cached = this.mappingCache.get(`pn:${pnUser}`);
37
+ if (cached) {
38
+ existingMappings.set(pnUser, cached);
39
+ }
40
+ else {
41
+ cacheMissSet.add(pnUser);
42
+ }
43
+ }
44
+ if (cacheMissSet.size > 0) {
45
+ const cacheMisses = [...cacheMissSet];
46
+ this.logger.trace(`Batch fetching ${cacheMisses.length} LID mappings from database`);
47
+ const stored = await this.keys.get('lid-mapping', cacheMisses);
48
+ for (const pnUser of cacheMisses) {
49
+ const existingLidUser = stored[pnUser];
50
+ if (existingLidUser) {
51
+ existingMappings.set(pnUser, existingLidUser);
52
+ this.mappingCache.set(`pn:${pnUser}`, existingLidUser);
53
+ this.mappingCache.set(`lid:${existingLidUser}`, pnUser);
54
+ }
55
+ }
56
+ }
57
+ const pairMap = {};
58
+ for (const { pnUser, lidUser } of validatedPairs) {
59
+ const existingLidUser = existingMappings.get(pnUser);
60
+ if (existingLidUser === lidUser) {
61
+ this.logger.debug({ pnUser, lidUser }, 'LID mapping already exists, skipping');
62
+ continue;
63
+ }
64
+ pairMap[pnUser] = lidUser;
65
+ }
66
+ if (Object.keys(pairMap).length === 0)
67
+ return;
68
+ this.logger.trace({ pairMap }, `Storing ${Object.keys(pairMap).length} pn mappings`);
69
+ const batchData = {};
70
+ for (const [pnUser, lidUser] of Object.entries(pairMap)) {
71
+ batchData[pnUser] = lidUser;
72
+ batchData[`${lidUser}_reverse`] = pnUser;
73
+ }
74
+ await this.keys.transaction(async () => {
75
+ await this.keys.set({ 'lid-mapping': batchData });
76
+ }, 'lid-mapping');
77
+ // Update cache after successful DB write
78
+ for (const [pnUser, lidUser] of Object.entries(pairMap)) {
79
+ this.mappingCache.set(`pn:${pnUser}`, lidUser);
80
+ this.mappingCache.set(`lid:${lidUser}`, pnUser);
81
+ }
82
+ }
83
+ async getLIDForPN(pn) {
84
+ return (await this.getLIDsForPNs([pn]))?.[0]?.lid || null;
85
+ }
86
+ async getLIDsForPNs(pns) {
87
+ if (pns.length === 0)
88
+ return null;
89
+ const sortedPns = [...new Set(pns)].sort();
90
+ const cacheKey = sortedPns.join(',');
91
+ const inflight = this.inflightLIDLookups.get(cacheKey);
92
+ if (inflight) {
93
+ this.logger.trace(`Coalescing getLIDsForPNs request for ${sortedPns.length} PNs`);
94
+ return inflight;
95
+ }
96
+ const promise = this._getLIDsForPNsImpl(pns);
97
+ this.inflightLIDLookups.set(cacheKey, promise);
98
+ try {
99
+ return await promise;
100
+ }
101
+ finally {
102
+ this.inflightLIDLookups.delete(cacheKey);
103
+ }
104
+ }
105
+ async _getLIDsForPNsImpl(pns) {
106
+ const usyncFetch = {};
107
+ const successfulPairs = {};
108
+ const pending = [];
109
+ const addResolvedPair = (pn, decoded, lidUser) => {
110
+ const normalizedLidUser = lidUser.toString();
111
+ if (!normalizedLidUser) {
112
+ this.logger.warn(`Invalid or empty LID user for PN ${pn}: lidUser = "${lidUser}"`);
113
+ return false;
114
+ }
115
+ // Push the PN device ID to the LID to maintain device separation
116
+ const pnDevice = decoded.device !== undefined ? decoded.device : 0;
117
+ const deviceSpecificLid = `${normalizedLidUser}${!!pnDevice ? `:${pnDevice}` : ``}@${decoded.server === 'hosted' ? 'hosted.lid' : 'lid'}`;
118
+ this.logger.trace(`getLIDForPN: ${pn} → ${deviceSpecificLid} (user mapping with device ${pnDevice})`);
119
+ successfulPairs[pn] = { lid: deviceSpecificLid, pn };
120
+ return true;
121
+ };
122
+ for (const pn of pns) {
123
+ if (!isPnUser(pn) && !isHostedPnUser(pn))
124
+ continue;
125
+ const decoded = jidDecode(pn);
126
+ if (!decoded)
127
+ continue;
128
+ const pnUser = decoded.user;
129
+ const cached = this.mappingCache.get(`pn:${pnUser}`);
130
+ if (cached && typeof cached === 'string') {
131
+ if (!addResolvedPair(pn, decoded, cached)) {
132
+ this.logger.warn(`Invalid entry for ${pn} (pair not resolved)`);
133
+ continue;
134
+ }
135
+ continue;
136
+ }
137
+ pending.push({ pn, pnUser, decoded });
138
+ }
139
+ if (pending.length) {
140
+ const pnUsers = [...new Set(pending.map(item => item.pnUser))];
141
+ const stored = await this.keys.get('lid-mapping', pnUsers);
142
+ for (const pnUser of pnUsers) {
143
+ const lidUser = stored[pnUser];
144
+ if (lidUser && typeof lidUser === 'string') {
145
+ this.mappingCache.set(`pn:${pnUser}`, lidUser);
146
+ this.mappingCache.set(`lid:${lidUser}`, pnUser);
147
+ }
148
+ }
149
+ for (const { pn, pnUser, decoded } of pending) {
150
+ const cached = this.mappingCache.get(`pn:${pnUser}`);
151
+ if (cached && typeof cached === 'string') {
152
+ if (!addResolvedPair(pn, decoded, cached)) {
153
+ this.logger.warn(`Invalid entry for ${pn} (pair not resolved)`);
154
+ continue;
155
+ }
156
+ }
157
+ else {
158
+ this.logger.trace(`No LID mapping found for PN user ${pnUser}; batch getting from USync`);
159
+ const device = decoded.device || 0;
160
+ let normalizedPn = jidNormalizedUser(pn);
161
+ if (isHostedPnUser(normalizedPn)) {
162
+ normalizedPn = `${pnUser}@s.whatsapp.net`;
163
+ }
164
+ if (!usyncFetch[normalizedPn]) {
165
+ usyncFetch[normalizedPn] = [device];
166
+ }
167
+ else {
168
+ usyncFetch[normalizedPn]?.push(device);
169
+ }
170
+ }
171
+ }
172
+ }
173
+ if (Object.keys(usyncFetch).length > 0) {
174
+ const result = await this.pnToLIDFunc?.(Object.keys(usyncFetch)); // this function already adds LIDs to mapping
175
+ if (result && result.length > 0) {
176
+ await this.storeLIDPNMappings(result);
177
+ for (const pair of result) {
178
+ const pnDecoded = jidDecode(pair.pn);
179
+ const pnUser = pnDecoded?.user;
180
+ if (!pnUser)
181
+ continue;
182
+ const lidUser = jidDecode(pair.lid)?.user;
183
+ if (!lidUser)
184
+ continue;
185
+ for (const device of usyncFetch[pair.pn]) {
186
+ const deviceSpecificLid = `${lidUser}${!!device ? `:${device}` : ``}@${device === 99 ? 'hosted.lid' : 'lid'}`;
187
+ this.logger.trace(`getLIDForPN: USYNC success for ${pair.pn} → ${deviceSpecificLid} (user mapping with device ${device})`);
188
+ const deviceSpecificPn = `${pnUser}${!!device ? `:${device}` : ``}@${device === 99 ? 'hosted' : 's.whatsapp.net'}`;
189
+ successfulPairs[deviceSpecificPn] = { lid: deviceSpecificLid, pn: deviceSpecificPn };
190
+ }
191
+ }
192
+ }
193
+ else {
194
+ this.logger.warn('USync fetch yielded no results for pending PNs');
195
+ }
196
+ }
197
+ return Object.values(successfulPairs).length > 0 ? Object.values(successfulPairs) : null;
198
+ }
199
+ async getPNForLID(lid) {
200
+ return (await this.getPNsForLIDs([lid]))?.[0]?.pn || null;
201
+ }
202
+ async getPNsForLIDs(lids) {
203
+ if (lids.length === 0)
204
+ return null;
205
+ const sortedLids = [...new Set(lids)].sort();
206
+ const cacheKey = sortedLids.join(',');
207
+ const inflight = this.inflightPNLookups.get(cacheKey);
208
+ if (inflight) {
209
+ this.logger.trace(`Coalescing getPNsForLIDs request for ${sortedLids.length} LIDs`);
210
+ return inflight;
211
+ }
212
+ const promise = this._getPNsForLIDsImpl(lids);
213
+ this.inflightPNLookups.set(cacheKey, promise);
214
+ try {
215
+ return await promise;
216
+ }
217
+ finally {
218
+ this.inflightPNLookups.delete(cacheKey);
219
+ }
220
+ }
221
+ async _getPNsForLIDsImpl(lids) {
222
+ const successfulPairs = {};
223
+ const pending = [];
224
+ const addResolvedPair = (lid, decoded, pnUser) => {
225
+ if (!pnUser || typeof pnUser !== 'string') {
226
+ return false;
227
+ }
228
+ const lidDevice = decoded.device !== undefined ? decoded.device : 0;
229
+ const pnJid = `${pnUser}:${lidDevice}@${decoded.domainType === WAJIDDomains.HOSTED_LID ? 'hosted' : 's.whatsapp.net'}`;
230
+ this.logger.trace(`Found reverse mapping: ${lid} → ${pnJid}`);
231
+ successfulPairs[lid] = { lid, pn: pnJid };
232
+ return true;
233
+ };
234
+ for (const lid of lids) {
235
+ if (!isLidUser(lid))
236
+ continue;
237
+ const decoded = jidDecode(lid);
238
+ if (!decoded)
239
+ continue;
240
+ const lidUser = decoded.user;
241
+ const cached = this.mappingCache.get(`lid:${lidUser}`);
242
+ if (cached && typeof cached === 'string') {
243
+ addResolvedPair(lid, decoded, cached);
244
+ continue;
245
+ }
246
+ pending.push({ lid, lidUser, decoded });
247
+ }
248
+ if (pending.length) {
249
+ const reverseKeys = [...new Set(pending.map(item => `${item.lidUser}_reverse`))];
250
+ const stored = await this.keys.get('lid-mapping', reverseKeys);
251
+ for (const { lid, lidUser, decoded } of pending) {
252
+ let pnUser = this.mappingCache.get(`lid:${lidUser}`);
253
+ if (!pnUser || typeof pnUser !== 'string') {
254
+ pnUser = stored[`${lidUser}_reverse`];
255
+ if (pnUser && typeof pnUser === 'string') {
256
+ this.mappingCache.set(`lid:${lidUser}`, pnUser);
257
+ this.mappingCache.set(`pn:${pnUser}`, lidUser);
258
+ }
259
+ }
260
+ if (pnUser && typeof pnUser === 'string') {
261
+ addResolvedPair(lid, decoded, pnUser);
262
+ }
263
+ else {
264
+ this.logger.trace(`No reverse mapping found for LID user: ${lidUser}`);
265
+ }
266
+ }
267
+ }
268
+ return Object.values(successfulPairs).length ? Object.values(successfulPairs) : null;
269
+ }
270
+ /**
271
+ * Close the cache and release resources
272
+ */
273
+ close() {
274
+ this.mappingCache.clear();
275
+ }
276
+ }
277
+ //# sourceMappingURL=lid-mapping.js.map
@@ -1,19 +1,3 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./abstract-socket-client"), exports);
18
- __exportStar(require("./mobile-socket-client"), exports);
19
- __exportStar(require("./web-socket-client"), exports);
1
+ export * from './types.js';
2
+ export * from './websocket.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,11 @@
1
+ import { EventEmitter } from 'events';
2
+ import { URL } from 'url';
3
+ export class AbstractSocketClient extends EventEmitter {
4
+ constructor(url, config) {
5
+ super();
6
+ this.url = url;
7
+ this.config = config;
8
+ this.setMaxListeners(0);
9
+ }
10
+ }
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,54 @@
1
+ import WebSocket from 'ws';
2
+ import { DEFAULT_ORIGIN } from '../../Defaults/index.js';
3
+ import { AbstractSocketClient } from './types.js';
4
+ export class WebSocketClient extends AbstractSocketClient {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.socket = null;
8
+ }
9
+ get isOpen() {
10
+ return this.socket?.readyState === WebSocket.OPEN;
11
+ }
12
+ get isClosed() {
13
+ return this.socket === null || this.socket?.readyState === WebSocket.CLOSED;
14
+ }
15
+ get isClosing() {
16
+ return this.socket === null || this.socket?.readyState === WebSocket.CLOSING;
17
+ }
18
+ get isConnecting() {
19
+ return this.socket?.readyState === WebSocket.CONNECTING;
20
+ }
21
+ connect() {
22
+ if (this.socket) {
23
+ return;
24
+ }
25
+ this.socket = new WebSocket(this.url, {
26
+ origin: DEFAULT_ORIGIN,
27
+ headers: this.config.options?.headers,
28
+ handshakeTimeout: this.config.connectTimeoutMs,
29
+ timeout: this.config.connectTimeoutMs,
30
+ agent: this.config.agent
31
+ });
32
+ this.socket.setMaxListeners(0);
33
+ const events = ['close', 'error', 'upgrade', 'message', 'open', 'ping', 'pong', 'unexpected-response'];
34
+ for (const event of events) {
35
+ this.socket?.on(event, (...args) => this.emit(event, ...args));
36
+ }
37
+ }
38
+ async close() {
39
+ if (!this.socket) {
40
+ return;
41
+ }
42
+ const closePromise = new Promise(resolve => {
43
+ this.socket?.once('close', resolve);
44
+ });
45
+ this.socket.close();
46
+ await closePromise;
47
+ this.socket = null;
48
+ }
49
+ send(str, cb) {
50
+ this.socket?.send(str, cb);
51
+ return Boolean(this.socket);
52
+ }
53
+ }
54
+ //# sourceMappingURL=websocket.js.map
@@ -1,17 +1,134 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeBusinessSocket = void 0;
4
- const business_1 = require("../Utils/business");
5
- const WABinary_1 = require("../WABinary");
6
- const generic_utils_1 = require("../WABinary/generic-utils");
7
- const messages_recv_1 = require("./messages-recv");
8
- const makeBusinessSocket = (config) => {
9
- const sock = (0, messages_recv_1.makeMessagesRecvSocket)(config);
1
+ import { getRawMediaUploadData } from '../Utils/index.js';
2
+ import { parseCatalogNode, parseCollectionsNode, parseOrderDetailsNode, parseProductNode, toProductNode, uploadingNecessaryImagesOfProduct } from '../Utils/business.js';
3
+ import { jidNormalizedUser, S_WHATSAPP_NET } from '../WABinary/index.js';
4
+ import { getBinaryNodeChild } from '../WABinary/generic-utils.js';
5
+ import { makeMessagesRecvSocket } from './messages-recv.js';
6
+ export const makeBusinessSocket = (config) => {
7
+ const sock = makeMessagesRecvSocket(config);
10
8
  const { authState, query, waUploadToServer } = sock;
9
+ const updateBussinesProfile = async (args) => {
10
+ const node = [];
11
+ const simpleFields = ['address', 'email', 'description'];
12
+ node.push(...simpleFields
13
+ .filter(key => args[key] !== undefined && args[key] !== null)
14
+ .map(key => ({
15
+ tag: key,
16
+ attrs: {},
17
+ content: args[key]
18
+ })));
19
+ if (args.websites !== undefined) {
20
+ node.push(...args.websites.map(website => ({
21
+ tag: 'website',
22
+ attrs: {},
23
+ content: website
24
+ })));
25
+ }
26
+ if (args.hours !== undefined) {
27
+ node.push({
28
+ tag: 'business_hours',
29
+ attrs: { timezone: args.hours.timezone },
30
+ content: args.hours.days.map(dayConfig => {
31
+ const base = {
32
+ tag: 'business_hours_config',
33
+ attrs: {
34
+ day_of_week: dayConfig.day,
35
+ mode: dayConfig.mode
36
+ }
37
+ };
38
+ if (dayConfig.mode === 'specific_hours') {
39
+ return {
40
+ ...base,
41
+ attrs: {
42
+ ...base.attrs,
43
+ open_time: dayConfig.openTimeInMinutes,
44
+ close_time: dayConfig.closeTimeInMinutes
45
+ }
46
+ };
47
+ }
48
+ return base;
49
+ })
50
+ });
51
+ }
52
+ const result = await query({
53
+ tag: 'iq',
54
+ attrs: {
55
+ to: S_WHATSAPP_NET,
56
+ type: 'set',
57
+ xmlns: 'w:biz'
58
+ },
59
+ content: [
60
+ {
61
+ tag: 'business_profile',
62
+ attrs: {
63
+ v: '3',
64
+ mutation_type: 'delta'
65
+ },
66
+ content: node
67
+ }
68
+ ]
69
+ });
70
+ return result;
71
+ };
72
+ const updateCoverPhoto = async (photo) => {
73
+ const { fileSha256, filePath } = await getRawMediaUploadData(photo, 'biz-cover-photo');
74
+ const fileSha256B64 = fileSha256.toString('base64');
75
+ const { meta_hmac, fbid, ts } = await waUploadToServer(filePath, {
76
+ fileEncSha256B64: fileSha256B64,
77
+ mediaType: 'biz-cover-photo'
78
+ });
79
+ await query({
80
+ tag: 'iq',
81
+ attrs: {
82
+ to: S_WHATSAPP_NET,
83
+ type: 'set',
84
+ xmlns: 'w:biz'
85
+ },
86
+ content: [
87
+ {
88
+ tag: 'business_profile',
89
+ attrs: {
90
+ v: '3',
91
+ mutation_type: 'delta'
92
+ },
93
+ content: [
94
+ {
95
+ tag: 'cover_photo',
96
+ attrs: { id: String(fbid), op: 'update', token: meta_hmac, ts: String(ts) }
97
+ }
98
+ ]
99
+ }
100
+ ]
101
+ });
102
+ return fbid;
103
+ };
104
+ const removeCoverPhoto = async (id) => {
105
+ return await query({
106
+ tag: 'iq',
107
+ attrs: {
108
+ to: S_WHATSAPP_NET,
109
+ type: 'set',
110
+ xmlns: 'w:biz'
111
+ },
112
+ content: [
113
+ {
114
+ tag: 'business_profile',
115
+ attrs: {
116
+ v: '3',
117
+ mutation_type: 'delta'
118
+ },
119
+ content: [
120
+ {
121
+ tag: 'cover_photo',
122
+ attrs: { op: 'delete', id }
123
+ }
124
+ ]
125
+ }
126
+ ]
127
+ });
128
+ };
11
129
  const getCatalog = async ({ jid, limit, cursor }) => {
12
- var _a;
13
- jid = jid || ((_a = authState.creds.me) === null || _a === void 0 ? void 0 : _a.id);
14
- jid = (0, WABinary_1.jidNormalizedUser)(jid);
130
+ jid = jid || authState.creds.me?.id;
131
+ jid = jidNormalizedUser(jid);
15
132
  const queryParamNodes = [
16
133
  {
17
134
  tag: 'limit',
@@ -27,7 +144,7 @@ const makeBusinessSocket = (config) => {
27
144
  tag: 'height',
28
145
  attrs: {},
29
146
  content: Buffer.from('100')
30
- },
147
+ }
31
148
  ];
32
149
  if (cursor) {
33
150
  queryParamNodes.push({
@@ -39,7 +156,7 @@ const makeBusinessSocket = (config) => {
39
156
  const result = await query({
40
157
  tag: 'iq',
41
158
  attrs: {
42
- to: WABinary_1.S_WHATSAPP_NET,
159
+ to: S_WHATSAPP_NET,
43
160
  type: 'get',
44
161
  xmlns: 'w:biz:catalog'
45
162
  },
@@ -48,31 +165,30 @@ const makeBusinessSocket = (config) => {
48
165
  tag: 'product_catalog',
49
166
  attrs: {
50
167
  jid,
51
- 'allow_shop_source': 'true'
168
+ allow_shop_source: 'true'
52
169
  },
53
170
  content: queryParamNodes
54
171
  }
55
172
  ]
56
173
  });
57
- return (0, business_1.parseCatalogNode)(result);
174
+ return parseCatalogNode(result);
58
175
  };
59
176
  const getCollections = async (jid, limit = 51) => {
60
- var _a;
61
- jid = jid || ((_a = authState.creds.me) === null || _a === void 0 ? void 0 : _a.id);
62
- jid = (0, WABinary_1.jidNormalizedUser)(jid);
177
+ jid = jid || authState.creds.me?.id;
178
+ jid = jidNormalizedUser(jid);
63
179
  const result = await query({
64
180
  tag: 'iq',
65
181
  attrs: {
66
- to: WABinary_1.S_WHATSAPP_NET,
182
+ to: S_WHATSAPP_NET,
67
183
  type: 'get',
68
184
  xmlns: 'w:biz:catalog',
69
- 'smax_id': '35'
185
+ smax_id: '35'
70
186
  },
71
187
  content: [
72
188
  {
73
189
  tag: 'collections',
74
190
  attrs: {
75
- 'biz_jid': jid,
191
+ biz_jid: jid
76
192
  },
77
193
  content: [
78
194
  {
@@ -99,16 +215,16 @@ const makeBusinessSocket = (config) => {
99
215
  }
100
216
  ]
101
217
  });
102
- return (0, business_1.parseCollectionsNode)(result);
218
+ return parseCollectionsNode(result);
103
219
  };
104
220
  const getOrderDetails = async (orderId, tokenBase64) => {
105
221
  const result = await query({
106
222
  tag: 'iq',
107
223
  attrs: {
108
- to: WABinary_1.S_WHATSAPP_NET,
224
+ to: S_WHATSAPP_NET,
109
225
  type: 'get',
110
226
  xmlns: 'fb:thrift_iq',
111
- 'smax_id': '5'
227
+ smax_id: '5'
112
228
  },
113
229
  content: [
114
230
  {
@@ -143,15 +259,15 @@ const makeBusinessSocket = (config) => {
143
259
  }
144
260
  ]
145
261
  });
146
- return (0, business_1.parseOrderDetailsNode)(result);
262
+ return parseOrderDetailsNode(result);
147
263
  };
148
264
  const productUpdate = async (productId, update) => {
149
- update = await (0, business_1.uploadingNecessaryImagesOfProduct)(update, waUploadToServer);
150
- const editNode = (0, business_1.toProductNode)(productId, update);
265
+ update = await uploadingNecessaryImagesOfProduct(update, waUploadToServer);
266
+ const editNode = toProductNode(productId, update);
151
267
  const result = await query({
152
268
  tag: 'iq',
153
269
  attrs: {
154
- to: WABinary_1.S_WHATSAPP_NET,
270
+ to: S_WHATSAPP_NET,
155
271
  type: 'set',
156
272
  xmlns: 'w:biz:catalog'
157
273
  },
@@ -175,19 +291,19 @@ const makeBusinessSocket = (config) => {
175
291
  }
176
292
  ]
177
293
  });
178
- const productCatalogEditNode = (0, generic_utils_1.getBinaryNodeChild)(result, 'product_catalog_edit');
179
- const productNode = (0, generic_utils_1.getBinaryNodeChild)(productCatalogEditNode, 'product');
180
- return (0, business_1.parseProductNode)(productNode);
294
+ const productCatalogEditNode = getBinaryNodeChild(result, 'product_catalog_edit');
295
+ const productNode = getBinaryNodeChild(productCatalogEditNode, 'product');
296
+ return parseProductNode(productNode);
181
297
  };
182
298
  const productCreate = async (create) => {
183
299
  // ensure isHidden is defined
184
300
  create.isHidden = !!create.isHidden;
185
- create = await (0, business_1.uploadingNecessaryImagesOfProduct)(create, waUploadToServer);
186
- const createNode = (0, business_1.toProductNode)(undefined, create);
301
+ create = await uploadingNecessaryImagesOfProduct(create, waUploadToServer);
302
+ const createNode = toProductNode(undefined, create);
187
303
  const result = await query({
188
304
  tag: 'iq',
189
305
  attrs: {
190
- to: WABinary_1.S_WHATSAPP_NET,
306
+ to: S_WHATSAPP_NET,
191
307
  type: 'set',
192
308
  xmlns: 'w:biz:catalog'
193
309
  },
@@ -211,15 +327,15 @@ const makeBusinessSocket = (config) => {
211
327
  }
212
328
  ]
213
329
  });
214
- const productCatalogAddNode = (0, generic_utils_1.getBinaryNodeChild)(result, 'product_catalog_add');
215
- const productNode = (0, generic_utils_1.getBinaryNodeChild)(productCatalogAddNode, 'product');
216
- return (0, business_1.parseProductNode)(productNode);
330
+ const productCatalogAddNode = getBinaryNodeChild(result, 'product_catalog_add');
331
+ const productNode = getBinaryNodeChild(productCatalogAddNode, 'product');
332
+ return parseProductNode(productNode);
217
333
  };
218
334
  const productDelete = async (productIds) => {
219
335
  const result = await query({
220
336
  tag: 'iq',
221
337
  attrs: {
222
- to: WABinary_1.S_WHATSAPP_NET,
338
+ to: S_WHATSAPP_NET,
223
339
  type: 'set',
224
340
  xmlns: 'w:biz:catalog'
225
341
  },
@@ -241,9 +357,9 @@ const makeBusinessSocket = (config) => {
241
357
  }
242
358
  ]
243
359
  });
244
- const productCatalogDelNode = (0, generic_utils_1.getBinaryNodeChild)(result, 'product_catalog_delete');
360
+ const productCatalogDelNode = getBinaryNodeChild(result, 'product_catalog_delete');
245
361
  return {
246
- deleted: +((productCatalogDelNode === null || productCatalogDelNode === void 0 ? void 0 : productCatalogDelNode.attrs.deleted_count) || 0)
362
+ deleted: +(productCatalogDelNode?.attrs.deleted_count || 0)
247
363
  };
248
364
  };
249
365
  return {
@@ -254,7 +370,10 @@ const makeBusinessSocket = (config) => {
254
370
  getCollections,
255
371
  productCreate,
256
372
  productDelete,
257
- productUpdate
373
+ productUpdate,
374
+ updateBussinesProfile,
375
+ updateCoverPhoto,
376
+ removeCoverPhoto
258
377
  };
259
378
  };
260
- exports.makeBusinessSocket = makeBusinessSocket;
379
+ //# sourceMappingURL=business.js.map