@realvare/based 2.7.62 → 2.7.71

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 (57) hide show
  1. package/README.MD +1062 -282
  2. package/WAProto/WAProto.proto +1073 -244
  3. package/WAProto/index.d.ts +16282 -8183
  4. package/WAProto/index.js +76605 -50628
  5. package/engine-requirements.js +10 -10
  6. package/lib/Defaults/baileys-version.json +1 -1
  7. package/lib/Defaults/index.d.ts +4 -2
  8. package/lib/Defaults/index.js +8 -6
  9. package/lib/Signal/Group/ciphertext-message.d.ts +1 -1
  10. package/lib/Signal/Group/ciphertext-message.js +1 -1
  11. package/lib/Signal/Group/sender-message-key.d.ts +1 -1
  12. package/lib/Signal/Group/sender-message-key.js +1 -1
  13. package/lib/Signal/libsignal.d.ts +1 -1
  14. package/lib/Socket/business.d.ts +1 -1
  15. package/lib/Socket/business.js +1 -1
  16. package/lib/Socket/chats.d.ts +4 -1
  17. package/lib/Socket/chats.js +213 -36
  18. package/lib/Socket/groups.js +87 -15
  19. package/lib/Socket/index.js +9 -0
  20. package/lib/Socket/messages-interactive.js +259 -0
  21. package/lib/Socket/messages-recv.js +1473 -1228
  22. package/lib/Socket/messages-send.js +437 -469
  23. package/lib/Socket/socket.js +143 -26
  24. package/lib/Socket/usync.js +57 -4
  25. package/lib/Store/make-in-memory-store.js +28 -15
  26. package/lib/Types/Auth.d.ts +4 -0
  27. package/lib/Types/Message.d.ts +316 -6
  28. package/lib/Types/Message.js +1 -1
  29. package/lib/Types/Socket.d.ts +2 -0
  30. package/lib/Utils/cache-manager.d.ts +16 -0
  31. package/lib/Utils/cache-manager.js +22 -5
  32. package/lib/Utils/chat-utils.js +17 -13
  33. package/lib/Utils/decode-wa-message.js +1 -11
  34. package/lib/Utils/event-buffer.js +103 -2
  35. package/lib/Utils/generics.js +5 -6
  36. package/lib/Utils/index.d.ts +5 -0
  37. package/lib/Utils/index.js +3 -0
  38. package/lib/Utils/jid-validation.d.ts +2 -0
  39. package/lib/Utils/jid-validation.js +43 -10
  40. package/lib/Utils/link-preview.js +38 -28
  41. package/lib/Utils/messages-media.d.ts +1 -1
  42. package/lib/Utils/messages-media.js +22 -53
  43. package/lib/Utils/messages.js +653 -65
  44. package/lib/Utils/performance-config.d.ts +2 -0
  45. package/lib/Utils/performance-config.js +16 -7
  46. package/lib/Utils/process-message.js +124 -12
  47. package/lib/Utils/rate-limiter.js +15 -20
  48. package/lib/WABinary/generic-utils.js +5 -1
  49. package/lib/WABinary/jid-utils.d.ts +1 -0
  50. package/lib/WABinary/jid-utils.js +265 -5
  51. package/lib/WAUSync/Protocols/USyncContactProtocol.js +75 -5
  52. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +59 -6
  53. package/lib/WAUSync/USyncQuery.js +64 -6
  54. package/lib/index.d.ts +1 -0
  55. package/lib/index.js +5 -4
  56. package/package.json +10 -15
  57. package/WAProto/index.ts.ts +0 -53473
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.lidToJid = exports.getBotJid = exports.jidNormalizedUser = exports.isJidBot = exports.isJidStatusBroadcast = exports.isJidGroup = exports.isJidNewsletter = exports.isJidBroadcast = exports.isLid = exports.assertLid = exports.isJidUser = exports.isJidMetaAi = exports.areJidsSameUser = exports.jidDecode = exports.jidEncode = exports.META_AI_JID = exports.STORIES_JID = exports.PSA_WID = exports.SERVER_JID = exports.OFFICIAL_BIZ_JID = exports.S_WHATSAPP_NET = void 0;
3
+ exports.validateAndConvertLidToJid = exports.validateAndCleanJid = exports.lidToJidEnhanced = exports.resolveJid = exports.lidToJid = exports.getBotJid = exports.jidNormalizedUser = exports.isJidBot = exports.isJidStatusBroadcast = exports.isJidGroup = exports.isJidNewsletter = exports.isJidBroadcast = exports.isLid = exports.assertLid = exports.isJidUser = exports.isJidMetaAi = exports.areJidsSameUser = exports.jidDecode = exports.jidEncode = exports.META_AI_JID = exports.STORIES_JID = exports.PSA_WID = exports.SERVER_JID = exports.OFFICIAL_BIZ_JID = exports.S_WHATSAPP_NET = void 0;
4
4
  exports.S_WHATSAPP_NET = '@s.whatsapp.net';
5
5
  exports.OFFICIAL_BIZ_JID = '16505361212@c.us';
6
6
  exports.SERVER_JID = 'server@c.us';
@@ -128,18 +128,272 @@ const lidToJid = (jid) => {
128
128
 
129
129
  let result = jid;
130
130
  if (jid.endsWith('@lid')) {
131
- result = jid.replace('@lid', '@s.whatsapp.net');
131
+ const lidPart = jid.replace('@lid', '');
132
+
133
+ // Check if this LID exists in BOT_MAP first
134
+ if (BOT_MAP.has(lidPart)) {
135
+ result = BOT_MAP.get(lidPart) + '@s.whatsapp.net';
136
+ } else {
137
+ // Check if lidPart is a valid phone number (digits only, reasonable length)
138
+ const isValidPhoneNumber = /^[0-9]+$/.test(lidPart) && lidPart.length >= 8 && lidPart.length <= 15;
139
+
140
+ if (isValidPhoneNumber) {
141
+ result = lidPart + '@s.whatsapp.net';
142
+ } else {
143
+ // Not a valid phone number, keep as LID or return original
144
+ result = jid; // Keep original LID if it's not a valid phone number
145
+ }
146
+ }
132
147
  }
133
148
 
134
149
  lidToJidCache.set(jid, result);
135
150
  return result;
136
151
  }
137
152
  catch (error) {
138
- try { console.error('Error in lidToJid:', error && error.message ? error.message : error, 'Input:', jid); } catch (_) { }
153
+ try {
154
+ const { Logger } = require('../Utils/performance-config');
155
+ Logger.error('Error in lidToJid:', error && error.message ? error.message : error, 'Input:', jid);
156
+ } catch (_) {
157
+ // Fallback if logger is not available
158
+ }
139
159
  return jid;
140
160
  }
141
161
  };
142
162
  exports.lidToJid = lidToJid;
163
+
164
+ const resolveJid = (jid) => {
165
+ if (typeof jid === 'string' && jid.endsWith('@lid')) {
166
+ return lidToJid(jid);
167
+ }
168
+ return jid;
169
+ };
170
+ exports.resolveJid = resolveJid;
171
+
172
+ /**
173
+ * Enhanced LID to JID conversion with phone number validation
174
+ * Validates that the phone number has a valid international format
175
+ */
176
+ const validateAndConvertLidToJid = async (jid, onWhatsApp) => {
177
+ try {
178
+ if (!jid || typeof jid !== 'string') {
179
+ return jid;
180
+ }
181
+
182
+ // First, try basic conversion
183
+ const convertedJid = lidToJid(jid);
184
+
185
+ // If it's still a LID, return as-is (invalid phone number)
186
+ if (isLid(convertedJid)) {
187
+ return convertedJid;
188
+ }
189
+
190
+ // If it's already a JID (not converted), validate it exists on WhatsApp
191
+ if (!jid.endsWith('@lid') && convertedJid === jid) {
192
+ if (onWhatsApp) {
193
+ try {
194
+ const validation = await onWhatsApp(convertedJid);
195
+ if (validation && validation.length > 0 && validation[0].exists) {
196
+ return convertedJid;
197
+ } else {
198
+ // JID doesn't exist on WhatsApp, return original
199
+ return jid;
200
+ }
201
+ } catch (error) {
202
+ // If validation fails, return converted JID (better than nothing)
203
+ return convertedJid;
204
+ }
205
+ } else {
206
+ // No onWhatsApp available, return as-is
207
+ return convertedJid;
208
+ }
209
+ }
210
+
211
+ // For newly converted JIDs, validate they exist on WhatsApp
212
+ if (convertedJid !== jid && onWhatsApp) {
213
+ try {
214
+ const validation = await onWhatsApp(convertedJid);
215
+ if (validation && validation.length > 0 && validation[0].exists) {
216
+ return convertedJid;
217
+ } else {
218
+ // Converted JID doesn't exist on WhatsApp, keep original LID
219
+ return jid;
220
+ }
221
+ } catch (error) {
222
+ // If validation fails, return converted JID
223
+ return convertedJid;
224
+ }
225
+ }
226
+
227
+ return convertedJid;
228
+ }
229
+ catch (error) {
230
+ try {
231
+ const { Logger } = require('../Utils/performance-config');
232
+ Logger.error('Error in validateAndConvertLidToJid:', error && error.message ? error.message : error, 'Input:', jid);
233
+ } catch (_) {
234
+ // ignore if logger not available
235
+ }
236
+ return jid;
237
+ }
238
+ };
239
+
240
+ /**
241
+ * Simple phone number validation based on international format
242
+ * Checks if the number has a valid country code and reasonable length
243
+ */
244
+ const isValidInternationalPhoneNumber = (phoneNumber) => {
245
+ if (!phoneNumber || typeof phoneNumber !== 'string') {
246
+ return false;
247
+ }
248
+
249
+ // Remove any non-digit characters
250
+ const digits = phoneNumber.replace(/\D/g, '');
251
+
252
+ // Check length (8-15 digits is typical for international numbers)
253
+ if (digits.length < 8 || digits.length > 15) {
254
+ return false;
255
+ }
256
+
257
+ // Check if it starts with a valid country code (1-3 digits)
258
+ // Most country codes are 1-3 digits long
259
+ const firstThreeDigits = digits.substring(0, 3);
260
+ const firstTwoDigits = digits.substring(0, 2);
261
+ const firstDigit = digits.substring(0, 1);
262
+
263
+ // Common valid country codes (this is not exhaustive but covers most cases)
264
+ const validCountryCodes = [
265
+ '1', '7', '20', '27', '30', '31', '32', '33', '34', '36', '39', '40', '41', '43', '44', '45', '46', '47', '48', '49',
266
+ '51', '52', '53', '54', '55', '56', '57', '58', '60', '61', '62', '63', '64', '65', '66', '81', '82', '84', '86', '90', '91', '92', '93', '94', '95', '98', '212', '213', '216', '218', '220', '221', '222', '223', '224', '225', '226', '227', '228', '229', '230', '231', '232', '233', '234', '235', '236', '237', '238', '239', '240', '241', '242', '243', '244', '245', '246', '247', '248', '249', '250', '251', '252', '253', '254', '255', '256', '257', '258', '260', '261', '262', '263', '264', '265', '266', '267', '268', '269', '290', '291', '297', '298', '299', '350', '351', '352', '353', '354', '355', '356', '357', '358', '359', '370', '371', '372', '373', '374', '375', '376', '377', '378', '380', '381', '382', '383', '385', '386', '387', '389', '420', '421', '423', '424', '425', '426', '427', '428', '430', '431', '432', '433', '434', '435', '436', '437', '438', '439', '440', '441', '442', '443', '445', '446', '447', '448', '449', '450', '451', '452', '453', '454', '455', '456', '457', '458', '459', '460', '461', '462', '463', '464', '465', '466', '467', '468', '469', '470', '471', '472', '473', '474', '475', '476', '477', '478', '479', '480', '481', '482', '483', '484', '485', '486', '487', '488', '489', '490', '491', '492', '493', '494', '495', '496', '497', '498', '499', '500', '501', '502', '503', '504', '505', '506', '507', '508', '509', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '670', '672', '673', '674', '675', '676', '677', '678', '679', '680', '681', '682', '683', '684', '685', '686', '687', '688', '689', '690', '691', '692', '693', '694', '695', '696', '697', '698', '699', '850', '852', '853', '855', '856', '880', '886', '960', '961', '962', '963', '964', '965', '966', '967', '968', '970', '971', '972', '973', '974', '975', '976', '977', '979', '992', '993', '994', '995', '996', '998'
267
+ ];
268
+
269
+ // Check if the number starts with a valid country code
270
+ const hasValidCountryCode = validCountryCodes.includes(firstThreeDigits) ||
271
+ validCountryCodes.includes(firstTwoDigits) ||
272
+ validCountryCodes.includes(firstDigit);
273
+
274
+ // Special case: reject numbers that start with suspicious patterns
275
+ // 101, 999, 000, etc. are not valid country codes
276
+ const suspiciousPatterns = ['101', '999', '000', '123', '456', '789'];
277
+ const hasSuspiciousPattern = suspiciousPatterns.includes(firstThreeDigits) ||
278
+ suspiciousPatterns.includes(firstTwoDigits);
279
+
280
+ return hasValidCountryCode && !hasSuspiciousPattern;
281
+ };
282
+
283
+ /**
284
+ * Enhanced LID to JID conversion with international phone validation
285
+ * Uses phone number format validation instead of WhatsApp API calls
286
+ */
287
+ const lidToJidEnhanced = (jid) => {
288
+ try {
289
+ if (!jid || typeof jid !== 'string') {
290
+ return jid;
291
+ }
292
+
293
+ let result = jid;
294
+
295
+ // Handle LID conversion
296
+ if (jid.endsWith('@lid')) {
297
+ const lidPart = jid.replace('@lid', '');
298
+
299
+ // Check if this LID exists in BOT_MAP first
300
+ if (BOT_MAP.has(lidPart)) {
301
+ result = BOT_MAP.get(lidPart) + '@s.whatsapp.net';
302
+ } else {
303
+ // Check if lidPart is a valid international phone number
304
+ if (isValidInternationalPhoneNumber(lidPart)) {
305
+ result = lidPart + '@s.whatsapp.net';
306
+ } else {
307
+ // Not a valid international phone number, keep as LID
308
+ result = jid;
309
+ }
310
+ }
311
+ }
312
+ // Handle existing JID validation
313
+ else if (jid.endsWith('@s.whatsapp.net')) {
314
+ const phoneNumber = jid.replace('@s.whatsapp.net', '');
315
+
316
+ // Validate if this JID has a valid international phone number
317
+ if (!isValidInternationalPhoneNumber(phoneNumber)) {
318
+ // This JID is invalid, but we can't convert it back to LID
319
+ // Keep it as-is but log the issue
320
+ try {
321
+ const { Logger } = require('../Utils/performance-config');
322
+ Logger.warn('Invalid JID detected:', jid, 'Phone number:', phoneNumber);
323
+ } catch (_) {
324
+ // ignore if logger not available
325
+ }
326
+ result = jid; // Keep the invalid JID for now
327
+ }
328
+ }
329
+
330
+ return result;
331
+ }
332
+ catch (error) {
333
+ try {
334
+ const { Logger } = require('../Utils/performance-config');
335
+ Logger.error('Error in lidToJidEnhanced:', error && error.message ? error.message : error, 'Input:', jid);
336
+ } catch (_) {
337
+ // ignore if logger not available
338
+ }
339
+ return jid;
340
+ }
341
+ };
342
+
343
+ /**
344
+ * Validates and cleans existing JIDs, converting invalid ones back to LID if possible
345
+ */
346
+ const validateAndCleanJid = (jid) => {
347
+ try {
348
+ if (!jid || typeof jid !== 'string') {
349
+ return jid;
350
+ }
351
+
352
+ // If it's a LID, use enhanced conversion
353
+ if (jid.endsWith('@lid')) {
354
+ return lidToJidEnhanced(jid);
355
+ }
356
+
357
+ // If it's a JID, validate it
358
+ if (jid.endsWith('@s.whatsapp.net')) {
359
+ const phoneNumber = jid.replace('@s.whatsapp.net', '');
360
+
361
+ // Check if this is a valid international phone number
362
+ if (!isValidInternationalPhoneNumber(phoneNumber)) {
363
+ // This JID is invalid, try to convert back to LID
364
+ // Check if it might be from our suspicious patterns
365
+ const firstThreeDigits = phoneNumber.substring(0, 3);
366
+ const suspiciousPatterns = ['101', '999', '000', '123', '456', '789'];
367
+
368
+ if (suspiciousPatterns.includes(firstThreeDigits)) {
369
+ // Convert back to LID
370
+ return phoneNumber + '@lid';
371
+ }
372
+
373
+ // For other invalid numbers, we'll keep the JID but mark it
374
+ try {
375
+ const { Logger } = require('../Utils/performance-config');
376
+ Logger.warn('Invalid JID kept:', jid, 'Phone number:', phoneNumber);
377
+ } catch (_) {
378
+ // ignore if logger not available
379
+ }
380
+ }
381
+ }
382
+
383
+ return jid;
384
+ }
385
+ catch (error) {
386
+ try {
387
+ const { Logger } = require('../Utils/performance-config');
388
+ Logger.error('Error in validateAndCleanJid:', error && error.message ? error.message : error, 'Input:', jid);
389
+ } catch (_) {
390
+ // ignore if logger not available
391
+ }
392
+ return jid;
393
+ }
394
+ };
395
+ exports.validateAndConvertLidToJid = validateAndConvertLidToJid;
396
+
143
397
  // Static BOT map kept for fallback. Created once to avoid recreating Map on each call.
144
398
  const BOT_MAP_STATIC = new Map([["867051314767696", "13135550002"], ["1061492271844689", "13135550005"], ["245886058483988", "13135550009"], ["3509905702656130", "13135550012"], ["1059680132034576", "13135550013"], ["715681030623646", "13135550014"], ["1644971366323052", "13135550015"], ["582497970646566", "13135550019"], ["645459357769306", "13135550022"], ["294997126699143", "13135550023"], ["1522631578502677", "13135550027"], ["719421926276396", "13135550030"], ["1788488635002167", "13135550031"], ["24232338603080193", "13135550033"], ["689289903143209", "13135550035"], ["871626054177096", "13135550039"], ["362351902849370", "13135550042"], ["1744617646041527", "13135550043"], ["893887762270570", "13135550046"], ["1155032702135830", "13135550047"], ["333931965993883", "13135550048"], ["853748013058752", "13135550049"], ["1559068611564819", "13135550053"], ["890487432705716", "13135550054"], ["240254602395494", "13135550055"], ["1578420349663261", "13135550062"], ["322908887140421", "13135550065"], ["3713961535514771", "13135550067"], ["997884654811738", "13135550070"], ["403157239387035", "13135550081"], ["535242369074963", "13135550082"], ["946293427247659", "13135550083"], ["3664707673802291", "13135550084"], ["1821827464894892", "13135550085"], ["1760312477828757", "13135550086"], ["439480398712216", "13135550087"], ["1876735582800984", "13135550088"], ["984025089825661", "13135550089"], ["1001336351558186", "13135550090"], ["3739346336347061", "13135550091"], ["3632749426974980", "13135550092"], ["427864203481615", "13135550093"], ["1434734570493055", "13135550094"], ["992873449225921", "13135550095"], ["813087747426445", "13135550096"], ["806369104931434", "13135550098"], ["1220982902403148", "13135550099"], ["1365893374104393", "13135550100"], ["686482033622048", "13135550200"], ["1454999838411253", "13135550201"], ["718584497008509", "13135550202"], ["743520384213443", "13135550301"], ["1147715789823789", "13135550302"], ["1173034540372201", "13135550303"], ["974785541030953", "13135550304"], ["1122200255531507", "13135550305"], ["899669714813162", "13135550306"], ["631880108970650", "13135550307"], ["435816149330026", "13135550308"], ["1368717161184556", "13135550309"], ["7849963461784891", "13135550310"], ["3609617065968984", "13135550312"], ["356273980574602", "13135550313"], ["1043447920539760", "13135550314"], ["1052764336525346", "13135550315"], ["2631118843732685", "13135550316"], ["510505411332176", "13135550317"], ["1945664239227513", "13135550318"], ["1518594378764656", "13135550319"], ["1378821579456138", "13135550320"], ["490214716896013", "13135550321"], ["1028577858870699", "13135550322"], ["308915665545959", "13135550323"], ["845884253678900", "13135550324"], ["995031308616442", "13135550325"], ["2787365464763437", "13135550326"], ["1532790990671645", "13135550327"], ["302617036180485", "13135550328"], ["723376723197227", "13135550329"], ["8393570407377966", "13135550330"], ["1931159970680725", "13135550331"], ["401073885688605", "13135550332"], ["2234478453565422", "13135550334"], ["814748673882312", "13135550335"], ["26133635056281592", "13135550336"], ["1439804456676119", "13135550337"], ["889851503172161", "13135550338"], ["1018283232836879", "13135550339"], ["1012781386779537", "13135559000"], ["823280953239532", "13135559001"], ["1597090934573334", "13135559002"], ["485965054020343", "13135559003"], ["1033381648363446", "13135559004"], ["491802010206446", "13135559005"], ["1017139033184870", "13135559006"], ["499638325922174", "13135559008"], ["468946335863664", "13135559009"], ["1570389776875816", "13135559010"], ["1004342694328995", "13135559011"], ["1012240323971229", "13135559012"], ["392171787222419", "13135559013"], ["952081212945019", "13135559016"], ["444507875070178", "13135559017"], ["1274819440594668", "13135559018"], ["1397041101147050", "13135559019"], ["425657699872640", "13135559020"], ["532292852562549", "13135559021"], ["705863241720292", "13135559022"], ["476449815183959", "13135559023"], ["488071553854222", "13135559024"], ["468693832665397", "13135559025"], ["517422564037340", "13135559026"], ["819805466613825", "13135559027"], ["1847708235641382", "13135559028"], ["716282970644228", "13135559029"], ["521655380527741", "13135559030"], ["476193631941905", "13135559031"], ["485600497445562", "13135559032"], ["440217235683910", "13135559033"], ["523342446758478", "13135559034"], ["514784864360240", "13135559035"], ["505790121814530", "13135559036"], ["420008964419580", "13135559037"], ["492141680204555", "13135559038"], ["388462787271952", "13135559039"], ["423473920752072", "13135559040"], ["489574180468229", "13135559041"], ["432360635854105", "13135559042"], ["477878201669248", "13135559043"], ["351656951234045", "13135559044"], ["430178036732582", "13135559045"], ["434537312944552", "13135559046"], ["1240614300631808", "13135559047"], ["473135945605128", "13135559048"], ["423669800729310", "13135559049"], ["3685666705015792", "13135559050"], ["504196509016638", "13135559051"], ["346844785189449", "13135559052"], ["504823088911074", "13135559053"], ["402669415797083", "13135559054"], ["490939640234431", "13135559055"], ["875124128063715", "13135559056"], ["468788962654605", "13135559057"], ["562386196354570", "13135559058"], ["372159285928791", "13135559059"], ["531017479591050", "13135559060"], ["1328873881401826", "13135559061"], ["1608363646390484", "13135559062"], ["1229628561554232", "13135559063"], ["348802211530364", "13135559064"], ["3708535859420184", "13135559065"], ["415517767742187", "13135559066"], ["479330341612638", "13135559067"], ["480785414723083", "13135559068"], ["387299107507991", "13135559069"], ["333389813188944", "13135559070"], ["391794130316996", "13135559071"], ["457893470576314", "13135559072"], ["435550496166469", "13135559073"], ["1620162702100689", "13135559074"], ["867491058616043", "13135559075"], ["816224117357759", "13135559076"], ["334065176362830", "13135559077"], ["489973170554709", "13135559078"], ["473060669049665", "13135559079"], ["1221505815643060", "13135559080"], ["889000703096359", "13135559081"], ["475235961979883", "13135559082"], ["3434445653519934", "13135559084"], ["524503026827421", "13135559085"], ["1179639046403856", "13135559086"], ["471563305859144", "13135559087"], ["533896609192881", "13135559088"], ["365443583168041", "13135559089"], ["836082305329393", "13135559090"], ["1056787705969916", "13135559091"], ["503312598958357", "13135559092"], ["3718606738453460", "13135559093"], ["826066052850902", "13135559094"], ["1033611345091888", "13135559095"], ["3868390816783240", "13135559096"], ["7462677740498860", "13135559097"], ["436288576108573", "13135559098"], ["1047559746718900", "13135559099"], ["1099299455255491", "13135559100"], ["1202037301040633", "13135559101"], ["1720619402074074", "13135559102"], ["1030422235101467", "13135559103"], ["827238979523502", "13135559104"], ["1516443722284921", "13135559105"], ["1174442747196709", "13135559106"], ["1653165225503842", "13135559107"], ["1037648777635013", "13135559108"], ["551617757299900", "13135559109"], ["1158813558718726", "13135559110"], ["2463236450542262", "13135559111"], ["1550393252501466", "13135559112"], ["2057065188042796", "13135559113"], ["506163028760735", "13135559114"], ["2065249100538481", "13135559115"], ["1041382867195858", "13135559116"], ["886500209499603", "13135559117"], ["1491615624892655", "13135559118"], ["486563697299617", "13135559119"], ["1175736513679463", "13135559120"], ["491811473512352", "13165550064"]]);
145
399
 
@@ -213,9 +467,12 @@ const getBotJid = (jid) => {
213
467
  catch (err) {
214
468
  // In case of unexpected errors, log and return original jid as safe fallback
215
469
  try {
216
- console.error('getBotJid error:', err && err.message ? err.message : err);
470
+ const { Logger } = require('../Utils/performance-config');
471
+ Logger.error('getBotJid error:', err && err.message ? err.message : err);
472
+ }
473
+ catch (_) {
474
+ // Fallback if logger is not available
217
475
  }
218
- catch (_) { }
219
476
  return jid;
220
477
  }
221
478
  };
@@ -223,3 +480,6 @@ const getBotJid = (jid) => {
223
480
  exports.getBotJid = getBotJid;
224
481
  exports.loadBotMapFromFile = loadBotMapFromFile;
225
482
  exports.setBotMap = setBotMap;
483
+ exports.validateAndConvertLidToJid = validateAndConvertLidToJid;
484
+ exports.lidToJidEnhanced = lidToJidEnhanced;
485
+ exports.validateAndCleanJid = validateAndCleanJid;
@@ -13,18 +13,88 @@ class USyncContactProtocol {
13
13
  };
14
14
  }
15
15
  getUserElement(user) {
16
- //TODO: Implement type / username fields (not yet supported)
16
+ const attrs = {};
17
+ const content = [];
18
+
19
+ // Add type field if specified
20
+ if (user.type) {
21
+ attrs.type = user.type;
22
+ }
23
+
24
+ // Add username field if specified
25
+ if (user.username) {
26
+ attrs.username = user.username;
27
+ }
28
+
29
+ // Add phone number as content if available
30
+ if (user.phone) {
31
+ content.push({
32
+ tag: 'phone',
33
+ attrs: {},
34
+ content: user.phone
35
+ });
36
+ }
37
+
38
+ // Add business details if available
39
+ if (user.business) {
40
+ content.push({
41
+ tag: 'business',
42
+ attrs: {
43
+ description: user.business.description || '',
44
+ category: user.business.category || '',
45
+ website: user.business.website || ''
46
+ }
47
+ });
48
+ }
49
+
50
+ // Add push name if available
51
+ if (user.pushName) {
52
+ content.push({
53
+ tag: 'pushname',
54
+ attrs: {},
55
+ content: user.pushName
56
+ });
57
+ }
58
+
17
59
  return {
18
60
  tag: 'contact',
19
- attrs: {},
20
- content: user.phone,
61
+ attrs,
62
+ content: content.length > 0 ? content : user.phone
21
63
  };
22
64
  }
23
65
  parser(node) {
24
- var _a;
66
+ var _a, _b;
25
67
  if (node.tag === 'contact') {
26
68
  (0, WABinary_1.assertNodeErrorFree)(node);
27
- return ((_a = node === null || node === void 0 ? void 0 : node.attrs) === null || _a === void 0 ? void 0 : _a.type) === 'in';
69
+
70
+ const result = {
71
+ type: ((_a = node === null || node === void 0 ? void 0 : node.attrs) === null || _a === void 0 ? void 0 : _a.type) || 'unknown',
72
+ username: ((_b = node === null || node === void 0 ? void 0 : node.attrs) === null || _b === void 0 ? void 0 : _b.username) || null,
73
+ isInContact: ((_a = node === null || node === void 0 ? void 0 : node.attrs) === null || _a === void 0 ? void 0 : _a.type) === 'in'
74
+ };
75
+
76
+ // Parse content for additional contact information
77
+ if (Array.isArray(node.content)) {
78
+ for (const contentNode of node.content) {
79
+ switch (contentNode.tag) {
80
+ case 'phone':
81
+ result.phone = contentNode.content;
82
+ break;
83
+ case 'pushname':
84
+ result.pushName = contentNode.content;
85
+ break;
86
+ case 'business':
87
+ result.business = {
88
+ description: contentNode.attrs.description || '',
89
+ category: contentNode.attrs.category || '',
90
+ website: contentNode.attrs.website || ''
91
+ };
92
+ break;
93
+ }
94
+ }
95
+ }
96
+
97
+ return result;
28
98
  }
29
99
  return false;
30
100
  }
@@ -14,19 +14,67 @@ class USyncDeviceProtocol {
14
14
  },
15
15
  };
16
16
  }
17
- getUserElement( /* user: USyncUser */) {
18
- //TODO: Implement device phashing, ts and expectedTs
19
- //TODO: if all are not present, return null <- current behavior
20
- //TODO: otherwise return a node w tag 'devices' w those as attrs
21
- return null;
17
+ getUserElement(user) {
18
+ // Check if device information is available
19
+ if (!user.devices || !Array.isArray(user.devices) || user.devices.length === 0) {
20
+ return null; // Return null if no device info available
21
+ }
22
+
23
+ const deviceAttrs = {};
24
+
25
+ // Add device phashing if available
26
+ if (user.devicePhash) {
27
+ deviceAttrs.phash = user.devicePhash;
28
+ }
29
+
30
+ // Add timestamp if available
31
+ if (user.timestamp) {
32
+ deviceAttrs.ts = user.timestamp.toString();
33
+ }
34
+
35
+ // Add expected timestamp if available
36
+ if (user.expectedTimestamp) {
37
+ deviceAttrs.expected_ts = user.expectedTimestamp.toString();
38
+ }
39
+
40
+ // If no device attributes are present, return null
41
+ if (Object.keys(deviceAttrs).length === 0) {
42
+ return null;
43
+ }
44
+
45
+ return {
46
+ tag: 'devices',
47
+ attrs: deviceAttrs,
48
+ content: user.devices.map(device => ({
49
+ tag: 'device',
50
+ attrs: {
51
+ id: device.id?.toString() || '0',
52
+ 'key-index': device.keyIndex?.toString() || '0',
53
+ 'is_hosted': device.isHosted ? 'true' : 'false'
54
+ }
55
+ }))
56
+ };
22
57
  }
23
58
  parser(node) {
24
59
  const deviceList = [];
25
60
  let keyIndex = undefined;
61
+ let devicePhash = undefined;
62
+ let timestamp = undefined;
63
+ let expectedTimestamp = undefined;
64
+
26
65
  if (node.tag === 'devices') {
27
66
  (0, WABinary_1.assertNodeErrorFree)(node);
67
+
68
+ // Extract device-level attributes
69
+ if (node.attrs) {
70
+ devicePhash = node.attrs.phash;
71
+ timestamp = node.attrs.ts ? +node.attrs.ts : undefined;
72
+ expectedTimestamp = node.attrs.expected_ts ? +node.attrs.expected_ts : undefined;
73
+ }
74
+
28
75
  const deviceListNode = (0, WABinary_1.getBinaryNodeChild)(node, 'device-list');
29
76
  const keyIndexNode = (0, WABinary_1.getBinaryNodeChild)(node, 'key-index-list');
77
+
30
78
  if (Array.isArray(deviceListNode === null || deviceListNode === void 0 ? void 0 : deviceListNode.content)) {
31
79
  for (const { tag, attrs } of deviceListNode.content) {
32
80
  const id = +attrs.id;
@@ -40,6 +88,7 @@ class USyncDeviceProtocol {
40
88
  }
41
89
  }
42
90
  }
91
+
43
92
  if ((keyIndexNode === null || keyIndexNode === void 0 ? void 0 : keyIndexNode.tag) === 'key-index-list') {
44
93
  keyIndex = {
45
94
  timestamp: +keyIndexNode.attrs['ts'],
@@ -48,9 +97,13 @@ class USyncDeviceProtocol {
48
97
  };
49
98
  }
50
99
  }
100
+
51
101
  return {
52
102
  deviceList,
53
- keyIndex
103
+ keyIndex,
104
+ devicePhash,
105
+ timestamp,
106
+ expectedTimestamp
54
107
  };
55
108
  }
56
109
  }
@@ -32,14 +32,54 @@ class USyncQuery {
32
32
  return [protocol.name, protocol.parser];
33
33
  }));
34
34
  const queryResult = {
35
- // TODO: implement errors etc.
35
+ errors: [],
36
36
  list: [],
37
37
  sideList: [],
38
38
  };
39
39
  const usyncNode = (0, WABinary_1.getBinaryNodeChild)(result, 'usync');
40
- //TODO: implement error backoff, refresh etc.
41
- //TODO: see if there are any errors in the result node
42
- //const resultNode = getBinaryNodeChild(usyncNode, 'result')
40
+
41
+ // Check for errors in the result node
42
+ const resultNode = (0, WABinary_1.getBinaryNodeChild)(usyncNode, 'result');
43
+ if (resultNode) {
44
+ const errorNodes = (0, WABinary_1.getBinaryNodeChildren)(resultNode, 'error');
45
+ for (const errorNode of errorNodes) {
46
+ queryResult.errors.push({
47
+ code: errorNode.attrs.code,
48
+ text: errorNode.attrs.text,
49
+ jid: errorNode.attrs.jid,
50
+ timestamp: Date.now()
51
+ });
52
+ }
53
+ }
54
+
55
+ // Implement backoff strategy for failed queries
56
+ if (queryResult.errors.length > 0) {
57
+ const retryableErrors = queryResult.errors.filter(error =>
58
+ error.code === '429' || // Rate limit
59
+ error.code === '500' || // Internal server error
60
+ error.code === '503' // Service unavailable
61
+ );
62
+
63
+ if (retryableErrors.length > 0) {
64
+ // Calculate exponential backoff delay
65
+ const baseDelay = 1000; // 1 second
66
+ const maxDelay = 30000; // 30 seconds
67
+ const retryCount = this.retryCount || 0;
68
+ const delay = Math.min(baseDelay * Math.pow(2, retryCount), maxDelay);
69
+
70
+ queryResult.backoffDelay = delay;
71
+ queryResult.shouldRetry = true;
72
+ }
73
+ }
74
+
75
+ // Handle refresh scenarios
76
+ if (this.mode === 'refresh' && resultNode) {
77
+ const refreshNode = (0, WABinary_1.getBinaryNodeChild)(resultNode, 'refresh');
78
+ if (refreshNode) {
79
+ queryResult.refreshRequired = refreshNode.attrs.required === 'true';
80
+ queryResult.refreshTimestamp = parseInt(refreshNode.attrs.timestamp) || Date.now();
81
+ }
82
+ }
43
83
  const listNode = (0, WABinary_1.getBinaryNodeChild)(usyncNode, 'list');
44
84
  if (Array.isArray(listNode === null || listNode === void 0 ? void 0 : listNode.content) && typeof listNode !== 'undefined') {
45
85
  queryResult.list = listNode.content.map((node) => {
@@ -57,8 +97,26 @@ class USyncQuery {
57
97
  return { ...data, id };
58
98
  });
59
99
  }
60
- //TODO: implement side list
61
- //const sideListNode = getBinaryNodeChild(usyncNode, 'side_list')
100
+
101
+ // Process side list for additional metadata
102
+ const sideListNode = (0, WABinary_1.getBinaryNodeChild)(usyncNode, 'side_list');
103
+ if (Array.isArray(sideListNode === null || sideListNode === void 0 ? void 0 : sideListNode.content) && typeof sideListNode !== 'undefined') {
104
+ queryResult.sideList = sideListNode.content.map((node) => {
105
+ const id = node === null || node === void 0 ? void 0 : node.attrs.jid;
106
+ const data = Array.isArray(node === null || node === void 0 ? void 0 : node.content) ? Object.fromEntries(node.content.map((content) => {
107
+ const protocol = content.tag;
108
+ const parser = protocolMap[protocol];
109
+ if (parser) {
110
+ return [protocol, parser(content)];
111
+ }
112
+ else {
113
+ return [protocol, null];
114
+ }
115
+ }).filter(([, b]) => b !== null)) : {};
116
+ return { ...data, id, isSideList: true };
117
+ });
118
+ }
119
+
62
120
  return queryResult;
63
121
  }
64
122
  withDeviceProtocol() {
package/lib/index.d.ts CHANGED
@@ -3,6 +3,7 @@ import makeWASocket from './Socket';
3
3
 
4
4
  export * from '../WAProto';
5
5
  export * from './Utils';
6
+ export { isValidJid, normalizeJid } from './Utils/jid-validation';
6
7
  export * from './Types';
7
8
  export * from './Store';
8
9
  export * from './Defaults';
package/lib/index.js CHANGED
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  const chalk = require("chalk");
4
- const gradient = require("gradient-string");
5
4
 
6
- const samakavare = 'baileys by sam aka vare - https://github.com/realvare https://www.npmjs.com/~realvare';
7
- console.log('\n' + gradient(['#520f8dff', '#431888ff'])(samakavare) + '\n');
5
+ if (process.env.NODE_ENV !== 'test' && process.env.SUPPRESS_BANNER !== 'true') {
6
+ const samakavare = 'baileys by sam aka vare - https://github.com/realvare • https://www.npmjs.com/~realvare';
7
+ console.log('\n' + chalk.hex('#6349d8ff')(samakavare) + '\n');
8
+ }
8
9
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
10
  if (k2 === undefined) k2 = k;
10
11
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -49,4 +50,4 @@ __exportStar(require("./WABinary"), exports);
49
50
  __exportStar(require("./WAM"), exports);
50
51
  __exportStar(require("./WAUSync"), exports);
51
52
 
52
- exports.default = Socket_1.default;
53
+ exports.default = Socket_1.default;