@vanzxysenpai/baileys 0.0.0-stage → 0.0.2

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 (431) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/LICENSE +25 -0
  3. package/NOTICE.md +158 -0
  4. package/README.md +5294 -2
  5. package/VanzxyBanner.js +134 -0
  6. package/WAProto/index.d.ts +13317 -0
  7. package/WAProto/index.js +147553 -0
  8. package/lib/Builders/A2UI.d.ts +131 -0
  9. package/lib/Builders/A2UI.js +343 -0
  10. package/lib/Builders/AIRich.d.ts +1021 -0
  11. package/lib/Builders/AIRich.js +2889 -0
  12. package/lib/Builders/Album.d.ts +51 -0
  13. package/lib/Builders/Album.js +99 -0
  14. package/lib/Builders/Button.d.ts +137449 -0
  15. package/lib/Builders/Button.js +1054 -0
  16. package/lib/Builders/ButtonV2.d.ts +43 -0
  17. package/lib/Builders/ButtonV2.js +175 -0
  18. package/lib/Builders/ButtonV3.d.ts +35 -0
  19. package/lib/Builders/ButtonV3.js +189 -0
  20. package/lib/Builders/Carousel.d.ts +68 -0
  21. package/lib/Builders/Carousel.js +161 -0
  22. package/lib/Builders/Event.d.ts +61 -0
  23. package/lib/Builders/Event.js +118 -0
  24. package/lib/Builders/Expiring.d.ts +17 -0
  25. package/lib/Builders/Expiring.js +27 -0
  26. package/lib/Builders/Poll.d.ts +63 -0
  27. package/lib/Builders/Poll.js +139 -0
  28. package/lib/Builders/VanzxyBaileys.d.ts +42 -0
  29. package/lib/Builders/VanzxyBaileys.js +110 -0
  30. package/lib/Builders/errors.d.ts +25 -0
  31. package/lib/Builders/errors.js +29 -0
  32. package/lib/Builders/index.d.ts +14 -0
  33. package/lib/Builders/index.js +23 -0
  34. package/lib/Builders/shared.d.ts +395 -0
  35. package/lib/Builders/shared.js +738 -0
  36. package/lib/Defaults/bot-jid.d.ts +1 -0
  37. package/lib/Defaults/bot-jid.js +1 -0
  38. package/lib/Defaults/index.d.ts +161 -0
  39. package/lib/Defaults/index.js +165 -0
  40. package/lib/Defaults/version.d.ts +1 -0
  41. package/lib/Defaults/version.js +1 -0
  42. package/lib/Framework/Bot.d.ts +865 -0
  43. package/lib/Framework/Bot.js +230 -0
  44. package/lib/Framework/Context.d.ts +17 -0
  45. package/lib/Framework/Context.js +90 -0
  46. package/lib/Framework/MediaManager.d.ts +15 -0
  47. package/lib/Framework/MediaManager.js +154 -0
  48. package/lib/Framework/SessionManager.d.ts +10 -0
  49. package/lib/Framework/SessionManager.js +34 -0
  50. package/lib/Framework/StatsManager.d.ts +20 -0
  51. package/lib/Framework/StatsManager.js +117 -0
  52. package/lib/Framework/Store/SQLiteStore.d.ts +13 -0
  53. package/lib/Framework/Store/SQLiteStore.js +68 -0
  54. package/lib/Framework/index.d.ts +6 -0
  55. package/lib/Framework/index.js +11 -0
  56. package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
  57. package/lib/Signal/Group/ciphertext-message.js +11 -0
  58. package/lib/Signal/Group/group-session-builder.d.ts +7 -0
  59. package/lib/Signal/Group/group-session-builder.js +29 -0
  60. package/lib/Signal/Group/group_cipher.d.ts +10 -0
  61. package/lib/Signal/Group/group_cipher.js +81 -0
  62. package/lib/Signal/Group/index.d.ts +11 -0
  63. package/lib/Signal/Group/index.js +11 -0
  64. package/lib/Signal/Group/keyhelper.d.ts +6 -0
  65. package/lib/Signal/Group/keyhelper.js +17 -0
  66. package/lib/Signal/Group/sender-chain-key.d.ts +13 -0
  67. package/lib/Signal/Group/sender-chain-key.js +25 -0
  68. package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -0
  69. package/lib/Signal/Group/sender-key-distribution-message.js +62 -0
  70. package/lib/Signal/Group/sender-key-message.d.ts +18 -0
  71. package/lib/Signal/Group/sender-key-message.js +65 -0
  72. package/lib/Signal/Group/sender-key-name.d.ts +11 -0
  73. package/lib/Signal/Group/sender-key-name.js +47 -0
  74. package/lib/Signal/Group/sender-key-record.d.ts +12 -0
  75. package/lib/Signal/Group/sender-key-record.js +40 -0
  76. package/lib/Signal/Group/sender-key-state.d.ts +16 -0
  77. package/lib/Signal/Group/sender-key-state.js +83 -0
  78. package/lib/Signal/Group/sender-message-key.d.ts +11 -0
  79. package/lib/Signal/Group/sender-message-key.js +25 -0
  80. package/lib/Signal/libsignal.d.ts +58 -0
  81. package/lib/Signal/libsignal.js +436 -0
  82. package/lib/Signal/lid-mapping.d.ts +20 -0
  83. package/lib/Signal/lid-mapping.js +276 -0
  84. package/lib/Socket/Client/index.d.ts +2 -0
  85. package/lib/Socket/Client/index.js +2 -0
  86. package/lib/Socket/Client/types.d.ts +5 -0
  87. package/lib/Socket/Client/types.js +10 -0
  88. package/lib/Socket/Client/websocket.d.ts +12 -0
  89. package/lib/Socket/Client/websocket.js +53 -0
  90. package/lib/Socket/business.d.ts +674 -0
  91. package/lib/Socket/business.js +379 -0
  92. package/lib/Socket/chats.d.ts +137 -0
  93. package/lib/Socket/chats.js +1299 -0
  94. package/lib/Socket/communities.d.ts +805 -0
  95. package/lib/Socket/communities.js +454 -0
  96. package/lib/Socket/dugong.d.ts +118 -0
  97. package/lib/Socket/dugong.js +810 -0
  98. package/lib/Socket/groups.d.ts +287 -0
  99. package/lib/Socket/groups.js +386 -0
  100. package/lib/Socket/index.d.ts +826 -0
  101. package/lib/Socket/index.js +35 -0
  102. package/lib/Socket/messages-recv.d.ts +613 -0
  103. package/lib/Socket/messages-recv.js +1851 -0
  104. package/lib/Socket/messages-send.d.ts +608 -0
  105. package/lib/Socket/messages-send.js +1574 -0
  106. package/lib/Socket/mex-fallback.d.ts +51 -0
  107. package/lib/Socket/mex-fallback.js +97 -0
  108. package/lib/Socket/mex.d.ts +1 -0
  109. package/lib/Socket/mex.js +41 -0
  110. package/lib/Socket/newsletter-ext.d.ts +47 -0
  111. package/lib/Socket/newsletter-ext.js +262 -0
  112. package/lib/Socket/newsletter.d.ts +285 -0
  113. package/lib/Socket/newsletter.js +223 -0
  114. package/lib/Socket/socket.d.ts +60 -0
  115. package/lib/Socket/socket.js +1001 -0
  116. package/lib/Socket/username.d.ts +842 -0
  117. package/lib/Socket/username.js +156 -0
  118. package/lib/Store/index.d.ts +3 -0
  119. package/lib/Store/index.js +3 -0
  120. package/lib/Store/make-in-memory-store.d.ts +62 -0
  121. package/lib/Store/make-in-memory-store.js +425 -0
  122. package/lib/Store/make-ordered-dictionary.d.ts +12 -0
  123. package/lib/Store/make-ordered-dictionary.js +78 -0
  124. package/lib/Store/object-repository.d.ts +10 -0
  125. package/lib/Store/object-repository.js +23 -0
  126. package/lib/Types/Auth.d.ts +1 -0
  127. package/lib/Types/Auth.js +1 -0
  128. package/lib/Types/Bussines.d.ts +1 -0
  129. package/lib/Types/Bussines.js +1 -0
  130. package/lib/Types/Call.d.ts +1 -0
  131. package/lib/Types/Call.js +1 -0
  132. package/lib/Types/Chat.d.ts +1 -0
  133. package/lib/Types/Chat.js +7 -0
  134. package/lib/Types/Contact.d.ts +1 -0
  135. package/lib/Types/Contact.js +1 -0
  136. package/lib/Types/Events.d.ts +1 -0
  137. package/lib/Types/Events.js +1 -0
  138. package/lib/Types/GroupMetadata.d.ts +1 -0
  139. package/lib/Types/GroupMetadata.js +1 -0
  140. package/lib/Types/Label.d.ts +2 -0
  141. package/lib/Types/Label.js +24 -0
  142. package/lib/Types/LabelAssociation.d.ts +2 -0
  143. package/lib/Types/LabelAssociation.js +6 -0
  144. package/lib/Types/Message.d.ts +11 -0
  145. package/lib/Types/Message.js +17 -0
  146. package/lib/Types/Mex.d.ts +2 -0
  147. package/lib/Types/Mex.js +38 -0
  148. package/lib/Types/Product.d.ts +1 -0
  149. package/lib/Types/Product.js +1 -0
  150. package/lib/Types/RichType.d.ts +2 -0
  151. package/lib/Types/RichType.js +22 -0
  152. package/lib/Types/Signal.d.ts +1 -0
  153. package/lib/Types/Signal.js +1 -0
  154. package/lib/Types/Socket.d.ts +1 -0
  155. package/lib/Types/Socket.js +1 -0
  156. package/lib/Types/State.d.ts +5 -0
  157. package/lib/Types/State.js +55 -0
  158. package/lib/Types/USync.d.ts +1 -0
  159. package/lib/Types/USync.js +1 -0
  160. package/lib/Types/index.d.ts +15 -0
  161. package/lib/Types/index.js +27 -0
  162. package/lib/Utils/PersistentStore.d.ts +83 -0
  163. package/lib/Utils/PersistentStore.js +592 -0
  164. package/lib/Utils/anchor-guard.d.ts +31 -0
  165. package/lib/Utils/anchor-guard.js +329 -0
  166. package/lib/Utils/android-stanza-id.d.ts +4 -0
  167. package/lib/Utils/android-stanza-id.js +21 -0
  168. package/lib/Utils/anti-delete.d.ts +62 -0
  169. package/lib/Utils/anti-delete.js +212 -0
  170. package/lib/Utils/auth-secure.d.ts +180 -0
  171. package/lib/Utils/auth-secure.js +791 -0
  172. package/lib/Utils/auth-utils.d.ts +59 -0
  173. package/lib/Utils/auth-utils.js +326 -0
  174. package/lib/Utils/auto-reconnect.d.ts +8 -0
  175. package/lib/Utils/auto-reconnect.js +204 -0
  176. package/lib/Utils/auto-reply.d.ts +35 -0
  177. package/lib/Utils/auto-reply.js +152 -0
  178. package/lib/Utils/bad-mac-handler.d.ts +59 -0
  179. package/lib/Utils/bad-mac-handler.js +119 -0
  180. package/lib/Utils/baileys-event-stream.d.ts +5 -0
  181. package/lib/Utils/baileys-event-stream.js +62 -0
  182. package/lib/Utils/browser-utils.d.ts +9 -0
  183. package/lib/Utils/browser-utils.js +29 -0
  184. package/lib/Utils/business.d.ts +49 -0
  185. package/lib/Utils/business.js +236 -0
  186. package/lib/Utils/button-helper-utils.d.ts +59 -0
  187. package/lib/Utils/button-helper-utils.js +266 -0
  188. package/lib/Utils/button-sender.d.ts +164 -0
  189. package/lib/Utils/button-sender.js +845 -0
  190. package/lib/Utils/chat-control.d.ts +98 -0
  191. package/lib/Utils/chat-control.js +231 -0
  192. package/lib/Utils/chat-history-helpers.d.ts +4 -0
  193. package/lib/Utils/chat-history-helpers.js +70 -0
  194. package/lib/Utils/chat-utils.d.ts +408 -0
  195. package/lib/Utils/chat-utils.js +879 -0
  196. package/lib/Utils/companion-reg-client-utils.d.ts +4 -0
  197. package/lib/Utils/companion-reg-client-utils.js +39 -0
  198. package/lib/Utils/connection-watchdog.d.ts +10 -0
  199. package/lib/Utils/connection-watchdog.js +74 -0
  200. package/lib/Utils/crypto.d.ts +41 -0
  201. package/lib/Utils/crypto.js +145 -0
  202. package/lib/Utils/decode-wa-message.d.ts +83 -0
  203. package/lib/Utils/decode-wa-message.js +315 -0
  204. package/lib/Utils/disconnect-reason.d.ts +13 -0
  205. package/lib/Utils/disconnect-reason.js +36 -0
  206. package/lib/Utils/event-buffer.d.ts +12 -0
  207. package/lib/Utils/event-buffer.js +640 -0
  208. package/lib/Utils/fetch-timeout.d.ts +4 -0
  209. package/lib/Utils/fetch-timeout.js +14 -0
  210. package/lib/Utils/ffmpeg-path.d.ts +5 -0
  211. package/lib/Utils/ffmpeg-path.js +130 -0
  212. package/lib/Utils/generics.d.ts +79 -0
  213. package/lib/Utils/generics.js +426 -0
  214. package/lib/Utils/group-metadata-cache.d.ts +3 -0
  215. package/lib/Utils/group-metadata-cache.js +25 -0
  216. package/lib/Utils/group-status-detection.d.ts +5 -0
  217. package/lib/Utils/group-status-detection.js +114 -0
  218. package/lib/Utils/history.d.ts +91 -0
  219. package/lib/Utils/history.js +144 -0
  220. package/lib/Utils/html-app.d.ts +14 -0
  221. package/lib/Utils/html-app.js +97 -0
  222. package/lib/Utils/html-multiplayer.d.ts +8 -0
  223. package/lib/Utils/html-multiplayer.js +90 -0
  224. package/lib/Utils/humanizer.d.ts +8 -0
  225. package/lib/Utils/humanizer.js +74 -0
  226. package/lib/Utils/identity-change-handler.d.ts +13 -0
  227. package/lib/Utils/identity-change-handler.js +49 -0
  228. package/lib/Utils/index.d.ts +88 -0
  229. package/lib/Utils/index.js +93 -0
  230. package/lib/Utils/jid-tools.d.ts +3 -0
  231. package/lib/Utils/jid-tools.js +78 -0
  232. package/lib/Utils/link-preview-metadata.d.ts +47 -0
  233. package/lib/Utils/link-preview-metadata.js +90 -0
  234. package/lib/Utils/link-preview.d.ts +12 -0
  235. package/lib/Utils/link-preview.js +84 -0
  236. package/lib/Utils/lock-manager.d.ts +5 -0
  237. package/lib/Utils/lock-manager.js +50 -0
  238. package/lib/Utils/logger.d.ts +2 -0
  239. package/lib/Utils/logger.js +2 -0
  240. package/lib/Utils/lt-hash.d.ts +12 -0
  241. package/lib/Utils/lt-hash.js +26 -0
  242. package/lib/Utils/make-mutex.d.ts +6 -0
  243. package/lib/Utils/make-mutex.js +32 -0
  244. package/lib/Utils/media-messages.d.ts +35 -0
  245. package/lib/Utils/media-messages.js +70 -0
  246. package/lib/Utils/media-processor.d.ts +6 -0
  247. package/lib/Utils/media-processor.js +174 -0
  248. package/lib/Utils/media-set.d.ts +6 -0
  249. package/lib/Utils/media-set.js +169 -0
  250. package/lib/Utils/message-kind.d.ts +26 -0
  251. package/lib/Utils/message-kind.js +138 -0
  252. package/lib/Utils/message-retry-manager.d.ts +79 -0
  253. package/lib/Utils/message-retry-manager.js +264 -0
  254. package/lib/Utils/message-search.d.ts +40 -0
  255. package/lib/Utils/message-search.js +181 -0
  256. package/lib/Utils/messages-media.d.ts +136 -0
  257. package/lib/Utils/messages-media.js +867 -0
  258. package/lib/Utils/messages.d.ts +66 -0
  259. package/lib/Utils/messages.js +2271 -0
  260. package/lib/Utils/meta-ai-msmsg.d.ts +3 -0
  261. package/lib/Utils/meta-ai-msmsg.js +132 -0
  262. package/lib/Utils/meta-ai.d.ts +4 -0
  263. package/lib/Utils/meta-ai.js +75 -0
  264. package/lib/Utils/migrate-auth-state.d.ts +23 -0
  265. package/lib/Utils/migrate-auth-state.js +126 -0
  266. package/lib/Utils/mini-app.d.ts +20 -0
  267. package/lib/Utils/mini-app.js +215 -0
  268. package/lib/Utils/mock-socket.d.ts +67 -0
  269. package/lib/Utils/mock-socket.js +254 -0
  270. package/lib/Utils/modern-messages.d.ts +64 -0
  271. package/lib/Utils/modern-messages.js +497 -0
  272. package/lib/Utils/native-flow.d.ts +19 -0
  273. package/lib/Utils/native-flow.js +112 -0
  274. package/lib/Utils/newsletter-status.d.ts +157 -0
  275. package/lib/Utils/newsletter-status.js +652 -0
  276. package/lib/Utils/noise-handler.d.ts +20 -0
  277. package/lib/Utils/noise-handler.js +200 -0
  278. package/lib/Utils/offline-node-processor.d.ts +9 -0
  279. package/lib/Utils/offline-node-processor.js +39 -0
  280. package/lib/Utils/pairing-utils.d.ts +5 -0
  281. package/lib/Utils/pairing-utils.js +29 -0
  282. package/lib/Utils/passkey.d.ts +4 -0
  283. package/lib/Utils/passkey.js +11 -0
  284. package/lib/Utils/past-participants.d.ts +2 -0
  285. package/lib/Utils/past-participants.js +40 -0
  286. package/lib/Utils/payment-detection.d.ts +40 -0
  287. package/lib/Utils/payment-detection.js +213 -0
  288. package/lib/Utils/payment-guard.d.ts +28 -0
  289. package/lib/Utils/payment-guard.js +143 -0
  290. package/lib/Utils/payment-messages.d.ts +42 -0
  291. package/lib/Utils/payment-messages.js +161 -0
  292. package/lib/Utils/payment-utils.d.ts +75 -0
  293. package/lib/Utils/payment-utils.js +145 -0
  294. package/lib/Utils/phone-utils.d.ts +3 -0
  295. package/lib/Utils/phone-utils.js +29 -0
  296. package/lib/Utils/pre-key-manager.d.ts +25 -0
  297. package/lib/Utils/pre-key-manager.js +105 -0
  298. package/lib/Utils/process-message.d.ts +103 -0
  299. package/lib/Utils/process-message.js +868 -0
  300. package/lib/Utils/qr-terminal.d.ts +1 -0
  301. package/lib/Utils/qr-terminal.js +16 -0
  302. package/lib/Utils/reconnect-backoff.d.ts +25 -0
  303. package/lib/Utils/reconnect-backoff.js +47 -0
  304. package/lib/Utils/reporting-utils.d.ts +12 -0
  305. package/lib/Utils/reporting-utils.js +257 -0
  306. package/lib/Utils/rich-message-utils.d.ts +54 -0
  307. package/lib/Utils/rich-message-utils.js +435 -0
  308. package/lib/Utils/rich-messages.d.ts +298 -0
  309. package/lib/Utils/rich-messages.js +1145 -0
  310. package/lib/Utils/scheduled-message.d.ts +81 -0
  311. package/lib/Utils/scheduled-message.js +101 -0
  312. package/lib/Utils/scheduling.d.ts +59 -0
  313. package/lib/Utils/scheduling.js +139 -0
  314. package/lib/Utils/signal.d.ts +82 -0
  315. package/lib/Utils/signal.js +200 -0
  316. package/lib/Utils/stanza-ack.d.ts +16 -0
  317. package/lib/Utils/stanza-ack.js +37 -0
  318. package/lib/Utils/status-stickers.d.ts +79 -0
  319. package/lib/Utils/status-stickers.js +261 -0
  320. package/lib/Utils/status.d.ts +107 -0
  321. package/lib/Utils/status.js +131 -0
  322. package/lib/Utils/sticker-pack-maker.d.ts +20 -0
  323. package/lib/Utils/sticker-pack-maker.js +112 -0
  324. package/lib/Utils/stickerpack.d.ts +18 -0
  325. package/lib/Utils/stickerpack.js +316 -0
  326. package/lib/Utils/sync-action-utils.d.ts +2 -0
  327. package/lib/Utils/sync-action-utils.js +48 -0
  328. package/lib/Utils/tag.d.ts +8 -0
  329. package/lib/Utils/tag.js +45 -0
  330. package/lib/Utils/tc-token-utils.d.ts +29 -0
  331. package/lib/Utils/tc-token-utils.js +162 -0
  332. package/lib/Utils/templates.d.ts +86 -0
  333. package/lib/Utils/templates.js +148 -0
  334. package/lib/Utils/text-format.d.ts +13 -0
  335. package/lib/Utils/text-format.js +81 -0
  336. package/lib/Utils/text-tools.d.ts +3 -0
  337. package/lib/Utils/text-tools.js +38 -0
  338. package/lib/Utils/ttl-cache.d.ts +29 -0
  339. package/lib/Utils/ttl-cache.js +123 -0
  340. package/lib/Utils/use-cache-manager-auth-state.d.ts +22 -0
  341. package/lib/Utils/use-cache-manager-auth-state.js +86 -0
  342. package/lib/Utils/use-multi-file-auth-state.d.ts +20 -0
  343. package/lib/Utils/use-multi-file-auth-state.js +201 -0
  344. package/lib/Utils/use-single-file-auth-state.d.ts +10 -0
  345. package/lib/Utils/use-single-file-auth-state.js +111 -0
  346. package/lib/Utils/use-sqlite-auth-state.d.ts +13 -0
  347. package/lib/Utils/use-sqlite-auth-state.js +171 -0
  348. package/lib/Utils/username.d.ts +22 -0
  349. package/lib/Utils/username.js +59 -0
  350. package/lib/Utils/validate-connection.d.ts +43 -0
  351. package/lib/Utils/validate-connection.js +197 -0
  352. package/lib/Utils/vcard.d.ts +40 -0
  353. package/lib/Utils/vcard.js +92 -0
  354. package/lib/Utils/voice-note.d.ts +13 -0
  355. package/lib/Utils/voice-note.js +47 -0
  356. package/lib/VoIP/audio-feeder.d.ts +15 -0
  357. package/lib/VoIP/audio-feeder.js +132 -0
  358. package/lib/VoIP/index.d.ts +22 -0
  359. package/lib/VoIP/index.js +277 -0
  360. package/lib/VoIP/relay-transport.d.ts +16 -0
  361. package/lib/VoIP/relay-transport.js +559 -0
  362. package/lib/VoIP/signaling.d.ts +16 -0
  363. package/lib/VoIP/signaling.js +624 -0
  364. package/lib/VoIP/types.d.ts +11 -0
  365. package/lib/VoIP/types.js +17 -0
  366. package/lib/VoIP/wasm-engine.d.ts +28 -0
  367. package/lib/VoIP/wasm-engine.js +1214 -0
  368. package/lib/VoIP/worker-bootstrap.d.ts +1 -0
  369. package/lib/VoIP/worker-bootstrap.js +1042 -0
  370. package/lib/WABinary/constants.d.ts +61 -0
  371. package/lib/WABinary/constants.js +1466 -0
  372. package/lib/WABinary/decode.d.ts +9 -0
  373. package/lib/WABinary/decode.js +261 -0
  374. package/lib/WABinary/encode.d.ts +2 -0
  375. package/lib/WABinary/encode.js +219 -0
  376. package/lib/WABinary/generic-utils.d.ts +45 -0
  377. package/lib/WABinary/generic-utils.js +285 -0
  378. package/lib/WABinary/index.d.ts +5 -0
  379. package/lib/WABinary/index.js +5 -0
  380. package/lib/WABinary/jid-utils.d.ts +32 -0
  381. package/lib/WABinary/jid-utils.js +102 -0
  382. package/lib/WABinary/types.d.ts +1 -0
  383. package/lib/WABinary/types.js +1 -0
  384. package/lib/WAM/BinaryInfo.d.ts +7 -0
  385. package/lib/WAM/BinaryInfo.js +9 -0
  386. package/lib/WAM/constants.d.ts +34926 -0
  387. package/lib/WAM/constants.js +22852 -0
  388. package/lib/WAM/encode.d.ts +1 -0
  389. package/lib/WAM/encode.js +149 -0
  390. package/lib/WAM/index.d.ts +3 -0
  391. package/lib/WAM/index.js +3 -0
  392. package/lib/WAUSync/Protocols/USyncBusinessProtocol.d.ts +43 -0
  393. package/lib/WAUSync/Protocols/USyncBusinessProtocol.js +32 -0
  394. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +36 -0
  395. package/lib/WAUSync/Protocols/USyncContactProtocol.js +51 -0
  396. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +29 -0
  397. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +60 -0
  398. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  399. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +26 -0
  400. package/lib/WAUSync/Protocols/USyncFeatureProtocol.d.ts +13 -0
  401. package/lib/WAUSync/Protocols/USyncFeatureProtocol.js +28 -0
  402. package/lib/WAUSync/Protocols/USyncPictureProtocol.d.ts +22 -0
  403. package/lib/WAUSync/Protocols/USyncPictureProtocol.js +28 -0
  404. package/lib/WAUSync/Protocols/USyncSidelistProtocol.d.ts +20 -0
  405. package/lib/WAUSync/Protocols/USyncSidelistProtocol.js +23 -0
  406. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  407. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +37 -0
  408. package/lib/WAUSync/Protocols/USyncTextStatusProtocol.d.ts +14 -0
  409. package/lib/WAUSync/Protocols/USyncTextStatusProtocol.js +24 -0
  410. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +9 -0
  411. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +24 -0
  412. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +38 -0
  413. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +49 -0
  414. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +14 -0
  415. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +28 -0
  416. package/lib/WAUSync/Protocols/index.d.ts +12 -0
  417. package/lib/WAUSync/Protocols/index.js +12 -0
  418. package/lib/WAUSync/USyncQuery.d.ts +25 -0
  419. package/lib/WAUSync/USyncQuery.js +140 -0
  420. package/lib/WAUSync/USyncUser.d.ts +24 -0
  421. package/lib/WAUSync/USyncUser.js +47 -0
  422. package/lib/WAUSync/index.d.ts +3 -0
  423. package/lib/WAUSync/index.js +3 -0
  424. package/lib/assets/wasm/loader.js +5 -0
  425. package/lib/assets/wasm/whatsapp.wasm +0 -0
  426. package/lib/assets/wasm/worker-modules.js +273 -0
  427. package/lib/exports-extra.d.ts +45 -0
  428. package/lib/exports-extra.js +47 -0
  429. package/lib/index.d.ts +16 -0
  430. package/lib/index.js +24 -0
  431. package/package.json +161 -4
@@ -0,0 +1,236 @@
1
+ import { Boom } from '@hapi/boom';
2
+ import { createHash } from 'crypto';
3
+ import { createWriteStream, promises as fs } from 'fs';
4
+ import { tmpdir } from 'os';
5
+ import { join } from 'path';
6
+ import { getBinaryNodeChild, getBinaryNodeChildren, getBinaryNodeChildString } from '../WABinary/index.js';
7
+ import { generateMessageIDV2 } from './generics.js';
8
+ import logger from './logger.js';
9
+ import { getStream, getUrlFromDirectPath } from './messages-media.js';
10
+ export const parseCatalogNode = (node) => {
11
+ const catalogNode = getBinaryNodeChild(node, 'product_catalog');
12
+ const products = getBinaryNodeChildren(catalogNode, 'product').map(parseProductNode);
13
+ const paging = getBinaryNodeChild(catalogNode, 'paging');
14
+ return {
15
+ products,
16
+ nextPageCursor: paging ? getBinaryNodeChildString(paging, 'after') : undefined
17
+ };
18
+ };
19
+ export const parseCollectionsNode = (node) => {
20
+ const collectionsNode = getBinaryNodeChild(node, 'collections');
21
+ const collections = getBinaryNodeChildren(collectionsNode, 'collection').map(collectionNode => {
22
+ const id = getBinaryNodeChildString(collectionNode, 'id');
23
+ const name = getBinaryNodeChildString(collectionNode, 'name');
24
+ const products = getBinaryNodeChildren(collectionNode, 'product').map(parseProductNode);
25
+ return {
26
+ id,
27
+ name,
28
+ products,
29
+ status: parseStatusInfo(collectionNode)
30
+ };
31
+ });
32
+ return {
33
+ collections
34
+ };
35
+ };
36
+ export const parseOrderDetailsNode = (node) => {
37
+ const orderNode = getBinaryNodeChild(node, 'order');
38
+ const products = getBinaryNodeChildren(orderNode, 'product').map(productNode => {
39
+ const imageNode = getBinaryNodeChild(productNode, 'image');
40
+ return {
41
+ id: getBinaryNodeChildString(productNode, 'id'),
42
+ name: getBinaryNodeChildString(productNode, 'name'),
43
+ imageUrl: getBinaryNodeChildString(imageNode, 'url'),
44
+ price: +getBinaryNodeChildString(productNode, 'price'),
45
+ currency: getBinaryNodeChildString(productNode, 'currency'),
46
+ quantity: +getBinaryNodeChildString(productNode, 'quantity')
47
+ };
48
+ });
49
+ const priceNode = getBinaryNodeChild(orderNode, 'price');
50
+ const orderDetails = {
51
+ price: {
52
+ total: +getBinaryNodeChildString(priceNode, 'total'),
53
+ currency: getBinaryNodeChildString(priceNode, 'currency')
54
+ },
55
+ products
56
+ };
57
+ return orderDetails;
58
+ };
59
+ export const toProductNode = (productId, product) => {
60
+ const attrs = {};
61
+ const content = [];
62
+ if (typeof productId !== 'undefined') {
63
+ content.push({
64
+ tag: 'id',
65
+ attrs: {},
66
+ content: Buffer.from(productId)
67
+ });
68
+ }
69
+ if (typeof product.name !== 'undefined') {
70
+ content.push({
71
+ tag: 'name',
72
+ attrs: {},
73
+ content: Buffer.from(product.name)
74
+ });
75
+ }
76
+ if (typeof product.description !== 'undefined') {
77
+ content.push({
78
+ tag: 'description',
79
+ attrs: {},
80
+ content: Buffer.from(product.description)
81
+ });
82
+ }
83
+ if (typeof product.retailerId !== 'undefined') {
84
+ content.push({
85
+ tag: 'retailer_id',
86
+ attrs: {},
87
+ content: Buffer.from(product.retailerId)
88
+ });
89
+ }
90
+ if (product.images.length) {
91
+ content.push({
92
+ tag: 'media',
93
+ attrs: {},
94
+ content: product.images.map(img => {
95
+ if (!('url' in img)) {
96
+ throw new Boom('Expected img for product to already be uploaded', { statusCode: 400 });
97
+ }
98
+ return {
99
+ tag: 'image',
100
+ attrs: {},
101
+ content: [
102
+ {
103
+ tag: 'url',
104
+ attrs: {},
105
+ content: Buffer.from(img.url.toString())
106
+ }
107
+ ]
108
+ };
109
+ })
110
+ });
111
+ }
112
+ if (typeof product.price !== 'undefined') {
113
+ content.push({
114
+ tag: 'price',
115
+ attrs: {},
116
+ content: Buffer.from(product.price.toString())
117
+ });
118
+ }
119
+ if (typeof product.currency !== 'undefined') {
120
+ content.push({
121
+ tag: 'currency',
122
+ attrs: {},
123
+ content: Buffer.from(product.currency)
124
+ });
125
+ }
126
+ if ('originCountryCode' in product) {
127
+ if (typeof product.originCountryCode === 'undefined') {
128
+ attrs['compliance_category'] = 'COUNTRY_ORIGIN_EXEMPT';
129
+ }
130
+ else {
131
+ content.push({
132
+ tag: 'compliance_info',
133
+ attrs: {},
134
+ content: [
135
+ {
136
+ tag: 'country_code_origin',
137
+ attrs: {},
138
+ content: Buffer.from(product.originCountryCode)
139
+ }
140
+ ]
141
+ });
142
+ }
143
+ }
144
+ if (typeof product.isHidden !== 'undefined') {
145
+ attrs['is_hidden'] = product.isHidden.toString();
146
+ }
147
+ const node = {
148
+ tag: 'product',
149
+ attrs,
150
+ content
151
+ };
152
+ return node;
153
+ };
154
+ export const parseProductNode = (productNode) => {
155
+ const isHidden = productNode.attrs.is_hidden === 'true';
156
+ const id = getBinaryNodeChildString(productNode, 'id');
157
+ const mediaNode = getBinaryNodeChild(productNode, 'media');
158
+ const statusInfoNode = getBinaryNodeChild(productNode, 'status_info');
159
+ const product = {
160
+ id,
161
+ imageUrls: parseImageUrls(mediaNode),
162
+ reviewStatus: {
163
+ whatsapp: getBinaryNodeChildString(statusInfoNode, 'status')
164
+ },
165
+ availability: 'in stock',
166
+ name: getBinaryNodeChildString(productNode, 'name'),
167
+ retailerId: getBinaryNodeChildString(productNode, 'retailer_id'),
168
+ url: getBinaryNodeChildString(productNode, 'url'),
169
+ description: getBinaryNodeChildString(productNode, 'description'),
170
+ price: +getBinaryNodeChildString(productNode, 'price'),
171
+ currency: getBinaryNodeChildString(productNode, 'currency'),
172
+ isHidden
173
+ };
174
+ return product;
175
+ };
176
+ /**
177
+ * Uploads images not already uploaded to WA's servers
178
+ */
179
+ export async function uploadingNecessaryImagesOfProduct(product, waUploadToServer, timeoutMs = 30000) {
180
+ product = {
181
+ ...product,
182
+ images: product.images
183
+ ? await uploadingNecessaryImages(product.images, waUploadToServer, timeoutMs)
184
+ : product.images
185
+ };
186
+ return product;
187
+ }
188
+ /**
189
+ * Uploads images not already uploaded to WA's servers
190
+ */
191
+ export const uploadingNecessaryImages = async (images, waUploadToServer, timeoutMs = 30000) => {
192
+ const results = await Promise.all(images.map(async (img) => {
193
+ if ('url' in img) {
194
+ const url = img.url.toString();
195
+ if (url.includes('.whatsapp.net')) {
196
+ return { url };
197
+ }
198
+ }
199
+ const { stream } = await getStream(img);
200
+ const hasher = createHash('sha256');
201
+ const filePath = join(tmpdir(), 'img' + generateMessageIDV2());
202
+ const encFileWriteStream = createWriteStream(filePath);
203
+ const writeStreamError = new Promise((_, reject) => encFileWriteStream.on('error', reject));
204
+ for await (const block of stream) {
205
+ hasher.update(block);
206
+ encFileWriteStream.write(block);
207
+ }
208
+ await Promise.race([
209
+ new Promise((resolve) => encFileWriteStream.end(resolve)),
210
+ writeStreamError
211
+ ]);
212
+ const sha = hasher.digest('base64');
213
+ const { directPath } = await waUploadToServer(filePath, {
214
+ mediaType: 'product-catalog-image',
215
+ fileEncSha256B64: sha,
216
+ timeoutMs
217
+ });
218
+ await fs.unlink(filePath).catch(err => logger.warn({ err, filePath }, 'error deleting temp file'));
219
+ return { url: getUrlFromDirectPath(directPath) };
220
+ }));
221
+ return results;
222
+ };
223
+ const parseImageUrls = (mediaNode) => {
224
+ const imgNode = getBinaryNodeChild(mediaNode, 'image');
225
+ return {
226
+ requested: getBinaryNodeChildString(imgNode, 'request_image_url'),
227
+ original: getBinaryNodeChildString(imgNode, 'original_image_url')
228
+ };
229
+ };
230
+ const parseStatusInfo = (mediaNode) => {
231
+ const node = getBinaryNodeChild(mediaNode, 'status_info');
232
+ return {
233
+ status: getBinaryNodeChildString(node, 'status'),
234
+ canAppeal: getBinaryNodeChildString(node, 'can_appeal') === 'true'
235
+ };
236
+ };
@@ -0,0 +1,59 @@
1
+ /** @param {import('../../WAProto/index.js').proto.IMessage} message */
2
+ export function getMediaType(message: import("../../WAProto/index.js").proto.IMessage): "" | "image" | "video" | "audio" | "document" | "url" | "product" | "gif" | "ptt" | "vcard" | "contact_array" | "livelocation" | "sticker" | "list" | "list_response" | "buttons_response" | "order" | "native_flow_response";
3
+ /** @param {import('../../WAProto/index.js').proto.IMessage} message */
4
+ export function getMessageType(message: import("../../WAProto/index.js").proto.IMessage): "text" | "media" | "reaction" | "poll" | "event";
5
+ /** @param {import('../../WAProto/index.js').proto.IMessage} message */
6
+ export function getButtonType(message: import("../../WAProto/index.js").proto.IMessage): "list" | "buttons" | "native_flow";
7
+ /**
8
+ * Derive the binary node(s) that must accompany a button/interactive/list
9
+ * message so it renders correctly across WA Messenger + WA Business,
10
+ * Android + iOS.
11
+ * @param {import('../../WAProto/index.js').proto.IMessage} message
12
+ * @returns {import('../WABinary/index.js').BinaryNode}
13
+ */
14
+ export function getButtonArgs(message: import("../../WAProto/index.js").proto.IMessage): any;
15
+ export function buildMentionContextInfo(message: any): {
16
+ contextInfo: {
17
+ nonJidMentions: number;
18
+ mentionedJid?: undefined;
19
+ };
20
+ } | {
21
+ contextInfo: {
22
+ mentionedJid: any;
23
+ nonJidMentions?: undefined;
24
+ };
25
+ } | {
26
+ contextInfo: {
27
+ nonJidMentions?: undefined;
28
+ mentionedJid?: undefined;
29
+ };
30
+ };
31
+ export function extractFromButtonsMessage(msg: any): {
32
+ imageMessage: any;
33
+ videoMessage?: undefined;
34
+ documentMessage?: undefined;
35
+ } | {
36
+ videoMessage: any;
37
+ imageMessage?: undefined;
38
+ documentMessage?: undefined;
39
+ } | {
40
+ documentMessage: any;
41
+ imageMessage?: undefined;
42
+ videoMessage?: undefined;
43
+ };
44
+ export function normalizeMediaInput(media: any): any;
45
+ export function patchMessageForMdIfRequired(message: any): any;
46
+ export function prepareAlbumMessageContent(jid: string, albums: Array<object>, options: {
47
+ userJid: string;
48
+ suki: {
49
+ relayMessage: Function;
50
+ waUploadToServer: Function;
51
+ };
52
+ }): Promise<Array<object>>;
53
+ export function makeMessageExtrasAddon(ctx: {
54
+ query: Function;
55
+ newsletterWMexQuery?: Function;
56
+ }): {
57
+ profilePictureUrl: (jid: any) => Promise<any>;
58
+ getEphemeralGroup: (jid: any) => Promise<number | string>;
59
+ };
@@ -0,0 +1,266 @@
1
+ // Evernight AI — lib/Utils/button-helper-utils.js / Creator : Vanzxy🍃
2
+ // Ported from @queenanya/baileys (Bail-master fork) src/addons/message-utils.ts
3
+ // Original credit inside that file: "Ported from @ryuu-reinzz/button-helper v2.2.5"
4
+ // Converted TS -> JS ESM to match @vanzxysenpai/baileys compiled-lib conventions.
5
+
6
+ import { randomBytes } from 'crypto';
7
+ import { generateWAMessage, generateWAMessageFromContent, normalizeMessageContent } from './messages.js';
8
+ import { getUrlFromDirectPath } from './messages-media.js';
9
+ import { getBinaryNodeChild, getBizBinaryNode, isJidGroup, isJidNewsletter, jidNormalizedUser, S_WHATSAPP_NET } from '../WABinary/index.js';
10
+ import { QueryIds, XWAPaths } from '../Types/Mex.js';
11
+
12
+ // ─────────────────────────────────────────────────────────────────────────────
13
+ // SECTION 1 — Message Type Detection
14
+ // ─────────────────────────────────────────────────────────────────────────────
15
+
16
+ /** @param {import('../../WAProto/index.js').proto.IMessage} message */
17
+ export function getMediaType(message) {
18
+ if (message.imageMessage) return 'image';
19
+ if (message.videoMessage) return message.videoMessage.gifPlayback ? 'gif' : 'video';
20
+ if (message.audioMessage) return message.audioMessage.ptt ? 'ptt' : 'audio';
21
+ if (message.contactMessage) return 'vcard';
22
+ if (message.documentMessage) return 'document';
23
+ if (message.contactsArrayMessage) return 'contact_array';
24
+ if (message.liveLocationMessage) return 'livelocation';
25
+ if (message.stickerMessage) return 'sticker';
26
+ if (message.listMessage) return 'list';
27
+ if (message.listResponseMessage) return 'list_response';
28
+ if (message.buttonsResponseMessage) return 'buttons_response';
29
+ if (message.orderMessage) return 'order';
30
+ if (message.productMessage) return 'product';
31
+ if (message.interactiveResponseMessage) return 'native_flow_response';
32
+ if (message.groupInviteMessage) return 'url';
33
+ return '';
34
+ }
35
+
36
+ /** @param {import('../../WAProto/index.js').proto.IMessage} message */
37
+ export function getMessageType(message) {
38
+ const normalizedMessage = normalizeMessageContent(message);
39
+ if (!normalizedMessage) return 'text';
40
+ if (normalizedMessage.reactionMessage || normalizedMessage.encReactionMessage) return 'reaction';
41
+ if (
42
+ normalizedMessage.pollCreationMessage ||
43
+ normalizedMessage.pollCreationMessageV2 ||
44
+ normalizedMessage.pollCreationMessageV3 ||
45
+ normalizedMessage.pollUpdateMessage
46
+ )
47
+ return 'poll';
48
+ if (normalizedMessage.eventMessage) return 'event';
49
+ if (getMediaType(normalizedMessage) !== '') return 'media';
50
+ return 'text';
51
+ }
52
+
53
+ // ─────────────────────────────────────────────────────────────────────────────
54
+ // SECTION 2 — Button / Biz Node Helpers
55
+ // ─────────────────────────────────────────────────────────────────────────────
56
+
57
+ /** @param {import('../../WAProto/index.js').proto.IMessage} message */
58
+ export function getButtonType(message) {
59
+ const inner = message.viewOnceMessageV2Extension?.message || message;
60
+ if (inner.listMessage) return 'list';
61
+ if (inner.buttonsMessage) return 'buttons';
62
+ if (inner.interactiveMessage?.nativeFlowMessage) return 'native_flow';
63
+ if (inner.interactiveMessage?.carouselMessage) return 'native_flow';
64
+ if (message.viewOnceMessage?.message?.interactiveMessage?.carouselMessage) return 'native_flow';
65
+ if (message.viewOnceMessageV2?.message?.interactiveMessage?.carouselMessage) return 'native_flow';
66
+ if (message.viewOnceMessage?.message?.interactiveMessage?.nativeFlowMessage) return 'native_flow';
67
+ if (message.viewOnceMessageV2?.message?.interactiveMessage?.nativeFlowMessage) return 'native_flow';
68
+ if (message.viewOnceMessageV2Extension?.message?.interactiveMessage?.nativeFlowMessage) return 'native_flow';
69
+ if (message.viewOnceMessageV2Extension?.message?.interactiveMessage?.carouselMessage) return 'native_flow';
70
+ return undefined;
71
+ }
72
+
73
+ /**
74
+ * Derive the binary node(s) that must accompany a button/interactive/list
75
+ * message so it renders correctly across WA Messenger + WA Business,
76
+ * Android + iOS.
77
+ * @param {import('../../WAProto/index.js').proto.IMessage} message
78
+ * @returns {import('../WABinary/index.js').BinaryNode}
79
+ */
80
+ export function getButtonArgs(message) {
81
+ const inner = message.viewOnceMessageV2Extension?.message || message;
82
+ const interactiveMessage =
83
+ inner.interactiveMessage ||
84
+ message.viewOnceMessage?.message?.interactiveMessage ||
85
+ message.viewOnceMessageV2?.message?.interactiveMessage;
86
+ const buttonsMessage = inner.buttonsMessage;
87
+ const templateMessage = inner.templateMessage;
88
+ const listMessage = inner.listMessage;
89
+
90
+ if (interactiveMessage || buttonsMessage || templateMessage || listMessage) {
91
+ return getBizBinaryNode({ interactiveMessage, buttonsMessage, templateMessage, listMessage });
92
+ }
93
+
94
+ return { tag: 'biz', attrs: {} };
95
+ }
96
+
97
+ // ─────────────────────────────────────────────────────────────────────────────
98
+ // SECTION 3 — WS Extras (mentions, media, MD patch, album, socket extras)
99
+ // ─────────────────────────────────────────────────────────────────────────────
100
+
101
+ /** Build contextInfo for @mention or @all. */
102
+ export const buildMentionContextInfo = (message) => {
103
+ if (message.mentionAll) return { contextInfo: { nonJidMentions: 1 } };
104
+ if (message.mentions?.length) return { contextInfo: { mentionedJid: message.mentions } };
105
+ return { contextInfo: {} };
106
+ };
107
+
108
+ /** Extract embedded media from buttons/interactive message (top-level or header-nested). */
109
+ export const extractFromButtonsMessage = (msg) => {
110
+ const header = typeof msg.header === 'object' && msg.header !== null;
111
+ if (header ? msg.header?.imageMessage : msg.imageMessage)
112
+ return { imageMessage: header ? msg.header.imageMessage : msg.imageMessage };
113
+ if (header ? msg.header?.videoMessage : msg.videoMessage)
114
+ return { videoMessage: header ? msg.header.videoMessage : msg.videoMessage };
115
+ if (header ? msg.header?.documentMessage : msg.documentMessage)
116
+ return { documentMessage: header ? msg.header.documentMessage : msg.documentMessage };
117
+ return null;
118
+ };
119
+
120
+ /** Normalise media input: string → { url }, Buffer → as-is, others → as-is. */
121
+ export const normalizeMediaInput = (media) => {
122
+ if (!media) return media;
123
+ if (Buffer.isBuffer(media)) return media;
124
+ if (typeof media === 'string') return { url: media };
125
+ return media;
126
+ };
127
+
128
+ /** Wrap buttons/template/list/interactive in viewOnceMessageV2Extension for MD clients. */
129
+ export const patchMessageForMdIfRequired = (message) => {
130
+ if (
131
+ message?.buttonsMessage ||
132
+ message?.templateMessage ||
133
+ message?.listMessage ||
134
+ message?.interactiveMessage?.nativeFlowMessage
135
+ ) {
136
+ return {
137
+ viewOnceMessageV2Extension: {
138
+ message: {
139
+ messageContextInfo: { deviceListMetadataVersion: 2, deviceListMetadata: {} },
140
+ ...message
141
+ }
142
+ }
143
+ };
144
+ }
145
+
146
+ return message;
147
+ };
148
+
149
+ /**
150
+ * Build and relay an album (multi-image/video) message.
151
+ * @deprecated (v2.1.4) Legacy helper: it relays only the parent album message and returns the child messages
152
+ * WITHOUT sending them, despite the summary above. Use `sock.sendAlbumMessage()` or the `Album` builder instead.
153
+ * @param {string} jid
154
+ * @param {Array<object>} albums
155
+ * @param {{ userJid: string, suki: { relayMessage: Function, waUploadToServer: Function } }} options
156
+ * @returns {Promise<Array<object>>} Array of individual media WAMessage objects
157
+ * @example
158
+ * const items = await prepareAlbumMessageContent(jid, [
159
+ * { image: { url: 'https://...' }, caption: 'Photo 1' },
160
+ * { video: { url: 'https://...' }, caption: 'Video 1' }
161
+ * ], { userJid: sock.user.id, suki: sock })
162
+ */
163
+ export const prepareAlbumMessageContent = async (jid, albums, options) => {
164
+ const messages = [];
165
+
166
+ const albumMsg = generateWAMessageFromContent(
167
+ jid,
168
+ {
169
+ albumMessage: {
170
+ expectedImageCount: albums.filter((item) => 'image' in item).length,
171
+ expectedVideoCount: albums.filter((item) => 'video' in item).length
172
+ }
173
+ },
174
+ { userJid: options.userJid }
175
+ );
176
+
177
+ await options.suki.relayMessage(jid, albumMsg.message, { messageId: albumMsg.key.id });
178
+
179
+ for (const media of albums) {
180
+ let mediaMsg;
181
+ const uploadFn = async (encFilePath, opts) => {
182
+ const res = await options.suki.waUploadToServer(encFilePath, {
183
+ ...opts,
184
+ newsletter: isJidNewsletter(jid)
185
+ });
186
+ return {
187
+ mediaUrl: res.url ?? '',
188
+ directPath: res.directPath ?? '',
189
+ handle: res.handle,
190
+ mediaKey: res.mediaKey,
191
+ fileEncSha256: res.fileEncSha256,
192
+ fileSha256: res.fileSha256,
193
+ fileLength: res.fileLength
194
+ };
195
+ };
196
+
197
+ const sharedOpts = { userJid: options.userJid, upload: uploadFn };
198
+
199
+ if ('image' in media && media.image) mediaMsg = await generateWAMessage(jid, media, sharedOpts);
200
+ else if ('video' in media && media.video) mediaMsg = await generateWAMessage(jid, media, sharedOpts);
201
+
202
+ if (mediaMsg) {
203
+ mediaMsg.message.messageContextInfo = {
204
+ messageSecret: randomBytes(32),
205
+ messageAssociation: { associationType: 1, parentMessageKey: albumMsg.key }
206
+ };
207
+ messages.push(mediaMsg);
208
+ }
209
+ }
210
+
211
+ return messages;
212
+ };
213
+
214
+ /**
215
+ * Addon factory for socket-level message extras (profilePictureUrl, getEphemeralGroup).
216
+ * @param {{ query: Function, newsletterWMexQuery?: Function }} ctx
217
+ */
218
+ export const makeMessageExtrasAddon = (ctx) => {
219
+ const { query, newsletterWMexQuery } = ctx;
220
+
221
+ /**
222
+ * Fetch profile picture URL for any JID, including newsletters.
223
+ * @example
224
+ * const url = await sock.profilePictureUrl('1234567890@s.whatsapp.net')
225
+ */
226
+ const profilePictureUrl = async (jid) => {
227
+ if (isJidNewsletter(jid) && newsletterWMexQuery) {
228
+ const node = await newsletterWMexQuery(undefined, QueryIds.METADATA, {
229
+ input: { key: jid, type: 'JID', view_role: 'GUEST' },
230
+ fetch_viewer_metadata: true,
231
+ fetch_full_image: true,
232
+ fetch_creation_time: true
233
+ });
234
+ const resultStr = getBinaryNodeChild(node, 'result')?.content?.toString();
235
+ if (!resultStr) return null;
236
+
237
+ const metadata = JSON.parse(resultStr).data[XWAPaths.xwa2_newsletter_metadata];
238
+ return getUrlFromDirectPath(metadata?.thread_metadata?.picture?.direct_path || '');
239
+ }
240
+
241
+ const result = await query({
242
+ tag: 'iq',
243
+ attrs: { target: jidNormalizedUser(jid), to: S_WHATSAPP_NET, type: 'get', xmlns: 'w:profile:picture' },
244
+ content: [{ tag: 'picture', attrs: { type: 'image', query: 'url' }, content: undefined }]
245
+ });
246
+ return getBinaryNodeChild(result, 'picture')?.attrs?.url || null;
247
+ };
248
+
249
+ /**
250
+ * Query the ephemeral (disappearing messages) timer for a group.
251
+ * @returns {Promise<number|string>} timer in seconds, or 0 if not set
252
+ * @example
253
+ * const timer = await sock.getEphemeralGroup('120363xxx@g.us')
254
+ */
255
+ const getEphemeralGroup = async (jid) => {
256
+ if (!isJidGroup(jid)) throw new TypeError('Jid should originate from a group!');
257
+ const result = await query({
258
+ tag: 'iq',
259
+ attrs: { id: `ephemeral-${Date.now()}`, to: jid, type: 'get', xmlns: 'w:g2' },
260
+ content: [{ tag: 'query', attrs: { request: 'interactive' }, content: undefined }]
261
+ });
262
+ return getBinaryNodeChild(getBinaryNodeChild(result, 'group'), 'ephemeral')?.attrs?.expiration || 0;
263
+ };
264
+
265
+ return { profilePictureUrl, getEphemeralGroup };
266
+ };