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