@jkt48connect-corp/baileys 7.3.2 → 7.3.3

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 (80) hide show
  1. package/README.md +459 -143
  2. package/WAProto/WAProto.proto +227 -2
  3. package/lib/Defaults/baileys-version.json +1 -1
  4. package/lib/Defaults/index.d.ts +9 -7
  5. package/lib/Defaults/index.js +6 -4
  6. package/lib/Socket/Client/index.d.ts +2 -3
  7. package/lib/Socket/Client/index.js +2 -3
  8. package/lib/Socket/Client/types.d.ts +17 -0
  9. package/lib/Socket/Client/types.js +13 -0
  10. package/lib/Socket/Client/{web-socket-client.d.ts → websocket.d.ts} +1 -1
  11. package/lib/Socket/Client/{web-socket-client.js → websocket.js} +2 -2
  12. package/lib/Socket/business.d.ts +8 -3
  13. package/lib/Socket/chats.d.ts +21 -19
  14. package/lib/Socket/chats.js +51 -48
  15. package/lib/Socket/groups.d.ts +28 -26
  16. package/lib/Socket/groups.js +2 -1
  17. package/lib/Socket/index.d.ts +6 -3
  18. package/lib/Socket/messages-recv.d.ts +8 -3
  19. package/lib/Socket/messages-recv.js +308 -149
  20. package/lib/Socket/messages-send.d.ts +23 -26
  21. package/lib/Socket/messages-send.js +193 -166
  22. package/lib/Socket/newsletter.d.ts +2 -2
  23. package/lib/Socket/newsletter.js +3 -3
  24. package/lib/Socket/registration.d.ts +8 -3
  25. package/lib/Socket/socket.d.ts +8 -6
  26. package/lib/Socket/socket.js +19 -14
  27. package/lib/Socket/usync.d.ts +37 -0
  28. package/lib/Socket/usync.js +70 -0
  29. package/lib/Store/make-cache-manager-store.d.ts +2 -2
  30. package/lib/Store/make-ordered-dictionary.d.ts +1 -1
  31. package/lib/Types/Call.d.ts +1 -1
  32. package/lib/Types/Chat.d.ts +12 -7
  33. package/lib/Types/Events.d.ts +17 -2
  34. package/lib/Types/GroupMetadata.d.ts +3 -1
  35. package/lib/Types/Label.d.ts +11 -0
  36. package/lib/Types/Message.d.ts +324 -328
  37. package/lib/Types/Socket.d.ts +7 -0
  38. package/lib/Types/USync.d.ts +25 -0
  39. package/lib/Types/USync.js +2 -0
  40. package/lib/Types/index.d.ts +9 -0
  41. package/lib/Utils/chat-utils.d.ts +4 -4
  42. package/lib/Utils/chat-utils.js +41 -20
  43. package/lib/Utils/crypto.d.ts +1 -1
  44. package/lib/Utils/crypto.js +4 -2
  45. package/lib/Utils/decode-wa-message.d.ts +17 -0
  46. package/lib/Utils/decode-wa-message.js +42 -14
  47. package/lib/Utils/generics.d.ts +4 -10
  48. package/lib/Utils/generics.js +30 -14
  49. package/lib/Utils/history.d.ts +6 -2
  50. package/lib/Utils/history.js +3 -0
  51. package/lib/Utils/messages.d.ts +0 -1
  52. package/lib/Utils/messages.js +247 -39
  53. package/lib/Utils/signal.d.ts +2 -1
  54. package/lib/Utils/signal.js +11 -19
  55. package/lib/Utils/use-multi-file-auth-state.js +11 -3
  56. package/lib/Utils/validate-connection.d.ts +2 -2
  57. package/lib/Utils/validate-connection.js +1 -1
  58. package/lib/WABinary/encode.d.ts +1 -1
  59. package/lib/WABinary/encode.js +16 -10
  60. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  61. package/lib/WAUSync/Protocols/USyncContactProtocol.js +32 -0
  62. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  63. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  64. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  65. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  66. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  67. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  68. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  69. package/lib/WAUSync/Protocols/index.js +20 -0
  70. package/lib/WAUSync/USyncQuery.d.ts +26 -0
  71. package/lib/WAUSync/USyncQuery.js +79 -0
  72. package/lib/WAUSync/USyncUser.d.ts +10 -0
  73. package/lib/WAUSync/USyncUser.js +22 -0
  74. package/lib/WAUSync/index.d.ts +3 -0
  75. package/lib/WAUSync/index.js +19 -0
  76. package/lib/index.d.ts +1 -0
  77. package/lib/index.js +1 -0
  78. package/package.json +24 -19
  79. package/LICENSE +0 -21
  80. package/lib/index.ts +0 -13
@@ -3,8 +3,7 @@ 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.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;
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;
8
7
  const boom_1 = require("@hapi/boom");
9
8
  const axios_1 = __importDefault(require("axios"));
10
9
  const crypto_1 = require("crypto");
@@ -272,8 +271,8 @@ const generateForwardMessageContent = (message, forceForward) => {
272
271
  };
273
272
  exports.generateForwardMessageContent = generateForwardMessageContent;
274
273
  const generateWAMessageContent = async (message, options) => {
275
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
276
- var _o, _p;
274
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5;
275
+ var _6, _7;
277
276
  let m = {};
278
277
  if ('text' in message) {
279
278
  const extContent = { text: message.text };
@@ -321,6 +320,15 @@ const generateWAMessageContent = async (message, options) => {
321
320
  }
322
321
  else if ('location' in message) {
323
322
  m.locationMessage = Types_1.WAProto.Message.LocationMessage.fromObject(message.location);
323
+ if ('contextInfo' in message && !!message.contextInfo) {
324
+ m.locationMessage.contextInfo = message.contextInfo;
325
+ }
326
+ }
327
+ else if ('liveLocation' in message) {
328
+ m.liveLocationMessage = Types_1.WAProto.Message.LiveLocationMessage.fromObject(message.liveLocation);
329
+ if ('contextInfo' in message && !!message.contextInfo) {
330
+ m.liveLocationMessage.contextInfo = message.contextInfo;
331
+ }
324
332
  }
325
333
  else if ('react' in message) {
326
334
  if (!message.react.senderTimestampMs) {
@@ -350,16 +358,26 @@ const generateWAMessageContent = async (message, options) => {
350
358
  m.groupInviteMessage.caption = message.groupInvite.text;
351
359
  m.groupInviteMessage.groupJid = message.groupInvite.jid;
352
360
  m.groupInviteMessage.groupName = message.groupInvite.subject;
361
+ m.groupInviteMessage.jpegThumbnail = message.groupInvite.thumbnail;
353
362
  //TODO: use built-in interface and get disappearing mode info etc.
354
363
  //TODO: cache / use store!?
355
364
  if (options.getProfilePicUrl) {
356
- const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
365
+ let pfpUrl;
366
+ try {
367
+ pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
368
+ }
369
+ catch (_8) {
370
+ pfpUrl = null;
371
+ }
357
372
  if (pfpUrl) {
358
373
  const resp = await axios_1.default.get(pfpUrl, { responseType: 'arraybuffer' });
359
374
  if (resp.status === 200) {
360
375
  m.groupInviteMessage.jpegThumbnail = resp.data;
361
376
  }
362
377
  }
378
+ else {
379
+ m.groupInviteMessage.jpegThumbnail = null;
380
+ }
363
381
  }
364
382
  }
365
383
  else if ('pin' in message) {
@@ -407,6 +425,19 @@ const generateWAMessageContent = async (message, options) => {
407
425
  type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
408
426
  };
409
427
  break;
428
+ case 'interactive':
429
+ m.interactiveResponseMessage = {
430
+ body: {
431
+ text: message.buttonReply.text,
432
+ format: WAProto_1.proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1
433
+ },
434
+ nativeFlowResponseMessage: {
435
+ name: message.buttonReply.nativeFlow.name,
436
+ paramsJson: message.buttonReply.nativeFlow.paramsJson,
437
+ version: message.buttonReply.nativeFlow.version
438
+ }
439
+ };
440
+ break;
410
441
  }
411
442
  }
412
443
  else if ('product' in message) {
@@ -418,6 +449,12 @@ const generateWAMessageContent = async (message, options) => {
418
449
  productImage: imageMessage,
419
450
  }
420
451
  });
452
+ if ('contextInfo' in message && !!message.contextInfo) {
453
+ m.productMessage.contextInfo = message.contextInfo;
454
+ }
455
+ if ('mentions' in message && !!message.mentions) {
456
+ m.productMessage.contextInfo = { mentionedJid: message.mentions };
457
+ }
421
458
  }
422
459
  else if ('order' in message) {
423
460
  m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
@@ -438,8 +475,8 @@ const generateWAMessageContent = async (message, options) => {
438
475
  m.listResponseMessage = { ...message.listReply };
439
476
  }
440
477
  else if ('poll' in message) {
441
- (_o = message.poll).selectableCount || (_o.selectableCount = 0);
442
- (_p = message.poll).toAnnouncementGroup || (_p.toAnnouncementGroup = false);
478
+ (_6 = message.poll).selectableCount || (_6.selectableCount = 0);
479
+ (_7 = message.poll).toAnnouncementGroup || (_7.toAnnouncementGroup = false);
443
480
  if (!Array.isArray(message.poll.values)) {
444
481
  throw new boom_1.Boom('Invalid poll values', { statusCode: 400 });
445
482
  }
@@ -470,6 +507,32 @@ const generateWAMessageContent = async (message, options) => {
470
507
  m.pollCreationMessage = pollCreationMessage;
471
508
  }
472
509
  }
510
+ if ('contextInfo' in message && !!message.contextInfo) {
511
+ pollCreationMessage.contextInfo = message.contextInfo;
512
+ }
513
+ }
514
+ else if ('pollResult' in message) {
515
+ if (!Array.isArray(message.pollResult.votes)) {
516
+ throw new boom_1.Boom('Invalid poll votes result', { statusCode: 400 });
517
+ }
518
+ m.messageContextInfo = {
519
+ // encKey
520
+ messageSecret: message.pollResult.messageSecret || (0, crypto_1.randomBytes)(32),
521
+ };
522
+ const pollResultSnapshotMessage = {
523
+ name: message.pollResult.name,
524
+ pollVotes: message.pollResult.votes.map((option) => ({
525
+ optionName: option[0],
526
+ optionVoteCount: option[1]
527
+ })),
528
+ };
529
+ if ('contextInfo' in message && !!message.contextInfo) {
530
+ pollResultSnapshotMessage.contextInfo = message.contextInfo;
531
+ }
532
+ if ('mentions' in message && !!message.mentions) {
533
+ pollResultSnapshotMessage.contextInfo = { mentionedJid: message.mentions };
534
+ }
535
+ m.pollResultSnapshotMessage = pollResultSnapshotMessage;
473
536
  }
474
537
  else if ('event' in message) {
475
538
  m.messageContextInfo = {
@@ -484,6 +547,26 @@ const generateWAMessageContent = async (message, options) => {
484
547
  m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
485
548
  m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
486
549
  m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
550
+ //TODO: use built-in interface and get disappearing mode info etc.
551
+ //TODO: cache / use store!?
552
+ if (options.getProfilePicUrl) {
553
+ let pfpUrl;
554
+ try {
555
+ pfpUrl = await options.getProfilePicUrl(message.inviteAdmin.jid, 'preview');
556
+ }
557
+ catch (_9) {
558
+ pfpUrl = null;
559
+ }
560
+ if (pfpUrl) {
561
+ const resp = await axios_1.default.get(pfpUrl, { responseType: 'arraybuffer' });
562
+ if (resp.status === 200) {
563
+ m.newsletterAdminInviteMessage.jpegThumbnail = resp.data;
564
+ }
565
+ }
566
+ else {
567
+ m.newsletterAdminInviteMessage.jpegThumbnail = null;
568
+ }
569
+ }
487
570
  }
488
571
  else if ('requestPayment' in message) {
489
572
  const sticker = ((_d = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _d === void 0 ? void 0 : _d.sticker) ?
@@ -494,7 +577,12 @@ const generateWAMessageContent = async (message, options) => {
494
577
  notes = {
495
578
  stickerMessage: {
496
579
  ...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
497
- contextInfo: (_g = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _g === void 0 ? void 0 : _g.contextInfo
580
+ contextInfo: {
581
+ stanzaId: (_h = (_g = options === null || options === void 0 ? void 0 : options.quoted) === null || _g === void 0 ? void 0 : _g.key) === null || _h === void 0 ? void 0 : _h.id,
582
+ participant: (_k = (_j = options === null || options === void 0 ? void 0 : options.quoted) === null || _j === void 0 ? void 0 : _j.key) === null || _k === void 0 ? void 0 : _k.participant,
583
+ quotedMessage: (_l = options === null || options === void 0 ? void 0 : options.quoted) === null || _l === void 0 ? void 0 : _l.message,
584
+ ...(_m = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _m === void 0 ? void 0 : _m.contextInfo,
585
+ }
498
586
  }
499
587
  };
500
588
  }
@@ -502,20 +590,22 @@ const generateWAMessageContent = async (message, options) => {
502
590
  notes = {
503
591
  extendedTextMessage: {
504
592
  text: message.requestPayment.note,
505
- contextInfo: (_h = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _h === void 0 ? void 0 : _h.contextInfo,
593
+ contextInfo: {
594
+ stanzaId: (_p = (_o = options === null || options === void 0 ? void 0 : options.quoted) === null || _o === void 0 ? void 0 : _o.key) === null || _p === void 0 ? void 0 : _p.id,
595
+ participant: (_r = (_q = options === null || options === void 0 ? void 0 : options.quoted) === null || _q === void 0 ? void 0 : _q.key) === null || _r === void 0 ? void 0 : _r.participant,
596
+ quotedMessage: (_s = options === null || options === void 0 ? void 0 : options.quoted) === null || _s === void 0 ? void 0 : _s.message,
597
+ ...(_t = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _t === void 0 ? void 0 : _t.contextInfo,
598
+ }
506
599
  }
507
600
  };
508
601
  }
509
- else {
510
- throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
511
- }
512
602
  m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
513
603
  expiryTimestamp: message.requestPayment.expiry,
514
604
  amount1000: message.requestPayment.amount,
515
605
  currencyCodeIso4217: message.requestPayment.currency,
516
606
  requestFrom: message.requestPayment.from,
517
607
  noteMessage: { ...notes },
518
- background: (_j = message.requestPayment.background) !== null && _j !== void 0 ? _j : null,
608
+ background: (_u = message.requestPayment.background) !== null && _u !== void 0 ? _u : null,
519
609
  });
520
610
  }
521
611
  else if ('sharePhoneNumber' in message) {
@@ -583,22 +673,33 @@ const generateWAMessageContent = async (message, options) => {
583
673
  }
584
674
  };
585
675
  }
586
- if ('interactive' in message && !!message.interactive) {
676
+ if ('interactiveButtons' in message && !!message.interactiveButtons) {
587
677
  const interactiveMessage = {
588
678
  nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
589
- buttons: message.interactive,
679
+ buttons: message.interactiveButtons,
590
680
  })
591
681
  };
592
682
  if ('text' in message) {
593
683
  body: interactiveMessage.body = {
594
684
  text: message.text
595
685
  };
686
+ header: interactiveMessage.header = {
687
+ title: message.title,
688
+ subtitle: message.subtitle,
689
+ hasMediaAttachment: (_v = message === null || message === void 0 ? void 0 : message.media) !== null && _v !== void 0 ? _v : false,
690
+ };
596
691
  }
597
692
  else {
598
693
  if ('caption' in message) {
599
694
  body: interactiveMessage.body = {
600
695
  text: message.caption
601
696
  };
697
+ header: interactiveMessage.header = {
698
+ title: message.title,
699
+ subtitle: message.subtitle,
700
+ hasMediaAttachment: (_w = message === null || message === void 0 ? void 0 : message.media) !== null && _w !== void 0 ? _w : false,
701
+ };
702
+ Object.assign(interactiveMessage.header, m);
602
703
  }
603
704
  }
604
705
  if ('footer' in message && !!message.footer) {
@@ -606,13 +707,48 @@ const generateWAMessageContent = async (message, options) => {
606
707
  text: message.footer
607
708
  };
608
709
  }
609
- if ('title' in message && !!message.title) {
710
+ if ('contextInfo' in message && !!message.contextInfo) {
711
+ interactiveMessage.contextInfo = message.contextInfo;
712
+ }
713
+ if ('mentions' in message && !!message.mentions) {
714
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
715
+ }
716
+ m = { interactiveMessage };
717
+ }
718
+ if ('shop' in message && !!message.shop) {
719
+ const interactiveMessage = {
720
+ shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
721
+ surface: message.shop,
722
+ id: message.id
723
+ })
724
+ };
725
+ if ('text' in message) {
726
+ body: interactiveMessage.body = {
727
+ text: message.text
728
+ };
610
729
  header: interactiveMessage.header = {
611
730
  title: message.title,
612
731
  subtitle: message.subtitle,
613
- hasMediaAttachment: (_k = message === null || message === void 0 ? void 0 : message.media) !== null && _k !== void 0 ? _k : false,
732
+ hasMediaAttachment: (_x = message === null || message === void 0 ? void 0 : message.media) !== null && _x !== void 0 ? _x : false,
733
+ };
734
+ }
735
+ else {
736
+ if ('caption' in message) {
737
+ body: interactiveMessage.body = {
738
+ text: message.caption
739
+ };
740
+ header: interactiveMessage.header = {
741
+ title: message.title,
742
+ subtitle: message.subtitle,
743
+ hasMediaAttachment: (_y = message === null || message === void 0 ? void 0 : message.media) !== null && _y !== void 0 ? _y : false,
744
+ };
745
+ Object.assign(interactiveMessage.header, m);
746
+ }
747
+ }
748
+ if ('footer' in message && !!message.footer) {
749
+ footer: interactiveMessage.footer = {
750
+ text: message.footer
614
751
  };
615
- Object.assign(interactiveMessage.header, m);
616
752
  }
617
753
  if ('contextInfo' in message && !!message.contextInfo) {
618
754
  interactiveMessage.contextInfo = message.contextInfo;
@@ -622,23 +758,35 @@ const generateWAMessageContent = async (message, options) => {
622
758
  }
623
759
  m = { interactiveMessage };
624
760
  }
625
- if ('shop' in message && !!message.shop) {
761
+ if ('collection' in message && !!message.shop) {
626
762
  const interactiveMessage = {
627
- shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
628
- surface: message.shop,
629
- id: message.id
763
+ collectionMessage: Types_1.WAProto.Message.InteractiveMessage.CollectionMessage.fromObject({
764
+ bizJid: (_z = message === null || message === void 0 ? void 0 : message.collection) === null || _z === void 0 ? void 0 : _z.bizJid,
765
+ id: (_0 = message === null || message === void 0 ? void 0 : message.collection) === null || _0 === void 0 ? void 0 : _0.id,
766
+ messageVersion: (_1 = message === null || message === void 0 ? void 0 : message.collection) === null || _1 === void 0 ? void 0 : _1.version
630
767
  })
631
768
  };
632
769
  if ('text' in message) {
633
770
  body: interactiveMessage.body = {
634
771
  text: message.text
635
772
  };
773
+ header: interactiveMessage.header = {
774
+ title: message.title,
775
+ subtitle: message.subtitle,
776
+ hasMediaAttachment: (_2 = message === null || message === void 0 ? void 0 : message.media) !== null && _2 !== void 0 ? _2 : false,
777
+ };
636
778
  }
637
779
  else {
638
780
  if ('caption' in message) {
639
781
  body: interactiveMessage.body = {
640
782
  text: message.caption
641
783
  };
784
+ header: interactiveMessage.header = {
785
+ title: message.title,
786
+ subtitle: message.subtitle,
787
+ hasMediaAttachment: (_3 = message === null || message === void 0 ? void 0 : message.media) !== null && _3 !== void 0 ? _3 : false,
788
+ };
789
+ Object.assign(interactiveMessage.header, m);
642
790
  }
643
791
  }
644
792
  if ('footer' in message && !!message.footer) {
@@ -646,13 +794,73 @@ const generateWAMessageContent = async (message, options) => {
646
794
  text: message.footer
647
795
  };
648
796
  }
649
- if ('title' in message && !!message.title) {
797
+ if ('contextInfo' in message && !!message.contextInfo) {
798
+ interactiveMessage.contextInfo = message.contextInfo;
799
+ }
800
+ if ('mentions' in message && !!message.mentions) {
801
+ interactiveMessage.contextInfo = { mentionedJid: message.mentions };
802
+ }
803
+ m = { interactiveMessage };
804
+ }
805
+ if ('cards' in message && !!message.cards) {
806
+ const slides = await Promise.all(message.cards.map(async (slide) => {
807
+ const { image, video, product, title, caption, footer, buttons } = slide;
808
+ let header;
809
+ if (product) {
810
+ const { imageMessage } = await (0, exports.prepareWAMessageMedia)({ image: product.productImage, ...options }, options);
811
+ header = {
812
+ productMesage: Types_1.WAProto.Message.ProductMessage.fromObject({
813
+ product: {
814
+ ...product,
815
+ productImage: imageMessage,
816
+ },
817
+ ...slide
818
+ })
819
+ };
820
+ }
821
+ else if (image) {
822
+ header = await (0, exports.prepareWAMessageMedia)({ image: image, ...options }, options);
823
+ }
824
+ else if (video) {
825
+ header = await (0, exports.prepareWAMessageMedia)({ video: video, ...options }, options);
826
+ }
827
+ const msg = {
828
+ header: {
829
+ title,
830
+ hasMediaAttachment: true,
831
+ ...header
832
+ },
833
+ body: {
834
+ text: caption
835
+ },
836
+ footer: {
837
+ text: footer
838
+ },
839
+ nativeFlowMessage: {
840
+ buttons,
841
+ },
842
+ };
843
+ return msg;
844
+ }));
845
+ const interactiveMessage = {
846
+ carouselMessage: Types_1.WAProto.Message.InteractiveMessage.CarouselMessage.fromObject({
847
+ cards: slides
848
+ })
849
+ };
850
+ if ('text' in message) {
851
+ body: interactiveMessage.body = {
852
+ text: message.text
853
+ };
650
854
  header: interactiveMessage.header = {
651
855
  title: message.title,
652
856
  subtitle: message.subtitle,
653
- hasMediaAttachment: (_l = message === null || message === void 0 ? void 0 : message.media) !== null && _l !== void 0 ? _l : false,
857
+ hasMediaAttachment: (_4 = message === null || message === void 0 ? void 0 : message.media) !== null && _4 !== void 0 ? _4 : false,
858
+ };
859
+ }
860
+ if ('footer' in message && !!message.footer) {
861
+ footer: interactiveMessage.footer = {
862
+ text: message.footer
654
863
  };
655
- Object.assign(interactiveMessage.header, m);
656
864
  }
657
865
  if ('contextInfo' in message && !!message.contextInfo) {
658
866
  interactiveMessage.contextInfo = message.contextInfo;
@@ -669,7 +877,7 @@ const generateWAMessageContent = async (message, options) => {
669
877
  title: message.title,
670
878
  footerText: message.footer,
671
879
  description: message.text,
672
- listType: message.hasOwnProperty("listType") ? message.listType : WAProto_1.proto.Message.ListMessage.ListType.PRODUCT_LIST
880
+ listType: WAProto_1.proto.Message.ListMessage.ListType.SINGLE_SELECT
673
881
  };
674
882
  m = { listMessage };
675
883
  }
@@ -688,7 +896,7 @@ const generateWAMessageContent = async (message, options) => {
688
896
  if ('lottie' in message && !!message.lottie) {
689
897
  m = { lottieStickerMessage: { message: m } };
690
898
  }
691
- if ('mentions' in message && ((_m = message.mentions) === null || _m === void 0 ? void 0 : _m.length)) {
899
+ if ('mentions' in message && ((_5 = message.mentions) === null || _5 === void 0 ? void 0 : _5.length)) {
692
900
  const [messageType] = Object.keys(m);
693
901
  m[messageType].contextInfo = m[messageType] || {};
694
902
  m[messageType].contextInfo.mentionedJid = message.mentions;
@@ -712,17 +920,7 @@ const generateWAMessageContent = async (message, options) => {
712
920
  };
713
921
  exports.generateWAMessageContent = generateWAMessageContent;
714
922
  const generateWAMessageFromContent = (jid, message, options) => {
715
- if (message?.viewOnceMessage) {
716
- const viewOnceMessage = message.viewOnceMessage;
717
-
718
- if (viewOnceMessage.message?.interactiveMessage) {
719
- message = viewOnceMessage.message;
720
- }
721
-
722
- if (viewOnceMessage.message?.buttonsMessage) {
723
- message = viewOnceMessage.message;
724
- }
725
- }
923
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
726
924
  // set timestamp to now
727
925
  // if not specified
728
926
  if (!options.timestamp) {
@@ -742,7 +940,16 @@ const generateWAMessageFromContent = (jid, message, options) => {
742
940
  if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
743
941
  delete quotedContent.contextInfo;
744
942
  }
745
- const contextInfo = innerMessage[key].contextInfo || {};
943
+ let requestPayment;
944
+ if (key === 'requestPaymentMessage') {
945
+ if (((_a = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _a === void 0 ? void 0 : _a.noteMessage) && ((_c = (_b = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _b === void 0 ? void 0 : _b.noteMessage) === null || _c === void 0 ? void 0 : _c.extendedTextMessage)) {
946
+ requestPayment = (_e = (_d = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _d === void 0 ? void 0 : _d.noteMessage) === null || _e === void 0 ? void 0 : _e.extendedTextMessage;
947
+ }
948
+ else if (((_f = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _f === void 0 ? void 0 : _f.noteMessage) && ((_h = (_g = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _g === void 0 ? void 0 : _g.noteMessage) === null || _h === void 0 ? void 0 : _h.stickerMessage)) {
949
+ requestPayment = (_k = (_j = innerMessage.requestPaymentMessage) === null || _j === void 0 ? void 0 : _j.noteMessage) === null || _k === void 0 ? void 0 : _k.stickerMessage;
950
+ }
951
+ }
952
+ const contextInfo = (key === 'requestPaymentMessage' ? requestPayment.contextInfo : innerMessage[key].contextInfo) || {};
746
953
  contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
747
954
  contextInfo.stanzaId = quoted.key.id;
748
955
  contextInfo.quotedMessage = quotedMsg;
@@ -949,6 +1156,7 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
949
1156
  }
950
1157
  return Object.values(voteHashMap);
951
1158
  }
1159
+ exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
952
1160
  /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
953
1161
  const aggregateMessageKeysNotFromMe = (keys) => {
954
1162
  const keyMap = {};
@@ -1,6 +1,7 @@
1
1
  import { SignalRepository } from '../Types';
2
2
  import { AuthenticationCreds, AuthenticationState, KeyPair, SignalIdentity, SignalKeyStore, SignedKeyPair } from '../Types/Auth';
3
3
  import { BinaryNode, JidWithDevice } from '../WABinary';
4
+ import { USyncQueryResultList } from '../WAUSync';
4
5
  export declare const createSignalIdentity: (wid: string, accountSignatureKey: Uint8Array) => SignalIdentity;
5
6
  export declare const getPreKeys: ({ get }: SignalKeyStore, min: number, limit: number) => Promise<{
6
7
  [id: string]: KeyPair;
@@ -15,7 +16,7 @@ export declare const generateOrGetPreKeys: (creds: AuthenticationCreds, range: n
15
16
  export declare const xmppSignedPreKey: (key: SignedKeyPair) => BinaryNode;
16
17
  export declare const xmppPreKey: (pair: KeyPair, id: number) => BinaryNode;
17
18
  export declare const parseAndInjectE2ESessions: (node: BinaryNode, repository: SignalRepository) => Promise<void>;
18
- export declare const extractDeviceJids: (result: BinaryNode, myJid: string, excludeZeroDevices: boolean) => JidWithDevice[];
19
+ export declare const extractDeviceJids: (result: USyncQueryResultList[], myJid: string, excludeZeroDevices: boolean) => JidWithDevice[];
19
20
  /**
20
21
  * get the next N keys for upload or processing
21
22
  * @param count number of pre-keys to get or generate
@@ -85,27 +85,19 @@ const parseAndInjectE2ESessions = async (node, repository) => {
85
85
  };
86
86
  exports.parseAndInjectE2ESessions = parseAndInjectE2ESessions;
87
87
  const extractDeviceJids = (result, myJid, excludeZeroDevices) => {
88
- var _a;
89
88
  const { user: myUser, device: myDevice } = (0, WABinary_1.jidDecode)(myJid);
90
89
  const extracted = [];
91
- for (const node of result.content) {
92
- const list = (_a = (0, WABinary_1.getBinaryNodeChild)(node, 'list')) === null || _a === void 0 ? void 0 : _a.content;
93
- if (list && Array.isArray(list)) {
94
- for (const item of list) {
95
- const { user } = (0, WABinary_1.jidDecode)(item.attrs.jid);
96
- const devicesNode = (0, WABinary_1.getBinaryNodeChild)(item, 'devices');
97
- const deviceListNode = (0, WABinary_1.getBinaryNodeChild)(devicesNode, 'device-list');
98
- if (Array.isArray(deviceListNode === null || deviceListNode === void 0 ? void 0 : deviceListNode.content)) {
99
- for (const { tag, attrs } of deviceListNode.content) {
100
- const device = +attrs.id;
101
- if (tag === 'device' && // ensure the "device" tag
102
- (!excludeZeroDevices || device !== 0) && // if zero devices are not-excluded, or device is non zero
103
- (myUser !== user || myDevice !== device) && // either different user or if me user, not this device
104
- (device === 0 || !!attrs['key-index']) // ensure that "key-index" is specified for "non-zero" devices, produces a bad req otherwise
105
- ) {
106
- extracted.push({ user, device });
107
- }
108
- }
90
+ for (const userResult of result) {
91
+ const { devices, id } = userResult;
92
+ const { user } = (0, WABinary_1.jidDecode)(id);
93
+ const deviceList = devices === null || devices === void 0 ? void 0 : devices.deviceList;
94
+ if (Array.isArray(deviceList)) {
95
+ for (const { id: device, keyIndex } of deviceList) {
96
+ if ((!excludeZeroDevices || device !== 0) && // if zero devices are not-excluded, or device is non zero
97
+ (myUser !== user || myDevice !== device) && // either different user or if me user, not this device
98
+ (device === 0 || !!keyIndex) // ensure that "key-index" is specified for "non-zero" devices, produces a bad req otherwise
99
+ ) {
100
+ extracted.push({ user, device });
109
101
  }
110
102
  }
111
103
  }
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.useMultiFileAuthState = void 0;
4
7
  const promises_1 = require("fs/promises");
@@ -6,6 +9,8 @@ const path_1 = require("path");
6
9
  const WAProto_1 = require("../../WAProto");
7
10
  const auth_utils_1 = require("./auth-utils");
8
11
  const generics_1 = require("./generics");
12
+ const async_lock_1 = __importDefault(require("async-lock"));
13
+ const fileLock = new async_lock_1.default({ maxPending: Infinity });
9
14
  /**
10
15
  * stores the full authentication state in a single folder.
11
16
  * Far more efficient than singlefileauthstate
@@ -15,11 +20,13 @@ const generics_1 = require("./generics");
15
20
  * */
16
21
  const useMultiFileAuthState = async (folder) => {
17
22
  const writeData = (data, file) => {
18
- return (0, promises_1.writeFile)((0, path_1.join)(folder, fixFileName(file)), JSON.stringify(data, generics_1.BufferJSON.replacer));
23
+ const filePath = (0, path_1.join)(folder, fixFileName(file));
24
+ return fileLock.acquire(filePath, () => (0, promises_1.writeFile)((0, path_1.join)(filePath), JSON.stringify(data, generics_1.BufferJSON.replacer)));
19
25
  };
20
26
  const readData = async (file) => {
21
27
  try {
22
- const data = await (0, promises_1.readFile)((0, path_1.join)(folder, fixFileName(file)), { encoding: 'utf-8' });
28
+ const filePath = (0, path_1.join)(folder, fixFileName(file));
29
+ const data = await fileLock.acquire(filePath, () => (0, promises_1.readFile)(filePath, { encoding: 'utf-8' }));
23
30
  return JSON.parse(data, generics_1.BufferJSON.reviver);
24
31
  }
25
32
  catch (error) {
@@ -28,7 +35,8 @@ const useMultiFileAuthState = async (folder) => {
28
35
  };
29
36
  const removeData = async (file) => {
30
37
  try {
31
- await (0, promises_1.unlink)((0, path_1.join)(folder, fixFileName(file)));
38
+ const filePath = (0, path_1.join)(folder, fixFileName(file));
39
+ await fileLock.acquire(filePath, () => (0, promises_1.unlink)(filePath));
32
40
  }
33
41
  catch (_a) {
34
42
  }
@@ -4,8 +4,8 @@ import { BinaryNode } from '../WABinary';
4
4
  export declare const generateMobileNode: (config: SocketConfig) => proto.IClientPayload;
5
5
  export declare const generateLoginNode: (userJid: string, config: SocketConfig) => proto.IClientPayload;
6
6
  export declare const generateRegistrationNode: ({ registrationId, signedPreKey, signedIdentityKey }: SignalCreds, config: SocketConfig) => proto.ClientPayload;
7
- export declare const configureSuccessfulPairing: (stanza: BinaryNode, { advSecretKey, signedIdentityKey, signalIdentities }: Pick<AuthenticationCreds, "advSecretKey" | "signedIdentityKey" | "signalIdentities">) => {
7
+ export declare const configureSuccessfulPairing: (stanza: BinaryNode, { advSecretKey, signedIdentityKey, signalIdentities }: Pick<AuthenticationCreds, 'advSecretKey' | 'signedIdentityKey' | 'signalIdentities'>) => {
8
8
  creds: Partial<AuthenticationCreds>;
9
9
  reply: BinaryNode;
10
10
  };
11
- export declare const encodeSignedDeviceIdentity: (account: proto.IADVSignedDeviceIdentity, includeSignatureKey: boolean) => any;
11
+ export declare const encodeSignedDeviceIdentity: (account: proto.IADVSignedDeviceIdentity, includeSignatureKey: boolean) => Uint8Array;
@@ -72,7 +72,7 @@ const generateMobileNode = (config) => {
72
72
  appCached: false,
73
73
  dnsMethod: WAProto_1.proto.ClientPayload.DNSSource.DNSResolutionMethod.SYSTEM,
74
74
  },
75
- passive: false, // XMPP heartbeat setting (false: server actively pings) (true: client actively pings)
75
+ passive: false,
76
76
  pushName: 'test',
77
77
  username: Number(`${config.auth.creds.registration.phoneNumberCountryCode}${config.auth.creds.registration.phoneNumberNationalNumber}`),
78
78
  };
@@ -1,2 +1,2 @@
1
1
  import type { BinaryNode, BinaryNodeCodingOptions } from './types';
2
- export declare const encodeBinaryNode: ({ tag, attrs, content }: BinaryNode, opts?: Pick<BinaryNodeCodingOptions, "TAGS" | "TOKEN_MAP">, buffer?: number[]) => any;
2
+ export declare const encodeBinaryNode: (node: BinaryNode, opts?: Pick<BinaryNodeCodingOptions, "TAGS" | "TOKEN_MAP">, buffer?: number[]) => Buffer;