@dappaoffc/baileys-mod 8.0.0 → 8.0.1

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.

Potentially problematic release.


This version of @dappaoffc/baileys-mod might be problematic. Click here for more details.

Files changed (212) hide show
  1. package/WAProto/index.js +133384 -57814
  2. package/engine-requirements.js +10 -0
  3. package/lib/Defaults/baileys-version.json +3 -0
  4. package/lib/Defaults/index.d.ts +53 -0
  5. package/lib/Defaults/index.js +141 -117
  6. package/lib/Defaults/phonenumber-mcc.json +223 -0
  7. package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
  8. package/lib/Signal/Group/ciphertext-message.js +14 -12
  9. package/lib/Signal/Group/group-session-builder.d.ts +14 -0
  10. package/lib/Signal/Group/group-session-builder.js +42 -10
  11. package/lib/Signal/Group/group_cipher.d.ts +17 -0
  12. package/lib/Signal/Group/group_cipher.js +87 -75
  13. package/lib/Signal/Group/index.d.ts +11 -0
  14. package/lib/Signal/Group/index.js +57 -13
  15. package/lib/Signal/Group/keyhelper.d.ts +10 -0
  16. package/lib/Signal/Group/keyhelper.js +52 -17
  17. package/lib/Signal/Group/queue-job.d.ts +1 -0
  18. package/lib/Signal/Group/queue-job.js +57 -0
  19. package/lib/Signal/Group/sender-chain-key.d.ts +13 -0
  20. package/lib/Signal/Group/sender-chain-key.js +33 -27
  21. package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -0
  22. package/lib/Signal/Group/sender-key-distribution-message.js +63 -62
  23. package/lib/Signal/Group/sender-key-message.d.ts +18 -0
  24. package/lib/Signal/Group/sender-key-message.js +66 -65
  25. package/lib/Signal/Group/sender-key-name.d.ts +17 -0
  26. package/lib/Signal/Group/sender-key-name.js +44 -45
  27. package/lib/Signal/Group/sender-key-record.d.ts +30 -0
  28. package/lib/Signal/Group/sender-key-record.js +49 -39
  29. package/lib/Signal/Group/sender-key-state.d.ts +38 -0
  30. package/lib/Signal/Group/sender-key-state.js +93 -80
  31. package/lib/Signal/Group/sender-message-key.d.ts +11 -0
  32. package/lib/Signal/Group/sender-message-key.js +28 -27
  33. package/lib/Signal/libsignal.d.ts +3 -0
  34. package/lib/Signal/libsignal.js +163 -313
  35. package/lib/Socket/Client/abstract-socket-client.d.ts +17 -0
  36. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  37. package/lib/Socket/Client/index.d.ts +3 -0
  38. package/lib/Socket/Client/index.js +19 -4
  39. package/lib/Socket/Client/mobile-socket-client.d.ts +13 -0
  40. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  41. package/lib/Socket/Client/web-socket-client.d.ts +12 -0
  42. package/lib/Socket/Client/web-socket-client.js +62 -0
  43. package/lib/Socket/business.d.ts +171 -0
  44. package/lib/Socket/business.js +242 -359
  45. package/lib/Socket/chats.d.ts +267 -0
  46. package/lib/Socket/chats.js +935 -846
  47. package/lib/Socket/dugong.d.ts +254 -0
  48. package/lib/Socket/dugong.js +484 -0
  49. package/lib/Socket/groups.d.ts +115 -0
  50. package/lib/Socket/groups.js +309 -304
  51. package/lib/Socket/index.d.ts +173 -0
  52. package/lib/Socket/index.js +10 -15
  53. package/lib/Socket/messages-recv.d.ts +161 -0
  54. package/lib/Socket/messages-recv.js +1054 -1107
  55. package/lib/Socket/messages-send.d.ts +149 -0
  56. package/lib/Socket/messages-send.js +448 -639
  57. package/lib/Socket/newsletter.d.ts +134 -0
  58. package/lib/Socket/newsletter.js +310 -197
  59. package/lib/Socket/registration.d.ts +267 -0
  60. package/lib/Socket/registration.js +166 -0
  61. package/lib/Socket/socket.d.ts +43 -0
  62. package/lib/Socket/socket.js +651 -791
  63. package/lib/Socket/usync.d.ts +36 -0
  64. package/lib/Socket/usync.js +70 -0
  65. package/lib/Store/index.d.ts +3 -0
  66. package/lib/Store/index.js +10 -6
  67. package/lib/Store/make-cache-manager-store.d.ts +13 -0
  68. package/lib/Store/make-cache-manager-store.js +81 -73
  69. package/lib/Store/make-in-memory-store.d.ts +118 -0
  70. package/lib/Store/make-in-memory-store.js +423 -286
  71. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  72. package/lib/Store/make-ordered-dictionary.js +79 -77
  73. package/lib/Store/object-repository.d.ts +10 -0
  74. package/lib/Store/object-repository.js +26 -24
  75. package/lib/Types/Auth.d.ts +110 -0
  76. package/lib/Types/Auth.js +2 -3
  77. package/lib/Types/Call.d.ts +13 -0
  78. package/lib/Types/Call.js +2 -3
  79. package/lib/Types/Chat.d.ts +102 -0
  80. package/lib/Types/Chat.js +4 -9
  81. package/lib/Types/Contact.d.ts +19 -0
  82. package/lib/Types/Contact.js +2 -3
  83. package/lib/Types/Events.d.ts +157 -0
  84. package/lib/Types/Events.js +2 -3
  85. package/lib/Types/GroupMetadata.d.ts +55 -0
  86. package/lib/Types/GroupMetadata.js +2 -3
  87. package/lib/Types/Label.d.ts +35 -0
  88. package/lib/Types/Label.js +26 -24
  89. package/lib/Types/LabelAssociation.d.ts +29 -0
  90. package/lib/Types/LabelAssociation.js +8 -6
  91. package/lib/Types/Message.d.ts +273 -0
  92. package/lib/Types/Message.js +9 -12
  93. package/lib/Types/Newsletter.d.ts +103 -0
  94. package/lib/Types/Newsletter.js +38 -33
  95. package/lib/Types/Product.d.ts +78 -0
  96. package/lib/Types/Product.js +2 -3
  97. package/lib/Types/Signal.d.ts +57 -0
  98. package/lib/Types/Signal.js +2 -3
  99. package/lib/Types/Socket.d.ts +111 -0
  100. package/lib/Types/Socket.js +2 -4
  101. package/lib/Types/State.d.ts +27 -0
  102. package/lib/Types/State.js +2 -11
  103. package/lib/Types/USync.d.ts +25 -0
  104. package/lib/Types/USync.js +2 -3
  105. package/lib/Types/index.d.ts +57 -0
  106. package/lib/Types/index.js +41 -27
  107. package/lib/Utils/auth-utils.d.ts +18 -0
  108. package/lib/Utils/auth-utils.js +198 -211
  109. package/lib/Utils/baileys-event-stream.d.ts +16 -0
  110. package/lib/Utils/baileys-event-stream.js +61 -42
  111. package/lib/Utils/business.d.ts +22 -0
  112. package/lib/Utils/business.js +214 -213
  113. package/lib/Utils/chat-utils.d.ts +71 -0
  114. package/lib/Utils/chat-utils.js +687 -710
  115. package/lib/Utils/crypto.d.ts +41 -0
  116. package/lib/Utils/crypto.js +133 -112
  117. package/lib/Utils/decode-wa-message.d.ts +19 -0
  118. package/lib/Utils/decode-wa-message.js +183 -252
  119. package/lib/Utils/event-buffer.d.ts +35 -0
  120. package/lib/Utils/event-buffer.js +496 -510
  121. package/lib/Utils/generics.d.ts +92 -0
  122. package/lib/Utils/generics.js +392 -319
  123. package/lib/Utils/generics.js.bak +433 -0
  124. package/lib/Utils/history.d.ts +15 -0
  125. package/lib/Utils/history.js +92 -83
  126. package/lib/Utils/index.d.ts +17 -0
  127. package/lib/Utils/index.js +33 -21
  128. package/lib/Utils/link-preview.d.ts +21 -0
  129. package/lib/Utils/link-preview.js +83 -71
  130. package/lib/Utils/logger.d.ts +4 -0
  131. package/lib/Utils/logger.js +7 -5
  132. package/lib/Utils/lt-hash.d.ts +12 -0
  133. package/lib/Utils/lt-hash.js +46 -40
  134. package/lib/Utils/make-mutex.d.ts +7 -0
  135. package/lib/Utils/make-mutex.js +41 -34
  136. package/lib/Utils/messages-media.d.ts +116 -0
  137. package/lib/Utils/messages-media.js +768 -550
  138. package/lib/Utils/messages.d.ts +77 -0
  139. package/lib/Utils/messages.js +263 -354
  140. package/lib/Utils/noise-handler.d.ts +21 -0
  141. package/lib/Utils/noise-handler.js +149 -138
  142. package/lib/Utils/process-message.d.ts +41 -0
  143. package/lib/Utils/process-message.js +303 -323
  144. package/lib/Utils/signal.d.ts +32 -0
  145. package/lib/Utils/signal.js +141 -149
  146. package/lib/Utils/use-multi-file-auth-state.d.ts +13 -0
  147. package/lib/Utils/use-multi-file-auth-state.js +103 -95
  148. package/lib/Utils/validate-connection.d.ts +11 -0
  149. package/lib/Utils/validate-connection.js +214 -183
  150. package/lib/Utils/validate-connection.js.bak +237 -0
  151. package/lib/WABinary/constants.d.ts +30 -0
  152. package/lib/WABinary/constants.js +35 -1298
  153. package/lib/WABinary/decode.d.ts +7 -0
  154. package/lib/WABinary/decode.js +249 -237
  155. package/lib/WABinary/encode.d.ts +3 -0
  156. package/lib/WABinary/encode.js +260 -213
  157. package/lib/WABinary/generic-utils.d.ts +17 -0
  158. package/lib/WABinary/generic-utils.js +65 -56
  159. package/lib/WABinary/index.d.ts +5 -0
  160. package/lib/WABinary/index.js +21 -7
  161. package/lib/WABinary/jid-utils.d.ts +31 -0
  162. package/lib/WABinary/jid-utils.js +58 -89
  163. package/lib/WABinary/types.d.ts +18 -0
  164. package/lib/WABinary/types.js +2 -3
  165. package/lib/WAM/BinaryInfo.d.ts +17 -0
  166. package/lib/WAM/BinaryInfo.js +12 -10
  167. package/lib/WAM/constants.d.ts +38 -0
  168. package/lib/WAM/constants.js +15348 -22851
  169. package/lib/WAM/encode.d.ts +3 -0
  170. package/lib/WAM/encode.js +136 -135
  171. package/lib/WAM/index.d.ts +3 -0
  172. package/lib/WAM/index.js +19 -5
  173. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  174. package/lib/WAUSync/Protocols/USyncContactProtocol.js +30 -28
  175. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  176. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +53 -49
  177. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  178. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +28 -27
  179. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  180. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +39 -36
  181. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
  182. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +50 -50
  183. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
  184. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +20 -26
  185. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  186. package/lib/WAUSync/Protocols/index.js +20 -6
  187. package/lib/WAUSync/USyncQuery.d.ts +28 -0
  188. package/lib/WAUSync/USyncQuery.js +85 -86
  189. package/lib/WAUSync/USyncUser.d.ts +12 -0
  190. package/lib/WAUSync/USyncUser.js +25 -23
  191. package/lib/WAUSync/index.d.ts +3 -0
  192. package/lib/WAUSync/index.js +19 -5
  193. package/lib/index.d.ts +12 -0
  194. package/lib/index.js +38 -15
  195. package/package.json +106 -101
  196. package/LICENSE +0 -21
  197. package/WAProto/WAProto.proto +0 -5311
  198. package/lib/KeyDB/BinarySearch.js +0 -20
  199. package/lib/KeyDB/KeyedDB.js +0 -167
  200. package/lib/KeyDB/index.js +0 -4
  201. package/lib/Signal/lid-mapping.js +0 -155
  202. package/lib/Socket/Client/types.js +0 -13
  203. package/lib/Socket/Client/websocket.js +0 -52
  204. package/lib/Socket/Client/websocket.js.bak +0 -53
  205. package/lib/Socket/communities.js +0 -413
  206. package/lib/Socket/mex.js +0 -45
  207. package/lib/Types/Bussines.js +0 -3
  208. package/lib/Types/Newsletter.js.bak +0 -33
  209. package/lib/Utils/browser-utils.js +0 -25
  210. package/lib/Utils/decode-wa-message.js.bak +0 -267
  211. package/lib/Utils/message-retry-manager.js +0 -113
  212. package/lib/Utils/pre-key-manager.js +0 -85
@@ -1,267 +0,0 @@
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;
13
- };
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");
22
- }
23
- catch (error) {
24
- logger.warn({ sender, senderAlt, error }, "Failed to store LID mapping");
25
- }
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_pn;
81
- const participant = stanza.attrs.participant_pn;
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;
95
- }
96
- else {
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";
120
- }
121
- else {
122
- msgType = isParticipantMe ? "peer_broadcast" : "other_broadcast";
123
- }
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;
134
- }
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
- };
164
- }
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);
235
- }
236
- else {
237
- fullMessage.message = msg;
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
- }
253
- }
254
- }
255
- if (!decryptables) {
256
- fullMessage.messageStubType = proto.WebMessageInfo.StubType.CIPHERTEXT;
257
- fullMessage.messageStubParameters = [NO_MESSAGE_FOUND_ERROR_TEXT];
258
- }
259
- }
260
- };
261
- };
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
- //=======================================================//
@@ -1,113 +0,0 @@
1
- //=======================================================//
2
- import { LRUCache } from "lru-cache";
3
- //=======================================================//
4
- const RECENT_MESSAGES_SIZE = 512;
5
- const RECREATE_SESSION_TIMEOUT = 60 * 60 * 1000;
6
- const PHONE_REQUEST_DELAY = 3000;
7
- export class MessageRetryManager {
8
- constructor(logger, maxMsgRetryCount) {
9
- this.logger = logger;
10
- this.recentMessagesMap = new LRUCache({
11
- max: RECENT_MESSAGES_SIZE
12
- });
13
- this.sessionRecreateHistory = new LRUCache({
14
- ttl: RECREATE_SESSION_TIMEOUT * 2,
15
- ttlAutopurge: true
16
- });
17
- this.retryCounters = new LRUCache({
18
- ttl: 15 * 60 * 1000,
19
- ttlAutopurge: true,
20
- updateAgeOnGet: true
21
- });
22
- this.pendingPhoneRequests = {};
23
- this.maxMsgRetryCount = 5;
24
- this.statistics = {
25
- totalRetries: 0,
26
- successfulRetries: 0,
27
- failedRetries: 0,
28
- mediaRetries: 0,
29
- sessionRecreations: 0,
30
- phoneRequests: 0
31
- };
32
- this.maxMsgRetryCount = maxMsgRetryCount;
33
- }
34
- addRecentMessage(to, id, message) {
35
- const key = { to, id };
36
- const keyStr = this.keyToString(key);
37
- this.recentMessagesMap.set(keyStr, {
38
- message,
39
- timestamp: Date.now()
40
- });
41
- this.logger.debug(`Added message to retry cache: ${to}/${id}`);
42
- }
43
- getRecentMessage(to, id) {
44
- const key = { to, id };
45
- const keyStr = this.keyToString(key);
46
- return this.recentMessagesMap.get(keyStr);
47
- }
48
- shouldRecreateSession(jid, retryCount, hasSession) {
49
- if (!hasSession) {
50
- this.sessionRecreateHistory.set(jid, Date.now());
51
- this.statistics.sessionRecreations++;
52
- return {
53
- reason: "we dont have a Signal session with them",
54
- recreate: true
55
- };
56
- }
57
- if (retryCount < 2) {
58
- return { reason: "", recreate: false };
59
- }
60
- const now = Date.now();
61
- const prevTime = this.sessionRecreateHistory.get(jid);
62
- if (!prevTime || now - prevTime > RECREATE_SESSION_TIMEOUT) {
63
- this.sessionRecreateHistory.set(jid, now);
64
- this.statistics.sessionRecreations++;
65
- return {
66
- reason: "retry count > 1 and over an hour since last recreation",
67
- recreate: true
68
- };
69
- }
70
- return { reason: "", recreate: false };
71
- }
72
- incrementRetryCount(messageId) {
73
- this.retryCounters.set(messageId, (this.retryCounters.get(messageId) || 0) + 1);
74
- this.statistics.totalRetries++;
75
- return this.retryCounters.get(messageId);
76
- }
77
- getRetryCount(messageId) {
78
- return this.retryCounters.get(messageId) || 0;
79
- }
80
- hasExceededMaxRetries(messageId) {
81
- return this.getRetryCount(messageId) >= this.maxMsgRetryCount;
82
- }
83
- markRetrySuccess(messageId) {
84
- this.statistics.successfulRetries++;
85
- this.retryCounters.delete(messageId);
86
- this.cancelPendingPhoneRequest(messageId);
87
- }
88
- markRetryFailed(messageId) {
89
- this.statistics.failedRetries++;
90
- this.retryCounters.delete(messageId);
91
- }
92
- schedulePhoneRequest(messageId, callback, delay = PHONE_REQUEST_DELAY) {
93
- this.cancelPendingPhoneRequest(messageId);
94
- this.pendingPhoneRequests[messageId] = setTimeout(() => {
95
- delete this.pendingPhoneRequests[messageId];
96
- this.statistics.phoneRequests++;
97
- callback();
98
- }, delay);
99
- this.logger.debug(`Scheduled phone request for message ${messageId} with ${delay}ms delay`);
100
- }
101
- cancelPendingPhoneRequest(messageId) {
102
- const timeout = this.pendingPhoneRequests[messageId];
103
- if (timeout) {
104
- clearTimeout(timeout);
105
- delete this.pendingPhoneRequests[messageId];
106
- this.logger.debug(`Cancelled pending phone request for message ${messageId}`);
107
- }
108
- }
109
- keyToString(key) {
110
- return `${key.to}:${key.id}`;
111
- }
112
- }
113
- //=======================================================//
@@ -1,85 +0,0 @@
1
- //=======================================================//
2
- import PQueue from "p-queue";
3
- //=======================================================//
4
- export class PreKeyManager {
5
- constructor(store, logger) {
6
- this.store = store;
7
- this.logger = logger;
8
- this.queues = new Map();
9
- }
10
- getQueue(keyType) {
11
- if (!this.queues.has(keyType)) {
12
- this.queues.set(keyType, new PQueue({ concurrency: 1 }));
13
- }
14
- return this.queues.get(keyType);
15
- }
16
- async processOperations(data, keyType, transactionCache, mutations, isInTransaction) {
17
- const keyData = data[keyType];
18
- if (!keyData)
19
- return;
20
- return this.getQueue(keyType).add(async () => {
21
- transactionCache[keyType] = transactionCache[keyType] || {};
22
- mutations[keyType] = mutations[keyType] || {};
23
- const deletions = [];
24
- const updates = {};
25
- for (const keyId in keyData) {
26
- if (keyData[keyId] === null) {
27
- deletions.push(keyId);
28
- }
29
- else {
30
- updates[keyId] = keyData[keyId];
31
- }
32
- }
33
- if (Object.keys(updates).length > 0) {
34
- Object.assign(transactionCache[keyType], updates);
35
- Object.assign(mutations[keyType], updates);
36
- }
37
- if (deletions.length > 0) {
38
- await this.processDeletions(keyType, deletions, transactionCache, mutations, isInTransaction);
39
- }
40
- });
41
- }
42
- async processDeletions(keyType, ids, transactionCache, mutations, isInTransaction) {
43
- if (isInTransaction) {
44
- for (const keyId of ids) {
45
- if (transactionCache[keyType]?.[keyId]) {
46
- transactionCache[keyType][keyId] = null;
47
- mutations[keyType][keyId] = null;
48
- }
49
- else {
50
- this.logger.warn(`Skipping deletion of non-existent ${keyType} in transaction: ${keyId}`);
51
- }
52
- }
53
- }
54
- else {
55
- const existingKeys = await this.store.get(keyType, ids);
56
- for (const keyId of ids) {
57
- if (existingKeys[keyId]) {
58
- transactionCache[keyType][keyId] = null;
59
- mutations[keyType][keyId] = null;
60
- }
61
- else {
62
- this.logger.warn(`Skipping deletion of non-existent ${keyType}: ${keyId}`);
63
- }
64
- }
65
- }
66
- }
67
- async validateDeletions(data, keyType) {
68
- const keyData = data[keyType];
69
- if (!keyData)
70
- return;
71
- return this.getQueue(keyType).add(async () => {
72
- const deletionIds = Object.keys(keyData).filter(id => keyData[id] === null);
73
- if (deletionIds.length === 0)
74
- return;
75
- const existingKeys = await this.store.get(keyType, deletionIds);
76
- for (const keyId of deletionIds) {
77
- if (!existingKeys[keyId]) {
78
- this.logger.warn(`Skipping deletion of non-existent ${keyType}: ${keyId}`);
79
- delete data[keyType][keyId];
80
- }
81
- }
82
- });
83
- }
84
- }
85
- //=======================================================//