@genuxofficial/baileys 1.0.0 → 2.0.0

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 (99) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -1
  3. package/WAProto/index.d.ts +19244 -2787
  4. package/WAProto/index.js +138202 -74217
  5. package/engine-requirements.js +10 -0
  6. package/lib/Defaults/baileys-version.json +1 -1
  7. package/lib/Defaults/index.d.ts +3 -5
  8. package/lib/Defaults/index.js +7 -6
  9. package/lib/Signal/libsignal.js +18 -9
  10. package/lib/Socket/Client/types.d.ts +0 -2
  11. package/lib/Socket/Client/websocket.js +1 -1
  12. package/lib/Socket/business.d.ts +65 -37
  13. package/lib/Socket/chats.d.ts +22 -18
  14. package/lib/Socket/chats.js +110 -6
  15. package/lib/Socket/groups.d.ts +30 -26
  16. package/lib/Socket/groups.js +20 -6
  17. package/lib/Socket/index.d.ts +66 -38
  18. package/lib/Socket/messages-recv.d.ts +63 -33
  19. package/lib/Socket/messages-recv.js +174 -27
  20. package/lib/Socket/messages-send.d.ts +55 -29
  21. package/lib/Socket/messages-send.js +190 -26
  22. package/lib/Socket/newsletter.d.ts +140 -0
  23. package/lib/Socket/newsletter.js +252 -0
  24. package/lib/Socket/socket.d.ts +8 -10
  25. package/lib/Socket/socket.js +26 -13
  26. package/lib/Socket/usync.d.ts +10 -12
  27. package/lib/Socket/usync.js +10 -15
  28. package/lib/Store/index.d.ts +1 -2
  29. package/lib/Store/index.js +1 -3
  30. package/lib/Store/make-in-memory-store.d.ts +1 -1
  31. package/lib/Store/make-in-memory-store.js +14 -5
  32. package/lib/Store/make-ordered-dictionary.d.ts +1 -1
  33. package/lib/Types/Auth.d.ts +0 -2
  34. package/lib/Types/Chat.d.ts +7 -0
  35. package/lib/Types/Contact.d.ts +5 -0
  36. package/lib/Types/Events.d.ts +27 -0
  37. package/lib/Types/GroupMetadata.d.ts +7 -0
  38. package/lib/Types/Label.js +1 -1
  39. package/lib/Types/LabelAssociation.js +1 -1
  40. package/lib/Types/Message.d.ts +129 -16
  41. package/lib/Types/Message.js +0 -2
  42. package/lib/Types/Newsletter.d.ts +79 -0
  43. package/lib/Types/Newsletter.js +18 -0
  44. package/lib/Types/Socket.d.ts +8 -5
  45. package/lib/Types/index.d.ts +1 -0
  46. package/lib/Types/index.js +2 -1
  47. package/lib/Utils/auth-utils.d.ts +1 -1
  48. package/lib/Utils/auth-utils.js +6 -7
  49. package/lib/Utils/business.js +2 -2
  50. package/lib/Utils/chat-utils.d.ts +8 -10
  51. package/lib/Utils/chat-utils.js +11 -0
  52. package/lib/Utils/crypto.d.ts +14 -16
  53. package/lib/Utils/crypto.js +40 -26
  54. package/lib/Utils/decode-wa-message.d.ts +5 -3
  55. package/lib/Utils/decode-wa-message.js +171 -29
  56. package/lib/Utils/event-buffer.js +1 -3
  57. package/lib/Utils/generics.d.ts +35 -9
  58. package/lib/Utils/generics.js +93 -27
  59. package/lib/Utils/history.d.ts +2 -2
  60. package/lib/Utils/link-preview.d.ts +1 -1
  61. package/lib/Utils/link-preview.js +17 -7
  62. package/lib/Utils/make-mutex.d.ts +2 -2
  63. package/lib/Utils/make-mutex.js +0 -1
  64. package/lib/Utils/messages-media.d.ts +35 -16
  65. package/lib/Utils/messages-media.js +168 -43
  66. package/lib/Utils/messages.d.ts +6 -9
  67. package/lib/Utils/messages.js +297 -37
  68. package/lib/Utils/noise-handler.d.ts +5 -7
  69. package/lib/Utils/process-message.js +2 -3
  70. package/lib/Utils/use-multi-file-auth-state.js +44 -13
  71. package/lib/Utils/validate-connection.d.ts +2 -2
  72. package/lib/Utils/validate-connection.js +1 -3
  73. package/lib/WABinary/decode.d.ts +2 -4
  74. package/lib/WABinary/decode.js +20 -9
  75. package/lib/WABinary/encode.d.ts +1 -3
  76. package/lib/WABinary/encode.js +30 -12
  77. package/lib/WABinary/generic-utils.d.ts +1 -3
  78. package/lib/WABinary/generic-utils.js +2 -2
  79. package/lib/WABinary/jid-utils.d.ts +9 -4
  80. package/lib/WABinary/jid-utils.js +25 -4
  81. package/lib/WAM/BinaryInfo.d.ts +2 -12
  82. package/lib/WAM/encode.d.ts +1 -3
  83. package/lib/WAUSync/Protocols/USyncContactProtocol.js +2 -2
  84. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +2 -2
  85. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +2 -2
  86. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +5 -5
  87. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
  88. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +53 -0
  89. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
  90. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
  91. package/lib/WAUSync/USyncQuery.d.ts +2 -0
  92. package/lib/WAUSync/USyncQuery.js +27 -13
  93. package/lib/WAUSync/USyncUser.d.ts +2 -0
  94. package/lib/WAUSync/USyncUser.js +4 -0
  95. package/lib/index.d.ts +2 -1
  96. package/lib/index.js +3 -1
  97. package/package.json +59 -57
  98. package/WAProto/GenerateStatics.sh +0 -4
  99. package/WAProto/WAProto.proto +0 -3344
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.assertMediaContent = exports.downloadMediaMessage = exports.aggregateMessageKeysNotFromMe = exports.getAggregateVotesInPollMessage = exports.updateMessageWithPollUpdate = exports.updateMessageWithReaction = exports.updateMessageWithReceipt = exports.getDevice = exports.extractMessageContent = exports.normalizeMessageContent = exports.getContentType = exports.generateWAMessage = exports.generateWAMessageFromContent = exports.generateWAMessageContent = exports.generateForwardMessageContent = exports.prepareDisappearingMessageSettingContent = exports.prepareWAMessageMedia = exports.generateLinkPreviewIfRequired = exports.extractUrlFromText = void 0;
6
+ exports.assertMediaContent = exports.downloadMediaMessage = exports.aggregateMessageKeysNotFromMe = exports.updateMessageWithPollUpdate = exports.updateMessageWithReaction = exports.updateMessageWithReceipt = exports.getDevice = exports.extractMessageContent = exports.normalizeMessageContent = exports.getContentType = exports.generateWAMessage = exports.generateWAMessageFromContent = exports.generateWAMessageContent = exports.generateForwardMessageContent = exports.prepareDisappearingMessageSettingContent = exports.prepareWAMessageMedia = exports.generateLinkPreviewIfRequired = exports.extractUrlFromText = void 0;
7
+ exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
7
8
  const boom_1 = require("@hapi/boom");
8
9
  const axios_1 = __importDefault(require("axios"));
9
10
  const crypto_1 = require("crypto");
@@ -30,6 +31,7 @@ const MessageTypeProto = {
30
31
  'sticker': Types_1.WAProto.Message.StickerMessage,
31
32
  'document': Types_1.WAProto.Message.DocumentMessage,
32
33
  };
34
+ const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
33
35
  /**
34
36
  * Uses a regex to test whether the string contains a URL, and returns the URL if it does.
35
37
  * @param text eg. hello https://google.com
@@ -110,14 +112,14 @@ const prepareWAMessageMedia = async (message, options) => {
110
112
  const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
111
113
  const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
112
114
  const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
113
- const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath } = await (0, messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
115
+ const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, } = await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
114
116
  logger,
115
117
  saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
116
118
  opts: options.options
117
119
  });
118
120
  // url safe Base64 encode the SHA256 hash of the body
119
- const fileEncSha256B64 = fileEncSha256.toString('base64');
120
- const [{ mediaUrl, directPath }] = await Promise.all([
121
+ const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 !== void 0 ? fileEncSha256 : fileSha256).toString('base64');
122
+ const [{ mediaUrl, directPath, handle }] = await Promise.all([
121
123
  (async () => {
122
124
  const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
123
125
  logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
@@ -154,7 +156,9 @@ const prepareWAMessageMedia = async (message, options) => {
154
156
  })(),
155
157
  ])
156
158
  .finally(async () => {
157
- encWriteStream.destroy();
159
+ if (!Buffer.isBuffer(encWriteStream)) {
160
+ encWriteStream.destroy();
161
+ }
158
162
  // remove tmp files
159
163
  if (didSaveToTmpPath && bodyPath) {
160
164
  try {
@@ -169,13 +173,13 @@ const prepareWAMessageMedia = async (message, options) => {
169
173
  });
170
174
  const obj = Types_1.WAProto.Message.fromObject({
171
175
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
172
- url: mediaUrl,
176
+ url: handle ? undefined : mediaUrl,
173
177
  directPath,
174
- mediaKey,
175
- fileEncSha256,
178
+ mediaKey: mediaKey,
179
+ fileEncSha256: fileEncSha256,
176
180
  fileSha256,
177
181
  fileLength,
178
- mediaKeyTimestamp: (0, generics_1.unixTimestampSeconds)(),
182
+ mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
179
183
  ...uploadData,
180
184
  media: undefined
181
185
  })
@@ -238,8 +242,8 @@ const generateForwardMessageContent = (message, forceForward) => {
238
242
  };
239
243
  exports.generateForwardMessageContent = generateForwardMessageContent;
240
244
  const generateWAMessageContent = async (message, options) => {
241
- var _a;
242
- var _b, _c;
245
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
246
+ var _p, _q;
243
247
  let m = {};
244
248
  if ('text' in message) {
245
249
  const extContent = { text: message.text };
@@ -248,7 +252,6 @@ const generateWAMessageContent = async (message, options) => {
248
252
  urlInfo = await (0, exports.generateLinkPreviewIfRequired)(message.text, options.getUrlInfo, options.logger);
249
253
  }
250
254
  if (urlInfo) {
251
- extContent.canonicalUrl = urlInfo['canonical-url'];
252
255
  extContent.matchedText = urlInfo['matched-text'];
253
256
  extContent.jpegThumbnail = urlInfo.jpegThumbnail;
254
257
  extContent.description = urlInfo.description;
@@ -272,6 +275,9 @@ const generateWAMessageContent = async (message, options) => {
272
275
  extContent.font = options.font;
273
276
  }
274
277
  m.extendedTextMessage = extContent;
278
+ m.messageContextInfo = {
279
+ messageSecret: (0, crypto_1.randomBytes)(32)
280
+ };
275
281
  }
276
282
  else if ('contacts' in message) {
277
283
  const contactLen = message.contacts.contacts.length;
@@ -336,6 +342,27 @@ const generateWAMessageContent = async (message, options) => {
336
342
  m.pinInChatMessage.senderTimestampMs = Date.now();
337
343
  m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
338
344
  }
345
+ else if ('keep' in message) {
346
+ m.keepInChatMessage = {};
347
+ m.keepInChatMessage.key = message.keep;
348
+ m.keepInChatMessage.keepType = message.type;
349
+ m.keepInChatMessage.timestampMs = Date.now();
350
+ }
351
+ else if ('call' in message) {
352
+ m = {
353
+ scheduledCallCreationMessage: {
354
+ scheduledTimestampMs: (_a = message.call.time) !== null && _a !== void 0 ? _a : Date.now(),
355
+ callType: (_b = message.call.type) !== null && _b !== void 0 ? _b : 1,
356
+ title: message.call.title
357
+ }
358
+ };
359
+ }
360
+ else if ('paymentInvite' in message) {
361
+ m.paymentInviteMessage = {
362
+ serviceType: message.paymentInvite.type,
363
+ expiryTimestamp: message.paymentInvite.expiry
364
+ };
365
+ }
339
366
  else if ('buttonReply' in message) {
340
367
  switch (message.type) {
341
368
  case 'template':
@@ -368,12 +395,27 @@ const generateWAMessageContent = async (message, options) => {
368
395
  }
369
396
  });
370
397
  }
398
+ else if ('order' in message) {
399
+ m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
400
+ orderId: message.order.id,
401
+ thumbnail: message.order.thumbnail,
402
+ itemCount: message.order.itemCount,
403
+ status: message.order.status,
404
+ surface: message.order.surface,
405
+ orderTitle: message.order.title,
406
+ message: message.order.text,
407
+ sellerJid: message.order.seller,
408
+ token: message.order.token,
409
+ totalAmount1000: message.order.amount,
410
+ totalCurrencyCode: message.order.currency
411
+ });
412
+ }
371
413
  else if ('listReply' in message) {
372
414
  m.listResponseMessage = { ...message.listReply };
373
415
  }
374
416
  else if ('poll' in message) {
375
- (_b = message.poll).selectableCount || (_b.selectableCount = 0);
376
- (_c = message.poll).toAnnouncementGroup || (_c.toAnnouncementGroup = false);
417
+ (_p = message.poll).selectableCount || (_p.selectableCount = 0);
418
+ (_q = message.poll).toAnnouncementGroup || (_q.toAnnouncementGroup = false);
377
419
  if (!Array.isArray(message.poll.values)) {
378
420
  throw new boom_1.Boom('Invalid poll values', { statusCode: 400 });
379
421
  }
@@ -396,7 +438,7 @@ const generateWAMessageContent = async (message, options) => {
396
438
  }
397
439
  else {
398
440
  if (message.poll.selectableCount > 0) {
399
- //poll v3 is for single select polls
441
+ // poll v3 is for single select polls
400
442
  m.pollCreationMessageV3 = pollCreationMessage;
401
443
  }
402
444
  else {
@@ -405,6 +447,53 @@ const generateWAMessageContent = async (message, options) => {
405
447
  }
406
448
  }
407
449
  }
450
+ else if ('event' in message) {
451
+ m.messageContextInfo = {
452
+ messageSecret: message.event.messageSecret || (0, crypto_1.randomBytes)(32),
453
+ };
454
+ m.eventMessage = { ...message.event };
455
+ }
456
+ else if ('inviteAdmin' in message) {
457
+ m.newsletterAdminInviteMessage = {};
458
+ m.newsletterAdminInviteMessage.inviteExpiration = message.inviteAdmin.inviteExpiration;
459
+ m.newsletterAdminInviteMessage.caption = message.inviteAdmin.text;
460
+ m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
461
+ m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
462
+ m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
463
+ }
464
+ else if ('requestPayment' in message) {
465
+ const sticker = ((_c = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _c === void 0 ? void 0 : _c.sticker) ?
466
+ await (0, exports.prepareWAMessageMedia)({ sticker: (_d = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _d === void 0 ? void 0 : _d.sticker, ...options }, options)
467
+ : null;
468
+ let notes = {};
469
+ if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
470
+ notes = {
471
+ stickerMessage: {
472
+ ...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
473
+ contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
474
+ }
475
+ };
476
+ }
477
+ else if (message.requestPayment.note) {
478
+ notes = {
479
+ extendedTextMessage: {
480
+ text: message.requestPayment.note,
481
+ contextInfo: (_g = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _g === void 0 ? void 0 : _g.contextInfo,
482
+ }
483
+ };
484
+ }
485
+ else {
486
+ throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
487
+ }
488
+ m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
489
+ expiryTimestamp: message.requestPayment.expiry,
490
+ amount1000: message.requestPayment.amount,
491
+ currencyCodeIso4217: message.requestPayment.currency,
492
+ requestFrom: message.requestPayment.from,
493
+ noteMessage: { ...notes },
494
+ background: (_h = message.requestPayment.background) !== null && _h !== void 0 ? _h : null,
495
+ });
496
+ }
408
497
  else if ('sharePhoneNumber' in message) {
409
498
  m.protocolMessage = {
410
499
  type: WAProto_1.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
@@ -416,10 +505,162 @@ const generateWAMessageContent = async (message, options) => {
416
505
  else {
417
506
  m = await (0, exports.prepareWAMessageMedia)(message, options);
418
507
  }
508
+ if ('buttons' in message && !!message.buttons) {
509
+ const buttonsMessage = {
510
+ buttons: message.buttons.map(b => ({ ...b, type: WAProto_1.proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
511
+ };
512
+ if ('text' in message) {
513
+ buttonsMessage.contentText = message.text;
514
+ buttonsMessage.headerType = ButtonType.EMPTY;
515
+ }
516
+ else {
517
+ if ('caption' in message) {
518
+ buttonsMessage.contentText = message.caption;
519
+ }
520
+ const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
521
+ buttonsMessage.headerType = ButtonType[type];
522
+ Object.assign(buttonsMessage, m);
523
+ }
524
+ if ('title' in message && !!message.title) {
525
+ buttonsMessage.text = message.title,
526
+ buttonsMessage.headerType = ButtonType.TEXT;
527
+ }
528
+ if ('footer' in message && !!message.footer) {
529
+ buttonsMessage.footerText = message.footer;
530
+ }
531
+ if ('contextInfo' in message && !!message.contextInfo) {
532
+ buttonsMessage.contextInfo = message.contextInfo;
533
+ }
534
+ if ('mentions' in message && !!message.mentions) {
535
+ buttonsMessage.contextInfo = { mentionedJid: message.mentions };
536
+ }
537
+ m = { buttonsMessage };
538
+ }
539
+ else if ('templateButtons' in message && !!message.templateButtons) {
540
+ const msg = {
541
+ hydratedButtons: message.hasOwnProperty("templateButtons") ? message.templateButtons : message.templateButtons
542
+ };
543
+ if ('text' in message) {
544
+ msg.hydratedContentText = message.text;
545
+ }
546
+ else {
547
+ if ('caption' in message) {
548
+ msg.hydratedContentText = message.caption;
549
+ }
550
+ Object.assign(msg, m);
551
+ }
552
+ if ('footer' in message && !!message.footer) {
553
+ msg.hydratedFooterText = message.footer;
554
+ }
555
+ m = {
556
+ templateMessage: {
557
+ fourRowTemplate: msg,
558
+ hydratedTemplate: msg
559
+ }
560
+ };
561
+ }
562
+ if ('sections' in message && !!message.sections) {
563
+ const listMessage = {
564
+ sections: message.sections,
565
+ buttonText: message.buttonText,
566
+ title: message.title,
567
+ footerText: message.footer,
568
+ description: message.text,
569
+ listType: message.hasOwnProperty('listType') ? message.listType : WAProto_1.proto.Message.ListMessage.ListType.PRODUCT_LIST
570
+ };
571
+ m = { listMessage };
572
+ }
573
+ if ('interactiveButtons' in message && !!message.interactiveButtons) {
574
+ const interactiveMessage = {
575
+ nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
576
+ buttons: message.interactiveButtons,
577
+ })
578
+ };
579
+ if ('text' in message) {
580
+ interactiveMessage.body = {
581
+ text: message.text
582
+ };
583
+ }
584
+ else if ('caption' in message) {
585
+ interactiveMessage.body = {
586
+ text: message.caption
587
+ };
588
+ interactiveMessage.header = {
589
+ title: message.title,
590
+ subtitle: message.subtitle,
591
+ hasMediaAttachment: (_j = message === null || message === void 0 ? void 0 : message.media) !== null && _j !== void 0 ? _j : false,
592
+ };
593
+ Object.assign(interactiveMessage.header, m);
594
+ }
595
+ if ('footer' in message && !!message.footer) {
596
+ interactiveMessage.footer = {
597
+ text: message.footer
598
+ };
599
+ }
600
+ if ('title' in message && !!message.title) {
601
+ interactiveMessage.header = {
602
+ title: message.title,
603
+ subtitle: message.subtitle,
604
+ hasMediaAttachment: (_k = message === null || message === void 0 ? void 0 : message.media) !== null && _k !== void 0 ? _k : false,
605
+ };
606
+ Object.assign(interactiveMessage.header, m);
607
+ }
608
+ if ('contextInfo' in message && !!message.contextInfo) {
609
+ interactiveMessage.contextInfo = message.contextInfo;
610
+ }
611
+ if ('mentions' in message && !!message.mentions) {
612
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
613
+ }
614
+ m = { interactiveMessage };
615
+ }
616
+ if ('shop' in message && !!message.shop) {
617
+ const interactiveMessage = {
618
+ shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
619
+ surface: message.shop,
620
+ id: message.id
621
+ })
622
+ };
623
+ if ('text' in message) {
624
+ interactiveMessage.body = {
625
+ text: message.text
626
+ };
627
+ }
628
+ else if ('caption' in message) {
629
+ interactiveMessage.body = {
630
+ text: message.caption
631
+ };
632
+ interactiveMessage.header = {
633
+ title: message.title,
634
+ subtitle: message.subtitle,
635
+ hasMediaAttachment: (_l = message === null || message === void 0 ? void 0 : message.media) !== null && _l !== void 0 ? _l : false,
636
+ };
637
+ Object.assign(interactiveMessage.header, m);
638
+ }
639
+ if ('footer' in message && !!message.footer) {
640
+ interactiveMessage.footer = {
641
+ text: message.footer
642
+ };
643
+ }
644
+ if ('title' in message && !!message.title) {
645
+ interactiveMessage.header = {
646
+ title: message.title,
647
+ subtitle: message.subtitle,
648
+ hasMediaAttachment: (_m = message === null || message === void 0 ? void 0 : message.media) !== null && _m !== void 0 ? _m : false,
649
+ };
650
+ Object.assign(interactiveMessage.header, m);
651
+ }
652
+ if ('contextInfo' in message && !!message.contextInfo) {
653
+ interactiveMessage.contextInfo = message.contextInfo;
654
+ }
655
+ if ('mentions' in message && !!message.mentions) {
656
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
657
+ }
658
+ m = { interactiveMessage };
659
+ }
419
660
  if ('viewOnce' in message && !!message.viewOnce) {
420
661
  m = { viewOnceMessage: { message: m } };
421
662
  }
422
- if ('mentions' in message && ((_a = message.mentions) === null || _a === void 0 ? void 0 : _a.length)) {
663
+ if ('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length)) {
423
664
  const [messageType] = Object.keys(m);
424
665
  m[messageType].contextInfo = m[messageType] || {};
425
666
  m[messageType].contextInfo.mentionedJid = message.mentions;
@@ -452,26 +693,29 @@ const generateWAMessageFromContent = (jid, message, options) => {
452
693
  const key = (0, exports.getContentType)(innerMessage);
453
694
  const timestamp = (0, generics_1.unixTimestampSeconds)(options.timestamp);
454
695
  const { quoted, userJid } = options;
455
- if (quoted) {
696
+ // only set quoted if isn't a newsletter message
697
+ if (quoted && !(0, WABinary_1.isJidNewsletter)(jid)) {
456
698
  const participant = quoted.key.fromMe ? userJid : (quoted.participant || quoted.key.participant || quoted.key.remoteJid);
457
699
  let quotedMsg = (0, exports.normalizeMessageContent)(quoted.message);
458
700
  const msgType = (0, exports.getContentType)(quotedMsg);
459
701
  // strip any redundant properties
460
- quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
461
- const quotedContent = quotedMsg[msgType];
462
- if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
463
- delete quotedContent.contextInfo;
464
- }
465
- const contextInfo = innerMessage[key].contextInfo || {};
466
- contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
467
- contextInfo.stanzaId = quoted.key.id;
468
- contextInfo.quotedMessage = quotedMsg;
469
- // if a participant is quoted, then it must be a group
470
- // hence, remoteJid of group must also be entered
471
- if (jid !== quoted.key.remoteJid) {
472
- contextInfo.remoteJid = quoted.key.remoteJid;
473
- }
474
- innerMessage[key].contextInfo = contextInfo;
702
+ if (quotedMsg) {
703
+ quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
704
+ const quotedContent = quotedMsg[msgType];
705
+ if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
706
+ delete quotedContent.contextInfo;
707
+ }
708
+ const contextInfo = innerMessage[key].contextInfo || {};
709
+ contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
710
+ contextInfo.stanzaId = quoted.key.id;
711
+ contextInfo.quotedMessage = quotedMsg;
712
+ // if a participant is quoted, then it must be a group
713
+ // hence, remoteJid of group must also be entered
714
+ if (jid !== quoted.key.remoteJid) {
715
+ contextInfo.remoteJid = quoted.key.remoteJid;
716
+ }
717
+ innerMessage[key].contextInfo = contextInfo;
718
+ }
475
719
  }
476
720
  if (
477
721
  // if we want to send a disappearing message
@@ -479,7 +723,9 @@ const generateWAMessageFromContent = (jid, message, options) => {
479
723
  // and it's not a protocol message -- delete, toggle disappear message
480
724
  key !== 'protocolMessage' &&
481
725
  // already not converted to disappearing message
482
- key !== 'ephemeralMessage') {
726
+ key !== 'ephemeralMessage' &&
727
+ // newsletter not accept disappearing messages
728
+ !(0, WABinary_1.isJidNewsletter)(jid)) {
483
729
  innerMessage[key].contextInfo = {
484
730
  ...(innerMessage[key].contextInfo || {}),
485
731
  expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
@@ -491,7 +737,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
491
737
  key: {
492
738
  remoteJid: jid,
493
739
  fromMe: true,
494
- id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageID)(),
740
+ id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageIDV2)(),
495
741
  },
496
742
  message: message,
497
743
  messageTimestamp: timestamp,
@@ -506,7 +752,7 @@ const generateWAMessage = async (jid, content, options) => {
506
752
  var _a;
507
753
  // ensure msg ID is with every log
508
754
  options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
509
- return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, options), options);
755
+ return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsletter)(jid), ...options }), options);
510
756
  };
511
757
  exports.generateWAMessage = generateWAMessage;
512
758
  /** Get the key to access the true type of content */
@@ -543,7 +789,22 @@ const normalizeMessageContent = (content) => {
543
789
  || (message === null || message === void 0 ? void 0 : message.documentWithCaptionMessage)
544
790
  || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2)
545
791
  || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension)
546
- || (message === null || message === void 0 ? void 0 : message.editedMessage));
792
+ || (message === null || message === void 0 ? void 0 : message.editedMessage)
793
+ || (message === null || message === void 0 ? void 0 : message.groupMentionedMessage)
794
+ || (message === null || message === void 0 ? void 0 : message.botInvokeMessage)
795
+ || (message === null || message === void 0 ? void 0 : message.lottieStickerMessage)
796
+ || (message === null || message === void 0 ? void 0 : message.eventCoverImage)
797
+ || (message === null || message === void 0 ? void 0 : message.statusMentionMessage)
798
+ || (message === null || message === void 0 ? void 0 : message.pollCreationOptionImageMessage)
799
+ || (message === null || message === void 0 ? void 0 : message.associatedChildMessage)
800
+ || (message === null || message === void 0 ? void 0 : message.groupStatusMentionMessage)
801
+ || (message === null || message === void 0 ? void 0 : message.pollCreationMessageV4)
802
+ || (message === null || message === void 0 ? void 0 : message.pollCreationMessageV5)
803
+ || (message === null || message === void 0 ? void 0 : message.statusAddYours)
804
+ || (message === null || message === void 0 ? void 0 : message.groupStatusMessage)
805
+ || (message === null || message === void 0 ? void 0 : message.limitSharingMessage)
806
+ || (message === null || message === void 0 ? void 0 : message.botTaskMessage)
807
+ || (message === null || message === void 0 ? void 0 : message.questionMessage));
547
808
  }
548
809
  };
549
810
  exports.normalizeMessageContent = normalizeMessageContent;
@@ -671,7 +932,6 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
671
932
  }
672
933
  return Object.values(voteHashMap);
673
934
  }
674
- exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
675
935
  /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
676
936
  const aggregateMessageKeysNotFromMe = (keys) => {
677
937
  const keyMap = {};
@@ -1,21 +1,19 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
1
+ import { ILogger } from './logger';
3
2
  import { proto } from '../../WAProto';
4
3
  import { KeyPair } from '../Types';
5
4
  import { BinaryNode } from '../WABinary';
6
- import { ILogger } from './logger';
7
5
  export declare const makeNoiseHandler: ({ keyPair: { private: privateKey, public: publicKey }, NOISE_HEADER, logger, routingInfo }: {
8
6
  keyPair: KeyPair;
9
7
  NOISE_HEADER: Uint8Array;
10
8
  logger: ILogger;
11
9
  routingInfo?: Buffer | undefined;
12
10
  }) => {
13
- encrypt: (plaintext: Uint8Array) => Buffer;
14
- decrypt: (ciphertext: Uint8Array) => Buffer;
11
+ encrypt: (plaintext: Uint8Array) => Buffer<ArrayBuffer>;
12
+ decrypt: (ciphertext: Uint8Array) => Buffer<ArrayBuffer>;
15
13
  authenticate: (data: Uint8Array) => void;
16
14
  mixIntoKey: (data: Uint8Array) => Promise<void>;
17
15
  finishInit: () => Promise<void>;
18
- processHandshake: ({ serverHello }: proto.HandshakeMessage, noiseKey: KeyPair) => Promise<Buffer>;
19
- encodeFrame: (data: Buffer | Uint8Array) => Buffer;
16
+ processHandshake: ({ serverHello }: proto.HandshakeMessage, noiseKey: KeyPair) => Promise<Buffer<ArrayBuffer>>;
17
+ encodeFrame: (data: Buffer | Uint8Array) => Buffer<ArrayBuffer>;
20
18
  decodeFrame: (newData: Buffer | Uint8Array, onFrame: (buff: Uint8Array | BinaryNode) => void) => Promise<void>;
21
19
  };
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decryptPollVote = exports.getChatId = exports.shouldIncrementChatUnread = exports.isRealMessage = exports.cleanMessage = void 0;
3
+ exports.getChatId = exports.shouldIncrementChatUnread = exports.isRealMessage = exports.cleanMessage = void 0;
4
+ exports.decryptPollVote = decryptPollVote;
4
5
  const WAProto_1 = require("../../WAProto");
5
6
  const Types_1 = require("../Types");
6
7
  const messages_1 = require("../Utils/messages");
@@ -101,7 +102,6 @@ function decryptPollVote({ encPayload, encIv }, { pollCreatorJid, pollMsgId, pol
101
102
  return Buffer.from(txt);
102
103
  }
103
104
  }
104
- exports.decryptPollVote = decryptPollVote;
105
105
  const processMessage = async (message, { shouldProcessHistoryMsg, placeholderResendCache, ev, creds, keyStore, logger, options, getMessage }) => {
106
106
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
107
107
  const meId = creds.me.id;
@@ -201,7 +201,6 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
201
201
  const { peerDataOperationResult } = response;
202
202
  for (const result of peerDataOperationResult) {
203
203
  const { placeholderMessageResendResponse: retryResponse } = result;
204
- //eslint-disable-next-line max-depth
205
204
  if (retryResponse) {
206
205
  const webMessageInfo = WAProto_1.proto.WebMessageInfo.decode(retryResponse.webMessageInfoBytes);
207
206
  // wait till another upsert event is available, don't want it to be part of the PDO response message
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.useMultiFileAuthState = void 0;
7
- const async_lock_1 = __importDefault(require("async-lock"));
4
+ const async_mutex_1 = require("async-mutex");
8
5
  const promises_1 = require("fs/promises");
9
6
  const path_1 = require("path");
10
7
  const WAProto_1 = require("../../WAProto");
@@ -13,9 +10,17 @@ const generics_1 = require("./generics");
13
10
  // We need to lock files due to the fact that we are using async functions to read and write files
14
11
  // https://github.com/WhiskeySockets/Baileys/issues/794
15
12
  // https://github.com/nodejs/node/issues/26338
16
- // Default pending is 1000, set it to infinity
17
- // https://github.com/rogierschouten/async-lock/issues/63
18
- const fileLock = new async_lock_1.default({ maxPending: Infinity });
13
+ // Use a Map to store mutexes for each file path
14
+ const fileLocks = new Map();
15
+ // Get or create a mutex for a specific file path
16
+ const getFileLock = (path) => {
17
+ let mutex = fileLocks.get(path);
18
+ if (!mutex) {
19
+ mutex = new async_mutex_1.Mutex();
20
+ fileLocks.set(path, mutex);
21
+ }
22
+ return mutex;
23
+ };
19
24
  /**
20
25
  * stores the full authentication state in a single folder.
21
26
  * Far more efficient than singlefileauthstate
@@ -25,15 +30,31 @@ const fileLock = new async_lock_1.default({ maxPending: Infinity });
25
30
  * */
26
31
  const useMultiFileAuthState = async (folder) => {
27
32
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
- const writeData = (data, file) => {
33
+ const writeData = async (data, file) => {
29
34
  const filePath = (0, path_1.join)(folder, fixFileName(file));
30
- return fileLock.acquire(filePath, () => (0, promises_1.writeFile)((0, path_1.join)(filePath), JSON.stringify(data, generics_1.BufferJSON.replacer)));
35
+ const mutex = getFileLock(filePath);
36
+ return mutex.acquire().then(async (release) => {
37
+ try {
38
+ await (0, promises_1.writeFile)(filePath, JSON.stringify(data, generics_1.BufferJSON.replacer));
39
+ }
40
+ finally {
41
+ release();
42
+ }
43
+ });
31
44
  };
32
45
  const readData = async (file) => {
33
46
  try {
34
47
  const filePath = (0, path_1.join)(folder, fixFileName(file));
35
- const data = await fileLock.acquire(filePath, () => (0, promises_1.readFile)(filePath, { encoding: 'utf-8' }));
36
- return JSON.parse(data, generics_1.BufferJSON.reviver);
48
+ const mutex = getFileLock(filePath);
49
+ return await mutex.acquire().then(async (release) => {
50
+ try {
51
+ const data = await (0, promises_1.readFile)(filePath, { encoding: 'utf-8' });
52
+ return JSON.parse(data, generics_1.BufferJSON.reviver);
53
+ }
54
+ finally {
55
+ release();
56
+ }
57
+ });
37
58
  }
38
59
  catch (error) {
39
60
  return null;
@@ -42,7 +63,17 @@ const useMultiFileAuthState = async (folder) => {
42
63
  const removeData = async (file) => {
43
64
  try {
44
65
  const filePath = (0, path_1.join)(folder, fixFileName(file));
45
- await fileLock.acquire(filePath, () => (0, promises_1.unlink)(filePath));
66
+ const mutex = getFileLock(filePath);
67
+ return mutex.acquire().then(async (release) => {
68
+ try {
69
+ await (0, promises_1.unlink)(filePath);
70
+ }
71
+ catch (_a) {
72
+ }
73
+ finally {
74
+ release();
75
+ }
76
+ });
46
77
  }
47
78
  catch (_a) {
48
79
  }
@@ -86,7 +117,7 @@ const useMultiFileAuthState = async (folder) => {
86
117
  }
87
118
  }
88
119
  },
89
- saveCreds: () => {
120
+ saveCreds: async () => {
90
121
  return writeData(creds, 'creds.json');
91
122
  }
92
123
  };
@@ -3,8 +3,8 @@ import type { AuthenticationCreds, SignalCreds, SocketConfig } from '../Types';
3
3
  import { BinaryNode } from '../WABinary';
4
4
  export declare const generateLoginNode: (userJid: string, config: SocketConfig) => proto.IClientPayload;
5
5
  export declare const generateRegistrationNode: ({ registrationId, signedPreKey, signedIdentityKey }: SignalCreds, config: SocketConfig) => proto.ClientPayload;
6
- export declare const configureSuccessfulPairing: (stanza: BinaryNode, { advSecretKey, signedIdentityKey, signalIdentities }: Pick<AuthenticationCreds, 'advSecretKey' | 'signedIdentityKey' | 'signalIdentities'>) => {
6
+ export declare const configureSuccessfulPairing: (stanza: BinaryNode, { advSecretKey, signedIdentityKey, signalIdentities }: Pick<AuthenticationCreds, "advSecretKey" | "signedIdentityKey" | "signalIdentities">) => {
7
7
  creds: Partial<AuthenticationCreds>;
8
8
  reply: BinaryNode;
9
9
  };
10
- export declare const encodeSignedDeviceIdentity: (account: proto.IADVSignedDeviceIdentity, includeSignatureKey: boolean) => Uint8Array;
10
+ export declare const encodeSignedDeviceIdentity: (account: proto.IADVSignedDeviceIdentity, includeSignatureKey: boolean) => Uint8Array<ArrayBufferLike>;
@@ -22,9 +22,7 @@ const getUserAgent = (config) => {
22
22
  device: 'Desktop',
23
23
  osBuildNumber: '0.1',
24
24
  localeLanguageIso6391: 'en',
25
- mnc: '000',
26
- mcc: '000',
27
- localeCountryIso31661Alpha2: config.countryCode,
25
+ localeCountryIso31661Alpha2: config.countryCode
28
26
  };
29
27
  };
30
28
  const PLATFORM_MAP = {