@badzz88/baileys 8.5.7 → 8.5.8

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 (142) hide show
  1. package/README.md +337 -1055
  2. package/WAProto/WAProto.proto +284 -264
  3. package/WAProto/index.js +5 -5
  4. package/engine-requirements.js +7 -15
  5. package/lib/Defaults/index.js +130 -187
  6. package/lib/Signal/Group/ciphertext-message.js +11 -14
  7. package/lib/Signal/Group/group-session-builder.js +29 -91
  8. package/lib/Signal/Group/group_cipher.js +81 -88
  9. package/lib/Signal/Group/index.js +12 -136
  10. package/lib/Signal/Group/keyhelper.js +15 -70
  11. package/lib/Signal/Group/sender-chain-key.js +25 -31
  12. package/lib/Signal/Group/sender-key-distribution-message.js +62 -65
  13. package/lib/Signal/Group/sender-key-message.js +65 -68
  14. package/lib/Signal/Group/sender-key-name.js +41 -43
  15. package/lib/Signal/Group/sender-key-record.js +40 -43
  16. package/lib/Signal/Group/sender-key-state.js +83 -96
  17. package/lib/Signal/Group/sender-message-key.js +25 -29
  18. package/lib/Signal/libsignal.js +425 -453
  19. package/lib/Signal/lid-mapping.js +276 -259
  20. package/lib/Socket/Client/index.js +3 -30
  21. package/lib/Socket/Client/types.js +10 -12
  22. package/lib/Socket/Client/websocket.js +53 -61
  23. package/lib/Socket/business.js +379 -422
  24. package/lib/Socket/chats.js +1193 -1816
  25. package/lib/Socket/communities.js +431 -549
  26. package/lib/Socket/graphql.js +672 -612
  27. package/lib/Socket/groups.js +374 -764
  28. package/lib/Socket/index.js +17 -38
  29. package/lib/Socket/interop.js +417 -503
  30. package/lib/Socket/messages-recv.js +1915 -2441
  31. package/lib/Socket/messages-send.js +1213 -1630
  32. package/lib/Socket/mex.js +9 -15
  33. package/lib/Socket/newsletter.js +747 -808
  34. package/lib/Socket/privacy.js +310 -441
  35. package/lib/Socket/socket.js +1025 -1022
  36. package/lib/Socket/username.js +8 -15
  37. package/lib/Store/index.js +10 -36
  38. package/lib/Store/make-cache-manager-store.js +80 -85
  39. package/lib/Store/make-in-memory-store.js +231 -591
  40. package/lib/Store/make-ordered-dictionary.js +72 -78
  41. package/lib/Store/object-repository.js +28 -25
  42. package/lib/Types/Auth.js +2 -38
  43. package/lib/Types/Bussines.js +2 -2
  44. package/lib/Types/Call.js +2 -2
  45. package/lib/Types/Chat.js +8 -4
  46. package/lib/Types/Contact.js +2 -2
  47. package/lib/Types/Events.js +2 -2
  48. package/lib/Types/GroupMetadata.js +2 -2
  49. package/lib/Types/Label.js +24 -26
  50. package/lib/Types/LabelAssociation.js +6 -8
  51. package/lib/Types/Message.js +11 -95
  52. package/lib/Types/Mex.js +111 -112
  53. package/lib/Types/Product.js +2 -2
  54. package/lib/Types/Signal.js +2 -2
  55. package/lib/Types/Socket.js +3 -2
  56. package/lib/Types/State.js +56 -70
  57. package/lib/Types/USync.js +2 -2
  58. package/lib/Types/index.js +26 -55
  59. package/lib/Utils/auth-utils.js +288 -292
  60. package/lib/Utils/browser-utils.js +47 -113
  61. package/lib/Utils/business.js +224 -240
  62. package/lib/Utils/chat-utils.js +869 -1205
  63. package/lib/Utils/companion-reg-client-utils.js +34 -41
  64. package/lib/Utils/crypto.js +107 -144
  65. package/lib/Utils/decode-wa-message.js +308 -518
  66. package/lib/Utils/event-buffer.js +611 -596
  67. package/lib/Utils/generics.js +355 -515
  68. package/lib/Utils/history.js +134 -244
  69. package/lib/Utils/identity-change-handler.js +49 -51
  70. package/lib/Utils/index.js +23 -57
  71. package/lib/Utils/link-preview.js +77 -135
  72. package/lib/Utils/logger.js +3 -9
  73. package/lib/Utils/lt-hash.js +6 -37
  74. package/lib/Utils/make-mutex.js +33 -36
  75. package/lib/Utils/message-composer.js +233 -439
  76. package/lib/Utils/message-retry-manager.js +260 -265
  77. package/lib/Utils/messages-media.js +829 -855
  78. package/lib/Utils/messages.js +961 -2528
  79. package/lib/Utils/noise-handler.js +200 -195
  80. package/lib/Utils/offline-node-processor.js +33 -35
  81. package/lib/Utils/pre-key-manager.js +102 -103
  82. package/lib/Utils/process-message.js +560 -978
  83. package/lib/Utils/reporting-utils.js +253 -257
  84. package/lib/Utils/signal.js +195 -218
  85. package/lib/Utils/stanza-ack.js +29 -31
  86. package/lib/Utils/sticker.js +109 -144
  87. package/lib/Utils/sync-action-utils.js +45 -50
  88. package/lib/Utils/tc-token-utils.js +139 -137
  89. package/lib/Utils/use-multi-file-auth-state.js +109 -109
  90. package/lib/Utils/validate-connection.js +202 -218
  91. package/lib/WABinary/constants.js +1299 -1302
  92. package/lib/WABinary/decode.js +262 -343
  93. package/lib/WABinary/encode.js +4 -12
  94. package/lib/WABinary/generic-utils.js +187 -223
  95. package/lib/WABinary/index.js +6 -33
  96. package/lib/WABinary/jid-utils.js +88 -351
  97. package/lib/WABinary/types.js +2 -2
  98. package/lib/WAM/BinaryInfo.js +9 -12
  99. package/lib/WAM/constants.js +22853 -39486
  100. package/lib/WAM/encode.js +140 -132
  101. package/lib/WAM/index.js +4 -31
  102. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +21 -23
  103. package/lib/WAUSync/Protocols/USyncBusinessProtocol.js +9 -9
  104. package/lib/WAUSync/Protocols/USyncContactProtocol.js +7 -7
  105. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +10 -10
  106. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +7 -7
  107. package/lib/WAUSync/Protocols/USyncFeatureProtocol.js +11 -12
  108. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +4 -5
  109. package/lib/WAUSync/Protocols/USyncPictureProtocol.js +7 -7
  110. package/lib/WAUSync/Protocols/USyncSidelistProtocol.js +7 -8
  111. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +7 -7
  112. package/lib/WAUSync/Protocols/USyncTextStatusProtocol.js +8 -8
  113. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +7 -7
  114. package/lib/WAUSync/Protocols/index.js +12 -39
  115. package/lib/WAUSync/USyncQuery.js +67 -49
  116. package/lib/WAUSync/USyncUser.js +11 -5
  117. package/lib/WAUSync/index.js +3 -31
  118. package/lib/index.js +15 -48
  119. package/package.json +129 -99
  120. package/LICENSE +0 -21
  121. package/lib/Defaults/phonenumber-mcc.json +0 -223
  122. package/lib/Socket/aigroups.js +0 -240
  123. package/lib/Socket/interactive-handler.js +0 -522
  124. package/lib/Socket/managed-account.js +0 -183
  125. package/lib/Socket/registration.js +0 -427
  126. package/lib/Socket/text-router.js +0 -83
  127. package/lib/Types/Newsletter.js +0 -121
  128. package/lib/Utils/command-loader.d.ts +0 -31
  129. package/lib/Utils/command-loader.js +0 -100
  130. package/lib/Utils/consumer-application.js +0 -107
  131. package/lib/Utils/curve25519-js.js +0 -275
  132. package/lib/Utils/group-history.js +0 -60
  133. package/lib/Utils/jid-display-normalization.js +0 -218
  134. package/lib/Utils/meta-ai-msmsg.js +0 -262
  135. package/lib/Utils/native-bridge.js +0 -82
  136. package/lib/Utils/session-pool.d.ts +0 -16
  137. package/lib/Utils/session-pool.js +0 -94
  138. package/lib/Utils/sticker.d.ts +0 -17
  139. package/lib/Utils/view-once-cache.d.ts +0 -9
  140. package/lib/Utils/view-once-cache.js +0 -79
  141. package/lib/Utils/voip-rekey.js +0 -22
  142. package/lib/antiban.js +0 -4637
@@ -1,260 +1,277 @@
1
- 'use strict'
2
- Object.defineProperty(exports, '__esModule', { value: true })
3
- exports.LIDMappingStore = void 0
4
- const lru_cache_1 = require('lru-cache')
5
- const WABinary_1 = require('../WABinary')
6
- class LIDMappingStore {
7
- constructor(keys, logger, pnToLIDFunc) {
8
- this.mappingCache = new lru_cache_1.LRUCache({
9
- ttl: 3 * 24 * 60 * 60 * 1000,
10
- ttlAutopurge: true,
11
- updateAgeOnGet: true
12
- })
13
- this.inflightLIDLookups = new Map()
14
- this.inflightPNLookups = new Map()
15
- this.keys = keys
16
- this.pnToLIDFunc = pnToLIDFunc
17
- this.logger = logger
18
- }
19
- async storeLIDPNMappings(pairs) {
20
- if (pairs.length === 0) return
21
- const validatedPairs = []
22
- for (const { lid, pn } of pairs) {
23
- if (
24
- !(
25
- ((0, WABinary_1.isLidUser)(lid) && (0, WABinary_1.isPnUser)(pn)) ||
26
- ((0, WABinary_1.isPnUser)(lid) && (0, WABinary_1.isLidUser)(pn))
27
- )
28
- ) {
29
- this.logger.warn(`Invalid LID-PN mapping: ${lid}, ${pn}`)
30
- continue
31
- }
32
- const lidDecoded = (0, WABinary_1.jidDecode)(lid)
33
- const pnDecoded = (0, WABinary_1.jidDecode)(pn)
34
- if (!lidDecoded || !pnDecoded) continue
35
- validatedPairs.push({ pnUser: pnDecoded.user, lidUser: lidDecoded.user })
36
- }
37
- if (validatedPairs.length === 0) return
38
- const cacheMissSet = new Set()
39
- const existingMappings = new Map()
40
- for (const { pnUser } of validatedPairs) {
41
- const cached = this.mappingCache.get(`pn:${pnUser}`)
42
- if (cached) {
43
- existingMappings.set(pnUser, cached)
44
- } else {
45
- cacheMissSet.add(pnUser)
46
- }
47
- }
48
- if (cacheMissSet.size > 0) {
49
- const cacheMisses = [...cacheMissSet]
50
- this.logger.trace(`Batch fetching ${cacheMisses.length} LID mappings from database`)
51
- const stored = await this.keys.get('lid-mapping', cacheMisses)
52
- for (const pnUser of cacheMisses) {
53
- const existingLidUser = stored[pnUser]
54
- if (existingLidUser) {
55
- existingMappings.set(pnUser, existingLidUser)
56
- this.mappingCache.set(`pn:${pnUser}`, existingLidUser)
57
- this.mappingCache.set(`lid:${existingLidUser}`, pnUser)
58
- }
59
- }
60
- }
61
- const pairMap = {}
62
- for (const { pnUser, lidUser } of validatedPairs) {
63
- const existingLidUser = existingMappings.get(pnUser)
64
- if (existingLidUser === lidUser) {
65
- this.logger.debug({ pnUser, lidUser }, 'LID mapping already exists, skipping')
66
- continue
67
- }
68
- pairMap[pnUser] = lidUser
69
- }
70
- if (Object.keys(pairMap).length === 0) return
71
- this.logger.trace({ pairMap }, `Storing ${Object.keys(pairMap).length} pn mappings`)
72
- const batchData = {}
73
- for (const [pnUser, lidUser] of Object.entries(pairMap)) {
74
- batchData[pnUser] = lidUser
75
- batchData[`${lidUser}_reverse`] = pnUser
76
- }
77
- await this.keys.transaction(async () => {
78
- await this.keys.set({ 'lid-mapping': batchData })
79
- }, 'lid-mapping')
80
- for (const [pnUser, lidUser] of Object.entries(pairMap)) {
81
- this.mappingCache.set(`pn:${pnUser}`, lidUser)
82
- this.mappingCache.set(`lid:${lidUser}`, pnUser)
83
- }
84
- }
85
- async getLIDForPN(pn) {
86
- return (await this.getLIDsForPNs([pn]))?.[0]?.lid || null
87
- }
88
- async getLIDsForPNs(pns) {
89
- if (pns.length === 0) return null
90
- const sortedPns = [...new Set(pns)].sort()
91
- const cacheKey = sortedPns.join(',')
92
- const inflight = this.inflightLIDLookups.get(cacheKey)
93
- if (inflight) {
94
- this.logger.trace(`Coalescing getLIDsForPNs request for ${sortedPns.length} PNs`)
95
- return inflight
96
- }
97
- const promise = this._getLIDsForPNsImpl(pns)
98
- this.inflightLIDLookups.set(cacheKey, promise)
99
- try {
100
- return await promise
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
- const pnDevice = decoded.device !== undefined ? decoded.device : 0
116
- const deviceSpecificLid = `${normalizedLidUser}${!!pnDevice ? `:${pnDevice}` : ``}@${decoded.server === 'hosted' ? 'hosted.lid' : 'lid'}`
117
- this.logger.trace(`getLIDForPN: ${pn} → ${deviceSpecificLid} (user mapping with device ${pnDevice})`)
118
- successfulPairs[pn] = { lid: deviceSpecificLid, pn }
119
- return true
120
- }
121
- for (const pn of pns) {
122
- if (!(0, WABinary_1.isPnUser)(pn) && !(0, WABinary_1.isHostedPnUser)(pn)) continue
123
- const decoded = (0, WABinary_1.jidDecode)(pn)
124
- if (!decoded) continue
125
- const pnUser = decoded.user
126
- const cached = this.mappingCache.get(`pn:${pnUser}`)
127
- if (cached && typeof cached === 'string') {
128
- if (!addResolvedPair(pn, decoded, cached)) {
129
- this.logger.warn(`Invalid entry for ${pn} (pair not resolved)`)
130
- continue
131
- }
132
- continue
133
- }
134
- pending.push({ pn, pnUser, decoded })
135
- }
136
- if (pending.length) {
137
- const pnUsers = [...new Set(pending.map(item => item.pnUser))]
138
- const stored = await this.keys.get('lid-mapping', pnUsers)
139
- for (const pnUser of pnUsers) {
140
- const lidUser = stored[pnUser]
141
- if (lidUser && typeof lidUser === 'string') {
142
- this.mappingCache.set(`pn:${pnUser}`, lidUser)
143
- this.mappingCache.set(`lid:${lidUser}`, pnUser)
144
- }
145
- }
146
- for (const { pn, pnUser, decoded } of pending) {
147
- const cached = this.mappingCache.get(`pn:${pnUser}`)
148
- if (cached && typeof cached === 'string') {
149
- if (!addResolvedPair(pn, decoded, cached)) {
150
- this.logger.warn(`Invalid entry for ${pn} (pair not resolved)`)
151
- continue
152
- }
153
- } else {
154
- this.logger.trace(`No LID mapping found for PN user ${pnUser}; batch getting from USync`)
155
- const device = decoded.device || 0
156
- let normalizedPn = (0, WABinary_1.jidNormalizedUser)(pn)
157
- if ((0, WABinary_1.isHostedPnUser)(normalizedPn)) {
158
- normalizedPn = `${pnUser}@s.whatsapp.net`
159
- }
160
- if (!usyncFetch[normalizedPn]) {
161
- usyncFetch[normalizedPn] = [device]
162
- } else {
163
- usyncFetch[normalizedPn]?.push(device)
164
- }
165
- }
166
- }
167
- }
168
- if (Object.keys(usyncFetch).length > 0) {
169
- const result = await this.pnToLIDFunc?.(Object.keys(usyncFetch))
170
- if (result && result.length > 0) {
171
- await this.storeLIDPNMappings(result)
172
- for (const pair of result) {
173
- const pnDecoded = (0, WABinary_1.jidDecode)(pair.pn)
174
- const pnUser = pnDecoded?.user
175
- if (!pnUser) continue
176
- const lidUser = (0, WABinary_1.jidDecode)(pair.lid)?.user
177
- if (!lidUser) continue
178
- for (const device of usyncFetch[pair.pn]) {
179
- const deviceSpecificLid = `${lidUser}${!!device ? `:${device}` : ``}@${device === 99 ? 'hosted.lid' : 'lid'}`
180
- this.logger.trace(
181
- `getLIDForPN: USYNC success for ${pair.pn} → ${deviceSpecificLid} (user mapping with device ${device})`
182
- )
183
- const deviceSpecificPn = `${pnUser}${!!device ? `:${device}` : ``}@${device === 99 ? 'hosted' : 's.whatsapp.net'}`
184
- successfulPairs[deviceSpecificPn] = { lid: deviceSpecificLid, pn: deviceSpecificPn }
185
- }
186
- }
187
- } else {
188
- this.logger.warn('USync fetch yielded no results for pending PNs')
189
- }
190
- }
191
- return Object.values(successfulPairs).length > 0 ? Object.values(successfulPairs) : null
192
- }
193
- async getPNForLID(lid) {
194
- return (await this.getPNsForLIDs([lid]))?.[0]?.pn || null
195
- }
196
- async getPNsForLIDs(lids) {
197
- if (lids.length === 0) return null
198
- const sortedLids = [...new Set(lids)].sort()
199
- const cacheKey = sortedLids.join(',')
200
- const inflight = this.inflightPNLookups.get(cacheKey)
201
- if (inflight) {
202
- this.logger.trace(`Coalescing getPNsForLIDs request for ${sortedLids.length} LIDs`)
203
- return inflight
204
- }
205
- const promise = this._getPNsForLIDsImpl(lids)
206
- this.inflightPNLookups.set(cacheKey, promise)
207
- try {
208
- return await promise
209
- } finally {
210
- this.inflightPNLookups.delete(cacheKey)
211
- }
212
- }
213
- async _getPNsForLIDsImpl(lids) {
214
- const successfulPairs = {}
215
- const pending = []
216
- const addResolvedPair = (lid, decoded, pnUser) => {
217
- if (!pnUser || typeof pnUser !== 'string') {
218
- return false
219
- }
220
- const lidDevice = decoded.device !== undefined ? decoded.device : 0
221
- const pnJid = `${pnUser}:${lidDevice}@${decoded.domainType === WABinary_1.WAJIDDomains.HOSTED_LID ? 'hosted' : 's.whatsapp.net'}`
222
- this.logger.trace(`Found reverse mapping: ${lid} → ${pnJid}`)
223
- successfulPairs[lid] = { lid, pn: pnJid }
224
- return true
225
- }
226
- for (const lid of lids) {
227
- if (!(0, WABinary_1.isLidUser)(lid)) continue
228
- const decoded = (0, WABinary_1.jidDecode)(lid)
229
- if (!decoded) continue
230
- const lidUser = decoded.user
231
- const cached = this.mappingCache.get(`lid:${lidUser}`)
232
- if (cached && typeof cached === 'string') {
233
- addResolvedPair(lid, decoded, cached)
234
- continue
235
- }
236
- pending.push({ lid, lidUser, decoded })
237
- }
238
- if (pending.length) {
239
- const reverseKeys = [...new Set(pending.map(item => `${item.lidUser}_reverse`))]
240
- const stored = await this.keys.get('lid-mapping', reverseKeys)
241
- for (const { lid, lidUser, decoded } of pending) {
242
- let pnUser = this.mappingCache.get(`lid:${lidUser}`)
243
- if (!pnUser || typeof pnUser !== 'string') {
244
- pnUser = stored[`${lidUser}_reverse`]
245
- if (pnUser && typeof pnUser === 'string') {
246
- this.mappingCache.set(`lid:${lidUser}`, pnUser)
247
- this.mappingCache.set(`pn:${pnUser}`, lidUser)
248
- }
249
- }
250
- if (pnUser && typeof pnUser === 'string') {
251
- addResolvedPair(lid, decoded, pnUser)
252
- } else {
253
- this.logger.trace(`No reverse mapping found for LID user: ${lidUser}`)
254
- }
255
- }
256
- }
257
- return Object.values(successfulPairs).length ? Object.values(successfulPairs) : null
258
- }
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
+ }
259
276
  }
260
- exports.LIDMappingStore = LIDMappingStore
277
+ //# sourceMappingURL=lid-mapping.js.map
@@ -1,30 +1,3 @@
1
- 'use strict'
2
- var __createBinding =
3
- (this && this.__createBinding) ||
4
- (Object.create
5
- ? function (o, m, k, k2) {
6
- if (k2 === undefined) k2 = k
7
- var desc = Object.getOwnPropertyDescriptor(m, k)
8
- if (!desc || ('get' in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
- desc = {
10
- enumerable: true,
11
- get: function () {
12
- return m[k]
13
- }
14
- }
15
- }
16
- Object.defineProperty(o, k2, desc)
17
- }
18
- : function (o, m, k, k2) {
19
- if (k2 === undefined) k2 = k
20
- o[k2] = m[k]
21
- })
22
- var __exportStar =
23
- (this && this.__exportStar) ||
24
- function (m, exports) {
25
- for (var p in m)
26
- if (p !== 'default' && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p)
27
- }
28
- Object.defineProperty(exports, '__esModule', { value: true })
29
- __exportStar(require('./types'), exports)
30
- __exportStar(require('./websocket'), exports)
1
+ export * from './types.js';
2
+ export * from './websocket.js';
3
+ //# sourceMappingURL=index.js.map
@@ -1,13 +1,11 @@
1
- 'use strict'
2
- Object.defineProperty(exports, '__esModule', { value: true })
3
- exports.AbstractSocketClient = void 0
4
- const events_1 = require('events')
5
- class AbstractSocketClient extends events_1.EventEmitter {
6
- constructor(url, config) {
7
- super()
8
- this.url = url
9
- this.config = config
10
- this.setMaxListeners(0)
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
+ }
12
10
  }
13
- exports.AbstractSocketClient = AbstractSocketClient
11
+ //# sourceMappingURL=types.js.map