@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.
- package/README.MD +1062 -282
- package/WAProto/WAProto.proto +1073 -244
- package/WAProto/index.d.ts +16282 -8183
- package/WAProto/index.js +76605 -50628
- package/engine-requirements.js +10 -10
- package/lib/Defaults/baileys-version.json +1 -1
- package/lib/Defaults/index.d.ts +4 -2
- package/lib/Defaults/index.js +8 -6
- package/lib/Signal/Group/ciphertext-message.d.ts +1 -1
- package/lib/Signal/Group/ciphertext-message.js +1 -1
- package/lib/Signal/Group/sender-message-key.d.ts +1 -1
- package/lib/Signal/Group/sender-message-key.js +1 -1
- package/lib/Signal/libsignal.d.ts +1 -1
- package/lib/Socket/business.d.ts +1 -1
- package/lib/Socket/business.js +1 -1
- package/lib/Socket/chats.d.ts +4 -1
- package/lib/Socket/chats.js +213 -36
- package/lib/Socket/groups.js +87 -15
- package/lib/Socket/index.js +9 -0
- package/lib/Socket/messages-interactive.js +259 -0
- package/lib/Socket/messages-recv.js +1473 -1228
- package/lib/Socket/messages-send.js +437 -469
- package/lib/Socket/socket.js +143 -26
- package/lib/Socket/usync.js +57 -4
- package/lib/Store/make-in-memory-store.js +28 -15
- package/lib/Types/Auth.d.ts +4 -0
- package/lib/Types/Message.d.ts +316 -6
- package/lib/Types/Message.js +1 -1
- package/lib/Types/Socket.d.ts +2 -0
- package/lib/Utils/cache-manager.d.ts +16 -0
- package/lib/Utils/cache-manager.js +22 -5
- package/lib/Utils/chat-utils.js +17 -13
- package/lib/Utils/decode-wa-message.js +1 -11
- package/lib/Utils/event-buffer.js +103 -2
- package/lib/Utils/generics.js +5 -6
- package/lib/Utils/index.d.ts +5 -0
- package/lib/Utils/index.js +3 -0
- package/lib/Utils/jid-validation.d.ts +2 -0
- package/lib/Utils/jid-validation.js +43 -10
- package/lib/Utils/link-preview.js +38 -28
- package/lib/Utils/messages-media.d.ts +1 -1
- package/lib/Utils/messages-media.js +22 -53
- package/lib/Utils/messages.js +653 -65
- package/lib/Utils/performance-config.d.ts +2 -0
- package/lib/Utils/performance-config.js +16 -7
- package/lib/Utils/process-message.js +124 -12
- package/lib/Utils/rate-limiter.js +15 -20
- package/lib/WABinary/generic-utils.js +5 -1
- package/lib/WABinary/jid-utils.d.ts +1 -0
- package/lib/WABinary/jid-utils.js +265 -5
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +75 -5
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +59 -6
- package/lib/WAUSync/USyncQuery.js +64 -6
- package/lib/index.d.ts +1 -0
- package/lib/index.js +5 -4
- package/package.json +10 -15
- 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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
35
|
+
errors: [],
|
|
36
36
|
list: [],
|
|
37
37
|
sideList: [],
|
|
38
38
|
};
|
|
39
39
|
const usyncNode = (0, WABinary_1.getBinaryNodeChild)(result, 'usync');
|
|
40
|
-
|
|
41
|
-
//
|
|
42
|
-
|
|
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
|
-
|
|
61
|
-
//
|
|
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
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
|
-
|
|
7
|
-
|
|
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;
|