@genuxofficial/baileys 1.0.0 → 2.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/LICENSE +1 -1
- package/README.md +5 -1
- package/WAProto/index.d.ts +19244 -2787
- package/WAProto/index.js +138202 -74217
- package/engine-requirements.js +10 -0
- package/lib/Defaults/baileys-version.json +1 -1
- package/lib/Defaults/index.d.ts +3 -5
- package/lib/Defaults/index.js +7 -6
- package/lib/Signal/libsignal.js +18 -9
- package/lib/Socket/Client/types.d.ts +0 -2
- package/lib/Socket/Client/websocket.js +1 -1
- package/lib/Socket/business.d.ts +65 -37
- package/lib/Socket/chats.d.ts +22 -18
- package/lib/Socket/chats.js +110 -6
- package/lib/Socket/groups.d.ts +30 -26
- package/lib/Socket/groups.js +20 -6
- package/lib/Socket/index.d.ts +66 -38
- package/lib/Socket/messages-recv.d.ts +63 -33
- package/lib/Socket/messages-recv.js +174 -27
- package/lib/Socket/messages-send.d.ts +55 -29
- package/lib/Socket/messages-send.js +190 -26
- package/lib/Socket/newsletter.d.ts +140 -0
- package/lib/Socket/newsletter.js +252 -0
- package/lib/Socket/socket.d.ts +8 -10
- package/lib/Socket/socket.js +26 -13
- package/lib/Socket/usync.d.ts +10 -12
- package/lib/Socket/usync.js +10 -15
- package/lib/Store/index.d.ts +1 -2
- package/lib/Store/index.js +1 -3
- package/lib/Store/make-in-memory-store.d.ts +1 -1
- package/lib/Store/make-in-memory-store.js +14 -5
- package/lib/Store/make-ordered-dictionary.d.ts +1 -1
- package/lib/Types/Auth.d.ts +0 -2
- package/lib/Types/Chat.d.ts +7 -0
- package/lib/Types/Contact.d.ts +5 -0
- package/lib/Types/Events.d.ts +27 -0
- package/lib/Types/GroupMetadata.d.ts +7 -0
- package/lib/Types/Label.js +1 -1
- package/lib/Types/LabelAssociation.js +1 -1
- package/lib/Types/Message.d.ts +129 -16
- package/lib/Types/Message.js +0 -2
- package/lib/Types/Newsletter.d.ts +79 -0
- package/lib/Types/Newsletter.js +18 -0
- package/lib/Types/Socket.d.ts +8 -5
- package/lib/Types/index.d.ts +1 -0
- package/lib/Types/index.js +2 -1
- package/lib/Utils/auth-utils.d.ts +1 -1
- package/lib/Utils/auth-utils.js +6 -7
- package/lib/Utils/business.js +2 -2
- package/lib/Utils/chat-utils.d.ts +8 -10
- package/lib/Utils/chat-utils.js +11 -0
- package/lib/Utils/crypto.d.ts +14 -16
- package/lib/Utils/crypto.js +40 -26
- package/lib/Utils/decode-wa-message.d.ts +5 -3
- package/lib/Utils/decode-wa-message.js +171 -29
- package/lib/Utils/event-buffer.js +1 -3
- package/lib/Utils/generics.d.ts +35 -9
- package/lib/Utils/generics.js +93 -27
- package/lib/Utils/history.d.ts +2 -2
- package/lib/Utils/link-preview.d.ts +1 -1
- package/lib/Utils/link-preview.js +17 -7
- package/lib/Utils/make-mutex.d.ts +2 -2
- package/lib/Utils/make-mutex.js +0 -1
- package/lib/Utils/messages-media.d.ts +35 -16
- package/lib/Utils/messages-media.js +168 -43
- package/lib/Utils/messages.d.ts +6 -9
- package/lib/Utils/messages.js +297 -37
- package/lib/Utils/noise-handler.d.ts +5 -7
- package/lib/Utils/process-message.js +2 -3
- package/lib/Utils/use-multi-file-auth-state.js +44 -13
- package/lib/Utils/validate-connection.d.ts +2 -2
- package/lib/Utils/validate-connection.js +1 -3
- package/lib/WABinary/decode.d.ts +2 -4
- package/lib/WABinary/decode.js +20 -9
- package/lib/WABinary/encode.d.ts +1 -3
- package/lib/WABinary/encode.js +30 -12
- package/lib/WABinary/generic-utils.d.ts +1 -3
- package/lib/WABinary/generic-utils.js +2 -2
- package/lib/WABinary/jid-utils.d.ts +9 -4
- package/lib/WABinary/jid-utils.js +25 -4
- package/lib/WAM/BinaryInfo.d.ts +2 -12
- package/lib/WAM/encode.d.ts +1 -3
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +2 -2
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +2 -2
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +2 -2
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +5 -5
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +53 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
- package/lib/WAUSync/USyncQuery.d.ts +2 -0
- package/lib/WAUSync/USyncQuery.js +27 -13
- package/lib/WAUSync/USyncUser.d.ts +2 -0
- package/lib/WAUSync/USyncUser.js +4 -0
- package/lib/index.d.ts +2 -1
- package/lib/index.js +3 -1
- package/package.json +59 -57
- package/WAProto/GenerateStatics.sh +0 -4
- package/WAProto/WAProto.proto +0 -3344
package/lib/Utils/messages.js
CHANGED
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.assertMediaContent = exports.downloadMediaMessage = exports.aggregateMessageKeysNotFromMe = exports.
|
6
|
+
exports.assertMediaContent = exports.downloadMediaMessage = exports.aggregateMessageKeysNotFromMe = 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
|
+
exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
|
7
8
|
const boom_1 = require("@hapi/boom");
|
8
9
|
const axios_1 = __importDefault(require("axios"));
|
9
10
|
const crypto_1 = require("crypto");
|
@@ -30,6 +31,7 @@ const MessageTypeProto = {
|
|
30
31
|
'sticker': Types_1.WAProto.Message.StickerMessage,
|
31
32
|
'document': Types_1.WAProto.Message.DocumentMessage,
|
32
33
|
};
|
34
|
+
const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
|
33
35
|
/**
|
34
36
|
* Uses a regex to test whether the string contains a URL, and returns the URL if it does.
|
35
37
|
* @param text eg. hello https://google.com
|
@@ -110,14 +112,14 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
110
112
|
const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
|
111
113
|
const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
|
112
114
|
const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
|
113
|
-
const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath } = await (
|
115
|
+
const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, } = await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
|
114
116
|
logger,
|
115
117
|
saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
|
116
118
|
opts: options.options
|
117
119
|
});
|
118
120
|
// url safe Base64 encode the SHA256 hash of the body
|
119
|
-
const fileEncSha256B64 = fileEncSha256.toString('base64');
|
120
|
-
const [{ mediaUrl, directPath }] = await Promise.all([
|
121
|
+
const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 !== void 0 ? fileEncSha256 : fileSha256).toString('base64');
|
122
|
+
const [{ mediaUrl, directPath, handle }] = await Promise.all([
|
121
123
|
(async () => {
|
122
124
|
const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
|
123
125
|
logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
|
@@ -154,7 +156,9 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
154
156
|
})(),
|
155
157
|
])
|
156
158
|
.finally(async () => {
|
157
|
-
|
159
|
+
if (!Buffer.isBuffer(encWriteStream)) {
|
160
|
+
encWriteStream.destroy();
|
161
|
+
}
|
158
162
|
// remove tmp files
|
159
163
|
if (didSaveToTmpPath && bodyPath) {
|
160
164
|
try {
|
@@ -169,13 +173,13 @@ const prepareWAMessageMedia = async (message, options) => {
|
|
169
173
|
});
|
170
174
|
const obj = Types_1.WAProto.Message.fromObject({
|
171
175
|
[`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
|
172
|
-
url: mediaUrl,
|
176
|
+
url: handle ? undefined : mediaUrl,
|
173
177
|
directPath,
|
174
|
-
mediaKey,
|
175
|
-
fileEncSha256,
|
178
|
+
mediaKey: mediaKey,
|
179
|
+
fileEncSha256: fileEncSha256,
|
176
180
|
fileSha256,
|
177
181
|
fileLength,
|
178
|
-
mediaKeyTimestamp: (0, generics_1.unixTimestampSeconds)(),
|
182
|
+
mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
|
179
183
|
...uploadData,
|
180
184
|
media: undefined
|
181
185
|
})
|
@@ -238,8 +242,8 @@ const generateForwardMessageContent = (message, forceForward) => {
|
|
238
242
|
};
|
239
243
|
exports.generateForwardMessageContent = generateForwardMessageContent;
|
240
244
|
const generateWAMessageContent = async (message, options) => {
|
241
|
-
var _a;
|
242
|
-
var
|
245
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
246
|
+
var _p, _q;
|
243
247
|
let m = {};
|
244
248
|
if ('text' in message) {
|
245
249
|
const extContent = { text: message.text };
|
@@ -248,7 +252,6 @@ const generateWAMessageContent = async (message, options) => {
|
|
248
252
|
urlInfo = await (0, exports.generateLinkPreviewIfRequired)(message.text, options.getUrlInfo, options.logger);
|
249
253
|
}
|
250
254
|
if (urlInfo) {
|
251
|
-
extContent.canonicalUrl = urlInfo['canonical-url'];
|
252
255
|
extContent.matchedText = urlInfo['matched-text'];
|
253
256
|
extContent.jpegThumbnail = urlInfo.jpegThumbnail;
|
254
257
|
extContent.description = urlInfo.description;
|
@@ -272,6 +275,9 @@ const generateWAMessageContent = async (message, options) => {
|
|
272
275
|
extContent.font = options.font;
|
273
276
|
}
|
274
277
|
m.extendedTextMessage = extContent;
|
278
|
+
m.messageContextInfo = {
|
279
|
+
messageSecret: (0, crypto_1.randomBytes)(32)
|
280
|
+
};
|
275
281
|
}
|
276
282
|
else if ('contacts' in message) {
|
277
283
|
const contactLen = message.contacts.contacts.length;
|
@@ -336,6 +342,27 @@ const generateWAMessageContent = async (message, options) => {
|
|
336
342
|
m.pinInChatMessage.senderTimestampMs = Date.now();
|
337
343
|
m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
|
338
344
|
}
|
345
|
+
else if ('keep' in message) {
|
346
|
+
m.keepInChatMessage = {};
|
347
|
+
m.keepInChatMessage.key = message.keep;
|
348
|
+
m.keepInChatMessage.keepType = message.type;
|
349
|
+
m.keepInChatMessage.timestampMs = Date.now();
|
350
|
+
}
|
351
|
+
else if ('call' in message) {
|
352
|
+
m = {
|
353
|
+
scheduledCallCreationMessage: {
|
354
|
+
scheduledTimestampMs: (_a = message.call.time) !== null && _a !== void 0 ? _a : Date.now(),
|
355
|
+
callType: (_b = message.call.type) !== null && _b !== void 0 ? _b : 1,
|
356
|
+
title: message.call.title
|
357
|
+
}
|
358
|
+
};
|
359
|
+
}
|
360
|
+
else if ('paymentInvite' in message) {
|
361
|
+
m.paymentInviteMessage = {
|
362
|
+
serviceType: message.paymentInvite.type,
|
363
|
+
expiryTimestamp: message.paymentInvite.expiry
|
364
|
+
};
|
365
|
+
}
|
339
366
|
else if ('buttonReply' in message) {
|
340
367
|
switch (message.type) {
|
341
368
|
case 'template':
|
@@ -368,12 +395,27 @@ const generateWAMessageContent = async (message, options) => {
|
|
368
395
|
}
|
369
396
|
});
|
370
397
|
}
|
398
|
+
else if ('order' in message) {
|
399
|
+
m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
|
400
|
+
orderId: message.order.id,
|
401
|
+
thumbnail: message.order.thumbnail,
|
402
|
+
itemCount: message.order.itemCount,
|
403
|
+
status: message.order.status,
|
404
|
+
surface: message.order.surface,
|
405
|
+
orderTitle: message.order.title,
|
406
|
+
message: message.order.text,
|
407
|
+
sellerJid: message.order.seller,
|
408
|
+
token: message.order.token,
|
409
|
+
totalAmount1000: message.order.amount,
|
410
|
+
totalCurrencyCode: message.order.currency
|
411
|
+
});
|
412
|
+
}
|
371
413
|
else if ('listReply' in message) {
|
372
414
|
m.listResponseMessage = { ...message.listReply };
|
373
415
|
}
|
374
416
|
else if ('poll' in message) {
|
375
|
-
(
|
376
|
-
(
|
417
|
+
(_p = message.poll).selectableCount || (_p.selectableCount = 0);
|
418
|
+
(_q = message.poll).toAnnouncementGroup || (_q.toAnnouncementGroup = false);
|
377
419
|
if (!Array.isArray(message.poll.values)) {
|
378
420
|
throw new boom_1.Boom('Invalid poll values', { statusCode: 400 });
|
379
421
|
}
|
@@ -396,7 +438,7 @@ const generateWAMessageContent = async (message, options) => {
|
|
396
438
|
}
|
397
439
|
else {
|
398
440
|
if (message.poll.selectableCount > 0) {
|
399
|
-
//poll v3 is for single select polls
|
441
|
+
// poll v3 is for single select polls
|
400
442
|
m.pollCreationMessageV3 = pollCreationMessage;
|
401
443
|
}
|
402
444
|
else {
|
@@ -405,6 +447,53 @@ const generateWAMessageContent = async (message, options) => {
|
|
405
447
|
}
|
406
448
|
}
|
407
449
|
}
|
450
|
+
else if ('event' in message) {
|
451
|
+
m.messageContextInfo = {
|
452
|
+
messageSecret: message.event.messageSecret || (0, crypto_1.randomBytes)(32),
|
453
|
+
};
|
454
|
+
m.eventMessage = { ...message.event };
|
455
|
+
}
|
456
|
+
else if ('inviteAdmin' in message) {
|
457
|
+
m.newsletterAdminInviteMessage = {};
|
458
|
+
m.newsletterAdminInviteMessage.inviteExpiration = message.inviteAdmin.inviteExpiration;
|
459
|
+
m.newsletterAdminInviteMessage.caption = message.inviteAdmin.text;
|
460
|
+
m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
|
461
|
+
m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
|
462
|
+
m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
|
463
|
+
}
|
464
|
+
else if ('requestPayment' in message) {
|
465
|
+
const sticker = ((_c = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _c === void 0 ? void 0 : _c.sticker) ?
|
466
|
+
await (0, exports.prepareWAMessageMedia)({ sticker: (_d = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _d === void 0 ? void 0 : _d.sticker, ...options }, options)
|
467
|
+
: null;
|
468
|
+
let notes = {};
|
469
|
+
if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
|
470
|
+
notes = {
|
471
|
+
stickerMessage: {
|
472
|
+
...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
|
473
|
+
contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
|
474
|
+
}
|
475
|
+
};
|
476
|
+
}
|
477
|
+
else if (message.requestPayment.note) {
|
478
|
+
notes = {
|
479
|
+
extendedTextMessage: {
|
480
|
+
text: message.requestPayment.note,
|
481
|
+
contextInfo: (_g = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _g === void 0 ? void 0 : _g.contextInfo,
|
482
|
+
}
|
483
|
+
};
|
484
|
+
}
|
485
|
+
else {
|
486
|
+
throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
|
487
|
+
}
|
488
|
+
m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
|
489
|
+
expiryTimestamp: message.requestPayment.expiry,
|
490
|
+
amount1000: message.requestPayment.amount,
|
491
|
+
currencyCodeIso4217: message.requestPayment.currency,
|
492
|
+
requestFrom: message.requestPayment.from,
|
493
|
+
noteMessage: { ...notes },
|
494
|
+
background: (_h = message.requestPayment.background) !== null && _h !== void 0 ? _h : null,
|
495
|
+
});
|
496
|
+
}
|
408
497
|
else if ('sharePhoneNumber' in message) {
|
409
498
|
m.protocolMessage = {
|
410
499
|
type: WAProto_1.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
|
@@ -416,10 +505,162 @@ const generateWAMessageContent = async (message, options) => {
|
|
416
505
|
else {
|
417
506
|
m = await (0, exports.prepareWAMessageMedia)(message, options);
|
418
507
|
}
|
508
|
+
if ('buttons' in message && !!message.buttons) {
|
509
|
+
const buttonsMessage = {
|
510
|
+
buttons: message.buttons.map(b => ({ ...b, type: WAProto_1.proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
|
511
|
+
};
|
512
|
+
if ('text' in message) {
|
513
|
+
buttonsMessage.contentText = message.text;
|
514
|
+
buttonsMessage.headerType = ButtonType.EMPTY;
|
515
|
+
}
|
516
|
+
else {
|
517
|
+
if ('caption' in message) {
|
518
|
+
buttonsMessage.contentText = message.caption;
|
519
|
+
}
|
520
|
+
const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
|
521
|
+
buttonsMessage.headerType = ButtonType[type];
|
522
|
+
Object.assign(buttonsMessage, m);
|
523
|
+
}
|
524
|
+
if ('title' in message && !!message.title) {
|
525
|
+
buttonsMessage.text = message.title,
|
526
|
+
buttonsMessage.headerType = ButtonType.TEXT;
|
527
|
+
}
|
528
|
+
if ('footer' in message && !!message.footer) {
|
529
|
+
buttonsMessage.footerText = message.footer;
|
530
|
+
}
|
531
|
+
if ('contextInfo' in message && !!message.contextInfo) {
|
532
|
+
buttonsMessage.contextInfo = message.contextInfo;
|
533
|
+
}
|
534
|
+
if ('mentions' in message && !!message.mentions) {
|
535
|
+
buttonsMessage.contextInfo = { mentionedJid: message.mentions };
|
536
|
+
}
|
537
|
+
m = { buttonsMessage };
|
538
|
+
}
|
539
|
+
else if ('templateButtons' in message && !!message.templateButtons) {
|
540
|
+
const msg = {
|
541
|
+
hydratedButtons: message.hasOwnProperty("templateButtons") ? message.templateButtons : message.templateButtons
|
542
|
+
};
|
543
|
+
if ('text' in message) {
|
544
|
+
msg.hydratedContentText = message.text;
|
545
|
+
}
|
546
|
+
else {
|
547
|
+
if ('caption' in message) {
|
548
|
+
msg.hydratedContentText = message.caption;
|
549
|
+
}
|
550
|
+
Object.assign(msg, m);
|
551
|
+
}
|
552
|
+
if ('footer' in message && !!message.footer) {
|
553
|
+
msg.hydratedFooterText = message.footer;
|
554
|
+
}
|
555
|
+
m = {
|
556
|
+
templateMessage: {
|
557
|
+
fourRowTemplate: msg,
|
558
|
+
hydratedTemplate: msg
|
559
|
+
}
|
560
|
+
};
|
561
|
+
}
|
562
|
+
if ('sections' in message && !!message.sections) {
|
563
|
+
const listMessage = {
|
564
|
+
sections: message.sections,
|
565
|
+
buttonText: message.buttonText,
|
566
|
+
title: message.title,
|
567
|
+
footerText: message.footer,
|
568
|
+
description: message.text,
|
569
|
+
listType: message.hasOwnProperty('listType') ? message.listType : WAProto_1.proto.Message.ListMessage.ListType.PRODUCT_LIST
|
570
|
+
};
|
571
|
+
m = { listMessage };
|
572
|
+
}
|
573
|
+
if ('interactiveButtons' in message && !!message.interactiveButtons) {
|
574
|
+
const interactiveMessage = {
|
575
|
+
nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
|
576
|
+
buttons: message.interactiveButtons,
|
577
|
+
})
|
578
|
+
};
|
579
|
+
if ('text' in message) {
|
580
|
+
interactiveMessage.body = {
|
581
|
+
text: message.text
|
582
|
+
};
|
583
|
+
}
|
584
|
+
else if ('caption' in message) {
|
585
|
+
interactiveMessage.body = {
|
586
|
+
text: message.caption
|
587
|
+
};
|
588
|
+
interactiveMessage.header = {
|
589
|
+
title: message.title,
|
590
|
+
subtitle: message.subtitle,
|
591
|
+
hasMediaAttachment: (_j = message === null || message === void 0 ? void 0 : message.media) !== null && _j !== void 0 ? _j : false,
|
592
|
+
};
|
593
|
+
Object.assign(interactiveMessage.header, m);
|
594
|
+
}
|
595
|
+
if ('footer' in message && !!message.footer) {
|
596
|
+
interactiveMessage.footer = {
|
597
|
+
text: message.footer
|
598
|
+
};
|
599
|
+
}
|
600
|
+
if ('title' in message && !!message.title) {
|
601
|
+
interactiveMessage.header = {
|
602
|
+
title: message.title,
|
603
|
+
subtitle: message.subtitle,
|
604
|
+
hasMediaAttachment: (_k = message === null || message === void 0 ? void 0 : message.media) !== null && _k !== void 0 ? _k : false,
|
605
|
+
};
|
606
|
+
Object.assign(interactiveMessage.header, m);
|
607
|
+
}
|
608
|
+
if ('contextInfo' in message && !!message.contextInfo) {
|
609
|
+
interactiveMessage.contextInfo = message.contextInfo;
|
610
|
+
}
|
611
|
+
if ('mentions' in message && !!message.mentions) {
|
612
|
+
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
613
|
+
}
|
614
|
+
m = { interactiveMessage };
|
615
|
+
}
|
616
|
+
if ('shop' in message && !!message.shop) {
|
617
|
+
const interactiveMessage = {
|
618
|
+
shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
|
619
|
+
surface: message.shop,
|
620
|
+
id: message.id
|
621
|
+
})
|
622
|
+
};
|
623
|
+
if ('text' in message) {
|
624
|
+
interactiveMessage.body = {
|
625
|
+
text: message.text
|
626
|
+
};
|
627
|
+
}
|
628
|
+
else if ('caption' in message) {
|
629
|
+
interactiveMessage.body = {
|
630
|
+
text: message.caption
|
631
|
+
};
|
632
|
+
interactiveMessage.header = {
|
633
|
+
title: message.title,
|
634
|
+
subtitle: message.subtitle,
|
635
|
+
hasMediaAttachment: (_l = message === null || message === void 0 ? void 0 : message.media) !== null && _l !== void 0 ? _l : false,
|
636
|
+
};
|
637
|
+
Object.assign(interactiveMessage.header, m);
|
638
|
+
}
|
639
|
+
if ('footer' in message && !!message.footer) {
|
640
|
+
interactiveMessage.footer = {
|
641
|
+
text: message.footer
|
642
|
+
};
|
643
|
+
}
|
644
|
+
if ('title' in message && !!message.title) {
|
645
|
+
interactiveMessage.header = {
|
646
|
+
title: message.title,
|
647
|
+
subtitle: message.subtitle,
|
648
|
+
hasMediaAttachment: (_m = message === null || message === void 0 ? void 0 : message.media) !== null && _m !== void 0 ? _m : false,
|
649
|
+
};
|
650
|
+
Object.assign(interactiveMessage.header, m);
|
651
|
+
}
|
652
|
+
if ('contextInfo' in message && !!message.contextInfo) {
|
653
|
+
interactiveMessage.contextInfo = message.contextInfo;
|
654
|
+
}
|
655
|
+
if ('mentions' in message && !!message.mentions) {
|
656
|
+
interactiveMessage.contextInfo = { mentionedJid: message.mentions };
|
657
|
+
}
|
658
|
+
m = { interactiveMessage };
|
659
|
+
}
|
419
660
|
if ('viewOnce' in message && !!message.viewOnce) {
|
420
661
|
m = { viewOnceMessage: { message: m } };
|
421
662
|
}
|
422
|
-
if ('mentions' in message && ((
|
663
|
+
if ('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length)) {
|
423
664
|
const [messageType] = Object.keys(m);
|
424
665
|
m[messageType].contextInfo = m[messageType] || {};
|
425
666
|
m[messageType].contextInfo.mentionedJid = message.mentions;
|
@@ -452,26 +693,29 @@ const generateWAMessageFromContent = (jid, message, options) => {
|
|
452
693
|
const key = (0, exports.getContentType)(innerMessage);
|
453
694
|
const timestamp = (0, generics_1.unixTimestampSeconds)(options.timestamp);
|
454
695
|
const { quoted, userJid } = options;
|
455
|
-
|
696
|
+
// only set quoted if isn't a newsletter message
|
697
|
+
if (quoted && !(0, WABinary_1.isJidNewsletter)(jid)) {
|
456
698
|
const participant = quoted.key.fromMe ? userJid : (quoted.participant || quoted.key.participant || quoted.key.remoteJid);
|
457
699
|
let quotedMsg = (0, exports.normalizeMessageContent)(quoted.message);
|
458
700
|
const msgType = (0, exports.getContentType)(quotedMsg);
|
459
701
|
// strip any redundant properties
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
702
|
+
if (quotedMsg) {
|
703
|
+
quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
|
704
|
+
const quotedContent = quotedMsg[msgType];
|
705
|
+
if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
|
706
|
+
delete quotedContent.contextInfo;
|
707
|
+
}
|
708
|
+
const contextInfo = innerMessage[key].contextInfo || {};
|
709
|
+
contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
|
710
|
+
contextInfo.stanzaId = quoted.key.id;
|
711
|
+
contextInfo.quotedMessage = quotedMsg;
|
712
|
+
// if a participant is quoted, then it must be a group
|
713
|
+
// hence, remoteJid of group must also be entered
|
714
|
+
if (jid !== quoted.key.remoteJid) {
|
715
|
+
contextInfo.remoteJid = quoted.key.remoteJid;
|
716
|
+
}
|
717
|
+
innerMessage[key].contextInfo = contextInfo;
|
718
|
+
}
|
475
719
|
}
|
476
720
|
if (
|
477
721
|
// if we want to send a disappearing message
|
@@ -479,7 +723,9 @@ const generateWAMessageFromContent = (jid, message, options) => {
|
|
479
723
|
// and it's not a protocol message -- delete, toggle disappear message
|
480
724
|
key !== 'protocolMessage' &&
|
481
725
|
// already not converted to disappearing message
|
482
|
-
key !== 'ephemeralMessage'
|
726
|
+
key !== 'ephemeralMessage' &&
|
727
|
+
// newsletter not accept disappearing messages
|
728
|
+
!(0, WABinary_1.isJidNewsletter)(jid)) {
|
483
729
|
innerMessage[key].contextInfo = {
|
484
730
|
...(innerMessage[key].contextInfo || {}),
|
485
731
|
expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
|
@@ -491,7 +737,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
|
|
491
737
|
key: {
|
492
738
|
remoteJid: jid,
|
493
739
|
fromMe: true,
|
494
|
-
id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.
|
740
|
+
id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageIDV2)(),
|
495
741
|
},
|
496
742
|
message: message,
|
497
743
|
messageTimestamp: timestamp,
|
@@ -506,7 +752,7 @@ const generateWAMessage = async (jid, content, options) => {
|
|
506
752
|
var _a;
|
507
753
|
// ensure msg ID is with every log
|
508
754
|
options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
|
509
|
-
return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, options), options);
|
755
|
+
return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsletter)(jid), ...options }), options);
|
510
756
|
};
|
511
757
|
exports.generateWAMessage = generateWAMessage;
|
512
758
|
/** Get the key to access the true type of content */
|
@@ -543,7 +789,22 @@ const normalizeMessageContent = (content) => {
|
|
543
789
|
|| (message === null || message === void 0 ? void 0 : message.documentWithCaptionMessage)
|
544
790
|
|| (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2)
|
545
791
|
|| (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension)
|
546
|
-
|| (message === null || message === void 0 ? void 0 : message.editedMessage)
|
792
|
+
|| (message === null || message === void 0 ? void 0 : message.editedMessage)
|
793
|
+
|| (message === null || message === void 0 ? void 0 : message.groupMentionedMessage)
|
794
|
+
|| (message === null || message === void 0 ? void 0 : message.botInvokeMessage)
|
795
|
+
|| (message === null || message === void 0 ? void 0 : message.lottieStickerMessage)
|
796
|
+
|| (message === null || message === void 0 ? void 0 : message.eventCoverImage)
|
797
|
+
|| (message === null || message === void 0 ? void 0 : message.statusMentionMessage)
|
798
|
+
|| (message === null || message === void 0 ? void 0 : message.pollCreationOptionImageMessage)
|
799
|
+
|| (message === null || message === void 0 ? void 0 : message.associatedChildMessage)
|
800
|
+
|| (message === null || message === void 0 ? void 0 : message.groupStatusMentionMessage)
|
801
|
+
|| (message === null || message === void 0 ? void 0 : message.pollCreationMessageV4)
|
802
|
+
|| (message === null || message === void 0 ? void 0 : message.pollCreationMessageV5)
|
803
|
+
|| (message === null || message === void 0 ? void 0 : message.statusAddYours)
|
804
|
+
|| (message === null || message === void 0 ? void 0 : message.groupStatusMessage)
|
805
|
+
|| (message === null || message === void 0 ? void 0 : message.limitSharingMessage)
|
806
|
+
|| (message === null || message === void 0 ? void 0 : message.botTaskMessage)
|
807
|
+
|| (message === null || message === void 0 ? void 0 : message.questionMessage));
|
547
808
|
}
|
548
809
|
};
|
549
810
|
exports.normalizeMessageContent = normalizeMessageContent;
|
@@ -671,7 +932,6 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
|
|
671
932
|
}
|
672
933
|
return Object.values(voteHashMap);
|
673
934
|
}
|
674
|
-
exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
|
675
935
|
/** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
|
676
936
|
const aggregateMessageKeysNotFromMe = (keys) => {
|
677
937
|
const keyMap = {};
|
@@ -1,21 +1,19 @@
|
|
1
|
-
|
2
|
-
/// <reference types="node" />
|
1
|
+
import { ILogger } from './logger';
|
3
2
|
import { proto } from '../../WAProto';
|
4
3
|
import { KeyPair } from '../Types';
|
5
4
|
import { BinaryNode } from '../WABinary';
|
6
|
-
import { ILogger } from './logger';
|
7
5
|
export declare const makeNoiseHandler: ({ keyPair: { private: privateKey, public: publicKey }, NOISE_HEADER, logger, routingInfo }: {
|
8
6
|
keyPair: KeyPair;
|
9
7
|
NOISE_HEADER: Uint8Array;
|
10
8
|
logger: ILogger;
|
11
9
|
routingInfo?: Buffer | undefined;
|
12
10
|
}) => {
|
13
|
-
encrypt: (plaintext: Uint8Array) => Buffer
|
14
|
-
decrypt: (ciphertext: Uint8Array) => Buffer
|
11
|
+
encrypt: (plaintext: Uint8Array) => Buffer<ArrayBuffer>;
|
12
|
+
decrypt: (ciphertext: Uint8Array) => Buffer<ArrayBuffer>;
|
15
13
|
authenticate: (data: Uint8Array) => void;
|
16
14
|
mixIntoKey: (data: Uint8Array) => Promise<void>;
|
17
15
|
finishInit: () => Promise<void>;
|
18
|
-
processHandshake: ({ serverHello }: proto.HandshakeMessage, noiseKey: KeyPair) => Promise<Buffer
|
19
|
-
encodeFrame: (data: Buffer | Uint8Array) => Buffer
|
16
|
+
processHandshake: ({ serverHello }: proto.HandshakeMessage, noiseKey: KeyPair) => Promise<Buffer<ArrayBuffer>>;
|
17
|
+
encodeFrame: (data: Buffer | Uint8Array) => Buffer<ArrayBuffer>;
|
20
18
|
decodeFrame: (newData: Buffer | Uint8Array, onFrame: (buff: Uint8Array | BinaryNode) => void) => Promise<void>;
|
21
19
|
};
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.getChatId = exports.shouldIncrementChatUnread = exports.isRealMessage = exports.cleanMessage = void 0;
|
4
|
+
exports.decryptPollVote = decryptPollVote;
|
4
5
|
const WAProto_1 = require("../../WAProto");
|
5
6
|
const Types_1 = require("../Types");
|
6
7
|
const messages_1 = require("../Utils/messages");
|
@@ -101,7 +102,6 @@ function decryptPollVote({ encPayload, encIv }, { pollCreatorJid, pollMsgId, pol
|
|
101
102
|
return Buffer.from(txt);
|
102
103
|
}
|
103
104
|
}
|
104
|
-
exports.decryptPollVote = decryptPollVote;
|
105
105
|
const processMessage = async (message, { shouldProcessHistoryMsg, placeholderResendCache, ev, creds, keyStore, logger, options, getMessage }) => {
|
106
106
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
107
107
|
const meId = creds.me.id;
|
@@ -201,7 +201,6 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
|
|
201
201
|
const { peerDataOperationResult } = response;
|
202
202
|
for (const result of peerDataOperationResult) {
|
203
203
|
const { placeholderMessageResendResponse: retryResponse } = result;
|
204
|
-
//eslint-disable-next-line max-depth
|
205
204
|
if (retryResponse) {
|
206
205
|
const webMessageInfo = WAProto_1.proto.WebMessageInfo.decode(retryResponse.webMessageInfoBytes);
|
207
206
|
// wait till another upsert event is available, don't want it to be part of the PDO response message
|
@@ -1,10 +1,7 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
3
|
exports.useMultiFileAuthState = void 0;
|
7
|
-
const
|
4
|
+
const async_mutex_1 = require("async-mutex");
|
8
5
|
const promises_1 = require("fs/promises");
|
9
6
|
const path_1 = require("path");
|
10
7
|
const WAProto_1 = require("../../WAProto");
|
@@ -13,9 +10,17 @@ const generics_1 = require("./generics");
|
|
13
10
|
// We need to lock files due to the fact that we are using async functions to read and write files
|
14
11
|
// https://github.com/WhiskeySockets/Baileys/issues/794
|
15
12
|
// https://github.com/nodejs/node/issues/26338
|
16
|
-
//
|
17
|
-
|
18
|
-
|
13
|
+
// Use a Map to store mutexes for each file path
|
14
|
+
const fileLocks = new Map();
|
15
|
+
// Get or create a mutex for a specific file path
|
16
|
+
const getFileLock = (path) => {
|
17
|
+
let mutex = fileLocks.get(path);
|
18
|
+
if (!mutex) {
|
19
|
+
mutex = new async_mutex_1.Mutex();
|
20
|
+
fileLocks.set(path, mutex);
|
21
|
+
}
|
22
|
+
return mutex;
|
23
|
+
};
|
19
24
|
/**
|
20
25
|
* stores the full authentication state in a single folder.
|
21
26
|
* Far more efficient than singlefileauthstate
|
@@ -25,15 +30,31 @@ const fileLock = new async_lock_1.default({ maxPending: Infinity });
|
|
25
30
|
* */
|
26
31
|
const useMultiFileAuthState = async (folder) => {
|
27
32
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
28
|
-
const writeData = (data, file) => {
|
33
|
+
const writeData = async (data, file) => {
|
29
34
|
const filePath = (0, path_1.join)(folder, fixFileName(file));
|
30
|
-
|
35
|
+
const mutex = getFileLock(filePath);
|
36
|
+
return mutex.acquire().then(async (release) => {
|
37
|
+
try {
|
38
|
+
await (0, promises_1.writeFile)(filePath, JSON.stringify(data, generics_1.BufferJSON.replacer));
|
39
|
+
}
|
40
|
+
finally {
|
41
|
+
release();
|
42
|
+
}
|
43
|
+
});
|
31
44
|
};
|
32
45
|
const readData = async (file) => {
|
33
46
|
try {
|
34
47
|
const filePath = (0, path_1.join)(folder, fixFileName(file));
|
35
|
-
const
|
36
|
-
return
|
48
|
+
const mutex = getFileLock(filePath);
|
49
|
+
return await mutex.acquire().then(async (release) => {
|
50
|
+
try {
|
51
|
+
const data = await (0, promises_1.readFile)(filePath, { encoding: 'utf-8' });
|
52
|
+
return JSON.parse(data, generics_1.BufferJSON.reviver);
|
53
|
+
}
|
54
|
+
finally {
|
55
|
+
release();
|
56
|
+
}
|
57
|
+
});
|
37
58
|
}
|
38
59
|
catch (error) {
|
39
60
|
return null;
|
@@ -42,7 +63,17 @@ const useMultiFileAuthState = async (folder) => {
|
|
42
63
|
const removeData = async (file) => {
|
43
64
|
try {
|
44
65
|
const filePath = (0, path_1.join)(folder, fixFileName(file));
|
45
|
-
|
66
|
+
const mutex = getFileLock(filePath);
|
67
|
+
return mutex.acquire().then(async (release) => {
|
68
|
+
try {
|
69
|
+
await (0, promises_1.unlink)(filePath);
|
70
|
+
}
|
71
|
+
catch (_a) {
|
72
|
+
}
|
73
|
+
finally {
|
74
|
+
release();
|
75
|
+
}
|
76
|
+
});
|
46
77
|
}
|
47
78
|
catch (_a) {
|
48
79
|
}
|
@@ -86,7 +117,7 @@ const useMultiFileAuthState = async (folder) => {
|
|
86
117
|
}
|
87
118
|
}
|
88
119
|
},
|
89
|
-
saveCreds: () => {
|
120
|
+
saveCreds: async () => {
|
90
121
|
return writeData(creds, 'creds.json');
|
91
122
|
}
|
92
123
|
};
|
@@ -3,8 +3,8 @@ import type { AuthenticationCreds, SignalCreds, SocketConfig } from '../Types';
|
|
3
3
|
import { BinaryNode } from '../WABinary';
|
4
4
|
export declare const generateLoginNode: (userJid: string, config: SocketConfig) => proto.IClientPayload;
|
5
5
|
export declare const generateRegistrationNode: ({ registrationId, signedPreKey, signedIdentityKey }: SignalCreds, config: SocketConfig) => proto.ClientPayload;
|
6
|
-
export declare const configureSuccessfulPairing: (stanza: BinaryNode, { advSecretKey, signedIdentityKey, signalIdentities }: Pick<AuthenticationCreds,
|
6
|
+
export declare const configureSuccessfulPairing: (stanza: BinaryNode, { advSecretKey, signedIdentityKey, signalIdentities }: Pick<AuthenticationCreds, "advSecretKey" | "signedIdentityKey" | "signalIdentities">) => {
|
7
7
|
creds: Partial<AuthenticationCreds>;
|
8
8
|
reply: BinaryNode;
|
9
9
|
};
|
10
|
-
export declare const encodeSignedDeviceIdentity: (account: proto.IADVSignedDeviceIdentity, includeSignatureKey: boolean) => Uint8Array
|
10
|
+
export declare const encodeSignedDeviceIdentity: (account: proto.IADVSignedDeviceIdentity, includeSignatureKey: boolean) => Uint8Array<ArrayBufferLike>;
|
@@ -22,9 +22,7 @@ const getUserAgent = (config) => {
|
|
22
22
|
device: 'Desktop',
|
23
23
|
osBuildNumber: '0.1',
|
24
24
|
localeLanguageIso6391: 'en',
|
25
|
-
|
26
|
-
mcc: '000',
|
27
|
-
localeCountryIso31661Alpha2: config.countryCode,
|
25
|
+
localeCountryIso31661Alpha2: config.countryCode
|
28
26
|
};
|
29
27
|
};
|
30
28
|
const PLATFORM_MAP = {
|