@neelegirl/baileys 1.5.2 → 1.5.3

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 (193) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +195 -187
  3. package/WAProto/WAProto.proto +537 -236
  4. package/WAProto/index.d.ts +5971 -2388
  5. package/WAProto/index.js +17298 -6513
  6. package/lib/Defaults/baileys-version.json +3 -3
  7. package/lib/Defaults/index.d.ts +77 -67
  8. package/lib/Defaults/index.js +148 -136
  9. package/lib/Defaults/phonenumber-mcc.json +223 -223
  10. package/lib/Signal/WASignalGroup/GroupProtocol.js +1908 -1908
  11. package/lib/Signal/WASignalGroup/ciphertext-message.d.ts +9 -0
  12. package/lib/Signal/WASignalGroup/ciphertext-message.js +19 -0
  13. package/lib/Signal/WASignalGroup/ciphertext_message.js +15 -15
  14. package/lib/Signal/WASignalGroup/group-session-builder.d.ts +17 -0
  15. package/lib/Signal/WASignalGroup/group-session-builder.js +72 -0
  16. package/lib/Signal/WASignalGroup/group.proto +41 -41
  17. package/lib/Signal/WASignalGroup/group_cipher.d.ts +19 -0
  18. package/lib/Signal/WASignalGroup/group_cipher.js +101 -110
  19. package/lib/Signal/WASignalGroup/group_session_builder.js +45 -45
  20. package/lib/Signal/WASignalGroup/index.d.ts +11 -0
  21. package/lib/Signal/WASignalGroup/index.js +61 -6
  22. package/lib/Signal/WASignalGroup/keyhelper.d.ts +16 -0
  23. package/lib/Signal/WASignalGroup/keyhelper.js +58 -13
  24. package/lib/Signal/WASignalGroup/protobufs.js +2 -2
  25. package/lib/Signal/WASignalGroup/queue_job.js +68 -68
  26. package/lib/Signal/WASignalGroup/readme.md +5 -5
  27. package/lib/Signal/WASignalGroup/sender-chain-key.d.ts +14 -0
  28. package/lib/Signal/WASignalGroup/sender-chain-key.js +47 -0
  29. package/lib/Signal/WASignalGroup/sender-key-distribution-message.d.ts +17 -0
  30. package/lib/Signal/WASignalGroup/sender-key-distribution-message.js +71 -0
  31. package/lib/Signal/WASignalGroup/sender-key-message.d.ts +19 -0
  32. package/lib/Signal/WASignalGroup/sender-key-message.js +73 -0
  33. package/lib/Signal/WASignalGroup/sender-key-name.d.ts +19 -0
  34. package/lib/Signal/WASignalGroup/sender-key-name.js +59 -0
  35. package/lib/Signal/WASignalGroup/sender-key-record.d.ts +32 -0
  36. package/lib/Signal/WASignalGroup/sender-key-record.js +58 -0
  37. package/lib/Signal/WASignalGroup/sender-key-state.d.ts +44 -0
  38. package/lib/Signal/WASignalGroup/sender-key-state.js +147 -0
  39. package/lib/Signal/WASignalGroup/sender-message-key.d.ts +11 -0
  40. package/lib/Signal/WASignalGroup/sender-message-key.js +33 -0
  41. package/lib/Signal/WASignalGroup/sender_chain_key.js +49 -49
  42. package/lib/Signal/WASignalGroup/sender_key_distribution_message.js +77 -77
  43. package/lib/Signal/WASignalGroup/sender_key_message.js +91 -91
  44. package/lib/Signal/WASignalGroup/sender_key_name.js +69 -69
  45. package/lib/Signal/WASignalGroup/sender_key_record.js +55 -55
  46. package/lib/Signal/WASignalGroup/sender_key_state.js +128 -128
  47. package/lib/Signal/WASignalGroup/sender_message_key.js +38 -38
  48. package/lib/Signal/libsignal.d.ts +5 -1
  49. package/lib/Signal/libsignal.js +390 -161
  50. package/lib/Signal/lid-mapping.d.ts +28 -0
  51. package/lib/Signal/lid-mapping.js +184 -0
  52. package/lib/Socket/Client/abstract-socket-client.d.ts +15 -15
  53. package/lib/Socket/Client/abstract-socket-client.js +13 -13
  54. package/lib/Socket/Client/index.d.ts +2 -2
  55. package/lib/Socket/Client/mobile-socket-client.d.ts +12 -12
  56. package/lib/Socket/Client/mobile-socket-client.js +65 -65
  57. package/lib/Socket/Client/types.d.ts +1 -1
  58. package/lib/Socket/Client/websocket.d.ts +1 -1
  59. package/lib/Socket/business.d.ts +6 -6
  60. package/lib/Socket/business.js +152 -5
  61. package/lib/Socket/chats.d.ts +3 -4
  62. package/lib/Socket/chats.js +31 -26
  63. package/lib/Socket/communities.d.ts +223 -223
  64. package/lib/Socket/communities.js +432 -432
  65. package/lib/Socket/groups.d.ts +2 -4
  66. package/lib/Socket/groups.js +22 -14
  67. package/lib/Socket/index.d.ts +69 -69
  68. package/lib/Socket/index.js +3 -2
  69. package/lib/Socket/messages-recv.d.ts +3 -6
  70. package/lib/Socket/messages-recv.js +1449 -1707
  71. package/lib/Socket/messages-send.d.ts +2 -4
  72. package/lib/Socket/messages-send.js +617 -126
  73. package/lib/Socket/mex.d.ts +2 -2
  74. package/lib/Socket/mex.js +46 -46
  75. package/lib/Socket/newsletter.d.ts +2 -4
  76. package/lib/Socket/newsletter.js +294 -285
  77. package/lib/Socket/socket.js +318 -132
  78. package/lib/Socket/usync.js +3 -3
  79. package/lib/Store/index.d.ts +4 -4
  80. package/lib/Store/index.js +23 -23
  81. package/lib/Store/make-cache-manager-store.d.ts +13 -13
  82. package/lib/Store/make-cache-manager-store.js +89 -89
  83. package/lib/Store/make-in-memory-store.d.ts +122 -122
  84. package/lib/Store/make-in-memory-store.js +428 -428
  85. package/lib/Store/make-ordered-dictionary.d.ts +11 -11
  86. package/lib/Store/make-ordered-dictionary.js +85 -85
  87. package/lib/Store/object-repository.d.ts +9 -9
  88. package/lib/Store/object-repository.js +30 -30
  89. package/lib/Types/Auth.d.ts +5 -4
  90. package/lib/Types/Bussines.js +3 -0
  91. package/lib/Types/Bussiness.d.ts +28 -0
  92. package/lib/Types/Chat.d.ts +13 -8
  93. package/lib/Types/Contact.d.ts +4 -1
  94. package/lib/Types/Events.d.ts +13 -16
  95. package/lib/Types/GroupMetadata.d.ts +1 -1
  96. package/lib/Types/Message.d.ts +18 -7
  97. package/lib/Types/Message.js +7 -1
  98. package/lib/Types/MexUpdates.d.ts +8 -8
  99. package/lib/Types/MexUpdates.js +17 -17
  100. package/lib/Types/Newsletter.d.ts +1 -1
  101. package/lib/Types/Product.d.ts +1 -1
  102. package/lib/Types/Signal.d.ts +31 -1
  103. package/lib/Types/Socket.d.ts +34 -13
  104. package/lib/Types/State.d.ts +1 -1
  105. package/lib/Types/USync.d.ts +2 -2
  106. package/lib/Types/index.d.ts +16 -15
  107. package/lib/Types/index.js +4 -2
  108. package/lib/Utils/auth-utils.d.ts +20 -20
  109. package/lib/Utils/auth-utils.js +527 -204
  110. package/lib/Utils/baileys-event-stream.d.ts +17 -17
  111. package/lib/Utils/baileys-event-stream.js +69 -69
  112. package/lib/Utils/business.d.ts +28 -28
  113. package/lib/Utils/business.js +254 -254
  114. package/lib/Utils/chat-utils.d.ts +81 -81
  115. package/lib/Utils/chat-utils.js +808 -780
  116. package/lib/Utils/crypto.d.ts +55 -55
  117. package/lib/Utils/crypto.js +188 -178
  118. package/lib/Utils/decode-wa-message.d.ts +52 -40
  119. package/lib/Utils/decode-wa-message.js +322 -252
  120. package/lib/Utils/event-buffer.d.ts +38 -38
  121. package/lib/Utils/event-buffer.js +594 -564
  122. package/lib/Utils/generics.d.ts +131 -129
  123. package/lib/Utils/generics.js +629 -623
  124. package/lib/Utils/history.d.ts +22 -22
  125. package/lib/Utils/history.js +103 -109
  126. package/lib/Utils/index.d.ts +20 -19
  127. package/lib/Utils/index.js +39 -38
  128. package/lib/Utils/link-preview.d.ts +22 -22
  129. package/lib/Utils/link-preview.js +119 -119
  130. package/lib/Utils/logger.d.ts +13 -13
  131. package/lib/Utils/logger.js +7 -7
  132. package/lib/Utils/lt-hash.d.ts +13 -13
  133. package/lib/Utils/lt-hash.js +57 -57
  134. package/lib/Utils/make-mutex.d.ts +8 -8
  135. package/lib/Utils/make-mutex.js +48 -48
  136. package/lib/Utils/message-retry-manager.d.ts +88 -0
  137. package/lib/Utils/message-retry-manager.js +160 -0
  138. package/lib/Utils/messages-media.d.ts +134 -128
  139. package/lib/Utils/messages-media.js +868 -805
  140. package/lib/Utils/messages.d.ts +104 -102
  141. package/lib/Utils/messages.js +1744 -1578
  142. package/lib/Utils/noise-handler.d.ts +20 -19
  143. package/lib/Utils/noise-handler.js +164 -154
  144. package/lib/Utils/process-message.d.ts +48 -48
  145. package/lib/Utils/process-message.js +427 -428
  146. package/lib/Utils/signal.d.ts +41 -41
  147. package/lib/Utils/signal.js +165 -165
  148. package/lib/Utils/use-mongo-file-auth-state.d.ts +5 -5
  149. package/lib/Utils/use-mongo-file-auth-state.js +83 -83
  150. package/lib/Utils/use-multi-file-auth-state.d.ts +17 -17
  151. package/lib/Utils/use-multi-file-auth-state.js +237 -237
  152. package/lib/Utils/use-single-file-auth-state.d.ts +12 -12
  153. package/lib/Utils/use-single-file-auth-state.js +79 -79
  154. package/lib/Utils/validate-connection.d.ts +12 -12
  155. package/lib/Utils/validate-connection.js +219 -186
  156. package/lib/WABinary/constants.d.ts +29 -29
  157. package/lib/WABinary/constants.js +1315 -1315
  158. package/lib/WABinary/decode.d.ts +8 -8
  159. package/lib/WABinary/decode.js +287 -287
  160. package/lib/WABinary/encode.d.ts +2 -2
  161. package/lib/WABinary/encode.js +264 -264
  162. package/lib/WABinary/generic-utils.d.ts +27 -27
  163. package/lib/WABinary/generic-utils.js +141 -141
  164. package/lib/WABinary/index.d.ts +5 -5
  165. package/lib/WABinary/index.js +24 -24
  166. package/lib/WABinary/jid-utils.d.ts +58 -53
  167. package/lib/WABinary/jid-utils.js +103 -91
  168. package/lib/WABinary/types.d.ts +21 -21
  169. package/lib/WABinary/types.js +2 -2
  170. package/lib/WAM/BinaryInfo.d.ts +15 -15
  171. package/lib/WAM/BinaryInfo.js +16 -16
  172. package/lib/WAM/constants.d.ts +46 -46
  173. package/lib/WAM/constants.js +15370 -15370
  174. package/lib/WAM/encode.d.ts +2 -2
  175. package/lib/WAM/encode.js +163 -164
  176. package/lib/WAM/index.d.ts +3 -3
  177. package/lib/WAM/index.js +22 -22
  178. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.d.ts +27 -27
  179. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +68 -68
  180. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +3 -3
  181. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +2 -2
  182. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +2 -2
  183. package/lib/WAUSync/Protocols/USyncLIDProtocol.d.ts +9 -8
  184. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +37 -29
  185. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +2 -2
  186. package/lib/WAUSync/Protocols/index.d.ts +6 -6
  187. package/lib/WAUSync/USyncQuery.d.ts +3 -3
  188. package/lib/WAUSync/index.d.ts +3 -3
  189. package/lib/index.d.ts +13 -13
  190. package/lib/index.js +33 -33
  191. package/package.json +96 -94
  192. package/lib/Socket/registration.d.ts +0 -266
  193. package/lib/Socket/registration.js +0 -166
@@ -1,162 +1,391 @@
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 (mod) {
22
- if (mod && mod.__esModule) return mod
23
- var result = {}
24
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k)
25
- __setModuleDefault(result, mod)
26
- return result
27
- }
28
- Object.defineProperty(exports, "__esModule", { value: true })
29
-
30
- const libsignal = __importStar(require("@neelegirl/libsignal"))
31
- const WASignalGroup_1 = require("./WASignalGroup")
32
- const Utils_1 = require("../Utils")
33
- const WABinary_1 = require("../WABinary")
34
-
35
- function makeLibSignalRepository(auth) {
36
- const storage = signalStorage(auth)
37
- return {
38
- decryptGroupMessage({ group, authorJid, msg }) {
39
- const senderName = jidToSignalSenderKeyName(group, authorJid)
40
- const cipher = new WASignalGroup_1.GroupCipher(storage, senderName)
41
- return cipher.decrypt(msg)
42
- },
43
- async processSenderKeyDistributionMessage({ item, authorJid }) {
44
- const builder = new WASignalGroup_1.GroupSessionBuilder(storage)
45
- const senderName = jidToSignalSenderKeyName(item.groupId, authorJid)
46
- const senderMsg = new WASignalGroup_1.SenderKeyDistributionMessage(null, null, null, null, item.axolotlSenderKeyDistributionMessage)
47
- const { [senderName]: senderKey } = await auth.keys.get('sender-key', [senderName])
48
- if (!senderKey) {
49
- await storage.storeSenderKey(senderName, new WASignalGroup_1.SenderKeyRecord())
50
- }
51
- await builder.process(senderName, senderMsg)
52
- },
53
- async decryptMessage({ jid, type, ciphertext }) {
54
- const addr = jidToSignalProtocolAddress(jid)
55
- const session = new libsignal.SessionCipher(storage, addr)
56
- let result
57
- switch (type) {
58
- case 'pkmsg':
59
- result = await session.decryptPreKeyWhisperMessage(ciphertext)
60
- break
61
- case 'msg':
62
- result = await session.decryptWhisperMessage(ciphertext)
63
- break
64
- }
65
- return result
66
- },
67
- async encryptMessage({ jid, data }) {
68
- const addr = jidToSignalProtocolAddress(jid)
69
- const cipher = new libsignal.SessionCipher(storage, addr)
70
- const { type: sigType, body } = await cipher.encrypt(data)
71
- const type = sigType === 3 ? 'pkmsg' : 'msg'
72
- return { type, ciphertext: Buffer.from(body, 'binary') }
73
- },
74
- async encryptGroupMessage({ group, meId, data }) {
75
- const senderName = jidToSignalSenderKeyName(group, meId)
76
- const builder = new WASignalGroup_1.GroupSessionBuilder(storage)
77
- const { [senderName]: senderKey } = await auth.keys.get('sender-key', [senderName])
78
- if (!senderKey) {
79
- await storage.storeSenderKey(senderName, new WASignalGroup_1.SenderKeyRecord())
80
- }
81
- const senderKeyDistributionMessage = await builder.create(senderName)
82
- const session = new WASignalGroup_1.GroupCipher(storage, senderName)
83
- const ciphertext = await session.encrypt(data)
84
- return {
85
- ciphertext,
86
- senderKeyDistributionMessage: senderKeyDistributionMessage.serialize(),
87
- }
88
- },
89
- async injectE2ESession({ jid, session }) {
90
- const cipher = new libsignal.SessionBuilder(storage, jidToSignalProtocolAddress(jid))
91
- await cipher.initOutgoing(session)
92
- },
93
- jidToSignalProtocolAddress(jid) {
94
- return jidToSignalProtocolAddress(jid).toString()
95
- },
96
- }
97
- }
98
-
99
- const jidToSignalProtocolAddress = (jid) => {
100
- const { user, device } = WABinary_1.jidDecode(jid)
101
- return new libsignal.ProtocolAddress(user, device || 0)
102
- }
103
-
104
- const jidToSignalSenderKeyName = (group, user) => {
105
- return new WASignalGroup_1.SenderKeyName(group, jidToSignalProtocolAddress(user)).toString()
106
- }
107
-
108
- function signalStorage({ creds, keys }) {
109
- return {
110
- loadSession: async (id) => {
111
- const { [id]: sess } = await keys.get('session', [id])
112
- if (sess) {
113
- return libsignal.SessionRecord.deserialize(sess)
114
- }
115
- },
116
- storeSession: async (id, session) => {
117
- await keys.set({ 'session': { [id]: session.serialize() } })
118
- },
119
- isTrustedIdentity: () => {
120
- return true
121
- },
122
- loadPreKey: async (id) => {
123
- const keyId = id.toString()
124
- const { [keyId]: key } = await keys.get('pre-key', [keyId])
125
- if (key) {
126
- return {
127
- privKey: Buffer.from(key.private),
128
- pubKey: Buffer.from(key.public)
129
- }
130
- }
131
- },
132
- removePreKey: (id) => keys.set({ 'pre-key': { [id]: null } }),
133
- loadSignedPreKey: () => {
134
- const key = creds.signedPreKey
135
- return {
136
- privKey: Buffer.from(key.keyPair.private),
137
- pubKey: Buffer.from(key.keyPair.public)
138
- }
139
- },
140
- loadSenderKey: async (keyId) => {
141
- const { [keyId]: key } = await keys.get('sender-key', [keyId])
142
- if (key) {
143
- return new WASignalGroup_1.SenderKeyRecord(key)
144
- }
145
- },
146
- storeSenderKey: async (keyId, key) => {
147
- await keys.set({ 'sender-key': { [keyId]: key.serialize() } })
148
- },
149
- getOurRegistrationId: () => (creds.registrationId),
150
- getOurIdentity: () => {
151
- const { signedIdentityKey } = creds
152
- return {
153
- privKey: Buffer.from(signedIdentityKey.private),
154
- pubKey: Utils_1.generateSignalPubKey(signedIdentityKey.public),
155
- }
156
- }
157
- }
158
- }
159
-
160
- module.exports = {
161
- makeLibSignalRepository
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
162
391
  }
@@ -0,0 +1,28 @@
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
+ }