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