@vanzxy/baileys 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/NOTICE.md +111 -0
  2. package/README.md +830 -0
  3. package/WAProto/index.d.ts +9 -0
  4. package/WAProto/index.js +142036 -0
  5. package/engine-requirements.js +13 -0
  6. package/lib/Defaults/index.d.ts +152 -0
  7. package/lib/Defaults/index.js +179 -0
  8. package/lib/Framework/Bot.js +209 -0
  9. package/lib/Framework/Context.js +90 -0
  10. package/lib/Framework/MediaManager.js +152 -0
  11. package/lib/Framework/SessionManager.js +34 -0
  12. package/lib/Framework/StatsManager.js +120 -0
  13. package/lib/Framework/Store/SQLiteStore.js +74 -0
  14. package/lib/Framework/index.js +11 -0
  15. package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
  16. package/lib/Signal/Group/ciphertext-message.js +12 -0
  17. package/lib/Signal/Group/group-session-builder.d.ts +7 -0
  18. package/lib/Signal/Group/group-session-builder.js +30 -0
  19. package/lib/Signal/Group/group_cipher.d.ts +10 -0
  20. package/lib/Signal/Group/group_cipher.js +82 -0
  21. package/lib/Signal/Group/index.d.ts +11 -0
  22. package/lib/Signal/Group/index.js +12 -0
  23. package/lib/Signal/Group/keyhelper.d.ts +6 -0
  24. package/lib/Signal/Group/keyhelper.js +18 -0
  25. package/lib/Signal/Group/sender-chain-key.d.ts +13 -0
  26. package/lib/Signal/Group/sender-chain-key.js +26 -0
  27. package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -0
  28. package/lib/Signal/Group/sender-key-distribution-message.js +63 -0
  29. package/lib/Signal/Group/sender-key-message.d.ts +18 -0
  30. package/lib/Signal/Group/sender-key-message.js +66 -0
  31. package/lib/Signal/Group/sender-key-name.d.ts +11 -0
  32. package/lib/Signal/Group/sender-key-name.js +48 -0
  33. package/lib/Signal/Group/sender-key-record.d.ts +12 -0
  34. package/lib/Signal/Group/sender-key-record.js +41 -0
  35. package/lib/Signal/Group/sender-key-state.d.ts +16 -0
  36. package/lib/Signal/Group/sender-key-state.js +84 -0
  37. package/lib/Signal/Group/sender-message-key.d.ts +11 -0
  38. package/lib/Signal/Group/sender-message-key.js +26 -0
  39. package/lib/Signal/libsignal.d.ts +54 -0
  40. package/lib/Signal/libsignal.js +431 -0
  41. package/lib/Signal/lid-mapping.d.ts +20 -0
  42. package/lib/Signal/lid-mapping.js +277 -0
  43. package/lib/Socket/Client/index.d.ts +2 -0
  44. package/lib/Socket/Client/index.js +3 -0
  45. package/lib/Socket/Client/types.d.ts +5 -0
  46. package/lib/Socket/Client/types.js +11 -0
  47. package/lib/Socket/Client/websocket.d.ts +12 -0
  48. package/lib/Socket/Client/websocket.js +54 -0
  49. package/lib/Socket/business.d.ts +395 -0
  50. package/lib/Socket/business.js +380 -0
  51. package/lib/Socket/chats.d.ts +136 -0
  52. package/lib/Socket/chats.js +1328 -0
  53. package/lib/Socket/communities.d.ts +561 -0
  54. package/lib/Socket/communities.js +434 -0
  55. package/lib/Socket/dugong.d.ts +117 -0
  56. package/lib/Socket/dugong.js +799 -0
  57. package/lib/Socket/groups.d.ts +285 -0
  58. package/lib/Socket/groups.js +355 -0
  59. package/lib/Socket/index.d.ts +531 -0
  60. package/lib/Socket/index.js +34 -0
  61. package/lib/Socket/messages-recv.d.ts +333 -0
  62. package/lib/Socket/messages-recv.js +1782 -0
  63. package/lib/Socket/messages-send.d.ts +329 -0
  64. package/lib/Socket/messages-send.js +1383 -0
  65. package/lib/Socket/mex.d.ts +1 -0
  66. package/lib/Socket/mex.js +42 -0
  67. package/lib/Socket/newsletter.d.ts +281 -0
  68. package/lib/Socket/newsletter.js +321 -0
  69. package/lib/Socket/socket.d.ts +60 -0
  70. package/lib/Socket/socket.js +1001 -0
  71. package/lib/Socket/username.js +153 -0
  72. package/lib/Store/index.d.ts +3 -0
  73. package/lib/Store/index.js +4 -0
  74. package/lib/Store/make-in-memory-store.d.ts +62 -0
  75. package/lib/Store/make-in-memory-store.js +429 -0
  76. package/lib/Store/make-ordered-dictionary.d.ts +12 -0
  77. package/lib/Store/make-ordered-dictionary.js +79 -0
  78. package/lib/Store/object-repository.d.ts +10 -0
  79. package/lib/Store/object-repository.js +24 -0
  80. package/lib/Types/Auth.d.ts +117 -0
  81. package/lib/Types/Auth.js +2 -0
  82. package/lib/Types/Bussines.d.ts +25 -0
  83. package/lib/Types/Bussines.js +2 -0
  84. package/lib/Types/Call.d.ts +15 -0
  85. package/lib/Types/Call.js +2 -0
  86. package/lib/Types/Chat.d.ts +124 -0
  87. package/lib/Types/Chat.js +8 -0
  88. package/lib/Types/Contact.d.ts +26 -0
  89. package/lib/Types/Contact.js +2 -0
  90. package/lib/Types/Events.d.ts +256 -0
  91. package/lib/Types/Events.js +2 -0
  92. package/lib/Types/GroupMetadata.d.ts +71 -0
  93. package/lib/Types/GroupMetadata.js +2 -0
  94. package/lib/Types/Label.d.ts +2 -0
  95. package/lib/Types/Label.js +25 -0
  96. package/lib/Types/LabelAssociation.d.ts +2 -0
  97. package/lib/Types/LabelAssociation.js +7 -0
  98. package/lib/Types/Message.d.ts +11 -0
  99. package/lib/Types/Message.js +18 -0
  100. package/lib/Types/Mex.d.ts +2 -0
  101. package/lib/Types/Mex.js +39 -0
  102. package/lib/Types/Product.d.ts +79 -0
  103. package/lib/Types/Product.js +2 -0
  104. package/lib/Types/RichType.d.ts +2 -0
  105. package/lib/Types/RichType.js +23 -0
  106. package/lib/Types/Signal.d.ts +87 -0
  107. package/lib/Types/Signal.js +2 -0
  108. package/lib/Types/Socket.d.ts +136 -0
  109. package/lib/Types/Socket.js +2 -0
  110. package/lib/Types/State.d.ts +5 -0
  111. package/lib/Types/State.js +56 -0
  112. package/lib/Types/USync.d.ts +26 -0
  113. package/lib/Types/USync.js +2 -0
  114. package/lib/Types/index.d.ts +66 -0
  115. package/lib/Types/index.js +26 -0
  116. package/lib/Utils/A2UI.js +277 -0
  117. package/lib/Utils/MessageBuilder.js +4405 -0
  118. package/lib/Utils/MessageBuilder_d.ts +411 -0
  119. package/lib/Utils/PersistentStore.js +592 -0
  120. package/lib/Utils/PersistentStore_d.ts +60 -0
  121. package/lib/Utils/anti-delete.d.ts +74 -0
  122. package/lib/Utils/anti-delete.js +222 -0
  123. package/lib/Utils/auth-utils.d.ts +57 -0
  124. package/lib/Utils/auth-utils.js +307 -0
  125. package/lib/Utils/auto-reply.d.ts +47 -0
  126. package/lib/Utils/auto-reply.js +158 -0
  127. package/lib/Utils/baileys-event-stream.d.ts +8 -0
  128. package/lib/Utils/baileys-event-stream.js +62 -0
  129. package/lib/Utils/browser-utils.d.ts +8 -0
  130. package/lib/Utils/browser-utils.js +28 -0
  131. package/lib/Utils/business.d.ts +49 -0
  132. package/lib/Utils/business.js +240 -0
  133. package/lib/Utils/button-helper-utils.js +314 -0
  134. package/lib/Utils/button-sender.js +824 -0
  135. package/lib/Utils/chat-control.d.ts +159 -0
  136. package/lib/Utils/chat-control.js +232 -0
  137. package/lib/Utils/chat-history-helpers.d.ts +21 -0
  138. package/lib/Utils/chat-history-helpers.js +71 -0
  139. package/lib/Utils/chat-utils.d.ts +407 -0
  140. package/lib/Utils/chat-utils.js +886 -0
  141. package/lib/Utils/companion-reg-client-utils.d.ts +4 -0
  142. package/lib/Utils/companion-reg-client-utils.js +40 -0
  143. package/lib/Utils/crypto.d.ts +41 -0
  144. package/lib/Utils/crypto.js +148 -0
  145. package/lib/Utils/decode-wa-message.d.ts +83 -0
  146. package/lib/Utils/decode-wa-message.js +317 -0
  147. package/lib/Utils/event-buffer.d.ts +12 -0
  148. package/lib/Utils/event-buffer.js +636 -0
  149. package/lib/Utils/generics.d.ts +69 -0
  150. package/lib/Utils/generics.js +439 -0
  151. package/lib/Utils/history.d.ts +90 -0
  152. package/lib/Utils/history.js +147 -0
  153. package/lib/Utils/identity-change-handler.d.ts +13 -0
  154. package/lib/Utils/identity-change-handler.js +50 -0
  155. package/lib/Utils/index.d.ts +39 -0
  156. package/lib/Utils/index.js +46 -0
  157. package/lib/Utils/link-preview.d.ts +12 -0
  158. package/lib/Utils/link-preview.js +85 -0
  159. package/lib/Utils/logger.d.ts +2 -0
  160. package/lib/Utils/logger.js +3 -0
  161. package/lib/Utils/lt-hash.d.ts +12 -0
  162. package/lib/Utils/lt-hash.js +27 -0
  163. package/lib/Utils/make-mutex.d.ts +6 -0
  164. package/lib/Utils/make-mutex.js +33 -0
  165. package/lib/Utils/media-messages.d.ts +18 -0
  166. package/lib/Utils/media-messages.js +71 -0
  167. package/lib/Utils/media-set.d.ts +13 -0
  168. package/lib/Utils/media-set.js +172 -0
  169. package/lib/Utils/message-kind.js +139 -0
  170. package/lib/Utils/message-retry-manager.d.ts +79 -0
  171. package/lib/Utils/message-retry-manager.js +265 -0
  172. package/lib/Utils/message-search.d.ts +44 -0
  173. package/lib/Utils/message-search.js +189 -0
  174. package/lib/Utils/messages-media.d.ts +135 -0
  175. package/lib/Utils/messages-media.js +869 -0
  176. package/lib/Utils/messages.d.ts +44 -0
  177. package/lib/Utils/messages.js +2155 -0
  178. package/lib/Utils/noise-handler.d.ts +20 -0
  179. package/lib/Utils/noise-handler.js +201 -0
  180. package/lib/Utils/offline-node-processor.d.ts +9 -0
  181. package/lib/Utils/offline-node-processor.js +40 -0
  182. package/lib/Utils/past-participants.d.ts +14 -0
  183. package/lib/Utils/past-participants.js +40 -0
  184. package/lib/Utils/pre-key-manager.d.ts +25 -0
  185. package/lib/Utils/pre-key-manager.js +106 -0
  186. package/lib/Utils/process-message.d.ts +82 -0
  187. package/lib/Utils/process-message.js +809 -0
  188. package/lib/Utils/reporting-utils.d.ts +12 -0
  189. package/lib/Utils/reporting-utils.js +258 -0
  190. package/lib/Utils/rich-message-utils.d.ts +48 -0
  191. package/lib/Utils/rich-message-utils.js +445 -0
  192. package/lib/Utils/scheduling.d.ts +42 -0
  193. package/lib/Utils/scheduling.js +140 -0
  194. package/lib/Utils/signal.d.ts +82 -0
  195. package/lib/Utils/signal.js +201 -0
  196. package/lib/Utils/stanza-ack.d.ts +16 -0
  197. package/lib/Utils/stanza-ack.js +38 -0
  198. package/lib/Utils/status.d.ts +50 -0
  199. package/lib/Utils/status.js +108 -0
  200. package/lib/Utils/stickerpack.d.ts +51 -0
  201. package/lib/Utils/stickerpack.js +275 -0
  202. package/lib/Utils/sync-action-utils.d.ts +2 -0
  203. package/lib/Utils/sync-action-utils.js +49 -0
  204. package/lib/Utils/tc-token-utils.d.ts +29 -0
  205. package/lib/Utils/tc-token-utils.js +163 -0
  206. package/lib/Utils/templates.d.ts +76 -0
  207. package/lib/Utils/templates.js +151 -0
  208. package/lib/Utils/use-cache-manager-auth-state.d.ts +13 -0
  209. package/lib/Utils/use-cache-manager-auth-state.js +82 -0
  210. package/lib/Utils/use-multi-file-auth-state.d.ts +10 -0
  211. package/lib/Utils/use-multi-file-auth-state.js +167 -0
  212. package/lib/Utils/use-single-file-auth-state.d.ts +10 -0
  213. package/lib/Utils/use-single-file-auth-state.js +114 -0
  214. package/lib/Utils/use-sqlite-auth-state.d.ts +11 -0
  215. package/lib/Utils/use-sqlite-auth-state.js +170 -0
  216. package/lib/Utils/validate-connection.d.ts +42 -0
  217. package/lib/Utils/validate-connection.js +199 -0
  218. package/lib/Utils/vcard.d.ts +58 -0
  219. package/lib/Utils/vcard.js +105 -0
  220. package/lib/VoIP/audio-feeder.d.ts +15 -0
  221. package/lib/VoIP/audio-feeder.js +132 -0
  222. package/lib/VoIP/index.js +277 -0
  223. package/lib/VoIP/relay-transport.d.ts +43 -0
  224. package/lib/VoIP/relay-transport.js +559 -0
  225. package/lib/VoIP/signaling.js +624 -0
  226. package/lib/VoIP/types.d.ts +69 -0
  227. package/lib/VoIP/types.js +17 -0
  228. package/lib/VoIP/wasm-engine.d.ts +103 -0
  229. package/lib/VoIP/wasm-engine.js +1214 -0
  230. package/lib/VoIP/worker-bootstrap.js +1042 -0
  231. package/lib/WABinary/constants.d.ts +61 -0
  232. package/lib/WABinary/constants.js +1467 -0
  233. package/lib/WABinary/decode.d.ts +9 -0
  234. package/lib/WABinary/decode.js +262 -0
  235. package/lib/WABinary/encode.d.ts +2 -0
  236. package/lib/WABinary/encode.js +220 -0
  237. package/lib/WABinary/generic-utils.d.ts +74 -0
  238. package/lib/WABinary/generic-utils.js +277 -0
  239. package/lib/WABinary/index.d.ts +5 -0
  240. package/lib/WABinary/index.js +6 -0
  241. package/lib/WABinary/jid-utils.d.ts +28 -0
  242. package/lib/WABinary/jid-utils.js +96 -0
  243. package/lib/WABinary/types.d.ts +19 -0
  244. package/lib/WABinary/types.js +2 -0
  245. package/lib/WAM/BinaryInfo.d.ts +7 -0
  246. package/lib/WAM/BinaryInfo.js +10 -0
  247. package/lib/WAM/constants.d.ts +34926 -0
  248. package/lib/WAM/constants.js +22853 -0
  249. package/lib/WAM/encode.d.ts +1 -0
  250. package/lib/WAM/encode.js +150 -0
  251. package/lib/WAM/index.d.ts +3 -0
  252. package/lib/WAM/index.js +4 -0
  253. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +36 -0
  254. package/lib/WAUSync/Protocols/USyncContactProtocol.js +52 -0
  255. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +29 -0
  256. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +63 -0
  257. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  258. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -0
  259. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  260. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +38 -0
  261. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +9 -0
  262. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
  263. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +38 -0
  264. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +51 -0
  265. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +14 -0
  266. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +29 -0
  267. package/lib/WAUSync/Protocols/index.d.ts +7 -0
  268. package/lib/WAUSync/Protocols/index.js +8 -0
  269. package/lib/WAUSync/USyncQuery.d.ts +20 -0
  270. package/lib/WAUSync/USyncQuery.js +122 -0
  271. package/lib/WAUSync/USyncUser.d.ts +16 -0
  272. package/lib/WAUSync/USyncUser.js +31 -0
  273. package/lib/WAUSync/index.d.ts +3 -0
  274. package/lib/WAUSync/index.js +4 -0
  275. package/lib/assets/wasm/loader.js +5 -0
  276. package/lib/assets/wasm/whatsapp.wasm +0 -0
  277. package/lib/assets/wasm/worker-modules.js +273 -0
  278. package/lib/index.d.ts +12 -0
  279. package/lib/index.js +20 -0
  280. package/package.json +175 -0
  281. package/postinstall-banner.js +56 -0
@@ -0,0 +1,152 @@
1
+ import { randomBytes } from 'crypto';
2
+ import * as fs from 'fs';
3
+ import * as os from 'os';
4
+ import * as path from 'path';
5
+
6
+ // Vanz@Port (from @queenanya/baileys Framework, originally Baileys PR #2710
7
+ // by LuferOS) --- media conversion helpers: image/video → WebP stickers
8
+ // (with optional packname/author EXIF), audio → OGG Opus voice notes.
9
+ //
10
+ // Vanz@Fix vs upstream: original hard-`require()`'d `node-webpmux` and
11
+ // pulled in `ffmpeg-static` (bundles a per-platform ffmpeg binary) alongside
12
+ // `fluent-ffmpeg`. `fluent-ffmpeg` is already an optional peer dep in this
13
+ // fork, lazy-loaded via the getFfmpeg() pattern established in
14
+ // Utils/MessageBuilder.js (15-08-26) — reused verbatim here instead of
15
+ // re-introducing a static import or a second ffmpeg-binary dependency.
16
+ // `node-webpmux` is lazy-loaded the same way, and only when packname/author
17
+ // metadata is actually requested.
18
+ let _ffmpeg;
19
+ const getFfmpeg = async () => {
20
+ if (_ffmpeg === undefined) {
21
+ _ffmpeg = await import('fluent-ffmpeg').then((m) => m.default ?? m).catch(() => null);
22
+ }
23
+ if (!_ffmpeg)
24
+ throw new Error('fluent-ffmpeg is required for sticker/voice-note conversion. Install it with: npm i fluent-ffmpeg');
25
+ return _ffmpeg;
26
+ };
27
+
28
+ let _webpmux;
29
+ const getWebpmux = async () => {
30
+ if (_webpmux === undefined) {
31
+ _webpmux = await import('node-webpmux').then((m) => m.default ?? m).catch(() => null);
32
+ }
33
+ if (!_webpmux)
34
+ throw new Error('node-webpmux is required for sticker packname/author metadata. Install it with: npm i node-webpmux (conversion without metadata does not need this package)');
35
+ return _webpmux;
36
+ };
37
+
38
+ export class MediaManager {
39
+ /** Generate a temp file path with a given extension */
40
+ static getTempFile(ext) {
41
+ return path.join(os.tmpdir(), `baileys-fw-${randomBytes(8).toString('hex')}.${ext}`);
42
+ }
43
+
44
+ /**
45
+ * Convert image or video to a WebP sticker buffer.
46
+ * Applies packname/author EXIF metadata when provided (requires the
47
+ * optional `node-webpmux` peer dependency — only loaded if metadata is given).
48
+ */
49
+ static async convertToSticker(inputPathOrBuffer, metadata) {
50
+ const ffmpegLib = await getFfmpeg();
51
+ const tempInput = MediaManager.getTempFile('in');
52
+ const tempOutput = MediaManager.getTempFile('webp');
53
+ try {
54
+ if (Buffer.isBuffer(inputPathOrBuffer)) {
55
+ await fs.promises.writeFile(tempInput, inputPathOrBuffer);
56
+ }
57
+ else {
58
+ await fs.promises.copyFile(inputPathOrBuffer, tempInput);
59
+ }
60
+ await new Promise((resolve, reject) => {
61
+ ffmpegLib(tempInput)
62
+ .outputOptions([
63
+ '-vcodec', 'libwebp',
64
+ '-vf', 'scale=512:512:force_original_aspect_ratio=decrease,pad=512:512:(ow-iw)/2:(oh-ih)/2:color=white@0',
65
+ '-loop', '0',
66
+ '-preset', 'default',
67
+ '-an', '-vsync', '0',
68
+ '-t', '00:00:05'
69
+ ])
70
+ .output(tempOutput)
71
+ .on('end', () => resolve())
72
+ .on('error', (err) => reject(err))
73
+ .run();
74
+ });
75
+ const webpBuffer = await fs.promises.readFile(tempOutput);
76
+ if (metadata?.packname || metadata?.author) {
77
+ // EXIF header: fixed 22-byte TIFF/IFD preamble (magic + one IFD
78
+ // entry pointing at the WhatsApp tag 0x0741) followed by a
79
+ // little-endian payload length and a little-endian offset to
80
+ // where the payload begins (always 22, the header's own size).
81
+ const exifJson = JSON.stringify({
82
+ 'sticker-pack-id': `com.vanzxy.sticker.${randomBytes(4).toString('hex')}`,
83
+ 'sticker-pack-name': metadata.packname || '',
84
+ 'sticker-pack-publisher': metadata.author || '',
85
+ emojis: ['🤖']
86
+ });
87
+ const exifBytes = Buffer.from(exifJson, 'utf8');
88
+ const exifHeader = Buffer.from([
89
+ 0x49, 0x49, 0x2a, 0x00, // TIFF byte order (little-endian) + magic number
90
+ 0x08, 0x00, 0x00, 0x00, // offset to first IFD
91
+ 0x01, 0x00, // number of IFD entries
92
+ 0x41, 0x57, 0x07, 0x00, // tag 0x0741 (WhatsApp), type 0x0007 (undefined)
93
+ 0x00, 0x00, 0x00, 0x00, // payload length placeholder — filled below
94
+ 0x16, 0x00, 0x00, 0x00 // offset to payload data (fixed: 22 = header size)
95
+ ]);
96
+ exifHeader.writeUInt32LE(exifBytes.length, 14);
97
+ const fullExif = Buffer.concat([exifHeader, exifBytes]);
98
+ const webpmux = await getWebpmux();
99
+ const img = new webpmux.Image();
100
+ await img.load(webpBuffer);
101
+ img.exif = fullExif;
102
+ return await img.save(null);
103
+ }
104
+ return webpBuffer;
105
+ }
106
+ finally {
107
+ await fs.promises.unlink(tempInput).catch(() => { });
108
+ await fs.promises.unlink(tempOutput).catch(() => { });
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Convert audio to OGG Opus voice note format.
114
+ * Mono, 16kHz, VOIP application mode — required by WA for PTT playback.
115
+ */
116
+ static async convertToVoiceNote(inputPathOrBuffer) {
117
+ const ffmpegLib = await getFfmpeg();
118
+ const tempInput = MediaManager.getTempFile('in');
119
+ const tempOutput = MediaManager.getTempFile('ogg');
120
+ try {
121
+ if (Buffer.isBuffer(inputPathOrBuffer)) {
122
+ await fs.promises.writeFile(tempInput, inputPathOrBuffer);
123
+ }
124
+ else {
125
+ await fs.promises.copyFile(inputPathOrBuffer, tempInput);
126
+ }
127
+ await new Promise((resolve, reject) => {
128
+ ffmpegLib(tempInput)
129
+ .inputOptions(['-y'])
130
+ .outputOptions([
131
+ '-c:a', 'libopus',
132
+ '-ac', '1', // mono channel (required by WA)
133
+ '-ar', '16000', // 16kHz sample rate
134
+ '-application', 'voip',
135
+ '-b:a', '32k',
136
+ '-compression_level', '10',
137
+ '-vbr', 'on'
138
+ ])
139
+ .format('ogg')
140
+ .output(tempOutput)
141
+ .on('end', () => resolve())
142
+ .on('error', (err) => reject(err))
143
+ .run();
144
+ });
145
+ return await fs.promises.readFile(tempOutput);
146
+ }
147
+ finally {
148
+ await fs.promises.unlink(tempInput).catch(() => { });
149
+ await fs.promises.unlink(tempOutput).catch(() => { });
150
+ }
151
+ }
152
+ }
@@ -0,0 +1,34 @@
1
+ // Vanz@Port (from @queenanya/baileys Framework, originally Baileys PR #2710
2
+ // by LuferOS) --- per-JID session CRUD backed by SQLiteStore. Unchanged logic
3
+ // from upstream; only the SQLiteStore instance it wraps is now created via
4
+ // an async factory (see Store/SQLiteStore.js).
5
+ export class SessionManager {
6
+ constructor(store) {
7
+ this.store = store;
8
+ }
9
+
10
+ key(jid) {
11
+ return `session_${jid}`;
12
+ }
13
+
14
+ get(jid) {
15
+ return this.store.get(this.key(jid));
16
+ }
17
+
18
+ set(jid, data) {
19
+ this.store.set(this.key(jid), data);
20
+ }
21
+
22
+ update(jid, updater) {
23
+ const prev = this.get(jid);
24
+ this.set(jid, updater(prev));
25
+ }
26
+
27
+ delete(jid) {
28
+ this.store.del(this.key(jid));
29
+ }
30
+
31
+ has(jid) {
32
+ return this.get(jid) !== undefined;
33
+ }
34
+ }
@@ -0,0 +1,120 @@
1
+ import { Boom } from '@hapi/boom';
2
+ import { jidNormalizedUser } from '../WABinary/index.js';
3
+
4
+ // Vanz@Port (from @queenanya/baileys Framework, originally Baileys PR #2710
5
+ // by LuferOS) --- group activity tracking: message counts, sticker counts,
6
+ // leaderboards, ghost (inactive member) detection.
7
+ //
8
+ // Kept from upstream's P0-P3 pass:
9
+ // - all participant JIDs normalized via jidNormalizedUser() before storing/
10
+ // querying, so PN/LID/device (:0, :42) variants resolve to the same row
11
+ // - getTopUsers/getTopStickers guard limit to a positive integer
12
+ // - getGhosts throws Boom(503) instead of a bare Error when the socket
13
+ // isn't connected, so callers can branch on statusCode
14
+ //
15
+ // Vanz@Fix vs upstream: same issue as SQLiteStore — `better-sqlite3` was a
16
+ // hard top-level import. Reused the lazy loadBetterSqlite3() pattern and
17
+ // moved construction behind an async `StatsManager.create()` factory.
18
+ async function loadBetterSqlite3() {
19
+ try {
20
+ const mod = (await import('better-sqlite3'));
21
+ return mod.default ?? mod;
22
+ }
23
+ catch (err) {
24
+ const helpful = new Error('`better-sqlite3` is required for the Framework StatsManager. Install it as a peer dependency: `npm install better-sqlite3` (or `yarn add better-sqlite3`).');
25
+ helpful.cause = err;
26
+ throw helpful;
27
+ }
28
+ }
29
+
30
+ export class StatsManager {
31
+ constructor(db, groupMetaFn) {
32
+ this.db = db;
33
+ this.groupMetaFn = groupMetaFn;
34
+ this.db.exec(`
35
+ CREATE TABLE IF NOT EXISTS group_stats (
36
+ group_jid TEXT NOT NULL,
37
+ user_jid TEXT NOT NULL,
38
+ msg_count INTEGER NOT NULL DEFAULT 0,
39
+ sticker_count INTEGER NOT NULL DEFAULT 0,
40
+ last_active INTEGER NOT NULL,
41
+ PRIMARY KEY (group_jid, user_jid)
42
+ )
43
+ `);
44
+ this.insertStmt = this.db.prepare(`
45
+ INSERT INTO group_stats (group_jid, user_jid, msg_count, sticker_count, last_active)
46
+ VALUES (?, ?, ?, ?, ?)
47
+ ON CONFLICT(group_jid, user_jid) DO UPDATE SET
48
+ msg_count = msg_count + excluded.msg_count,
49
+ sticker_count = sticker_count + excluded.sticker_count,
50
+ last_active = excluded.last_active
51
+ `);
52
+ this.getStatsStmt = this.db.prepare('SELECT user_jid, msg_count, sticker_count, last_active FROM group_stats WHERE group_jid = ?');
53
+ this.getTopMsgStmt = (limit) => this.db.prepare(`SELECT user_jid AS jid, msg_count AS count FROM group_stats WHERE group_jid = ? ORDER BY msg_count DESC LIMIT ${limit}`);
54
+ this.getTopStickerStmt = (limit) => this.db.prepare(`SELECT user_jid AS jid, sticker_count AS count FROM group_stats WHERE group_jid = ? ORDER BY sticker_count DESC LIMIT ${limit}`);
55
+ }
56
+
57
+ /** Vanz@Port: replaces the old synchronous `new StatsManager(dbPath, groupMetaFn)`. */
58
+ static async create(dbPath, groupMetaFn) {
59
+ const Database = await loadBetterSqlite3();
60
+ return new StatsManager(new Database(dbPath), groupMetaFn);
61
+ }
62
+
63
+ /** Record a message observation for stats. Normalizes both JIDs before storing. */
64
+ observeMessage(groupJid, userJid, isSticker) {
65
+ const normalizedGroupJid = jidNormalizedUser(groupJid);
66
+ const normalizedUserJid = jidNormalizedUser(userJid);
67
+ const msgCount = 1;
68
+ const stickerCount = isSticker ? 1 : 0;
69
+ const now = Date.now();
70
+ this.insertStmt.run(normalizedGroupJid, normalizedUserJid, msgCount, stickerCount, now);
71
+ }
72
+
73
+ /** Top message senders for a group. */
74
+ getTopUsers(groupJid, limit = 10) {
75
+ const safeLimit = Math.max(1, Math.floor(limit));
76
+ const normalizedGroupJid = jidNormalizedUser(groupJid);
77
+ return this.getTopMsgStmt(safeLimit).all(normalizedGroupJid);
78
+ }
79
+
80
+ /** Top sticker senders for a group. */
81
+ getTopStickers(groupJid, limit = 10) {
82
+ const safeLimit = Math.max(1, Math.floor(limit));
83
+ const normalizedGroupJid = jidNormalizedUser(groupJid);
84
+ return this.getTopStickerStmt(safeLimit).all(normalizedGroupJid);
85
+ }
86
+
87
+ /** Detect inactive members ("ghosts") in a group. */
88
+ async getGhosts(groupJid, socketConnected, inactiveDays = 30) {
89
+ if (!socketConnected) {
90
+ throw new Boom('Socket not connected — cannot fetch group metadata for ghost detection', {
91
+ statusCode: 503
92
+ });
93
+ }
94
+ const normalizedGroupJid = jidNormalizedUser(groupJid);
95
+ const cutoff = Date.now() - inactiveDays * 24 * 60 * 60 * 1000;
96
+ const rows = this.getStatsStmt.all(normalizedGroupJid);
97
+ const statsMap = new Map();
98
+ for (const row of rows) {
99
+ statsMap.set(jidNormalizedUser(row.user_jid), row.last_active);
100
+ }
101
+ const groupMeta = await this.groupMetaFn(groupJid);
102
+ return groupMeta.participants
103
+ .map(p => {
104
+ const normalizedJid = jidNormalizedUser(p.id);
105
+ const lastActive = statsMap.get(normalizedJid);
106
+ if (!lastActive) {
107
+ return { jid: normalizedJid, isTotalGhost: true };
108
+ }
109
+ if (lastActive < cutoff) {
110
+ return { jid: normalizedJid, isTotalGhost: false, lastActive };
111
+ }
112
+ return null;
113
+ })
114
+ .filter((g) => g !== null);
115
+ }
116
+
117
+ close() {
118
+ this.db.close();
119
+ }
120
+ }
@@ -0,0 +1,74 @@
1
+ // Vanz@Port (from @queenanya/baileys Framework, originally Baileys PR #2710
2
+ // by LuferOS) --- generic key-value store backed by better-sqlite3. Used by
3
+ // SessionManager to persist per-JID session state to disk instead of RAM.
4
+ //
5
+ // Vanz@Fix vs upstream: `better-sqlite3` was a hard top-level `import`, which
6
+ // would crash the whole Framework import at module-load time for anyone who
7
+ // hasn't installed it (it's an optional peer dep in this fork, same as
8
+ // use-sqlite-auth-state). Switched to the lazy `loadBetterSqlite3()` loader
9
+ // already used by Utils/use-sqlite-auth-state.js, and moved construction
10
+ // behind an async `SQLiteStore.create()` factory since the loader is async.
11
+ async function loadBetterSqlite3() {
12
+ try {
13
+ const mod = (await import('better-sqlite3'));
14
+ return mod.default ?? mod;
15
+ }
16
+ catch (err) {
17
+ const helpful = new Error('`better-sqlite3` is required for the Framework SQLiteStore. Install it as a peer dependency: `npm install better-sqlite3` (or `yarn add better-sqlite3`).');
18
+ helpful.cause = err;
19
+ throw helpful;
20
+ }
21
+ }
22
+
23
+ export class SQLiteStore {
24
+ constructor(db) {
25
+ this.db = db;
26
+ this.db.exec(`
27
+ CREATE TABLE IF NOT EXISTS kv_store (
28
+ key TEXT PRIMARY KEY,
29
+ value TEXT NOT NULL
30
+ )
31
+ `);
32
+ this.getStmt = this.db.prepare('SELECT value FROM kv_store WHERE key = ?');
33
+ this.setStmt = this.db.prepare('INSERT INTO kv_store (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value');
34
+ this.delStmt = this.db.prepare('DELETE FROM kv_store WHERE key = ?');
35
+ }
36
+
37
+ /** Vanz@Port: replaces the old synchronous `new SQLiteStore(dbPath)` — await this instead. */
38
+ static async create(dbPath) {
39
+ const Database = await loadBetterSqlite3();
40
+ return new SQLiteStore(new Database(dbPath));
41
+ }
42
+
43
+ get(key) {
44
+ const row = this.getStmt.get(key);
45
+ if (!row)
46
+ return undefined;
47
+ try {
48
+ return JSON.parse(row.value);
49
+ }
50
+ catch {
51
+ // Fallback for legacy non-JSON rows (migration safety)
52
+ return row.value;
53
+ }
54
+ }
55
+
56
+ set(key, value) {
57
+ // guard undefined/null — delegate to del so callers don't need to check
58
+ if (value === undefined || value === null) {
59
+ this.del(key);
60
+ return;
61
+ }
62
+ // always JSON.stringify — raw string storage breaks round-trip for
63
+ // values that are valid JSON (numbers, booleans, JSON objects serialized as strings)
64
+ this.setStmt.run(key, JSON.stringify(value));
65
+ }
66
+
67
+ del(key) {
68
+ this.delStmt.run(key);
69
+ }
70
+
71
+ close() {
72
+ this.db.close();
73
+ }
74
+ }
@@ -0,0 +1,11 @@
1
+ // Vanz@Port --- Enterprise Bot Framework exports.
2
+ // Source: WhiskeySockets/Baileys PR #2710 (LuferOS), via @queenanya/baileys.
3
+ // Adapted for this fork: SQLiteStore/StatsManager are lazy-loaded (see
4
+ // Store/SQLiteStore.js and StatsManager.js), MediaManager spawns the system
5
+ // `ffmpeg` binary instead of bundling fluent-ffmpeg/ffmpeg-static.
6
+ export { Bot } from './Bot.js';
7
+ export { Context } from './Context.js';
8
+ export { MediaManager } from './MediaManager.js';
9
+ export { SessionManager } from './SessionManager.js';
10
+ export { StatsManager } from './StatsManager.js';
11
+ export { SQLiteStore } from './Store/SQLiteStore.js';
@@ -0,0 +1,9 @@
1
+ export class CiphertextMessage {
2
+ UNSUPPORTED_VERSION: number;
3
+ CURRENT_VERSION: number;
4
+ WHISPER_TYPE: number;
5
+ PREKEY_TYPE: number;
6
+ SENDERKEY_TYPE: number;
7
+ SENDERKEY_DISTRIBUTION_TYPE: number;
8
+ ENCRYPTED_MESSAGE_OVERHEAD: number;
9
+ }
@@ -0,0 +1,12 @@
1
+ export class CiphertextMessage {
2
+ constructor() {
3
+ this.UNSUPPORTED_VERSION = 1;
4
+ this.CURRENT_VERSION = 3;
5
+ this.WHISPER_TYPE = 2;
6
+ this.PREKEY_TYPE = 3;
7
+ this.SENDERKEY_TYPE = 4;
8
+ this.SENDERKEY_DISTRIBUTION_TYPE = 5;
9
+ this.ENCRYPTED_MESSAGE_OVERHEAD = 53;
10
+ }
11
+ }
12
+ //# sourceMappingURL=ciphertext-message.js.map
@@ -0,0 +1,7 @@
1
+ export class GroupSessionBuilder {
2
+ constructor(senderKeyStore: any);
3
+ senderKeyStore: any;
4
+ process(senderKeyName: any, senderKeyDistributionMessage: any): Promise<void>;
5
+ create(senderKeyName: any): Promise<SenderKeyDistributionMessage>;
6
+ }
7
+ import { SenderKeyDistributionMessage } from './sender-key-distribution-message.js';
@@ -0,0 +1,30 @@
1
+ import * as keyhelper from './keyhelper.js';
2
+ import { SenderKeyDistributionMessage } from './sender-key-distribution-message.js';
3
+ import { SenderKeyName } from './sender-key-name.js';
4
+ import { SenderKeyRecord } from './sender-key-record.js';
5
+ export class GroupSessionBuilder {
6
+ constructor(senderKeyStore) {
7
+ this.senderKeyStore = senderKeyStore;
8
+ }
9
+ async process(senderKeyName, senderKeyDistributionMessage) {
10
+ const senderKeyRecord = await this.senderKeyStore.loadSenderKey(senderKeyName);
11
+ senderKeyRecord.addSenderKeyState(senderKeyDistributionMessage.getId(), senderKeyDistributionMessage.getIteration(), senderKeyDistributionMessage.getChainKey(), senderKeyDistributionMessage.getSignatureKey());
12
+ await this.senderKeyStore.storeSenderKey(senderKeyName, senderKeyRecord);
13
+ }
14
+ async create(senderKeyName) {
15
+ const senderKeyRecord = await this.senderKeyStore.loadSenderKey(senderKeyName);
16
+ if (senderKeyRecord.isEmpty()) {
17
+ const keyId = keyhelper.generateSenderKeyId();
18
+ const senderKey = keyhelper.generateSenderKey();
19
+ const signingKey = keyhelper.generateSenderSigningKey();
20
+ senderKeyRecord.setSenderKeyState(keyId, 0, senderKey, signingKey);
21
+ await this.senderKeyStore.storeSenderKey(senderKeyName, senderKeyRecord);
22
+ }
23
+ const state = senderKeyRecord.getSenderKeyState();
24
+ if (!state) {
25
+ throw new Error('No session state available');
26
+ }
27
+ return new SenderKeyDistributionMessage(state.getKeyId(), state.getSenderChainKey().getIteration(), state.getSenderChainKey().getSeed(), state.getSigningKeyPublic());
28
+ }
29
+ }
30
+ //# sourceMappingURL=group-session-builder.js.map
@@ -0,0 +1,10 @@
1
+ export class GroupCipher {
2
+ constructor(senderKeyStore: any, senderKeyName: any);
3
+ senderKeyStore: any;
4
+ senderKeyName: any;
5
+ encrypt(paddedPlaintext: any): Promise<any>;
6
+ decrypt(senderKeyMessageBytes: any): Promise<any>;
7
+ getSenderKey(senderKeyState: any, iteration: any): any;
8
+ getPlainText(iv: any, key: any, ciphertext: any): Promise<any>;
9
+ getCipherText(iv: any, key: any, plaintext: any): Promise<any>;
10
+ }
@@ -0,0 +1,82 @@
1
+ import { decrypt, encrypt } from 'libsignal/src/crypto.js';
2
+ import { SenderKeyMessage } from './sender-key-message.js';
3
+ import { SenderKeyName } from './sender-key-name.js';
4
+ import { SenderKeyRecord } from './sender-key-record.js';
5
+ import { SenderKeyState } from './sender-key-state.js';
6
+ export class GroupCipher {
7
+ constructor(senderKeyStore, senderKeyName) {
8
+ this.senderKeyStore = senderKeyStore;
9
+ this.senderKeyName = senderKeyName;
10
+ }
11
+ async encrypt(paddedPlaintext) {
12
+ const record = await this.senderKeyStore.loadSenderKey(this.senderKeyName);
13
+ if (!record) {
14
+ throw new Error('No SenderKeyRecord found for encryption');
15
+ }
16
+ const senderKeyState = record.getSenderKeyState();
17
+ if (!senderKeyState) {
18
+ throw new Error('No session to encrypt message');
19
+ }
20
+ const iteration = senderKeyState.getSenderChainKey().getIteration();
21
+ const senderKey = this.getSenderKey(senderKeyState, iteration === 0 ? 0 : iteration + 1);
22
+ const ciphertext = await this.getCipherText(senderKey.getIv(), senderKey.getCipherKey(), paddedPlaintext);
23
+ const senderKeyMessage = new SenderKeyMessage(senderKeyState.getKeyId(), senderKey.getIteration(), ciphertext, senderKeyState.getSigningKeyPrivate());
24
+ await this.senderKeyStore.storeSenderKey(this.senderKeyName, record);
25
+ return senderKeyMessage.serialize();
26
+ }
27
+ async decrypt(senderKeyMessageBytes) {
28
+ const record = await this.senderKeyStore.loadSenderKey(this.senderKeyName);
29
+ if (!record) {
30
+ throw new Error('No SenderKeyRecord found for decryption');
31
+ }
32
+ const senderKeyMessage = new SenderKeyMessage(null, null, null, null, senderKeyMessageBytes);
33
+ const senderKeyState = record.getSenderKeyState(senderKeyMessage.getKeyId());
34
+ if (!senderKeyState) {
35
+ throw new Error('No session found to decrypt message');
36
+ }
37
+ senderKeyMessage.verifySignature(senderKeyState.getSigningKeyPublic());
38
+ const senderKey = this.getSenderKey(senderKeyState, senderKeyMessage.getIteration());
39
+ const plaintext = await this.getPlainText(senderKey.getIv(), senderKey.getCipherKey(), senderKeyMessage.getCipherText());
40
+ await this.senderKeyStore.storeSenderKey(this.senderKeyName, record);
41
+ return plaintext;
42
+ }
43
+ getSenderKey(senderKeyState, iteration) {
44
+ let senderChainKey = senderKeyState.getSenderChainKey();
45
+ if (senderChainKey.getIteration() > iteration) {
46
+ if (senderKeyState.hasSenderMessageKey(iteration)) {
47
+ const messageKey = senderKeyState.removeSenderMessageKey(iteration);
48
+ if (!messageKey) {
49
+ throw new Error('No sender message key found for iteration');
50
+ }
51
+ return messageKey;
52
+ }
53
+ throw new Error(`Received message with old counter: ${senderChainKey.getIteration()}, ${iteration}`);
54
+ }
55
+ if (iteration - senderChainKey.getIteration() > 2000) {
56
+ throw new Error('Over 2000 messages into the future!');
57
+ }
58
+ while (senderChainKey.getIteration() < iteration) {
59
+ senderKeyState.addSenderMessageKey(senderChainKey.getSenderMessageKey());
60
+ senderChainKey = senderChainKey.getNext();
61
+ }
62
+ senderKeyState.setSenderChainKey(senderChainKey.getNext());
63
+ return senderChainKey.getSenderMessageKey();
64
+ }
65
+ async getPlainText(iv, key, ciphertext) {
66
+ try {
67
+ return decrypt(key, ciphertext, iv);
68
+ }
69
+ catch (e) {
70
+ throw new Error('InvalidMessageException');
71
+ }
72
+ }
73
+ async getCipherText(iv, key, plaintext) {
74
+ try {
75
+ return encrypt(key, plaintext, iv);
76
+ }
77
+ catch (e) {
78
+ throw new Error('InvalidMessageException');
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=group_cipher.js.map
@@ -0,0 +1,11 @@
1
+ export { GroupSessionBuilder } from "./group-session-builder.js";
2
+ export { SenderKeyDistributionMessage } from "./sender-key-distribution-message.js";
3
+ export { SenderKeyRecord } from "./sender-key-record.js";
4
+ export { SenderKeyName } from "./sender-key-name.js";
5
+ export { GroupCipher } from "./group_cipher.js";
6
+ export { SenderKeyState } from "./sender-key-state.js";
7
+ export { SenderKeyMessage } from "./sender-key-message.js";
8
+ export { SenderMessageKey } from "./sender-message-key.js";
9
+ export { SenderChainKey } from "./sender-chain-key.js";
10
+ export { CiphertextMessage } from "./ciphertext-message.js";
11
+ export * as keyhelper from "./keyhelper.js";
@@ -0,0 +1,12 @@
1
+ export { GroupSessionBuilder } from './group-session-builder.js';
2
+ export { SenderKeyDistributionMessage } from './sender-key-distribution-message.js';
3
+ export { SenderKeyRecord } from './sender-key-record.js';
4
+ export { SenderKeyName } from './sender-key-name.js';
5
+ export { GroupCipher } from './group_cipher.js';
6
+ export { SenderKeyState } from './sender-key-state.js';
7
+ export { SenderKeyMessage } from './sender-key-message.js';
8
+ export { SenderMessageKey } from './sender-message-key.js';
9
+ export { SenderChainKey } from './sender-chain-key.js';
10
+ export { CiphertextMessage } from './ciphertext-message.js';
11
+ export * as keyhelper from './keyhelper.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,6 @@
1
+ export function generateSenderKey(): any;
2
+ export function generateSenderKeyId(): any;
3
+ export function generateSenderSigningKey(key: any): {
4
+ public: any;
5
+ private: any;
6
+ };
@@ -0,0 +1,18 @@
1
+ import * as nodeCrypto from 'crypto';
2
+ import { generateKeyPair } from 'libsignal/src/curve.js';
3
+ export function generateSenderKey() {
4
+ return nodeCrypto.randomBytes(32);
5
+ }
6
+ export function generateSenderKeyId() {
7
+ return nodeCrypto.randomInt(2147483647);
8
+ }
9
+ export function generateSenderSigningKey(key) {
10
+ if (!key) {
11
+ key = generateKeyPair();
12
+ }
13
+ return {
14
+ public: Buffer.from(key.pubKey),
15
+ private: Buffer.from(key.privKey)
16
+ };
17
+ }
18
+ //# sourceMappingURL=keyhelper.js.map
@@ -0,0 +1,13 @@
1
+ export class SenderChainKey {
2
+ constructor(iteration: any, chainKey: any);
3
+ MESSAGE_KEY_SEED: any;
4
+ CHAIN_KEY_SEED: any;
5
+ iteration: any;
6
+ chainKey: any;
7
+ getIteration(): any;
8
+ getSenderMessageKey(): SenderMessageKey;
9
+ getNext(): SenderChainKey;
10
+ getSeed(): any;
11
+ getDerivative(seed: any, key: any): any;
12
+ }
13
+ import { SenderMessageKey } from './sender-message-key.js';
@@ -0,0 +1,26 @@
1
+ import { calculateMAC } from 'libsignal/src/crypto.js';
2
+ import { SenderMessageKey } from './sender-message-key.js';
3
+ export class SenderChainKey {
4
+ constructor(iteration, chainKey) {
5
+ this.MESSAGE_KEY_SEED = Buffer.from([0x01]);
6
+ this.CHAIN_KEY_SEED = Buffer.from([0x02]);
7
+ this.iteration = iteration;
8
+ this.chainKey = Buffer.from(chainKey);
9
+ }
10
+ getIteration() {
11
+ return this.iteration;
12
+ }
13
+ getSenderMessageKey() {
14
+ return new SenderMessageKey(this.iteration, this.getDerivative(this.MESSAGE_KEY_SEED, this.chainKey));
15
+ }
16
+ getNext() {
17
+ return new SenderChainKey(this.iteration + 1, this.getDerivative(this.CHAIN_KEY_SEED, this.chainKey));
18
+ }
19
+ getSeed() {
20
+ return this.chainKey;
21
+ }
22
+ getDerivative(seed, key) {
23
+ return calculateMAC(key, seed);
24
+ }
25
+ }
26
+ //# sourceMappingURL=sender-chain-key.js.map
@@ -0,0 +1,16 @@
1
+ export class SenderKeyDistributionMessage extends CiphertextMessage {
2
+ constructor(id: any, iteration: any, chainKey: any, signatureKey: any, serialized: any);
3
+ serialized: any;
4
+ id: any;
5
+ iteration: any;
6
+ chainKey: any;
7
+ signatureKey: any;
8
+ intsToByteHighAndLow(highValue: any, lowValue: any): number;
9
+ serialize(): any;
10
+ getType(): number;
11
+ getIteration(): any;
12
+ getChainKey(): any;
13
+ getSignatureKey(): any;
14
+ getId(): any;
15
+ }
16
+ import { CiphertextMessage } from './ciphertext-message.js';