@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,391 +0,0 @@
1
- "use strict"
2
-
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k
5
- var desc = Object.getOwnPropertyDescriptor(m, k)
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k] } }
8
- }
9
- Object.defineProperty(o, k2, desc)
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k
12
- o[k2] = m[k]
13
- }))
14
-
15
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
- Object.defineProperty(o, "default", { enumerable: true, value: v })
17
- }) : function(o, v) {
18
- o["default"] = v
19
- })
20
-
21
- var __importStar = (this && this.__importStar) || (function () {
22
- var ownKeys = function(o) {
23
- ownKeys = Object.getOwnPropertyNames || function (o) {
24
- var ar = []
25
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k
26
- return ar
27
- }
28
- return ownKeys(o)
29
- }
30
- return function (mod) {
31
- if (mod && mod.__esModule) return mod
32
- var result = {}
33
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i])
34
- __setModuleDefault(result, mod)
35
- return result
36
- }
37
- })()
38
-
39
- Object.defineProperty(exports, "__esModule", { value: true })
40
-
41
- const libsignal = __importStar(require("@neelegirl/libsignal"))
42
- const Utils_1 = require("../Utils")
43
- const WABinary_1 = require("../WABinary")
44
- const sender_key_name_1 = require("./WASignalGroup/sender-key-name")
45
- const sender_key_record_1 = require("./WASignalGroup/sender-key-record")
46
- const Group_1 = require("./WASignalGroup")
47
- const LIDMappingStore_1 = require("./lid-mapping")
48
-
49
- function makeLibSignalRepository(auth, onWhatsAppFunc, logger) {
50
- const lidMapping = new LIDMappingStore_1.LIDMappingStore(auth.keys, onWhatsAppFunc, logger)
51
- const storage = signalStorage(auth, lidMapping)
52
- const parsedKeys = auth.keys
53
-
54
- function isLikelySyncMessage(addr) {
55
- const key = addr.toString()
56
- // Only bypass for WhatsApp system addresses, not regular user contacts
57
- // Be very specific about sync service patterns
58
- return (key.includes('@lid.whatsapp.net') || // WhatsApp system messages
59
- key.includes('@broadcast') || // Broadcast messages
60
- key.includes('@newsletter'))
61
- }
62
-
63
- const repository = {
64
- decryptGroupMessage({ group, authorJid, msg }) {
65
- const senderName = jidToSignalSenderKeyName(group, authorJid)
66
- const cipher = new Group_1.GroupCipher(storage, senderName)
67
- // Use transaction to ensure atomicity
68
- return parsedKeys.transaction(async () => {
69
- return cipher.decrypt(msg)
70
- }, group)
71
- },
72
- async processSenderKeyDistributionMessage({ item, authorJid }) {
73
- const builder = new Group_1.GroupSessionBuilder(storage)
74
- if (!item.groupId) {
75
- throw new Error('Group ID is required for sender key distribution message')
76
- }
77
- const senderName = jidToSignalSenderKeyName(item.groupId, authorJid)
78
- const senderMsg = new Group_1.SenderKeyDistributionMessage(null, null, null, null, item.axolotlSenderKeyDistributionMessage)
79
- const senderNameStr = senderName.toString()
80
- const { [senderNameStr]: senderKey } = await auth.keys.get('sender-key', [senderNameStr])
81
- if (!senderKey) {
82
- await storage.storeSenderKey(senderName, new sender_key_record_1.SenderKeyRecord())
83
- }
84
- return parsedKeys.transaction(async () => {
85
- const { [senderNameStr]: senderKey } = await auth.keys.get('sender-key', [senderNameStr])
86
- if (!senderKey) {
87
- await storage.storeSenderKey(senderName, new sender_key_record_1.SenderKeyRecord())
88
- }
89
- await builder.process(senderName, senderMsg)
90
- }, item.groupId)
91
- },
92
- async decryptMessage({ jid, type, ciphertext }) {
93
- const addr = jidToSignalProtocolAddress(jid)
94
- const session = new libsignal.SessionCipher(storage, addr)
95
- async function doDecrypt() {
96
- let result
97
- switch (type) {
98
- case 'pkmsg':
99
- result = await session.decryptPreKeyWhisperMessage(ciphertext)
100
- break
101
- case 'msg':
102
- result = await session.decryptWhisperMessage(ciphertext)
103
- break
104
- }
105
- return result
106
- }
107
- if (isLikelySyncMessage(addr)) {
108
- // If it's a sync message, we can skip the transaction
109
- // as it is likely to be a system message that doesn't require strict atomicity
110
- return await doDecrypt()
111
- }
112
- // If it's not a sync message, we need to ensure atomicity
113
- // For regular messages, we use a transaction to ensure atomicity
114
- return parsedKeys.transaction(async () => {
115
- return await doDecrypt()
116
- }, jid)
117
- },
118
- async encryptMessage({ jid, data }) {
119
- // LID SINGLE SOURCE OF TRUTH: Always prefer LID when available
120
- let encryptionJid = jid
121
- // Check for LID mapping and use it if session exists
122
- if (jid.includes('@s.whatsapp.net')) {
123
- const lidForPN = await lidMapping.getLIDForPN(jid)
124
- if (lidForPN?.includes('@lid')) {
125
- const lidAddr = jidToSignalProtocolAddress(lidForPN)
126
- const { [lidAddr.toString()]: lidSession } = await auth.keys.get('session', [lidAddr.toString()])
127
- if (lidSession) {
128
- // LID session exists, use it
129
- encryptionJid = lidForPN
130
- }
131
- else {
132
- // Try to migrate if PN session exists
133
- const pnAddr = jidToSignalProtocolAddress(jid)
134
- const { [pnAddr.toString()]: pnSession } = await auth.keys.get('session', [pnAddr.toString()])
135
- if (pnSession) {
136
- // Migrate PN to LID
137
- await repository.migrateSession([jid], lidForPN)
138
- encryptionJid = lidForPN
139
- }
140
- }
141
- }
142
- }
143
- const addr = jidToSignalProtocolAddress(encryptionJid)
144
- const cipher = new libsignal.SessionCipher(storage, addr)
145
- // Use transaction to ensure atomicity
146
- return parsedKeys.transaction(async () => {
147
- const { type: sigType, body } = await cipher.encrypt(data)
148
- const type = sigType === 3 ? 'pkmsg' : 'msg'
149
- return { type, ciphertext: Buffer.from(body, 'binary') }
150
- }, jid)
151
- },
152
- async encryptGroupMessage({ group, meId, data }) {
153
- const senderName = jidToSignalSenderKeyName(group, meId)
154
- const builder = new Group_1.GroupSessionBuilder(storage)
155
- const senderNameStr = senderName.toString()
156
- return parsedKeys.transaction(async () => {
157
- const { [senderNameStr]: senderKey } = await auth.keys.get('sender-key', [senderNameStr])
158
- if (!senderKey) {
159
- await storage.storeSenderKey(senderName, new sender_key_record_1.SenderKeyRecord())
160
- }
161
- const senderKeyDistributionMessage = await builder.create(senderName)
162
- const session = new Group_1.GroupCipher(storage, senderName)
163
- const ciphertext = await session.encrypt(data)
164
- return {
165
- ciphertext,
166
- senderKeyDistributionMessage: senderKeyDistributionMessage.serialize()
167
- }
168
- }, group)
169
- },
170
- async injectE2ESession({ jid, session }) {
171
- const cipher = new libsignal.SessionBuilder(storage, jidToSignalProtocolAddress(jid))
172
- return parsedKeys.transaction(async () => {
173
- await cipher.initOutgoing(session)
174
- }, jid)
175
- },
176
- jidToSignalProtocolAddress(jid) {
177
- return jidToSignalProtocolAddress(jid).toString()
178
- },
179
- // Optimized direct access to LID mapping store
180
- lidMapping,
181
- async validateSession(jid) {
182
- try {
183
- const addr = jidToSignalProtocolAddress(jid)
184
- const session = await storage.loadSession(addr.toString())
185
- if (!session) {
186
- return { exists: false, reason: 'no session' }
187
- }
188
- if (!session.haveOpenSession()) {
189
- return { exists: false, reason: 'no open session' }
190
- }
191
- return { exists: true }
192
- }
193
- catch (error) {
194
- return { exists: false, reason: 'validation error' }
195
- }
196
- },
197
- async deleteSession(jids) {
198
- if (!jids.length) return
199
-
200
- // Convert JIDs to signal addresses and prepare for bulk deletion
201
- const sessionUpdates = {}
202
-
203
- jids.forEach(jid => {
204
- const addr = jidToSignalProtocolAddress(jid)
205
- sessionUpdates[addr.toString()] = null
206
- })
207
-
208
- // Single transaction for all deletions
209
- return parsedKeys.transaction(async () => {
210
- await auth.keys.set({ session: sessionUpdates })
211
- }, `delete-${jids.length}-sessions`)
212
- },
213
- async migrateSession(fromJids, toJid) {
214
- if (!fromJids.length || !toJid.includes('@lid'))
215
- return { migrated: 0, skipped: 0, total: 0 }
216
-
217
- // Filter valid PN JIDs
218
- const validJids = fromJids.filter(jid => jid.includes('@s.whatsapp.net'))
219
-
220
- if (!validJids.length)
221
- return { migrated: 0, skipped: 0, total: fromJids.length }
222
-
223
- // Single optimized transaction for all migrations
224
- return parsedKeys.transaction(async () => {
225
- // 1. Batch store all LID mappings
226
- const mappings = validJids.map(jid => ({
227
- lid: WABinary_1.transferDevice(jid, toJid),
228
- pn: jid
229
- }))
230
-
231
- await lidMapping.storeLIDPNMappings(mappings)
232
-
233
- // 2. Prepare migration operations
234
- const migrationOps = validJids.map(jid => {
235
- const lidWithDevice = WABinary_1.transferDevice(jid, toJid)
236
- const fromDecoded = WABinary_1.jidDecode(jid)
237
- const toDecoded = WABinary_1.jidDecode(lidWithDevice)
238
-
239
- return {
240
- fromJid: jid,
241
- toJid: lidWithDevice,
242
- pnUser: fromDecoded.user,
243
- lidUser: toDecoded.user,
244
- deviceId: fromDecoded.device || 0,
245
- fromAddr: jidToSignalProtocolAddress(jid),
246
- toAddr: jidToSignalProtocolAddress(lidWithDevice)
247
- }
248
- })
249
-
250
- // 3. Batch check which LID sessions already exist
251
- const lidAddrs = migrationOps.map(op => op.toAddr.toString())
252
- const existingSessions = await auth.keys.get('session', lidAddrs)
253
-
254
- // 4. Filter out sessions that already have LID sessions
255
- const opsToMigrate = migrationOps.filter(op => !existingSessions[op.toAddr.toString()])
256
- const skippedCount = migrationOps.length - opsToMigrate.length
257
-
258
- if (!opsToMigrate.length) {
259
- return { migrated: 0, skipped: skippedCount, total: validJids.length };
260
- }
261
-
262
- // 5. Execute all migrations in parallel
263
- await Promise.all(opsToMigrate.map(async (op) => {
264
- const fromSession = await storage.loadSession(op.fromAddr.toString())
265
-
266
- if (fromSession?.haveOpenSession()) {
267
- // Copy session to LID address
268
- const sessionBytes = fromSession.serialize()
269
- const copiedSession = libsignal.SessionRecord.deserialize(sessionBytes)
270
- await storage.storeSession(op.toAddr.toString(), copiedSession)
271
-
272
- // Delete PN session
273
- await auth.keys.set({ session: { [op.fromAddr.toString()]: null } })
274
- }
275
- }))
276
-
277
- return { migrated: opsToMigrate.length, skipped: skippedCount, total: validJids.length }
278
- }, `migrate-${validJids.length}-sessions-${WABinary_1.jidDecode(toJid)?.user}`)
279
- },
280
- async encryptMessageWithWire({ encryptionJid, wireJid, data }) {
281
- const result = await repository.encryptMessage({ jid: encryptionJid, data })
282
- return { ...result, wireJid }
283
- }
284
- }
285
- return repository
286
- }
287
-
288
- const jidToSignalProtocolAddress = (jid) => {
289
- const decoded = WABinary_1.jidDecode(jid)
290
- const { user, device, server } = decoded
291
-
292
- if (!user) {
293
- throw new Error(`JID decoded but user is empty: "${jid}" -> user: "${user}", server: "${server}", device: ${device}`)
294
- }
295
-
296
- // LID addresses get _1 suffix for Signal protocol
297
- const signalUser = server === 'lid' ? `${user}_1` : user
298
- const finalDevice = device || 0
299
-
300
- return new libsignal.ProtocolAddress(signalUser, finalDevice)
301
- }
302
-
303
- const jidToSignalSenderKeyName = (group, user) => {
304
- return new sender_key_name_1.SenderKeyName(group, jidToSignalProtocolAddress(user))
305
- }
306
-
307
- function signalStorage({ creds, keys }, lidMapping) {
308
- return {
309
- loadSession: async (id) => {
310
- try {
311
- // LID SINGLE SOURCE OF TRUTH: Auto-redirect PN to LID if mapping exists
312
- let actualId = id
313
- if (id.includes('.') && !id.includes('_1')) {
314
- // This is a PN signal address format (e.g., "1234567890.0")
315
- // Convert back to JID to check for LID mapping
316
- const parts = id.split('.')
317
- const device = parts[1] || '0'
318
- const pnJid = device === '0' ? `${parts[0]}@s.whatsapp.net` : `${parts[0]}:${device}@s.whatsapp.net`
319
- const lidForPN = await lidMapping.getLIDForPN(pnJid)
320
- if (lidForPN?.includes('@lid')) {
321
- const lidAddr = jidToSignalProtocolAddress(lidForPN)
322
- const lidId = lidAddr.toString()
323
- // Check if LID session exists
324
- const { [lidId]: lidSession } = await keys.get('session', [lidId])
325
- if (lidSession) {
326
- actualId = lidId
327
- }
328
- }
329
- }
330
- const { [actualId]: sess } = await keys.get('session', [actualId])
331
- if (sess) {
332
- return libsignal.SessionRecord.deserialize(sess)
333
- }
334
- }
335
- catch (e) {
336
- return null
337
- }
338
- return null
339
- },
340
- // TODO: Replace with libsignal.SessionRecord when type exports are added to libsignal
341
- storeSession: async (id, session) => {
342
- await keys.set({ session: { [id]: session.serialize() } })
343
- },
344
- isTrustedIdentity: () => {
345
- return true
346
- },
347
- loadPreKey: async (id) => {
348
- const keyId = id.toString()
349
- const { [keyId]: key } = await keys.get('pre-key', [keyId])
350
- if (key) {
351
- return {
352
- privKey: Buffer.from(key.private),
353
- pubKey: Buffer.from(key.public)
354
- }
355
- }
356
- },
357
- removePreKey: (id) => keys.set({ 'pre-key': { [id]: null } }),
358
- loadSignedPreKey: () => {
359
- const key = creds.signedPreKey
360
- return {
361
- privKey: Buffer.from(key.keyPair.private),
362
- pubKey: Buffer.from(key.keyPair.public)
363
- }
364
- },
365
- loadSenderKey: async (senderKeyName) => {
366
- const keyId = senderKeyName.toString()
367
- const { [keyId]: key } = await keys.get('sender-key', [keyId])
368
- if (key) {
369
- return sender_key_record_1.SenderKeyRecord.deserialize(key)
370
- }
371
- return new sender_key_record_1.SenderKeyRecord()
372
- },
373
- storeSenderKey: async (senderKeyName, key) => {
374
- const keyId = senderKeyName.toString()
375
- const serialized = JSON.stringify(key.serialize())
376
- await keys.set({ 'sender-key': { [keyId]: Buffer.from(serialized, 'utf-8') } })
377
- },
378
- getOurRegistrationId: () => creds.registrationId,
379
- getOurIdentity: () => {
380
- const { signedIdentityKey } = creds
381
- return {
382
- privKey: Buffer.from(signedIdentityKey.private),
383
- pubKey: Buffer.from(Utils_1.generateSignalPubKey(signedIdentityKey.public))
384
- }
385
- }
386
- }
387
- }
388
-
389
- module.exports = {
390
- makeLibSignalRepository
391
- }
@@ -1,28 +0,0 @@
1
- import { ILogger } from '@neelegirl/baileys/lib/Utils/loggerr'
2
- import { SignalKeyStoreWithTransaction } from '@neelegirl/baileys/lib/Types'
3
-
4
- export declare class LIDMappingStore {
5
- private readonly mappingCache
6
- private readonly keys
7
- private onWhatsAppFunc?
8
- constructor(keys: SignalKeyStoreWithTransaction, onWhatsAppFunc?: (...jids: string[], logger: ILogger ) => Promise<{
9
- jid: string
10
- exists: boolean
11
- lid: string
12
- }[] | undefined>)
13
- /**
14
- * Store LID-PN mapping - USER LEVEL
15
- */
16
- storeLIDPNMappings(pairs: {
17
- lid: string;
18
- pn: string;
19
- }[]): Promise<void>
20
- /**
21
- * Get LID for PN - Returns device-specific LID based on user mapping
22
- */
23
- getLIDForPN(pn: string): Promise<string | null>
24
- /**
25
- * Get PN for LID - USER LEVEL with device construction
26
- */
27
- getPNForLID(lid: string): Promise<string | null>
28
- }
@@ -1,184 +0,0 @@
1
- "use strict"
2
-
3
- Object.defineProperty(exports, "__esModule", { value: true })
4
-
5
- const lru_cache_1 = require("lru-cache")
6
- const WABinary_1 = require("../WABinary")
7
-
8
- class LIDMappingStore {
9
- constructor(keys, onWhatsAppFunc, logger) {
10
- this.mappingCache = new lru_cache_1.LRUCache({
11
- ttl: 7 * 24 * 60 * 60 * 1000, // 7 days
12
- ttlAutopurge: true,
13
- updateAgeOnGet: true
14
- })
15
- this.keys = keys
16
- this.logger = logger
17
- this.onWhatsAppFunc = onWhatsAppFunc // needed to get LID from PN if not found
18
- }
19
- /**
20
- * Store LID-PN mapping - USER LEVEL
21
- */
22
- async storeLIDPNMappings(pairs) {
23
- // Validate inputs
24
- const pairMap = {}
25
- const logger = this.logger
26
-
27
- for (const { lid, pn } of pairs) {
28
- if (!((WABinary_1.isLidUser(lid) && WABinary_1.isJidUser(pn)) || (WABinary_1.isJidUser(lid) && WABinary_1.isLidUser(pn)))) {
29
- logger.warn(`Invalid LID-PN mapping: ${lid}, ${pn}`)
30
- continue
31
- }
32
-
33
- const [lidJid, pnJid] = WABinary_1.isLidUser(lid) ? [lid, pn] : [pn, lid]
34
- const lidDecoded = WABinary_1.jidDecode(lidJid)
35
- const pnDecoded = WABinary_1.jidDecode(pnJid)
36
-
37
- if (!lidDecoded || !pnDecoded) return
38
-
39
- const pnUser = pnDecoded.user
40
- const lidUser = lidDecoded.user
41
-
42
- // Check if mapping already exists (cache first, then database)
43
- let existingLidUser = this.mappingCache.get(`pn:${pnUser}`)
44
-
45
- if (!existingLidUser) {
46
- // Cache miss - check database
47
- const stored = await this.keys.get('lid-mapping', [pnUser])
48
-
49
- existingLidUser = stored[pnUser]
50
-
51
- if (existingLidUser) {
52
- // Update cache with database value
53
- this.mappingCache.set(`pn:${pnUser}`, existingLidUser)
54
- this.mappingCache.set(`lid:${existingLidUser}`, pnUser)
55
- }
56
- }
57
-
58
- if (existingLidUser === lidUser) {
59
- logger.debug({ pnUser, lidUser }, 'LID mapping already exists, skipping')
60
- continue
61
- }
62
-
63
- pairMap[pnUser] = lidUser
64
- }
65
-
66
- logger.trace({ pairMap }, `Storing ${Object.keys(pairMap).length} pn mappings`)
67
-
68
- await this.keys.transaction(async () => {
69
- for (const [pnUser, lidUser] of Object.entries(pairMap)) {
70
- await this.keys.set({
71
- 'lid-mapping': {
72
- [pnUser]: lidUser, // "554396160286" -> "102765716062358"
73
- [`${lidUser}_reverse`]: pnUser // "102765716062358_reverse" -> "554396160286"
74
- }
75
- })
76
-
77
- // Update cache with both directions
78
- this.mappingCache.set(`pn:${pnUser}`, lidUser)
79
- this.mappingCache.set(`lid:${lidUser}`, pnUser)
80
- }
81
- }, 'lid-mapping')
82
- }
83
- /**
84
- * Get LID for PN - Returns device-specific LID based on user mapping
85
- */
86
- async getLIDForPN(pn) {
87
- if (!WABinary_1.isJidUser(pn)) return null
88
-
89
- const logger = this.logger
90
- const decoded = WABinary_1.jidDecode(pn)
91
-
92
- if (!decoded) return null
93
-
94
- // Check cache first for PN → LID mapping
95
- const pnUser = decoded.user
96
-
97
- let lidUser = this.mappingCache.get(`pn:${pnUser}`)
98
-
99
- if (!lidUser) {
100
- // Cache miss - check database
101
- const stored = await this.keys.get('lid-mapping', [pnUser])
102
-
103
- lidUser = stored[pnUser]
104
-
105
- if (lidUser) {
106
- // Cache the database result
107
- this.mappingCache.set(`pn:${pnUser}`, lidUser)
108
- }
109
-
110
- else {
111
- // Not in database - try USync
112
- logger.trace(`No LID mapping found for PN user ${pnUser}; getting from USync`)
113
-
114
- const { exists, lid } = (await this.onWhatsAppFunc?.(pn))?.[0] // this function already adds LIDs to mapping
115
-
116
- if (exists && lid) {
117
- lidUser = WABinary_1.jidDecode(lid)?.user
118
-
119
- if (lidUser) {
120
- // Cache the USync result
121
- this.mappingCache.set(`pn:${pnUser}`, lidUser)
122
- }
123
- }
124
-
125
- else {
126
- return null
127
- }
128
- }
129
- }
130
-
131
- if (typeof lidUser !== 'string' || !lidUser) {
132
- logger.warn(`Invalid or empty LID user for PN ${pn}: lidUser = "${lidUser}"`)
133
- return null
134
- }
135
-
136
- // Push the PN device ID to the LID to maintain device separation
137
- const pnDevice = decoded.device !== undefined ? decoded.device : 0
138
- const deviceSpecificLid = `${lidUser}:${pnDevice}@lid`
139
-
140
- logger.trace(`getLIDForPN: ${pn} → ${deviceSpecificLid} (user mapping with device ${pnDevice})`)
141
-
142
- return deviceSpecificLid
143
- }
144
- /**
145
- * Get PN for LID - USER LEVEL with device construction
146
- */
147
- async getPNForLID(lid) {
148
- if (!WABinary_1.isLidUser(lid)) return null
149
-
150
- const logger = this.logger
151
- const decoded = WABinary_1.jidDecode(lid)
152
-
153
- if (!decoded) return null
154
-
155
- // Check cache first for LID → PN mapping
156
- const lidUser = decoded.user
157
-
158
- let pnUser = this.mappingCache.get(`lid:${lidUser}`)
159
-
160
- if (!pnUser || typeof pnUser !== 'string') {
161
- // Cache miss - check database
162
- const stored = await this.keys.get('lid-mapping', [`${lidUser}_reverse`]);
163
- pnUser = stored[`${lidUser}_reverse`]
164
-
165
- if (!pnUser || typeof pnUser !== 'string') {
166
- logger.trace(`No reverse mapping found for LID user: ${lidUser}`)
167
- return null
168
- }
169
-
170
- this.mappingCache.set(`lid:${lidUser}`, pnUser)
171
- }
172
-
173
- // Construct device-specific PN JID
174
- const lidDevice = decoded.device !== undefined ? decoded.device : 0
175
- const pnJid = `${pnUser}:${lidDevice}@s.whatsapp.net`
176
- logger.trace(`Found reverse mapping: ${lid} → ${pnJid}`)
177
-
178
- return pnJid
179
- }
180
- }
181
-
182
- module.exports = {
183
- LIDMappingStore
184
- }
@@ -1,15 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import { URL } from 'url';
3
- import { SocketConfig } from '../../Types';
4
- export declare abstract class AbstractSocketClient extends EventEmitter {
5
- url: URL;
6
- config: SocketConfig;
7
- abstract get isOpen(): boolean;
8
- abstract get isClosed(): boolean;
9
- abstract get isClosing(): boolean;
10
- abstract get isConnecting(): boolean;
11
- constructor(url: URL, config: SocketConfig);
12
- abstract connect(): Promise<void>;
13
- abstract close(): Promise<void>;
14
- abstract send(str: Uint8Array | string, cb?: (err?: Error) => void): boolean;
15
- }
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AbstractSocketClient = void 0;
4
- const events_1 = require("events");
5
- class AbstractSocketClient extends events_1.EventEmitter {
6
- constructor(url, config) {
7
- super();
8
- this.url = url;
9
- this.config = config;
10
- this.setMaxListeners(0);
11
- }
12
- }
13
- exports.AbstractSocketClient = AbstractSocketClient;
@@ -1,2 +0,0 @@
1
- export * from '@neelegirl/baileys/lib/Socket/Client/types'
2
- export * from '@neelegirl/baileys/lib/Socket/Client/websocket'
@@ -1,22 +0,0 @@
1
- "use strict"
2
-
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k
5
- var desc = Object.getOwnPropertyDescriptor(m, k)
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k] } }
8
- }
9
- Object.defineProperty(o, k2, desc)
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k
12
- o[k2] = m[k]
13
- }))
14
-
15
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p)
17
- }
18
-
19
- Object.defineProperty(exports, "__esModule", { value: true })
20
-
21
- __exportStar(require("./types"), exports)
22
- __exportStar(require("./websocket"), exports)
@@ -1,12 +0,0 @@
1
- import { Socket } from 'net';
2
- import { AbstractSocketClient } from './abstract-socket-client';
3
- export declare class MobileSocketClient extends AbstractSocketClient {
4
- protected socket: Socket | null;
5
- get isOpen(): boolean;
6
- get isClosed(): boolean;
7
- get isClosing(): boolean;
8
- get isConnecting(): boolean;
9
- connect(): Promise<void>;
10
- close(): Promise<void>;
11
- send(str: string | Uint8Array, cb?: (err?: Error) => void): boolean;
12
- }