supunmd-bail 2.1.1 → 2.1.3

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