@elrayyxml/baileys 1.0.3 → 1.0.7

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 (103) hide show
  1. package/README.md +2517 -0
  2. package/lib/Defaults/baileys-version.json +1 -1
  3. package/lib/Defaults/index.d.ts +51 -0
  4. package/lib/Defaults/index.js +9 -1
  5. package/lib/Defaults/phonenumber-mcc.json +223 -0
  6. package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
  7. package/lib/Signal/Group/group-session-builder.d.ts +14 -0
  8. package/lib/Signal/Group/group_cipher.d.ts +17 -0
  9. package/lib/Signal/Group/index.d.ts +11 -0
  10. package/lib/Signal/Group/keyhelper.d.ts +10 -0
  11. package/lib/Signal/Group/queue-job.d.ts +1 -0
  12. package/lib/Signal/Group/sender-chain-key.d.ts +13 -0
  13. package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -0
  14. package/lib/Signal/Group/sender-key-message.d.ts +18 -0
  15. package/lib/Signal/Group/sender-key-name.d.ts +17 -0
  16. package/lib/Signal/Group/sender-key-record.d.ts +30 -0
  17. package/lib/Signal/Group/sender-key-state.d.ts +38 -0
  18. package/lib/Signal/Group/sender-message-key.d.ts +11 -0
  19. package/lib/Signal/libsignal.d.ts +3 -0
  20. package/lib/Socket/Client/index.d.ts +2 -0
  21. package/lib/Socket/Client/types.d.ts +16 -0
  22. package/lib/Socket/Client/websocket.d.ts +13 -0
  23. package/lib/Socket/business.d.ts +172 -0
  24. package/lib/Socket/chats.d.ts +82 -0
  25. package/lib/Socket/groups.d.ts +124 -0
  26. package/lib/Socket/index.d.ts +172 -0
  27. package/lib/Socket/messages-recv.d.ts +161 -0
  28. package/lib/Socket/messages-send.d.ts +151 -0
  29. package/lib/Socket/messages-send.js +236 -59
  30. package/lib/Socket/newsletter.d.ts +136 -0
  31. package/lib/Socket/newsletter.js +5 -1
  32. package/lib/Socket/socket.d.ts +43 -0
  33. package/lib/Socket/usync.d.ts +36 -0
  34. package/lib/Store/index.d.ts +2 -0
  35. package/lib/Store/make-in-memory-store.d.ts +118 -0
  36. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  37. package/lib/Store/object-repository.d.ts +10 -0
  38. package/lib/Types/Auth.d.ts +103 -0
  39. package/lib/Types/Call.d.ts +13 -0
  40. package/lib/Types/Chat.d.ts +109 -0
  41. package/lib/Types/Contact.d.ts +23 -0
  42. package/lib/Types/Events.d.ts +199 -0
  43. package/lib/Types/GroupMetadata.d.ts +64 -0
  44. package/lib/Types/Label.d.ts +35 -0
  45. package/lib/Types/LabelAssociation.d.ts +29 -0
  46. package/lib/Types/Message.d.ts +400 -0
  47. package/lib/Types/Newsletter.d.ts +79 -0
  48. package/lib/Types/Product.d.ts +78 -0
  49. package/lib/Types/Signal.d.ts +57 -0
  50. package/lib/Types/Socket.d.ts +119 -0
  51. package/lib/Types/State.d.ts +27 -0
  52. package/lib/Types/USync.d.ts +25 -0
  53. package/lib/Types/index.d.ts +64 -0
  54. package/lib/Utils/auth-utils.d.ts +18 -0
  55. package/lib/Utils/baileys-event-stream.d.ts +16 -0
  56. package/lib/Utils/business.d.ts +22 -0
  57. package/lib/Utils/chat-utils.d.ts +70 -0
  58. package/lib/Utils/crypto.d.ts +40 -0
  59. package/lib/Utils/decode-wa-message.d.ts +35 -0
  60. package/lib/Utils/event-buffer.d.ts +35 -0
  61. package/lib/Utils/generics.d.ts +89 -0
  62. package/lib/Utils/generics.js +31 -4
  63. package/lib/Utils/history.d.ts +19 -0
  64. package/lib/Utils/index.d.ts +17 -0
  65. package/lib/Utils/link-preview.d.ts +21 -0
  66. package/lib/Utils/logger.d.ts +11 -0
  67. package/lib/Utils/lt-hash.d.ts +12 -0
  68. package/lib/Utils/make-mutex.d.ts +7 -0
  69. package/lib/Utils/messages-media.d.ts +120 -0
  70. package/lib/Utils/messages.d.ts +75 -0
  71. package/lib/Utils/messages.js +400 -38
  72. package/lib/Utils/noise-handler.d.ts +19 -0
  73. package/lib/Utils/process-message.d.ts +42 -0
  74. package/lib/Utils/signal.d.ts +33 -0
  75. package/lib/Utils/use-multi-file-auth-state.d.ts +12 -0
  76. package/lib/Utils/validate-connection.d.ts +10 -0
  77. package/lib/WABinary/constants.d.ts +27 -0
  78. package/lib/WABinary/decode.d.ts +6 -0
  79. package/lib/WABinary/encode.d.ts +2 -0
  80. package/lib/WABinary/generic-utils.d.ts +14 -0
  81. package/lib/WABinary/generic-utils.js +11 -8
  82. package/lib/WABinary/index.d.ts +5 -0
  83. package/lib/WABinary/jid-utils.d.ts +36 -0
  84. package/lib/WABinary/types.d.ts +18 -0
  85. package/lib/WAM/BinaryInfo.d.ts +8 -0
  86. package/lib/WAM/constants.d.ts +38 -0
  87. package/lib/WAM/encode.d.ts +2 -0
  88. package/lib/WAM/index.d.ts +3 -0
  89. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  90. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  91. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  92. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  93. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
  94. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
  95. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  96. package/lib/WAUSync/USyncQuery.d.ts +28 -0
  97. package/lib/WAUSync/USyncUser.d.ts +12 -0
  98. package/lib/WAUSync/index.d.ts +3 -0
  99. package/lib/index.d.ts +13 -0
  100. package/lib/index.js +4 -1
  101. package/package.json +17 -14
  102. package/README.MD +0 -78
  103. package/lib/Socket/type.js +0 -405
@@ -3,7 +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;
6
+ exports.prepareAlbumMessageContent = 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
7
  exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
8
8
  const boom_1 = require("@hapi/boom");
9
9
  const axios_1 = __importDefault(require("axios"));
@@ -16,6 +16,7 @@ const WABinary_1 = require("../WABinary");
16
16
  const crypto_2 = require("./crypto");
17
17
  const generics_1 = require("./generics");
18
18
  const messages_media_1 = require("./messages-media");
19
+ const fflate_1 = require("fflate");
19
20
  const MIMETYPE_MAP = {
20
21
  image: 'image/jpeg',
21
22
  video: 'video/mp4',
@@ -79,38 +80,6 @@ const prepareWAMessageMedia = async (message, options) => {
79
80
  }
80
81
  const uploadData = {
81
82
  ...message,
82
- ...(message.annotations ? {
83
- annotations: message.annotations
84
- } : {
85
- annotations: [
86
- {
87
- polygonVertices: [
88
- {
89
- x: 60.71664810180664,
90
- y: -36.39784622192383
91
- },
92
- {
93
- x: -16.710189819335938,
94
- y: 49.263675689697266
95
- },
96
- {
97
- x: -56.585853576660156,
98
- y: 37.85963439941406
99
- },
100
- {
101
- x: 20.840980529785156,
102
- y: -47.80188751220703
103
- }
104
- ],
105
- newsletter: {
106
- newsletterJid: "120363402530588049@newsletter",
107
- serverMessageId: 0,
108
- newsletterName: "𓅯 ᴇʟʀᴀʏʏxᴍʟ ɴᴏᴛɪꜰɪᴇʀ 🫟",
109
- contentType: "UPDATE",
110
- }
111
- }
112
- ]
113
- }),
114
83
  media: message[mediaType]
115
84
  };
116
85
  delete uploadData[mediaType];
@@ -227,6 +196,51 @@ const prepareWAMessageMedia = async (message, options) => {
227
196
  return obj;
228
197
  };
229
198
  exports.prepareWAMessageMedia = prepareWAMessageMedia;
199
+ const prepareAlbumMessageContent = async (jid, albums, options) => {
200
+ const array = albums;
201
+
202
+ const albumContent = {
203
+ messageContextInfo: {
204
+ messageSecret: crypto_1.randomBytes(32),
205
+ },
206
+ albumMessage: {
207
+ expectedImageCount: array.filter((a) => a.hasOwnProperty("image")).length,
208
+ expectedVideoCount: array.filter((a) => a.hasOwnProperty("video")).length,
209
+ },
210
+ };
211
+ const albumMsg = await generateWAMessageFromContent(jid, albumContent, {
212
+ userJid: options.userJid,
213
+ quoted: options.quoted,
214
+ ephemeralExpiration: options.ephemeralExpiration,
215
+ upload: options.sock.waUploadToServer
216
+ });
217
+
218
+ await options.sock.relayMessage(jid, albumMsg.message, {
219
+ messageId: albumMsg.key.id,
220
+ });
221
+
222
+ for (let contentItem of array) {
223
+ const mediaMsg = await generateWAMessage(jid, contentItem, {
224
+ upload: options.sock.waUploadToServer,
225
+ userJid: options.userJid
226
+ });
227
+
228
+ mediaMsg.message.messageContextInfo = {
229
+ messageSecret: crypto_1.randomBytes(32),
230
+ messageAssociation: {
231
+ associationType: 1,
232
+ parentMessageKey: albumMsg.key,
233
+ }
234
+ };
235
+
236
+ await options.sock.relayMessage(jid, mediaMsg.message, {
237
+ messageId: mediaMsg.key.id,
238
+ });
239
+ }
240
+
241
+ return albumMsg;
242
+ };
243
+ exports.prepareAlbumMessageContent = prepareAlbumMessageContent;
230
244
  const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
231
245
  ephemeralExpiration = ephemeralExpiration || 0;
232
246
  const content = {
@@ -276,7 +290,7 @@ exports.generateForwardMessageContent = generateForwardMessageContent;
276
290
  const generateWAMessageContent = async (message, options) => {
277
291
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
278
292
  var _p, _q;
279
- let m = {};
293
+ let m = {};
280
294
  if ('text' in message) {
281
295
  const extContent = { text: message.text };
282
296
  let urlInfo = message.linkPreview;
@@ -408,6 +422,19 @@ const generateWAMessageContent = async (message, options) => {
408
422
  type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
409
423
  };
410
424
  break;
425
+ case 'interactive':
426
+ m.interactiveResponseMessage = {
427
+ body: {
428
+ text: message.buttonReply.displayText,
429
+ format: WAProto_1.proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1
430
+ },
431
+ nativeFlowResponseMessage: {
432
+ name: message.buttonReply.nativeFlows.name,
433
+ paramsJson: message.buttonReply.nativeFlows.paramsJson,
434
+ version: message.buttonReply.nativeFlows.version
435
+ }
436
+ }
437
+ break;
411
438
  }
412
439
  }
413
440
  else if ('ptv' in message && message.ptv) {
@@ -442,6 +469,26 @@ const generateWAMessageContent = async (message, options) => {
442
469
  else if ('listReply' in message) {
443
470
  m.listResponseMessage = { ...message.listReply };
444
471
  }
472
+ else if ('pollResult' in message) {
473
+ if (!Array.isArray(message.pollResult.values)) {
474
+ throw new boom_1.Boom('Invalid pollResult values', { statusCode: 400 })
475
+ }
476
+
477
+ const pollResultSnapshotMessage = {
478
+ name: message.pollResult.name,
479
+ pollVotes: message.pollResult.values.map(([optionName, optionVoteCount]) => ({
480
+ optionName,
481
+ optionVoteCount
482
+ }))
483
+ }
484
+
485
+ pollResultSnapshotMessage.contextInfo = {
486
+ ...(message.contextInfo || {}),
487
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
488
+ }
489
+
490
+ m.pollResultSnapshotMessage = pollResultSnapshotMessage
491
+ }
445
492
  else if ('poll' in message) {
446
493
  (_p = message.poll).selectableCount || (_p.selectableCount = 0);
447
494
  (_q = message.poll).toAnnouncementGroup || (_q.toAnnouncementGroup = false);
@@ -455,8 +502,8 @@ const generateWAMessageContent = async (message, options) => {
455
502
  m.messageContextInfo = {
456
503
  // encKey
457
504
  messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
458
- };
459
- const pollCreationMessage = {
505
+ };
506
+ const pollCreationMessage = {
460
507
  name: message.poll.name,
461
508
  selectableOptionsCount: message.poll.selectableCount,
462
509
  options: message.poll.values.map(optionName => ({ optionName })),
@@ -476,11 +523,132 @@ const generateWAMessageContent = async (message, options) => {
476
523
  }
477
524
  }
478
525
  }
526
+ else if ('stickerPack' in message) {
527
+ const { stickers, cover, name, publisher, packId, description } = message.stickerPack;
528
+ const { Readable } = require('stream');
529
+ const Jimp = require('jimp');
530
+ const stickerData = {};
531
+ const stickerPackId = packId || (0, generics_1.generateMessageID)();
532
+ const trayIconFileName = `${stickerPackId}.webp`;
533
+
534
+ const stickerPromises = stickers.map(async (s, i) => {
535
+ const { stream } = await (0, messages_media_1.getStream)(s.sticker);
536
+ const buffer = await (0, messages_media_1.toBuffer)(stream);
537
+ const hash = (0, crypto_2.sha256)(buffer).toString('base64url');
538
+ const fileName = `${i.toString().padStart(2, '0')}_${hash}.webp`;
539
+ stickerData[fileName] = [new Uint8Array(buffer), { level: 0 }];
540
+ return {
541
+ fileName,
542
+ mimetype: 'image/webp',
543
+ isAnimated: s.isAnimated || false,
544
+ isLottie: s.isLottie || false,
545
+ emojis: s.emojis || [],
546
+ accessibilityLabel: s.accessibilityLabel || ''
547
+ };
548
+ });
549
+
550
+ const stickerMetadata = await Promise.all(stickerPromises);
551
+
552
+ const coverBuffer = await (0, messages_media_1.toBuffer)((await (0, messages_media_1.getStream)(cover)).stream);
553
+ stickerData[trayIconFileName] = [new Uint8Array(coverBuffer), { level: 0 }];
554
+
555
+ const zipBuffer = await new Promise((resolve, reject) => {
556
+ (0, fflate_1.zip)(stickerData, (err, data) => {
557
+ if (err) reject(err);
558
+ else resolve(Buffer.from(data));
559
+ });
560
+ });
561
+
562
+ const stickerPackUpload = await (0, messages_media_1.encryptedStream)(
563
+ { stream: Readable.from(zipBuffer) },
564
+ 'sticker-pack', {
565
+ logger: options.logger,
566
+ opts: options.options
567
+ }
568
+ );
569
+
570
+ const stickerPackUploadResult = await options.upload(stickerPackUpload.encWriteStream, {
571
+ fileEncSha256B64: stickerPackUpload.fileEncSha256.toString('base64'),
572
+ mediaType: 'sticker-pack',
573
+ timeoutMs: options.mediaUploadTimeoutMs
574
+ });
575
+
576
+ let thumbnailDirectPath, thumbnailSha256, thumbnailEncSha256, imageDataHash;
577
+
578
+ try {
579
+ const jimpImage = await Jimp.read(coverBuffer);
580
+ const thumbnailBuffer = await jimpImage.resize(252, 252).getBufferAsync(Jimp.MIME_JPEG);
581
+
582
+ const thumbUpload = await (0, messages_media_1.encryptedStream)(
583
+ { stream: Readable.from(thumbnailBuffer) },
584
+ 'thumbnail-sticker-pack', {
585
+ logger: options.logger,
586
+ opts: options.options,
587
+ mediaKey: stickerPackUpload.mediaKey
588
+ }
589
+ );
590
+
591
+ const thumbUploadResult = await options.upload(thumbUpload.encWriteStream, {
592
+ fileEncSha256B64: thumbUpload.fileEncSha256.toString('base64'),
593
+ mediaType: 'thumbnail-sticker-pack',
594
+ timeoutMs: options.mediaUploadTimeoutMs
595
+ });
596
+
597
+ thumbnailDirectPath = thumbUploadResult.directPath;
598
+ thumbnailSha256 = thumbUpload.fileSha256;
599
+ thumbnailEncSha256 = thumbUpload.fileEncSha256;
600
+ imageDataHash = (0, crypto_2.sha256)(thumbnailBuffer).toString('base64');
601
+ } catch (e) {
602
+ options.logger?.warn?.(`Thumbnail generation failed: ${e}`);
603
+ }
604
+
605
+ m.stickerPackMessage = {
606
+ name: name,
607
+ publisher: publisher,
608
+ stickerPackId: stickerPackId,
609
+ packDescription: description,
610
+ stickerPackOrigin: WAProto_1.proto.Message.StickerPackMessage.StickerPackOrigin.USER_CREATED,
611
+ stickerPackSize: zipBuffer.length,
612
+ stickers: stickerMetadata,
613
+ fileSha256: stickerPackUpload.fileSha256,
614
+ fileEncSha256: stickerPackUpload.fileEncSha256,
615
+ mediaKey: stickerPackUpload.mediaKey,
616
+ directPath: stickerPackUploadResult.directPath,
617
+ fileLength: zipBuffer.length,
618
+ mediaKeyTimestamp: (0, generics_1.unixTimestampSeconds)(),
619
+ trayIconFileName: trayIconFileName,
620
+ imageDataHash,
621
+ thumbnailDirectPath,
622
+ thumbnailSha256,
623
+ thumbnailEncSha256,
624
+ thumbnailHeight: 252,
625
+ thumbnailWidth: 252
626
+ };
627
+
628
+ m.stickerPackMessage.contextInfo = {
629
+ ...(message.contextInfo || {}),
630
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
631
+ };
632
+ }
479
633
  else if ('event' in message) {
634
+ m.eventMessage = {};
635
+ const startTime = Math.floor(message.event.startDate.getTime() / 1000);
636
+ if (message.event.call && options.getCallLink) {
637
+ const token = await options.getCallLink(message.event.call, { startTime });
638
+ m.eventMessage.joinLink = (message.event.call === 'audio' ? CALL_AUDIO_PREFIX : CALL_VIDEO_PREFIX) + token;
639
+ }
480
640
  m.messageContextInfo = {
481
- messageSecret: message.event.messageSecret || (0, crypto_1.randomBytes)(32),
641
+ // encKey
642
+ messageSecret: message.event.messageSecret || randomBytes(32)
482
643
  };
483
- m.eventMessage = { ...message.event };
644
+ m.eventMessage.name = message.event.name;
645
+ m.eventMessage.description = message.event.description;
646
+ m.eventMessage.startTime = startTime;
647
+ m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
648
+ m.eventMessage.isCanceled = message.event.isCancelled ?? false;
649
+ m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
650
+ m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
651
+ m.eventMessage.location = message.event.location;
484
652
  }
485
653
  else if ('inviteAdmin' in message) {
486
654
  m.newsletterAdminInviteMessage = {};
@@ -607,6 +775,29 @@ const generateWAMessageContent = async (message, options) => {
607
775
  };
608
776
  m = { listMessage };
609
777
  }
778
+ if ('productList' in message && !!message.productList) {
779
+ const thumbnail = message.thumbnail ? await (0, messages_media_1.generateThumbnail)(message.thumbnail, 'image') : null;
780
+ const listMessage = {
781
+ title: message.title,
782
+ buttonText: message.buttonText,
783
+ footerText: message.footer,
784
+ description: message.text,
785
+ productListInfo: {
786
+ productSections: message.productList,
787
+ headerImage: {
788
+ productId: message.productList[0].products[0].productId,
789
+ jpegThumbnail: (thumbnail === null || thumbnail === void 0 ? void 0 : thumbnail.thumbnail) || null
790
+ },
791
+ businessOwnerJid: message.businessOwnerJid
792
+ },
793
+ listType: WAProto_1.proto.Message.ListMessage.ListType.PRODUCT_LIST
794
+ };
795
+ listMessage.contextInfo = {
796
+ ...(message.contextInfo || {}),
797
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
798
+ };
799
+ m = { listMessage };
800
+ }
610
801
  if ('interactiveButtons' in message && !!message.interactiveButtons) {
611
802
  const interactiveMessage = {
612
803
  nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
@@ -694,9 +885,180 @@ const generateWAMessageContent = async (message, options) => {
694
885
  }
695
886
  m = { interactiveMessage };
696
887
  }
888
+ if ('nativeFlowMessage' in message && !!message.nativeFlowMessage) {
889
+ const { nativeFlowMessage } = message;
890
+ let paramsJson = nativeFlowMessage.messageParamsJson;
891
+ if (typeof paramsJson === 'object' && paramsJson !== null) {
892
+ paramsJson = JSON.stringify(paramsJson);
893
+ }
894
+ const interactiveMessage = {
895
+ nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
896
+ buttons: nativeFlowMessage.buttons,
897
+ messageParamsJson: paramsJson
898
+ })
899
+ };
900
+ if ('text' in message) {
901
+ interactiveMessage.body = { text: message.text };
902
+ } else if ('caption' in message) {
903
+ interactiveMessage.body = { text: message.caption };
904
+ }
905
+ interactiveMessage.header = {
906
+ title: message.title || message.header,
907
+ subtitle: message.subtitle,
908
+ hasMediaAttachment: false
909
+ };
910
+ if ('footer' in message) {
911
+ interactiveMessage.footer = { text: message.footer };
912
+ }
913
+ if ('contextInfo' in message && !!message.contextInfo) {
914
+ interactiveMessage.contextInfo = message.contextInfo;
915
+ }
916
+ if ('mentions' in message && !!message.mentions) {
917
+ interactiveMessage.contextInfo = { ...interactiveMessage.contextInfo, mentionedJid: message.mentions };
918
+ }
919
+ const contentKeys = Object.keys(m);
920
+ if (contentKeys.length > 0) {
921
+ const mediaType = contentKeys[0];
922
+ interactiveMessage.header[mediaType] = m[mediaType];
923
+ interactiveMessage.header.hasMediaAttachment = true;
924
+ if (interactiveMessage.header[mediaType].contextInfo) {
925
+ }
926
+ }
927
+
928
+ m = { interactiveMessage };
929
+ }
930
+ else if ('collection' in message && !!message.collection) {
931
+ const interactiveMessage = {
932
+ collectionMessage: {
933
+ bizJid: message.collection.bizJid,
934
+ id: message.collection.id,
935
+ messageVersion: message?.collection?.version
936
+ }
937
+ }
938
+
939
+ if ('text' in message) {
940
+ interactiveMessage.body = {
941
+ text: message.text
942
+ },
943
+ interactiveMessage.header = {
944
+ title: message.title,
945
+ subtitle: message.subtitle,
946
+ hasMediaAttachment: false
947
+ }
948
+ }
949
+
950
+ else {
951
+ if ('caption' in message) {
952
+ interactiveMessage.body = {
953
+ text: message.caption
954
+ }
955
+ interactiveMessage.header = {
956
+ title: message.title,
957
+ subtitle: message.subtitle,
958
+ hasMediaAttachment: message.hasMediaAttachment ? message.hasMediaAttachment : false,
959
+ ...Object.assign(interactiveMessage, m)
960
+ }
961
+ }
962
+ }
963
+
964
+ if ('footer' in message && !message.footer) {
965
+ interactiveMessage.footer = {
966
+ text: message.footer
967
+ }
968
+ }
969
+
970
+ interactiveMessage.contextInfo = {
971
+ ...(message.contextInfo || {}),
972
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
973
+ }
974
+
975
+ m = { interactiveMessage }
976
+ }
977
+ else if ('cards' in message && !!message.cards) {
978
+ const slides = await Promise.all(message.cards.map(async (slide) => {
979
+ const { image, video, product, title, body, footer, buttons } = slide
980
+ let header
981
+
982
+ if (product) {
983
+ const { imageMessage } = await prepareWAMessageMedia({ image: product.productImage, ...options }, options)
984
+ header = {
985
+ productMessage: {
986
+ product: {
987
+ ...product,
988
+ productImage: imageMessage,
989
+ },
990
+ ...slide
991
+ }
992
+ }
993
+ }
994
+
995
+ else if (image) {
996
+ header = await prepareWAMessageMedia({ image: image, ...options }, options)
997
+ }
998
+
999
+ else if (video) {
1000
+ header = await prepareWAMessageMedia({ video: video, ...options }, options)
1001
+ }
1002
+
1003
+ const msg = {
1004
+ header: {
1005
+ title,
1006
+ hasMediaAttachment: true,
1007
+ ...header
1008
+ },
1009
+ body: {
1010
+ text: body
1011
+ },
1012
+ footer: {
1013
+ text: footer
1014
+ },
1015
+ nativeFlowMessage: {
1016
+ buttons,
1017
+ }
1018
+ }
1019
+
1020
+ return msg
1021
+ }))
1022
+
1023
+ const interactiveMessage = {
1024
+ carouselMessage: {
1025
+ cards: slides
1026
+ }
1027
+ }
1028
+
1029
+ if ('text' in message) {
1030
+ interactiveMessage.body = {
1031
+ text: message.text
1032
+ },
1033
+ interactiveMessage.header = {
1034
+ title: message.title,
1035
+ subtitle: message.subtitle,
1036
+ hasMediaAttachment: false
1037
+ }
1038
+ }
1039
+
1040
+ if ('footer' in message && !!message.footer) {
1041
+ interactiveMessage.footer = {
1042
+ text: message.footer
1043
+ }
1044
+ }
1045
+
1046
+ interactiveMessage.contextInfo = {
1047
+ ...(message.contextInfo || {}),
1048
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
1049
+ }
1050
+
1051
+ m = { interactiveMessage }
1052
+ }
1053
+ if ('ephemeral' in message && !!message.ephemeral) {
1054
+ m = { ephemeralMessage: { message: m } }
1055
+ }
697
1056
  if ('viewOnce' in message && !!message.viewOnce) {
698
1057
  m = { viewOnceMessage: { message: m } };
699
1058
  }
1059
+ if ('viewOnceExt' in message && !!message.viewOnceExt) {
1060
+ m = { viewOnceMessageV2Extension: { message: m } }
1061
+ }
700
1062
  if ('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length)) {
701
1063
  const [messageType] = Object.keys(m);
702
1064
  m[messageType].contextInfo = m[messageType] || {};
@@ -0,0 +1,19 @@
1
+ import { ILogger } from './logger';
2
+ import { proto } from '../../WAProto';
3
+ import { KeyPair } from '../Types';
4
+ import { BinaryNode } from '../WABinary';
5
+ export declare const makeNoiseHandler: ({ keyPair: { private: privateKey, public: publicKey }, NOISE_HEADER, logger, routingInfo }: {
6
+ keyPair: KeyPair;
7
+ NOISE_HEADER: Uint8Array;
8
+ logger: ILogger;
9
+ routingInfo?: Buffer | undefined;
10
+ }) => {
11
+ encrypt: (plaintext: Uint8Array) => Buffer<ArrayBuffer>;
12
+ decrypt: (ciphertext: Uint8Array) => Buffer<ArrayBuffer>;
13
+ authenticate: (data: Uint8Array) => void;
14
+ mixIntoKey: (data: Uint8Array) => Promise<void>;
15
+ finishInit: () => Promise<void>;
16
+ processHandshake: ({ serverHello }: proto.HandshakeMessage, noiseKey: KeyPair) => Promise<Buffer<ArrayBuffer>>;
17
+ encodeFrame: (data: Buffer | Uint8Array) => Buffer<ArrayBuffer>;
18
+ decodeFrame: (newData: Buffer | Uint8Array, onFrame: (buff: Uint8Array | BinaryNode) => void) => Promise<void>;
19
+ };
@@ -0,0 +1,42 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { proto } from '../../WAProto';
3
+ import { AuthenticationCreds, BaileysEventEmitter, CacheStore, SignalKeyStoreWithTransaction, SocketConfig } from '../Types';
4
+ import { ILogger } from './logger';
5
+ type ProcessMessageContext = {
6
+ shouldProcessHistoryMsg: boolean;
7
+ placeholderResendCache?: CacheStore;
8
+ creds: AuthenticationCreds;
9
+ keyStore: SignalKeyStoreWithTransaction;
10
+ ev: BaileysEventEmitter;
11
+ getMessage: SocketConfig['getMessage'];
12
+ logger?: ILogger;
13
+ options: AxiosRequestConfig<{}>;
14
+ };
15
+ /** Cleans a received message to further processing */
16
+ export declare const cleanMessage: (message: proto.IWebMessageInfo, meId: string) => void;
17
+ export declare const isRealMessage: (message: proto.IWebMessageInfo, meId: string) => boolean | undefined;
18
+ export declare const shouldIncrementChatUnread: (message: proto.IWebMessageInfo) => boolean;
19
+ /**
20
+ * Get the ID of the chat from the given key.
21
+ * Typically -- that'll be the remoteJid, but for broadcasts, it'll be the participant
22
+ */
23
+ export declare const getChatId: ({ remoteJid, participant, fromMe }: proto.IMessageKey) => string;
24
+ type PollContext = {
25
+ /** normalised jid of the person that created the poll */
26
+ pollCreatorJid: string;
27
+ /** ID of the poll creation message */
28
+ pollMsgId: string;
29
+ /** poll creation message enc key */
30
+ pollEncKey: Uint8Array;
31
+ /** jid of the person that voted */
32
+ voterJid: string;
33
+ };
34
+ /**
35
+ * Decrypt a poll vote
36
+ * @param vote encrypted vote
37
+ * @param ctx additional info about the poll required for decryption
38
+ * @returns list of SHA256 options
39
+ */
40
+ export declare function decryptPollVote({ encPayload, encIv }: proto.Message.IPollEncValue, { pollCreatorJid, pollMsgId, pollEncKey, voterJid, }: PollContext): proto.Message.PollVoteMessage;
41
+ declare const processMessage: (message: proto.IWebMessageInfo, { shouldProcessHistoryMsg, placeholderResendCache, ev, creds, keyStore, logger, options, getMessage }: ProcessMessageContext) => Promise<void>;
42
+ export default processMessage;
@@ -0,0 +1,33 @@
1
+ import { SignalRepository } from '../Types';
2
+ import { AuthenticationCreds, AuthenticationState, KeyPair, SignalIdentity, SignalKeyStore, SignedKeyPair } from '../Types/Auth';
3
+ import { BinaryNode, JidWithDevice } from '../WABinary';
4
+ import { USyncQueryResultList } from '../WAUSync';
5
+ export declare const createSignalIdentity: (wid: string, accountSignatureKey: Uint8Array) => SignalIdentity;
6
+ export declare const getPreKeys: ({ get }: SignalKeyStore, min: number, limit: number) => Promise<{
7
+ [id: string]: KeyPair;
8
+ }>;
9
+ export declare const generateOrGetPreKeys: (creds: AuthenticationCreds, range: number) => {
10
+ newPreKeys: {
11
+ [id: number]: KeyPair;
12
+ };
13
+ lastPreKeyId: number;
14
+ preKeysRange: readonly [number, number];
15
+ };
16
+ export declare const xmppSignedPreKey: (key: SignedKeyPair) => BinaryNode;
17
+ export declare const xmppPreKey: (pair: KeyPair, id: number) => BinaryNode;
18
+ export declare const parseAndInjectE2ESessions: (node: BinaryNode, repository: SignalRepository) => Promise<void>;
19
+ export declare const extractDeviceJids: (result: USyncQueryResultList[], myJid: string, excludeZeroDevices: boolean) => JidWithDevice[];
20
+ /**
21
+ * get the next N keys for upload or processing
22
+ * @param count number of pre-keys to get or generate
23
+ */
24
+ export declare const getNextPreKeys: ({ creds, keys }: AuthenticationState, count: number) => Promise<{
25
+ update: Partial<AuthenticationCreds>;
26
+ preKeys: {
27
+ [id: string]: KeyPair;
28
+ };
29
+ }>;
30
+ export declare const getNextPreKeysNode: (state: AuthenticationState, count: number) => Promise<{
31
+ update: Partial<AuthenticationCreds>;
32
+ node: BinaryNode;
33
+ }>;
@@ -0,0 +1,12 @@
1
+ import { AuthenticationState } from '../Types';
2
+ /**
3
+ * stores the full authentication state in a single folder.
4
+ * Far more efficient than singlefileauthstate
5
+ *
6
+ * Again, I wouldn't endorse this for any production level use other than perhaps a bot.
7
+ * Would recommend writing an auth state for use with a proper SQL or No-SQL DB
8
+ * */
9
+ export declare const useMultiFileAuthState: (folder: string) => Promise<{
10
+ state: AuthenticationState;
11
+ saveCreds: () => Promise<void>;
12
+ }>;
@@ -0,0 +1,10 @@
1
+ import { proto } from '../../WAProto';
2
+ import type { AuthenticationCreds, SignalCreds, SocketConfig } from '../Types';
3
+ import { BinaryNode } from '../WABinary';
4
+ export declare const generateLoginNode: (userJid: string, config: SocketConfig) => proto.IClientPayload;
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">) => {
7
+ creds: Partial<AuthenticationCreds>;
8
+ reply: BinaryNode;
9
+ };
10
+ export declare const encodeSignedDeviceIdentity: (account: proto.IADVSignedDeviceIdentity, includeSignatureKey: boolean) => Uint8Array<ArrayBufferLike>;