@pontalabs/baileys 1.0.11 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +96 -85
  2. package/lib/Defaults/connection.js +39 -0
  3. package/lib/Defaults/constants.js +50 -0
  4. package/lib/Defaults/history.js +13 -0
  5. package/lib/Defaults/index.js +36 -151
  6. package/lib/Defaults/media.js +43 -0
  7. package/lib/Defaults/phonenumber-mcc.json +221 -221
  8. package/lib/Defaults/prefix.js +12 -0
  9. package/lib/Defaults/vialeys-version.json +7 -0
  10. package/lib/Signal/Group/ciphertext-message.js +10 -15
  11. package/lib/Signal/Group/group-session-builder.js +34 -60
  12. package/lib/Signal/Group/group_cipher.js +69 -76
  13. package/lib/Signal/Group/index.js +41 -60
  14. package/lib/Signal/Group/keyhelper.js +12 -57
  15. package/lib/Signal/Group/sender-chain-key.js +20 -33
  16. package/lib/Signal/Group/sender-key-distribution-message.js +43 -48
  17. package/lib/Signal/Group/sender-key-message.js +58 -53
  18. package/lib/Signal/Group/sender-key-name.js +21 -31
  19. package/lib/Signal/Group/sender-key-record.js +21 -34
  20. package/lib/Signal/Group/sender-key-state.js +59 -106
  21. package/lib/Signal/Group/sender-message-key.js +16 -21
  22. package/lib/Signal/libsignal.js +282 -203
  23. package/lib/Signal/lid-mapping.js +164 -184
  24. package/lib/Socket/Client/index.js +31 -22
  25. package/lib/Socket/Client/types.js +9 -15
  26. package/lib/Socket/Client/websocket.js +42 -37
  27. package/lib/Socket/business.js +212 -336
  28. package/lib/Socket/chats.js +696 -940
  29. package/lib/Socket/community.js +454 -369
  30. package/lib/Socket/groups.js +278 -280
  31. package/lib/Socket/index.js +9 -21
  32. package/lib/Socket/messages-recv.js +1027 -1570
  33. package/lib/Socket/messages-send.js +1180 -1136
  34. package/lib/Socket/mex.js +59 -0
  35. package/lib/Socket/newsletter.js +193 -251
  36. package/lib/Socket/socket.js +758 -898
  37. package/lib/Store/index.js +35 -24
  38. package/lib/Store/make-cache-manager-store.js +53 -66
  39. package/lib/Store/make-in-memory-store.js +319 -325
  40. package/lib/Store/make-ordered-dictionary.js +49 -57
  41. package/lib/Store/object-repository.js +10 -15
  42. package/lib/Types/Auth.js +2 -3
  43. package/lib/Types/Bussines.js +2 -3
  44. package/lib/Types/Call.js +2 -3
  45. package/lib/Types/Chat.js +10 -9
  46. package/lib/Types/Contact.js +2 -3
  47. package/lib/Types/Events.js +2 -3
  48. package/lib/Types/GroupMetadata.js +2 -3
  49. package/lib/Types/Label.js +6 -12
  50. package/lib/Types/LabelAssociation.js +4 -13
  51. package/lib/Types/Message.js +10 -18
  52. package/lib/Types/MexUpdates.js +15 -18
  53. package/lib/Types/Newsletter.js +26 -34
  54. package/lib/Types/Product.js +2 -3
  55. package/lib/Types/Signal.js +2 -3
  56. package/lib/Types/Socket.js +2 -3
  57. package/lib/Types/State.js +8 -13
  58. package/lib/Types/USync.js +2 -3
  59. package/lib/Types/index.js +49 -40
  60. package/lib/Utils/auth-utils.js +190 -495
  61. package/lib/Utils/browser-utils.js +29 -0
  62. package/lib/Utils/business.js +177 -199
  63. package/lib/Utils/chat-utils.js +711 -624
  64. package/lib/Utils/crypto.js +116 -161
  65. package/lib/Utils/decode-wa-message.js +225 -321
  66. package/lib/Utils/event-buffer.js +363 -405
  67. package/lib/Utils/generics.js +318 -472
  68. package/lib/Utils/history.js +72 -76
  69. package/lib/Utils/index.js +49 -41
  70. package/lib/Utils/link-preview.js +59 -103
  71. package/lib/Utils/logger.js +4 -7
  72. package/lib/Utils/lt-hash.js +29 -42
  73. package/lib/Utils/make-mutex.js +26 -42
  74. package/lib/Utils/message-retry-manager.js +134 -160
  75. package/lib/Utils/messages-media.js +665 -731
  76. package/lib/Utils/messages.js +518 -1
  77. package/lib/Utils/noise-handler.js +127 -125
  78. package/lib/Utils/pre-key-manager.js +86 -0
  79. package/lib/Utils/process-message.js +739 -351
  80. package/lib/Utils/signal.js +146 -129
  81. package/lib/Utils/use-multi-file-auth-state.js +68 -135
  82. package/lib/Utils/validate-connection.js +183 -142
  83. package/lib/Utils/vialeys-event-stream.js +41 -0
  84. package/lib/WABinary/constants.js +1281 -1289
  85. package/lib/WABinary/decode.js +145 -200
  86. package/lib/WABinary/encode.js +149 -202
  87. package/lib/WABinary/generic-utils.js +79 -97
  88. package/lib/WABinary/index.js +36 -25
  89. package/lib/WABinary/jid-utils.js +91 -123
  90. package/lib/WABinary/types.js +2 -3
  91. package/lib/WAM/BinaryInfo.js +8 -13
  92. package/lib/WAM/constants.js +16584 -11464
  93. package/lib/WAM/encode.js +117 -133
  94. package/lib/WAM/index.js +34 -23
  95. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +62 -69
  96. package/lib/WAUSync/Protocols/USyncContactProtocol.js +11 -25
  97. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +32 -44
  98. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +13 -23
  99. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +24 -38
  100. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +17 -31
  101. package/lib/WAUSync/Protocols/index.js +37 -26
  102. package/lib/WAUSync/USyncQuery.js +66 -66
  103. package/lib/WAUSync/USyncUser.js +13 -18
  104. package/lib/WAUSync/index.js +34 -23
  105. package/lib/index.js +95 -28
  106. package/package.json +2 -1
  107. package/lib/Defaults/baileys-version.json +0 -3
  108. package/lib/Signal/Group/queue-job.d.ts +0 -1
  109. package/lib/Signal/Group/queue-job.js +0 -57
  110. package/lib/Socket/usync.d.ts +0 -37
  111. package/lib/Socket/usync.js +0 -83
  112. package/lib/Utils/baileys-event-stream.d.ts +0 -18
  113. package/lib/Utils/baileys-event-stream.js +0 -70
  114. package/lib/Utils/signal-housekeeping.d.ts +0 -19
  115. package/lib/Utils/signal-housekeeping.js +0 -73
  116. package/lib/Utils/use-mongo-file-auth-state.d.ts +0 -6
  117. package/lib/Utils/use-mongo-file-auth-state.js +0 -84
  118. package/lib/Utils/use-single-file-auth-state.d.ts +0 -13
  119. package/lib/Utils/use-single-file-auth-state.js +0 -80
@@ -1,597 +1,555 @@
1
- "use strict"
2
-
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod }
5
- }
6
-
7
- Object.defineProperty(exports, "__esModule", { value: true })
8
-
9
- const events_1 = __importDefault(require("events"))
10
- const Types_1 = require("../Types")
11
- const generics_1 = require("./generics")
12
- const messages_1 = require("./messages")
13
- const process_message_1 = require("./process-message")
14
-
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const EventEmitter = require("events");
4
+ const { WAMessageStatus: WAMessageStatus } = require("../Types");
5
+ const { trimUndefined: trimUndefined } = require("./generics");
6
+ const {
7
+ updateMessageWithReceipt: updateMessageWithReceipt,
8
+ updateMessageWithReaction: updateMessageWithReaction,
9
+ } = require("./messages");
10
+ const { isRealMessage: isRealMessage } = require("./process-message");
15
11
  const BUFFERABLE_EVENT = [
16
- 'messaging-history.set',
17
- 'chats.upsert',
18
- 'chats.update',
19
- 'chats.delete',
20
- 'contacts.upsert',
21
- 'contacts.update',
22
- 'messages.upsert',
23
- 'messages.update',
24
- 'messages.delete',
25
- //'messages.poll',
26
- 'messages.reaction',
27
- 'message-receipt.update',
28
- 'groups.update',
29
- ]
30
-
31
- const BUFFERABLE_EVENT_SET = new Set(BUFFERABLE_EVENT)
32
-
33
- /**
34
- * The event buffer logically consolidates different events into a single event
35
- * making the data processing more efficient.
36
- */
12
+ "messaging-history.set",
13
+ "chats.upsert",
14
+ "chats.update",
15
+ "chats.delete",
16
+ "contacts.upsert",
17
+ "contacts.update",
18
+ "messages.upsert",
19
+ "messages.update",
20
+ "messages.delete",
21
+ "messages.reaction",
22
+ "message-receipt.update",
23
+ "groups.update",
24
+ ];
25
+ const BUFFERABLE_EVENT_SET = new Set(BUFFERABLE_EVENT);
37
26
  const makeEventBuffer = (logger) => {
38
- const ev = new events_1.default()
39
- const historyCache = new Set()
40
- let data = makeBufferData()
41
- let isBuffering = false
42
- let bufferTimeout = null
43
- let flushPendingTimeout = null
44
- let bufferCount = 0
45
- const MAX_HISTORY_CACHE_SIZE = 10000 // Limit the history cache size to prevent memory bloat
46
- const BUFFER_TIMEOUT_MS = 30000 // 30 seconds
47
-
48
- // take the generic event and fire it as a baileys event
49
- ev.on('event', (map) => {
27
+ const ev = new EventEmitter();
28
+ const historyCache = new Set();
29
+ let data = makeBufferData();
30
+ let isBuffering = false;
31
+ let bufferTimeout = null;
32
+ let bufferCount = 0;
33
+ const MAX_HISTORY_CACHE_SIZE = 1e4;
34
+ const BUFFER_TIMEOUT_MS = 3e4;
35
+ ev.on("event", (map) => {
50
36
  for (const event in map) {
51
- ev.emit(event, map[event])
37
+ ev.emit(event, map[event]);
52
38
  }
53
- })
39
+ });
54
40
  function buffer() {
55
41
  if (!isBuffering) {
56
- logger.debug('Event buffer activated')
57
- isBuffering = true
58
- bufferCount++
59
-
60
- // Auto-flush after a timeout to prevent infinite buffering
42
+ logger.debug("Event buffer activated");
43
+ isBuffering = true;
44
+ bufferCount++;
61
45
  if (bufferTimeout) {
62
- clearTimeout(bufferTimeout)
46
+ clearTimeout(bufferTimeout);
63
47
  }
64
-
65
48
  bufferTimeout = setTimeout(() => {
66
49
  if (isBuffering) {
67
- logger.warn('Buffer timeout reached, auto-flushing')
68
- flush()
50
+ logger.warn("Buffer timeout reached, auto-flushing");
51
+ flush();
69
52
  }
70
- }, BUFFER_TIMEOUT_MS)
71
- }
72
- else {
73
- bufferCount++
53
+ }, BUFFER_TIMEOUT_MS);
54
+ } else {
55
+ bufferCount++;
74
56
  }
75
57
  }
76
58
  function flush() {
77
59
  if (!isBuffering) {
78
- return false
60
+ return false;
79
61
  }
80
-
81
- logger.debug({ bufferCount }, 'Flushing event buffer')
82
- isBuffering = false
83
- bufferCount = 0
84
-
85
- // Clear timeouts
62
+ logger.debug({ bufferCount: bufferCount }, "Flushing event buffer");
63
+ isBuffering = false;
64
+ bufferCount = 0;
86
65
  if (bufferTimeout) {
87
- clearTimeout(bufferTimeout)
88
- bufferTimeout = null
89
- }
90
- if (flushPendingTimeout) {
91
- clearTimeout(flushPendingTimeout)
92
- flushPendingTimeout = null
66
+ clearTimeout(bufferTimeout);
67
+ bufferTimeout = null;
93
68
  }
94
-
95
- // Clear history cache if it exceeds the max size
96
69
  if (historyCache.size > MAX_HISTORY_CACHE_SIZE) {
97
- logger.debug({ cacheSize: historyCache.size }, 'Clearing history cache')
98
- historyCache.clear()
70
+ logger.debug({ cacheSize: historyCache.size }, "Clearing history cache");
71
+ historyCache.clear();
99
72
  }
100
-
101
- const newData = makeBufferData()
102
- const chatUpdates = Object.values(data.chatUpdates)
103
- let conditionalChatUpdatesLeft = 0
73
+ const newData = makeBufferData();
74
+ const chatUpdates = Object.values(data.chatUpdates);
75
+ let conditionalChatUpdatesLeft = 0;
104
76
  for (const update of chatUpdates) {
105
77
  if (update.conditional) {
106
- conditionalChatUpdatesLeft += 1
107
- newData.chatUpdates[update.id] = update
108
- delete data.chatUpdates[update.id]
78
+ conditionalChatUpdatesLeft += 1;
79
+ newData.chatUpdates[update.id] = update;
80
+ delete data.chatUpdates[update.id];
109
81
  }
110
82
  }
111
- const consolidatedData = consolidateEvents(data)
83
+ const consolidatedData = consolidateEvents(data);
112
84
  if (Object.keys(consolidatedData).length) {
113
- ev.emit('event', consolidatedData)
85
+ ev.emit("event", consolidatedData);
114
86
  }
115
- data = newData
116
- logger.trace({ conditionalChatUpdatesLeft }, 'released buffered events')
117
- return true
87
+ data = newData;
88
+ logger.trace(
89
+ { conditionalChatUpdatesLeft: conditionalChatUpdatesLeft },
90
+ "released buffered events"
91
+ );
92
+ return true;
118
93
  }
119
94
  return {
120
95
  process(handler) {
121
96
  const listener = (map) => {
122
- handler(map)
123
- }
124
- ev.on('event', listener)
97
+ handler(map);
98
+ };
99
+ ev.on("event", listener);
125
100
  return () => {
126
- ev.off('event', listener)
127
- }
101
+ ev.off("event", listener);
102
+ };
128
103
  },
129
104
  emit(event, evData) {
105
+ if (event === "messages.upsert") {
106
+ const { type: type } = evData;
107
+ const existingUpserts = Object.values(data.messageUpserts);
108
+ if (existingUpserts.length > 0) {
109
+ const bufferedType = existingUpserts[0].type;
110
+ if (bufferedType !== type) {
111
+ logger.debug(
112
+ { bufferedType: bufferedType, newType: type },
113
+ "messages.upsert type mismatch, emitting buffered messages"
114
+ );
115
+ ev.emit("event", {
116
+ "messages.upsert": {
117
+ messages: existingUpserts.map((m) => m.message),
118
+ type: bufferedType,
119
+ },
120
+ });
121
+ data.messageUpserts = {};
122
+ }
123
+ }
124
+ }
130
125
  if (isBuffering && BUFFERABLE_EVENT_SET.has(event)) {
131
- append(data, historyCache, event, evData, logger)
132
- return true
126
+ append(data, historyCache, event, evData, logger);
127
+ return true;
133
128
  }
134
- return ev.emit('event', { [event]: evData })
129
+ return ev.emit("event", { [event]: evData });
135
130
  },
136
131
  isBuffering() {
137
- return isBuffering
132
+ return isBuffering;
138
133
  },
139
- buffer,
140
- flush,
134
+ buffer: buffer,
135
+ flush: flush,
141
136
  createBufferedFunction(work) {
142
137
  return async (...args) => {
143
- buffer()
138
+ buffer();
144
139
  try {
145
- const result = await work(...args)
146
- return result
147
- }
148
- catch (error) {
149
- throw error
150
- }
151
- finally {
152
- bufferCount = Math.max(0, bufferCount - 1)
153
-
154
- if (bufferCount === 0 && isBuffering) {
155
- // Only schedule ONE flush timer at a time to prevent timer storms
156
- if (!flushPendingTimeout) {
157
- flushPendingTimeout = setTimeout(() => {
158
- flushPendingTimeout = null
159
- if (isBuffering && bufferCount === 0) {
160
- flush()
161
- }
162
- }, 100)
163
- }
140
+ const result = await work(...args);
141
+ if (bufferCount === 1) {
142
+ setTimeout(() => {
143
+ if (isBuffering && bufferCount === 1) {
144
+ flush();
145
+ }
146
+ }, 100);
147
+ }
148
+ return result;
149
+ } catch (error) {
150
+ throw error;
151
+ } finally {
152
+ bufferCount = Math.max(0, bufferCount - 1);
153
+ if (bufferCount === 0) {
154
+ setTimeout(flush, 100);
164
155
  }
165
156
  }
166
- }
157
+ };
167
158
  },
168
159
  on: (...args) => ev.on(...args),
169
160
  off: (...args) => ev.off(...args),
170
161
  removeAllListeners: (...args) => ev.removeAllListeners(...args),
171
- }
172
- }
173
-
174
- const makeBufferData = () => {
175
- return {
176
- historySets: {
177
- chats: {},
178
- messages: {},
179
- contacts: {},
180
- isLatest: false,
181
- empty: true
182
- },
183
- chatUpserts: {},
184
- chatUpdates: {},
185
- chatDeletes: new Set(),
186
- contactUpserts: {},
187
- contactUpdates: {},
188
- messageUpserts: {},
189
- messageUpdates: {},
190
- //messagePollings: {},
191
- messageReactions: {},
192
- messageDeletes: {},
193
- messageReceipts: {},
194
- groupUpdates: {}
195
- }
196
- }
197
-
162
+ };
163
+ };
164
+ const makeBufferData = () => ({
165
+ historySets: {
166
+ chats: {},
167
+ messages: {},
168
+ contacts: {},
169
+ isLatest: false,
170
+ empty: true,
171
+ },
172
+ chatUpserts: {},
173
+ chatUpdates: {},
174
+ chatDeletes: new Set(),
175
+ contactUpserts: {},
176
+ contactUpdates: {},
177
+ messageUpserts: {},
178
+ messageUpdates: {},
179
+ messageReactions: {},
180
+ messageDeletes: {},
181
+ messageReceipts: {},
182
+ groupUpdates: {},
183
+ });
198
184
  function append(data, historyCache, event, eventData, logger) {
199
- var _a, _b, _c
200
185
  switch (event) {
201
- case 'messaging-history.set':
186
+ case "messaging-history.set":
202
187
  for (const chat of eventData.chats) {
203
- const existingChat = data.historySets.chats[chat.id]
188
+ const id = chat.id || "";
189
+ const existingChat = data.historySets.chats[id];
204
190
  if (existingChat) {
205
- existingChat.endOfHistoryTransferType = chat.endOfHistoryTransferType
191
+ existingChat.endOfHistoryTransferType = chat.endOfHistoryTransferType;
206
192
  }
207
- if (!existingChat && !historyCache.has(chat.id)) {
208
- data.historySets.chats[chat.id] = chat
209
- historyCache.add(chat.id)
210
- absorbingChatUpdate(chat)
193
+ if (!existingChat && !historyCache.has(id)) {
194
+ data.historySets.chats[id] = chat;
195
+ historyCache.add(id);
196
+ absorbingChatUpdate(chat);
211
197
  }
212
198
  }
213
199
  for (const contact of eventData.contacts) {
214
- const existingContact = data.historySets.contacts[contact.id]
200
+ const existingContact = data.historySets.contacts[contact.id];
215
201
  if (existingContact) {
216
- Object.assign(existingContact, generics_1.trimUndefined(contact))
217
- }
218
- else {
219
- const historyContactId = `c:${contact.id}`
220
- const hasAnyName = contact.notify || contact.name || contact.verifiedName
202
+ Object.assign(existingContact, trimUndefined(contact));
203
+ } else {
204
+ const historyContactId = `c:${contact.id}`;
205
+ const hasAnyName = contact.notify || contact.name || contact.verifiedName;
221
206
  if (!historyCache.has(historyContactId) || hasAnyName) {
222
- data.historySets.contacts[contact.id] = contact
223
- historyCache.add(historyContactId)
207
+ data.historySets.contacts[contact.id] = contact;
208
+ historyCache.add(historyContactId);
224
209
  }
225
210
  }
226
211
  }
227
212
  for (const message of eventData.messages) {
228
- const key = stringifyMessageKey(message.key)
229
- const existingMsg = data.historySets.messages[key]
213
+ const key = stringifyMessageKey(message.key);
214
+ const existingMsg = data.historySets.messages[key];
230
215
  if (!existingMsg && !historyCache.has(key)) {
231
- data.historySets.messages[key] = message
232
- historyCache.add(key)
216
+ data.historySets.messages[key] = message;
217
+ historyCache.add(key);
233
218
  }
234
219
  }
235
- data.historySets.empty = false
236
- data.historySets.syncType = eventData.syncType
237
- data.historySets.progress = eventData.progress
238
- data.historySets.peerDataRequestSessionId = eventData.peerDataRequestSessionId
239
- data.historySets.isLatest = eventData.isLatest || data.historySets.isLatest
240
- break
241
- case 'chats.upsert':
220
+ data.historySets.empty = false;
221
+ data.historySets.syncType = eventData.syncType;
222
+ data.historySets.progress = eventData.progress;
223
+ data.historySets.peerDataRequestSessionId = eventData.peerDataRequestSessionId;
224
+ data.historySets.isLatest = eventData.isLatest || data.historySets.isLatest;
225
+ break;
226
+ case "chats.upsert":
242
227
  for (const chat of eventData) {
243
- let upsert = data.chatUpserts[chat.id]
244
- if (!upsert) {
245
- upsert = data.historySets[chat.id]
228
+ const id = chat.id || "";
229
+ let upsert = data.chatUpserts[id];
230
+ if (id && !upsert) {
231
+ upsert = data.historySets.chats[id];
246
232
  if (upsert) {
247
- logger.debug({ chatId: chat.id }, 'absorbed chat upsert in chat set')
233
+ logger.debug({ chatId: id }, "absorbed chat upsert in chat set");
248
234
  }
249
235
  }
250
236
  if (upsert) {
251
- upsert = concatChats(upsert, chat)
252
- }
253
- else {
254
- upsert = chat
255
- data.chatUpserts[chat.id] = upsert
237
+ upsert = concatChats(upsert, chat);
238
+ } else {
239
+ upsert = chat;
240
+ data.chatUpserts[id] = upsert;
256
241
  }
257
- absorbingChatUpdate(upsert)
258
- if (data.chatDeletes.has(chat.id)) {
259
- data.chatDeletes.delete(chat.id)
242
+ absorbingChatUpdate(upsert);
243
+ if (data.chatDeletes.has(id)) {
244
+ data.chatDeletes.delete(id);
260
245
  }
261
246
  }
262
- break
263
- case 'chats.update':
247
+ break;
248
+ case "chats.update":
264
249
  for (const update of eventData) {
265
- const chatId = update.id
266
- const conditionMatches = update.conditional ? update.conditional(data) : true
250
+ const chatId = update.id;
251
+ const conditionMatches = update.conditional ? update.conditional(data) : true;
267
252
  if (conditionMatches) {
268
- delete update.conditional
269
- // if there is an existing upsert, merge the update into it
270
- const upsert = data.historySets.chats[chatId] || data.chatUpserts[chatId]
253
+ delete update.conditional;
254
+ const upsert = data.historySets.chats[chatId] || data.chatUpserts[chatId];
271
255
  if (upsert) {
272
- concatChats(upsert, update)
256
+ concatChats(upsert, update);
257
+ } else {
258
+ const chatUpdate = data.chatUpdates[chatId] || {};
259
+ data.chatUpdates[chatId] = concatChats(chatUpdate, update);
273
260
  }
274
- else {
275
- // merge the update into the existing update
276
- const chatUpdate = data.chatUpdates[chatId] || {}
277
- data.chatUpdates[chatId] = concatChats(chatUpdate, update)
278
- }
279
- }
280
- else if (conditionMatches === undefined) {
281
- // condition yet to be fulfilled
282
- data.chatUpdates[chatId] = update
261
+ } else if (conditionMatches === undefined) {
262
+ data.chatUpdates[chatId] = update;
283
263
  }
284
- // otherwise -- condition not met, update is invalid
285
- // if the chat has been updated
286
- // ignore any existing chat delete
287
264
  if (data.chatDeletes.has(chatId)) {
288
- data.chatDeletes.delete(chatId)
265
+ data.chatDeletes.delete(chatId);
289
266
  }
290
267
  }
291
- break
292
- case 'chats.delete':
268
+ break;
269
+ case "chats.delete":
293
270
  for (const chatId of eventData) {
294
271
  if (!data.chatDeletes.has(chatId)) {
295
- data.chatDeletes.add(chatId)
272
+ data.chatDeletes.add(chatId);
296
273
  }
297
- // remove any prior updates & upserts
298
274
  if (data.chatUpdates[chatId]) {
299
- delete data.chatUpdates[chatId]
275
+ delete data.chatUpdates[chatId];
300
276
  }
301
277
  if (data.chatUpserts[chatId]) {
302
- delete data.chatUpserts[chatId]
278
+ delete data.chatUpserts[chatId];
303
279
  }
304
280
  if (data.historySets.chats[chatId]) {
305
- delete data.historySets.chats[chatId]
281
+ delete data.historySets.chats[chatId];
306
282
  }
307
283
  }
308
- break
309
- case 'contacts.upsert':
284
+ break;
285
+ case "contacts.upsert":
310
286
  for (const contact of eventData) {
311
- let upsert = data.contactUpserts[contact.id]
287
+ let upsert = data.contactUpserts[contact.id];
312
288
  if (!upsert) {
313
- upsert = data.historySets.contacts[contact.id]
289
+ upsert = data.historySets.contacts[contact.id];
314
290
  if (upsert) {
315
- logger.debug({ contactId: contact.id }, 'absorbed contact upsert in contact set')
291
+ logger.debug(
292
+ { contactId: contact.id },
293
+ "absorbed contact upsert in contact set"
294
+ );
316
295
  }
317
296
  }
318
297
  if (upsert) {
319
- upsert = Object.assign(upsert, generics_1.trimUndefined(contact))
320
- }
321
- else {
322
- upsert = contact
323
- data.contactUpserts[contact.id] = upsert
298
+ upsert = Object.assign(upsert, trimUndefined(contact));
299
+ } else {
300
+ upsert = contact;
301
+ data.contactUpserts[contact.id] = upsert;
324
302
  }
325
303
  if (data.contactUpdates[contact.id]) {
326
- upsert = Object.assign(data.contactUpdates[contact.id], generics_1.trimUndefined(contact))
327
- delete data.contactUpdates[contact.id]
304
+ upsert = Object.assign(data.contactUpdates[contact.id], trimUndefined(contact));
305
+ delete data.contactUpdates[contact.id];
328
306
  }
329
307
  }
330
- break
331
- case 'contacts.update':
332
- const contactUpdates = eventData
308
+ break;
309
+ case "contacts.update":
310
+ const contactUpdates = eventData;
333
311
  for (const update of contactUpdates) {
334
- const id = update.id
335
- // merge into prior upsert
336
- const upsert = data.historySets.contacts[id] || data.contactUpserts[id]
312
+ const id = update.id;
313
+ const upsert = data.historySets.contacts[id] || data.contactUpserts[id];
337
314
  if (upsert) {
338
- Object.assign(upsert, update)
339
- }
340
- else {
341
- // merge into prior update
342
- const contactUpdate = data.contactUpdates[id] || {}
343
- data.contactUpdates[id] = Object.assign(contactUpdate, update)
315
+ Object.assign(upsert, update);
316
+ } else {
317
+ const contactUpdate = data.contactUpdates[id] || {};
318
+ data.contactUpdates[id] = Object.assign(contactUpdate, update);
344
319
  }
345
320
  }
346
- break
347
- case 'messages.upsert':
348
- const { messages, type } = eventData
321
+ break;
322
+ case "messages.upsert":
323
+ const { messages: messages, type: type } = eventData;
349
324
  for (const message of messages) {
350
- const key = stringifyMessageKey(message.key)
351
- let existing = (_a = data.messageUpserts[key]) === null || _a === void 0 ? void 0 : _a.message
325
+ const key = stringifyMessageKey(message.key);
326
+ let existing = data.messageUpserts[key]?.message;
352
327
  if (!existing) {
353
- existing = data.historySets.messages[key]
328
+ existing = data.historySets.messages[key];
354
329
  if (existing) {
355
- logger.debug({ messageId: key }, 'absorbed message upsert in message set')
330
+ logger.debug({ messageId: key }, "absorbed message upsert in message set");
356
331
  }
357
332
  }
358
333
  if (existing) {
359
- message.messageTimestamp = existing.messageTimestamp
334
+ message.messageTimestamp = existing.messageTimestamp;
360
335
  }
361
336
  if (data.messageUpdates[key]) {
362
- logger.debug('absorbed prior message update in message upsert')
363
- Object.assign(message, data.messageUpdates[key].update)
364
- delete data.messageUpdates[key]
337
+ logger.debug("absorbed prior message update in message upsert");
338
+ Object.assign(message, data.messageUpdates[key].update);
339
+ delete data.messageUpdates[key];
365
340
  }
366
341
  if (data.historySets.messages[key]) {
367
- data.historySets.messages[key] = message
368
- }
369
- else {
342
+ data.historySets.messages[key] = message;
343
+ } else {
370
344
  data.messageUpserts[key] = {
371
- message,
372
- type: type === 'notify' || ((_b = data.messageUpserts[key]) === null || _b === void 0 ? void 0 : _b.type) === 'notify'
373
- ? 'notify'
374
- : type
375
- }
345
+ message: message,
346
+ type:
347
+ type === "notify" || data.messageUpserts[key]?.type === "notify"
348
+ ? "notify"
349
+ : type,
350
+ };
376
351
  }
377
352
  }
378
- break
379
- case 'messages.update':
380
- const msgUpdates = eventData
381
- for (const { key, update } of msgUpdates) {
382
- const keyStr = stringifyMessageKey(key)
383
- const existing = data.historySets.messages[keyStr] || ((_c = data.messageUpserts[keyStr]) === null || _c === void 0 ? void 0 : _c.message)
353
+ break;
354
+ case "messages.update":
355
+ const msgUpdates = eventData;
356
+ for (const { key: key, update: update } of msgUpdates) {
357
+ const keyStr = stringifyMessageKey(key);
358
+ const existing =
359
+ data.historySets.messages[keyStr] || data.messageUpserts[keyStr]?.message;
384
360
  if (existing) {
385
- Object.assign(existing, update)
386
- // if the message was received & read by us
387
- // the chat counter must have been incremented
388
- // so we need to decrement it
389
- if (update.status === Types_1.WAMessageStatus.READ && !key.fromMe) {
390
- decrementChatReadCounterIfMsgDidUnread(existing)
361
+ Object.assign(existing, update);
362
+ if (update.status === WAMessageStatus.READ && !key.fromMe) {
363
+ decrementChatReadCounterIfMsgDidUnread(existing);
391
364
  }
392
- }
393
- else {
394
- const msgUpdate = data.messageUpdates[keyStr] || { key, update: {} }
395
- Object.assign(msgUpdate.update, update)
396
- data.messageUpdates[keyStr] = msgUpdate
365
+ } else {
366
+ const msgUpdate = data.messageUpdates[keyStr] || {
367
+ key: key,
368
+ update: {},
369
+ };
370
+ Object.assign(msgUpdate.update, update);
371
+ data.messageUpdates[keyStr] = msgUpdate;
397
372
  }
398
373
  }
399
- break
400
- case 'messages.delete':
401
- const deleteData = eventData
402
- if ('keys' in deleteData) {
403
- const { keys } = deleteData
374
+ break;
375
+ case "messages.delete":
376
+ const deleteData = eventData;
377
+ if ("keys" in deleteData) {
378
+ const { keys: keys } = deleteData;
404
379
  for (const key of keys) {
405
- const keyStr = stringifyMessageKey(key)
380
+ const keyStr = stringifyMessageKey(key);
406
381
  if (!data.messageDeletes[keyStr]) {
407
- data.messageDeletes[keyStr] = key
382
+ data.messageDeletes[keyStr] = key;
408
383
  }
409
384
  if (data.messageUpserts[keyStr]) {
410
- delete data.messageUpserts[keyStr]
385
+ delete data.messageUpserts[keyStr];
411
386
  }
412
387
  if (data.messageUpdates[keyStr]) {
413
- delete data.messageUpdates[keyStr]
388
+ delete data.messageUpdates[keyStr];
414
389
  }
415
390
  }
391
+ } else {
416
392
  }
417
- else {
418
- // TODO: add support
419
- }
420
- break
421
- // case 'messages.poll':
422
- // const pollUpdates = eventData
423
- // for(const { vote, pollUpdateMessageKey } of pollUpdates) {
424
- // const keyStr = stringifyMessageKey(pollUpdateMessageKey)
425
- // const existing = data.messagePollings[keyStr]
426
- // if(existing) {
427
- // messages_1.updateMessageWithPollUpdate(existing.message, pollUpdates)
428
- // } else {
429
- // data.messagePollings[keyStr] = data.messagePollings[keyStr]
430
- // || { pollUpdateMessageKey, pollUpdates: [] }
431
- // messages_1.updateMessageWithPollUpdate(data.messagePollings[keyStr], vote)
432
- // }
433
- // }
434
- // break
435
- case 'messages.reaction':
436
- const reactions = eventData
437
- for (const { key, reaction } of reactions) {
438
- const keyStr = stringifyMessageKey(key)
439
- const existing = data.messageUpserts[keyStr]
393
+ break;
394
+ case "messages.reaction":
395
+ const reactions = eventData;
396
+ for (const { key: key, reaction: reaction } of reactions) {
397
+ const keyStr = stringifyMessageKey(key);
398
+ const existing = data.messageUpserts[keyStr];
440
399
  if (existing) {
441
- messages_1.updateMessageWithReaction(existing.message, reaction)
442
- }
443
- else {
444
- data.messageReactions[keyStr] = data.messageReactions[keyStr]
445
- || { key, reactions: [] }
446
- messages_1.updateMessageWithReaction(data.messageReactions[keyStr], reaction)
400
+ updateMessageWithReaction(existing.message, reaction);
401
+ } else {
402
+ data.messageReactions[keyStr] = data.messageReactions[keyStr] || {
403
+ key: key,
404
+ reactions: [],
405
+ };
406
+ updateMessageWithReaction(data.messageReactions[keyStr], reaction);
447
407
  }
448
408
  }
449
- break
450
- case 'message-receipt.update':
451
- const receipts = eventData
452
- for (const { key, receipt } of receipts) {
453
- const keyStr = stringifyMessageKey(key)
454
- const existing = data.messageUpserts[keyStr]
409
+ break;
410
+ case "message-receipt.update":
411
+ const receipts = eventData;
412
+ for (const { key: key, receipt: receipt } of receipts) {
413
+ const keyStr = stringifyMessageKey(key);
414
+ const existing = data.messageUpserts[keyStr];
455
415
  if (existing) {
456
- messages_1.updateMessageWithReceipt(existing.message, receipt)
457
- }
458
- else {
459
- data.messageReceipts[keyStr] = data.messageReceipts[keyStr]
460
- || { key, userReceipt: [] }
461
- messages_1.updateMessageWithReceipt(data.messageReceipts[keyStr], receipt)
416
+ updateMessageWithReceipt(existing.message, receipt);
417
+ } else {
418
+ data.messageReceipts[keyStr] = data.messageReceipts[keyStr] || {
419
+ key: key,
420
+ userReceipt: [],
421
+ };
422
+ updateMessageWithReceipt(data.messageReceipts[keyStr], receipt);
462
423
  }
463
424
  }
464
- break
465
- case 'groups.update':
466
- const groupUpdates = eventData
425
+ break;
426
+ case "groups.update":
427
+ const groupUpdates = eventData;
467
428
  for (const update of groupUpdates) {
468
- const id = update.id
469
- const groupUpdate = data.groupUpdates[id] || {}
429
+ const id = update.id;
430
+ const groupUpdate = data.groupUpdates[id] || {};
470
431
  if (!data.groupUpdates[id]) {
471
- data.groupUpdates[id] = Object.assign(groupUpdate, update)
432
+ data.groupUpdates[id] = Object.assign(groupUpdate, update);
472
433
  }
473
434
  }
474
- break
435
+ break;
475
436
  default:
476
- throw new Error(`"${event}" cannot be buffered`)
437
+ throw new Error(`"${event}" cannot be buffered`);
477
438
  }
478
439
  function absorbingChatUpdate(existing) {
479
- const chatId = existing.id
480
- const update = data.chatUpdates[chatId]
440
+ const chatId = existing.id || "";
441
+ const update = data.chatUpdates[chatId];
481
442
  if (update) {
482
- const conditionMatches = update.conditional ? update.conditional(data) : true
443
+ const conditionMatches = update.conditional ? update.conditional(data) : true;
483
444
  if (conditionMatches) {
484
- delete update.conditional
485
- logger.debug({ chatId }, 'absorbed chat update in existing chat')
486
- Object.assign(existing, concatChats(update, existing))
487
- delete data.chatUpdates[chatId]
488
- }
489
- else if (conditionMatches === false) {
490
- logger.debug({ chatId }, 'chat update condition fail, removing')
491
- delete data.chatUpdates[chatId]
445
+ delete update.conditional;
446
+ logger.debug({ chatId: chatId }, "absorbed chat update in existing chat");
447
+ Object.assign(existing, concatChats(update, existing));
448
+ delete data.chatUpdates[chatId];
449
+ } else if (conditionMatches === false) {
450
+ logger.debug({ chatId: chatId }, "chat update condition fail, removing");
451
+ delete data.chatUpdates[chatId];
492
452
  }
493
453
  }
494
454
  }
495
455
  function decrementChatReadCounterIfMsgDidUnread(message) {
496
- // decrement chat unread counter
497
- // if the message has already been marked read by us
498
- const chatId = message.key.remoteJid
499
- const chat = data.chatUpdates[chatId] || data.chatUpserts[chatId]
500
- if (process_message_1.isRealMessage(message, '')
501
- && process_message_1.shouldIncrementChatUnread(message)
502
- && typeof (chat?.unreadCount) === 'number'
503
- && chat.unreadCount > 0) {
504
- logger.debug({ chatId: chat.id }, 'decrementing chat counter')
505
- chat.unreadCount -= 1
456
+ const chatId = message.key.remoteJid;
457
+ const chat = data.chatUpdates[chatId] || data.chatUpserts[chatId];
458
+ if (
459
+ isRealMessage(message) &&
460
+ shouldIncrementChatUnread(message) &&
461
+ typeof chat?.unreadCount === "number" &&
462
+ chat.unreadCount > 0
463
+ ) {
464
+ logger.debug({ chatId: chat.id }, "decrementing chat counter");
465
+ chat.unreadCount -= 1;
506
466
  if (chat.unreadCount === 0) {
507
- delete chat.unreadCount
467
+ delete chat.unreadCount;
508
468
  }
509
469
  }
510
470
  }
511
471
  }
512
472
  function consolidateEvents(data) {
513
- const map = {}
473
+ const map = {};
514
474
  if (!data.historySets.empty) {
515
- map['messaging-history.set'] = {
475
+ map["messaging-history.set"] = {
516
476
  chats: Object.values(data.historySets.chats),
517
477
  messages: Object.values(data.historySets.messages),
518
478
  contacts: Object.values(data.historySets.contacts),
519
479
  syncType: data.historySets.syncType,
520
480
  progress: data.historySets.progress,
521
481
  isLatest: data.historySets.isLatest,
522
- peerDataRequestSessionId: data.historySets.peerDataRequestSessionId
523
- }
482
+ peerDataRequestSessionId: data.historySets.peerDataRequestSessionId,
483
+ };
524
484
  }
525
- const chatUpsertList = Object.values(data.chatUpserts)
485
+ const chatUpsertList = Object.values(data.chatUpserts);
526
486
  if (chatUpsertList.length) {
527
- map['chats.upsert'] = chatUpsertList
487
+ map["chats.upsert"] = chatUpsertList;
528
488
  }
529
- const chatUpdateList = Object.values(data.chatUpdates)
489
+ const chatUpdateList = Object.values(data.chatUpdates);
530
490
  if (chatUpdateList.length) {
531
- map['chats.update'] = chatUpdateList
491
+ map["chats.update"] = chatUpdateList;
532
492
  }
533
- const chatDeleteList = Array.from(data.chatDeletes)
493
+ const chatDeleteList = Array.from(data.chatDeletes);
534
494
  if (chatDeleteList.length) {
535
- map['chats.delete'] = chatDeleteList
495
+ map["chats.delete"] = chatDeleteList;
536
496
  }
537
- const messageUpsertList = Object.values(data.messageUpserts)
497
+ const messageUpsertList = Object.values(data.messageUpserts);
538
498
  if (messageUpsertList.length) {
539
- const type = messageUpsertList[0].type
540
- map['messages.upsert'] = {
541
- messages: messageUpsertList.map(m => m.message),
542
- type
543
- }
499
+ const type = messageUpsertList[0].type;
500
+ map["messages.upsert"] = {
501
+ messages: messageUpsertList.map((m) => m.message),
502
+ type: type,
503
+ };
544
504
  }
545
- const messageUpdateList = Object.values(data.messageUpdates)
505
+ const messageUpdateList = Object.values(data.messageUpdates);
546
506
  if (messageUpdateList.length) {
547
- map['messages.update'] = messageUpdateList
507
+ map["messages.update"] = messageUpdateList;
548
508
  }
549
- const messageDeleteList = Object.values(data.messageDeletes)
509
+ const messageDeleteList = Object.values(data.messageDeletes);
550
510
  if (messageDeleteList.length) {
551
- map['messages.delete'] = { keys: messageDeleteList }
511
+ map["messages.delete"] = { keys: messageDeleteList };
552
512
  }
553
- // const messagePollingList = Object.values(data.messagePollings).flatMap(({ vote, pollUpdateMessageKey }) => vote.flatMap(polling => ({ polling, pollUpdateMessageKey })))
554
- // if(messagePollingList.length) {
555
- // map['messages.poll'] = messagePollingList
556
- // }
557
- const messageReactionList = Object.values(data.messageReactions).flatMap(({ key, reactions }) => reactions.flatMap(reaction => ({ key, reaction })))
513
+ const messageReactionList = Object.values(data.messageReactions).flatMap(
514
+ ({ key: key, reactions: reactions }) =>
515
+ reactions.flatMap((reaction) => ({ key: key, reaction: reaction }))
516
+ );
558
517
  if (messageReactionList.length) {
559
- map['messages.reaction'] = messageReactionList
518
+ map["messages.reaction"] = messageReactionList;
560
519
  }
561
- const messageReceiptList = Object.values(data.messageReceipts).flatMap(({ key, userReceipt }) => userReceipt.flatMap(receipt => ({ key, receipt })))
520
+ const messageReceiptList = Object.values(data.messageReceipts).flatMap(
521
+ ({ key: key, userReceipt: userReceipt }) =>
522
+ userReceipt.flatMap((receipt) => ({ key: key, receipt: receipt }))
523
+ );
562
524
  if (messageReceiptList.length) {
563
- map['message-receipt.update'] = messageReceiptList
525
+ map["message-receipt.update"] = messageReceiptList;
564
526
  }
565
- const contactUpsertList = Object.values(data.contactUpserts)
527
+ const contactUpsertList = Object.values(data.contactUpserts);
566
528
  if (contactUpsertList.length) {
567
- map['contacts.upsert'] = contactUpsertList
529
+ map["contacts.upsert"] = contactUpsertList;
568
530
  }
569
- const contactUpdateList = Object.values(data.contactUpdates)
531
+ const contactUpdateList = Object.values(data.contactUpdates);
570
532
  if (contactUpdateList.length) {
571
- map['contacts.update'] = contactUpdateList
533
+ map["contacts.update"] = contactUpdateList;
572
534
  }
573
- const groupUpdateList = Object.values(data.groupUpdates)
535
+ const groupUpdateList = Object.values(data.groupUpdates);
574
536
  if (groupUpdateList.length) {
575
- map['groups.update'] = groupUpdateList
537
+ map["groups.update"] = groupUpdateList;
576
538
  }
577
- return map
539
+ return map;
578
540
  }
579
541
  function concatChats(a, b) {
580
- if (b.unreadCount === null && // neutralize unread counter
581
- a.unreadCount < 0) {
582
- a.unreadCount = undefined
583
- b.unreadCount = undefined
542
+ if (b.unreadCount === null && a.unreadCount < 0) {
543
+ a.unreadCount = undefined;
544
+ b.unreadCount = undefined;
584
545
  }
585
- if (typeof a.unreadCount === 'number' && typeof b.unreadCount === 'number') {
586
- b = { ...b }
546
+ if (typeof a.unreadCount === "number" && typeof b.unreadCount === "number") {
547
+ b = { ...b };
587
548
  if (b.unreadCount >= 0) {
588
- b.unreadCount = Math.max(b.unreadCount, 0) + Math.max(a.unreadCount, 0)
549
+ b.unreadCount = Math.max(b.unreadCount, 0) + Math.max(a.unreadCount, 0);
589
550
  }
590
551
  }
591
- return Object.assign(a, b)
592
- }
593
- const stringifyMessageKey = (key) => `${key.remoteJid},${key.id},${key.fromMe ? '1' : '0'}`
594
-
595
- module.exports = {
596
- makeEventBuffer
552
+ return Object.assign(a, b);
597
553
  }
554
+ const stringifyMessageKey = (key) => `${key.remoteJid},${key.id},${key.fromMe ? "1" : "0"}`;
555
+ module.exports = { makeEventBuffer: makeEventBuffer };