@dappaoffc/baileys-mod 5.0.7 → 6.0.1

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.

Potentially problematic release.


This version of @dappaoffc/baileys-mod might be problematic. Click here for more details.

Files changed (210) hide show
  1. package/WAProto/index.js +133384 -57814
  2. package/engine-requirements.js +10 -0
  3. package/lib/Defaults/baileys-version.json +3 -0
  4. package/lib/Defaults/index.d.ts +53 -0
  5. package/lib/Defaults/index.js +141 -117
  6. package/lib/Defaults/phonenumber-mcc.json +223 -0
  7. package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
  8. package/lib/Signal/Group/ciphertext-message.js +14 -12
  9. package/lib/Signal/Group/group-session-builder.d.ts +14 -0
  10. package/lib/Signal/Group/group-session-builder.js +42 -10
  11. package/lib/Signal/Group/group_cipher.d.ts +17 -0
  12. package/lib/Signal/Group/group_cipher.js +87 -75
  13. package/lib/Signal/Group/index.d.ts +11 -0
  14. package/lib/Signal/Group/index.js +57 -13
  15. package/lib/Signal/Group/keyhelper.d.ts +10 -0
  16. package/lib/Signal/Group/keyhelper.js +52 -17
  17. package/lib/Signal/Group/queue-job.d.ts +1 -0
  18. package/lib/Signal/Group/queue-job.js +57 -0
  19. package/lib/Signal/Group/sender-chain-key.d.ts +13 -0
  20. package/lib/Signal/Group/sender-chain-key.js +33 -27
  21. package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -0
  22. package/lib/Signal/Group/sender-key-distribution-message.js +63 -62
  23. package/lib/Signal/Group/sender-key-message.d.ts +18 -0
  24. package/lib/Signal/Group/sender-key-message.js +66 -65
  25. package/lib/Signal/Group/sender-key-name.d.ts +17 -0
  26. package/lib/Signal/Group/sender-key-name.js +44 -45
  27. package/lib/Signal/Group/sender-key-record.d.ts +30 -0
  28. package/lib/Signal/Group/sender-key-record.js +49 -39
  29. package/lib/Signal/Group/sender-key-state.d.ts +38 -0
  30. package/lib/Signal/Group/sender-key-state.js +93 -80
  31. package/lib/Signal/Group/sender-message-key.d.ts +11 -0
  32. package/lib/Signal/Group/sender-message-key.js +28 -27
  33. package/lib/Signal/libsignal.d.ts +3 -0
  34. package/lib/Signal/libsignal.js +163 -313
  35. package/lib/Socket/Client/abstract-socket-client.d.ts +17 -0
  36. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  37. package/lib/Socket/Client/index.d.ts +3 -0
  38. package/lib/Socket/Client/index.js +19 -4
  39. package/lib/Socket/Client/mobile-socket-client.d.ts +13 -0
  40. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  41. package/lib/Socket/Client/web-socket-client.d.ts +12 -0
  42. package/lib/Socket/Client/web-socket-client.js +62 -0
  43. package/lib/Socket/business.d.ts +171 -0
  44. package/lib/Socket/business.js +242 -359
  45. package/lib/Socket/chats.d.ts +267 -0
  46. package/lib/Socket/chats.js +935 -846
  47. package/lib/Socket/dugong.d.ts +254 -0
  48. package/lib/Socket/dugong.js +484 -0
  49. package/lib/Socket/groups.d.ts +115 -0
  50. package/lib/Socket/groups.js +309 -304
  51. package/lib/Socket/index.d.ts +173 -0
  52. package/lib/Socket/index.js +10 -15
  53. package/lib/Socket/messages-recv.d.ts +161 -0
  54. package/lib/Socket/messages-recv.js +1054 -1107
  55. package/lib/Socket/messages-send.d.ts +149 -0
  56. package/lib/Socket/messages-send.js +448 -639
  57. package/lib/Socket/newsletter.d.ts +134 -0
  58. package/lib/Socket/newsletter.js +314 -199
  59. package/lib/Socket/registration.d.ts +267 -0
  60. package/lib/Socket/registration.js +166 -0
  61. package/lib/Socket/socket.d.ts +43 -0
  62. package/lib/Socket/socket.js +647 -787
  63. package/lib/Socket/usync.d.ts +36 -0
  64. package/lib/Socket/usync.js +70 -0
  65. package/lib/Store/index.d.ts +3 -0
  66. package/lib/Store/index.js +10 -6
  67. package/lib/Store/make-cache-manager-store.d.ts +13 -0
  68. package/lib/Store/make-cache-manager-store.js +81 -73
  69. package/lib/Store/make-in-memory-store.d.ts +118 -0
  70. package/lib/Store/make-in-memory-store.js +423 -286
  71. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  72. package/lib/Store/make-ordered-dictionary.js +79 -77
  73. package/lib/Store/object-repository.d.ts +10 -0
  74. package/lib/Store/object-repository.js +26 -24
  75. package/lib/Types/Auth.d.ts +110 -0
  76. package/lib/Types/Auth.js +2 -3
  77. package/lib/Types/Call.d.ts +13 -0
  78. package/lib/Types/Call.js +2 -3
  79. package/lib/Types/Chat.d.ts +102 -0
  80. package/lib/Types/Chat.js +4 -9
  81. package/lib/Types/Contact.d.ts +19 -0
  82. package/lib/Types/Contact.js +2 -3
  83. package/lib/Types/Events.d.ts +157 -0
  84. package/lib/Types/Events.js +2 -3
  85. package/lib/Types/GroupMetadata.d.ts +55 -0
  86. package/lib/Types/GroupMetadata.js +2 -3
  87. package/lib/Types/Label.d.ts +35 -0
  88. package/lib/Types/Label.js +26 -24
  89. package/lib/Types/LabelAssociation.d.ts +29 -0
  90. package/lib/Types/LabelAssociation.js +8 -6
  91. package/lib/Types/Message.d.ts +273 -0
  92. package/lib/Types/Message.js +9 -12
  93. package/lib/Types/Newsletter.d.ts +103 -0
  94. package/lib/Types/Newsletter.js +38 -33
  95. package/lib/Types/Product.d.ts +78 -0
  96. package/lib/Types/Product.js +2 -3
  97. package/lib/Types/Signal.d.ts +57 -0
  98. package/lib/Types/Signal.js +2 -3
  99. package/lib/Types/Socket.d.ts +111 -0
  100. package/lib/Types/Socket.js +2 -4
  101. package/lib/Types/State.d.ts +27 -0
  102. package/lib/Types/State.js +2 -11
  103. package/lib/Types/USync.d.ts +25 -0
  104. package/lib/Types/USync.js +2 -3
  105. package/lib/Types/index.d.ts +57 -0
  106. package/lib/Types/index.js +41 -27
  107. package/lib/Utils/auth-utils.d.ts +18 -0
  108. package/lib/Utils/auth-utils.js +198 -211
  109. package/lib/Utils/baileys-event-stream.d.ts +16 -0
  110. package/lib/Utils/baileys-event-stream.js +61 -42
  111. package/lib/Utils/business.d.ts +22 -0
  112. package/lib/Utils/business.js +214 -213
  113. package/lib/Utils/chat-utils.d.ts +71 -0
  114. package/lib/Utils/chat-utils.js +687 -710
  115. package/lib/Utils/crypto.d.ts +41 -0
  116. package/lib/Utils/crypto.js +133 -112
  117. package/lib/Utils/decode-wa-message.d.ts +19 -0
  118. package/lib/Utils/decode-wa-message.js +183 -252
  119. package/lib/Utils/event-buffer.d.ts +35 -0
  120. package/lib/Utils/event-buffer.js +496 -510
  121. package/lib/Utils/generics.d.ts +92 -0
  122. package/lib/Utils/generics.js +392 -319
  123. package/lib/Utils/generics.js.bak +433 -0
  124. package/lib/Utils/history.d.ts +15 -0
  125. package/lib/Utils/history.js +92 -83
  126. package/lib/Utils/index.d.ts +17 -0
  127. package/lib/Utils/index.js +33 -21
  128. package/lib/Utils/link-preview.d.ts +21 -0
  129. package/lib/Utils/link-preview.js +83 -71
  130. package/lib/Utils/logger.d.ts +4 -0
  131. package/lib/Utils/logger.js +7 -5
  132. package/lib/Utils/lt-hash.d.ts +12 -0
  133. package/lib/Utils/lt-hash.js +46 -40
  134. package/lib/Utils/make-mutex.d.ts +7 -0
  135. package/lib/Utils/make-mutex.js +41 -34
  136. package/lib/Utils/messages-media.d.ts +116 -0
  137. package/lib/Utils/messages-media.js +768 -550
  138. package/lib/Utils/messages.d.ts +77 -0
  139. package/lib/Utils/messages.js +261 -352
  140. package/lib/Utils/noise-handler.d.ts +21 -0
  141. package/lib/Utils/noise-handler.js +149 -138
  142. package/lib/Utils/process-message.d.ts +41 -0
  143. package/lib/Utils/process-message.js +303 -323
  144. package/lib/Utils/signal.d.ts +32 -0
  145. package/lib/Utils/signal.js +141 -149
  146. package/lib/Utils/use-multi-file-auth-state.d.ts +13 -0
  147. package/lib/Utils/use-multi-file-auth-state.js +103 -95
  148. package/lib/Utils/validate-connection.d.ts +11 -0
  149. package/lib/Utils/validate-connection.js +214 -183
  150. package/lib/Utils/validate-connection.js.bak +237 -0
  151. package/lib/WABinary/constants.d.ts +30 -0
  152. package/lib/WABinary/constants.js +35 -1298
  153. package/lib/WABinary/decode.d.ts +7 -0
  154. package/lib/WABinary/decode.js +249 -237
  155. package/lib/WABinary/encode.d.ts +3 -0
  156. package/lib/WABinary/encode.js +260 -213
  157. package/lib/WABinary/generic-utils.d.ts +17 -0
  158. package/lib/WABinary/generic-utils.js +65 -56
  159. package/lib/WABinary/index.d.ts +5 -0
  160. package/lib/WABinary/index.js +21 -7
  161. package/lib/WABinary/jid-utils.d.ts +31 -0
  162. package/lib/WABinary/jid-utils.js +58 -89
  163. package/lib/WABinary/types.d.ts +18 -0
  164. package/lib/WABinary/types.js +2 -3
  165. package/lib/WAM/BinaryInfo.d.ts +17 -0
  166. package/lib/WAM/BinaryInfo.js +12 -10
  167. package/lib/WAM/constants.d.ts +38 -0
  168. package/lib/WAM/constants.js +15348 -22851
  169. package/lib/WAM/encode.d.ts +3 -0
  170. package/lib/WAM/encode.js +136 -135
  171. package/lib/WAM/index.d.ts +3 -0
  172. package/lib/WAM/index.js +19 -5
  173. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  174. package/lib/WAUSync/Protocols/USyncContactProtocol.js +30 -28
  175. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  176. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +53 -49
  177. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  178. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +28 -27
  179. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  180. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +39 -36
  181. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
  182. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +50 -50
  183. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
  184. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +20 -26
  185. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  186. package/lib/WAUSync/Protocols/index.js +20 -6
  187. package/lib/WAUSync/USyncQuery.d.ts +28 -0
  188. package/lib/WAUSync/USyncQuery.js +85 -86
  189. package/lib/WAUSync/USyncUser.d.ts +12 -0
  190. package/lib/WAUSync/USyncUser.js +25 -23
  191. package/lib/WAUSync/index.d.ts +3 -0
  192. package/lib/WAUSync/index.js +19 -5
  193. package/lib/index.d.ts +12 -0
  194. package/lib/index.js +36 -24
  195. package/package.json +106 -98
  196. package/LICENSE +0 -21
  197. package/WAProto/WAProto.proto +0 -5311
  198. package/lib/KeyDB/BinarySearch.js +0 -20
  199. package/lib/KeyDB/KeyedDB.js +0 -167
  200. package/lib/KeyDB/index.js +0 -4
  201. package/lib/Signal/lid-mapping.js +0 -155
  202. package/lib/Socket/Client/types.js +0 -13
  203. package/lib/Socket/Client/websocket.js +0 -52
  204. package/lib/Socket/communities.js +0 -413
  205. package/lib/Socket/mex.js +0 -45
  206. package/lib/Types/Bussines.js +0 -3
  207. package/lib/Types/Newsletter.js.bak +0 -33
  208. package/lib/Utils/browser-utils.js +0 -25
  209. package/lib/Utils/message-retry-manager.js +0 -113
  210. package/lib/Utils/pre-key-manager.js +0 -85
@@ -1,49 +1,56 @@
1
- import { Boom } from '@hapi/boom';
2
- import { randomBytes } from 'crypto';
3
- import { promises as fs } from 'fs';
4
- import {} from 'stream';
5
- import { proto } from '../../WAProto/index.js';
6
- import { CALL_AUDIO_PREFIX, CALL_VIDEO_PREFIX, MEDIA_KEYS, URL_REGEX, WA_DEFAULT_EPHEMERAL } from '../Defaults/index.js';
7
- import { WAMessageStatus, WAProto } from '../Types/index.js';
8
- import { isJidGroup, isJidNewsletter, isJidStatusBroadcast, jidNormalizedUser } from '../WABinary/index.js';
9
- import { sha256 } from './crypto.js';
10
- import { generateMessageIDV2, getKeyAuthor, unixTimestampSeconds } from './generics.js';
11
- import { downloadContentFromMessage, encryptedStream, generateThumbnail, getAudioDuration, getAudioWaveform, getRawMediaUploadData } from './messages-media.js';
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assertMediaContent = exports.downloadMediaMessage = exports.aggregateMessageKeysNotFromMe = exports.getAggregateVotesInPollMessage = exports.updateMessageWithPollUpdate = exports.updateMessageWithReaction = exports.updateMessageWithReceipt = exports.getDevice = exports.extractMessageContent = exports.normalizeMessageContent = exports.getContentType = exports.generateWAMessage = exports.generateWAMessageFromContent = exports.generateWAMessageContent = exports.generateForwardMessageContent = exports.prepareDisappearingMessageSettingContent = exports.prepareWAMessageMedia = exports.generateLinkPreviewIfRequired = exports.extractUrlFromText = void 0;
7
+ const boom_1 = require("@hapi/boom");
8
+ const axios_1 = __importDefault(require("axios"));
9
+ const crypto_1 = require("crypto");
10
+ const fs_1 = require("fs");
11
+ const WAProto_1 = require("../../WAProto");
12
+ const Defaults_1 = require("../Defaults");
13
+ const Types_1 = require("../Types");
14
+ const WABinary_1 = require("../WABinary");
15
+ const crypto_2 = require("./crypto");
16
+ const generics_1 = require("./generics");
17
+ const messages_media_1 = require("./messages-media");
12
18
  const MIMETYPE_MAP = {
13
19
  image: 'image/jpeg',
14
20
  video: 'video/mp4',
15
21
  document: 'application/pdf',
16
22
  audio: 'audio/ogg; codecs=opus',
17
23
  sticker: 'image/webp',
18
- 'product-catalog-image': 'image/jpeg'
24
+ 'product-catalog-image': 'image/jpeg',
19
25
  };
20
26
  const MessageTypeProto = {
21
- image: WAProto.Message.ImageMessage,
22
- video: WAProto.Message.VideoMessage,
23
- audio: WAProto.Message.AudioMessage,
24
- sticker: WAProto.Message.StickerMessage,
25
- document: WAProto.Message.DocumentMessage
27
+ 'image': Types_1.WAProto.Message.ImageMessage,
28
+ 'video': Types_1.WAProto.Message.VideoMessage,
29
+ 'audio': Types_1.WAProto.Message.AudioMessage,
30
+ 'sticker': Types_1.WAProto.Message.StickerMessage,
31
+ 'document': Types_1.WAProto.Message.DocumentMessage,
26
32
  };
27
- const ButtonType = proto.Message.ButtonsMessage.HeaderType;
33
+ const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
28
34
  /**
29
35
  * Uses a regex to test whether the string contains a URL, and returns the URL if it does.
30
36
  * @param text eg. hello https://google.com
31
37
  * @returns the URL, eg. https://google.com
32
38
  */
33
- export const extractUrlFromText = (text) => text.match(URL_REGEX)?.[0];
34
- export const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
35
- const url = extractUrlFromText(text);
39
+ const extractUrlFromText = (text) => { var _a; return (_a = text.match(Defaults_1.URL_REGEX)) === null || _a === void 0 ? void 0 : _a[0]; };
40
+ exports.extractUrlFromText = extractUrlFromText;
41
+ const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
42
+ const url = (0, exports.extractUrlFromText)(text);
36
43
  if (!!getUrlInfo && url) {
37
44
  try {
38
45
  const urlInfo = await getUrlInfo(url);
39
46
  return urlInfo;
40
47
  }
41
- catch (error) {
42
- // ignore if fails
43
- logger?.warn({ trace: error.stack }, 'url generation failed');
48
+ catch (error) { // ignore if fails
49
+ logger === null || logger === void 0 ? void 0 : logger.warn({ trace: error.stack }, 'url generation failed');
44
50
  }
45
51
  }
46
52
  };
53
+ exports.generateLinkPreviewIfRequired = generateLinkPreviewIfRequired;
47
54
  const assertColor = async (color) => {
48
55
  let assertedColor;
49
56
  if (typeof color === 'number') {
@@ -58,17 +65,20 @@ const assertColor = async (color) => {
58
65
  return assertedColor;
59
66
  }
60
67
  };
61
- export const prepareWAMessageMedia = async (message, options) => {
68
+ const prepareWAMessageMedia = async (message, options) => {
62
69
  const logger = options.logger;
63
70
  let mediaType;
64
- for (const key of MEDIA_KEYS) {
71
+ for (const key of Defaults_1.MEDIA_KEYS) {
65
72
  if (key in message) {
66
73
  mediaType = key;
67
74
  }
68
75
  }
69
76
  if (!mediaType) {
70
- throw new Boom('Invalid media type', { statusCode: 400 });
77
+ throw new boom_1.Boom('Invalid media type', {
78
+ statusCode: 400
79
+ });
71
80
  }
81
+
72
82
  const uploadData = {
73
83
  ...message,
74
84
  ...(message.annotations ? {
@@ -106,202 +116,184 @@ export const prepareWAMessageMedia = async (message, options) => {
106
116
  media: message[mediaType]
107
117
  };
108
118
  delete uploadData[mediaType];
109
- // check if cacheable + generate cache key
110
119
  const cacheableKey = typeof uploadData.media === 'object' &&
111
- 'url' in uploadData.media &&
120
+ ('url' in uploadData.media) &&
112
121
  !!uploadData.media.url &&
113
- !!options.mediaCache &&
114
- mediaType + ':' + uploadData.media.url.toString();
122
+ !!options.mediaCache && (
123
+ mediaType + ':' + uploadData.media.url.toString());
124
+
115
125
  if (mediaType === 'document' && !uploadData.fileName) {
116
126
  uploadData.fileName = 'file';
117
127
  }
128
+
118
129
  if (!uploadData.mimetype) {
119
130
  uploadData.mimetype = MIMETYPE_MAP[mediaType];
120
131
  }
132
+
121
133
  if (cacheableKey) {
122
- const mediaBuff = await options.mediaCache.get(cacheableKey);
134
+ const mediaBuff = options.mediaCache.get(cacheableKey);
123
135
  if (mediaBuff) {
124
- logger?.debug({ cacheableKey }, 'got media cache hit');
125
- const obj = proto.Message.decode(mediaBuff);
136
+ logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'got media cache hit');
137
+ const obj = Types_1.WAProto.Message.decode(mediaBuff);
126
138
  const key = `${mediaType}Message`;
127
139
  Object.assign(obj[key], { ...uploadData, media: undefined });
128
140
  return obj;
129
141
  }
130
142
  }
131
- const isNewsletter = !!options.jid && isJidNewsletter(options.jid);
132
- if (isNewsletter) {
133
- logger?.info({ key: cacheableKey }, 'Preparing raw media for newsletter');
134
- const { filePath, fileSha256, fileLength } = await getRawMediaUploadData(uploadData.media, options.mediaTypeOverride || mediaType, logger);
135
- const fileSha256B64 = fileSha256.toString('base64');
136
- const { mediaUrl, directPath } = await options.upload(filePath, {
137
- fileEncSha256B64: fileSha256B64,
138
- mediaType: mediaType,
139
- timeoutMs: options.mediaUploadTimeoutMs
140
- });
141
- await fs.unlink(filePath);
142
- const obj = WAProto.Message.fromObject({
143
- // todo: add more support here
144
- [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
145
- url: mediaUrl,
146
- directPath,
147
- fileSha256,
148
- fileLength,
149
- ...uploadData,
150
- media: undefined
151
- })
152
- });
153
- if (uploadData.ptv) {
154
- obj.ptvMessage = obj.videoMessage;
155
- delete obj.videoMessage;
156
- }
157
- if (obj.stickerMessage) {
158
- obj.stickerMessage.stickerSentTs = Date.now();
159
- }
160
- if (cacheableKey) {
161
- logger?.debug({ cacheableKey }, 'set cache');
162
- await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
163
- }
164
- return obj;
165
- }
143
+
166
144
  const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
167
- const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
145
+ const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
146
+ (typeof uploadData['jpegThumbnail'] === 'undefined');
168
147
  const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
169
148
  const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
170
149
  const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
171
- const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await encryptedStream(uploadData.media, options.mediaTypeOverride || mediaType, {
150
+
151
+ const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, opusConverted } = await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
172
152
  logger,
173
153
  saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
174
- opts: options.options
154
+ opts: options.options,
155
+ isPtt: uploadData.ptt,
156
+ forceOpus: (mediaType === "audio" && uploadData.mimetype && uploadData.mimetype.includes('opus'))
175
157
  });
176
- const fileEncSha256B64 = fileEncSha256.toString('base64');
177
- const [{ mediaUrl, directPath }] = await Promise.all([
158
+
159
+ if (mediaType === 'audio' && opusConverted) {
160
+ uploadData.mimetype = 'audio/ogg; codecs=opus';
161
+ }
162
+
163
+ const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 !== void 0 ? fileEncSha256 : fileSha256).toString('base64');
164
+
165
+ const [{ mediaUrl, directPath, handle }] = await Promise.all([
178
166
  (async () => {
179
- const result = await options.upload(encFilePath, {
180
- fileEncSha256B64,
181
- mediaType,
182
- timeoutMs: options.mediaUploadTimeoutMs
183
- });
184
- logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
167
+ const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
168
+ logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
185
169
  return result;
186
170
  })(),
187
171
  (async () => {
188
172
  try {
189
173
  if (requiresThumbnailComputation) {
190
- const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options);
174
+ const { thumbnail, originalImageDimensions } = await (0, messages_media_1.generateThumbnail)(bodyPath, mediaType, options);
191
175
  uploadData.jpegThumbnail = thumbnail;
192
176
  if (!uploadData.width && originalImageDimensions) {
193
177
  uploadData.width = originalImageDimensions.width;
194
178
  uploadData.height = originalImageDimensions.height;
195
- logger?.debug('set dimensions');
179
+ logger === null || logger === void 0 ? void 0 : logger.debug('set dimensions');
196
180
  }
197
- logger?.debug('generated thumbnail');
181
+ logger === null || logger === void 0 ? void 0 : logger.debug('generated thumbnail');
198
182
  }
199
183
  if (requiresDurationComputation) {
200
- uploadData.seconds = await getAudioDuration(originalFilePath);
201
- logger?.debug('computed audio duration');
184
+ uploadData.seconds = await (0, messages_media_1.getAudioDuration)(bodyPath);
185
+ logger === null || logger === void 0 ? void 0 : logger.debug('computed audio duration');
202
186
  }
203
187
  if (requiresWaveformProcessing) {
204
- uploadData.waveform = await getAudioWaveform(originalFilePath, logger);
205
- logger?.debug('processed waveform');
188
+ uploadData.waveform = await (0, messages_media_1.getAudioWaveform)(bodyPath, logger);
189
+ logger === null || logger === void 0 ? void 0 : logger.debug('processed waveform');
206
190
  }
207
191
  if (requiresAudioBackground) {
208
192
  uploadData.backgroundArgb = await assertColor(options.backgroundColor);
209
- logger?.debug('computed backgroundColor audio status');
193
+ logger === null || logger === void 0 ? void 0 : logger.debug('computed backgroundColor audio status');
210
194
  }
211
195
  }
212
196
  catch (error) {
213
- logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
214
- }
215
- })()
216
- ]).finally(async () => {
217
- try {
218
- await fs.unlink(encFilePath);
219
- if (originalFilePath) {
220
- await fs.unlink(originalFilePath);
197
+ logger === null || logger === void 0 ? void 0 : logger.warn({ trace: error.stack }, 'failed to obtain extra info');
221
198
  }
222
- logger?.debug('removed tmp files');
199
+ })(),
200
+ ])
201
+ .finally(async () => {
202
+ if (!Buffer.isBuffer(encWriteStream)) {
203
+ encWriteStream.destroy();
223
204
  }
224
- catch (error) {
225
- logger?.warn('failed to remove tmp file');
205
+
206
+ if (didSaveToTmpPath && bodyPath) {
207
+ await fs_1.promises.unlink(bodyPath);
208
+ logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp files');
226
209
  }
227
210
  });
228
- const obj = WAProto.Message.fromObject({
211
+
212
+ const obj = Types_1.WAProto.Message.fromObject({
229
213
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
230
- url: mediaUrl,
214
+ url: handle ? undefined : mediaUrl,
231
215
  directPath,
232
- mediaKey,
233
- fileEncSha256,
216
+ mediaKey: mediaKey,
217
+ fileEncSha256: fileEncSha256,
234
218
  fileSha256,
235
219
  fileLength,
236
- mediaKeyTimestamp: unixTimestampSeconds(),
220
+ mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
237
221
  ...uploadData,
238
222
  media: undefined
239
223
  })
240
224
  });
225
+
241
226
  if (uploadData.ptv) {
242
227
  obj.ptvMessage = obj.videoMessage;
243
228
  delete obj.videoMessage;
244
229
  }
230
+
245
231
  if (cacheableKey) {
246
- logger?.debug({ cacheableKey }, 'set cache');
247
- await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
232
+ logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'set cache');
233
+ options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish());
248
234
  }
235
+
249
236
  return obj;
250
237
  };
251
- export const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
238
+ exports.prepareWAMessageMedia = prepareWAMessageMedia;
239
+ const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
252
240
  ephemeralExpiration = ephemeralExpiration || 0;
253
241
  const content = {
254
242
  ephemeralMessage: {
255
243
  message: {
256
244
  protocolMessage: {
257
- type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
245
+ type: Types_1.WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
258
246
  ephemeralExpiration
259
247
  }
260
248
  }
261
249
  }
262
250
  };
263
- return WAProto.Message.fromObject(content);
251
+ return Types_1.WAProto.Message.fromObject(content);
264
252
  };
253
+ exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
265
254
  /**
266
255
  * Generate forwarded message content like WA does
267
256
  * @param message the message to forward
268
257
  * @param options.forceForward will show the message as forwarded even if it is from you
269
258
  */
270
- export const generateForwardMessageContent = (message, forceForward) => {
259
+ const generateForwardMessageContent = (message, forceForward) => {
260
+ var _a;
271
261
  let content = message.message;
272
262
  if (!content) {
273
- throw new Boom('no content in message', { statusCode: 400 });
263
+ throw new boom_1.Boom('no content in message', { statusCode: 400 });
274
264
  }
275
265
  // hacky copy
276
- content = normalizeMessageContent(content);
277
- content = proto.Message.decode(proto.Message.encode(content).finish());
266
+ content = (0, exports.normalizeMessageContent)(content);
267
+ content = WAProto_1.proto.Message.decode(WAProto_1.proto.Message.encode(content).finish());
278
268
  let key = Object.keys(content)[0];
279
- let score = content?.[key]?.contextInfo?.forwardingScore || 0;
269
+ let score = ((_a = content[key].contextInfo) === null || _a === void 0 ? void 0 : _a.forwardingScore) || 0;
280
270
  score += message.key.fromMe && !forceForward ? 0 : 1;
281
271
  if (key === 'conversation') {
282
272
  content.extendedTextMessage = { text: content[key] };
283
273
  delete content.conversation;
284
274
  key = 'extendedTextMessage';
285
275
  }
286
- const key_ = content?.[key];
287
276
  if (score > 0) {
288
- key_.contextInfo = { forwardingScore: score, isForwarded: true };
277
+ content[key].contextInfo = { forwardingScore: score, isForwarded: true };
289
278
  }
290
279
  else {
291
- key_.contextInfo = {};
280
+ content[key].contextInfo = {};
292
281
  }
293
282
  return content;
294
283
  };
295
- export const generateWAMessageContent = async (message, options) => {
296
- var _a, _b;
284
+ exports.generateForwardMessageContent = generateForwardMessageContent;
285
+ const generateWAMessageContent = async (message, options) => {
286
+ var _a;
287
+ var _b;
297
288
  let m = {};
298
289
  if ('text' in message) {
299
290
  const extContent = { text: message.text };
300
291
  let urlInfo = message.linkPreview;
301
292
  if (typeof urlInfo === 'undefined') {
302
- urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
293
+ urlInfo = await (0, exports.generateLinkPreviewIfRequired)(message.text, options.getUrlInfo, options.logger);
303
294
  }
304
295
  if (urlInfo) {
296
+ extContent.canonicalUrl = urlInfo['canonical-url'];
305
297
  extContent.matchedText = urlInfo['matched-text'];
306
298
  extContent.jpegThumbnail = urlInfo.jpegThumbnail;
307
299
  extContent.description = urlInfo.description;
@@ -329,68 +321,38 @@ export const generateWAMessageContent = async (message, options) => {
329
321
  else if ('contacts' in message) {
330
322
  const contactLen = message.contacts.contacts.length;
331
323
  if (!contactLen) {
332
- throw new Boom('require atleast 1 contact', { statusCode: 400 });
324
+ throw new boom_1.Boom('require atleast 1 contact', { statusCode: 400 });
333
325
  }
334
326
  if (contactLen === 1) {
335
- m.contactMessage = WAProto.Message.ContactMessage.create(message.contacts.contacts[0]);
327
+ m.contactMessage = Types_1.WAProto.Message.ContactMessage.fromObject(message.contacts.contacts[0]);
336
328
  }
337
329
  else {
338
- m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.create(message.contacts);
330
+ m.contactsArrayMessage = Types_1.WAProto.Message.ContactsArrayMessage.fromObject(message.contacts);
339
331
  }
340
332
  }
341
333
  else if ('location' in message) {
342
- m.locationMessage = WAProto.Message.LocationMessage.create(message.location);
334
+ m.locationMessage = Types_1.WAProto.Message.LocationMessage.fromObject(message.location);
343
335
  }
344
336
  else if ('react' in message) {
345
337
  if (!message.react.senderTimestampMs) {
346
338
  message.react.senderTimestampMs = Date.now();
347
339
  }
348
- m.reactionMessage = WAProto.Message.ReactionMessage.create(message.react);
340
+ m.reactionMessage = Types_1.WAProto.Message.ReactionMessage.fromObject(message.react);
349
341
  }
350
342
  else if ('delete' in message) {
351
343
  m.protocolMessage = {
352
344
  key: message.delete,
353
- type: WAProto.Message.ProtocolMessage.Type.REVOKE
345
+ type: Types_1.WAProto.Message.ProtocolMessage.Type.REVOKE
354
346
  };
355
347
  }
356
348
  else if ('forward' in message) {
357
- m = generateForwardMessageContent(message.forward, message.force);
349
+ m = (0, exports.generateForwardMessageContent)(message.forward, message.force);
358
350
  }
359
351
  else if ('disappearingMessagesInChat' in message) {
360
- const exp = typeof message.disappearingMessagesInChat === 'boolean'
361
- ? message.disappearingMessagesInChat
362
- ? WA_DEFAULT_EPHEMERAL
363
- : 0
364
- : message.disappearingMessagesInChat;
365
- m = prepareDisappearingMessageSettingContent(exp);
366
- }
367
- else if ('groupInvite' in message) {
368
- m.groupInviteMessage = {};
369
- m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
370
- m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
371
- m.groupInviteMessage.caption = message.groupInvite.text;
372
- m.groupInviteMessage.groupJid = message.groupInvite.jid;
373
- m.groupInviteMessage.groupName = message.groupInvite.subject;
374
- //TODO: use built-in interface and get disappearing mode info etc.
375
- //TODO: cache / use store!?
376
- if (options.getProfilePicUrl) {
377
- const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
378
- if (pfpUrl) {
379
- const resp = await fetch(pfpUrl, { method: 'GET', dispatcher: options?.options?.dispatcher });
380
- if (resp.ok) {
381
- const buf = Buffer.from(await resp.arrayBuffer());
382
- m.groupInviteMessage.jpegThumbnail = buf;
383
- }
384
- }
385
- }
386
- }
387
- else if ('pin' in message) {
388
- m.pinInChatMessage = {};
389
- m.messageContextInfo = {};
390
- m.pinInChatMessage.key = message.pin;
391
- m.pinInChatMessage.type = message.type;
392
- m.pinInChatMessage.senderTimestampMs = Date.now();
393
- m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
352
+ const exp = typeof message.disappearingMessagesInChat === 'boolean' ?
353
+ (message.disappearingMessagesInChat ? Defaults_1.WA_DEFAULT_EPHEMERAL : 0) :
354
+ message.disappearingMessagesInChat;
355
+ m = (0, exports.prepareDisappearingMessageSettingContent)(exp);
394
356
  }
395
357
  else if ('buttonReply' in message) {
396
358
  switch (message.type) {
@@ -398,115 +360,64 @@ export const generateWAMessageContent = async (message, options) => {
398
360
  m.templateButtonReplyMessage = {
399
361
  selectedDisplayText: message.buttonReply.displayText,
400
362
  selectedId: message.buttonReply.id,
401
- selectedIndex: message.buttonReply.index
363
+ selectedIndex: message.buttonReply.index,
402
364
  };
403
365
  break;
404
366
  case 'plain':
405
367
  m.buttonsResponseMessage = {
406
368
  selectedButtonId: message.buttonReply.id,
407
369
  selectedDisplayText: message.buttonReply.displayText,
408
- type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
370
+ type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
409
371
  };
410
372
  break;
411
373
  }
412
374
  }
413
- else if ('ptv' in message && message.ptv) {
414
- const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
415
- m.ptvMessage = videoMessage;
416
- }
417
375
  else if ('product' in message) {
418
- const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
419
- m.productMessage = WAProto.Message.ProductMessage.create({
376
+ const { imageMessage } = await (0, exports.prepareWAMessageMedia)({ image: message.product.productImage }, options);
377
+ m.productMessage = Types_1.WAProto.Message.ProductMessage.fromObject({
420
378
  ...message,
421
379
  product: {
422
380
  ...message.product,
423
- productImage: imageMessage
381
+ productImage: imageMessage,
424
382
  }
425
383
  });
426
384
  }
427
385
  else if ('listReply' in message) {
428
386
  m.listResponseMessage = { ...message.listReply };
429
387
  }
430
- else if ('event' in message) {
431
- m.eventMessage = {};
432
- const startTime = Math.floor(message.event.startDate.getTime() / 1000);
433
- if (message.event.call && options.getCallLink) {
434
- const token = await options.getCallLink(message.event.call, { startTime });
435
- m.eventMessage.joinLink = (message.event.call === 'audio' ? CALL_AUDIO_PREFIX : CALL_VIDEO_PREFIX) + token;
436
- }
437
- m.messageContextInfo = {
438
- // encKey
439
- messageSecret: message.event.messageSecret || randomBytes(32)
440
- };
441
- m.eventMessage.name = message.event.name;
442
- m.eventMessage.description = message.event.description;
443
- m.eventMessage.startTime = startTime;
444
- m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
445
- m.eventMessage.isCanceled = message.event.isCancelled ?? false;
446
- m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
447
- m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
448
- m.eventMessage.location = message.event.location;
449
- }
450
388
  else if ('poll' in message) {
451
- (_a = message.poll).selectableCount || (_a.selectableCount = 0);
452
- (_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
389
+ (_b = message.poll).selectableCount || (_b.selectableCount = 0);
453
390
  if (!Array.isArray(message.poll.values)) {
454
- throw new Boom('Invalid poll values', { statusCode: 400 });
391
+ throw new boom_1.Boom('Invalid poll values', { statusCode: 400 });
455
392
  }
456
- if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
457
- throw new Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
458
- statusCode: 400
459
- });
393
+ if (message.poll.selectableCount < 0
394
+ || message.poll.selectableCount > message.poll.values.length) {
395
+ throw new boom_1.Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, { statusCode: 400 });
460
396
  }
461
397
  m.messageContextInfo = {
462
398
  // encKey
463
- messageSecret: message.poll.messageSecret || randomBytes(32)
399
+ messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
464
400
  };
465
- const pollCreationMessage = {
401
+ m.pollCreationMessage = {
466
402
  name: message.poll.name,
467
403
  selectableOptionsCount: message.poll.selectableCount,
468
- options: message.poll.values.map(optionName => ({ optionName }))
404
+ options: message.poll.values.map(optionName => ({ optionName })),
469
405
  };
470
- if (message.poll.toAnnouncementGroup) {
471
- // poll v2 is for community announcement groups (single select and multiple)
472
- m.pollCreationMessageV2 = pollCreationMessage;
473
- }
474
- else {
475
- if (message.poll.selectableCount === 1) {
476
- //poll v3 is for single select polls
477
- m.pollCreationMessageV3 = pollCreationMessage;
478
- }
479
- else {
480
- // poll for multiple choice polls
481
- m.pollCreationMessage = pollCreationMessage;
482
- }
483
- }
484
406
  }
485
407
  else if ('sharePhoneNumber' in message) {
486
408
  m.protocolMessage = {
487
- type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
409
+ type: WAProto_1.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
488
410
  };
489
411
  }
490
412
  else if ('requestPhoneNumber' in message) {
491
413
  m.requestPhoneNumberMessage = {};
492
414
  }
493
- else if ('limitSharing' in message) {
494
- m.protocolMessage = {
495
- type: proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
496
- limitSharing: {
497
- sharingLimited: message.limitSharing === true,
498
- trigger: 1,
499
- limitSharingSettingTimestamp: Date.now(),
500
- initiatedByMe: true
501
- }
502
- };
503
- }
504
415
  else {
505
- m = await prepareWAMessageMedia(message, options);
416
+ m = await (0, exports.prepareWAMessageMedia)(message, options);
506
417
  }
507
418
  if ('buttons' in message && !!message.buttons) {
508
419
  const buttonsMessage = {
509
- buttons: message.buttons.map(b => ({ ...b, type: proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
420
+ buttons: message.buttons.map(b => ({ ...b, type: WAProto_1.proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
510
421
  };
511
422
  if ('text' in message) {
512
423
  buttonsMessage.contentText = message.text;
@@ -555,24 +466,17 @@ export const generateWAMessageContent = async (message, options) => {
555
466
  title: message.title,
556
467
  footerText: message.footer,
557
468
  description: message.text,
558
- listType: proto.Message.ListMessage.ListType.SINGLE_SELECT
469
+ listType: WAProto_1.proto.Message.ListMessage.ListType.SINGLE_SELECT
559
470
  };
560
471
  m = { listMessage };
561
472
  }
562
473
  if ('viewOnce' in message && !!message.viewOnce) {
563
474
  m = { viewOnceMessage: { message: m } };
564
475
  }
565
- if ('mentions' in message && message.mentions?.length) {
566
- const messageType = Object.keys(m)[0];
567
- const key = m[messageType];
568
- if ('contextInfo' in key && !!key.contextInfo) {
569
- key.contextInfo.mentionedJid = message.mentions;
570
- }
571
- else if (key) {
572
- key.contextInfo = {
573
- mentionedJid: message.mentions
574
- };
575
- }
476
+ if ('mentions' in message && ((_a = message.mentions) === null || _a === void 0 ? void 0 : _a.length)) {
477
+ const [messageType] = Object.keys(m);
478
+ m[messageType].contextInfo = m[messageType] || {};
479
+ m[messageType].contextInfo.mentionedJid = message.mentions;
576
480
  }
577
481
  if ('edit' in message) {
578
482
  m = {
@@ -580,46 +484,40 @@ export const generateWAMessageContent = async (message, options) => {
580
484
  key: message.edit,
581
485
  editedMessage: m,
582
486
  timestampMs: Date.now(),
583
- type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
487
+ type: Types_1.WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
584
488
  }
585
489
  };
586
490
  }
587
491
  if ('contextInfo' in message && !!message.contextInfo) {
588
- const messageType = Object.keys(m)[0];
589
- const key = m[messageType];
590
- if ('contextInfo' in key && !!key.contextInfo) {
591
- key.contextInfo = { ...key.contextInfo, ...message.contextInfo };
592
- }
593
- else if (key) {
594
- key.contextInfo = message.contextInfo;
595
- }
492
+ const [messageType] = Object.keys(m);
493
+ m[messageType] = m[messageType] || {};
494
+ m[messageType].contextInfo = message.contextInfo;
596
495
  }
597
- return WAProto.Message.create(m);
496
+ return Types_1.WAProto.Message.fromObject(m);
598
497
  };
599
- export const generateWAMessageFromContent = (jid, message, options) => {
498
+ exports.generateWAMessageContent = generateWAMessageContent;
499
+ const generateWAMessageFromContent = (jid, message, options) => {
600
500
  // set timestamp to now
601
501
  // if not specified
602
502
  if (!options.timestamp) {
603
503
  options.timestamp = new Date();
604
504
  }
605
- const innerMessage = normalizeMessageContent(message);
606
- const key = getContentType(innerMessage);
607
- const timestamp = unixTimestampSeconds(options.timestamp);
505
+ const innerMessage = (0, exports.normalizeMessageContent)(message);
506
+ const key = (0, exports.getContentType)(innerMessage);
507
+ const timestamp = (0, generics_1.unixTimestampSeconds)(options.timestamp);
608
508
  const { quoted, userJid } = options;
609
- if (quoted && !isJidNewsletter(jid)) {
610
- const participant = quoted.key.fromMe
611
- ? userJid // TODO: Add support for LIDs
612
- : quoted.participant || quoted.key.participant || quoted.key.remoteJid;
613
- let quotedMsg = normalizeMessageContent(quoted.message);
614
- const msgType = getContentType(quotedMsg);
509
+ if (quoted && !(0, WABinary_1.isJidNewsLetter)(jid)) {
510
+ const participant = quoted.key.fromMe ? userJid : (quoted.participant || quoted.key.participant || quoted.key.remoteJid);
511
+ let quotedMsg = (0, exports.normalizeMessageContent)(quoted.message);
512
+ const msgType = (0, exports.getContentType)(quotedMsg);
615
513
  // strip any redundant properties
616
- quotedMsg = proto.Message.create({ [msgType]: quotedMsg[msgType] });
514
+ quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
617
515
  const quotedContent = quotedMsg[msgType];
618
516
  if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
619
517
  delete quotedContent.contextInfo;
620
518
  }
621
- const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
622
- contextInfo.participant = jidNormalizedUser(participant);
519
+ const contextInfo = innerMessage[key].contextInfo || {};
520
+ contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
623
521
  contextInfo.stanzaId = quoted.key.id;
624
522
  contextInfo.quotedMessage = quotedMsg;
625
523
  // if a participant is quoted, then it must be a group
@@ -627,63 +525,62 @@ export const generateWAMessageFromContent = (jid, message, options) => {
627
525
  if (jid !== quoted.key.remoteJid) {
628
526
  contextInfo.remoteJid = quoted.key.remoteJid;
629
527
  }
630
- if (contextInfo && innerMessage[key]) {
631
- /* @ts-ignore */
632
- innerMessage[key].contextInfo = contextInfo;
633
- }
528
+ innerMessage[key].contextInfo = contextInfo;
634
529
  }
635
530
  if (
636
531
  // if we want to send a disappearing message
637
- !!options?.ephemeralExpiration &&
532
+ !!(options === null || options === void 0 ? void 0 : options.ephemeralExpiration) &&
638
533
  // and it's not a protocol message -- delete, toggle disappear message
639
534
  key !== 'protocolMessage' &&
640
535
  // already not converted to disappearing message
641
536
  key !== 'ephemeralMessage' &&
642
- // newsletters don't support ephemeral messages
643
- !isJidNewsletter(jid)) {
644
- /* @ts-ignore */
537
+ // newsletter not accept disappearing messages
538
+ !(0, WABinary_1.isJidNewsLetter)(jid)) {
645
539
  innerMessage[key].contextInfo = {
646
540
  ...(innerMessage[key].contextInfo || {}),
647
- expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
541
+ expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
648
542
  //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
649
543
  };
650
544
  }
651
- message = WAProto.Message.create(message);
545
+ message = Types_1.WAProto.Message.fromObject(message);
652
546
  const messageJSON = {
653
547
  key: {
654
548
  remoteJid: jid,
655
549
  fromMe: true,
656
- id: options?.messageId || generateMessageIDV2()
550
+ id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageID)(),
657
551
  },
658
552
  message: message,
659
553
  messageTimestamp: timestamp,
660
554
  messageStubParameters: [],
661
- participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined, // TODO: Add support for LIDs
662
- status: WAMessageStatus.PENDING
555
+ participant: (0, WABinary_1.isJidGroup)(jid) || (0, WABinary_1.isJidStatusBroadcast)(jid) ? userJid : undefined,
556
+ status: Types_1.WAMessageStatus.PENDING
663
557
  };
664
- return WAProto.WebMessageInfo.fromObject(messageJSON);
558
+ return Types_1.WAProto.WebMessageInfo.fromObject(messageJSON);
665
559
  };
666
- export const generateWAMessage = async (jid, content, options) => {
560
+ exports.generateWAMessageFromContent = generateWAMessageFromContent;
561
+ const generateWAMessage = async (jid, content, options) => {
562
+ var _a;
667
563
  // ensure msg ID is with every log
668
- options.logger = options?.logger?.child({ msgId: options.messageId });
669
- // Pass jid in the options to generateWAMessageContent
670
- return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { ...options, jid }), options);
564
+ options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
565
+ return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsLetter)(jid), ...options }), options);
671
566
  };
567
+ exports.generateWAMessage = generateWAMessage;
672
568
  /** Get the key to access the true type of content */
673
- export const getContentType = (content) => {
569
+ const getContentType = (content) => {
674
570
  if (content) {
675
571
  const keys = Object.keys(content);
676
572
  const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
677
573
  return key;
678
574
  }
679
575
  };
576
+ exports.getContentType = getContentType;
680
577
  /**
681
578
  * Normalizes ephemeral, view once messages to regular message content
682
579
  * Eg. image messages in ephemeral messages, in view once messages etc.
683
580
  * @param content
684
581
  * @returns
685
582
  */
686
- export const normalizeMessageContent = (content) => {
583
+ const normalizeMessageContent = (content) => {
687
584
  if (!content) {
688
585
  return undefined;
689
586
  }
@@ -697,19 +594,21 @@ export const normalizeMessageContent = (content) => {
697
594
  }
698
595
  return content;
699
596
  function getFutureProofMessage(message) {
700
- return (message?.ephemeralMessage ||
701
- message?.viewOnceMessage ||
702
- message?.documentWithCaptionMessage ||
703
- message?.viewOnceMessageV2 ||
704
- message?.viewOnceMessageV2Extension ||
705
- message?.editedMessage);
597
+ return ((message === null || message === void 0 ? void 0 : message.ephemeralMessage)
598
+ || (message === null || message === void 0 ? void 0 : message.viewOnceMessage)
599
+ || (message === null || message === void 0 ? void 0 : message.documentWithCaptionMessage)
600
+ || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2)
601
+ || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension)
602
+ || (message === null || message === void 0 ? void 0 : message.editedMessage));
706
603
  }
707
604
  };
605
+ exports.normalizeMessageContent = normalizeMessageContent;
708
606
  /**
709
607
  * Extract the true message content from a message
710
608
  * Eg. extracts the inner message from a disappearing message/view once message
711
609
  */
712
- export const extractMessageContent = (content) => {
610
+ const extractMessageContent = (content) => {
611
+ var _a, _b, _c, _d, _e, _f;
713
612
  const extractFromTemplateMessage = (msg) => {
714
613
  if (msg.imageMessage) {
715
614
  return { imageMessage: msg.imageMessage };
@@ -725,39 +624,35 @@ export const extractMessageContent = (content) => {
725
624
  }
726
625
  else {
727
626
  return {
728
- conversation: 'contentText' in msg ? msg.contentText : 'hydratedContentText' in msg ? msg.hydratedContentText : ''
627
+ conversation: 'contentText' in msg
628
+ ? msg.contentText
629
+ : ('hydratedContentText' in msg ? msg.hydratedContentText : '')
729
630
  };
730
631
  }
731
632
  };
732
- content = normalizeMessageContent(content);
733
- if (content?.buttonsMessage) {
633
+ content = (0, exports.normalizeMessageContent)(content);
634
+ if (content === null || content === void 0 ? void 0 : content.buttonsMessage) {
734
635
  return extractFromTemplateMessage(content.buttonsMessage);
735
636
  }
736
- if (content?.templateMessage?.hydratedFourRowTemplate) {
737
- return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
637
+ if ((_a = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _a === void 0 ? void 0 : _a.hydratedFourRowTemplate) {
638
+ return extractFromTemplateMessage((_b = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _b === void 0 ? void 0 : _b.hydratedFourRowTemplate);
738
639
  }
739
- if (content?.templateMessage?.hydratedTemplate) {
740
- return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
640
+ if ((_c = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _c === void 0 ? void 0 : _c.hydratedTemplate) {
641
+ return extractFromTemplateMessage((_d = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _d === void 0 ? void 0 : _d.hydratedTemplate);
741
642
  }
742
- if (content?.templateMessage?.fourRowTemplate) {
743
- return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
643
+ if ((_e = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _e === void 0 ? void 0 : _e.fourRowTemplate) {
644
+ return extractFromTemplateMessage((_f = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _f === void 0 ? void 0 : _f.fourRowTemplate);
744
645
  }
745
646
  return content;
746
647
  };
648
+ exports.extractMessageContent = extractMessageContent;
747
649
  /**
748
650
  * Returns the device predicted by message ID
749
651
  */
750
- export const getDevice = (id) => /^3A.{18}$/.test(id)
751
- ? 'ios'
752
- : /^3E.{20}$/.test(id)
753
- ? 'web'
754
- : /^(.{21}|.{32})$/.test(id)
755
- ? 'android'
756
- : /^(3F|.{18}$)/.test(id)
757
- ? 'desktop'
758
- : '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';
653
+ exports.getDevice = getDevice;
759
654
  /** Upserts a receipt in the message */
760
- export const updateMessageWithReceipt = (msg, receipt) => {
655
+ const updateMessageWithReceipt = (msg, receipt) => {
761
656
  msg.userReceipt = msg.userReceipt || [];
762
657
  const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
763
658
  if (recp) {
@@ -767,36 +662,41 @@ export const updateMessageWithReceipt = (msg, receipt) => {
767
662
  msg.userReceipt.push(receipt);
768
663
  }
769
664
  };
665
+ exports.updateMessageWithReceipt = updateMessageWithReceipt;
770
666
  /** Update the message with a new reaction */
771
- export const updateMessageWithReaction = (msg, reaction) => {
772
- const authorID = getKeyAuthor(reaction.key);
773
- const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
774
- reaction.text = reaction.text || '';
775
- reactions.push(reaction);
667
+ const updateMessageWithReaction = (msg, reaction) => {
668
+ const authorID = (0, generics_1.getKeyAuthor)(reaction.key);
669
+ const reactions = (msg.reactions || [])
670
+ .filter(r => (0, generics_1.getKeyAuthor)(r.key) !== authorID);
671
+ if (reaction.text) {
672
+ reactions.push(reaction);
673
+ }
776
674
  msg.reactions = reactions;
777
675
  };
676
+ exports.updateMessageWithReaction = updateMessageWithReaction;
778
677
  /** Update the message with a new poll update */
779
- export const updateMessageWithPollUpdate = (msg, update) => {
780
- const authorID = getKeyAuthor(update.pollUpdateMessageKey);
781
- const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
782
- if (update.vote?.selectedOptions?.length) {
678
+ const updateMessageWithPollUpdate = (msg, update) => {
679
+ var _a, _b;
680
+ const authorID = (0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey);
681
+ const reactions = (msg.pollUpdates || [])
682
+ .filter(r => (0, generics_1.getKeyAuthor)(r.pollUpdateMessageKey) !== authorID);
683
+ if ((_b = (_a = update.vote) === null || _a === void 0 ? void 0 : _a.selectedOptions) === null || _b === void 0 ? void 0 : _b.length) {
783
684
  reactions.push(update);
784
685
  }
785
686
  msg.pollUpdates = reactions;
786
687
  };
688
+ exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
787
689
  /**
788
690
  * Aggregates all poll updates in a poll.
789
691
  * @param msg the poll creation message
790
692
  * @param meId your jid
791
693
  * @returns A list of options & their voters
792
694
  */
793
- export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
794
- const opts = message?.pollCreationMessage?.options ||
795
- message?.pollCreationMessageV2?.options ||
796
- message?.pollCreationMessageV3?.options ||
797
- [];
695
+ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
696
+ var _a, _b, _c;
697
+ const opts = ((_a = message === null || message === void 0 ? void 0 : message.pollCreationMessage) === null || _a === void 0 ? void 0 : _a.options) || ((_b = message === null || message === void 0 ? void 0 : message.pollCreationMessageV2) === null || _b === void 0 ? void 0 : _b.options) || ((_c = message === null || message === void 0 ? void 0 : message.pollCreationMessageV3) === null || _c === void 0 ? void 0 : _c.options) || [];
798
698
  const voteHashMap = opts.reduce((acc, opt) => {
799
- const hash = sha256(Buffer.from(opt.optionName || '')).toString();
699
+ const hash = (0, crypto_2.sha256)(Buffer.from(opt.optionName || '')).toString();
800
700
  acc[hash] = {
801
701
  name: opt.optionName || '',
802
702
  voters: []
@@ -818,13 +718,14 @@ export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
818
718
  };
819
719
  data = voteHashMap[hash];
820
720
  }
821
- voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
721
+ voteHashMap[hash].voters.push((0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey, meId));
822
722
  }
823
723
  }
824
724
  return Object.values(voteHashMap);
825
725
  }
726
+ exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
826
727
  /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
827
- export const aggregateMessageKeysNotFromMe = (keys) => {
728
+ const aggregateMessageKeysNotFromMe = (keys) => {
828
729
  const keyMap = {};
829
730
  for (const { remoteJid, id, participant, fromMe } of keys) {
830
731
  if (!fromMe) {
@@ -841,34 +742,40 @@ export const aggregateMessageKeysNotFromMe = (keys) => {
841
742
  }
842
743
  return Object.values(keyMap);
843
744
  };
745
+ exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
844
746
  const REUPLOAD_REQUIRED_STATUS = [410, 404];
845
747
  /**
846
748
  * Downloads the given message. Throws an error if it's not a media message
847
749
  */
848
- export const downloadMediaMessage = async (message, type, options, ctx) => {
849
- const result = await downloadMsg().catch(async (error) => {
850
- if (ctx &&
851
- typeof error?.status === 'number' && // treat errors with status as HTTP failures requiring reupload
852
- REUPLOAD_REQUIRED_STATUS.includes(error.status)) {
853
- ctx.logger.info({ key: message.key }, 'sending reupload media request...');
854
- // request reupload
855
- message = await ctx.reuploadRequest(message);
856
- const result = await downloadMsg();
857
- return result;
750
+ const downloadMediaMessage = async (message, type, options, ctx) => {
751
+ const result = await downloadMsg()
752
+ .catch(async (error) => {
753
+ var _a;
754
+ if (ctx) {
755
+ if (axios_1.default.isAxiosError(error)) {
756
+ // check if the message requires a reupload
757
+ if (REUPLOAD_REQUIRED_STATUS.includes((_a = error.response) === null || _a === void 0 ? void 0 : _a.status)) {
758
+ ctx.logger.info({ key: message.key }, 'sending reupload media request...');
759
+ // request reupload
760
+ message = await ctx.reuploadRequest(message);
761
+ const result = await downloadMsg();
762
+ return result;
763
+ }
764
+ }
858
765
  }
859
766
  throw error;
860
767
  });
861
768
  return result;
862
769
  async function downloadMsg() {
863
- const mContent = extractMessageContent(message.message);
770
+ const mContent = (0, exports.extractMessageContent)(message.message);
864
771
  if (!mContent) {
865
- throw new Boom('No message present', { statusCode: 400, data: message });
772
+ throw new boom_1.Boom('No message present', { statusCode: 400, data: message });
866
773
  }
867
- const contentType = getContentType(mContent);
868
- let mediaType = contentType?.replace('Message', '');
774
+ const contentType = (0, exports.getContentType)(mContent);
775
+ let mediaType = contentType === null || contentType === void 0 ? void 0 : contentType.replace('Message', '');
869
776
  const media = mContent[contentType];
870
777
  if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
871
- throw new Boom(`"${contentType}" message is not a media message`);
778
+ throw new boom_1.Boom(`"${contentType}" message is not a media message`);
872
779
  }
873
780
  let download;
874
781
  if ('thumbnailDirectPath' in media && !('url' in media)) {
@@ -881,7 +788,7 @@ export const downloadMediaMessage = async (message, type, options, ctx) => {
881
788
  else {
882
789
  download = media;
883
790
  }
884
- const stream = await downloadContentFromMessage(download, mediaType, options);
791
+ const stream = await (0, messages_media_1.downloadContentFromMessage)(download, mediaType, options);
885
792
  if (type === 'buffer') {
886
793
  const bufferArray = [];
887
794
  for await (const chunk of stream) {
@@ -892,16 +799,18 @@ export const downloadMediaMessage = async (message, type, options, ctx) => {
892
799
  return stream;
893
800
  }
894
801
  };
895
-
896
- export const assertMediaContent = (content) => {
897
- content = extractMessageContent(content);
898
- const mediaContent = content?.documentMessage ||
899
- content?.imageMessage ||
900
- content?.videoMessage ||
901
- content?.audioMessage ||
902
- content?.stickerMessage;
802
+ exports.downloadMediaMessage = downloadMediaMessage;
803
+ /** Checks whether the given message is a media message; if it is returns the inner content */
804
+ const assertMediaContent = (content) => {
805
+ content = (0, exports.extractMessageContent)(content);
806
+ const mediaContent = (content === null || content === void 0 ? void 0 : content.documentMessage)
807
+ || (content === null || content === void 0 ? void 0 : content.imageMessage)
808
+ || (content === null || content === void 0 ? void 0 : content.videoMessage)
809
+ || (content === null || content === void 0 ? void 0 : content.audioMessage)
810
+ || (content === null || content === void 0 ? void 0 : content.stickerMessage);
903
811
  if (!mediaContent) {
904
- throw new Boom('given message is not a media message', { statusCode: 400, data: content });
812
+ throw new boom_1.Boom('given message is not a media message', { statusCode: 400, data: content });
905
813
  }
906
814
  return mediaContent;
907
- };
815
+ };
816
+ exports.assertMediaContent = assertMediaContent;