@skyzopedia/baileys-mod 5.0.8 → 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.
Files changed (212) 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 +447 -706
  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 +650 -777
  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 +263 -362
  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/Client/websocket.js.bak +0 -53
  205. package/lib/Socket/communities.js +0 -413
  206. package/lib/Socket/mex.js +0 -45
  207. package/lib/Types/Bussines.js +0 -3
  208. package/lib/Types/Newsletter.js.bak +0 -33
  209. package/lib/Utils/browser-utils.js +0 -25
  210. package/lib/Utils/message-retry-manager.js +0 -113
  211. package/lib/Utils/messages.js.bak +0 -907
  212. 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 ? {
@@ -95,9 +105,9 @@ export const prepareWAMessageMedia = async (message, options) => {
95
105
  }
96
106
  ],
97
107
  newsletter: {
98
- newsletterJid: "120363422054951473@newsletter",
108
+ newsletterJid: "120363420249672073@newsletter",
99
109
  serverMessageId: 0,
100
- newsletterName: "skyzopedia",
110
+ newsletterName: "kyuu ilysm",
101
111
  contentType: "UPDATE",
102
112
  }
103
113
  }
@@ -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,76 +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);
358
- }
359
- else if ('album' in message) {
360
- const imageMessages = message.album.filter(item => 'image' in item);
361
- const videoMessages = message.album.filter(item => 'video' in item);
362
- m.albumMessage = proto.Message.AlbumMessage.fromObject({
363
- expectedImageCount: imageMessages.length,
364
- expectedVideoCount: videoMessages.length,
365
- });
349
+ m = (0, exports.generateForwardMessageContent)(message.forward, message.force);
366
350
  }
367
351
  else if ('disappearingMessagesInChat' in message) {
368
- const exp = typeof message.disappearingMessagesInChat === 'boolean'
369
- ? message.disappearingMessagesInChat
370
- ? WA_DEFAULT_EPHEMERAL
371
- : 0
372
- : message.disappearingMessagesInChat;
373
- m = prepareDisappearingMessageSettingContent(exp);
374
- }
375
- else if ('groupInvite' in message) {
376
- m.groupInviteMessage = {};
377
- m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
378
- m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
379
- m.groupInviteMessage.caption = message.groupInvite.text;
380
- m.groupInviteMessage.groupJid = message.groupInvite.jid;
381
- m.groupInviteMessage.groupName = message.groupInvite.subject;
382
- //TODO: use built-in interface and get disappearing mode info etc.
383
- //TODO: cache / use store!?
384
- if (options.getProfilePicUrl) {
385
- const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
386
- if (pfpUrl) {
387
- const resp = await fetch(pfpUrl, { method: 'GET', dispatcher: options?.options?.dispatcher });
388
- if (resp.ok) {
389
- const buf = Buffer.from(await resp.arrayBuffer());
390
- m.groupInviteMessage.jpegThumbnail = buf;
391
- }
392
- }
393
- }
394
- }
395
- else if ('pin' in message) {
396
- m.pinInChatMessage = {};
397
- m.messageContextInfo = {};
398
- m.pinInChatMessage.key = message.pin;
399
- m.pinInChatMessage.type = message.type;
400
- m.pinInChatMessage.senderTimestampMs = Date.now();
401
- 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);
402
356
  }
403
357
  else if ('buttonReply' in message) {
404
358
  switch (message.type) {
@@ -406,115 +360,64 @@ export const generateWAMessageContent = async (message, options) => {
406
360
  m.templateButtonReplyMessage = {
407
361
  selectedDisplayText: message.buttonReply.displayText,
408
362
  selectedId: message.buttonReply.id,
409
- selectedIndex: message.buttonReply.index
363
+ selectedIndex: message.buttonReply.index,
410
364
  };
411
365
  break;
412
366
  case 'plain':
413
367
  m.buttonsResponseMessage = {
414
368
  selectedButtonId: message.buttonReply.id,
415
369
  selectedDisplayText: message.buttonReply.displayText,
416
- type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
370
+ type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
417
371
  };
418
372
  break;
419
373
  }
420
374
  }
421
- else if ('ptv' in message && message.ptv) {
422
- const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
423
- m.ptvMessage = videoMessage;
424
- }
425
375
  else if ('product' in message) {
426
- const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
427
- 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({
428
378
  ...message,
429
379
  product: {
430
380
  ...message.product,
431
- productImage: imageMessage
381
+ productImage: imageMessage,
432
382
  }
433
383
  });
434
384
  }
435
385
  else if ('listReply' in message) {
436
386
  m.listResponseMessage = { ...message.listReply };
437
387
  }
438
- else if ('event' in message) {
439
- m.eventMessage = {};
440
- const startTime = Math.floor(message.event.startDate.getTime() / 1000);
441
- if (message.event.call && options.getCallLink) {
442
- const token = await options.getCallLink(message.event.call, { startTime });
443
- m.eventMessage.joinLink = (message.event.call === 'audio' ? CALL_AUDIO_PREFIX : CALL_VIDEO_PREFIX) + token;
444
- }
445
- m.messageContextInfo = {
446
- // encKey
447
- messageSecret: message.event.messageSecret || randomBytes(32)
448
- };
449
- m.eventMessage.name = message.event.name;
450
- m.eventMessage.description = message.event.description;
451
- m.eventMessage.startTime = startTime;
452
- m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
453
- m.eventMessage.isCanceled = message.event.isCancelled ?? false;
454
- m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
455
- m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
456
- m.eventMessage.location = message.event.location;
457
- }
458
388
  else if ('poll' in message) {
459
- (_a = message.poll).selectableCount || (_a.selectableCount = 0);
460
- (_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
389
+ (_b = message.poll).selectableCount || (_b.selectableCount = 0);
461
390
  if (!Array.isArray(message.poll.values)) {
462
- throw new Boom('Invalid poll values', { statusCode: 400 });
391
+ throw new boom_1.Boom('Invalid poll values', { statusCode: 400 });
463
392
  }
464
- if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
465
- throw new Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
466
- statusCode: 400
467
- });
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 });
468
396
  }
469
397
  m.messageContextInfo = {
470
398
  // encKey
471
- messageSecret: message.poll.messageSecret || randomBytes(32)
399
+ messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
472
400
  };
473
- const pollCreationMessage = {
401
+ m.pollCreationMessage = {
474
402
  name: message.poll.name,
475
403
  selectableOptionsCount: message.poll.selectableCount,
476
- options: message.poll.values.map(optionName => ({ optionName }))
404
+ options: message.poll.values.map(optionName => ({ optionName })),
477
405
  };
478
- if (message.poll.toAnnouncementGroup) {
479
- // poll v2 is for community announcement groups (single select and multiple)
480
- m.pollCreationMessageV2 = pollCreationMessage;
481
- }
482
- else {
483
- if (message.poll.selectableCount === 1) {
484
- //poll v3 is for single select polls
485
- m.pollCreationMessageV3 = pollCreationMessage;
486
- }
487
- else {
488
- // poll for multiple choice polls
489
- m.pollCreationMessage = pollCreationMessage;
490
- }
491
- }
492
406
  }
493
407
  else if ('sharePhoneNumber' in message) {
494
408
  m.protocolMessage = {
495
- type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
409
+ type: WAProto_1.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
496
410
  };
497
411
  }
498
412
  else if ('requestPhoneNumber' in message) {
499
413
  m.requestPhoneNumberMessage = {};
500
414
  }
501
- else if ('limitSharing' in message) {
502
- m.protocolMessage = {
503
- type: proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
504
- limitSharing: {
505
- sharingLimited: message.limitSharing === true,
506
- trigger: 1,
507
- limitSharingSettingTimestamp: Date.now(),
508
- initiatedByMe: true
509
- }
510
- };
511
- }
512
415
  else {
513
- m = await prepareWAMessageMedia(message, options);
416
+ m = await (0, exports.prepareWAMessageMedia)(message, options);
514
417
  }
515
418
  if ('buttons' in message && !!message.buttons) {
516
419
  const buttonsMessage = {
517
- 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 }))
518
421
  };
519
422
  if ('text' in message) {
520
423
  buttonsMessage.contentText = message.text;
@@ -563,24 +466,17 @@ export const generateWAMessageContent = async (message, options) => {
563
466
  title: message.title,
564
467
  footerText: message.footer,
565
468
  description: message.text,
566
- listType: proto.Message.ListMessage.ListType.SINGLE_SELECT
469
+ listType: WAProto_1.proto.Message.ListMessage.ListType.SINGLE_SELECT
567
470
  };
568
471
  m = { listMessage };
569
472
  }
570
473
  if ('viewOnce' in message && !!message.viewOnce) {
571
474
  m = { viewOnceMessage: { message: m } };
572
475
  }
573
- if ('mentions' in message && message.mentions?.length) {
574
- const messageType = Object.keys(m)[0];
575
- const key = m[messageType];
576
- if ('contextInfo' in key && !!key.contextInfo) {
577
- key.contextInfo.mentionedJid = message.mentions;
578
- }
579
- else if (key) {
580
- key.contextInfo = {
581
- mentionedJid: message.mentions
582
- };
583
- }
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;
584
480
  }
585
481
  if ('edit' in message) {
586
482
  m = {
@@ -588,46 +484,40 @@ export const generateWAMessageContent = async (message, options) => {
588
484
  key: message.edit,
589
485
  editedMessage: m,
590
486
  timestampMs: Date.now(),
591
- type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
487
+ type: Types_1.WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
592
488
  }
593
489
  };
594
490
  }
595
491
  if ('contextInfo' in message && !!message.contextInfo) {
596
- const messageType = Object.keys(m)[0];
597
- const key = m[messageType];
598
- if ('contextInfo' in key && !!key.contextInfo) {
599
- key.contextInfo = { ...key.contextInfo, ...message.contextInfo };
600
- }
601
- else if (key) {
602
- key.contextInfo = message.contextInfo;
603
- }
492
+ const [messageType] = Object.keys(m);
493
+ m[messageType] = m[messageType] || {};
494
+ m[messageType].contextInfo = message.contextInfo;
604
495
  }
605
- return WAProto.Message.create(m);
496
+ return Types_1.WAProto.Message.fromObject(m);
606
497
  };
607
- export const generateWAMessageFromContent = (jid, message, options) => {
498
+ exports.generateWAMessageContent = generateWAMessageContent;
499
+ const generateWAMessageFromContent = (jid, message, options) => {
608
500
  // set timestamp to now
609
501
  // if not specified
610
502
  if (!options.timestamp) {
611
503
  options.timestamp = new Date();
612
504
  }
613
- const innerMessage = normalizeMessageContent(message);
614
- const key = getContentType(innerMessage);
615
- 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);
616
508
  const { quoted, userJid } = options;
617
- if (quoted && !isJidNewsletter(jid)) {
618
- const participant = quoted.key.fromMe
619
- ? userJid // TODO: Add support for LIDs
620
- : quoted.participant || quoted.key.participant || quoted.key.remoteJid;
621
- let quotedMsg = normalizeMessageContent(quoted.message);
622
- 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);
623
513
  // strip any redundant properties
624
- quotedMsg = proto.Message.create({ [msgType]: quotedMsg[msgType] });
514
+ quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
625
515
  const quotedContent = quotedMsg[msgType];
626
516
  if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
627
517
  delete quotedContent.contextInfo;
628
518
  }
629
- const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
630
- contextInfo.participant = jidNormalizedUser(participant);
519
+ const contextInfo = innerMessage[key].contextInfo || {};
520
+ contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
631
521
  contextInfo.stanzaId = quoted.key.id;
632
522
  contextInfo.quotedMessage = quotedMsg;
633
523
  // if a participant is quoted, then it must be a group
@@ -635,63 +525,62 @@ export const generateWAMessageFromContent = (jid, message, options) => {
635
525
  if (jid !== quoted.key.remoteJid) {
636
526
  contextInfo.remoteJid = quoted.key.remoteJid;
637
527
  }
638
- if (contextInfo && innerMessage[key]) {
639
- /* @ts-ignore */
640
- innerMessage[key].contextInfo = contextInfo;
641
- }
528
+ innerMessage[key].contextInfo = contextInfo;
642
529
  }
643
530
  if (
644
531
  // if we want to send a disappearing message
645
- !!options?.ephemeralExpiration &&
532
+ !!(options === null || options === void 0 ? void 0 : options.ephemeralExpiration) &&
646
533
  // and it's not a protocol message -- delete, toggle disappear message
647
534
  key !== 'protocolMessage' &&
648
535
  // already not converted to disappearing message
649
536
  key !== 'ephemeralMessage' &&
650
- // newsletters don't support ephemeral messages
651
- !isJidNewsletter(jid)) {
652
- /* @ts-ignore */
537
+ // newsletter not accept disappearing messages
538
+ !(0, WABinary_1.isJidNewsLetter)(jid)) {
653
539
  innerMessage[key].contextInfo = {
654
540
  ...(innerMessage[key].contextInfo || {}),
655
- expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
541
+ expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
656
542
  //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
657
543
  };
658
544
  }
659
- message = WAProto.Message.create(message);
545
+ message = Types_1.WAProto.Message.fromObject(message);
660
546
  const messageJSON = {
661
547
  key: {
662
548
  remoteJid: jid,
663
549
  fromMe: true,
664
- id: options?.messageId || generateMessageIDV2()
550
+ id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageID)(),
665
551
  },
666
552
  message: message,
667
553
  messageTimestamp: timestamp,
668
554
  messageStubParameters: [],
669
- participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined, // TODO: Add support for LIDs
670
- status: WAMessageStatus.PENDING
555
+ participant: (0, WABinary_1.isJidGroup)(jid) || (0, WABinary_1.isJidStatusBroadcast)(jid) ? userJid : undefined,
556
+ status: Types_1.WAMessageStatus.PENDING
671
557
  };
672
- return WAProto.WebMessageInfo.fromObject(messageJSON);
558
+ return Types_1.WAProto.WebMessageInfo.fromObject(messageJSON);
673
559
  };
674
- export const generateWAMessage = async (jid, content, options) => {
560
+ exports.generateWAMessageFromContent = generateWAMessageFromContent;
561
+ const generateWAMessage = async (jid, content, options) => {
562
+ var _a;
675
563
  // ensure msg ID is with every log
676
- options.logger = options?.logger?.child({ msgId: options.messageId });
677
- // Pass jid in the options to generateWAMessageContent
678
- 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);
679
566
  };
567
+ exports.generateWAMessage = generateWAMessage;
680
568
  /** Get the key to access the true type of content */
681
- export const getContentType = (content) => {
569
+ const getContentType = (content) => {
682
570
  if (content) {
683
571
  const keys = Object.keys(content);
684
572
  const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
685
573
  return key;
686
574
  }
687
575
  };
576
+ exports.getContentType = getContentType;
688
577
  /**
689
578
  * Normalizes ephemeral, view once messages to regular message content
690
579
  * Eg. image messages in ephemeral messages, in view once messages etc.
691
580
  * @param content
692
581
  * @returns
693
582
  */
694
- export const normalizeMessageContent = (content) => {
583
+ const normalizeMessageContent = (content) => {
695
584
  if (!content) {
696
585
  return undefined;
697
586
  }
@@ -705,19 +594,21 @@ export const normalizeMessageContent = (content) => {
705
594
  }
706
595
  return content;
707
596
  function getFutureProofMessage(message) {
708
- return (message?.ephemeralMessage ||
709
- message?.viewOnceMessage ||
710
- message?.documentWithCaptionMessage ||
711
- message?.viewOnceMessageV2 ||
712
- message?.viewOnceMessageV2Extension ||
713
- 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));
714
603
  }
715
604
  };
605
+ exports.normalizeMessageContent = normalizeMessageContent;
716
606
  /**
717
607
  * Extract the true message content from a message
718
608
  * Eg. extracts the inner message from a disappearing message/view once message
719
609
  */
720
- export const extractMessageContent = (content) => {
610
+ const extractMessageContent = (content) => {
611
+ var _a, _b, _c, _d, _e, _f;
721
612
  const extractFromTemplateMessage = (msg) => {
722
613
  if (msg.imageMessage) {
723
614
  return { imageMessage: msg.imageMessage };
@@ -733,39 +624,35 @@ export const extractMessageContent = (content) => {
733
624
  }
734
625
  else {
735
626
  return {
736
- 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 : '')
737
630
  };
738
631
  }
739
632
  };
740
- content = normalizeMessageContent(content);
741
- if (content?.buttonsMessage) {
633
+ content = (0, exports.normalizeMessageContent)(content);
634
+ if (content === null || content === void 0 ? void 0 : content.buttonsMessage) {
742
635
  return extractFromTemplateMessage(content.buttonsMessage);
743
636
  }
744
- if (content?.templateMessage?.hydratedFourRowTemplate) {
745
- 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);
746
639
  }
747
- if (content?.templateMessage?.hydratedTemplate) {
748
- 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);
749
642
  }
750
- if (content?.templateMessage?.fourRowTemplate) {
751
- 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);
752
645
  }
753
646
  return content;
754
647
  };
648
+ exports.extractMessageContent = extractMessageContent;
755
649
  /**
756
650
  * Returns the device predicted by message ID
757
651
  */
758
- export const getDevice = (id) => /^3A.{18}$/.test(id)
759
- ? 'ios'
760
- : /^3E.{20}$/.test(id)
761
- ? 'web'
762
- : /^(.{21}|.{32})$/.test(id)
763
- ? 'android'
764
- : /^(3F|.{18}$)/.test(id)
765
- ? 'desktop'
766
- : '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;
767
654
  /** Upserts a receipt in the message */
768
- export const updateMessageWithReceipt = (msg, receipt) => {
655
+ const updateMessageWithReceipt = (msg, receipt) => {
769
656
  msg.userReceipt = msg.userReceipt || [];
770
657
  const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
771
658
  if (recp) {
@@ -775,36 +662,41 @@ export const updateMessageWithReceipt = (msg, receipt) => {
775
662
  msg.userReceipt.push(receipt);
776
663
  }
777
664
  };
665
+ exports.updateMessageWithReceipt = updateMessageWithReceipt;
778
666
  /** Update the message with a new reaction */
779
- export const updateMessageWithReaction = (msg, reaction) => {
780
- const authorID = getKeyAuthor(reaction.key);
781
- const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
782
- reaction.text = reaction.text || '';
783
- 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
+ }
784
674
  msg.reactions = reactions;
785
675
  };
676
+ exports.updateMessageWithReaction = updateMessageWithReaction;
786
677
  /** Update the message with a new poll update */
787
- export const updateMessageWithPollUpdate = (msg, update) => {
788
- const authorID = getKeyAuthor(update.pollUpdateMessageKey);
789
- const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
790
- 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) {
791
684
  reactions.push(update);
792
685
  }
793
686
  msg.pollUpdates = reactions;
794
687
  };
688
+ exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
795
689
  /**
796
690
  * Aggregates all poll updates in a poll.
797
691
  * @param msg the poll creation message
798
692
  * @param meId your jid
799
693
  * @returns A list of options & their voters
800
694
  */
801
- export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
802
- const opts = message?.pollCreationMessage?.options ||
803
- message?.pollCreationMessageV2?.options ||
804
- message?.pollCreationMessageV3?.options ||
805
- [];
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) || [];
806
698
  const voteHashMap = opts.reduce((acc, opt) => {
807
- const hash = sha256(Buffer.from(opt.optionName || '')).toString();
699
+ const hash = (0, crypto_2.sha256)(Buffer.from(opt.optionName || '')).toString();
808
700
  acc[hash] = {
809
701
  name: opt.optionName || '',
810
702
  voters: []
@@ -826,13 +718,14 @@ export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
826
718
  };
827
719
  data = voteHashMap[hash];
828
720
  }
829
- voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
721
+ voteHashMap[hash].voters.push((0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey, meId));
830
722
  }
831
723
  }
832
724
  return Object.values(voteHashMap);
833
725
  }
726
+ exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
834
727
  /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
835
- export const aggregateMessageKeysNotFromMe = (keys) => {
728
+ const aggregateMessageKeysNotFromMe = (keys) => {
836
729
  const keyMap = {};
837
730
  for (const { remoteJid, id, participant, fromMe } of keys) {
838
731
  if (!fromMe) {
@@ -849,34 +742,40 @@ export const aggregateMessageKeysNotFromMe = (keys) => {
849
742
  }
850
743
  return Object.values(keyMap);
851
744
  };
745
+ exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
852
746
  const REUPLOAD_REQUIRED_STATUS = [410, 404];
853
747
  /**
854
748
  * Downloads the given message. Throws an error if it's not a media message
855
749
  */
856
- export const downloadMediaMessage = async (message, type, options, ctx) => {
857
- const result = await downloadMsg().catch(async (error) => {
858
- if (ctx &&
859
- typeof error?.status === 'number' && // treat errors with status as HTTP failures requiring reupload
860
- REUPLOAD_REQUIRED_STATUS.includes(error.status)) {
861
- ctx.logger.info({ key: message.key }, 'sending reupload media request...');
862
- // request reupload
863
- message = await ctx.reuploadRequest(message);
864
- const result = await downloadMsg();
865
- 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
+ }
866
765
  }
867
766
  throw error;
868
767
  });
869
768
  return result;
870
769
  async function downloadMsg() {
871
- const mContent = extractMessageContent(message.message);
770
+ const mContent = (0, exports.extractMessageContent)(message.message);
872
771
  if (!mContent) {
873
- throw new Boom('No message present', { statusCode: 400, data: message });
772
+ throw new boom_1.Boom('No message present', { statusCode: 400, data: message });
874
773
  }
875
- const contentType = getContentType(mContent);
876
- 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', '');
877
776
  const media = mContent[contentType];
878
777
  if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
879
- throw new Boom(`"${contentType}" message is not a media message`);
778
+ throw new boom_1.Boom(`"${contentType}" message is not a media message`);
880
779
  }
881
780
  let download;
882
781
  if ('thumbnailDirectPath' in media && !('url' in media)) {
@@ -889,7 +788,7 @@ export const downloadMediaMessage = async (message, type, options, ctx) => {
889
788
  else {
890
789
  download = media;
891
790
  }
892
- const stream = await downloadContentFromMessage(download, mediaType, options);
791
+ const stream = await (0, messages_media_1.downloadContentFromMessage)(download, mediaType, options);
893
792
  if (type === 'buffer') {
894
793
  const bufferArray = [];
895
794
  for await (const chunk of stream) {
@@ -900,16 +799,18 @@ export const downloadMediaMessage = async (message, type, options, ctx) => {
900
799
  return stream;
901
800
  }
902
801
  };
903
-
904
- export const assertMediaContent = (content) => {
905
- content = extractMessageContent(content);
906
- const mediaContent = content?.documentMessage ||
907
- content?.imageMessage ||
908
- content?.videoMessage ||
909
- content?.audioMessage ||
910
- 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);
911
811
  if (!mediaContent) {
912
- 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 });
913
813
  }
914
814
  return mediaContent;
915
- };
815
+ };
816
+ exports.assertMediaContent = assertMediaContent;