@badzz88/baileys 8.4.6 → 8.4.9

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 (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1055 -337
  3. package/WAProto/WAProto.proto +850 -32
  4. package/WAProto/index.d.ts +4913 -25
  5. package/WAProto/index.js +14074 -98
  6. package/package.json +96 -131
  7. package/src/Defaults/index.js +201 -0
  8. package/src/Defaults/phonenumber-mcc.json +223 -0
  9. package/src/Signal/Group/ciphertext-message.js +15 -0
  10. package/src/Signal/Group/group-session-builder.js +92 -0
  11. package/src/Signal/Group/group_cipher.js +89 -0
  12. package/src/Signal/Group/index.js +136 -0
  13. package/src/Signal/Group/keyhelper.js +73 -0
  14. package/src/Signal/Group/sender-chain-key.js +32 -0
  15. package/src/Signal/Group/sender-key-distribution-message.js +66 -0
  16. package/src/Signal/Group/sender-key-message.js +69 -0
  17. package/src/Signal/Group/sender-key-name.js +50 -0
  18. package/src/Signal/Group/sender-key-record.js +44 -0
  19. package/src/Signal/Group/sender-key-state.js +97 -0
  20. package/src/Signal/Group/sender-message-key.js +30 -0
  21. package/src/Signal/libsignal.js +470 -0
  22. package/src/Signal/lid-mapping.js +262 -0
  23. package/src/Socket/Client/index.js +30 -0
  24. package/src/Socket/Client/types.js +13 -0
  25. package/src/Socket/Client/websocket.js +62 -0
  26. package/src/Socket/aigroups.js +240 -0
  27. package/src/Socket/business.js +422 -0
  28. package/src/Socket/chats.js +2374 -0
  29. package/src/Socket/communities.js +580 -0
  30. package/src/Socket/graphql.js +915 -0
  31. package/src/Socket/groups.js +812 -0
  32. package/src/Socket/index.js +37 -0
  33. package/src/Socket/interactive-handler.js +579 -0
  34. package/src/Socket/interop.js +566 -0
  35. package/src/Socket/managed-account.js +214 -0
  36. package/src/Socket/messages-recv.js +3012 -0
  37. package/src/Socket/messages-send.js +2163 -0
  38. package/{lib → src}/Socket/mex.js +11 -5
  39. package/src/Socket/newsletter.js +1057 -0
  40. package/src/Socket/privacy.js +452 -0
  41. package/src/Socket/registration.js +434 -0
  42. package/src/Socket/socket.js +1079 -0
  43. package/src/Socket/text-router.js +67 -0
  44. package/src/Socket/username.js +234 -0
  45. package/src/Store/index.js +36 -0
  46. package/src/Store/make-cache-manager-store.js +90 -0
  47. package/src/Store/make-in-memory-store.js +506 -0
  48. package/src/Store/make-ordered-dictionary.js +81 -0
  49. package/src/Store/object-repository.js +29 -0
  50. package/src/Types/Auth.js +38 -0
  51. package/src/Types/Bussines.js +2 -0
  52. package/src/Types/Call.js +2 -0
  53. package/src/Types/Chat.js +4 -0
  54. package/src/Types/Contact.js +2 -0
  55. package/src/Types/Events.js +2 -0
  56. package/src/Types/GroupMetadata.js +2 -0
  57. package/src/Types/Label.js +27 -0
  58. package/src/Types/LabelAssociation.js +9 -0
  59. package/src/Types/Message.js +95 -0
  60. package/src/Types/Newsletter.js +152 -0
  61. package/src/Types/Product.js +2 -0
  62. package/src/Types/Signal.js +2 -0
  63. package/src/Types/Socket.js +2 -0
  64. package/src/Types/State.js +70 -0
  65. package/src/Types/USync.js +2 -0
  66. package/src/Types/index.js +54 -0
  67. package/src/Utils/auth-utils.js +306 -0
  68. package/src/Utils/browser-utils.js +114 -0
  69. package/src/Utils/business.js +247 -0
  70. package/src/Utils/chat-utils.js +1272 -0
  71. package/src/Utils/consumer-application.js +107 -0
  72. package/src/Utils/crypto.js +125 -0
  73. package/src/Utils/decode-wa-message.js +808 -0
  74. package/src/Utils/event-buffer.js +586 -0
  75. package/src/Utils/generics.js +640 -0
  76. package/src/Utils/group-history.js +60 -0
  77. package/src/Utils/history.js +244 -0
  78. package/src/Utils/identity-change-handler.js +52 -0
  79. package/src/Utils/index.js +53 -0
  80. package/src/Utils/jid-display-normalization.js +218 -0
  81. package/src/Utils/link-preview.js +143 -0
  82. package/src/Utils/logger.js +9 -0
  83. package/src/Utils/lt-hash.js +10 -0
  84. package/src/Utils/make-mutex.js +36 -0
  85. package/src/Utils/message-composer.js +479 -0
  86. package/src/Utils/message-inspect.js +400 -0
  87. package/src/Utils/message-retry-manager.js +231 -0
  88. package/src/Utils/messages-media.js +943 -0
  89. package/src/Utils/messages.js +2490 -0
  90. package/src/Utils/meta-ai-msmsg.js +133 -0
  91. package/src/Utils/noise-handler.js +194 -0
  92. package/src/Utils/offline-node-processor.js +42 -0
  93. package/src/Utils/pre-key-manager.js +107 -0
  94. package/src/Utils/process-message.js +1047 -0
  95. package/src/Utils/reporting-utils.js +262 -0
  96. package/src/Utils/signal.js +192 -0
  97. package/src/Utils/stanza-ack.js +74 -0
  98. package/src/Utils/sync-action-utils.js +54 -0
  99. package/src/Utils/tc-token-utils.js +161 -0
  100. package/src/Utils/use-multi-file-auth-state.js +121 -0
  101. package/src/Utils/validate-connection.js +248 -0
  102. package/src/Utils/voip-rekey.js +22 -0
  103. package/src/WABinary/constants.js +1304 -0
  104. package/src/WABinary/decode.js +377 -0
  105. package/src/WABinary/encode.js +58 -0
  106. package/src/WABinary/generic-utils.js +148 -0
  107. package/src/WABinary/index.js +33 -0
  108. package/src/WABinary/jid-utils.js +374 -0
  109. package/src/WABinary/types.js +2 -0
  110. package/src/WAM/BinaryInfo.js +13 -0
  111. package/src/WAM/constants.js +39486 -0
  112. package/src/WAM/encode.js +142 -0
  113. package/src/WAM/index.js +31 -0
  114. package/src/WAUSync/Protocols/USyncBotProfileProtocol.js +55 -0
  115. package/src/WAUSync/Protocols/USyncBusinessProtocol.js +100 -0
  116. package/src/WAUSync/Protocols/USyncContactProtocol.js +60 -0
  117. package/src/WAUSync/Protocols/USyncDeviceProtocol.js +65 -0
  118. package/src/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -0
  119. package/src/WAUSync/Protocols/USyncFeatureProtocol.js +74 -0
  120. package/src/WAUSync/Protocols/USyncLIDProtocol.js +31 -0
  121. package/src/WAUSync/Protocols/USyncPictureProtocol.js +32 -0
  122. package/src/WAUSync/Protocols/USyncSidelistProtocol.js +29 -0
  123. package/src/WAUSync/Protocols/USyncStatusProtocol.js +44 -0
  124. package/src/WAUSync/Protocols/USyncTextStatusProtocol.js +38 -0
  125. package/src/WAUSync/Protocols/USyncUsernameProtocol.js +28 -0
  126. package/src/WAUSync/Protocols/index.js +40 -0
  127. package/src/WAUSync/USyncBackoff.js +31 -0
  128. package/src/WAUSync/USyncQuery.js +204 -0
  129. package/src/WAUSync/USyncUser.js +58 -0
  130. package/src/WAUSync/index.js +32 -0
  131. package/src/antiban.js +4726 -0
  132. package/{lib → src}/index.js +48 -16
  133. package/lib/Defaults/baileys-version.json +0 -3
  134. package/lib/Defaults/index.js +0 -137
  135. package/lib/Defaults/phonenumber-mcc.json +0 -223
  136. package/lib/Signal/Group/Protocols.js +0 -269
  137. package/lib/Signal/Group/ciphertext-message.js +0 -12
  138. package/lib/Signal/Group/group-session-builder.js +0 -30
  139. package/lib/Signal/Group/group_cipher.js +0 -82
  140. package/lib/Signal/Group/index.js +0 -12
  141. package/lib/Signal/Group/keyhelper.js +0 -18
  142. package/lib/Signal/Group/queue-job.js +0 -57
  143. package/lib/Signal/Group/sender-chain-key.js +0 -26
  144. package/lib/Signal/Group/sender-key-distribution-message.js +0 -63
  145. package/lib/Signal/Group/sender-key-message.js +0 -66
  146. package/lib/Signal/Group/sender-key-name.js +0 -48
  147. package/lib/Signal/Group/sender-key-record.js +0 -41
  148. package/lib/Signal/Group/sender-key-state.js +0 -84
  149. package/lib/Signal/Group/sender-message-key.js +0 -26
  150. package/lib/Signal/libsignal.js +0 -432
  151. package/lib/Signal/lid-mapping.js +0 -277
  152. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  153. package/lib/Socket/Client/index.js +0 -3
  154. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  155. package/lib/Socket/Client/types.js +0 -11
  156. package/lib/Socket/Client/web-socket-client.js +0 -62
  157. package/lib/Socket/Client/websocket.js +0 -54
  158. package/lib/Socket/business.js +0 -379
  159. package/lib/Socket/chats.js +0 -1193
  160. package/lib/Socket/communities.js +0 -431
  161. package/lib/Socket/community.js +0 -392
  162. package/lib/Socket/dugong.js +0 -637
  163. package/lib/Socket/groups.js +0 -374
  164. package/lib/Socket/index.js +0 -12
  165. package/lib/Socket/luxu.js +0 -387
  166. package/lib/Socket/messages-recv.js +0 -1916
  167. package/lib/Socket/messages-send.js +0 -1459
  168. package/lib/Socket/newsletter.js +0 -253
  169. package/lib/Socket/registration.js +0 -167
  170. package/lib/Socket/socket.js +0 -950
  171. package/lib/Socket/username.js +0 -146
  172. package/lib/Socket/usync.js +0 -69
  173. package/lib/Store/index.js +0 -10
  174. package/lib/Store/keyed-db.js +0 -108
  175. package/lib/Store/make-cache-manager-store.js +0 -85
  176. package/lib/Store/make-in-memory-store.js +0 -198
  177. package/lib/Store/make-ordered-dictionary.js +0 -75
  178. package/lib/Store/object-repository.js +0 -32
  179. package/lib/Types/Auth.js +0 -2
  180. package/lib/Types/Bussines.js +0 -2
  181. package/lib/Types/Call.js +0 -2
  182. package/lib/Types/Chat.js +0 -8
  183. package/lib/Types/Contact.js +0 -2
  184. package/lib/Types/Events.js +0 -2
  185. package/lib/Types/GroupMetadata.js +0 -2
  186. package/lib/Types/Label.js +0 -25
  187. package/lib/Types/LabelAssociation.js +0 -7
  188. package/lib/Types/Message.js +0 -11
  189. package/lib/Types/Mex.js +0 -37
  190. package/lib/Types/Newsletter.js +0 -38
  191. package/lib/Types/Product.js +0 -2
  192. package/lib/Types/Signal.js +0 -2
  193. package/lib/Types/Socket.js +0 -3
  194. package/lib/Types/State.js +0 -56
  195. package/lib/Types/USync.js +0 -2
  196. package/lib/Types/index.js +0 -26
  197. package/lib/Utils/auth-utils.js +0 -302
  198. package/lib/Utils/baileys-event-stream.js +0 -63
  199. package/lib/Utils/browser-utils.js +0 -48
  200. package/lib/Utils/business.js +0 -231
  201. package/lib/Utils/chat-utils.js +0 -873
  202. package/lib/Utils/companion-reg-client-utils.js +0 -35
  203. package/lib/Utils/crypto.js +0 -118
  204. package/lib/Utils/decode-wa-message.js +0 -350
  205. package/lib/Utils/event-buffer.js +0 -622
  206. package/lib/Utils/generics.js +0 -399
  207. package/lib/Utils/history.js +0 -134
  208. package/lib/Utils/identity-change-handler.js +0 -50
  209. package/lib/Utils/index.js +0 -23
  210. package/lib/Utils/link-preview.js +0 -85
  211. package/lib/Utils/logger.js +0 -3
  212. package/lib/Utils/lt-hash.js +0 -8
  213. package/lib/Utils/make-mutex.js +0 -33
  214. package/lib/Utils/message-composer.js +0 -273
  215. package/lib/Utils/message-retry-manager.js +0 -265
  216. package/lib/Utils/messages-media.js +0 -788
  217. package/lib/Utils/messages.js +0 -1260
  218. package/lib/Utils/noise-handler.js +0 -201
  219. package/lib/Utils/offline-node-processor.js +0 -40
  220. package/lib/Utils/pre-key-manager.js +0 -106
  221. package/lib/Utils/process-message.js +0 -630
  222. package/lib/Utils/reporting-utils.js +0 -258
  223. package/lib/Utils/signal.js +0 -202
  224. package/lib/Utils/stanza-ack.js +0 -38
  225. package/lib/Utils/sync-action-utils.js +0 -49
  226. package/lib/Utils/tc-token-utils.js +0 -163
  227. package/lib/Utils/use-multi-file-auth-state.js +0 -121
  228. package/lib/Utils/validate-connection.js +0 -204
  229. package/lib/WABinary/constants.js +0 -1301
  230. package/lib/WABinary/decode.js +0 -262
  231. package/lib/WABinary/encode.js +0 -220
  232. package/lib/WABinary/generic-utils.js +0 -204
  233. package/lib/WABinary/index.js +0 -6
  234. package/lib/WABinary/jid-utils.js +0 -98
  235. package/lib/WABinary/types.js +0 -2
  236. package/lib/WAM/BinaryInfo.js +0 -10
  237. package/lib/WAM/constants.js +0 -22853
  238. package/lib/WAM/encode.js +0 -150
  239. package/lib/WAM/index.js +0 -4
  240. package/lib/WAUSync/Protocols/USyncContactProtocol.js +0 -52
  241. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +0 -54
  242. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +0 -27
  243. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +0 -38
  244. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +0 -25
  245. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +0 -51
  246. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +0 -29
  247. package/lib/WAUSync/Protocols/index.js +0 -6
  248. package/lib/WAUSync/USyncQuery.js +0 -98
  249. package/lib/WAUSync/USyncUser.js +0 -31
  250. package/lib/WAUSync/index.js +0 -4
@@ -0,0 +1,107 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.consumerApplicationToMessage = exports.decodeConsumerApplication = void 0
4
+ const index_js_1 = require('../../WAProto/index.js')
5
+
6
+ const decodeConsumerApplication = buffer => {
7
+ if (!Buffer.isBuffer(buffer) && !(buffer instanceof Uint8Array)) {
8
+ throw new TypeError('decodeConsumerApplication: buffer must be Buffer or Uint8Array')
9
+ }
10
+ return index_js_1.proto.ConsumerApplication.decode(buffer)
11
+ }
12
+ exports.decodeConsumerApplication = decodeConsumerApplication
13
+
14
+ const textOf = mt => (mt && typeof mt.text === 'string' ? mt.text : undefined)
15
+
16
+ const mapContent = content => {
17
+ if (!content) return null
18
+ switch (content.content) {
19
+ case 'messageText':
20
+ return { conversation: textOf(content.messageText) ?? '' }
21
+ case 'extendedTextMessage': {
22
+ const e = content.extendedTextMessage
23
+ return {
24
+ extendedTextMessage: {
25
+ text: textOf(e.text),
26
+ matchedText: e.matchedText,
27
+ canonicalUrl: e.canonicalUrl,
28
+ description: e.description,
29
+ title: e.title
30
+ }
31
+ }
32
+ }
33
+ case 'imageMessage':
34
+ return {
35
+ imageMessage: { mediaPayload: content.imageMessage.image, caption: textOf(content.imageMessage.caption) }
36
+ }
37
+ case 'videoMessage':
38
+ return {
39
+ videoMessage: { mediaPayload: content.videoMessage.video, caption: textOf(content.videoMessage.caption) }
40
+ }
41
+ case 'audioMessage':
42
+ return { audioMessage: { mediaPayload: content.audioMessage.audio, ptt: content.audioMessage.ptt } }
43
+ case 'documentMessage':
44
+ return {
45
+ documentMessage: { mediaPayload: content.documentMessage.document, fileName: content.documentMessage.fileName }
46
+ }
47
+ case 'stickerMessage':
48
+ return { stickerMessage: { mediaPayload: content.stickerMessage.sticker } }
49
+ case 'contactMessage':
50
+ return { contactMessage: { mediaPayload: content.contactMessage.contact } }
51
+ case 'contactsArrayMessage':
52
+ return {
53
+ contactsArrayMessage: {
54
+ displayName: content.contactsArrayMessage.displayName,
55
+ contacts: content.contactsArrayMessage.contacts || []
56
+ }
57
+ }
58
+ case 'locationMessage': {
59
+ const loc = content.locationMessage.location || {}
60
+ return {
61
+ locationMessage: {
62
+ degreesLatitude: loc.degreesLatitude,
63
+ degreesLongitude: loc.degreesLongitude,
64
+ name: loc.name
65
+ }
66
+ }
67
+ }
68
+ case 'liveLocationMessage': {
69
+ const loc = content.liveLocationMessage.location || {}
70
+ return {
71
+ liveLocationMessage: {
72
+ degreesLatitude: loc.degreesLatitude,
73
+ degreesLongitude: loc.degreesLongitude,
74
+ caption: textOf(content.liveLocationMessage.caption)
75
+ }
76
+ }
77
+ }
78
+ case 'reactionMessage':
79
+ return { reactionMessage: content.reactionMessage }
80
+ default:
81
+ return null
82
+ }
83
+ }
84
+
85
+ const consumerApplicationToMessage = app => {
86
+ const payload = app?.payload
87
+ if (!payload) return null
88
+ switch (payload.payload) {
89
+ case 'content':
90
+ return mapContent(payload.content)
91
+ case 'applicationData': {
92
+ const ad = payload.applicationData
93
+ if (ad?.applicationContent === 'revoke' && ad.revoke?.key) {
94
+ return {
95
+ protocolMessage: {
96
+ key: ad.revoke.key,
97
+ type: index_js_1.proto.Message.ProtocolMessage.Type.REVOKE
98
+ }
99
+ }
100
+ }
101
+ return null
102
+ }
103
+ default:
104
+ return null
105
+ }
106
+ }
107
+ exports.consumerApplicationToMessage = consumerApplicationToMessage
@@ -0,0 +1,125 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.signedKeyPair =
4
+ exports.Curve =
5
+ exports.generateSignalPubKey =
6
+ exports.getEnabledFeatures =
7
+ exports.hkdf =
8
+ exports.md5 =
9
+ void 0
10
+ exports.aesEncryptGCM = aesEncryptGCM
11
+ exports.aesDecryptGCM = aesDecryptGCM
12
+ exports.aesEncryptCTR = aesEncryptCTR
13
+ exports.aesDecryptCTR = aesDecryptCTR
14
+ exports.aesDecrypt = aesDecrypt
15
+ exports.aesDecryptWithIV = aesDecryptWithIV
16
+ exports.aesEncrypt = aesEncrypt
17
+ exports.aesEncrypWithIV = aesEncrypWithIV
18
+ exports.hmacSign = hmacSign
19
+ exports.sha256 = sha256
20
+ exports.derivePairingCodeKey = derivePairingCodeKey
21
+ const { subtle } = globalThis.crypto
22
+ const Defaults_1 = require('../Defaults')
23
+ const rb = require('whatsapp-rust-bridge-baron')
24
+
25
+ // ── Re-exports from Rust ─────────────────────────────────────────────────────
26
+ Object.defineProperty(exports, 'md5', { enumerable: true, get: () => rb.md5 })
27
+ Object.defineProperty(exports, 'hkdf', { enumerable: true, get: () => rb.hkdf })
28
+ Object.defineProperty(exports, 'getEnabledFeatures', { enumerable: true, get: () => rb.getEnabledFeatures })
29
+
30
+ // ── Signal pub key helper ─────────────────────────────────────────────────────
31
+ const generateSignalPubKey = pubKey =>
32
+ pubKey.length === 33 ? pubKey : Buffer.concat([Defaults_1.KEY_BUNDLE_TYPE, pubKey])
33
+ exports.generateSignalPubKey = generateSignalPubKey
34
+
35
+ // ── Curve — fully delegated to Rust bridge ────────────────────────────────────
36
+ exports.Curve = {
37
+ generateKeyPair: () => {
38
+ const pair = rb.generateKeyPair()
39
+ return {
40
+ private: Buffer.from(pair.privKey),
41
+ public: Buffer.from(pair.pubKey).subarray(1) // strip 0x05 prefix
42
+ }
43
+ },
44
+ sharedKey: (privateKey, publicKey) => Buffer.from(rb.calculateAgreement(generateSignalPubKey(publicKey), privateKey)),
45
+ sign: (privateKey, buf) => rb.calculateSignature(privateKey, buf),
46
+ verify: (pubKey, message, signature) => {
47
+ try {
48
+ return rb.verifySignature(generateSignalPubKey(pubKey), message, signature)
49
+ } catch {
50
+ return false
51
+ }
52
+ }
53
+ }
54
+
55
+ const signedKeyPair = (identityKeyPair, keyId) => {
56
+ const preKey = exports.Curve.generateKeyPair()
57
+ const pubKey = generateSignalPubKey(preKey.public)
58
+ const signature = exports.Curve.sign(identityKeyPair.private, pubKey)
59
+ return { keyPair: preKey, signature, keyId }
60
+ }
61
+ exports.signedKeyPair = signedKeyPair
62
+
63
+ // ── AES-256-GCM ───────────────────────────────────────────────────────────────
64
+ function aesEncryptGCM(plaintext, key, iv, additionalData) {
65
+ return Buffer.from(rb.aesEncryptGCM(plaintext, key, iv, additionalData))
66
+ }
67
+
68
+ function aesDecryptGCM(ciphertext, key, iv, additionalData) {
69
+ return Buffer.from(rb.aesDecryptGCM(ciphertext, key, iv, additionalData))
70
+ }
71
+
72
+ // ── AES-256-CTR ───────────────────────────────────────────────────────────────
73
+ function aesEncryptCTR(plaintext, key, iv) {
74
+ return Buffer.from(rb.aesEncryptCTR(plaintext, key, iv))
75
+ }
76
+
77
+ function aesDecryptCTR(ciphertext, key, iv) {
78
+ return Buffer.from(rb.aesDecryptCTR(ciphertext, key, iv))
79
+ }
80
+
81
+ // ── AES-256-CBC ───────────────────────────────────────────────────────────────
82
+ function aesDecrypt(buffer, key) {
83
+ return Buffer.from(rb.aesDecrypt(buffer, key))
84
+ }
85
+
86
+ function aesDecryptWithIV(buffer, key, IV) {
87
+ return Buffer.from(rb.aesDecryptWithIV(buffer, key, IV))
88
+ }
89
+
90
+ function aesEncrypt(buffer, key) {
91
+ return Buffer.from(rb.aesEncrypt(buffer, key))
92
+ }
93
+
94
+ function aesEncrypWithIV(buffer, key, IV) {
95
+ return Buffer.from(rb.aesEncrypWithIV(buffer, key, IV))
96
+ }
97
+
98
+ // ── HMAC-SHA256 ───────────────────────────────────────────────────────────────
99
+ function hmacSign(buffer, key, variant = 'sha256') {
100
+ if (variant !== 'sha256') {
101
+ // fallback for non-SHA256 variants (rare edge case)
102
+ const { createHmac } = require('crypto')
103
+ return createHmac(variant, key).update(buffer).digest()
104
+ }
105
+ return Buffer.from(rb.hmacSign(buffer, key))
106
+ }
107
+
108
+ // ── SHA-256 ───────────────────────────────────────────────────────────────────
109
+ function sha256(buffer) {
110
+ return Buffer.from(rb.sha256(buffer))
111
+ }
112
+
113
+ // ── PBKDF2 pairing code key ───────────────────────────────────────────────────
114
+ async function derivePairingCodeKey(pairingCode, salt) {
115
+ const encoder = new TextEncoder()
116
+ const pairingCodeBuffer = encoder.encode(pairingCode)
117
+ const saltBuffer = new Uint8Array(salt instanceof Uint8Array ? salt : new Uint8Array(salt))
118
+ const keyMaterial = await subtle.importKey('raw', pairingCodeBuffer, { name: 'PBKDF2' }, false, ['deriveBits'])
119
+ const derivedBits = await subtle.deriveBits(
120
+ { name: 'PBKDF2', salt: saltBuffer, iterations: 2 << 16, hash: 'SHA-256' },
121
+ keyMaterial,
122
+ 256
123
+ )
124
+ return Buffer.from(derivedBits)
125
+ }