@baileys-md/baileys 12.0.0 → 12.2.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.
Files changed (109) hide show
  1. package/LICENSE +21 -13
  2. package/WAProto/WAProto.proto +769 -233
  3. package/WAProto/index.js +65813 -141372
  4. package/lib/Defaults/index.js +128 -113
  5. package/lib/KeyDB/BinarySearch.js +30 -0
  6. package/lib/KeyDB/KeyedDB.js +178 -0
  7. package/lib/KeyDB/index.js +14 -0
  8. package/lib/Signal/Group/ciphertext-message.js +22 -14
  9. package/lib/Signal/Group/group-session-builder.js +21 -42
  10. package/lib/Signal/Group/group_cipher.js +85 -87
  11. package/lib/Signal/Group/index.js +23 -57
  12. package/lib/Signal/Group/keyhelper.js +28 -52
  13. package/lib/Signal/Group/sender-chain-key.js +37 -33
  14. package/lib/Signal/Group/sender-key-distribution-message.js +73 -63
  15. package/lib/Signal/Group/sender-key-message.js +75 -66
  16. package/lib/Signal/Group/sender-key-name.js +55 -44
  17. package/lib/Signal/Group/sender-key-record.js +49 -49
  18. package/lib/Signal/Group/sender-key-state.js +90 -93
  19. package/lib/Signal/Group/sender-message-key.js +37 -28
  20. package/lib/Signal/libsignal.js +324 -163
  21. package/lib/Signal/lid-mapping.js +166 -0
  22. package/lib/Socket/Client/index.js +14 -18
  23. package/lib/Socket/Client/types.js +12 -12
  24. package/lib/Socket/Client/websocket.js +60 -109
  25. package/lib/Socket/business.js +359 -242
  26. package/lib/Socket/chats.js +857 -898
  27. package/lib/Socket/communities.js +413 -0
  28. package/lib/Socket/groups.js +304 -324
  29. package/lib/Socket/index.js +25 -9
  30. package/lib/Socket/messages-recv.js +1109 -1000
  31. package/lib/Socket/messages-send.js +615 -387
  32. package/lib/Socket/mex.js +45 -0
  33. package/lib/Socket/newsletter.js +231 -227
  34. package/lib/Socket/socket.js +803 -628
  35. package/lib/Store/index.js +18 -8
  36. package/lib/Store/make-cache-manager-store.js +75 -0
  37. package/lib/Store/make-in-memory-store.js +286 -435
  38. package/lib/Store/make-ordered-dictionary.js +77 -79
  39. package/lib/Store/object-repository.js +24 -26
  40. package/lib/Types/Auth.js +13 -2
  41. package/lib/Types/Bussines.js +13 -0
  42. package/lib/Types/Call.js +13 -2
  43. package/lib/Types/Chat.js +19 -4
  44. package/lib/Types/Contact.js +13 -2
  45. package/lib/Types/Events.js +13 -2
  46. package/lib/Types/GroupMetadata.js +13 -2
  47. package/lib/Types/Label.js +43 -26
  48. package/lib/Types/LabelAssociation.js +16 -8
  49. package/lib/Types/Message.js +22 -7
  50. package/lib/Types/Newsletter.js +42 -17
  51. package/lib/Types/Product.js +13 -2
  52. package/lib/Types/Signal.js +13 -2
  53. package/lib/Types/Socket.js +14 -2
  54. package/lib/Types/State.js +21 -2
  55. package/lib/Types/USync.js +13 -2
  56. package/lib/Types/index.js +37 -41
  57. package/lib/Utils/auth-utils.js +219 -189
  58. package/lib/Utils/baileys-event-stream.js +54 -0
  59. package/lib/Utils/browser-utils.js +21 -31
  60. package/lib/Utils/business.js +213 -214
  61. package/lib/Utils/chat-utils.js +711 -689
  62. package/lib/Utils/crypto.js +112 -175
  63. package/lib/Utils/decode-wa-message.js +254 -194
  64. package/lib/Utils/event-buffer.js +510 -500
  65. package/lib/Utils/generics.js +318 -430
  66. package/lib/Utils/history.js +83 -90
  67. package/lib/Utils/index.js +31 -35
  68. package/lib/Utils/link-preview.js +71 -116
  69. package/lib/Utils/logger.js +5 -7
  70. package/lib/Utils/lt-hash.js +40 -46
  71. package/lib/Utils/make-mutex.js +34 -41
  72. package/lib/Utils/message-retry-manager.js +33 -48
  73. package/lib/Utils/messages-media.js +516 -784
  74. package/lib/Utils/messages.js +347 -489
  75. package/lib/Utils/noise-handler.js +138 -144
  76. package/lib/Utils/pre-key-manager.js +95 -0
  77. package/lib/Utils/process-message.js +331 -384
  78. package/lib/Utils/signal.js +157 -139
  79. package/lib/Utils/use-multi-file-auth-state.js +119 -91
  80. package/lib/Utils/validate-connection.js +184 -203
  81. package/lib/WABinary/constants.js +1308 -1298
  82. package/lib/WABinary/decode.js +241 -256
  83. package/lib/WABinary/encode.js +217 -239
  84. package/lib/WABinary/generic-utils.js +131 -40
  85. package/lib/WABinary/index.js +17 -21
  86. package/lib/WABinary/jid-utils.js +97 -79
  87. package/lib/WABinary/types.js +13 -2
  88. package/lib/WAM/BinaryInfo.js +20 -12
  89. package/lib/WAM/constants.js +22863 -15348
  90. package/lib/WAM/encode.js +145 -136
  91. package/lib/WAM/index.js +15 -19
  92. package/lib/WAUSync/Protocols/USyncContactProtocol.js +39 -31
  93. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +61 -54
  94. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +39 -29
  95. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +48 -40
  96. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +62 -51
  97. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +38 -21
  98. package/lib/WAUSync/Protocols/index.js +17 -20
  99. package/lib/WAUSync/USyncQuery.js +98 -86
  100. package/lib/WAUSync/USyncUser.js +35 -26
  101. package/lib/WAUSync/index.js +16 -19
  102. package/lib/index.js +23 -41
  103. package/package.json +46 -56
  104. package/README.md +0 -113
  105. package/WAProto/GenerateStatics.sh +0 -4
  106. package/lib/Defaults/wileys-version.json +0 -3
  107. package/lib/Signal/Group/queue-job.js +0 -57
  108. package/lib/Socket/usync.js +0 -70
  109. package/lib/Utils/wileys-event-stream.js +0 -63
@@ -1,207 +1,267 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decryptMessageNode = exports.NACK_REASONS = exports.MISSING_KEYS_ERROR_TEXT = exports.NO_MESSAGE_FOUND_ERROR_TEXT = void 0;
4
- exports.decodeMessageNode = decodeMessageNode;
5
- const boom_1 = require("@hapi/boom");
6
- const WAProto_1 = require("../../WAProto");
7
- const WABinary_1 = require("../WABinary");
8
- const generics_1 = require("./generics");
9
- exports.NO_MESSAGE_FOUND_ERROR_TEXT = 'Message absent from node';
10
- exports.MISSING_KEYS_ERROR_TEXT = 'Key used already or never filled';
11
- exports.NACK_REASONS = {
12
- ParsingError: 487,
13
- UnrecognizedStanza: 488,
14
- UnrecognizedStanzaClass: 489,
15
- UnrecognizedStanzaType: 490,
16
- InvalidProtobuf: 491,
17
- InvalidHostedCompanionStanza: 493,
18
- MissingMessageSecret: 495,
19
- SignalErrorOldCounter: 496,
20
- MessageDeletedOnPeer: 499,
21
- UnhandledError: 500,
22
- UnsupportedAdminRevoke: 550,
23
- UnsupportedLIDGroup: 551,
24
- DBOperationFailed: 552
1
+ //=======================================================//
2
+ import { areJidsSameUser, isHostedLidUser, isHostedPnUser, isJidBroadcast, isJidGroup, isJidMetaAI, isJidNewsletter, isJidStatusBroadcast, isLidUser, isPnUser } from "../WABinary/index.js";
3
+ import { unpadRandomMax16 } from "./generics.js";
4
+ import { proto } from "../../WAProto/index.js";
5
+ import { Boom } from "@hapi/boom";
6
+ //=======================================================//
7
+ export const getDecryptionJid = async (sender, repository) => {
8
+ if (isLidUser(sender) || isHostedLidUser(sender)) {
9
+ return sender;
10
+ }
11
+ const mapped = await repository.lidMapping.getLIDForPN(sender);
12
+ return mapped || sender;
25
13
  };
26
- /**
27
- * Decode the received node as a message.
28
- * @note this will only parse the message, not decrypt it
29
- */
30
- function decodeMessageNode(stanza, meId, meLid) {
31
- var _a, _b, _c, _d, _e, _f, _g;
32
- let msgType;
33
- let chatId;
34
- let author;
35
- const msgId = stanza.attrs.id;
36
- const from = stanza.attrs.from;
37
- const senderPn = (_a = stanza === null || stanza === void 0 ? void 0 : stanza.attrs) === null || _a === void 0 ? void 0 : _a.sender_pn;
38
- const senderLid = (_b = stanza === null || stanza === void 0 ? void 0 : stanza.attrs) === null || _b === void 0 ? void 0 : _b.sender_lid;
39
- const participant = stanza.attrs.participant;
40
- const participantLid = (_c = stanza === null || stanza === void 0 ? void 0 : stanza.attrs) === null || _c === void 0 ? void 0 : _c.participant_lid;
41
- const recipient = stanza.attrs.recipient;
42
- const isMe = (jid) => (0, WABinary_1.areJidsSameUser)(jid, meId);
43
- const isMeLid = (jid) => (0, WABinary_1.areJidsSameUser)(jid, meLid);
44
- if ((0, WABinary_1.isJidUser)(from) || (0, WABinary_1.isLidUser)(from)) {
45
- if (recipient && !(0, WABinary_1.isJidMetaAi)(recipient)) {
46
- if (!isMe(from) && !isMeLid(from)) {
47
- throw new boom_1.Boom('receipient present, but msg not from me', { data: stanza });
48
- }
49
- chatId = recipient;
50
- }
51
- else {
52
- chatId = from;
53
- }
54
- msgType = 'chat';
55
- author = from;
14
+ //=======================================================//
15
+ const storeMappingFromEnvelope = async (stanza, sender, repository, decryptionJid, logger) => {
16
+ const { senderAlt } = extractAddressingContext(stanza);
17
+ if (senderAlt && isLidUser(senderAlt) && isPnUser(sender) && decryptionJid === sender) {
18
+ try {
19
+ await repository.lidMapping.storeLIDPNMappings([{ lid: senderAlt, pn: sender }]);
20
+ await repository.migrateSession(sender, senderAlt);
21
+ logger.debug({ sender, senderAlt }, "Stored LID mapping from envelope");
56
22
  }
57
- else if ((0, WABinary_1.isJidGroup)(from)) {
58
- if (!participant) {
59
- throw new boom_1.Boom('No participant in group message');
60
- }
61
- msgType = 'group';
62
- author = participant;
63
- chatId = from;
64
- }
65
- else if ((0, WABinary_1.isJidNewsletter)(from)) {
66
- msgType = 'newsletter';
67
- author = from;
68
- chatId = from;
23
+ catch (error) {
24
+ logger.warn({ sender, senderAlt, error }, "Failed to store LID mapping");
69
25
  }
70
- else if ((0, WABinary_1.isJidBroadcast)(from)) {
71
- if (!participant) {
72
- throw new boom_1.Boom('No participant in group message');
73
- }
74
- const isParticipantMe = isMe(participant);
75
- if ((0, WABinary_1.isJidStatusBroadcast)(from)) {
76
- msgType = isParticipantMe ? 'direct_peer_status' : 'other_status';
77
- }
78
- else {
79
- msgType = isParticipantMe ? 'peer_broadcast' : 'other_broadcast';
80
- }
81
- chatId = from;
82
- author = participant;
26
+ }
27
+ };
28
+ //=======================================================//
29
+ export const NO_MESSAGE_FOUND_ERROR_TEXT = "Message absent from node";
30
+ export const MISSING_KEYS_ERROR_TEXT = "Key used already or never filled";
31
+ //=======================================================//
32
+ export const DECRYPTION_RETRY_CONFIG = {
33
+ maxRetries: 3,
34
+ baseDelayMs: 100,
35
+ sessionRecordErrors: ["No session record", "SessionError: No session record"]
36
+ };
37
+ //=======================================================//
38
+ export const NACK_REASONS = {
39
+ ParsingError: 487,
40
+ UnrecognizedStanza: 488,
41
+ UnrecognizedStanzaClass: 489,
42
+ UnrecognizedStanzaType: 490,
43
+ InvalidProtobuf: 491,
44
+ InvalidHostedCompanionStanza: 493,
45
+ MissingMessageSecret: 495,
46
+ SignalErrorOldCounter: 496,
47
+ MessageDeletedOnPeer: 499,
48
+ UnhandledError: 500,
49
+ UnsupportedAdminRevoke: 550,
50
+ UnsupportedLIDGroup: 551,
51
+ DBOperationFailed: 552
52
+ };
53
+ //=======================================================//
54
+ export const extractAddressingContext = (stanza) => {
55
+ let senderAlt;
56
+ let recipientAlt;
57
+ const sender = stanza.attrs.participant || stanza.attrs.from;
58
+ const addressingMode = stanza.attrs.addressing_mode || (sender?.endsWith("lid") ? "lid" : "pn");
59
+ if (addressingMode === "lid") {
60
+ senderAlt = stanza.attrs.participant_pn || stanza.attrs.sender_pn || stanza.attrs.peer_recipient_pn;
61
+ recipientAlt = stanza.attrs.recipient_pn;
62
+ }
63
+ else {
64
+ senderAlt = stanza.attrs.participant_lid || stanza.attrs.sender_lid || stanza.attrs.peer_recipient_lid;
65
+ recipientAlt = stanza.attrs.recipient_lid;
66
+ }
67
+ return {
68
+ addressingMode,
69
+ senderAlt,
70
+ recipientAlt
71
+ };
72
+ };
73
+ //=======================================================//
74
+ export function decodeMessageNode(stanza, meId, meLid) {
75
+ let msgType;
76
+ let chatId;
77
+ let author;
78
+ let fromMe = false;
79
+ const msgId = stanza.attrs.id;
80
+ const from = stanza.attrs.from;
81
+ const participant = stanza.attrs.participant;
82
+ const recipient = stanza.attrs.recipient;
83
+ const addressingContext = extractAddressingContext(stanza);
84
+ const isMe = (jid) => areJidsSameUser(jid, meId);
85
+ const isMeLid = (jid) => areJidsSameUser(jid, meLid);
86
+ if (isPnUser(from) || isLidUser(from) || isHostedLidUser(from) || isHostedPnUser(from)) {
87
+ if (recipient && !isJidMetaAI(recipient)) {
88
+ if (!isMe(from) && !isMeLid(from)) {
89
+ throw new Boom("receipient present, but msg not from me", { data: stanza });
90
+ }
91
+ if (isMe(from) || isMeLid(from)) {
92
+ fromMe = true;
93
+ }
94
+ chatId = recipient;
83
95
  }
84
96
  else {
85
- throw new boom_1.Boom('Unknown message type', { data: stanza });
97
+ chatId = from;
98
+ }
99
+ msgType = "chat";
100
+ author = from;
101
+ }
102
+ else if (isJidGroup(from)) {
103
+ if (!participant) {
104
+ throw new Boom("No participant in group message");
105
+ }
106
+ if (isMe(participant) || isMeLid(participant)) {
107
+ fromMe = true;
108
+ }
109
+ msgType = "group";
110
+ author = participant;
111
+ chatId = from;
112
+ }
113
+ else if (isJidBroadcast(from)) {
114
+ if (!participant) {
115
+ throw new Boom("No participant in group message");
116
+ }
117
+ const isParticipantMe = isMe(participant);
118
+ if (isJidStatusBroadcast(from)) {
119
+ msgType = isParticipantMe ? "direct_peer_status" : "other_status";
86
120
  }
87
- const fromMe = (0, WABinary_1.isJidNewsletter)(from) ? !!((_d = stanza.attrs) === null || _d === void 0 ? void 0 : _d.is_sender) || false : ((0, WABinary_1.isLidUser)(from) ? isMeLid : isMe)(stanza.attrs.participant || stanza.attrs.from);
88
- const pushname = (_e = stanza === null || stanza === void 0 ? void 0 : stanza.attrs) === null || _e === void 0 ? void 0 : _e.notify;
89
- const key = {
90
- remoteJid: chatId,
91
- fromMe,
92
- id: msgId,
93
- senderPn,
94
- senderLid,
95
- participant,
96
- participantLid,
97
- 'server_id': (_f = stanza.attrs) === null || _f === void 0 ? void 0 : _f.server_id
98
- };
99
- const fullMessage = {
100
- key,
101
- messageTimestamp: +stanza.attrs.t,
102
- pushName: pushname,
103
- broadcast: (0, WABinary_1.isJidBroadcast)(from)
104
- };
105
- if (msgType === 'newsletter') {
106
- fullMessage.newsletterServerId = +((_g = stanza.attrs) === null || _g === void 0 ? void 0 : _g.server_id);
121
+ else {
122
+ msgType = isParticipantMe ? "peer_broadcast" : "other_broadcast";
107
123
  }
108
- if (key.fromMe) {
109
- fullMessage.status = WAProto_1.proto.WebMessageInfo.Status.SERVER_ACK;
124
+ fromMe = isParticipantMe;
125
+ chatId = from;
126
+ author = participant;
127
+ }
128
+ else if (isJidNewsletter(from)) {
129
+ msgType = "newsletter";
130
+ chatId = from;
131
+ author = from;
132
+ if (isMe(from) || isMeLid(from)) {
133
+ fromMe = true;
110
134
  }
111
- return {
112
- fullMessage,
113
- author,
114
- sender: msgType === 'chat' ? author : chatId
115
- };
135
+ }
136
+ else {
137
+ throw new Boom("Unknown message type", { data: stanza });
138
+ }
139
+ const pushname = stanza?.attrs?.notify;
140
+ const key = {
141
+ remoteJid: chatId,
142
+ remoteJidAlt: !isJidGroup(chatId) ? addressingContext.senderAlt : undefined,
143
+ fromMe,
144
+ id: msgId,
145
+ participant,
146
+ participantAlt: isJidGroup(chatId) ? addressingContext.senderAlt : undefined,
147
+ addressingMode: addressingContext.addressingMode,
148
+ ...(msgType === "newsletter" && stanza.attrs.server_id ? { server_id: stanza.attrs.server_id } : {})
149
+ };
150
+ const fullMessage = {
151
+ key,
152
+ messageTimestamp: +stanza.attrs.t,
153
+ pushName: pushname,
154
+ broadcast: isJidBroadcast(from)
155
+ };
156
+ if (key.fromMe) {
157
+ fullMessage.status = proto.WebMessageInfo.Status.SERVER_ACK;
158
+ }
159
+ return {
160
+ fullMessage,
161
+ author,
162
+ sender: msgType === "chat" ? author : chatId
163
+ };
116
164
  }
117
- const decryptMessageNode = (stanza, meId, meLid, repository, logger) => {
118
- const { fullMessage, author, sender } = decodeMessageNode(stanza, meId, meLid);
119
- return {
120
- fullMessage,
121
- category: stanza.attrs.category,
122
- author,
123
- async decrypt() {
124
- var _a;
125
- let decryptables = 0;
126
- if (Array.isArray(stanza.content)) {
127
- for (const { tag, attrs, content } of stanza.content) {
128
- if (tag === 'verified_name' && content instanceof Uint8Array) {
129
- const cert = WAProto_1.proto.VerifiedNameCertificate.decode(content);
130
- const details = WAProto_1.proto.VerifiedNameCertificate.Details.decode(cert.details);
131
- fullMessage.verifiedBizName = details.verifiedName;
132
- }
133
- if (tag === 'unavailable' && attrs.type === 'view_once') {
134
- fullMessage.key.isViewOnce = true;
135
- }
136
- if (tag !== 'enc' && tag !== 'plaintext') {
137
- continue;
138
- }
139
- if (!(content instanceof Uint8Array)) {
140
- continue;
141
- }
142
- decryptables += 1;
143
- let msgBuffer;
144
- try {
145
- const e2eType = tag === 'plaintext' ? 'plaintext' : attrs.type;
146
- switch (e2eType) {
147
- case 'skmsg':
148
- msgBuffer = await repository.decryptGroupMessage({
149
- group: sender,
150
- authorJid: author,
151
- msg: content
152
- });
153
- break;
154
- case 'pkmsg':
155
- case 'msg':
156
- const user = (0, WABinary_1.isJidUser)(sender) ? sender : author;
157
- msgBuffer = await repository.decryptMessage({
158
- jid: user,
159
- type: e2eType,
160
- ciphertext: content
161
- });
162
- break;
163
- case 'plaintext':
164
- msgBuffer = content;
165
- break;
166
- case undefined:
167
- msgBuffer = content;
168
- break;
169
- default:
170
- throw new Error(`Unknown e2e type: ${e2eType}`);
171
- }
172
- let msg = WAProto_1.proto.Message.decode(e2eType !== 'plaintext' ? (0, generics_1.unpadRandomMax16)(msgBuffer) : msgBuffer);
173
- msg = ((_a = msg === null || msg === void 0 ? void 0 : msg.deviceSentMessage) === null || _a === void 0 ? void 0 : _a.message) || msg;
174
- if (msg.senderKeyDistributionMessage) {
175
- try {
176
- await repository.processSenderKeyDistributionMessage({
177
- authorJid: author,
178
- item: msg.senderKeyDistributionMessage
179
- });
180
- }
181
- catch (err) {
182
- logger.error({ key: fullMessage.key, err }, 'failed to decrypt message');
183
- }
184
- }
185
- if (fullMessage.message) {
186
- Object.assign(fullMessage.message, msg);
187
- }
188
- else {
189
- fullMessage.message = msg;
190
- }
191
- }
192
- catch (err) {
193
- logger.error({ key: fullMessage.key, err }, 'failed to decrypt message');
194
- fullMessage.messageStubType = WAProto_1.proto.WebMessageInfo.StubType.CIPHERTEXT;
195
- fullMessage.messageStubParameters = [err.message];
196
- }
197
- }
165
+ //=======================================================//
166
+ export const decryptMessageNode = (stanza, meId, meLid, repository, logger) => {
167
+ const { fullMessage, author, sender } = decodeMessageNode(stanza, meId, meLid);
168
+ return {
169
+ fullMessage,
170
+ category: stanza.attrs.category,
171
+ author,
172
+ async decrypt() {
173
+ let decryptables = 0;
174
+ if (Array.isArray(stanza.content)) {
175
+ for (const { tag, attrs, content } of stanza.content) {
176
+ if (tag === "verified_name" && content instanceof Uint8Array) {
177
+ const cert = proto.VerifiedNameCertificate.decode(content);
178
+ const details = proto.VerifiedNameCertificate.Details.decode(cert.details);
179
+ fullMessage.verifiedBizName = details.verifiedName;
180
+ }
181
+ if (tag === "unavailable" && attrs.type === "view_once") {
182
+ fullMessage.key.isViewOnce = true;
183
+ }
184
+ if (tag !== "enc" && tag !== "plaintext") {
185
+ continue;
186
+ }
187
+ if (!(content instanceof Uint8Array)) {
188
+ continue;
189
+ }
190
+ decryptables += 1;
191
+ let msgBuffer;
192
+ const decryptionJid = await getDecryptionJid(author, repository);
193
+ if (tag !== "plaintext") {
194
+ await storeMappingFromEnvelope(stanza, author, repository, decryptionJid, logger);
195
+ }
196
+ try {
197
+ const e2eType = tag === "plaintext" ? "plaintext" : attrs.type;
198
+ switch (e2eType) {
199
+ case "skmsg":
200
+ msgBuffer = await repository.decryptGroupMessage({
201
+ group: sender,
202
+ authorJid: author,
203
+ msg: content
204
+ });
205
+ break;
206
+ case "pkmsg":
207
+ case "msg":
208
+ msgBuffer = await repository.decryptMessage({
209
+ jid: decryptionJid,
210
+ type: e2eType,
211
+ ciphertext: content
212
+ });
213
+ break;
214
+ case "plaintext":
215
+ msgBuffer = content;
216
+ break;
217
+ default:
218
+ throw new Error(`Unknown e2e type: ${e2eType}`);
219
+ }
220
+ let msg = proto.Message.decode(e2eType !== "plaintext" ? unpadRandomMax16(msgBuffer) : msgBuffer);
221
+ msg = msg.deviceSentMessage?.message || msg;
222
+ if (msg.senderKeyDistributionMessage) {
223
+ try {
224
+ await repository.processSenderKeyDistributionMessage({
225
+ authorJid: author,
226
+ item: msg.senderKeyDistributionMessage
227
+ });
228
+ }
229
+ catch (err) {
230
+ logger.error({ key: fullMessage.key, err }, "failed to process sender key distribution message");
231
+ }
232
+ }
233
+ if (fullMessage.message) {
234
+ Object.assign(fullMessage.message, msg);
198
235
  }
199
- // if nothing was found to decrypt
200
- if (!decryptables) {
201
- fullMessage.messageStubType = WAProto_1.proto.WebMessageInfo.StubType.CIPHERTEXT;
202
- fullMessage.messageStubParameters = [exports.NO_MESSAGE_FOUND_ERROR_TEXT];
236
+ else {
237
+ fullMessage.message = msg;
203
238
  }
239
+ }
240
+ catch (err) {
241
+ const errorContext = {
242
+ key: fullMessage.key,
243
+ err,
244
+ messageType: tag === "plaintext" ? "plaintext" : attrs.type,
245
+ sender,
246
+ author,
247
+ isSessionRecordError: isSessionRecordError(err)
248
+ };
249
+ logger.error(errorContext, "failed to decrypt message");
250
+ fullMessage.messageStubType = proto.WebMessageInfo.StubType.CIPHERTEXT;
251
+ fullMessage.messageStubParameters = [err.message.toString()];
252
+ }
204
253
  }
205
- };
254
+ }
255
+ if (!decryptables) {
256
+ fullMessage.messageStubType = proto.WebMessageInfo.StubType.CIPHERTEXT;
257
+ fullMessage.messageStubParameters = [NO_MESSAGE_FOUND_ERROR_TEXT];
258
+ }
259
+ }
260
+ };
206
261
  };
207
- exports.decryptMessageNode = decryptMessageNode;
262
+ //=======================================================//
263
+ function isSessionRecordError(error) {
264
+ const errorMessage = error?.message || error?.toString() || "";
265
+ return DECRYPTION_RETRY_CONFIG.sessionRecordErrors.some(errorPattern => errorMessage.includes(errorPattern));
266
+ }
267
+ //=======================================================//