@badzz88/baileys 8.5.6 → 8.5.8

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 (225) hide show
  1. package/README.md +337 -1055
  2. package/WAProto/WAProto.proto +28 -1189
  3. package/WAProto/fix-imports.js +79 -69
  4. package/WAProto/index.d.ts +71491 -15254
  5. package/WAProto/index.js +126436 -19814
  6. package/engine-requirements.js +8 -15
  7. package/lib/Defaults/index.js +130 -0
  8. package/{src → lib}/Signal/Group/ciphertext-message.js +2 -5
  9. package/lib/Signal/Group/group-session-builder.js +30 -0
  10. package/{src → lib}/Signal/Group/group_cipher.js +11 -11
  11. package/lib/Signal/Group/index.js +12 -0
  12. package/lib/Signal/Group/keyhelper.js +18 -0
  13. package/{src → lib}/Signal/Group/sender-chain-key.js +6 -9
  14. package/{src → lib}/Signal/Group/sender-key-distribution-message.js +6 -9
  15. package/{src → lib}/Signal/Group/sender-key-message.js +9 -12
  16. package/{src → lib}/Signal/Group/sender-key-name.js +2 -5
  17. package/{src → lib}/Signal/Group/sender-key-record.js +8 -11
  18. package/{src → lib}/Signal/Group/sender-key-state.js +6 -9
  19. package/lib/Signal/Group/sender-message-key.js +26 -0
  20. package/{src → lib}/Signal/libsignal.js +131 -155
  21. package/{src → lib}/Signal/lid-mapping.js +27 -23
  22. package/lib/Socket/Client/index.js +3 -0
  23. package/lib/Socket/Client/types.js +11 -0
  24. package/{src → lib}/Socket/Client/websocket.js +11 -18
  25. package/{src → lib}/Socket/business.js +35 -67
  26. package/{src → lib}/Socket/chats.js +294 -550
  27. package/{src → lib}/Socket/communities.js +82 -114
  28. package/lib/Socket/graphql.js +716 -0
  29. package/lib/Socket/groups.js +374 -0
  30. package/lib/Socket/index.js +18 -0
  31. package/lib/Socket/interop.js +463 -0
  32. package/{src → lib}/Socket/luxu.js +120 -82
  33. package/lib/Socket/messages-recv.js +1916 -0
  34. package/lib/Socket/messages-send.js +1436 -0
  35. package/lib/Socket/mex.js +54 -0
  36. package/lib/Socket/newsletter.js +757 -0
  37. package/lib/Socket/privacy.js +318 -0
  38. package/{src → lib}/Socket/socket.js +356 -244
  39. package/lib/Socket/username.js +236 -0
  40. package/lib/Store/index.js +10 -0
  41. package/{src → lib}/Store/keyed-db.js +11 -21
  42. package/lib/Store/make-cache-manager-store.js +85 -0
  43. package/lib/Store/make-in-memory-store.js +244 -0
  44. package/{src → lib}/Store/make-ordered-dictionary.js +19 -25
  45. package/{src → lib}/Store/object-repository.js +11 -5
  46. package/lib/Types/Auth.js +2 -0
  47. package/lib/Types/Bussines.js +2 -0
  48. package/lib/Types/Call.js +2 -0
  49. package/lib/Types/Chat.js +8 -0
  50. package/lib/Types/Contact.js +2 -0
  51. package/lib/Types/Events.js +2 -0
  52. package/lib/Types/GroupMetadata.js +2 -0
  53. package/lib/Types/Label.js +25 -0
  54. package/lib/Types/LabelAssociation.js +7 -0
  55. package/lib/Types/Message.js +11 -0
  56. package/lib/Types/Mex.js +111 -0
  57. package/lib/Types/Product.js +2 -0
  58. package/lib/Types/Signal.js +2 -0
  59. package/lib/Types/Socket.js +3 -0
  60. package/lib/Types/State.js +56 -0
  61. package/lib/Types/USync.js +2 -0
  62. package/lib/Types/index.js +26 -0
  63. package/{src → lib}/Utils/auth-utils.js +91 -43
  64. package/lib/Utils/browser-utils.js +48 -0
  65. package/lib/Utils/business.js +231 -0
  66. package/lib/Utils/chat-utils.js +872 -0
  67. package/lib/Utils/companion-reg-client-utils.js +35 -0
  68. package/lib/Utils/crypto.js +118 -0
  69. package/lib/Utils/decode-wa-message.js +350 -0
  70. package/{src → lib}/Utils/event-buffer.js +81 -39
  71. package/lib/Utils/generics.js +403 -0
  72. package/lib/Utils/history.js +134 -0
  73. package/{src → lib}/Utils/identity-change-handler.js +9 -11
  74. package/lib/Utils/index.js +23 -0
  75. package/lib/Utils/link-preview.js +85 -0
  76. package/lib/Utils/logger.js +3 -0
  77. package/lib/Utils/lt-hash.js +8 -0
  78. package/{src → lib}/Utils/make-mutex.js +7 -10
  79. package/lib/Utils/message-composer.js +273 -0
  80. package/{src → lib}/Utils/message-retry-manager.js +76 -28
  81. package/lib/Utils/messages-media.js +870 -0
  82. package/lib/Utils/messages.js +1337 -0
  83. package/lib/Utils/noise-handler.js +201 -0
  84. package/{src → lib}/Utils/offline-node-processor.js +10 -4
  85. package/{src → lib}/Utils/pre-key-manager.js +27 -11
  86. package/lib/Utils/process-message.js +630 -0
  87. package/{src → lib}/Utils/reporting-utils.js +12 -15
  88. package/lib/Utils/signal.js +201 -0
  89. package/{src → lib}/Utils/stanza-ack.js +12 -4
  90. package/lib/Utils/sticker.js +110 -0
  91. package/{src → lib}/Utils/sync-action-utils.js +14 -10
  92. package/{src → lib}/Utils/tc-token-utils.js +48 -43
  93. package/{src → lib}/Utils/use-multi-file-auth-state.js +35 -25
  94. package/lib/Utils/validate-connection.js +203 -0
  95. package/{src → lib}/WABinary/constants.js +9 -12
  96. package/{src → lib}/WABinary/decode.js +38 -118
  97. package/{src → lib}/WABinary/encode.js +6 -11
  98. package/lib/WABinary/generic-utils.js +204 -0
  99. package/lib/WABinary/index.js +6 -0
  100. package/lib/WABinary/jid-utils.js +98 -0
  101. package/lib/WABinary/types.js +2 -0
  102. package/{src → lib}/WAM/BinaryInfo.js +2 -5
  103. package/{src → lib}/WAM/constants.js +4 -16635
  104. package/{src → lib}/WAM/encode.js +18 -17
  105. package/lib/WAM/index.js +4 -0
  106. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +53 -0
  107. package/lib/WAUSync/Protocols/USyncBusinessProtocol.js +43 -0
  108. package/lib/WAUSync/Protocols/USyncContactProtocol.js +54 -0
  109. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  110. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  111. package/lib/WAUSync/Protocols/USyncFeatureProtocol.js +58 -0
  112. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +30 -0
  113. package/lib/WAUSync/Protocols/USyncPictureProtocol.js +32 -0
  114. package/lib/WAUSync/Protocols/USyncSidelistProtocol.js +28 -0
  115. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +39 -0
  116. package/lib/WAUSync/Protocols/USyncTextStatusProtocol.js +38 -0
  117. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +27 -0
  118. package/lib/WAUSync/Protocols/index.js +12 -0
  119. package/lib/WAUSync/USyncQuery.js +151 -0
  120. package/lib/WAUSync/USyncUser.js +56 -0
  121. package/lib/WAUSync/index.js +3 -0
  122. package/{src → lib}/index.js +16 -51
  123. package/package.json +129 -99
  124. package/LICENSE +0 -21
  125. package/src/Defaults/index.js +0 -186
  126. package/src/Defaults/phonenumber-mcc.json +0 -223
  127. package/src/Signal/Group/group-session-builder.js +0 -86
  128. package/src/Signal/Group/index.js +0 -140
  129. package/src/Signal/Group/keyhelper.js +0 -77
  130. package/src/Signal/Group/sender-message-key.js +0 -29
  131. package/src/Socket/Client/index.js +0 -31
  132. package/src/Socket/Client/types.js +0 -13
  133. package/src/Socket/aigroups.js +0 -221
  134. package/src/Socket/graphql.js +0 -523
  135. package/src/Socket/groups.js +0 -516
  136. package/src/Socket/index.js +0 -31
  137. package/src/Socket/interactive-handler.js +0 -527
  138. package/src/Socket/interop.js +0 -339
  139. package/src/Socket/managed-account.js +0 -98
  140. package/src/Socket/messages-recv.js +0 -2685
  141. package/src/Socket/messages-send.js +0 -2047
  142. package/src/Socket/mex.js +0 -57
  143. package/src/Socket/newsletter.js +0 -455
  144. package/src/Socket/privacy.js +0 -125
  145. package/src/Socket/registration.js +0 -236
  146. package/src/Socket/text-router.js +0 -65
  147. package/src/Socket/username.js +0 -130
  148. package/src/Store/index.js +0 -33
  149. package/src/Store/make-cache-manager-store.js +0 -84
  150. package/src/Store/make-in-memory-store.js +0 -551
  151. package/src/Types/Auth.js +0 -31
  152. package/src/Types/Bussines.js +0 -2
  153. package/src/Types/Call.js +0 -2
  154. package/src/Types/Chat.js +0 -4
  155. package/src/Types/Contact.js +0 -2
  156. package/src/Types/Events.js +0 -2
  157. package/src/Types/GroupMetadata.js +0 -2
  158. package/src/Types/Label.js +0 -26
  159. package/src/Types/LabelAssociation.js +0 -8
  160. package/src/Types/Message.js +0 -93
  161. package/src/Types/Mex.js +0 -112
  162. package/src/Types/Newsletter.js +0 -109
  163. package/src/Types/Product.js +0 -2
  164. package/src/Types/Signal.js +0 -2
  165. package/src/Types/Socket.js +0 -2
  166. package/src/Types/State.js +0 -62
  167. package/src/Types/USync.js +0 -2
  168. package/src/Types/index.js +0 -56
  169. package/src/Utils/browser-utils.js +0 -112
  170. package/src/Utils/business.js +0 -240
  171. package/src/Utils/chat-utils.js +0 -1230
  172. package/src/Utils/command-loader.d.ts +0 -27
  173. package/src/Utils/command-loader.js +0 -89
  174. package/src/Utils/companion-reg-client-utils.js +0 -40
  175. package/src/Utils/consumer-application.js +0 -105
  176. package/src/Utils/crypto.js +0 -118
  177. package/src/Utils/curve25519-js.js +0 -242
  178. package/src/Utils/decode-wa-message.js +0 -529
  179. package/src/Utils/generics.js +0 -483
  180. package/src/Utils/group-history.js +0 -44
  181. package/src/Utils/history.js +0 -232
  182. package/src/Utils/index.js +0 -58
  183. package/src/Utils/jid-display-normalization.js +0 -195
  184. package/src/Utils/link-preview.js +0 -135
  185. package/src/Utils/logger.js +0 -8
  186. package/src/Utils/lt-hash.js +0 -25
  187. package/src/Utils/message-composer.js +0 -471
  188. package/src/Utils/messages-media.js +0 -843
  189. package/src/Utils/messages.js +0 -2817
  190. package/src/Utils/meta-ai-msmsg.js +0 -222
  191. package/src/Utils/native-bridge.js +0 -68
  192. package/src/Utils/noise-handler.js +0 -169
  193. package/src/Utils/process-message.js +0 -950
  194. package/src/Utils/session-pool.d.ts +0 -14
  195. package/src/Utils/session-pool.js +0 -70
  196. package/src/Utils/signal.js +0 -217
  197. package/src/Utils/sticker.d.ts +0 -13
  198. package/src/Utils/sticker.js +0 -123
  199. package/src/Utils/validate-connection.js +0 -209
  200. package/src/Utils/view-once-cache.d.ts +0 -12
  201. package/src/Utils/view-once-cache.js +0 -63
  202. package/src/Utils/voip-rekey.js +0 -22
  203. package/src/WABinary/generic-utils.js +0 -238
  204. package/src/WABinary/index.js +0 -34
  205. package/src/WABinary/jid-utils.js +0 -351
  206. package/src/WABinary/types.js +0 -2
  207. package/src/WAM/index.js +0 -32
  208. package/src/WAUSync/Protocols/USyncBotProfileProtocol.js +0 -53
  209. package/src/WAUSync/Protocols/USyncBusinessProtocol.js +0 -44
  210. package/src/WAUSync/Protocols/USyncContactProtocol.js +0 -55
  211. package/src/WAUSync/Protocols/USyncDeviceProtocol.js +0 -55
  212. package/src/WAUSync/Protocols/USyncDisappearingModeProtocol.js +0 -31
  213. package/src/WAUSync/Protocols/USyncFeatureProtocol.js +0 -54
  214. package/src/WAUSync/Protocols/USyncLIDProtocol.js +0 -32
  215. package/src/WAUSync/Protocols/USyncNewsletterProtocol.js +0 -473
  216. package/src/WAUSync/Protocols/USyncPictureProtocol.js +0 -34
  217. package/src/WAUSync/Protocols/USyncSidelistProtocol.js +0 -29
  218. package/src/WAUSync/Protocols/USyncStatusProtocol.js +0 -42
  219. package/src/WAUSync/Protocols/USyncTextStatusProtocol.js +0 -38
  220. package/src/WAUSync/Protocols/USyncUsernameProtocol.js +0 -28
  221. package/src/WAUSync/Protocols/index.js +0 -40
  222. package/src/WAUSync/USyncQuery.js +0 -126
  223. package/src/WAUSync/USyncUser.js +0 -50
  224. package/src/WAUSync/index.js +0 -32
  225. package/src/antiban.js +0 -4152
@@ -1,222 +0,0 @@
1
- 'use strict';
2
- const Crypto_1 = require('./crypto');
3
- const { proto } = require('../../WAProto');
4
- const BOT_MESSAGE_INFO = 'Bot Message';
5
- const KEY_LENGTH = 32;
6
- const AUTH_TAG_LENGTH = 16;
7
- const MSG_ID_HEX_RE = /^[0-9A-Fa-f]{32}$/;
8
- const unpadRandomMax16 = value => {
9
- const bytes = new Uint8Array(value);
10
- if (!bytes.length) {
11
- throw new Error('unpadPkcs7 given empty bytes');
12
- }
13
- const padLength = bytes[bytes.length - 1];
14
- if (padLength > bytes.length) {
15
- throw new Error(`unpad given ${bytes.length} bytes, but pad is ${padLength}`);
16
- }
17
- return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.length - padLength);
18
- };
19
- const toBuffer = value => {
20
- if (Buffer.isBuffer(value)) {
21
- return value;
22
- }
23
- if (value instanceof Uint8Array) {
24
- return Buffer.from(value.buffer, value.byteOffset, value.byteLength);
25
- }
26
- return Buffer.from(value);
27
- };
28
- const normalizeLidJid = jid => {
29
- if (!jid || !jid.endsWith('@lid') || !jid.includes(':')) {
30
- return jid;
31
- }
32
- return `${jid.split(':')[0]}@lid`;
33
- };
34
- const buildMessageIdRepresentations = messageId => {
35
- const ascii = Buffer.from(messageId);
36
- const binary = MSG_ID_HEX_RE.test(messageId) ? Buffer.from(messageId, 'hex') : ascii;
37
- return [
38
- { label: 'msgIdAscii', value: ascii },
39
- ...(binary.equals(ascii) ? [] : [{ label: 'msgIdBinary', value: binary }])
40
- ];
41
- };
42
- const pushUnique = (items, seen, item) => {
43
- const key = JSON.stringify([
44
- item.messageId,
45
- item.idSource,
46
- item.idSources,
47
- item.infoSource,
48
- item.aadSource,
49
- item.info.toString('hex'),
50
- item.aad.toString('hex')
51
- ]);
52
- if (!seen.has(key)) {
53
- seen.add(key);
54
- items.push(item);
55
- }
56
- };
57
- const getCandidateIds = messageKey => {
58
- const orderedCandidates = [
59
- messageKey?.botType === 'full'
60
- ? { source: 'stanzaId', messageId: messageKey?.stanzaId }
61
- : { source: 'botEditTargetId', messageId: messageKey?.botEditTargetId },
62
- { source: 'targetId', messageId: messageKey?.targetId },
63
- { source: 'metaTargetId', messageId: messageKey?.metaTargetId },
64
- { source: 'stanzaId', messageId: messageKey?.stanzaId }
65
- ];
66
- const targetIdCandidates = Array.isArray(messageKey?.targetIdCandidates) ? messageKey.targetIdCandidates : [];
67
- for (let index = 0; index < targetIdCandidates.length; index += 1) {
68
- orderedCandidates.push({
69
- source: `targetIdCandidates[${index}]`,
70
- messageId: targetIdCandidates[index]
71
- });
72
- }
73
- const grouped = new Map();
74
- for (const candidate of orderedCandidates) {
75
- if (!candidate.messageId) {
76
- continue;
77
- }
78
- const messageId = String(candidate.messageId);
79
- const existing = grouped.get(messageId);
80
- if (existing) {
81
- if (!existing.idSources.includes(candidate.source)) {
82
- existing.idSources.push(candidate.source);
83
- }
84
- }
85
- else {
86
- grouped.set(messageId, {
87
- messageId,
88
- idSource: candidate.source,
89
- idSources: [candidate.source]
90
- });
91
- }
92
- }
93
- return Array.from(grouped.values());
94
- };
95
- const getJidCandidates = messageKey => {
96
- const ordered = [
97
- { source: 'meId', jid: messageKey?.meId },
98
- { source: 'conversationJid', jid: messageKey?.conversationJid },
99
- { source: 'senderJid', jid: messageKey?.senderJid },
100
- { source: 'meLidNormalized', jid: normalizeLidJid(messageKey?.meLid) }
101
- ];
102
- const seen = new Set();
103
- const candidates = [];
104
- for (const candidate of ordered) {
105
- if (!candidate.jid) {
106
- continue;
107
- }
108
- const jid = String(candidate.jid);
109
- if (!seen.has(jid)) {
110
- seen.add(jid);
111
- candidates.push({ source: candidate.source, jid, value: Buffer.from(jid) });
112
- }
113
- }
114
- return candidates;
115
- };
116
- const buildMsmsgDecryptionStrategies = messageKey => {
117
- const botJid = String(messageKey?.participant || '');
118
- const botJidBuffer = Buffer.from(botJid);
119
- const targetIds = getCandidateIds(messageKey);
120
- const jidCandidates = getJidCandidates(messageKey);
121
- const primaryJid = jidCandidates[0];
122
- const alternateJid = jidCandidates.find(candidate => candidate.source !== primaryJid?.source && candidate.jid !== botJid);
123
- const strategies = [];
124
- const seen = new Set();
125
- for (const idCandidate of targetIds) {
126
- const idForms = buildMessageIdRepresentations(idCandidate.messageId);
127
- for (const idForm of idForms) {
128
- pushUnique(strategies, seen, {
129
- mode: '2step',
130
- idSource: idCandidate.idSource,
131
- idSources: idCandidate.idSources,
132
- infoSource: `${idForm.label}+meId+botJid`,
133
- aadSource: `${idForm.label}+0+botJid`,
134
- authTagLayout: 'trailing',
135
- messageId: idCandidate.messageId,
136
- info: Buffer.concat([idForm.value, primaryJid.value, botJidBuffer, Buffer.alloc(0)]),
137
- aad: Buffer.concat([idForm.value, Buffer.from([0]), botJidBuffer]),
138
- attemptLabel: `${idCandidate.idSource}:${idForm.label}:primary`
139
- });
140
- if (alternateJid) {
141
- pushUnique(strategies, seen, {
142
- mode: '2step',
143
- idSource: idCandidate.idSource,
144
- idSources: idCandidate.idSources,
145
- infoSource: `${idForm.label}+${alternateJid.source}+botJid`,
146
- aadSource: `${idForm.label}+0+${alternateJid.source}`,
147
- authTagLayout: 'trailing',
148
- messageId: idCandidate.messageId,
149
- info: Buffer.concat([idForm.value, alternateJid.value, botJidBuffer, Buffer.alloc(0)]),
150
- aad: Buffer.concat([idForm.value, Buffer.from([0]), alternateJid.value]),
151
- attemptLabel: `${idCandidate.idSource}:${idForm.label}:${alternateJid.source}`
152
- });
153
- }
154
- }
155
- }
156
- return strategies.slice(0, 12);
157
- };
158
- const assertRequired = (value, label) => {
159
- if (!value ||
160
- (Buffer.isBuffer(value) && value.length === 0) ||
161
- (value instanceof Uint8Array && value.byteLength === 0)) {
162
- throw new Error(`Missing required ${label} for msmsg decryption`);
163
- }
164
- };
165
- const decryptWithStrategy = (messageSecret, msMsg, strategy) => {
166
- const baseSecret = Buffer.from(Crypto_1.hkdf(toBuffer(messageSecret), KEY_LENGTH, { info: BOT_MESSAGE_INFO }));
167
- const key = Buffer.from(Crypto_1.hkdf(baseSecret, KEY_LENGTH, { info: strategy.info }));
168
- const payload = toBuffer(msMsg.encPayload);
169
- const ciphertextWithTag = Buffer.concat([payload.slice(0, -AUTH_TAG_LENGTH), payload.slice(-AUTH_TAG_LENGTH)]);
170
- return Buffer.from(Crypto_1.aesDecryptGCM(ciphertextWithTag, key, toBuffer(msMsg.encIv), strategy.aad));
171
- };
172
- const decodeDecryptedMsmsgMessage = decrypted => {
173
- const messageBuffer = toBuffer(decrypted);
174
- try {
175
- const unpadded = Buffer.from(unpadRandomMax16(messageBuffer));
176
- const decoded = proto.Message.decode(unpadded);
177
- const hasContent = Object.keys(decoded).some(key => key !== 'messageContextInfo' && decoded[key] != null);
178
- if (hasContent) {
179
- return decoded;
180
- }
181
- }
182
- catch { }
183
- return proto.Message.decode(messageBuffer);
184
- };
185
- const decryptMsmsgBotMessage = async (messageSecret, messageKey, msMsg) => {
186
- assertRequired(messageSecret, 'messageSecret');
187
- assertRequired(messageKey?.participant, 'participant');
188
- assertRequired(messageKey?.meId, 'meId');
189
- assertRequired(msMsg?.encIv, 'encIv');
190
- assertRequired(msMsg?.encPayload, 'encPayload');
191
- if (getCandidateIds(messageKey).length === 0) {
192
- throw new Error('Missing required target message id for msmsg decryption');
193
- }
194
- const strategies = buildMsmsgDecryptionStrategies(messageKey);
195
- const attemptedStrategies = [];
196
- let lastError;
197
- for (const strategy of strategies) {
198
- const attempt = {
199
- idSource: strategy.idSource,
200
- idSources: strategy.idSources,
201
- infoSource: strategy.infoSource,
202
- aadSource: strategy.aadSource,
203
- messageId: strategy.messageId
204
- };
205
- try {
206
- return await decryptWithStrategy(messageSecret, msMsg, strategy);
207
- }
208
- catch (error) {
209
- attemptedStrategies.push(attempt);
210
- lastError = error;
211
- }
212
- }
213
- const error = new Error('Failed to decrypt msmsg with bounded deterministic strategies');
214
- error.attemptedStrategies = attemptedStrategies;
215
- error.cause = lastError;
216
- throw error;
217
- };
218
- module.exports = {
219
- buildMsmsgDecryptionStrategies,
220
- decodeDecryptedMsmsgMessage,
221
- decryptMsmsgBotMessage
222
- };
@@ -1,68 +0,0 @@
1
- 'use strict';
2
- Object.defineProperty(exports, '__esModule', { value: true });
3
- exports.loadRustBridge = void 0;
4
- const fs = require('fs');
5
- const path = require('path');
6
- const BRIDGE_NAME = 'whatsapp-rust-bridge';
7
- let cached;
8
- let attempted = false;
9
- const findPackageDir = pkgName => {
10
- let searchPaths;
11
- try {
12
- searchPaths = require.resolve.paths(pkgName) || [];
13
- }
14
- catch {
15
- searchPaths = [];
16
- }
17
- for (const dir of searchPaths) {
18
- const candidate = path.join(dir, pkgName);
19
- if (fs.existsSync(path.join(candidate, 'package.json'))) {
20
- return candidate;
21
- }
22
- }
23
- return null;
24
- };
25
- const loadRustBridge = () => {
26
- if (attempted)
27
- return cached;
28
- attempted = true;
29
- try {
30
- cached = require(BRIDGE_NAME);
31
- return cached;
32
- }
33
- catch (error) {
34
- const recoverableCodes = new Set(['ERR_PACKAGE_PATH_NOT_EXPORTED', 'ERR_PACKAGE_IMPORT_NOT_DEFINED']);
35
- if (!recoverableCodes.has(error?.code)) {
36
- cached = null;
37
- return null;
38
- }
39
- try {
40
- const dir = findPackageDir(BRIDGE_NAME);
41
- if (!dir) {
42
- cached = null;
43
- return null;
44
- }
45
- const pkgJson = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'));
46
- const candidates = [
47
- pkgJson.main,
48
- 'index.js',
49
- 'index.node',
50
- 'dist/index.js',
51
- 'lib/index.js',
52
- 'build/index.js'
53
- ].filter(Boolean);
54
- for (const rel of candidates) {
55
- const fullPath = path.join(dir, rel);
56
- if (fs.existsSync(fullPath)) {
57
- cached = require(fullPath);
58
- return cached;
59
- }
60
- }
61
- }
62
- catch {
63
- }
64
- cached = null;
65
- return null;
66
- }
67
- };
68
- exports.loadRustBridge = loadRustBridge;
@@ -1,169 +0,0 @@
1
- 'use strict';
2
- Object.defineProperty(exports, '__esModule', { value: true });
3
- exports.makeNoiseHandler = void 0;
4
- const boom_1 = require('@hapi/boom');
5
- const index_js_1 = require('../../WAProto/index.js');
6
- const Defaults_1 = require('../Defaults');
7
- const rb = require('./native-bridge').loadRustBridge();
8
- const rustNodeToJs = node => {
9
- if (!node || typeof node !== 'object')
10
- return node;
11
- const result = { tag: node.tag, attrs: node.attrs || {} };
12
- const content = node.content;
13
- if (content === undefined || content === null) {
14
- }
15
- else if (content instanceof Uint8Array) {
16
- result.content = Buffer.from(content);
17
- }
18
- else if (typeof content === 'string') {
19
- result.content = content;
20
- }
21
- else if (Array.isArray(content)) {
22
- result.content = content.map(rustNodeToJs);
23
- }
24
- else {
25
- result.content = content;
26
- }
27
- return result;
28
- };
29
- const makeNoiseHandler = ({ keyPair: { private: privateKey, public: publicKey }, NOISE_HEADER, logger, routingInfo }) => {
30
- logger = logger.child({ class: 'ns' });
31
- if (!rb) {
32
- throw new Error('Establishing a WhatsApp connection requires the "whatsapp-rust-bridge" native module ' +
33
- '(Noise protocol handshake + session), which failed to load. Make sure it is installed: ' +
34
- 'npm install whatsapp-rust-bridge@0.5.4');
35
- }
36
- const session = new rb.NoiseSession(publicKey instanceof Uint8Array ? publicKey : new Uint8Array(publicKey), NOISE_HEADER instanceof Uint8Array ? NOISE_HEADER : new Uint8Array(NOISE_HEADER), routingInfo ? (routingInfo instanceof Uint8Array ? routingInfo : new Uint8Array(routingInfo)) : undefined);
37
- let isWaitingForTransport = false;
38
- let pendingOnFrame = null;
39
- let pendingBytes = null;
40
- const processFrames = async (onFrame) => {
41
- const frames = session.decodeFrame(new Uint8Array(0));
42
- for (let i = 0; i < frames.length; i++) {
43
- const item = frames[i];
44
- let frame;
45
- if (item instanceof Uint8Array) {
46
- frame = Buffer.from(item);
47
- }
48
- else {
49
- try {
50
- frame = rustNodeToJs(item.toJSON());
51
- }
52
- catch (decodeErr) {
53
- logger.debug({ err: decodeErr?.message }, '[noise] decode error');
54
- continue;
55
- }
56
- }
57
- if (logger.level === 'trace') {
58
- logger.trace({ msg: frame?.attrs?.id }, 'recv frame');
59
- }
60
- onFrame(frame);
61
- }
62
- };
63
- const finishInit = async () => {
64
- isWaitingForTransport = true;
65
- session.finishInit();
66
- isWaitingForTransport = false;
67
- logger.trace('Noise handler transitioned to Transport state (Rust)');
68
- if (pendingOnFrame && pendingBytes) {
69
- logger.trace({ length: pendingBytes.length }, 'Flushing buffered frames after transport ready');
70
- const frames = session.decodeFrame(pendingBytes);
71
- pendingBytes = null;
72
- const cb = pendingOnFrame;
73
- pendingOnFrame = null;
74
- for (let i = 0; i < frames.length; i++) {
75
- const item = frames[i];
76
- let frame;
77
- if (item instanceof Uint8Array) {
78
- frame = Buffer.from(item);
79
- }
80
- else {
81
- try {
82
- frame = rustNodeToJs(item.toJSON());
83
- }
84
- catch (e) {
85
- continue;
86
- }
87
- }
88
- cb(frame);
89
- }
90
- }
91
- };
92
- return {
93
- encrypt: plaintext => {
94
- const u8 = plaintext instanceof Uint8Array ? plaintext : new Uint8Array(plaintext);
95
- return Buffer.from(session.encrypt(u8));
96
- },
97
- decrypt: ciphertext => {
98
- const u8 = ciphertext instanceof Uint8Array ? ciphertext : new Uint8Array(ciphertext);
99
- return Buffer.from(session.decrypt(u8));
100
- },
101
- authenticate: data => {
102
- session.authenticate(data instanceof Uint8Array ? data : new Uint8Array(data));
103
- },
104
- mixIntoKey: data => {
105
- session.mixIntoKey(data instanceof Uint8Array ? data : new Uint8Array(data));
106
- },
107
- finishInit,
108
- processHandshake: ({ serverHello }, noiseKey) => {
109
- const certPayload = session.processHandshakeInit(serverHello.ephemeral, serverHello.static, serverHello.payload, privateKey instanceof Uint8Array ? privateKey : new Uint8Array(privateKey));
110
- const { intermediate: certIntermediate, leaf } = index_js_1.proto.CertChain.decode(certPayload);
111
- if (!leaf?.details || !leaf?.signature) {
112
- throw new boom_1.Boom('invalid noise leaf certificate', { statusCode: 400 });
113
- }
114
- if (!certIntermediate?.details || !certIntermediate?.signature) {
115
- throw new boom_1.Boom('invalid noise intermediate certificate', { statusCode: 400 });
116
- }
117
- const details = index_js_1.proto.CertChain.NoiseCertificate.Details.decode(certIntermediate.details);
118
- const { issuerSerial } = details;
119
- const { Curve } = require('./crypto');
120
- if (!Curve.verify(details.key, leaf.details, leaf.signature)) {
121
- throw new boom_1.Boom('noise certificate signature invalid', { statusCode: 400 });
122
- }
123
- if (!Curve.verify(Defaults_1.WA_CERT_DETAILS.PUBLIC_KEY, certIntermediate.details, certIntermediate.signature)) {
124
- throw new boom_1.Boom('noise intermediate certificate signature invalid', { statusCode: 400 });
125
- }
126
- if (issuerSerial !== Defaults_1.WA_CERT_DETAILS.SERIAL) {
127
- throw new boom_1.Boom('certification match failed', { statusCode: 400 });
128
- }
129
- const keyEnc = session.processHandshakeFinish(noiseKey.public instanceof Uint8Array ? noiseKey.public : new Uint8Array(noiseKey.public), noiseKey.private instanceof Uint8Array ? noiseKey.private : new Uint8Array(noiseKey.private), serverHello.ephemeral);
130
- return Buffer.from(keyEnc);
131
- },
132
- encodeFrame: data => {
133
- const u8 = data instanceof Uint8Array ? data : new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
134
- return Buffer.from(session.encodeFrameRaw(u8));
135
- },
136
- decodeFrame: async (newData, onFrame) => {
137
- if (isWaitingForTransport) {
138
- pendingBytes = pendingBytes
139
- ? Buffer.concat([pendingBytes, Buffer.from(newData)])
140
- : Buffer.from(newData);
141
- pendingOnFrame = onFrame;
142
- return;
143
- }
144
- const u8 = newData instanceof Uint8Array ? newData : new Uint8Array(newData.buffer, newData.byteOffset, newData.byteLength);
145
- const frames = session.decodeFrame(u8);
146
- for (let i = 0; i < frames.length; i++) {
147
- const item = frames[i];
148
- let frame;
149
- if (item instanceof Uint8Array) {
150
- frame = Buffer.from(item);
151
- }
152
- else {
153
- try {
154
- frame = rustNodeToJs(item.toJSON());
155
- }
156
- catch (decodeErr) {
157
- logger.debug({ err: decodeErr?.message }, '[noise] decode error');
158
- continue;
159
- }
160
- }
161
- if (logger.level === 'trace') {
162
- logger.trace({ msg: frame?.attrs?.id }, 'recv frame');
163
- }
164
- onFrame(frame);
165
- }
166
- }
167
- };
168
- };
169
- exports.makeNoiseHandler = makeNoiseHandler;