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