cuki-bailx 1.1.2 → 1.2.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.
Files changed (116) hide show
  1. package/WAProto/index.js +79296 -118676
  2. package/engine-requirements.js +1 -1
  3. package/lib/Defaults/baileys-version.json +1 -1
  4. package/lib/Defaults/index.d.ts +6 -4
  5. package/lib/Defaults/index.js +102 -78
  6. package/lib/Defaults/phonenumber-mcc.json +223 -0
  7. package/lib/Socket/Client/{types.d.ts → abstract-socket-client.d.ts} +2 -1
  8. package/lib/Socket/Client/index.d.ts +3 -2
  9. package/lib/Socket/Client/index.js +3 -2
  10. package/lib/Socket/Client/mobile-socket-client.d.ts +13 -0
  11. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  12. package/lib/Socket/Client/{websocket.d.ts → web-socket-client.d.ts} +1 -2
  13. package/lib/Socket/Client/{websocket.js → web-socket-client.js} +2 -12
  14. package/lib/Socket/business.d.ts +58 -59
  15. package/lib/Socket/chats.d.ts +27 -29
  16. package/lib/Socket/chats.js +90 -97
  17. package/lib/Socket/dugong.d.ts +219 -0
  18. package/lib/Socket/dugong.js +441 -0
  19. package/lib/Socket/groups.d.ts +32 -41
  20. package/lib/Socket/groups.js +5 -20
  21. package/lib/Socket/index.d.ts +64 -63
  22. package/lib/Socket/index.js +2 -2
  23. package/lib/Socket/messages-recv.js +65 -9
  24. package/lib/Socket/messages-send.d.ts +47 -49
  25. package/lib/Socket/messages-send.js +312 -379
  26. package/lib/Socket/newsletter.d.ts +37 -39
  27. package/lib/Socket/newsletter.js +40 -54
  28. package/lib/Socket/registration.d.ts +267 -0
  29. package/lib/Socket/registration.js +166 -0
  30. package/lib/Socket/socket.d.ts +10 -10
  31. package/lib/Socket/socket.js +32 -39
  32. package/lib/Socket/socket.js.bak +630 -0
  33. package/lib/Socket/usync.d.ts +3 -3
  34. package/lib/Store/index.d.ts +2 -1
  35. package/lib/Store/index.js +3 -1
  36. package/lib/Store/make-cache-manager-store.d.ts +13 -0
  37. package/lib/Store/make-cache-manager-store.js +83 -0
  38. package/lib/Store/make-in-memory-store.d.ts +24 -24
  39. package/lib/Store/make-in-memory-store.js +11 -13
  40. package/lib/Store/make-ordered-dictionary.d.ts +1 -1
  41. package/lib/Store/make-ordered-dictionary.js +2 -2
  42. package/lib/Types/Auth.d.ts +7 -0
  43. package/lib/Types/Call.d.ts +1 -1
  44. package/lib/Types/Chat.d.ts +7 -14
  45. package/lib/Types/Contact.d.ts +1 -5
  46. package/lib/Types/Events.d.ts +2 -44
  47. package/lib/Types/GroupMetadata.d.ts +2 -11
  48. package/lib/Types/Label.js +1 -1
  49. package/lib/Types/LabelAssociation.js +1 -1
  50. package/lib/Types/Message.d.ts +21 -148
  51. package/lib/Types/Message.js +2 -0
  52. package/lib/Types/Newsletter.d.ts +13 -0
  53. package/lib/Types/Newsletter.js +17 -3
  54. package/lib/Types/Socket.d.ts +9 -17
  55. package/lib/Types/index.d.ts +1 -8
  56. package/lib/Types/index.js +2 -2
  57. package/lib/Utils/auth-utils.d.ts +3 -3
  58. package/lib/Utils/auth-utils.js +13 -6
  59. package/lib/Utils/business.js +2 -2
  60. package/lib/Utils/chat-utils.d.ts +16 -15
  61. package/lib/Utils/chat-utils.js +35 -36
  62. package/lib/Utils/crypto.d.ts +16 -15
  63. package/lib/Utils/crypto.js +29 -71
  64. package/lib/Utils/decode-wa-message.d.ts +6 -22
  65. package/lib/Utils/decode-wa-message.js +56 -65
  66. package/lib/Utils/event-buffer.d.ts +2 -2
  67. package/lib/Utils/event-buffer.js +7 -11
  68. package/lib/Utils/generics.d.ts +20 -17
  69. package/lib/Utils/generics.js +23 -73
  70. package/lib/Utils/history.d.ts +0 -4
  71. package/lib/Utils/history.js +6 -4
  72. package/lib/Utils/link-preview.d.ts +2 -2
  73. package/lib/Utils/link-preview.js +1 -34
  74. package/lib/Utils/logger.d.ts +3 -10
  75. package/lib/Utils/lt-hash.d.ts +2 -2
  76. package/lib/Utils/lt-hash.js +6 -6
  77. package/lib/Utils/make-mutex.d.ts +2 -2
  78. package/lib/Utils/messages-media.d.ts +24 -28
  79. package/lib/Utils/messages-media.js +115 -263
  80. package/lib/Utils/messages.d.ts +10 -8
  81. package/lib/Utils/messages.js +72 -298
  82. package/lib/Utils/noise-handler.d.ts +12 -10
  83. package/lib/Utils/noise-handler.js +23 -18
  84. package/lib/Utils/process-message.d.ts +4 -5
  85. package/lib/Utils/process-message.js +23 -74
  86. package/lib/Utils/signal.d.ts +1 -2
  87. package/lib/Utils/signal.js +35 -37
  88. package/lib/Utils/use-multi-file-auth-state.d.ts +1 -0
  89. package/lib/Utils/use-multi-file-auth-state.js +6 -51
  90. package/lib/Utils/validate-connection.d.ts +4 -3
  91. package/lib/Utils/validate-connection.js +52 -20
  92. package/lib/WABinary/constants.d.ts +4 -4
  93. package/lib/WABinary/constants.js +13 -1276
  94. package/lib/WABinary/decode.d.ts +4 -3
  95. package/lib/WABinary/decode.js +13 -26
  96. package/lib/WABinary/encode.d.ts +2 -1
  97. package/lib/WABinary/encode.js +17 -39
  98. package/lib/WABinary/generic-utils.d.ts +3 -1
  99. package/lib/WABinary/generic-utils.js +85 -2
  100. package/lib/WABinary/jid-utils.d.ts +5 -10
  101. package/lib/WABinary/jid-utils.js +5 -26
  102. package/lib/WAM/BinaryInfo.d.ts +11 -2
  103. package/lib/WAM/encode.d.ts +2 -1
  104. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +1 -1
  105. package/lib/index.d.ts +2 -6
  106. package/lib/index.js +7 -21
  107. package/lib/index.js.bak +48 -0
  108. package/package.json +103 -111
  109. package/LICENSE +0 -21
  110. package/WAProto/GenerateStatics.sh +0 -4
  111. package/WAProto/WAProto.proto +0 -4775
  112. package/WAProto/index.d.ts +0 -55057
  113. package/WAProto/index.ts.ts +0 -53473
  114. package/WAProto/p.html +0 -1
  115. package/lib/WABinary/jid-utils.js.bak +0 -83
  116. /package/lib/Socket/Client/{types.js → abstract-socket-client.js} +0 -0
@@ -11,7 +11,7 @@ const generateIV = (counter) => {
11
11
  new DataView(iv).setUint32(8, counter);
12
12
  return new Uint8Array(iv);
13
13
  };
14
- const makeNoiseHandler = ({ keyPair: { private: privateKey, public: publicKey }, NOISE_HEADER, logger, routingInfo }) => {
14
+ const makeNoiseHandler = ({ keyPair: { private: privateKey, public: publicKey }, NOISE_HEADER, mobile, logger, routingInfo }) => {
15
15
  logger = logger.child({ class: 'ns' });
16
16
  const authenticate = (data) => {
17
17
  if (!isFinished) {
@@ -38,20 +38,20 @@ const makeNoiseHandler = ({ keyPair: { private: privateKey, public: publicKey },
38
38
  authenticate(ciphertext);
39
39
  return result;
40
40
  };
41
- const localHKDF = async (data) => {
42
- const key = await (0, crypto_1.hkdf)(Buffer.from(data), 64, { salt, info: '' });
41
+ const localHKDF = (data) => {
42
+ const key = (0, crypto_1.hkdf)(Buffer.from(data), 64, { salt, info: '' });
43
43
  return [key.slice(0, 32), key.slice(32)];
44
44
  };
45
- const mixIntoKey = async (data) => {
46
- const [write, read] = await localHKDF(data);
45
+ const mixIntoKey = (data) => {
46
+ const [write, read] = localHKDF(data);
47
47
  salt = write;
48
48
  encKey = read;
49
49
  decKey = read;
50
50
  readCounter = 0;
51
51
  writeCounter = 0;
52
52
  };
53
- const finishInit = async () => {
54
- const [write, read] = await localHKDF(new Uint8Array(0));
53
+ const finishInit = () => {
54
+ const [write, read] = localHKDF(new Uint8Array(0));
55
55
  encKey = write;
56
56
  decKey = read;
57
57
  hash = Buffer.from([]);
@@ -60,7 +60,7 @@ const makeNoiseHandler = ({ keyPair: { private: privateKey, public: publicKey },
60
60
  isFinished = true;
61
61
  };
62
62
  const data = Buffer.from(Defaults_1.NOISE_MODE);
63
- let hash = data.byteLength === 32 ? data : (0, crypto_1.sha256)(data);
63
+ let hash = Buffer.from(data.byteLength === 32 ? data : (0, crypto_1.sha256)(data));
64
64
  let salt = hash;
65
65
  let encKey = hash;
66
66
  let decKey = hash;
@@ -77,19 +77,24 @@ const makeNoiseHandler = ({ keyPair: { private: privateKey, public: publicKey },
77
77
  authenticate,
78
78
  mixIntoKey,
79
79
  finishInit,
80
- processHandshake: async ({ serverHello }, noiseKey) => {
80
+ processHandshake: ({ serverHello }, noiseKey) => {
81
81
  authenticate(serverHello.ephemeral);
82
- await mixIntoKey(crypto_1.Curve.sharedKey(privateKey, serverHello.ephemeral));
82
+ mixIntoKey(crypto_1.Curve.sharedKey(privateKey, serverHello.ephemeral));
83
83
  const decStaticContent = decrypt(serverHello.static);
84
- await mixIntoKey(crypto_1.Curve.sharedKey(privateKey, decStaticContent));
84
+ mixIntoKey(crypto_1.Curve.sharedKey(privateKey, decStaticContent));
85
85
  const certDecoded = decrypt(serverHello.payload);
86
- const { intermediate: certIntermediate } = WAProto_1.proto.CertChain.decode(certDecoded);
87
- const { issuerSerial } = WAProto_1.proto.CertChain.NoiseCertificate.Details.decode(certIntermediate.details);
88
- if (issuerSerial !== Defaults_1.WA_CERT_DETAILS.SERIAL) {
89
- throw new boom_1.Boom('certification match failed', { statusCode: 400 });
86
+ if (mobile) {
87
+ WAProto_1.proto.CertChain.NoiseCertificate.decode(certDecoded);
88
+ }
89
+ else {
90
+ const { intermediate: certIntermediate } = WAProto_1.proto.CertChain.decode(certDecoded);
91
+ const { issuerSerial } = WAProto_1.proto.CertChain.NoiseCertificate.Details.decode(certIntermediate.details);
92
+ if (issuerSerial !== Defaults_1.WA_CERT_DETAILS.SERIAL) {
93
+ throw new boom_1.Boom('certification match failed', { statusCode: 400 });
94
+ }
90
95
  }
91
96
  const keyEnc = encrypt(noiseKey.public);
92
- await mixIntoKey(crypto_1.Curve.sharedKey(noiseKey.private, serverHello.ephemeral));
97
+ mixIntoKey(crypto_1.Curve.sharedKey(noiseKey.private, serverHello.ephemeral));
93
98
  return keyEnc;
94
99
  },
95
100
  encodeFrame: (data) => {
@@ -120,7 +125,7 @@ const makeNoiseHandler = ({ keyPair: { private: privateKey, public: publicKey },
120
125
  frame.set(data, introSize + 3);
121
126
  return frame;
122
127
  },
123
- decodeFrame: async (newData, onFrame) => {
128
+ decodeFrame: (newData, onFrame) => {
124
129
  var _a;
125
130
  // the binary protocol uses its own framing mechanism
126
131
  // on top of the WS frames
@@ -138,7 +143,7 @@ const makeNoiseHandler = ({ keyPair: { private: privateKey, public: publicKey },
138
143
  inBytes = inBytes.slice(size + 3);
139
144
  if (isFinished) {
140
145
  const result = decrypt(frame);
141
- frame = await (0, WABinary_1.decodeBinaryNode)(result);
146
+ frame = (0, WABinary_1.decodeBinaryNode)(result);
142
147
  }
143
148
  logger.trace({ msg: (_a = frame === null || frame === void 0 ? void 0 : frame.attrs) === null || _a === void 0 ? void 0 : _a.id }, 'recv frame');
144
149
  onFrame(frame);
@@ -1,15 +1,14 @@
1
1
  import { AxiosRequestConfig } from 'axios';
2
+ import type { Logger } from 'pino';
2
3
  import { proto } from '../../WAProto';
3
- import { AuthenticationCreds, BaileysEventEmitter, CacheStore, SignalKeyStoreWithTransaction, SocketConfig } from '../Types';
4
- import { ILogger } from './logger';
4
+ import { AuthenticationCreds, BaileysEventEmitter, SignalKeyStoreWithTransaction, SocketConfig } from '../Types';
5
5
  type ProcessMessageContext = {
6
6
  shouldProcessHistoryMsg: boolean;
7
- placeholderResendCache?: CacheStore;
8
7
  creds: AuthenticationCreds;
9
8
  keyStore: SignalKeyStoreWithTransaction;
10
9
  ev: BaileysEventEmitter;
11
10
  getMessage: SocketConfig['getMessage'];
12
- logger?: ILogger;
11
+ logger?: Logger;
13
12
  options: AxiosRequestConfig<{}>;
14
13
  };
15
14
  /** Cleans a received message to further processing */
@@ -38,5 +37,5 @@ type PollContext = {
38
37
  * @returns list of SHA256 options
39
38
  */
40
39
  export declare function decryptPollVote({ encPayload, encIv }: proto.Message.IPollEncValue, { pollCreatorJid, pollMsgId, pollEncKey, voterJid, }: PollContext): proto.Message.PollVoteMessage;
41
- declare const processMessage: (message: proto.IWebMessageInfo, { shouldProcessHistoryMsg, placeholderResendCache, ev, creds, keyStore, logger, options, getMessage }: ProcessMessageContext) => Promise<void>;
40
+ declare const processMessage: (message: proto.IWebMessageInfo, { shouldProcessHistoryMsg, ev, creds, keyStore, logger, options, getMessage }: ProcessMessageContext) => Promise<void>;
42
41
  export default processMessage;
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getChatId = exports.shouldIncrementChatUnread = exports.isRealMessage = exports.cleanMessage = void 0;
4
- exports.decryptPollVote = decryptPollVote;
3
+ exports.decryptPollVote = exports.getChatId = exports.shouldIncrementChatUnread = exports.isRealMessage = exports.cleanMessage = void 0;
5
4
  const WAProto_1 = require("../../WAProto");
6
5
  const Types_1 = require("../Types");
7
6
  const messages_1 = require("../Utils/messages");
@@ -102,14 +101,14 @@ function decryptPollVote({ encPayload, encIv }, { pollCreatorJid, pollMsgId, pol
102
101
  return Buffer.from(txt);
103
102
  }
104
103
  }
105
- const processMessage = async (message, { shouldProcessHistoryMsg, placeholderResendCache, ev, creds, keyStore, logger, options, getMessage }) => {
106
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
104
+ exports.decryptPollVote = decryptPollVote;
105
+ const processMessage = async (message, { shouldProcessHistoryMsg, ev, creds, keyStore, logger, options, getMessage }) => {
106
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
107
107
  const meId = creds.me.id;
108
108
  const { accountSettings } = creds;
109
109
  const chat = { id: (0, WABinary_1.jidNormalizedUser)((0, exports.getChatId)(message.key)) };
110
110
  const isRealMsg = (0, exports.isRealMessage)(message, meId);
111
111
  if (isRealMsg) {
112
- chat.messages = [{ message }];
113
112
  chat.conversationTimestamp = (0, generics_1.toNumber)(message.messageTimestamp);
114
113
  // only increment unread count if not CIPHERTEXT and from another person
115
114
  if ((0, exports.shouldIncrementChatUnread)(message)) {
@@ -138,22 +137,14 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
138
137
  isLatest,
139
138
  }, 'got history notification');
140
139
  if (process) {
141
- if (histNotification.syncType !== WAProto_1.proto.HistorySync.HistorySyncType.ON_DEMAND) {
142
- ev.emit('creds.update', {
143
- processedHistoryMessages: [
144
- ...(creds.processedHistoryMessages || []),
145
- { key: message.key, messageTimestamp: message.messageTimestamp }
146
- ]
147
- });
148
- }
149
- const data = await (0, history_1.downloadAndProcessHistorySyncNotification)(histNotification, options);
150
- ev.emit('messaging-history.set', {
151
- ...data,
152
- isLatest: histNotification.syncType !== WAProto_1.proto.HistorySync.HistorySyncType.ON_DEMAND
153
- ? isLatest
154
- : undefined,
155
- peerDataRequestSessionId: histNotification.peerDataRequestSessionId
140
+ ev.emit('creds.update', {
141
+ processedHistoryMessages: [
142
+ ...(creds.processedHistoryMessages || []),
143
+ { key: message.key, messageTimestamp: message.messageTimestamp }
144
+ ]
156
145
  });
146
+ const data = await (0, history_1.downloadAndProcessHistorySyncNotification)(histNotification, options);
147
+ ev.emit('messaging-history.set', { ...data, isLatest });
157
148
  }
158
149
  break;
159
150
  case WAProto_1.proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_SHARE:
@@ -196,41 +187,17 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
196
187
  case WAProto_1.proto.Message.ProtocolMessage.Type.PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE:
197
188
  const response = protocolMsg.peerDataOperationRequestResponseMessage;
198
189
  if (response) {
199
- placeholderResendCache === null || placeholderResendCache === void 0 ? void 0 : placeholderResendCache.del(response.stanzaId);
200
- // TODO: IMPLEMENT HISTORY SYNC ETC (sticker uploads etc.).
201
190
  const { peerDataOperationResult } = response;
202
191
  for (const result of peerDataOperationResult) {
203
192
  const { placeholderMessageResendResponse: retryResponse } = result;
204
193
  if (retryResponse) {
205
194
  const webMessageInfo = WAProto_1.proto.WebMessageInfo.decode(retryResponse.webMessageInfoBytes);
206
- // wait till another upsert event is available, don't want it to be part of the PDO response message
207
- setTimeout(() => {
208
- ev.emit('messages.upsert', {
209
- messages: [webMessageInfo],
210
- type: 'notify',
211
- requestId: response.stanzaId
212
- });
213
- }, 500);
195
+ ev.emit('messages.update', [
196
+ { key: webMessageInfo.key, update: { message: webMessageInfo.message } }
197
+ ]);
214
198
  }
215
199
  }
216
200
  }
217
- case WAProto_1.proto.Message.ProtocolMessage.Type.MESSAGE_EDIT:
218
- ev.emit('messages.update', [
219
- {
220
- // flip the sender / fromMe properties because they're in the perspective of the sender
221
- key: { ...message.key, id: (_d = protocolMsg.key) === null || _d === void 0 ? void 0 : _d.id },
222
- update: {
223
- message: {
224
- editedMessage: {
225
- message: protocolMsg.editedMessage
226
- }
227
- },
228
- messageTimestamp: protocolMsg.timestampMs
229
- ? Math.floor((0, generics_1.toNumber)(protocolMsg.timestampMs) / 1000)
230
- : message.messageTimestamp
231
- }
232
- }
233
- ]);
234
201
  break;
235
202
  }
236
203
  }
@@ -241,11 +208,11 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
241
208
  };
242
209
  ev.emit('messages.reaction', [{
243
210
  reaction,
244
- key: (_e = content.reactionMessage) === null || _e === void 0 ? void 0 : _e.key,
211
+ key: content.reactionMessage.key,
245
212
  }]);
246
213
  }
247
214
  else if (message.messageStubType) {
248
- const jid = (_f = message.key) === null || _f === void 0 ? void 0 : _f.remoteJid;
215
+ const jid = message.key.remoteJid;
249
216
  //let actor = whatsappID (message.participant)
250
217
  let participants;
251
218
  const emitParticipantsUpdate = (action) => (ev.emit('group-participants.update', { id: jid, author: message.participant, participants, action }));
@@ -253,15 +220,8 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
253
220
  var _a;
254
221
  ev.emit('groups.update', [{ id: jid, ...update, author: (_a = message.participant) !== null && _a !== void 0 ? _a : undefined }]);
255
222
  };
256
- const emitGroupRequestJoin = (participant, action, method) => {
257
- ev.emit('group.join-request', { id: jid, author: message.participant, participant, action, method: method });
258
- };
259
223
  const participantsIncludesMe = () => participants.find(jid => (0, WABinary_1.areJidsSameUser)(meId, jid));
260
224
  switch (message.messageStubType) {
261
- case Types_1.WAMessageStubType.GROUP_PARTICIPANT_CHANGE_NUMBER:
262
- participants = message.messageStubParameters || [];
263
- emitParticipantsUpdate('modify');
264
- break;
265
225
  case Types_1.WAMessageStubType.GROUP_PARTICIPANT_LEAVE:
266
226
  case Types_1.WAMessageStubType.GROUP_PARTICIPANT_REMOVE:
267
227
  participants = message.messageStubParameters || [];
@@ -289,41 +249,30 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
289
249
  emitParticipantsUpdate('promote');
290
250
  break;
291
251
  case Types_1.WAMessageStubType.GROUP_CHANGE_ANNOUNCE:
292
- const announceValue = (_g = message.messageStubParameters) === null || _g === void 0 ? void 0 : _g[0];
252
+ const announceValue = (_d = message.messageStubParameters) === null || _d === void 0 ? void 0 : _d[0];
293
253
  emitGroupUpdate({ announce: announceValue === 'true' || announceValue === 'on' });
294
254
  break;
295
255
  case Types_1.WAMessageStubType.GROUP_CHANGE_RESTRICT:
296
- const restrictValue = (_h = message.messageStubParameters) === null || _h === void 0 ? void 0 : _h[0];
256
+ const restrictValue = (_e = message.messageStubParameters) === null || _e === void 0 ? void 0 : _e[0];
297
257
  emitGroupUpdate({ restrict: restrictValue === 'true' || restrictValue === 'on' });
298
258
  break;
299
259
  case Types_1.WAMessageStubType.GROUP_CHANGE_SUBJECT:
300
- const name = (_j = message.messageStubParameters) === null || _j === void 0 ? void 0 : _j[0];
260
+ const name = (_f = message.messageStubParameters) === null || _f === void 0 ? void 0 : _f[0];
301
261
  chat.name = name;
302
262
  emitGroupUpdate({ subject: name });
303
263
  break;
304
- case Types_1.WAMessageStubType.GROUP_CHANGE_DESCRIPTION:
305
- const description = (_k = message.messageStubParameters) === null || _k === void 0 ? void 0 : _k[0];
306
- chat.description = description;
307
- emitGroupUpdate({ desc: description });
308
- break;
309
264
  case Types_1.WAMessageStubType.GROUP_CHANGE_INVITE_LINK:
310
- const code = (_l = message.messageStubParameters) === null || _l === void 0 ? void 0 : _l[0];
265
+ const code = (_g = message.messageStubParameters) === null || _g === void 0 ? void 0 : _g[0];
311
266
  emitGroupUpdate({ inviteCode: code });
312
267
  break;
313
268
  case Types_1.WAMessageStubType.GROUP_MEMBER_ADD_MODE:
314
- const memberAddValue = (_m = message.messageStubParameters) === null || _m === void 0 ? void 0 : _m[0];
269
+ const memberAddValue = (_h = message.messageStubParameters) === null || _h === void 0 ? void 0 : _h[0];
315
270
  emitGroupUpdate({ memberAddMode: memberAddValue === 'all_member_add' });
316
271
  break;
317
272
  case Types_1.WAMessageStubType.GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE:
318
- const approvalMode = (_o = message.messageStubParameters) === null || _o === void 0 ? void 0 : _o[0];
273
+ const approvalMode = (_j = message.messageStubParameters) === null || _j === void 0 ? void 0 : _j[0];
319
274
  emitGroupUpdate({ joinApprovalMode: approvalMode === 'on' });
320
275
  break;
321
- case Types_1.WAMessageStubType.GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST_NON_ADMIN_ADD:
322
- const participant = (_p = message.messageStubParameters) === null || _p === void 0 ? void 0 : _p[0];
323
- const action = (_q = message.messageStubParameters) === null || _q === void 0 ? void 0 : _q[1];
324
- const method = (_r = message.messageStubParameters) === null || _r === void 0 ? void 0 : _r[2];
325
- emitGroupRequestJoin(participant, action, method);
326
- break;
327
276
  }
328
277
  }
329
278
  else if (content === null || content === void 0 ? void 0 : content.pollUpdateMessage) {
@@ -334,7 +283,7 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
334
283
  const meIdNormalised = (0, WABinary_1.jidNormalizedUser)(meId);
335
284
  const pollCreatorJid = (0, generics_1.getKeyAuthor)(creationMsgKey, meIdNormalised);
336
285
  const voterJid = (0, generics_1.getKeyAuthor)(message.key, meIdNormalised);
337
- const pollEncKey = (_s = pollMsg.messageContextInfo) === null || _s === void 0 ? void 0 : _s.messageSecret;
286
+ const pollEncKey = (_k = pollMsg.messageContextInfo) === null || _k === void 0 ? void 0 : _k.messageSecret;
338
287
  try {
339
288
  const voteMsg = decryptPollVote(content.pollUpdateMessage.vote, {
340
289
  pollEncKey,
@@ -1,7 +1,6 @@
1
1
  import { SignalRepository } from '../Types';
2
2
  import { AuthenticationCreds, AuthenticationState, KeyPair, SignalIdentity, SignalKeyStore, SignedKeyPair } from '../Types/Auth';
3
3
  import { BinaryNode, JidWithDevice } from '../WABinary';
4
- import { USyncQueryResultList } from '../WAUSync';
5
4
  export declare const createSignalIdentity: (wid: string, accountSignatureKey: Uint8Array) => SignalIdentity;
6
5
  export declare const getPreKeys: ({ get }: SignalKeyStore, min: number, limit: number) => Promise<{
7
6
  [id: string]: KeyPair;
@@ -16,7 +15,7 @@ export declare const generateOrGetPreKeys: (creds: AuthenticationCreds, range: n
16
15
  export declare const xmppSignedPreKey: (key: SignedKeyPair) => BinaryNode;
17
16
  export declare const xmppPreKey: (pair: KeyPair, id: number) => BinaryNode;
18
17
  export declare const parseAndInjectE2ESessions: (node: BinaryNode, repository: SignalRepository) => Promise<void>;
19
- export declare const extractDeviceJids: (result: USyncQueryResultList[], myJid: string, excludeZeroDevices: boolean) => JidWithDevice[];
18
+ export declare const extractDeviceJids: (result: BinaryNode, myJid: string, excludeZeroDevices: boolean) => JidWithDevice[];
20
19
  /**
21
20
  * get the next N keys for upload or processing
22
21
  * @param count number of pre-keys to get or generate
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getNextPreKeysNode = exports.getNextPreKeys = exports.extractDeviceJids = exports.parseAndInjectE2ESessions = exports.xmppPreKey = exports.xmppSignedPreKey = exports.generateOrGetPreKeys = exports.getPreKeys = exports.createSignalIdentity = void 0;
4
- const lodash_1 = require("lodash");
5
4
  const Defaults_1 = require("../Defaults");
6
5
  const WABinary_1 = require("../WABinary");
7
6
  const crypto_1 = require("./crypto");
@@ -67,47 +66,46 @@ const parseAndInjectE2ESessions = async (node, repository) => {
67
66
  for (const node of nodes) {
68
67
  (0, WABinary_1.assertNodeErrorFree)(node);
69
68
  }
70
- // Most of the work in repository.injectE2ESession is CPU intensive, not IO
71
- // So Promise.all doesn't really help here,
72
- // but blocks even loop if we're using it inside keys.transaction, and it makes it "sync" actually
73
- // This way we chunk it in smaller parts and between those parts we can yield to the event loop
74
- // It's rare case when you need to E2E sessions for so many users, but it's possible
75
- const chunkSize = 100;
76
- const chunks = (0, lodash_1.chunk)(nodes, chunkSize);
77
- for (const nodesChunk of chunks) {
78
- await Promise.all(nodesChunk.map(async (node) => {
79
- const signedKey = (0, WABinary_1.getBinaryNodeChild)(node, 'skey');
80
- const key = (0, WABinary_1.getBinaryNodeChild)(node, 'key');
81
- const identity = (0, WABinary_1.getBinaryNodeChildBuffer)(node, 'identity');
82
- const jid = node.attrs.jid;
83
- const registrationId = (0, WABinary_1.getBinaryNodeChildUInt)(node, 'registration', 4);
84
- await repository.injectE2ESession({
85
- jid,
86
- session: {
87
- registrationId: registrationId,
88
- identityKey: (0, crypto_1.generateSignalPubKey)(identity),
89
- signedPreKey: extractKey(signedKey),
90
- preKey: extractKey(key)
91
- }
92
- });
93
- }));
94
- }
69
+ await Promise.all(nodes.map(async (node) => {
70
+ const signedKey = (0, WABinary_1.getBinaryNodeChild)(node, 'skey');
71
+ const key = (0, WABinary_1.getBinaryNodeChild)(node, 'key');
72
+ const identity = (0, WABinary_1.getBinaryNodeChildBuffer)(node, 'identity');
73
+ const jid = node.attrs.jid;
74
+ const registrationId = (0, WABinary_1.getBinaryNodeChildUInt)(node, 'registration', 4);
75
+ await repository.injectE2ESession({
76
+ jid,
77
+ session: {
78
+ registrationId: registrationId,
79
+ identityKey: (0, crypto_1.generateSignalPubKey)(identity),
80
+ signedPreKey: extractKey(signedKey),
81
+ preKey: extractKey(key)
82
+ }
83
+ });
84
+ }));
95
85
  };
96
86
  exports.parseAndInjectE2ESessions = parseAndInjectE2ESessions;
97
87
  const extractDeviceJids = (result, myJid, excludeZeroDevices) => {
88
+ var _a;
98
89
  const { user: myUser, device: myDevice } = (0, WABinary_1.jidDecode)(myJid);
99
90
  const extracted = [];
100
- for (const userResult of result) {
101
- const { devices, id } = userResult;
102
- const { user } = (0, WABinary_1.jidDecode)(id);
103
- const deviceList = devices === null || devices === void 0 ? void 0 : devices.deviceList;
104
- if (Array.isArray(deviceList)) {
105
- for (const { id: device, keyIndex } of deviceList) {
106
- if ((!excludeZeroDevices || device !== 0) && // if zero devices are not-excluded, or device is non zero
107
- (myUser !== user || myDevice !== device) && // either different user or if me user, not this device
108
- (device === 0 || !!keyIndex) // ensure that "key-index" is specified for "non-zero" devices, produces a bad req otherwise
109
- ) {
110
- extracted.push({ user, device });
91
+ for (const node of result.content) {
92
+ const list = (_a = (0, WABinary_1.getBinaryNodeChild)(node, 'list')) === null || _a === void 0 ? void 0 : _a.content;
93
+ if (list && Array.isArray(list)) {
94
+ for (const item of list) {
95
+ const { user } = (0, WABinary_1.jidDecode)(item.attrs.jid);
96
+ const devicesNode = (0, WABinary_1.getBinaryNodeChild)(item, 'devices');
97
+ const deviceListNode = (0, WABinary_1.getBinaryNodeChild)(devicesNode, 'device-list');
98
+ if (Array.isArray(deviceListNode === null || deviceListNode === void 0 ? void 0 : deviceListNode.content)) {
99
+ for (const { tag, attrs } of deviceListNode.content) {
100
+ const device = +attrs.id;
101
+ if (tag === 'device' && // ensure the "device" tag
102
+ (!excludeZeroDevices || device !== 0) && // if zero devices are not-excluded, or device is non zero
103
+ (myUser !== user || myDevice !== device) && // either different user or if me user, not this device
104
+ (device === 0 || !!attrs['key-index']) // ensure that "key-index" is specified for "non-zero" devices, produces a bad req otherwise
105
+ ) {
106
+ extracted.push({ user, device });
107
+ }
108
+ }
111
109
  }
112
110
  }
113
111
  }
@@ -10,3 +10,4 @@ export declare const useMultiFileAuthState: (folder: string) => Promise<{
10
10
  state: AuthenticationState;
11
11
  saveCreds: () => Promise<void>;
12
12
  }>;
13
+
@@ -1,26 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useMultiFileAuthState = void 0;
4
- const async_mutex_1 = require("async-mutex");
5
4
  const promises_1 = require("fs/promises");
6
5
  const path_1 = require("path");
7
6
  const WAProto_1 = require("../../WAProto");
8
7
  const auth_utils_1 = require("./auth-utils");
9
8
  const generics_1 = require("./generics");
10
- // We need to lock files due to the fact that we are using async functions to read and write files
11
- // https://github.com/WhiskeySockets/Baileys/issues/794
12
- // https://github.com/nodejs/node/issues/26338
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
- };
24
9
  /**
25
10
  * stores the full authentication state in a single folder.
26
11
  * Far more efficient than singlefileauthstate
@@ -29,32 +14,13 @@ const getFileLock = (path) => {
29
14
  * Would recommend writing an auth state for use with a proper SQL or No-SQL DB
30
15
  * */
31
16
  const useMultiFileAuthState = async (folder) => {
32
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
- const writeData = async (data, file) => {
34
- const filePath = (0, path_1.join)(folder, fixFileName(file));
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
- });
17
+ const writeData = (data, file) => {
18
+ return (0, promises_1.writeFile)((0, path_1.join)(folder, fixFileName(file)), JSON.stringify(data, generics_1.BufferJSON.replacer));
44
19
  };
45
20
  const readData = async (file) => {
46
21
  try {
47
- const filePath = (0, path_1.join)(folder, fixFileName(file));
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
- });
22
+ const data = await (0, promises_1.readFile)((0, path_1.join)(folder, fixFileName(file)), { encoding: 'utf-8' });
23
+ return JSON.parse(data, generics_1.BufferJSON.reviver);
58
24
  }
59
25
  catch (error) {
60
26
  return null;
@@ -62,18 +28,7 @@ const useMultiFileAuthState = async (folder) => {
62
28
  };
63
29
  const removeData = async (file) => {
64
30
  try {
65
- const filePath = (0, path_1.join)(folder, fixFileName(file));
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
- });
31
+ await (0, promises_1.unlink)((0, path_1.join)(folder, fixFileName(file)));
77
32
  }
78
33
  catch (_a) {
79
34
  }
@@ -117,7 +72,7 @@ const useMultiFileAuthState = async (folder) => {
117
72
  }
118
73
  }
119
74
  },
120
- saveCreds: async () => {
75
+ saveCreds: () => {
121
76
  return writeData(creds, 'creds.json');
122
77
  }
123
78
  };
@@ -1,10 +1,11 @@
1
1
  import { proto } from '../../WAProto';
2
2
  import type { AuthenticationCreds, SignalCreds, SocketConfig } from '../Types';
3
3
  import { BinaryNode } from '../WABinary';
4
+ export declare const generateMobileNode: (config: SocketConfig) => proto.IClientPayload;
4
5
  export declare const generateLoginNode: (userJid: string, config: SocketConfig) => proto.IClientPayload;
5
6
  export declare const generateRegistrationNode: ({ registrationId, signedPreKey, signedIdentityKey }: SignalCreds, config: SocketConfig) => proto.ClientPayload;
6
- export declare const configureSuccessfulPairing: (stanza: BinaryNode, { advSecretKey, signedIdentityKey, signalIdentities }: Pick<AuthenticationCreds, "advSecretKey" | "signedIdentityKey" | "signalIdentities">) => {
7
+ export declare const configureSuccessfulPairing: (stanza: BinaryNode, { advSecretKey, signedIdentityKey, signalIdentities }: Pick<AuthenticationCreds, 'advSecretKey' | 'signedIdentityKey' | 'signalIdentities'>) => {
7
8
  creds: Partial<AuthenticationCreds>;
8
9
  reply: BinaryNode;
9
- };
10
- export declare const encodeSignedDeviceIdentity: (account: proto.IADVSignedDeviceIdentity, includeSignatureKey: boolean) => Uint8Array<ArrayBufferLike>;
10
+ };
11
+ export declare const encodeSignedDeviceIdentity: (account: proto.IADVSignedDeviceIdentity, includeSignatureKey: boolean) => Uint8Array;