@neelegirl/baileys 1.5.3 → 1.5.5

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 (224) hide show
  1. package/README.md +16 -195
  2. package/index.js +38 -0
  3. package/package.json +16 -96
  4. package/LICENSE +0 -21
  5. package/WAProto/WAProto.proto +0 -5308
  6. package/WAProto/index.d.ts +0 -61295
  7. package/WAProto/index.js +0 -189754
  8. package/lib/Defaults/baileys-version.json +0 -3
  9. package/lib/Defaults/index.d.ts +0 -78
  10. package/lib/Defaults/index.js +0 -149
  11. package/lib/Defaults/phonenumber-mcc.json +0 -223
  12. package/lib/Signal/WASignalGroup/GroupProtocol.js +0 -1909
  13. package/lib/Signal/WASignalGroup/ciphertext-message.d.ts +0 -9
  14. package/lib/Signal/WASignalGroup/ciphertext-message.js +0 -19
  15. package/lib/Signal/WASignalGroup/ciphertext_message.js +0 -16
  16. package/lib/Signal/WASignalGroup/generate-proto.sh +0 -1
  17. package/lib/Signal/WASignalGroup/group-session-builder.d.ts +0 -17
  18. package/lib/Signal/WASignalGroup/group-session-builder.js +0 -72
  19. package/lib/Signal/WASignalGroup/group.proto +0 -42
  20. package/lib/Signal/WASignalGroup/group_cipher.d.ts +0 -19
  21. package/lib/Signal/WASignalGroup/group_cipher.js +0 -111
  22. package/lib/Signal/WASignalGroup/group_session_builder.js +0 -46
  23. package/lib/Signal/WASignalGroup/index.d.ts +0 -11
  24. package/lib/Signal/WASignalGroup/index.js +0 -61
  25. package/lib/Signal/WASignalGroup/keyhelper.d.ts +0 -16
  26. package/lib/Signal/WASignalGroup/keyhelper.js +0 -66
  27. package/lib/Signal/WASignalGroup/protobufs.js +0 -3
  28. package/lib/Signal/WASignalGroup/queue_job.js +0 -69
  29. package/lib/Signal/WASignalGroup/readme.md +0 -6
  30. package/lib/Signal/WASignalGroup/sender-chain-key.d.ts +0 -14
  31. package/lib/Signal/WASignalGroup/sender-chain-key.js +0 -47
  32. package/lib/Signal/WASignalGroup/sender-key-distribution-message.d.ts +0 -17
  33. package/lib/Signal/WASignalGroup/sender-key-distribution-message.js +0 -71
  34. package/lib/Signal/WASignalGroup/sender-key-message.d.ts +0 -19
  35. package/lib/Signal/WASignalGroup/sender-key-message.js +0 -73
  36. package/lib/Signal/WASignalGroup/sender-key-name.d.ts +0 -19
  37. package/lib/Signal/WASignalGroup/sender-key-name.js +0 -59
  38. package/lib/Signal/WASignalGroup/sender-key-record.d.ts +0 -32
  39. package/lib/Signal/WASignalGroup/sender-key-record.js +0 -58
  40. package/lib/Signal/WASignalGroup/sender-key-state.d.ts +0 -44
  41. package/lib/Signal/WASignalGroup/sender-key-state.js +0 -147
  42. package/lib/Signal/WASignalGroup/sender-message-key.d.ts +0 -11
  43. package/lib/Signal/WASignalGroup/sender-message-key.js +0 -33
  44. package/lib/Signal/WASignalGroup/sender_chain_key.js +0 -50
  45. package/lib/Signal/WASignalGroup/sender_key_distribution_message.js +0 -78
  46. package/lib/Signal/WASignalGroup/sender_key_message.js +0 -92
  47. package/lib/Signal/WASignalGroup/sender_key_name.js +0 -70
  48. package/lib/Signal/WASignalGroup/sender_key_record.js +0 -56
  49. package/lib/Signal/WASignalGroup/sender_key_state.js +0 -129
  50. package/lib/Signal/WASignalGroup/sender_message_key.js +0 -39
  51. package/lib/Signal/libsignal.d.ts +0 -8
  52. package/lib/Signal/libsignal.js +0 -391
  53. package/lib/Signal/lid-mapping.d.ts +0 -28
  54. package/lib/Signal/lid-mapping.js +0 -184
  55. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -15
  56. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  57. package/lib/Socket/Client/index.d.ts +0 -2
  58. package/lib/Socket/Client/index.js +0 -22
  59. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -12
  60. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  61. package/lib/Socket/Client/types.d.ts +0 -16
  62. package/lib/Socket/Client/types.js +0 -18
  63. package/lib/Socket/Client/websocket.d.ts +0 -13
  64. package/lib/Socket/Client/websocket.js +0 -62
  65. package/lib/Socket/business.d.ts +0 -187
  66. package/lib/Socket/business.js +0 -415
  67. package/lib/Socket/chats.d.ts +0 -97
  68. package/lib/Socket/chats.js +0 -1118
  69. package/lib/Socket/communities.d.ts +0 -223
  70. package/lib/Socket/communities.js +0 -433
  71. package/lib/Socket/groups.d.ts +0 -129
  72. package/lib/Socket/groups.js +0 -360
  73. package/lib/Socket/index.d.ts +0 -191
  74. package/lib/Socket/index.js +0 -24
  75. package/lib/Socket/messages-recv.d.ts +0 -174
  76. package/lib/Socket/messages-recv.js +0 -1506
  77. package/lib/Socket/messages-send.d.ts +0 -165
  78. package/lib/Socket/messages-send.js +0 -1785
  79. package/lib/Socket/mex.d.ts +0 -2
  80. package/lib/Socket/mex.js +0 -47
  81. package/lib/Socket/newsletter.d.ts +0 -145
  82. package/lib/Socket/newsletter.js +0 -295
  83. package/lib/Socket/socket.d.ts +0 -45
  84. package/lib/Socket/socket.js +0 -934
  85. package/lib/Socket/usync.d.ts +0 -37
  86. package/lib/Socket/usync.js +0 -83
  87. package/lib/Store/index.d.ts +0 -4
  88. package/lib/Store/index.js +0 -24
  89. package/lib/Store/make-cache-manager-store.d.ts +0 -14
  90. package/lib/Store/make-cache-manager-store.js +0 -90
  91. package/lib/Store/make-in-memory-store.d.ts +0 -123
  92. package/lib/Store/make-in-memory-store.js +0 -429
  93. package/lib/Store/make-ordered-dictionary.d.ts +0 -12
  94. package/lib/Store/make-ordered-dictionary.js +0 -86
  95. package/lib/Store/object-repository.d.ts +0 -10
  96. package/lib/Store/object-repository.js +0 -31
  97. package/lib/Types/Auth.d.ts +0 -121
  98. package/lib/Types/Auth.js +0 -3
  99. package/lib/Types/Bussines.js +0 -3
  100. package/lib/Types/Bussiness.d.ts +0 -28
  101. package/lib/Types/Call.d.ts +0 -14
  102. package/lib/Types/Call.js +0 -3
  103. package/lib/Types/Chat.d.ts +0 -143
  104. package/lib/Types/Chat.js +0 -9
  105. package/lib/Types/Contact.d.ts +0 -23
  106. package/lib/Types/Contact.js +0 -3
  107. package/lib/Types/Events.d.ts +0 -226
  108. package/lib/Types/Events.js +0 -3
  109. package/lib/Types/GroupMetadata.d.ts +0 -66
  110. package/lib/Types/GroupMetadata.js +0 -3
  111. package/lib/Types/Label.d.ts +0 -48
  112. package/lib/Types/Label.js +0 -31
  113. package/lib/Types/LabelAssociation.d.ts +0 -35
  114. package/lib/Types/LabelAssociation.js +0 -13
  115. package/lib/Types/Message.d.ts +0 -484
  116. package/lib/Types/Message.js +0 -19
  117. package/lib/Types/MexUpdates.d.ts +0 -9
  118. package/lib/Types/MexUpdates.js +0 -18
  119. package/lib/Types/Newsletter.d.ts +0 -109
  120. package/lib/Types/Newsletter.js +0 -40
  121. package/lib/Types/Product.d.ts +0 -92
  122. package/lib/Types/Product.js +0 -3
  123. package/lib/Types/Signal.d.ts +0 -98
  124. package/lib/Types/Signal.js +0 -3
  125. package/lib/Types/Socket.d.ts +0 -141
  126. package/lib/Types/Socket.js +0 -3
  127. package/lib/Types/State.d.ts +0 -41
  128. package/lib/Types/State.js +0 -14
  129. package/lib/Types/USync.d.ts +0 -26
  130. package/lib/Types/USync.js +0 -3
  131. package/lib/Types/index.d.ts +0 -80
  132. package/lib/Types/index.js +0 -50
  133. package/lib/Utils/auth-utils.d.ts +0 -21
  134. package/lib/Utils/auth-utils.js +0 -528
  135. package/lib/Utils/baileys-event-stream.d.ts +0 -18
  136. package/lib/Utils/baileys-event-stream.js +0 -70
  137. package/lib/Utils/business.d.ts +0 -29
  138. package/lib/Utils/business.js +0 -255
  139. package/lib/Utils/chat-utils.d.ts +0 -82
  140. package/lib/Utils/chat-utils.js +0 -809
  141. package/lib/Utils/crypto.d.ts +0 -56
  142. package/lib/Utils/crypto.js +0 -189
  143. package/lib/Utils/decode-wa-message.d.ts +0 -53
  144. package/lib/Utils/decode-wa-message.js +0 -323
  145. package/lib/Utils/event-buffer.d.ts +0 -39
  146. package/lib/Utils/event-buffer.js +0 -595
  147. package/lib/Utils/generics.d.ts +0 -131
  148. package/lib/Utils/generics.js +0 -630
  149. package/lib/Utils/history.d.ts +0 -23
  150. package/lib/Utils/history.js +0 -104
  151. package/lib/Utils/index.d.ts +0 -20
  152. package/lib/Utils/index.js +0 -40
  153. package/lib/Utils/link-preview.d.ts +0 -23
  154. package/lib/Utils/link-preview.js +0 -120
  155. package/lib/Utils/logger.d.ts +0 -13
  156. package/lib/Utils/logger.js +0 -7
  157. package/lib/Utils/lt-hash.d.ts +0 -14
  158. package/lib/Utils/lt-hash.js +0 -58
  159. package/lib/Utils/make-mutex.d.ts +0 -9
  160. package/lib/Utils/make-mutex.js +0 -49
  161. package/lib/Utils/message-retry-manager.d.ts +0 -88
  162. package/lib/Utils/message-retry-manager.js +0 -160
  163. package/lib/Utils/messages-media.d.ts +0 -135
  164. package/lib/Utils/messages-media.js +0 -869
  165. package/lib/Utils/messages.d.ts +0 -105
  166. package/lib/Utils/messages.js +0 -1745
  167. package/lib/Utils/noise-handler.d.ts +0 -21
  168. package/lib/Utils/noise-handler.js +0 -165
  169. package/lib/Utils/process-message.d.ts +0 -49
  170. package/lib/Utils/process-message.js +0 -427
  171. package/lib/Utils/signal.d.ts +0 -42
  172. package/lib/Utils/signal.js +0 -166
  173. package/lib/Utils/use-mongo-file-auth-state.d.ts +0 -6
  174. package/lib/Utils/use-mongo-file-auth-state.js +0 -84
  175. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -18
  176. package/lib/Utils/use-multi-file-auth-state.js +0 -238
  177. package/lib/Utils/use-single-file-auth-state.d.ts +0 -13
  178. package/lib/Utils/use-single-file-auth-state.js +0 -80
  179. package/lib/Utils/validate-connection.d.ts +0 -13
  180. package/lib/Utils/validate-connection.js +0 -220
  181. package/lib/WABinary/constants.d.ts +0 -30
  182. package/lib/WABinary/constants.js +0 -1316
  183. package/lib/WABinary/decode.d.ts +0 -9
  184. package/lib/WABinary/decode.js +0 -288
  185. package/lib/WABinary/encode.d.ts +0 -3
  186. package/lib/WABinary/encode.js +0 -265
  187. package/lib/WABinary/generic-utils.d.ts +0 -28
  188. package/lib/WABinary/generic-utils.js +0 -142
  189. package/lib/WABinary/index.d.ts +0 -5
  190. package/lib/WABinary/index.js +0 -25
  191. package/lib/WABinary/jid-utils.d.ts +0 -58
  192. package/lib/WABinary/jid-utils.js +0 -104
  193. package/lib/WABinary/types.d.ts +0 -22
  194. package/lib/WABinary/types.js +0 -3
  195. package/lib/WAM/BinaryInfo.d.ts +0 -16
  196. package/lib/WAM/BinaryInfo.js +0 -17
  197. package/lib/WAM/constants.d.ts +0 -47
  198. package/lib/WAM/constants.js +0 -15371
  199. package/lib/WAM/encode.d.ts +0 -3
  200. package/lib/WAM/encode.js +0 -164
  201. package/lib/WAM/index.d.ts +0 -3
  202. package/lib/WAM/index.js +0 -23
  203. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.d.ts +0 -28
  204. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +0 -69
  205. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -10
  206. package/lib/WAUSync/Protocols/USyncContactProtocol.js +0 -36
  207. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -26
  208. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +0 -62
  209. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -14
  210. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +0 -35
  211. package/lib/WAUSync/Protocols/USyncLIDProtocol.d.ts +0 -10
  212. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +0 -38
  213. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -14
  214. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +0 -46
  215. package/lib/WAUSync/Protocols/index.d.ts +0 -6
  216. package/lib/WAUSync/Protocols/index.js +0 -26
  217. package/lib/WAUSync/USyncQuery.d.ts +0 -31
  218. package/lib/WAUSync/USyncQuery.js +0 -92
  219. package/lib/WAUSync/USyncUser.d.ts +0 -12
  220. package/lib/WAUSync/USyncUser.js +0 -30
  221. package/lib/WAUSync/index.d.ts +0 -3
  222. package/lib/WAUSync/index.js +0 -23
  223. package/lib/index.d.ts +0 -13
  224. package/lib/index.js +0 -33
@@ -1,528 +0,0 @@
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 crypto_1 = require("crypto")
10
- const node_cache_1 = __importDefault(require("@cacheable/node-cache"))
11
- const Defaults_1 = require("../Defaults")
12
- const LRUCache_1 = require("lru-cache")
13
- const crypto_2 = require("./crypto")
14
- const generics_1 = require("./generics")
15
- const mutex_1 = require("async-mutex")
16
- const uuid_1 = require("uuid");
17
- /**
18
- * Adds caching capability to a SignalKeyStore
19
- * @param store the store to add caching to
20
- * @param logger to log trace events
21
- * @param _cache cache store to use
22
- */
23
- function makeCacheableSignalKeyStore(store, logger, _cache) {
24
- const cache = _cache || new node_cache_1.default({
25
- stdTTL: Defaults_1.DEFAULT_CACHE_TTLS.SIGNAL_STORE,
26
- useClones: false,
27
- deleteOnExpire: true,
28
- })
29
-
30
- // Mutex for protecting cache operations
31
- const cacheMutex = new mutex_1.Mutex()
32
-
33
- function getUniqueId(type, id) {
34
- return `${type}.${id}`
35
- }
36
- return {
37
- async get(type, ids) {
38
- return cacheMutex.runExclusive(async () => {
39
- const data = {}
40
- const idsToFetch = []
41
- for (const id of ids) {
42
- const item = cache.get(getUniqueId(type, id))
43
- if (typeof item !== 'undefined') {
44
- data[id] = item
45
- }
46
- else {
47
- idsToFetch.push(id)
48
- }
49
- }
50
- if (idsToFetch.length) {
51
- logger?.trace({ items: idsToFetch.length }, 'loading from store')
52
- const fetched = await store.get(type, idsToFetch)
53
- for (const id of idsToFetch) {
54
- const item = fetched[id]
55
- if (item) {
56
- data[id] = item
57
- cache.set(getUniqueId(type, id), item)
58
- }
59
- }
60
- }
61
- return data
62
- })
63
- },
64
- async set(data) {
65
- return cacheMutex.runExclusive(async () => {
66
- let keys = 0
67
- for (const type in data) {
68
- for (const id in data[type]) {
69
- await cache.set(getUniqueId(type, id), data[type][id])
70
- keys += 1
71
- }
72
- }
73
- logger?.trace({ keys }, 'updated cache')
74
- await store.set(data)
75
- })
76
- },
77
- async clear() {
78
- await cache.flushAll()
79
- await store.clear?.call(store)
80
- }
81
- }
82
- }
83
-
84
- // Module-level specialized mutexes for pre-key operations
85
- const preKeyMutex = new mutex_1.Mutex()
86
- const signedPreKeyMutex = new mutex_1.Mutex()
87
-
88
- /**
89
- * Get the appropriate mutex for the key type
90
- */
91
- const getPreKeyMutex = (keyType) => {
92
- return keyType === 'signed-pre-key' ? signedPreKeyMutex : preKeyMutex
93
- }
94
-
95
- /**
96
- * Handles pre-key operations with mutex protection
97
- */
98
- async function handlePreKeyOperations(data, keyType, transactionCache, mutations, logger, isInTransaction, state) {
99
- const mutex = getPreKeyMutex(keyType)
100
- await mutex.runExclusive(async () => {
101
- const keyData = data[keyType]
102
- if (!keyData)
103
- return
104
-
105
- // Ensure structures exist
106
- transactionCache[keyType] = transactionCache[keyType] || {}
107
- mutations[keyType] = mutations[keyType] || {}
108
-
109
- // Separate deletions from updates for batch processing
110
- const deletionKeys = []
111
- const updateKeys = []
112
-
113
- for (const keyId in keyData) {
114
- if (keyData[keyId] === null) {
115
- deletionKeys.push(keyId)
116
- }
117
- else {
118
- updateKeys.push(keyId)
119
- }
120
- }
121
-
122
- // Process updates first (no validation needed)
123
- for (const keyId of updateKeys) {
124
- if (transactionCache[keyType]) {
125
- transactionCache[keyType][keyId] = keyData[keyId]
126
- }
127
- if (mutations[keyType]) {
128
- mutations[keyType][keyId] = keyData[keyId]
129
- }
130
- }
131
-
132
- // Process deletions with validation
133
- if (deletionKeys.length === 0)
134
- return
135
-
136
- if (isInTransaction) {
137
- // In transaction, only allow deletion if key exists in cache
138
- for (const keyId of deletionKeys) {
139
- if (transactionCache[keyType]) {
140
- transactionCache[keyType][keyId] = null
141
- if (mutations[keyType]) {
142
- // Mark for deletion in mutations
143
- mutations[keyType][keyId] = null
144
- }
145
- }
146
- else {
147
- logger.warn(`Skipping deletion of non-existent ${keyType} in transaction: ${keyId}`)
148
- }
149
- }
150
- return
151
- }
152
-
153
- // Outside transaction, batch validate all deletions
154
- if (!state)
155
- return
156
-
157
- const existingKeys = await state.get(keyType, deletionKeys)
158
- for (const keyId of deletionKeys) {
159
- if (existingKeys[keyId]) {
160
- if (transactionCache[keyType])
161
- transactionCache[keyType][keyId] = null
162
- if (mutations[keyType])
163
- mutations[keyType][keyId] = null
164
- }
165
- else {
166
- logger.warn(`Skipping deletion of non-existent ${keyType}: ${keyId}`)
167
- }
168
- }
169
- })
170
- }
171
-
172
- /**
173
- * Handles normal key operations for transactions
174
- */
175
- function handleNormalKeyOperations(data, key, transactionCache, mutations) {
176
- Object.assign(transactionCache[key], data[key])
177
- mutations[key] = mutations[key] || {}
178
- Object.assign(mutations[key], data[key])
179
- }
180
-
181
- /**
182
- * Process pre-key deletions with validation
183
- */
184
- async function processPreKeyDeletions(data, keyType, state, logger) {
185
- const mutex = getPreKeyMutex(keyType)
186
- await mutex.runExclusive(async () => {
187
- const keyData = data[keyType]
188
- if (!keyData)
189
- return
190
-
191
- // Validate deletions
192
- for (const keyId in keyData) {
193
- if (keyData[keyId] === null) {
194
- const existingKeys = await state.get(keyType, [keyId])
195
- if (!existingKeys[keyId]) {
196
- logger.warn(`Skipping deletion of non-existent ${keyType}: ${keyId}`)
197
- if (data[keyType])
198
- delete data[keyType][keyId]
199
- }
200
- }
201
- }
202
- })
203
- }
204
-
205
- /**
206
- * Executes a function with mutexes acquired for given key types
207
- * Uses async-mutex's runExclusive with efficient batching
208
- */
209
- async function withMutexes(keyTypes, getKeyTypeMutex, fn) {
210
- if (keyTypes.length === 0) {
211
- return fn()
212
- }
213
-
214
- if (keyTypes.length === 1) {
215
- return getKeyTypeMutex(keyTypes[0]).runExclusive(fn)
216
- }
217
-
218
- // For multiple mutexes, sort by key type to prevent deadlocks
219
- // Then acquire all mutexes in order using Promise.all for better efficiency
220
- const sortedKeyTypes = [...keyTypes].sort()
221
- const mutexes = sortedKeyTypes.map(getKeyTypeMutex)
222
-
223
- // Acquire all mutexes in order to prevent deadlocks
224
- const releases = []
225
- try {
226
- for (const mutex of mutexes) {
227
- releases.push(await mutex.acquire())
228
- }
229
- return await fn()
230
- }
231
- finally {
232
- // Release in reverse order
233
- while (releases.length > 0) {
234
- const release = releases.pop()
235
- if (release)
236
- release()
237
- }
238
- }
239
- }
240
-
241
- /**
242
- * Adds DB like transaction capability (https://en.wikipedia.org/wiki/Database_transaction) to the SignalKeyStore,
243
- * this allows batch read & write operations & improves the performance of the lib
244
- * @param state the key store to apply this capability to
245
- * @param logger logger to log events
246
- * @returns SignalKeyStore with transaction capability
247
- */
248
- const addTransactionCapability = (state, logger, { maxCommitRetries, delayBetweenTriesMs }) => {
249
- // number of queries made to the DB during the transaction
250
- // only there for logging purposes
251
- let dbQueriesInTransaction = 0
252
- let transactionCache = {}
253
- let mutations = {}
254
-
255
- // LRU Cache to hold mutexes for different key types
256
- const mutexCache = new LRUCache_1.LRUCache({
257
- ttl: 60 * 60 * 1000, // 1 hour
258
- ttlAutopurge: true,
259
- updateAgeOnGet: true
260
- })
261
-
262
- let transactionsInProgress = 0
263
-
264
- function getKeyTypeMutex(type) {
265
- return getMutex(`keytype:${type}`)
266
- }
267
-
268
- function getSenderKeyMutex(senderKeyName) {
269
- return getMutex(`senderkey:${senderKeyName}`)
270
- }
271
-
272
- function getTransactionMutex(key) {
273
- return getMutex(`transaction:${key}`)
274
- }
275
-
276
- // Get or create a mutex for a specific key name
277
- function getMutex(key) {
278
- let mutex = mutexCache.get(key)
279
- if (!mutex) {
280
- mutex = new mutex_1.Mutex()
281
- mutexCache.set(key, mutex)
282
- logger.info({ key }, 'created new mutex')
283
- }
284
- return mutex
285
- }
286
-
287
- // Sender key operations with proper mutex sequencing
288
- function queueSenderKeyOperation(senderKeyName, operation) {
289
- return getSenderKeyMutex(senderKeyName).runExclusive(operation)
290
- }
291
-
292
- // Check if we are currently in a transaction
293
- function isInTransaction() {
294
- return transactionsInProgress > 0
295
- }
296
-
297
- // Helper function to handle transaction commit with retries
298
- async function commitTransaction() {
299
- if (!Object.keys(mutations).length) {
300
- logger.trace('no mutations in transaction')
301
- return
302
- }
303
- logger.trace('committing transaction');
304
- let tries = maxCommitRetries
305
- while (tries > 0) {
306
- tries -= 1;
307
- try {
308
- await state.set(mutations)
309
- logger.trace({ dbQueriesInTransaction }, 'committed transaction')
310
- return
311
- }
312
- catch (error) {
313
- logger.warn(`failed to commit ${Object.keys(mutations).length} mutations, tries left=${tries}`)
314
- if (tries > 0) {
315
- await generics_1.delay(delayBetweenTriesMs)
316
- }
317
- }
318
- }
319
- }
320
-
321
- // Helper function to clean up transaction state
322
- function cleanupTransactionState() {
323
- transactionsInProgress -= 1
324
- if (transactionsInProgress === 0) {
325
- transactionCache = {}
326
- mutations = {}
327
- dbQueriesInTransaction = 0
328
- }
329
- }
330
-
331
- // Helper function to execute work within transaction
332
- async function executeTransactionWork(work) {
333
- const result = await work()
334
- // commit if this is the outermost transaction
335
- if (transactionsInProgress === 1) {
336
- await commitTransaction()
337
- }
338
- return result
339
- }
340
-
341
- return {
342
- get: async (type, ids) => {
343
- if (isInTransaction()) {
344
- const dict = transactionCache[type]
345
- const idsRequiringFetch = dict ? ids.filter(item => typeof dict[item] === 'undefined') : ids
346
-
347
- // only fetch if there are any items to fetch
348
- if (idsRequiringFetch.length) {
349
- dbQueriesInTransaction += 1
350
-
351
- // Use per-sender-key queue for sender-key operations when possible
352
- if (type === 'sender-key') {
353
- logger.info({ idsRequiringFetch }, 'processing sender keys in transaction')
354
- // For sender keys, process each one with queued operations to maintain serialization
355
- for (const senderKeyName of idsRequiringFetch) {
356
- await queueSenderKeyOperation(senderKeyName, async () => {
357
- logger.info({ senderKeyName }, 'fetching sender key in transaction')
358
- const result = await state.get(type, [senderKeyName])
359
- // Update transaction cache
360
- transactionCache[type] || (transactionCache[type] = {})
361
- Object.assign(transactionCache[type], result)
362
- logger.info({ senderKeyName, hasResult: !!result[senderKeyName] }, 'sender key fetch complete')
363
- })
364
- }
365
- }
366
- else {
367
- // Use runExclusive for cleaner mutex handling
368
- await getKeyTypeMutex(type).runExclusive(async () => {
369
- const result = await state.get(type, idsRequiringFetch)
370
- // Update transaction cache
371
- transactionCache[type] || (transactionCache[type] = {})
372
- Object.assign(transactionCache[type], result)
373
- })
374
- }
375
- }
376
- return ids.reduce((dict, id) => {
377
- const value = transactionCache[type]?.[id]
378
- if (value) {
379
- dict[id] = value
380
- }
381
- return dict
382
- }, {})
383
- }
384
- else {
385
- // Not in transaction, fetch directly with queue protection
386
- if (type === 'sender-key') {
387
- // For sender keys, use individual queues to maintain per-key serialization
388
- const results = {}
389
- for (const senderKeyName of ids) {
390
- const result = await queueSenderKeyOperation(senderKeyName, async () => await state.get(type, [senderKeyName]))
391
- Object.assign(results, result)
392
- }
393
- return results
394
- }
395
- else {
396
- return await getKeyTypeMutex(type).runExclusive(() => state.get(type, ids))
397
- }
398
- }
399
- },
400
- set: async (data) => {
401
- if (isInTransaction()) {
402
- logger.trace({ types: Object.keys(data) }, 'caching in transaction')
403
- for (const key_ in data) {
404
- const key = key_
405
- transactionCache[key] = transactionCache[key] || {}
406
- // Special handling for pre-keys and signed-pre-keys
407
- if (key === 'pre-key') {
408
- await handlePreKeyOperations(data, key, transactionCache, mutations, logger, true)
409
- }
410
- else {
411
- // Normal handling for other key types
412
- handleNormalKeyOperations(data, key, transactionCache, mutations)
413
- }
414
- }
415
- }
416
- else {
417
- // Not in transaction, apply directly with mutex protection
418
- const hasSenderKeys = 'sender-key' in data
419
- const senderKeyNames = hasSenderKeys ? Object.keys(data['sender-key'] || {}) : []
420
- if (hasSenderKeys) {
421
- logger.info({ senderKeyNames }, 'processing sender key set operations')
422
- // Handle sender key operations with per-key queues
423
- for (const senderKeyName of senderKeyNames) {
424
- await queueSenderKeyOperation(senderKeyName, async () => {
425
- // Create data subset for this specific sender key
426
- const senderKeyData = {
427
- 'sender-key': {
428
- [senderKeyName]: data['sender-key'][senderKeyName]
429
- }
430
- };
431
- logger.trace({ senderKeyName }, 'storing sender key')
432
- // Apply changes to the store
433
- await state.set(senderKeyData)
434
- logger.trace({ senderKeyName }, 'sender key stored')
435
- })
436
- }
437
- // Handle any non-sender-key data with regular mutexes
438
- const nonSenderKeyData = { ...data }
439
- delete nonSenderKeyData['sender-key']
440
- if (Object.keys(nonSenderKeyData).length > 0) {
441
- await withMutexes(Object.keys(nonSenderKeyData), getKeyTypeMutex, async () => {
442
- // Process pre-keys and signed-pre-keys separately with specialized mutexes
443
- for (const key_ in nonSenderKeyData) {
444
- const keyType = key_
445
- if (keyType === 'pre-key') {
446
- await processPreKeyDeletions(nonSenderKeyData, keyType, state, logger)
447
- }
448
- }
449
- // Apply changes to the store
450
- await state.set(nonSenderKeyData)
451
- })
452
- }
453
- }
454
- else {
455
- // No sender keys - use original logic
456
- await withMutexes(Object.keys(data), getKeyTypeMutex, async () => {
457
- // Process pre-keys and signed-pre-keys separately with specialized mutexes
458
- for (const key_ in data) {
459
- const keyType = key_
460
- if (keyType === 'pre-key') {
461
- await processPreKeyDeletions(data, keyType, state, logger)
462
- }
463
- }
464
- // Apply changes to the store
465
- await state.set(data)
466
- })
467
- }
468
- }
469
- },
470
- isInTransaction,
471
- async transaction(work, key) {
472
- const releaseTxMutex = await getTransactionMutex(key).acquire()
473
- try {
474
- transactionsInProgress += 1;
475
- if (transactionsInProgress === 1) {
476
- logger.trace('entering transaction')
477
- }
478
- // Release the transaction mutex now that we've updated the counter
479
- // This allows other transactions to start preparing
480
- releaseTxMutex()
481
- try {
482
- return await executeTransactionWork(work)
483
- }
484
- finally {
485
- cleanupTransactionState();
486
- }
487
- }
488
- catch (error) {
489
- releaseTxMutex()
490
- throw error
491
- }
492
- }
493
- }
494
- }
495
-
496
- const initAuthCreds = () => {
497
- const identityKey = crypto_2.Curve.generateKeyPair()
498
- return {
499
- noiseKey: crypto_2.Curve.generateKeyPair(),
500
- pairingEphemeralKeyPair: crypto_2.Curve.generateKeyPair(),
501
- signedIdentityKey: identityKey,
502
- signedPreKey: crypto_2.signedKeyPair(identityKey, 1),
503
- registrationId: generics_1.generateRegistrationId(),
504
- advSecretKey: crypto_1.randomBytes(32).toString('base64'),
505
- processedHistoryMessages: [],
506
- nextPreKeyId: 1,
507
- firstUnuploadedPreKeyId: 1,
508
- accountSyncCounter: 0,
509
- accountSettings: {
510
- unarchiveChats: false
511
- },
512
- registered: false,
513
- pairingCode: undefined,
514
- lastPropHash: undefined,
515
- routingInfo: undefined,
516
- deviceId: Buffer.from((0, uuid_1.v4)().replace(/-/g, ''), 'hex').toString('base64url'),
517
- phoneId: (0, uuid_1.v4)(),
518
- identityId: (0, crypto_1.randomBytes)(20),
519
- backupToken: (0, crypto_1.randomBytes)(20),
520
- registration: {},
521
- }
522
- }
523
-
524
- module.exports = {
525
- makeCacheableSignalKeyStore,
526
- addTransactionCapability,
527
- initAuthCreds
528
- }
@@ -1,18 +0,0 @@
1
- import type { BaileysEventEmitter } from '@neelegirl/baileys/lib/Types'
2
-
3
- /**
4
- * Captures events from a baileys event emitter & stores them in a file
5
- * @param ev The event emitter to read events from
6
- * @param filename File to save to
7
- */
8
- export declare const captureEventStream: (ev: BaileysEventEmitter, filename: string) => void
9
-
10
- /**
11
- * Read event file and emit events from there
12
- * @param filename filename containing event data
13
- * @param delayIntervalMs delay between each event emit
14
- */
15
- export declare const readAndEmitEventStream: (filename: string, delayIntervalMs?: number) => {
16
- ev: BaileysEventEmitter
17
- task: Promise<void>
18
- }
@@ -1,70 +0,0 @@
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 fs_1 = require("fs")
11
- const promises_1 = require("fs/promises")
12
- const readline_1 = require("readline")
13
- const generics_1 = require("./generics")
14
- const make_mutex_1 = require("./make-mutex")
15
-
16
- /**
17
- * Captures events from a baileys event emitter & stores them in a file
18
- * @param ev The event emitter to read events from
19
- * @param filename File to save to
20
- */
21
- const captureEventStream = (ev, filename) => {
22
- const oldEmit = ev.emit
23
- // write mutex so data is appended in order
24
- const writeMutex = make_mutex_1.makeMutex()
25
- // monkey patch eventemitter to capture all events
26
- ev.emit = function (...args) {
27
- const content = JSON.stringify({ timestamp: Date.now(), event: args[0], data: args[1] }) + '\n'
28
- const result = oldEmit.apply(ev, args)
29
- writeMutex.mutex(async () => {
30
- await promises_1.writeFile(filename, content, { flag: 'a' })
31
- })
32
- return result
33
- }
34
- }
35
-
36
- /**
37
- * Read event file and emit events from there
38
- * @param filename filename containing event data
39
- * @param delayIntervalMs delay between each event emit
40
- */
41
- const readAndEmitEventStream = (filename, delayIntervalMs = 0) => {
42
- const ev = new events_1.default()
43
- const fireEvents = async () => {
44
- // from: https://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js
45
- const fileStream = fs_1.createReadStream(filename)
46
- const rl = readline_1.createInterface({
47
- input: fileStream,
48
- crlfDelay: Infinity
49
- })
50
- // Note: we use the crlfDelay option to recognize all instances of CR LF
51
- // ('\r\n') in input.txt as a single line break.
52
- for await (const line of rl) {
53
- if (line) {
54
- const { event, data } = JSON.parse(line)
55
- ev.emit(event, data)
56
- delayIntervalMs && await generics_1.delay(delayIntervalMs)
57
- }
58
- }
59
- fileStream.close()
60
- }
61
- return {
62
- ev,
63
- task: fireEvents()
64
- }
65
- }
66
-
67
- module.exports = {
68
- captureEventStream,
69
- readAndEmitEventStream
70
- }
@@ -1,29 +0,0 @@
1
- import { CatalogCollection, OrderDetails, Product, ProductCreate, ProductUpdate, WAMediaUpload, WAMediaUploadFunction } from '../Types'
2
- import { BinaryNode } from '../WABinary'
3
-
4
- export declare const parseCatalogNode: (node: BinaryNode) => {
5
- products: Product[]
6
- nextPageCursor: string | undefined
7
- }
8
-
9
- export declare const parseCollectionsNode: (node: BinaryNode) => {
10
- collections: CatalogCollection[]
11
- }
12
-
13
- export declare const parseOrderDetailsNode: (node: BinaryNode) => OrderDetails
14
-
15
- export declare const toProductNode: (productId: string | undefined, product: ProductCreate | ProductUpdate) => BinaryNode
16
-
17
- export declare const parseProductNode: (productNode: BinaryNode) => Product
18
-
19
- /**
20
- * Uploads images not already uploaded to WA's servers
21
- */
22
- export declare function uploadingNecessaryImagesOfProduct<T extends ProductUpdate | ProductCreate>(product: T, waUploadToServer: WAMediaUploadFunction, timeoutMs?: number): Promise<T>
23
-
24
- /**
25
- * Uploads images not already uploaded to WA's servers
26
- */
27
- export declare const uploadingNecessaryImages: (images: WAMediaUpload[], waUploadToServer: WAMediaUploadFunction, timeoutMs?: number) => Promise<{
28
- url: string
29
- }[]>