alipclutch-baileys 8.5.2 → 8.5.4

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 (114) hide show
  1. package/README.md +11 -5
  2. package/WAProto/index.js +77698 -117050
  3. package/engine-requirements.js +10 -0
  4. package/lib/Defaults/baileys-version.json +2 -2
  5. package/lib/Defaults/index.d.ts +7 -16
  6. package/lib/Defaults/index.js +119 -90
  7. package/lib/Defaults/phonenumber-mcc.json +223 -0
  8. package/lib/Socket/Client/abstract-socket-client.d.ts +17 -0
  9. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  10. package/lib/Socket/Client/index.d.ts +3 -2
  11. package/lib/Socket/Client/index.js +3 -2
  12. package/lib/Socket/Client/mobile-socket-client.d.ts +13 -0
  13. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  14. package/lib/Socket/Client/web-socket-client.d.ts +12 -0
  15. package/lib/Socket/Client/web-socket-client.js +62 -0
  16. package/lib/Socket/business.d.ts +58 -59
  17. package/lib/Socket/chats.d.ts +230 -45
  18. package/lib/Socket/chats.js +238 -139
  19. package/lib/Socket/groups.d.ts +32 -41
  20. package/lib/Socket/groups.js +23 -38
  21. package/lib/Socket/index.d.ts +64 -63
  22. package/lib/Socket/index.js +3 -2
  23. package/lib/Socket/messages-recv.js +65 -9
  24. package/lib/Socket/messages-send.d.ts +47 -49
  25. package/lib/Socket/messages-send.js +395 -543
  26. package/lib/Socket/newsletter.d.ts +37 -39
  27. package/lib/Socket/newsletter.js +123 -88
  28. package/lib/Socket/registration.d.ts +267 -0
  29. package/lib/Socket/registration.js +166 -0
  30. package/lib/Socket/setup.d.ts +253 -0
  31. package/lib/Socket/setup.js +4 -5
  32. package/lib/Socket/socket.d.ts +43 -270
  33. package/lib/Socket/socket.js +38 -62
  34. package/lib/Socket/usync.d.ts +3 -3
  35. package/lib/Store/index.d.ts +2 -1
  36. package/lib/Store/index.js +3 -1
  37. package/lib/Store/make-cache-manager-store.d.ts +13 -0
  38. package/lib/Store/make-cache-manager-store.js +83 -0
  39. package/lib/Store/make-in-memory-store.d.ts +24 -24
  40. package/lib/Store/make-in-memory-store.js +14 -26
  41. package/lib/Store/make-ordered-dictionary.d.ts +1 -1
  42. package/lib/Store/make-ordered-dictionary.js +2 -2
  43. package/lib/Types/Auth.d.ts +7 -0
  44. package/lib/Types/Call.d.ts +1 -1
  45. package/lib/Types/Chat.d.ts +7 -14
  46. package/lib/Types/Contact.d.ts +1 -5
  47. package/lib/Types/Events.d.ts +2 -44
  48. package/lib/Types/GroupMetadata.d.ts +2 -11
  49. package/lib/Types/Label.js +1 -1
  50. package/lib/Types/LabelAssociation.js +1 -1
  51. package/lib/Types/Message.d.ts +21 -148
  52. package/lib/Types/Message.js +2 -0
  53. package/lib/Types/Newsletter.d.ts +97 -73
  54. package/lib/Types/Newsletter.js +38 -18
  55. package/lib/Types/Socket.d.ts +9 -17
  56. package/lib/Types/index.d.ts +1 -8
  57. package/lib/Types/index.js +2 -2
  58. package/lib/Utils/auth-utils.d.ts +3 -3
  59. package/lib/Utils/auth-utils.js +13 -6
  60. package/lib/Utils/business.js +2 -2
  61. package/lib/Utils/chat-utils.d.ts +16 -15
  62. package/lib/Utils/chat-utils.js +35 -36
  63. package/lib/Utils/crypto.d.ts +16 -15
  64. package/lib/Utils/crypto.js +29 -71
  65. package/lib/Utils/decode-wa-message.d.ts +6 -22
  66. package/lib/Utils/decode-wa-message.js +56 -65
  67. package/lib/Utils/event-buffer.d.ts +2 -2
  68. package/lib/Utils/event-buffer.js +7 -11
  69. package/lib/Utils/generics.d.ts +20 -17
  70. package/lib/Utils/generics.js +75 -95
  71. package/lib/Utils/history.d.ts +0 -4
  72. package/lib/Utils/history.js +6 -4
  73. package/lib/Utils/link-preview.d.ts +2 -2
  74. package/lib/Utils/link-preview.js +1 -34
  75. package/lib/Utils/logger.d.ts +3 -10
  76. package/lib/Utils/lt-hash.d.ts +2 -2
  77. package/lib/Utils/lt-hash.js +6 -6
  78. package/lib/Utils/make-mutex.d.ts +2 -2
  79. package/lib/Utils/messages-media.d.ts +24 -28
  80. package/lib/Utils/messages-media.js +111 -272
  81. package/lib/Utils/messages.d.ts +10 -13
  82. package/lib/Utils/messages.js +50 -323
  83. package/lib/Utils/noise-handler.d.ts +12 -10
  84. package/lib/Utils/noise-handler.js +23 -18
  85. package/lib/Utils/process-message.d.ts +4 -5
  86. package/lib/Utils/process-message.js +25 -108
  87. package/lib/Utils/signal.d.ts +1 -2
  88. package/lib/Utils/signal.js +26 -26
  89. package/lib/Utils/use-multi-file-auth-state.d.ts +1 -0
  90. package/lib/Utils/use-multi-file-auth-state.js +6 -51
  91. package/lib/Utils/validate-connection.d.ts +4 -3
  92. package/lib/Utils/validate-connection.js +1 -1
  93. package/lib/WABinary/constants.d.ts +27 -24
  94. package/lib/WABinary/constants.js +13 -1276
  95. package/lib/WABinary/decode.d.ts +4 -3
  96. package/lib/WABinary/decode.js +13 -26
  97. package/lib/WABinary/encode.d.ts +2 -1
  98. package/lib/WABinary/encode.js +152 -137
  99. package/lib/WABinary/generic-utils.d.ts +4 -1
  100. package/lib/WABinary/generic-utils.js +125 -37
  101. package/lib/WABinary/jid-utils.d.ts +5 -11
  102. package/lib/WABinary/jid-utils.js +5 -28
  103. package/lib/WAM/BinaryInfo.d.ts +11 -2
  104. package/lib/WAM/encode.d.ts +2 -1
  105. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +1 -1
  106. package/lib/index.d.ts +1 -0
  107. package/lib/index.js +15 -27
  108. package/package.json +31 -18
  109. package/WAProto/GenerateStatics.sh +0 -4
  110. package/WAProto/WAProto.proto +0 -4775
  111. package/WAProto/index.d.ts +0 -55057
  112. package/WAProto/index.ts.ts +0 -53473
  113. package/lib/Socket/setup.ts +0 -623
  114. package/lib/WABinary/jid-utils.js.bak +0 -83
@@ -1,6 +1,8 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { Logger } from 'pino';
1
4
  import { type Transform } from 'stream';
2
5
  import { proto } from '../../WAProto';
3
- import { ILogger } from './logger';
4
6
  import { AnyMediaMessageContent, AnyMessageContent, MediaGenerationOptions, MessageContentGenerationOptions, MessageGenerationOptions, MessageGenerationOptionsFromContent, MessageUserReceipt, WAMessage, WAMessageContent, WAProto } from '../Types';
5
7
  import { MediaDownloadOptions } from './messages-media';
6
8
  /**
@@ -9,7 +11,7 @@ import { MediaDownloadOptions } from './messages-media';
9
11
  * @returns the URL, eg. https://google.com
10
12
  */
11
13
  export declare const extractUrlFromText: (text: string) => string | undefined;
12
- export declare const generateLinkPreviewIfRequired: (text: string, getUrlInfo: MessageGenerationOptions["getUrlInfo"], logger: MessageGenerationOptions["logger"]) => Promise<import("../Types").WAUrlInfo | undefined>;
14
+ export declare const generateLinkPreviewIfRequired: (text: string, getUrlInfo: MessageGenerationOptions['getUrlInfo'], logger: MessageGenerationOptions['logger']) => Promise<import("../Types").WAUrlInfo | undefined>;
13
15
  export declare const prepareWAMessageMedia: (message: AnyMediaMessageContent, options: MediaGenerationOptions) => Promise<proto.Message>;
14
16
  export declare const prepareDisappearingMessageSettingContent: (ephemeralExpiration?: number) => proto.Message;
15
17
  /**
@@ -38,13 +40,13 @@ export declare const extractMessageContent: (content: WAMessageContent | undefin
38
40
  /**
39
41
  * Returns the device predicted by message ID
40
42
  */
41
- export declare const getDevice: (id: string) => "web" | "unknown" | "android" | "ios" | "desktop";
43
+ export declare const getDevice: (id: string) => "android" | "unknown" | "web" | "ios" | "desktop";
42
44
  /** Upserts a receipt in the message */
43
- export declare const updateMessageWithReceipt: (msg: Pick<WAMessage, "userReceipt">, receipt: MessageUserReceipt) => void;
45
+ export declare const updateMessageWithReceipt: (msg: Pick<WAMessage, 'userReceipt'>, receipt: MessageUserReceipt) => void;
44
46
  /** Update the message with a new reaction */
45
- export declare const updateMessageWithReaction: (msg: Pick<WAMessage, "reactions">, reaction: proto.IReaction) => void;
47
+ export declare const updateMessageWithReaction: (msg: Pick<WAMessage, 'reactions'>, reaction: proto.IReaction) => void;
46
48
  /** Update the message with a new poll update */
47
- export declare const updateMessageWithPollUpdate: (msg: Pick<WAMessage, "pollUpdates">, update: proto.IPollUpdate) => void;
49
+ export declare const updateMessageWithPollUpdate: (msg: Pick<WAMessage, 'pollUpdates'>, update: proto.IPollUpdate) => void;
48
50
  type VoteAggregation = {
49
51
  name: string;
50
52
  voters: string[];
@@ -64,17 +66,12 @@ export declare const aggregateMessageKeysNotFromMe: (keys: proto.IMessageKey[])
64
66
  }[];
65
67
  type DownloadMediaMessageContext = {
66
68
  reuploadRequest: (msg: WAMessage) => Promise<WAMessage>;
67
- logger: ILogger;
69
+ logger: Logger;
68
70
  };
69
71
  /**
70
72
  * Downloads the given message. Throws an error if it's not a media message
71
73
  */
72
- export declare const downloadMediaMessage: <Type extends "buffer" | "stream">(message: WAMessage, type: Type, options: MediaDownloadOptions, ctx?: DownloadMediaMessageContext) => Promise<Type extends "buffer" ? Buffer<ArrayBufferLike> : Transform>;
74
+ export declare const downloadMediaMessage: <Type extends "stream" | "buffer">(message: WAMessage, type: Type, options: MediaDownloadOptions, ctx?: DownloadMediaMessageContext) => Promise<Type extends "buffer" ? Buffer : Transform>;
73
75
  /** Checks whether the given message is a media message; if it is returns the inner content */
74
76
  export declare const assertMediaContent: (content: proto.IMessage | null | undefined) => proto.Message.IVideoMessage | proto.Message.IImageMessage | proto.Message.IAudioMessage | proto.Message.IDocumentMessage | proto.Message.IStickerMessage;
75
- export declare const toJid: (id: string) => string;
76
- export declare const getSenderLid: (msg: WAMessage) => {
77
- jid: string;
78
- lid: string;
79
- };
80
77
  export {};
@@ -1,10 +1,9 @@
1
- "use strict";
1
+ "use strict";
2
2
  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");
@@ -75,8 +74,11 @@ const prepareWAMessageMedia = async (message, options) => {
75
74
  }
76
75
  }
77
76
  if (!mediaType) {
78
- throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
77
+ throw new boom_1.Boom('Invalid media type', {
78
+ statusCode: 400
79
+ });
79
80
  }
81
+
80
82
  const uploadData = {
81
83
  ...message,
82
84
  ...(message.annotations ? {
@@ -114,20 +116,20 @@ const prepareWAMessageMedia = async (message, options) => {
114
116
  media: message[mediaType]
115
117
  };
116
118
  delete uploadData[mediaType];
117
- // check if cacheable + generate cache key
118
119
  const cacheableKey = typeof uploadData.media === 'object' &&
119
120
  ('url' in uploadData.media) &&
120
121
  !!uploadData.media.url &&
121
122
  !!options.mediaCache && (
122
- // generate the key
123
123
  mediaType + ':' + uploadData.media.url.toString());
124
+
124
125
  if (mediaType === 'document' && !uploadData.fileName) {
125
126
  uploadData.fileName = 'file';
126
127
  }
128
+
127
129
  if (!uploadData.mimetype) {
128
130
  uploadData.mimetype = MIMETYPE_MAP[mediaType];
129
131
  }
130
- // check for cache hit
132
+
131
133
  if (cacheableKey) {
132
134
  const mediaBuff = options.mediaCache.get(cacheableKey);
133
135
  if (mediaBuff) {
@@ -138,7 +140,8 @@ const prepareWAMessageMedia = async (message, options) => {
138
140
  return obj;
139
141
  }
140
142
  }
141
- const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
143
+
144
+ const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
142
145
  const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
143
146
  (typeof uploadData['jpegThumbnail'] === 'undefined');
144
147
  const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
@@ -199,18 +202,13 @@ const prepareWAMessageMedia = async (message, options) => {
199
202
  if (!Buffer.isBuffer(encWriteStream)) {
200
203
  encWriteStream.destroy();
201
204
  }
202
- // remove tmp files
205
+
203
206
  if (didSaveToTmpPath && bodyPath) {
204
- try {
205
- await fs_1.promises.access(bodyPath);
206
- await fs_1.promises.unlink(bodyPath);
207
- logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp file');
208
- }
209
- catch (error) {
210
- logger === null || logger === void 0 ? void 0 : logger.warn('failed to remove tmp file');
211
- }
207
+ await fs_1.promises.unlink(bodyPath);
208
+ logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp files');
212
209
  }
213
210
  });
211
+
214
212
  const obj = Types_1.WAProto.Message.fromObject({
215
213
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
216
214
  url: handle ? undefined : mediaUrl,
@@ -224,14 +222,17 @@ const prepareWAMessageMedia = async (message, options) => {
224
222
  media: undefined
225
223
  })
226
224
  });
225
+
227
226
  if (uploadData.ptv) {
228
227
  obj.ptvMessage = obj.videoMessage;
229
228
  delete obj.videoMessage;
230
229
  }
230
+
231
231
  if (cacheableKey) {
232
232
  logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'set cache');
233
233
  options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish());
234
234
  }
235
+
235
236
  return obj;
236
237
  };
237
238
  exports.prepareWAMessageMedia = prepareWAMessageMedia;
@@ -282,8 +283,8 @@ const generateForwardMessageContent = (message, forceForward) => {
282
283
  };
283
284
  exports.generateForwardMessageContent = generateForwardMessageContent;
284
285
  const generateWAMessageContent = async (message, options) => {
285
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
286
- var _p, _q;
286
+ var _a;
287
+ var _b;
287
288
  let m = {};
288
289
  if ('text' in message) {
289
290
  const extContent = { text: message.text };
@@ -292,6 +293,7 @@ const generateWAMessageContent = async (message, options) => {
292
293
  urlInfo = await (0, exports.generateLinkPreviewIfRequired)(message.text, options.getUrlInfo, options.logger);
293
294
  }
294
295
  if (urlInfo) {
296
+ extContent.canonicalUrl = urlInfo['canonical-url'];
295
297
  extContent.matchedText = urlInfo['matched-text'];
296
298
  extContent.jpegThumbnail = urlInfo.jpegThumbnail;
297
299
  extContent.description = urlInfo.description;
@@ -352,54 +354,6 @@ const generateWAMessageContent = async (message, options) => {
352
354
  message.disappearingMessagesInChat;
353
355
  m = (0, exports.prepareDisappearingMessageSettingContent)(exp);
354
356
  }
355
- else if ('groupInvite' in message) {
356
- m.groupInviteMessage = {};
357
- m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
358
- m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
359
- m.groupInviteMessage.caption = message.groupInvite.text;
360
- m.groupInviteMessage.groupJid = message.groupInvite.jid;
361
- m.groupInviteMessage.groupName = message.groupInvite.subject;
362
- //TODO: use built-in interface and get disappearing mode info etc.
363
- //TODO: cache / use store!?
364
- if (options.getProfilePicUrl) {
365
- const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
366
- if (pfpUrl) {
367
- const resp = await axios_1.default.get(pfpUrl, { responseType: 'arraybuffer' });
368
- if (resp.status === 200) {
369
- m.groupInviteMessage.jpegThumbnail = resp.data;
370
- }
371
- }
372
- }
373
- }
374
- else if ('pin' in message) {
375
- m.pinInChatMessage = {};
376
- m.messageContextInfo = {};
377
- m.pinInChatMessage.key = message.pin;
378
- m.pinInChatMessage.type = message.type;
379
- m.pinInChatMessage.senderTimestampMs = Date.now();
380
- m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
381
- }
382
- else if ('keep' in message) {
383
- m.keepInChatMessage = {};
384
- m.keepInChatMessage.key = message.keep;
385
- m.keepInChatMessage.keepType = message.type;
386
- m.keepInChatMessage.timestampMs = Date.now();
387
- }
388
- else if ('call' in message) {
389
- m = {
390
- scheduledCallCreationMessage: {
391
- scheduledTimestampMs: (_a = message.call.time) !== null && _a !== void 0 ? _a : Date.now(),
392
- callType: (_b = message.call.type) !== null && _b !== void 0 ? _b : 1,
393
- title: message.call.title
394
- }
395
- };
396
- }
397
- else if ('paymentInvite' in message) {
398
- m.paymentInviteMessage = {
399
- serviceType: message.paymentInvite.type,
400
- expiryTimestamp: message.paymentInvite.expiry
401
- };
402
- }
403
357
  else if ('buttonReply' in message) {
404
358
  switch (message.type) {
405
359
  case 'template':
@@ -418,10 +372,6 @@ const generateWAMessageContent = async (message, options) => {
418
372
  break;
419
373
  }
420
374
  }
421
- else if ('ptv' in message && message.ptv) {
422
- const { videoMessage } = await (0, exports.prepareWAMessageMedia)({ video: message.video }, options);
423
- m.ptvMessage = videoMessage;
424
- }
425
375
  else if ('product' in message) {
426
376
  const { imageMessage } = await (0, exports.prepareWAMessageMedia)({ image: message.product.productImage }, options);
427
377
  m.productMessage = Types_1.WAProto.Message.ProductMessage.fromObject({
@@ -432,27 +382,11 @@ const generateWAMessageContent = async (message, options) => {
432
382
  }
433
383
  });
434
384
  }
435
- else if ('order' in message) {
436
- m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
437
- orderId: message.order.id,
438
- thumbnail: message.order.thumbnail,
439
- itemCount: message.order.itemCount,
440
- status: message.order.status,
441
- surface: message.order.surface,
442
- orderTitle: message.order.title,
443
- message: message.order.text,
444
- sellerJid: message.order.seller,
445
- token: message.order.token,
446
- totalAmount1000: message.order.amount,
447
- totalCurrencyCode: message.order.currency
448
- });
449
- }
450
385
  else if ('listReply' in message) {
451
386
  m.listResponseMessage = { ...message.listReply };
452
387
  }
453
388
  else if ('poll' in message) {
454
- (_p = message.poll).selectableCount || (_p.selectableCount = 0);
455
- (_q = message.poll).toAnnouncementGroup || (_q.toAnnouncementGroup = false);
389
+ (_b = message.poll).selectableCount || (_b.selectableCount = 0);
456
390
  if (!Array.isArray(message.poll.values)) {
457
391
  throw new boom_1.Boom('Invalid poll values', { statusCode: 400 });
458
392
  }
@@ -464,72 +398,11 @@ const generateWAMessageContent = async (message, options) => {
464
398
  // encKey
465
399
  messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
466
400
  };
467
- const pollCreationMessage = {
401
+ m.pollCreationMessage = {
468
402
  name: message.poll.name,
469
403
  selectableOptionsCount: message.poll.selectableCount,
470
404
  options: message.poll.values.map(optionName => ({ optionName })),
471
405
  };
472
- if (message.poll.toAnnouncementGroup) {
473
- // poll v2 is for community announcement groups (single select and multiple)
474
- m.pollCreationMessageV2 = pollCreationMessage;
475
- }
476
- else {
477
- if (message.poll.selectableCount === 1) {
478
- // poll v3 is for single select polls
479
- m.pollCreationMessageV3 = pollCreationMessage;
480
- }
481
- else {
482
- // poll for multiple choice polls
483
- m.pollCreationMessage = pollCreationMessage;
484
- }
485
- }
486
- }
487
- else if ('event' in message) {
488
- m.messageContextInfo = {
489
- messageSecret: message.event.messageSecret || (0, crypto_1.randomBytes)(32),
490
- };
491
- m.eventMessage = { ...message.event };
492
- }
493
- else if ('inviteAdmin' in message) {
494
- m.newsletterAdminInviteMessage = {};
495
- m.newsletterAdminInviteMessage.inviteExpiration = message.inviteAdmin.inviteExpiration;
496
- m.newsletterAdminInviteMessage.caption = message.inviteAdmin.text;
497
- m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
498
- m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
499
- m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
500
- }
501
- else if ('requestPayment' in message) {
502
- const sticker = ((_c = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _c === void 0 ? void 0 : _c.sticker) ?
503
- 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)
504
- : null;
505
- let notes = {};
506
- if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
507
- notes = {
508
- stickerMessage: {
509
- ...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
510
- contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
511
- }
512
- };
513
- }
514
- else if (message.requestPayment.note) {
515
- notes = {
516
- extendedTextMessage: {
517
- text: message.requestPayment.note,
518
- contextInfo: (_g = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _g === void 0 ? void 0 : _g.contextInfo,
519
- }
520
- };
521
- }
522
- else {
523
- throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
524
- }
525
- m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
526
- expiryTimestamp: message.requestPayment.expiry,
527
- amount1000: message.requestPayment.amount,
528
- currencyCodeIso4217: message.requestPayment.currency,
529
- requestFrom: message.requestPayment.from,
530
- noteMessage: { ...notes },
531
- background: (_h = message.requestPayment.background) !== null && _h !== void 0 ? _h : null,
532
- });
533
406
  }
534
407
  else if ('sharePhoneNumber' in message) {
535
408
  m.protocolMessage = {
@@ -539,14 +412,6 @@ const generateWAMessageContent = async (message, options) => {
539
412
  else if ('requestPhoneNumber' in message) {
540
413
  m.requestPhoneNumberMessage = {};
541
414
  }
542
- else if ('album' in message) {
543
- const imageMessages = message.album.filter(item => 'image' in item);
544
- const videoMessages = message.album.filter(item => 'video' in item);
545
- m.albumMessage = WAProto_1.proto.Message.AlbumMessage.fromObject({
546
- expectedImageCount: imageMessages.length,
547
- expectedVideoCount: videoMessages.length,
548
- });
549
- }
550
415
  else {
551
416
  m = await (0, exports.prepareWAMessageMedia)(message, options);
552
417
  }
@@ -566,24 +431,14 @@ const generateWAMessageContent = async (message, options) => {
566
431
  buttonsMessage.headerType = ButtonType[type];
567
432
  Object.assign(buttonsMessage, m);
568
433
  }
569
- if ('title' in message && !!message.title) {
570
- buttonsMessage.text = message.title,
571
- buttonsMessage.headerType = ButtonType.TEXT;
572
- }
573
434
  if ('footer' in message && !!message.footer) {
574
435
  buttonsMessage.footerText = message.footer;
575
436
  }
576
- if ('contextInfo' in message && !!message.contextInfo) {
577
- buttonsMessage.contextInfo = message.contextInfo;
578
- }
579
- if ('mentions' in message && !!message.mentions) {
580
- buttonsMessage.contextInfo = { mentionedJid: message.mentions };
581
- }
582
437
  m = { buttonsMessage };
583
438
  }
584
439
  else if ('templateButtons' in message && !!message.templateButtons) {
585
440
  const msg = {
586
- hydratedButtons: message.hasOwnProperty("templateButtons") ? message.templateButtons : message.templateButtons
441
+ hydratedButtons: message.templateButtons
587
442
  };
588
443
  if ('text' in message) {
589
444
  msg.hydratedContentText = message.text;
@@ -615,97 +470,10 @@ const generateWAMessageContent = async (message, options) => {
615
470
  };
616
471
  m = { listMessage };
617
472
  }
618
- if ('interactiveButtons' in message && !!message.interactiveButtons) {
619
- const interactiveMessage = {
620
- nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
621
- buttons: message.interactiveButtons,
622
- })
623
- };
624
- if ('text' in message) {
625
- interactiveMessage.body = {
626
- text: message.text
627
- };
628
- }
629
- else if ('caption' in message) {
630
- interactiveMessage.body = {
631
- text: message.caption
632
- };
633
- interactiveMessage.header = {
634
- title: message.title,
635
- subtitle: message.subtitle,
636
- hasMediaAttachment: (_j = message === null || message === void 0 ? void 0 : message.media) !== null && _j !== void 0 ? _j : false,
637
- };
638
- Object.assign(interactiveMessage.header, m);
639
- }
640
- if ('footer' in message && !!message.footer) {
641
- interactiveMessage.footer = {
642
- text: message.footer
643
- };
644
- }
645
- if ('title' in message && !!message.title) {
646
- interactiveMessage.header = {
647
- title: message.title,
648
- subtitle: message.subtitle,
649
- hasMediaAttachment: (_k = message === null || message === void 0 ? void 0 : message.media) !== null && _k !== void 0 ? _k : false,
650
- };
651
- Object.assign(interactiveMessage.header, m);
652
- }
653
- if ('contextInfo' in message && !!message.contextInfo) {
654
- interactiveMessage.contextInfo = message.contextInfo;
655
- }
656
- if ('mentions' in message && !!message.mentions) {
657
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
658
- }
659
- m = { interactiveMessage };
660
- }
661
- if ('shop' in message && !!message.shop) {
662
- const interactiveMessage = {
663
- shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
664
- surface: message.shop,
665
- id: message.id
666
- })
667
- };
668
- if ('text' in message) {
669
- interactiveMessage.body = {
670
- text: message.text
671
- };
672
- }
673
- else if ('caption' in message) {
674
- interactiveMessage.body = {
675
- text: message.caption
676
- };
677
- interactiveMessage.header = {
678
- title: message.title,
679
- subtitle: message.subtitle,
680
- hasMediaAttachment: (_l = message === null || message === void 0 ? void 0 : message.media) !== null && _l !== void 0 ? _l : false,
681
- };
682
- Object.assign(interactiveMessage.header, m);
683
- }
684
- if ('footer' in message && !!message.footer) {
685
- interactiveMessage.footer = {
686
- text: message.footer
687
- };
688
- }
689
- if ('title' in message && !!message.title) {
690
- interactiveMessage.header = {
691
- title: message.title,
692
- subtitle: message.subtitle,
693
- hasMediaAttachment: (_m = message === null || message === void 0 ? void 0 : message.media) !== null && _m !== void 0 ? _m : false,
694
- };
695
- Object.assign(interactiveMessage.header, m);
696
- }
697
- if ('contextInfo' in message && !!message.contextInfo) {
698
- interactiveMessage.contextInfo = message.contextInfo;
699
- }
700
- if ('mentions' in message && !!message.mentions) {
701
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
702
- }
703
- m = { interactiveMessage };
704
- }
705
473
  if ('viewOnce' in message && !!message.viewOnce) {
706
474
  m = { viewOnceMessage: { message: m } };
707
475
  }
708
- if ('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length)) {
476
+ if ('mentions' in message && ((_a = message.mentions) === null || _a === void 0 ? void 0 : _a.length)) {
709
477
  const [messageType] = Object.keys(m);
710
478
  m[messageType].contextInfo = m[messageType] || {};
711
479
  m[messageType].contextInfo.mentionedJid = message.mentions;
@@ -738,29 +506,26 @@ const generateWAMessageFromContent = (jid, message, options) => {
738
506
  const key = (0, exports.getContentType)(innerMessage);
739
507
  const timestamp = (0, generics_1.unixTimestampSeconds)(options.timestamp);
740
508
  const { quoted, userJid } = options;
741
- // only set quoted if isn't a newsletter message
742
- if (quoted && !(0, WABinary_1.isJidNewsletter)(jid)) {
509
+ if (quoted && !(0, WABinary_1.isJidNewsLetter)(jid)) {
743
510
  const participant = quoted.key.fromMe ? userJid : (quoted.participant || quoted.key.participant || quoted.key.remoteJid);
744
511
  let quotedMsg = (0, exports.normalizeMessageContent)(quoted.message);
745
512
  const msgType = (0, exports.getContentType)(quotedMsg);
746
513
  // strip any redundant properties
747
- if (quotedMsg) {
748
- quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
749
- const quotedContent = quotedMsg[msgType];
750
- if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
751
- delete quotedContent.contextInfo;
752
- }
753
- const contextInfo = innerMessage[key].contextInfo || {};
754
- contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
755
- contextInfo.stanzaId = quoted.key.id;
756
- contextInfo.quotedMessage = quotedMsg;
757
- // if a participant is quoted, then it must be a group
758
- // hence, remoteJid of group must also be entered
759
- if (jid !== quoted.key.remoteJid) {
760
- contextInfo.remoteJid = quoted.key.remoteJid;
761
- }
762
- innerMessage[key].contextInfo = contextInfo;
763
- }
514
+ quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
515
+ const quotedContent = quotedMsg[msgType];
516
+ if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
517
+ delete quotedContent.contextInfo;
518
+ }
519
+ const contextInfo = innerMessage[key].contextInfo || {};
520
+ contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
521
+ contextInfo.stanzaId = quoted.key.id;
522
+ contextInfo.quotedMessage = quotedMsg;
523
+ // if a participant is quoted, then it must be a group
524
+ // hence, remoteJid of group must also be entered
525
+ if (jid !== quoted.key.remoteJid) {
526
+ contextInfo.remoteJid = quoted.key.remoteJid;
527
+ }
528
+ innerMessage[key].contextInfo = contextInfo;
764
529
  }
765
530
  if (
766
531
  // if we want to send a disappearing message
@@ -770,7 +535,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
770
535
  // already not converted to disappearing message
771
536
  key !== 'ephemeralMessage' &&
772
537
  // newsletter not accept disappearing messages
773
- !(0, WABinary_1.isJidNewsletter)(jid)) {
538
+ !(0, WABinary_1.isJidNewsLetter)(jid)) {
774
539
  innerMessage[key].contextInfo = {
775
540
  ...(innerMessage[key].contextInfo || {}),
776
541
  expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
@@ -782,7 +547,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
782
547
  key: {
783
548
  remoteJid: jid,
784
549
  fromMe: true,
785
- id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageIDV2)(),
550
+ id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageID)(),
786
551
  },
787
552
  message: message,
788
553
  messageTimestamp: timestamp,
@@ -797,7 +562,7 @@ const generateWAMessage = async (jid, content, options) => {
797
562
  var _a;
798
563
  // ensure msg ID is with every log
799
564
  options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
800
- return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsletter)(jid), ...options }), options);
565
+ return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsLetter)(jid), ...options }), options);
801
566
  };
802
567
  exports.generateWAMessage = generateWAMessage;
803
568
  /** Get the key to access the true type of content */
@@ -834,24 +599,7 @@ const normalizeMessageContent = (content) => {
834
599
  || (message === null || message === void 0 ? void 0 : message.documentWithCaptionMessage)
835
600
  || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2)
836
601
  || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension)
837
- || (message === null || message === void 0 ? void 0 : message.editedMessage)
838
- || (message === null || message === void 0 ? void 0 : message.groupMentionedMessage)
839
- || (message === null || message === void 0 ? void 0 : message.botInvokeMessage)
840
- || (message === null || message === void 0 ? void 0 : message.lottieStickerMessage)
841
- || (message === null || message === void 0 ? void 0 : message.eventCoverImage)
842
- || (message === null || message === void 0 ? void 0 : message.statusMentionMessage)
843
- || (message === null || message === void 0 ? void 0 : message.pollCreationOptionImageMessage)
844
- || (message === null || message === void 0 ? void 0 : message.associatedChildMessage)
845
- || (message === null || message === void 0 ? void 0 : message.groupStatusMentionMessage)
846
- || (message === null || message === void 0 ? void 0 : message.pollCreationMessageV4)
847
- || (message === null || message === void 0 ? void 0 : message.pollCreationMessageV5)
848
- || (message === null || message === void 0 ? void 0 : message.statusAddYours)
849
- || (message === null || message === void 0 ? void 0 : message.groupStatusMessage)
850
- || (message === null || message === void 0 ? void 0 : message.limitSharingMessage)
851
- || (message === null || message === void 0 ? void 0 : message.botTaskMessage)
852
- || (message === null || message === void 0 ? void 0 : message.questionMessage)
853
- || (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
854
- || (message === null || message === void 0 ? void 0 : message.botForwardedMessage));
602
+ || (message === null || message === void 0 ? void 0 : message.editedMessage));
855
603
  }
856
604
  };
857
605
  exports.normalizeMessageContent = normalizeMessageContent;
@@ -901,11 +649,7 @@ exports.extractMessageContent = extractMessageContent;
901
649
  /**
902
650
  * Returns the device predicted by message ID
903
651
  */
904
- const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' :
905
- /^3E.{20}$/.test(id) ? 'web' :
906
- /^(.{21}|.{32})$/.test(id) ? 'android' :
907
- /^(3F|.{18}$)/.test(id) ? 'desktop' :
908
- 'unknown';
652
+ const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' : /^3E.{20}$/.test(id) ? 'web' : /^(.{21}|.{32})$/.test(id) ? 'android' : /^.{18}$/.test(id) ? 'desktop' : 'unknown';
909
653
  exports.getDevice = getDevice;
910
654
  /** Upserts a receipt in the message */
911
655
  const updateMessageWithReceipt = (msg, receipt) => {
@@ -924,8 +668,9 @@ const updateMessageWithReaction = (msg, reaction) => {
924
668
  const authorID = (0, generics_1.getKeyAuthor)(reaction.key);
925
669
  const reactions = (msg.reactions || [])
926
670
  .filter(r => (0, generics_1.getKeyAuthor)(r.key) !== authorID);
927
- reaction.text = reaction.text || '';
928
- reactions.push(reaction);
671
+ if (reaction.text) {
672
+ reactions.push(reaction);
673
+ }
929
674
  msg.reactions = reactions;
930
675
  };
931
676
  exports.updateMessageWithReaction = updateMessageWithReaction;
@@ -978,6 +723,7 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
978
723
  }
979
724
  return Object.values(voteHashMap);
980
725
  }
726
+ exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
981
727
  /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
982
728
  const aggregateMessageKeysNotFromMe = (keys) => {
983
729
  const keyMap = {};
@@ -1068,22 +814,3 @@ const assertMediaContent = (content) => {
1068
814
  return mediaContent;
1069
815
  };
1070
816
  exports.assertMediaContent = assertMediaContent;
1071
-
1072
- const toJid = (id) => {
1073
- if (!id)
1074
- return '';
1075
- if (id.endsWith('@lid'))
1076
- return id.replace('@lid', '@s.whatsapp.net');
1077
- if (id.includes('@'))
1078
- return id;
1079
- return `${id}@s.whatsapp.net`;
1080
- };
1081
- exports.toJid = toJid;
1082
- const getSenderLid = (message) => {
1083
- const sender = message.key.participant || message.key.remoteJid;
1084
- const user = (0, WABinary_1.jidDecode)(sender)?.user || '';
1085
- const lid = (0, WABinary_1.jidEncode)(user, 'lid');
1086
- console.log('sender lid:', lid);
1087
- return { jid: sender, lid };
1088
- };
1089
- exports.getSenderLid = getSenderLid;
@@ -1,19 +1,21 @@
1
- import { ILogger } from './logger';
1
+ /// <reference types="node" />
2
+ import { Logger } from 'pino';
2
3
  import { proto } from '../../WAProto';
3
4
  import { KeyPair } from '../Types';
4
5
  import { BinaryNode } from '../WABinary';
5
- export declare const makeNoiseHandler: ({ keyPair: { private: privateKey, public: publicKey }, NOISE_HEADER, logger, routingInfo }: {
6
+ export declare const makeNoiseHandler: ({ keyPair: { private: privateKey, public: publicKey }, NOISE_HEADER, mobile, logger, routingInfo }: {
6
7
  keyPair: KeyPair;
7
8
  NOISE_HEADER: Uint8Array;
8
- logger: ILogger;
9
+ mobile: boolean;
10
+ logger: Logger;
9
11
  routingInfo?: Buffer | undefined;
10
12
  }) => {
11
- encrypt: (plaintext: Uint8Array) => Buffer<ArrayBuffer>;
12
- decrypt: (ciphertext: Uint8Array) => Buffer<ArrayBuffer>;
13
+ encrypt: (plaintext: Uint8Array) => Buffer;
14
+ decrypt: (ciphertext: Uint8Array) => Buffer;
13
15
  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>;
16
+ mixIntoKey: (data: Uint8Array) => void;
17
+ finishInit: () => void;
18
+ processHandshake: ({ serverHello }: proto.HandshakeMessage, noiseKey: KeyPair) => Buffer;
19
+ encodeFrame: (data: Buffer | Uint8Array) => Buffer;
20
+ decodeFrame: (newData: Buffer | Uint8Array, onFrame: (buff: Uint8Array | BinaryNode) => void) => void;
19
21
  };