@systemzero/baileys 1.0.5 → 1.0.6

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 (201) hide show
  1. package/README.md +506 -601
  2. package/lib/Socket/chats.js +12 -1
  3. package/lib/Socket/groups.js +13 -4
  4. package/lib/Socket/messages-recv.js +36 -2
  5. package/lib/Socket/messages-recv.js.bak +1273 -0
  6. package/lib/Socket/messages-send.js +1 -0
  7. package/lib/Utils/bad-mac-handler.js +158 -0
  8. package/lib/Utils/get-best-version.js +41 -0
  9. package/lib/Utils/get-name.d.ts +1 -0
  10. package/lib/Utils/get-name.js +54 -0
  11. package/lib/Utils/group-status-detection.js +113 -0
  12. package/lib/Utils/index.js +7 -0
  13. package/lib/Utils/logger.js +4 -1
  14. package/lib/Utils/messages-media.js +38 -0
  15. package/lib/Utils/messages.js +113 -7
  16. package/lib/Utils/payment-detection.js +212 -0
  17. package/lib/Utils/payment-guard.d.ts +15 -0
  18. package/lib/Utils/payment-guard.js +142 -0
  19. package/lib/Utils/resolve-lid-phone.js +30 -0
  20. package/lib/WABinary/jid-utils.js +245 -1
  21. package/package.json +3 -2
  22. package/lib/Defaults/index.d.ts.map +0 -1
  23. package/lib/Defaults/index.js.map +0 -1
  24. package/lib/Signal/Group/ciphertext-message.d.ts.map +0 -1
  25. package/lib/Signal/Group/ciphertext-message.js.map +0 -1
  26. package/lib/Signal/Group/group-session-builder.d.ts.map +0 -1
  27. package/lib/Signal/Group/group-session-builder.js.map +0 -1
  28. package/lib/Signal/Group/group_cipher.d.ts.map +0 -1
  29. package/lib/Signal/Group/group_cipher.js.map +0 -1
  30. package/lib/Signal/Group/index.d.ts.map +0 -1
  31. package/lib/Signal/Group/index.js.map +0 -1
  32. package/lib/Signal/Group/keyhelper.d.ts.map +0 -1
  33. package/lib/Signal/Group/keyhelper.js.map +0 -1
  34. package/lib/Signal/Group/sender-chain-key.d.ts.map +0 -1
  35. package/lib/Signal/Group/sender-chain-key.js.map +0 -1
  36. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +0 -1
  37. package/lib/Signal/Group/sender-key-distribution-message.js.map +0 -1
  38. package/lib/Signal/Group/sender-key-message.d.ts.map +0 -1
  39. package/lib/Signal/Group/sender-key-message.js.map +0 -1
  40. package/lib/Signal/Group/sender-key-name.d.ts.map +0 -1
  41. package/lib/Signal/Group/sender-key-name.js.map +0 -1
  42. package/lib/Signal/Group/sender-key-record.d.ts.map +0 -1
  43. package/lib/Signal/Group/sender-key-record.js.map +0 -1
  44. package/lib/Signal/Group/sender-key-state.d.ts.map +0 -1
  45. package/lib/Signal/Group/sender-key-state.js.map +0 -1
  46. package/lib/Signal/Group/sender-message-key.d.ts.map +0 -1
  47. package/lib/Signal/Group/sender-message-key.js.map +0 -1
  48. package/lib/Signal/libsignal.d.ts.map +0 -1
  49. package/lib/Signal/libsignal.js.map +0 -1
  50. package/lib/Signal/lid-mapping.d.ts.map +0 -1
  51. package/lib/Signal/lid-mapping.js.map +0 -1
  52. package/lib/Socket/Client/index.d.ts.map +0 -1
  53. package/lib/Socket/Client/index.js.map +0 -1
  54. package/lib/Socket/Client/types.d.ts.map +0 -1
  55. package/lib/Socket/Client/types.js.map +0 -1
  56. package/lib/Socket/Client/websocket.d.ts.map +0 -1
  57. package/lib/Socket/Client/websocket.js.map +0 -1
  58. package/lib/Socket/business.d.ts.map +0 -1
  59. package/lib/Socket/business.js.map +0 -1
  60. package/lib/Socket/chats.d.ts.map +0 -1
  61. package/lib/Socket/chats.js.map +0 -1
  62. package/lib/Socket/communities.d.ts.map +0 -1
  63. package/lib/Socket/communities.js.map +0 -1
  64. package/lib/Socket/groups.d.ts.map +0 -1
  65. package/lib/Socket/groups.js.map +0 -1
  66. package/lib/Socket/index.d.ts.map +0 -1
  67. package/lib/Socket/index.js.map +0 -1
  68. package/lib/Socket/messages-recv.d.ts.map +0 -1
  69. package/lib/Socket/messages-recv.js.map +0 -1
  70. package/lib/Socket/messages-send.d.ts.map +0 -1
  71. package/lib/Socket/messages-send.js.map +0 -1
  72. package/lib/Socket/mex.d.ts.map +0 -1
  73. package/lib/Socket/mex.js.map +0 -1
  74. package/lib/Socket/newsletter.d.ts.map +0 -1
  75. package/lib/Socket/newsletter.js.map +0 -1
  76. package/lib/Socket/socket.d.ts.map +0 -1
  77. package/lib/Socket/socket.js.map +0 -1
  78. package/lib/Types/Auth.d.ts.map +0 -1
  79. package/lib/Types/Auth.js.map +0 -1
  80. package/lib/Types/Bussines.d.ts.map +0 -1
  81. package/lib/Types/Bussines.js.map +0 -1
  82. package/lib/Types/Call.d.ts.map +0 -1
  83. package/lib/Types/Call.js.map +0 -1
  84. package/lib/Types/Chat.d.ts.map +0 -1
  85. package/lib/Types/Chat.js.map +0 -1
  86. package/lib/Types/Contact.d.ts.map +0 -1
  87. package/lib/Types/Contact.js.map +0 -1
  88. package/lib/Types/Events.d.ts.map +0 -1
  89. package/lib/Types/Events.js.map +0 -1
  90. package/lib/Types/GroupMetadata.d.ts.map +0 -1
  91. package/lib/Types/GroupMetadata.js.map +0 -1
  92. package/lib/Types/Label.d.ts.map +0 -1
  93. package/lib/Types/Label.js.map +0 -1
  94. package/lib/Types/LabelAssociation.d.ts.map +0 -1
  95. package/lib/Types/LabelAssociation.js.map +0 -1
  96. package/lib/Types/Message.d.ts.map +0 -1
  97. package/lib/Types/Message.js.map +0 -1
  98. package/lib/Types/Newsletter.d.ts.map +0 -1
  99. package/lib/Types/Newsletter.js.map +0 -1
  100. package/lib/Types/Product.d.ts.map +0 -1
  101. package/lib/Types/Product.js.map +0 -1
  102. package/lib/Types/Signal.d.ts.map +0 -1
  103. package/lib/Types/Signal.js.map +0 -1
  104. package/lib/Types/Socket.d.ts.map +0 -1
  105. package/lib/Types/Socket.js.map +0 -1
  106. package/lib/Types/State.d.ts.map +0 -1
  107. package/lib/Types/State.js.map +0 -1
  108. package/lib/Types/USync.d.ts.map +0 -1
  109. package/lib/Types/USync.js.map +0 -1
  110. package/lib/Types/index.d.ts.map +0 -1
  111. package/lib/Types/index.js.map +0 -1
  112. package/lib/Utils/auth-utils.d.ts.map +0 -1
  113. package/lib/Utils/auth-utils.js.map +0 -1
  114. package/lib/Utils/browser-utils.d.ts.map +0 -1
  115. package/lib/Utils/browser-utils.js.map +0 -1
  116. package/lib/Utils/business.d.ts.map +0 -1
  117. package/lib/Utils/business.js.map +0 -1
  118. package/lib/Utils/chat-utils.d.ts.map +0 -1
  119. package/lib/Utils/chat-utils.js.map +0 -1
  120. package/lib/Utils/crypto.d.ts.map +0 -1
  121. package/lib/Utils/crypto.js.map +0 -1
  122. package/lib/Utils/decode-wa-message.d.ts.map +0 -1
  123. package/lib/Utils/decode-wa-message.js.map +0 -1
  124. package/lib/Utils/event-buffer.d.ts.map +0 -1
  125. package/lib/Utils/event-buffer.js.map +0 -1
  126. package/lib/Utils/generics.d.ts.map +0 -1
  127. package/lib/Utils/generics.js.map +0 -1
  128. package/lib/Utils/history.d.ts.map +0 -1
  129. package/lib/Utils/history.js.map +0 -1
  130. package/lib/Utils/index.d.ts.map +0 -1
  131. package/lib/Utils/index.js.map +0 -1
  132. package/lib/Utils/link-preview.d.ts.map +0 -1
  133. package/lib/Utils/link-preview.js.map +0 -1
  134. package/lib/Utils/logger.d.ts.map +0 -1
  135. package/lib/Utils/logger.js.map +0 -1
  136. package/lib/Utils/lt-hash.d.ts.map +0 -1
  137. package/lib/Utils/lt-hash.js.map +0 -1
  138. package/lib/Utils/make-mutex.d.ts.map +0 -1
  139. package/lib/Utils/make-mutex.js.map +0 -1
  140. package/lib/Utils/message-retry-manager.d.ts.map +0 -1
  141. package/lib/Utils/message-retry-manager.js.map +0 -1
  142. package/lib/Utils/messages-media.d.ts.map +0 -1
  143. package/lib/Utils/messages-media.js.map +0 -1
  144. package/lib/Utils/messages.d.ts.map +0 -1
  145. package/lib/Utils/messages.js.map +0 -1
  146. package/lib/Utils/noise-handler.d.ts.map +0 -1
  147. package/lib/Utils/noise-handler.js.map +0 -1
  148. package/lib/Utils/pre-key-manager.d.ts.map +0 -1
  149. package/lib/Utils/pre-key-manager.js.map +0 -1
  150. package/lib/Utils/process-message.d.ts.map +0 -1
  151. package/lib/Utils/process-message.js.map +0 -1
  152. package/lib/Utils/signal.d.ts.map +0 -1
  153. package/lib/Utils/signal.js.map +0 -1
  154. package/lib/Utils/use-multi-file-auth-state.d.ts.map +0 -1
  155. package/lib/Utils/use-multi-file-auth-state.js.map +0 -1
  156. package/lib/Utils/validate-connection.d.ts.map +0 -1
  157. package/lib/Utils/validate-connection.js.map +0 -1
  158. package/lib/WABinary/constants.d.ts.map +0 -1
  159. package/lib/WABinary/constants.js.map +0 -1
  160. package/lib/WABinary/decode.d.ts.map +0 -1
  161. package/lib/WABinary/decode.js.map +0 -1
  162. package/lib/WABinary/encode.d.ts.map +0 -1
  163. package/lib/WABinary/encode.js.map +0 -1
  164. package/lib/WABinary/generic-utils.d.ts.map +0 -1
  165. package/lib/WABinary/generic-utils.js.map +0 -1
  166. package/lib/WABinary/index.d.ts.map +0 -1
  167. package/lib/WABinary/index.js.map +0 -1
  168. package/lib/WABinary/jid-utils.d.ts.map +0 -1
  169. package/lib/WABinary/jid-utils.js.map +0 -1
  170. package/lib/WABinary/types.d.ts.map +0 -1
  171. package/lib/WABinary/types.js.map +0 -1
  172. package/lib/WAM/BinaryInfo.d.ts.map +0 -1
  173. package/lib/WAM/BinaryInfo.js.map +0 -1
  174. package/lib/WAM/constants.d.ts.map +0 -1
  175. package/lib/WAM/constants.js.map +0 -1
  176. package/lib/WAM/encode.d.ts.map +0 -1
  177. package/lib/WAM/encode.js.map +0 -1
  178. package/lib/WAM/index.d.ts.map +0 -1
  179. package/lib/WAM/index.js.map +0 -1
  180. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +0 -1
  181. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +0 -1
  182. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +0 -1
  183. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +0 -1
  184. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +0 -1
  185. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +0 -1
  186. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +0 -1
  187. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +0 -1
  188. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +0 -1
  189. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +0 -1
  190. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +0 -1
  191. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +0 -1
  192. package/lib/WAUSync/Protocols/index.d.ts.map +0 -1
  193. package/lib/WAUSync/Protocols/index.js.map +0 -1
  194. package/lib/WAUSync/USyncQuery.d.ts.map +0 -1
  195. package/lib/WAUSync/USyncQuery.js.map +0 -1
  196. package/lib/WAUSync/USyncUser.d.ts.map +0 -1
  197. package/lib/WAUSync/USyncUser.js.map +0 -1
  198. package/lib/WAUSync/index.d.ts.map +0 -1
  199. package/lib/WAUSync/index.js.map +0 -1
  200. package/lib/index.d.ts.map +0 -1
  201. package/lib/index.js.map +0 -1
@@ -2,7 +2,7 @@ import NodeCache from '@cacheable/node-cache';
2
2
  import { Boom } from '@hapi/boom';
3
3
  import { proto } from '../../WAProto/index.js';
4
4
  import { DEFAULT_CACHE_TTLS, PROCESSABLE_HISTORY_TYPES } from '../Defaults/index.js';
5
- import { ALL_WA_PATCH_NAMES } from '../Types/index.js';
5
+ import { ALL_WA_PATCH_NAMES, WAMessageStubType } from '../Types/index.js';
6
6
  import { SyncState } from '../Types/State.js';
7
7
  import { chatModificationToAppPatch, decodePatches, decodeSyncdSnapshot, encodeSyncdPatch, extractSyncdPatches, generateProfilePicture, getHistoryMsg, newLTHashState, processSyncAction } from '../Utils/index.js';
8
8
  import { makeMutex } from '../Utils/make-mutex.js';
@@ -787,6 +787,17 @@ export const makeChatsSocket = (config) => {
787
787
  await Promise.all([fetchProps(), fetchBlocklist(), fetchPrivacySettings()]);
788
788
  };
789
789
  const upsertMessage = ev.createBufferedFunction(async (msg, type) => {
790
+ // isSystemNotification — flag para filtrar notificações do sistema (E2E notices, etc)
791
+ const SYSTEM_STUB_TYPES = new Set([
792
+ WAMessageStubType.E2E_ENCRYPTED,
793
+ WAMessageStubType.E2E_DEVICE_CHANGED,
794
+ WAMessageStubType.E2E_IDENTITY_CHANGED,
795
+ WAMessageStubType.BIZ_PRIVACY_MODE_TO_BSP,
796
+ WAMessageStubType.BIZ_PRIVACY_MODE_TO_FB
797
+ ]);
798
+ if (msg.messageStubType && SYSTEM_STUB_TYPES.has(msg.messageStubType)) {
799
+ msg.isSystemNotification = true;
800
+ }
790
801
  ev.emit('messages.upsert', { messages: [msg], type });
791
802
  if (!!msg.pushName) {
792
803
  let jid = msg.key.fromMe ? authState.creds.me.id : msg.key.participant || msg.key.remoteJid;
@@ -1,7 +1,7 @@
1
1
  import { proto } from '../../WAProto/index.js';
2
2
  import { WAMessageAddressingMode, WAMessageStubType } from '../Types/index.js';
3
3
  import { generateMessageIDV2, unixTimestampSeconds } from '../Utils/index.js';
4
- import { getBinaryNodeChild, getBinaryNodeChildren, getBinaryNodeChildString, isLidUser, isPnUser, jidEncode, jidNormalizedUser } from '../WABinary/index.js';
4
+ import { getBinaryNodeChild, getBinaryNodeChildren, getBinaryNodeChildString, isLidUser, isPnUser, jidEncode, jidNormalizedUser, sharedLidPhoneCache } from '../WABinary/index.js';
5
5
  import { makeChatsSocket } from './chats.js';
6
6
  export const makeGroupsSocket = (config) => {
7
7
  const sock = makeChatsSocket(config);
@@ -312,11 +312,20 @@ export const extractGroupMetadata = (result) => {
312
312
  joinApprovalMode: !!getBinaryNodeChild(group, 'membership_approval_mode'),
313
313
  memberAddMode,
314
314
  participants: getBinaryNodeChildren(group, 'participant').map(({ attrs }) => {
315
- // TODO: Store LID MAPPINGS
315
+ const phoneNumber = isLidUser(attrs.jid) && isPnUser(attrs.phone_number) ? attrs.phone_number : undefined;
316
+ const lid = isPnUser(attrs.jid) && isLidUser(attrs.lid) ? attrs.lid : undefined;
317
+
318
+ // alimenta o cache compartilhado LID<->telefone com o que o
319
+ // WhatsApp já entrega pronto na lista de participantes do grupo —
320
+ // sem isso, sharedLidPhoneCache.getPhoneForLid() nunca resolve
321
+ // pra membros que só apareceram em grupo (nunca tiveram DM direta)
322
+ if (phoneNumber) sharedLidPhoneCache.set(attrs.jid, phoneNumber);
323
+ if (lid) sharedLidPhoneCache.set(lid, attrs.jid);
324
+
316
325
  return {
317
326
  id: attrs.jid,
318
- phoneNumber: isLidUser(attrs.jid) && isPnUser(attrs.phone_number) ? attrs.phone_number : undefined,
319
- lid: isPnUser(attrs.jid) && isLidUser(attrs.lid) ? attrs.lid : undefined,
327
+ phoneNumber,
328
+ lid,
320
329
  admin: (attrs.type || null)
321
330
  };
322
331
  }),
@@ -7,7 +7,7 @@ import { DEFAULT_CACHE_TTLS, KEY_BUNDLE_TYPE, MIN_PREKEY_COUNT } from '../Defaul
7
7
  import { WAMessageStatus, WAMessageStubType } from '../Types/index.js';
8
8
  import { aesDecryptCTR, aesEncryptGCM, cleanMessage, Curve, decodeMediaRetryNode, decodeMessageNode, decryptMessageNode, delay, derivePairingCodeKey, encodeBigEndian, encodeSignedDeviceIdentity, extractAddressingContext, getCallStatusFromNode, getHistoryMsg, getNextPreKeys, getStatusFromReceiptType, hkdf, MISSING_KEYS_ERROR_TEXT, NACK_REASONS, NO_MESSAGE_FOUND_ERROR_TEXT, unixTimestampSeconds, xmppPreKey, xmppSignedPreKey } from '../Utils/index.js';
9
9
  import { makeMutex } from '../Utils/make-mutex.js';
10
- import { areJidsSameUser, binaryNodeToString, getAllBinaryNodeChildren, getBinaryNodeChild, getBinaryNodeChildBuffer, getBinaryNodeChildren, getBinaryNodeChildString, isJidGroup, isJidNewsletter, isJidStatusBroadcast, isLidUser, isPnUser, jidDecode, jidNormalizedUser, S_WHATSAPP_NET } from '../WABinary/index.js';
10
+ import { areJidsSameUser, binaryNodeToString, getAllBinaryNodeChildren, getBinaryNodeChild, getBinaryNodeChildBuffer, getBinaryNodeChildren, getBinaryNodeChildString, isJidGroup, isJidNewsletter, isJidStatusBroadcast, isLidUser, isPnUser, jidDecode, jidNormalizedUser, S_WHATSAPP_NET, sharedLidPhoneCache } from '../WABinary/index.js';
11
11
  import { extractGroupMetadata } from './groups.js';
12
12
  import { makeMessagesSocket } from './messages-send.js';
13
13
  export const makeMessagesRecvSocket = (config) => {
@@ -433,6 +433,13 @@ export const makeMessagesRecvSocket = (config) => {
433
433
  const actingParticipantPn = fullNode.attrs.participant_pn;
434
434
  const affectedParticipantLid = getBinaryNodeChild(child, 'participant')?.attrs?.jid || actingParticipantLid;
435
435
  const affectedParticipantPn = getBinaryNodeChild(child, 'participant')?.attrs?.phone_number || actingParticipantPn;
436
+ // alimenta cache síncrono com os pares LID↔JID do autor da notificação
437
+ if (isLidUser(actingParticipantLid) && isPnUser(actingParticipantPn)) {
438
+ sharedLidPhoneCache.set(actingParticipantLid, actingParticipantPn);
439
+ }
440
+ if (isLidUser(affectedParticipantLid) && isPnUser(affectedParticipantPn)) {
441
+ sharedLidPhoneCache.set(affectedParticipantLid, affectedParticipantPn);
442
+ }
436
443
  switch (child?.tag) {
437
444
  case 'create':
438
445
  const metadata = extractGroupMetadata(child);
@@ -476,7 +483,12 @@ export const makeMessagesRecvSocket = (config) => {
476
483
  const stubType = `GROUP_PARTICIPANT_${child.tag.toUpperCase()}`;
477
484
  msg.messageStubType = WAMessageStubType[stubType];
478
485
  const participants = getBinaryNodeChildren(child, 'participant').map(({ attrs }) => {
479
- // TODO: Store LID MAPPINGS
486
+ // alimenta cache síncrono LID↔JID a partir de participant_pn / phone_number
487
+ if (isLidUser(attrs.jid) && isPnUser(attrs.phone_number)) {
488
+ sharedLidPhoneCache.set(attrs.jid, attrs.phone_number);
489
+ } else if (isPnUser(attrs.jid) && isLidUser(attrs.lid)) {
490
+ sharedLidPhoneCache.set(attrs.lid, attrs.jid);
491
+ }
480
492
  return {
481
493
  id: attrs.jid,
482
494
  phoneNumber: isLidUser(attrs.jid) && isPnUser(attrs.phone_number) ? attrs.phone_number : undefined,
@@ -970,11 +982,21 @@ export const makeMessagesRecvSocket = (config) => {
970
982
  await signalRepository.lidMapping.storeLIDPNMappings([{ lid: alt, pn: primaryJid }]);
971
983
  await signalRepository.migrateSession(primaryJid, alt);
972
984
  }
985
+ // alimenta cache síncrono LID→JID
986
+ if (isPnUser(primaryJid)) sharedLidPhoneCache.set(alt, primaryJid);
973
987
  }
974
988
  else {
975
989
  await signalRepository.lidMapping.storeLIDPNMappings([{ lid: primaryJid, pn: alt }]);
976
990
  await signalRepository.migrateSession(alt, primaryJid);
991
+ // alimenta cache síncrono LID→JID
992
+ if (isLidUser(primaryJid) && isPnUser(alt)) sharedLidPhoneCache.set(primaryJid, alt);
977
993
  }
994
+
995
+
996
+
997
+
998
+
999
+
978
1000
  }
979
1001
  if (msg.key?.remoteJid && msg.key?.id && messageRetryManager) {
980
1002
  messageRetryManager.addRecentMessage(msg.key.remoteJid, msg.key.id, msg.message);
@@ -994,6 +1016,18 @@ export const makeMessagesRecvSocket = (config) => {
994
1016
  }
995
1017
  const errorMessage = msg?.messageStubParameters?.[0] || '';
996
1018
  const isPreKeyError = errorMessage.includes('PreKey');
1019
+ // A mensagem nunca foi decifrada — não dá pra saber o conteúdo,
1020
+ // mas o evento é emitido mesmo assim para que sistemas de
1021
+ // anti-fraude tratem como suspeita/indecifrável em vez de ignorar.
1022
+ ev.emit('messages.decrypt-failed', {
1023
+ key: msg.key,
1024
+ remoteJid: msg.key?.remoteJid,
1025
+ participant: msg.key?.participant,
1026
+ messageId: msg.key?.id,
1027
+ isPreKeyError,
1028
+ errorMessage,
1029
+ timestamp: msg.messageTimestamp
1030
+ });
997
1031
  logger.debug(`[handleMessage] Attempting retry request for failed decryption`);
998
1032
  // Handle both pre-key and normal retries in single mutex
999
1033
  await retryMutex.mutex(async () => {