@fer2809fl/baileys 1.4.9 → 7.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 (481) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +556 -523
  3. package/WAProto/GenerateStatics.sh +3 -4
  4. package/WAProto/WAProto.proto +1215 -511
  5. package/WAProto/fix-imports.js +85 -0
  6. package/WAProto/index.d.ts +4347 -45387
  7. package/WAProto/index.js +65475 -137445
  8. package/engine-requirements.js +10 -0
  9. package/lib/Defaults/index.d.ts +34 -18
  10. package/lib/Defaults/index.d.ts.map +1 -0
  11. package/lib/Defaults/index.js +95 -67
  12. package/lib/Defaults/index.js.map +1 -0
  13. package/lib/Signal/Group/ciphertext-message.d.ts +1 -0
  14. package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
  15. package/lib/Signal/Group/ciphertext-message.js +2 -5
  16. package/lib/Signal/Group/ciphertext-message.js.map +1 -0
  17. package/lib/Signal/Group/group-session-builder.d.ts +4 -3
  18. package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
  19. package/lib/Signal/Group/group-session-builder.js +7 -41
  20. package/lib/Signal/Group/group-session-builder.js.map +1 -0
  21. package/lib/Signal/Group/group_cipher.d.ts +4 -4
  22. package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
  23. package/lib/Signal/Group/group_cipher.js +37 -60
  24. package/lib/Signal/Group/group_cipher.js.map +1 -0
  25. package/lib/Signal/Group/index.d.ts +12 -11
  26. package/lib/Signal/Group/index.d.ts.map +1 -0
  27. package/lib/Signal/Group/index.js +12 -57
  28. package/lib/Signal/Group/index.js.map +1 -0
  29. package/lib/Signal/Group/keyhelper.d.ts +2 -1
  30. package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
  31. package/lib/Signal/Group/keyhelper.js +7 -44
  32. package/lib/Signal/Group/keyhelper.js.map +1 -0
  33. package/lib/Signal/Group/sender-chain-key.d.ts +3 -2
  34. package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
  35. package/lib/Signal/Group/sender-chain-key.js +7 -15
  36. package/lib/Signal/Group/sender-chain-key.js.map +1 -0
  37. package/lib/Signal/Group/sender-key-distribution-message.d.ts +2 -1
  38. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
  39. package/lib/Signal/Group/sender-key-distribution-message.js +8 -11
  40. package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
  41. package/lib/Signal/Group/sender-key-message.d.ts +2 -1
  42. package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
  43. package/lib/Signal/Group/sender-key-message.js +9 -12
  44. package/lib/Signal/Group/sender-key-message.js.map +1 -0
  45. package/lib/Signal/Group/sender-key-name.d.ts +1 -0
  46. package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
  47. package/lib/Signal/Group/sender-key-name.js +2 -5
  48. package/lib/Signal/Group/sender-key-name.js.map +1 -0
  49. package/lib/Signal/Group/sender-key-record.d.ts +3 -2
  50. package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
  51. package/lib/Signal/Group/sender-key-record.js +12 -37
  52. package/lib/Signal/Group/sender-key-record.js.map +1 -0
  53. package/lib/Signal/Group/sender-key-state.d.ts +7 -6
  54. package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
  55. package/lib/Signal/Group/sender-key-state.js +27 -42
  56. package/lib/Signal/Group/sender-key-state.js.map +1 -0
  57. package/lib/Signal/Group/sender-message-key.d.ts +1 -0
  58. package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
  59. package/lib/Signal/Group/sender-message-key.js +4 -7
  60. package/lib/Signal/Group/sender-message-key.js.map +1 -0
  61. package/lib/Signal/libsignal.d.ts +5 -3
  62. package/lib/Signal/libsignal.d.ts.map +1 -0
  63. package/lib/Signal/libsignal.js +347 -90
  64. package/lib/Signal/libsignal.js.map +1 -0
  65. package/lib/Signal/lid-mapping.d.ts +23 -0
  66. package/lib/Signal/lid-mapping.d.ts.map +1 -0
  67. package/lib/Signal/lid-mapping.js +277 -0
  68. package/lib/Signal/lid-mapping.js.map +1 -0
  69. package/lib/Socket/Client/index.d.ts +3 -2
  70. package/lib/Socket/Client/index.d.ts.map +1 -0
  71. package/lib/Socket/Client/index.js +3 -18
  72. package/lib/Socket/Client/index.js.map +1 -0
  73. package/lib/Socket/Client/types.d.ts +4 -4
  74. package/lib/Socket/Client/types.d.ts.map +1 -0
  75. package/lib/Socket/Client/types.js +4 -6
  76. package/lib/Socket/Client/types.js.map +1 -0
  77. package/lib/Socket/Client/websocket.d.ts +3 -3
  78. package/lib/Socket/Client/websocket.d.ts.map +1 -0
  79. package/lib/Socket/Client/websocket.js +21 -78
  80. package/lib/Socket/Client/websocket.js.map +1 -0
  81. package/lib/Socket/business.d.ts +205 -93
  82. package/lib/Socket/business.d.ts.map +1 -0
  83. package/lib/Socket/business.js +162 -43
  84. package/lib/Socket/business.js.map +1 -0
  85. package/lib/Socket/chats.d.ts +77 -28
  86. package/lib/Socket/chats.d.ts.map +1 -0
  87. package/lib/Socket/chats.js +639 -248
  88. package/lib/Socket/chats.js.map +1 -0
  89. package/lib/Socket/communities.d.ts +340 -0
  90. package/lib/Socket/communities.d.ts.map +1 -0
  91. package/lib/Socket/communities.js +434 -0
  92. package/lib/Socket/communities.js.map +1 -0
  93. package/lib/Socket/groups.d.ts +93 -46
  94. package/lib/Socket/groups.d.ts.map +1 -0
  95. package/lib/Socket/groups.js +260 -102
  96. package/lib/Socket/groups.js.map +1 -0
  97. package/lib/Socket/index.d.ts +253 -98
  98. package/lib/Socket/index.d.ts.map +1 -0
  99. package/lib/Socket/index.js +11 -9
  100. package/lib/Socket/index.js.map +1 -0
  101. package/lib/Socket/messages-recv.d.ts +192 -83
  102. package/lib/Socket/messages-recv.d.ts.map +1 -0
  103. package/lib/Socket/messages-recv.js +1314 -559
  104. package/lib/Socket/messages-recv.js.map +1 -0
  105. package/lib/Socket/messages-send.d.ts +190 -75
  106. package/lib/Socket/messages-send.d.ts.map +1 -0
  107. package/lib/Socket/messages-send.js +937 -581
  108. package/lib/Socket/messages-send.js.map +1 -0
  109. package/lib/Socket/mex.d.ts +4 -0
  110. package/lib/Socket/mex.d.ts.map +1 -0
  111. package/lib/Socket/mex.js +62 -0
  112. package/lib/Socket/mex.js.map +1 -0
  113. package/lib/Socket/newsletter.d.ts +129 -73
  114. package/lib/Socket/newsletter.d.ts.map +1 -0
  115. package/lib/Socket/newsletter.js +373 -222
  116. package/lib/Socket/newsletter.js.map +1 -0
  117. package/lib/Socket/smgss.d.ts +119 -0
  118. package/lib/Socket/smgss.d.ts.map +1 -0
  119. package/lib/Socket/smgss.js +453 -0
  120. package/lib/Socket/smgss.js.map +1 -0
  121. package/lib/Socket/socket.d.ts +59 -270
  122. package/lib/Socket/socket.d.ts.map +1 -0
  123. package/lib/Socket/socket.js +738 -326
  124. package/lib/Socket/socket.js.map +1 -0
  125. package/lib/Store/index.d.ts +4 -2
  126. package/lib/Store/index.d.ts.map +1 -0
  127. package/lib/Store/index.js +4 -8
  128. package/lib/Store/index.js.map +1 -0
  129. package/lib/Store/make-in-memory-store.d.ts +74 -60
  130. package/lib/Store/make-in-memory-store.d.ts.map +1 -0
  131. package/lib/Store/make-in-memory-store.js +130 -119
  132. package/lib/Store/make-in-memory-store.js.map +1 -0
  133. package/lib/Store/make-ordered-dictionary.d.ts +4 -3
  134. package/lib/Store/make-ordered-dictionary.d.ts.map +1 -0
  135. package/lib/Store/make-ordered-dictionary.js +5 -6
  136. package/lib/Store/make-ordered-dictionary.js.map +1 -0
  137. package/lib/Store/object-repository.d.ts +6 -3
  138. package/lib/Store/object-repository.d.ts.map +1 -0
  139. package/lib/Store/object-repository.js +2 -5
  140. package/lib/Store/object-repository.js.map +1 -0
  141. package/lib/Types/Auth.d.ts +19 -5
  142. package/lib/Types/Auth.d.ts.map +1 -0
  143. package/lib/Types/Auth.js +2 -2
  144. package/lib/Types/Auth.js.map +1 -0
  145. package/lib/Types/Bussines.d.ts +25 -0
  146. package/lib/Types/Bussines.d.ts.map +1 -0
  147. package/lib/Types/Bussines.js +2 -0
  148. package/lib/Types/Bussines.js.map +1 -0
  149. package/lib/Types/Call.d.ts +3 -1
  150. package/lib/Types/Call.d.ts.map +1 -0
  151. package/lib/Types/Call.js +2 -2
  152. package/lib/Types/Call.js.map +1 -0
  153. package/lib/Types/Chat.d.ts +24 -9
  154. package/lib/Types/Chat.d.ts.map +1 -0
  155. package/lib/Types/Chat.js +8 -4
  156. package/lib/Types/Chat.js.map +1 -0
  157. package/lib/Types/Contact.d.ts +7 -4
  158. package/lib/Types/Contact.d.ts.map +1 -0
  159. package/lib/Types/Contact.js +2 -2
  160. package/lib/Types/Contact.js.map +1 -0
  161. package/lib/Types/Events.d.ts +90 -33
  162. package/lib/Types/Events.d.ts.map +1 -0
  163. package/lib/Types/Events.js +2 -2
  164. package/lib/Types/Events.js.map +1 -0
  165. package/lib/Types/GroupMetadata.d.ts +16 -9
  166. package/lib/Types/GroupMetadata.d.ts.map +1 -0
  167. package/lib/Types/GroupMetadata.js +2 -2
  168. package/lib/Types/GroupMetadata.js.map +1 -0
  169. package/lib/Types/Label.d.ts +12 -0
  170. package/lib/Types/Label.d.ts.map +1 -0
  171. package/lib/Types/Label.js +3 -5
  172. package/lib/Types/Label.js.map +1 -0
  173. package/lib/Types/LabelAssociation.d.ts +1 -0
  174. package/lib/Types/LabelAssociation.d.ts.map +1 -0
  175. package/lib/Types/LabelAssociation.js +3 -5
  176. package/lib/Types/LabelAssociation.js.map +1 -0
  177. package/lib/Types/Message.d.ts +176 -148
  178. package/lib/Types/Message.d.ts.map +1 -0
  179. package/lib/Types/Message.js +15 -7
  180. package/lib/Types/Message.js.map +1 -0
  181. package/lib/Types/Mex.d.ts +154 -0
  182. package/lib/Types/Mex.d.ts.map +1 -0
  183. package/lib/Types/Mex.js +39 -0
  184. package/lib/Types/Mex.js.map +1 -0
  185. package/lib/Types/Product.d.ts +2 -1
  186. package/lib/Types/Product.d.ts.map +1 -0
  187. package/lib/Types/Product.js +2 -2
  188. package/lib/Types/Product.js.map +1 -0
  189. package/lib/Types/Signal.d.ts +32 -2
  190. package/lib/Types/Signal.d.ts.map +1 -0
  191. package/lib/Types/Signal.js +2 -2
  192. package/lib/Types/Signal.js.map +1 -0
  193. package/lib/Types/Socket.d.ts +46 -20
  194. package/lib/Types/Socket.d.ts.map +1 -0
  195. package/lib/Types/Socket.js +3 -2
  196. package/lib/Types/Socket.js.map +1 -0
  197. package/lib/Types/State.d.ts +79 -2
  198. package/lib/Types/State.d.ts.map +1 -0
  199. package/lib/Types/State.js +56 -2
  200. package/lib/Types/State.js.map +1 -0
  201. package/lib/Types/USync.d.ts +3 -2
  202. package/lib/Types/USync.d.ts.map +1 -0
  203. package/lib/Types/USync.js +2 -2
  204. package/lib/Types/USync.js.map +1 -0
  205. package/lib/Types/index.d.ts +16 -14
  206. package/lib/Types/index.d.ts.map +1 -0
  207. package/lib/Types/index.js +15 -31
  208. package/lib/Types/index.js.map +1 -0
  209. package/lib/Utils/auth-utils.d.ts +10 -4
  210. package/lib/Utils/auth-utils.d.ts.map +1 -0
  211. package/lib/Utils/auth-utils.js +242 -151
  212. package/lib/Utils/auth-utils.js.map +1 -0
  213. package/lib/Utils/browser-utils.d.ts +4 -0
  214. package/lib/Utils/browser-utils.d.ts.map +1 -0
  215. package/lib/Utils/browser-utils.js +29 -0
  216. package/lib/Utils/browser-utils.js.map +1 -0
  217. package/lib/Utils/business.d.ts +3 -2
  218. package/lib/Utils/business.d.ts.map +1 -0
  219. package/lib/Utils/business.js +66 -69
  220. package/lib/Utils/business.js.map +1 -0
  221. package/lib/Utils/button-handler.d.ts +28 -0
  222. package/lib/Utils/button-handler.d.ts.map +1 -0
  223. package/lib/Utils/button-handler.js +79 -90
  224. package/lib/Utils/button-handler.js.map +1 -0
  225. package/lib/Utils/chat-utils.d.ts +42 -12
  226. package/lib/Utils/chat-utils.d.ts.map +1 -0
  227. package/lib/Utils/chat-utils.js +380 -238
  228. package/lib/Utils/chat-utils.js.map +1 -0
  229. package/lib/Utils/companion-reg-client-utils.d.ts +17 -0
  230. package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -0
  231. package/lib/Utils/companion-reg-client-utils.js +35 -0
  232. package/lib/Utils/companion-reg-client-utils.js.map +1 -0
  233. package/lib/Utils/crypto.d.ts +11 -14
  234. package/lib/Utils/crypto.d.ts.map +1 -0
  235. package/lib/Utils/crypto.js +41 -116
  236. package/lib/Utils/crypto.js.map +1 -0
  237. package/lib/Utils/decode-wa-message.d.ts +36 -5
  238. package/lib/Utils/decode-wa-message.d.ts.map +1 -0
  239. package/lib/Utils/decode-wa-message.js +173 -63
  240. package/lib/Utils/decode-wa-message.js.map +1 -0
  241. package/lib/Utils/event-buffer.d.ts +8 -7
  242. package/lib/Utils/event-buffer.d.ts.map +1 -0
  243. package/lib/Utils/event-buffer.js +174 -70
  244. package/lib/Utils/event-buffer.js.map +1 -0
  245. package/lib/Utils/generics.d.ts +20 -17
  246. package/lib/Utils/generics.d.ts.map +1 -0
  247. package/lib/Utils/generics.js +159 -207
  248. package/lib/Utils/generics.js.map +1 -0
  249. package/lib/Utils/history.d.ts +16 -11
  250. package/lib/Utils/history.d.ts.map +1 -0
  251. package/lib/Utils/history.js +93 -53
  252. package/lib/Utils/history.js.map +1 -0
  253. package/lib/Utils/identity-change-handler.d.ts +44 -0
  254. package/lib/Utils/identity-change-handler.d.ts.map +1 -0
  255. package/lib/Utils/identity-change-handler.js +50 -0
  256. package/lib/Utils/identity-change-handler.js.map +1 -0
  257. package/lib/Utils/index.d.ts +30 -18
  258. package/lib/Utils/index.d.ts.map +1 -0
  259. package/lib/Utils/index.js +30 -34
  260. package/lib/Utils/index.js.map +1 -0
  261. package/lib/Utils/interactive.d.ts +60 -0
  262. package/lib/Utils/interactive.d.ts.map +1 -0
  263. package/lib/Utils/interactive.js +87 -117
  264. package/lib/Utils/interactive.js.map +1 -0
  265. package/lib/Utils/link-preview.d.ts +4 -4
  266. package/lib/Utils/link-preview.d.ts.map +1 -0
  267. package/lib/Utils/link-preview.js +17 -58
  268. package/lib/Utils/link-preview.js.map +1 -0
  269. package/lib/Utils/logger.d.ts +8 -6
  270. package/lib/Utils/logger.d.ts.map +1 -0
  271. package/lib/Utils/logger.js +3 -10
  272. package/lib/Utils/logger.js.map +1 -0
  273. package/lib/Utils/lt-hash.d.ts +8 -12
  274. package/lib/Utils/lt-hash.d.ts.map +1 -0
  275. package/lib/Utils/lt-hash.js +3 -46
  276. package/lib/Utils/lt-hash.js.map +1 -0
  277. package/lib/Utils/make-mutex.d.ts +2 -0
  278. package/lib/Utils/make-mutex.d.ts.map +1 -0
  279. package/lib/Utils/make-mutex.js +24 -34
  280. package/lib/Utils/make-mutex.js.map +1 -0
  281. package/lib/Utils/message-composer.d.ts +93 -0
  282. package/lib/Utils/message-composer.d.ts.map +1 -0
  283. package/lib/Utils/message-composer.js +311 -0
  284. package/lib/Utils/message-composer.js.map +1 -0
  285. package/lib/Utils/message-retry-manager.d.ts +115 -0
  286. package/lib/Utils/message-retry-manager.d.ts.map +1 -0
  287. package/lib/Utils/message-retry-manager.js +265 -0
  288. package/lib/Utils/message-retry-manager.js.map +1 -0
  289. package/lib/Utils/messages-media.d.ts +82 -40
  290. package/lib/Utils/messages-media.d.ts.map +1 -0
  291. package/lib/Utils/messages-media.js +674 -677
  292. package/lib/Utils/messages-media.js.map +1 -0
  293. package/lib/Utils/messages-newsletter.d.ts +74 -0
  294. package/lib/Utils/messages-newsletter.d.ts.map +1 -0
  295. package/lib/Utils/messages-newsletter.js +128 -0
  296. package/lib/Utils/messages-newsletter.js.map +1 -0
  297. package/lib/Utils/messages.d.ts +38 -14
  298. package/lib/Utils/messages.d.ts.map +1 -0
  299. package/lib/Utils/messages.js +835 -602
  300. package/lib/Utils/messages.js.map +1 -0
  301. package/lib/Utils/noise-handler.d.ts +9 -8
  302. package/lib/Utils/noise-handler.d.ts.map +1 -0
  303. package/lib/Utils/noise-handler.js +149 -98
  304. package/lib/Utils/noise-handler.js.map +1 -0
  305. package/lib/Utils/offline-node-processor.d.ts +17 -0
  306. package/lib/Utils/offline-node-processor.d.ts.map +1 -0
  307. package/lib/Utils/offline-node-processor.js +40 -0
  308. package/lib/Utils/offline-node-processor.js.map +1 -0
  309. package/lib/Utils/pre-key-manager.d.ts +28 -0
  310. package/lib/Utils/pre-key-manager.d.ts.map +1 -0
  311. package/lib/Utils/pre-key-manager.js +106 -0
  312. package/lib/Utils/pre-key-manager.js.map +1 -0
  313. package/lib/Utils/process-message.d.ts +30 -12
  314. package/lib/Utils/process-message.d.ts.map +1 -0
  315. package/lib/Utils/process-message.js +438 -230
  316. package/lib/Utils/process-message.js.map +1 -0
  317. package/lib/Utils/reporting-utils.d.ts +11 -0
  318. package/lib/Utils/reporting-utils.d.ts.map +1 -0
  319. package/lib/Utils/reporting-utils.js +258 -0
  320. package/lib/Utils/reporting-utils.js.map +1 -0
  321. package/lib/Utils/shortcake-crypto.d.ts +36 -0
  322. package/lib/Utils/shortcake-crypto.d.ts.map +1 -0
  323. package/lib/Utils/shortcake-crypto.js +71 -0
  324. package/lib/Utils/shortcake-crypto.js.map +1 -0
  325. package/lib/Utils/shortcake.d.ts +36 -0
  326. package/lib/Utils/shortcake.d.ts.map +1 -0
  327. package/lib/Utils/shortcake.js +162 -0
  328. package/lib/Utils/shortcake.js.map +1 -0
  329. package/lib/Utils/signal.d.ts +20 -6
  330. package/lib/Utils/signal.d.ts.map +1 -0
  331. package/lib/Utils/signal.js +112 -64
  332. package/lib/Utils/signal.js.map +1 -0
  333. package/lib/Utils/stanza-ack.d.ts +11 -0
  334. package/lib/Utils/stanza-ack.d.ts.map +1 -0
  335. package/lib/Utils/stanza-ack.js +38 -0
  336. package/lib/Utils/stanza-ack.js.map +1 -0
  337. package/lib/Utils/sync-action-utils.d.ts +19 -0
  338. package/lib/Utils/sync-action-utils.d.ts.map +1 -0
  339. package/lib/Utils/sync-action-utils.js +49 -0
  340. package/lib/Utils/sync-action-utils.js.map +1 -0
  341. package/lib/Utils/tc-token-utils.d.ts +37 -0
  342. package/lib/Utils/tc-token-utils.d.ts.map +1 -0
  343. package/lib/Utils/tc-token-utils.js +164 -0
  344. package/lib/Utils/tc-token-utils.js.map +1 -0
  345. package/lib/Utils/use-multi-file-auth-state.d.ts +2 -1
  346. package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
  347. package/lib/Utils/use-multi-file-auth-state.js +40 -64
  348. package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
  349. package/lib/Utils/use-single-file-auth-state.d.ts +6 -0
  350. package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -0
  351. package/lib/Utils/use-single-file-auth-state.js +111 -0
  352. package/lib/Utils/use-single-file-auth-state.js.map +1 -0
  353. package/lib/Utils/use-sqlite-auth-state.d.ts +14 -0
  354. package/lib/Utils/use-sqlite-auth-state.d.ts.map +1 -0
  355. package/lib/Utils/use-sqlite-auth-state.js +107 -0
  356. package/lib/Utils/use-sqlite-auth-state.js.map +1 -0
  357. package/lib/Utils/validate-connection.d.ts +5 -3
  358. package/lib/Utils/validate-connection.d.ts.map +1 -0
  359. package/lib/Utils/validate-connection.js +82 -101
  360. package/lib/Utils/validate-connection.js.map +1 -0
  361. package/lib/WABinary/constants.d.ts +1 -0
  362. package/lib/WABinary/constants.d.ts.map +1 -0
  363. package/lib/WABinary/constants.js +10 -12
  364. package/lib/WABinary/constants.js.map +1 -0
  365. package/lib/WABinary/decode.d.ts +2 -1
  366. package/lib/WABinary/decode.d.ts.map +1 -0
  367. package/lib/WABinary/decode.js +49 -52
  368. package/lib/WABinary/decode.js.map +1 -0
  369. package/lib/WABinary/encode.d.ts +2 -1
  370. package/lib/WABinary/encode.d.ts.map +1 -0
  371. package/lib/WABinary/encode.js +19 -49
  372. package/lib/WABinary/encode.js.map +1 -0
  373. package/lib/WABinary/generic-utils.d.ts +5 -4
  374. package/lib/WABinary/generic-utils.d.ts.map +1 -0
  375. package/lib/WABinary/generic-utils.js +46 -43
  376. package/lib/WABinary/generic-utils.js.map +1 -0
  377. package/lib/WABinary/index.d.ts +6 -5
  378. package/lib/WABinary/index.d.ts.map +1 -0
  379. package/lib/WABinary/index.js +6 -21
  380. package/lib/WABinary/index.js.map +1 -0
  381. package/lib/WABinary/jid-utils.d.ts +32 -10
  382. package/lib/WABinary/jid-utils.d.ts.map +1 -0
  383. package/lib/WABinary/jid-utils.js +103 -59
  384. package/lib/WABinary/jid-utils.js.map +1 -0
  385. package/lib/WABinary/types.d.ts +2 -1
  386. package/lib/WABinary/types.d.ts.map +1 -0
  387. package/lib/WABinary/types.js +2 -2
  388. package/lib/WABinary/types.js.map +1 -0
  389. package/lib/WAM/BinaryInfo.d.ts +2 -1
  390. package/lib/WAM/BinaryInfo.d.ts.map +1 -0
  391. package/lib/WAM/BinaryInfo.js +2 -5
  392. package/lib/WAM/BinaryInfo.js.map +1 -0
  393. package/lib/WAM/constants.d.ts +5 -3
  394. package/lib/WAM/constants.d.ts.map +1 -0
  395. package/lib/WAM/constants.js +19071 -11568
  396. package/lib/WAM/constants.js.map +1 -0
  397. package/lib/WAM/encode.d.ts +2 -1
  398. package/lib/WAM/encode.d.ts.map +1 -0
  399. package/lib/WAM/encode.js +17 -22
  400. package/lib/WAM/encode.js.map +1 -0
  401. package/lib/WAM/index.d.ts +4 -3
  402. package/lib/WAM/index.d.ts.map +1 -0
  403. package/lib/WAM/index.js +4 -19
  404. package/lib/WAM/index.js.map +1 -0
  405. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +4 -3
  406. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
  407. package/lib/WAUSync/Protocols/USyncContactProtocol.js +33 -13
  408. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
  409. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +3 -2
  410. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
  411. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +11 -14
  412. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
  413. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +3 -2
  414. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
  415. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +8 -11
  416. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
  417. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +3 -2
  418. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
  419. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +9 -13
  420. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
  421. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
  422. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -0
  423. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
  424. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +1 -0
  425. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +4 -3
  426. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
  427. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +20 -22
  428. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
  429. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +5 -3
  430. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
  431. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +13 -8
  432. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
  433. package/lib/WAUSync/Protocols/index.d.ts +6 -4
  434. package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
  435. package/lib/WAUSync/Protocols/index.js +6 -20
  436. package/lib/WAUSync/Protocols/index.js.map +1 -0
  437. package/lib/WAUSync/USyncQuery.d.ts +6 -4
  438. package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
  439. package/lib/WAUSync/USyncQuery.js +44 -35
  440. package/lib/WAUSync/USyncQuery.js.map +1 -0
  441. package/lib/WAUSync/USyncUser.d.ts +10 -5
  442. package/lib/WAUSync/USyncUser.d.ts.map +1 -0
  443. package/lib/WAUSync/USyncUser.js +10 -5
  444. package/lib/WAUSync/USyncUser.js.map +1 -0
  445. package/lib/WAUSync/index.d.ts +4 -3
  446. package/lib/WAUSync/index.d.ts.map +1 -0
  447. package/lib/WAUSync/index.js +4 -19
  448. package/lib/WAUSync/index.js.map +1 -0
  449. package/lib/index.d.ts +12 -15
  450. package/lib/index.d.ts.map +1 -0
  451. package/lib/index.js +15 -48
  452. package/lib/index.js.map +1 -0
  453. package/package.json +44 -64
  454. package/WAProto/index.ts.ts +0 -53473
  455. package/WAProto/n +0 -1
  456. package/lib/Baileys.jpeg +0 -0
  457. package/lib/Defaults/baileys-version.json +0 -3
  458. package/lib/Defaults/n +0 -1
  459. package/lib/Signal/Group/queue-job.d.ts +0 -1
  460. package/lib/Signal/Group/queue-job.js +0 -57
  461. package/lib/Signal/n +0 -1
  462. package/lib/Socket/Client/n +0 -1
  463. package/lib/Socket/n +0 -1
  464. package/lib/Socket/setup.js +0 -480
  465. package/lib/Socket/setup.ts +0 -622
  466. package/lib/Socket/usync.d.ts +0 -36
  467. package/lib/Socket/usync.js +0 -70
  468. package/lib/Store/n +0 -1
  469. package/lib/Types/Newsletter.d.ts +0 -79
  470. package/lib/Types/Newsletter.js +0 -18
  471. package/lib/Types/n +0 -1
  472. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  473. package/lib/Utils/baileys-event-stream.js +0 -63
  474. package/lib/Utils/error-handler.js +0 -37
  475. package/lib/Utils/n +0 -1
  476. package/lib/WABinary/jid-utils.js.bak +0 -83
  477. package/lib/WABinary/n +0 -1
  478. package/lib/WAM/n +0 -1
  479. package/lib/WAUSync/Protocols/n +0 -1
  480. package/lib/WAUSync/n +0 -1
  481. package/lib/n +0 -1
@@ -1,58 +1,51 @@
1
- /* modified by alip*/
2
- "use strict";
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.assertMediaContent = exports.downloadMediaMessage = exports.aggregateMessageKeysNotFromMe = exports.updateMessageWithPollUpdate = exports.updateMessageWithReaction = exports.updateMessageWithReceipt = exports.getDevice = exports.extractMessageContent = exports.normalizeMessageContent = exports.getContentType = exports.generateWAMessage = exports.generateWAMessageFromContent = exports.generateWAMessageContent = exports.generateForwardMessageContent = exports.prepareDisappearingMessageSettingContent = exports.prepareWAMessageMedia = exports.generateLinkPreviewIfRequired = exports.extractUrlFromText = void 0;
8
- exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
9
- const boom_1 = require("@hapi/boom");
10
- const axios_1 = __importDefault(require("axios"));
11
- const crypto_1 = require("crypto");
12
- const fs_1 = require("fs");
13
- const WAProto_1 = require("../../WAProto");
14
- const Defaults_1 = require("../Defaults");
15
- const Types_1 = require("../Types");
16
- const WABinary_1 = require("../WABinary");
17
- const crypto_2 = require("./crypto");
18
- const generics_1 = require("./generics");
19
- const messages_media_1 = require("./messages-media");
1
+ import { Boom } from '@hapi/boom';
2
+ import { createCipheriv, createHash, createHmac, randomBytes } from 'crypto';
3
+ import { promises as fs } from 'fs';
4
+ import { tmpdir } from 'os';
5
+ import { join } from 'path';
6
+ import {} from 'stream';
7
+ import { proto } from '../../WAProto/index.js';
8
+ import { CALL_AUDIO_PREFIX, CALL_VIDEO_PREFIX, MEDIA_KEYS, URL_REGEX, WA_DEFAULT_EPHEMERAL } from '../Defaults/index.js';
9
+ import { ButtonHeaderType, ButtonType, CarouselCardType, ListType, WAMessageStatus, WAProto } from '../Types/index.js';
10
+ import { isJidGroup, isJidNewsletter, isJidStatusBroadcast, jidDecode, jidEncode, jidNormalizedUser } from '../WABinary/index.js';
11
+ import { sha256 } from './crypto.js';
12
+ import { generateMessageIDV2, getKeyAuthor, unixTimestampSeconds } from './generics.js';
13
+ import { downloadContentFromMessage, encryptedStream, generateThumbnail, getAudioDuration, getAudioWaveform, getMediaKeys, getRawMediaUploadData, getStream, toBuffer } from './messages-media.js';
14
+ import { shouldIncludeReportingToken } from './reporting-utils.js';
20
15
  const MIMETYPE_MAP = {
21
16
  image: 'image/jpeg',
22
17
  video: 'video/mp4',
23
18
  document: 'application/pdf',
24
19
  audio: 'audio/ogg; codecs=opus',
25
20
  sticker: 'image/webp',
26
- 'product-catalog-image': 'image/jpeg',
21
+ 'product-catalog-image': 'image/jpeg'
27
22
  };
28
23
  const MessageTypeProto = {
29
- 'image': Types_1.WAProto.Message.ImageMessage,
30
- 'video': Types_1.WAProto.Message.VideoMessage,
31
- 'audio': Types_1.WAProto.Message.AudioMessage,
32
- 'sticker': Types_1.WAProto.Message.StickerMessage,
33
- 'document': Types_1.WAProto.Message.DocumentMessage,
24
+ image: WAProto.Message.ImageMessage,
25
+ video: WAProto.Message.VideoMessage,
26
+ audio: WAProto.Message.AudioMessage,
27
+ sticker: WAProto.Message.StickerMessage,
28
+ document: WAProto.Message.DocumentMessage
34
29
  };
35
- const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
36
30
  /**
37
31
  * Uses a regex to test whether the string contains a URL, and returns the URL if it does.
38
32
  * @param text eg. hello https://google.com
39
33
  * @returns the URL, eg. https://google.com
40
34
  */
41
- const extractUrlFromText = (text) => { var _a; return (_a = text.match(Defaults_1.URL_REGEX)) === null || _a === void 0 ? void 0 : _a[0]; };
42
- exports.extractUrlFromText = extractUrlFromText;
43
- const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
44
- const url = (0, exports.extractUrlFromText)(text);
35
+ export const extractUrlFromText = (text) => text.match(URL_REGEX)?.[0];
36
+ export const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
37
+ const url = extractUrlFromText(text);
45
38
  if (!!getUrlInfo && url) {
46
39
  try {
47
40
  const urlInfo = await getUrlInfo(url);
48
41
  return urlInfo;
49
42
  }
50
- catch (error) { // ignore if fails
51
- logger === null || logger === void 0 ? void 0 : logger.warn({ trace: error.stack }, 'url generation failed');
43
+ catch (error) {
44
+ // ignore if fails
45
+ logger?.warn({ trace: error.stack }, 'url generation failed');
52
46
  }
53
47
  }
54
48
  };
55
- exports.generateLinkPreviewIfRequired = generateLinkPreviewIfRequired;
56
49
  const assertColor = async (color) => {
57
50
  let assertedColor;
58
51
  if (typeof color === 'number') {
@@ -67,241 +60,625 @@ const assertColor = async (color) => {
67
60
  return assertedColor;
68
61
  }
69
62
  };
70
- const prepareWAMessageMedia = async (message, options) => {
63
+ const isWebPBuffer = (buf) => buf.length >= 12 &&
64
+ buf[0] === 0x52 &&
65
+ buf[1] === 0x49 &&
66
+ buf[2] === 0x46 &&
67
+ buf[3] === 0x46 &&
68
+ buf[8] === 0x57 &&
69
+ buf[9] === 0x45 &&
70
+ buf[10] === 0x42 &&
71
+ buf[11] === 0x50;
72
+ const isAnimatedWebP = (buf) => {
73
+ if (!isWebPBuffer(buf)) {
74
+ return false;
75
+ }
76
+ let offset = 12;
77
+ while (offset < buf.length - 8) {
78
+ const fourCC = buf.toString('ascii', offset, offset + 4);
79
+ const chunkSize = buf.readUInt32LE(offset + 4);
80
+ if (fourCC === 'VP8X') {
81
+ const flagsOffset = offset + 8;
82
+ if (flagsOffset < buf.length && (buf[flagsOffset] & 0x02) !== 0) {
83
+ return true;
84
+ }
85
+ }
86
+ else if (fourCC === 'ANIM' || fourCC === 'ANMF') {
87
+ return true;
88
+ }
89
+ offset += 8 + chunkSize + (chunkSize % 2);
90
+ }
91
+ return false;
92
+ };
93
+ const encryptMediaBuffer = async (buf, mediaKey) => {
94
+ const { cipherKey, iv, macKey } = await getMediaKeys(mediaKey, 'sticker-pack');
95
+ const aes = createCipheriv('aes-256-cbc', cipherKey, iv);
96
+ const hmac = createHmac('sha256', macKey).update(iv);
97
+ const encPart1 = aes.update(buf);
98
+ const encPart2 = aes.final();
99
+ hmac.update(encPart1).update(encPart2);
100
+ const mac = hmac.digest().subarray(0, 10);
101
+ const encBody = Buffer.concat([encPart1, encPart2, mac]);
102
+ const fileEncSha256 = createHash('sha256').update(encPart1).update(encPart2).update(mac).digest();
103
+ const fileSha256 = createHash('sha256').update(buf).digest();
104
+ return { encBody, fileSha256, fileEncSha256 };
105
+ };
106
+ export const generateStickerPackMessage = async (stickerPack, options) => {
107
+ const { stickers, cover, name, publisher, packId, description } = stickerPack;
108
+ if (!stickers || stickers.length === 0) {
109
+ throw new Boom('Sticker pack must contain at least one sticker', { statusCode: 400 });
110
+ }
111
+ if (stickers.length > 120) {
112
+ throw new Boom('Sticker pack exceeds the maximum limit of 120 stickers', { statusCode: 400 });
113
+ }
114
+ const [sharpLib, jimpLib] = await Promise.all([
115
+ import('sharp').catch(() => null),
116
+ import('jimp').catch(() => null)
117
+ ]);
118
+ const stickerPackId = packId || generateMessageIDV2();
119
+ const stickerData = {};
120
+ const stickerMetadata = await Promise.all(stickers.map(async (s, i) => {
121
+ const source = s.sticker ?? s.data;
122
+ if (!source) {
123
+ throw new Boom(`Sticker at index ${i} is missing its image data`, { statusCode: 400 });
124
+ }
125
+ const { stream } = await getStream(source);
126
+ const buffer = await toBuffer(stream);
127
+ let webpBuffer;
128
+ let isAnimated = false;
129
+ if (isWebPBuffer(buffer)) {
130
+ webpBuffer = buffer;
131
+ isAnimated = isAnimatedWebP(buffer);
132
+ }
133
+ else if (sharpLib) {
134
+ webpBuffer = await sharpLib.default(buffer).webp().toBuffer();
135
+ }
136
+ else if (jimpLib) {
137
+ const Jimp = jimpLib.Jimp || jimpLib.default;
138
+ const jimpImage = await Jimp.read(buffer);
139
+ webpBuffer = await jimpImage
140
+ .resize({ w: 512, h: 512, mode: jimpLib.ResizeStrategy?.BILINEAR })
141
+ .getBuffer('image/webp');
142
+ }
143
+ else {
144
+ webpBuffer = buffer;
145
+ }
146
+ if (webpBuffer.length > 1024 * 1024) {
147
+ throw new Boom(`Sticker at index ${i} exceeds the 1MB size limit`, { statusCode: 400 });
148
+ }
149
+ const fileName = `${i + 1}.webp`;
150
+ stickerData[fileName] = [new Uint8Array(webpBuffer), { level: 0 }];
151
+ return {
152
+ fileName,
153
+ mimetype: 'image/webp',
154
+ isAnimated: s.isAnimated !== undefined ? s.isAnimated : isAnimated,
155
+ isLottie: s.isLottie || false,
156
+ emojis: s.emojis || [],
157
+ accessibilityLabel: s.accessibilityLabel || ''
158
+ };
159
+ }));
160
+ const { stream: coverStream } = await getStream(cover);
161
+ const coverBuffer = await toBuffer(coverStream);
162
+ const coverFileName = `${stickerPackId}.webp`;
163
+ stickerData[coverFileName] = [new Uint8Array(coverBuffer), { level: 0 }];
164
+ const { zipSync } = await import('fflate');
165
+ const zipBuffer = Buffer.from(zipSync(stickerData));
166
+ const mediaKey = randomBytes(32);
167
+ const zipEnc = await encryptMediaBuffer(zipBuffer, mediaKey);
168
+ const zipEncPath = join(tmpdir(), 'stickerpack_' + stickerPackId);
169
+ await fs.writeFile(zipEncPath, zipEnc.encBody);
170
+ let stickerPackUploadResult;
171
+ try {
172
+ stickerPackUploadResult = await options.upload(zipEncPath, {
173
+ fileEncSha256B64: zipEnc.fileEncSha256.toString('base64'),
174
+ mediaType: 'sticker-pack',
175
+ timeoutMs: options.mediaUploadTimeoutMs
176
+ });
177
+ }
178
+ finally {
179
+ await fs.unlink(zipEncPath).catch(() => { });
180
+ }
181
+ const thumbEnc = await encryptMediaBuffer(coverBuffer, mediaKey);
182
+ const thumbEncPath = join(tmpdir(), 'stickerthumb_' + stickerPackId);
183
+ await fs.writeFile(thumbEncPath, thumbEnc.encBody);
184
+ let thumbUploadResult;
185
+ try {
186
+ thumbUploadResult = await options.upload(thumbEncPath, {
187
+ fileEncSha256B64: thumbEnc.fileEncSha256.toString('base64'),
188
+ mediaType: 'thumbnail-sticker-pack',
189
+ timeoutMs: options.mediaUploadTimeoutMs
190
+ });
191
+ }
192
+ finally {
193
+ await fs.unlink(thumbEncPath).catch(() => { });
194
+ }
195
+ const imageDataHash = sha256(coverBuffer).toString('base64');
196
+ return {
197
+ name,
198
+ publisher,
199
+ stickerPackId,
200
+ packDescription: description,
201
+ stickerPackOrigin: proto.Message.StickerPackMessage.StickerPackOrigin.USER_CREATED,
202
+ stickerPackSize: zipBuffer.length,
203
+ stickers: stickerMetadata,
204
+ fileSha256: zipEnc.fileSha256,
205
+ fileEncSha256: zipEnc.fileEncSha256,
206
+ mediaKey,
207
+ directPath: stickerPackUploadResult.directPath,
208
+ fileLength: zipBuffer.length,
209
+ mediaKeyTimestamp: unixTimestampSeconds(),
210
+ trayIconFileName: coverFileName,
211
+ imageDataHash,
212
+ thumbnailDirectPath: thumbUploadResult.directPath,
213
+ thumbnailSha256: thumbEnc.fileSha256,
214
+ thumbnailEncSha256: thumbEnc.fileEncSha256,
215
+ thumbnailHeight: 96,
216
+ thumbnailWidth: 96
217
+ };
218
+ };
219
+ export const prepareWAMessageMedia = async (message, options) => {
71
220
  const logger = options.logger;
72
221
  let mediaType;
73
- for (const key of Defaults_1.MEDIA_KEYS) {
222
+ for (const key of MEDIA_KEYS) {
74
223
  if (key in message) {
75
224
  mediaType = key;
76
225
  }
77
226
  }
78
227
  if (!mediaType) {
79
- throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
228
+ throw new Boom('Invalid media type', { statusCode: 400 });
80
229
  }
81
230
  const uploadData = {
82
231
  ...message,
83
- ...(message.annotations ? {
84
- annotations: message.annotations
85
- } : {
86
- annotations: [
87
- {
88
- polygonVertices: [
89
- {
90
- x: 60.71664810180664,
91
- y: -36.39784622192383
92
- },
93
- {
94
- x: -16.710189819335938,
95
- y: 49.263675689697266
96
- },
97
- {
98
- x: -56.585853576660156,
99
- y: 37.85963439941406
100
- },
101
- {
102
- x: 20.840980529785156,
103
- y: -47.80188751220703
104
- }
105
- ],
106
- newsletter: {
107
- newsletterJid: "120363399175402285@newsletter",
108
- serverMessageId: 0,
109
- newsletterName: "Asta",
110
- contentType: "UPDATE",
111
- }
112
- }
113
- ]
114
- }),
115
232
  media: message[mediaType]
116
233
  };
117
234
  delete uploadData[mediaType];
118
235
  // check if cacheable + generate cache key
119
236
  const cacheableKey = typeof uploadData.media === 'object' &&
120
- ('url' in uploadData.media) &&
237
+ 'url' in uploadData.media &&
121
238
  !!uploadData.media.url &&
122
- !!options.mediaCache && (
123
- // generate the key
124
- mediaType + ':' + uploadData.media.url.toString());
239
+ !!options.mediaCache &&
240
+ mediaType + ':' + uploadData.media.url.toString();
125
241
  if (mediaType === 'document' && !uploadData.fileName) {
126
242
  uploadData.fileName = 'file';
127
243
  }
128
244
  if (!uploadData.mimetype) {
129
245
  uploadData.mimetype = MIMETYPE_MAP[mediaType];
130
246
  }
131
- // check for cache hit
132
247
  if (cacheableKey) {
133
- const mediaBuff = options.mediaCache.get(cacheableKey);
248
+ const mediaBuff = await options.mediaCache.get(cacheableKey);
134
249
  if (mediaBuff) {
135
- logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'got media cache hit');
136
- const obj = Types_1.WAProto.Message.decode(mediaBuff);
250
+ logger?.debug({ cacheableKey }, 'got media cache hit');
251
+ const obj = proto.Message.decode(mediaBuff);
137
252
  const key = `${mediaType}Message`;
138
253
  Object.assign(obj[key], { ...uploadData, media: undefined });
139
254
  return obj;
140
255
  }
141
256
  }
142
- const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
143
- const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
144
- (typeof uploadData['jpegThumbnail'] === 'undefined');
145
- const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
257
+ const isNewsletter = !!options.jid && isJidNewsletter(options.jid);
258
+ if (isNewsletter) {
259
+ logger?.info({ key: cacheableKey }, 'Preparing raw media for newsletter');
260
+ const { filePath, fileSha256, fileLength } = await getRawMediaUploadData(uploadData.media, options.mediaTypeOverride || mediaType, logger);
261
+ const fileSha256B64 = fileSha256.toString('base64');
262
+ const { mediaUrl, directPath } = await options.upload(filePath, {
263
+ fileEncSha256B64: fileSha256B64,
264
+ mediaType: mediaType,
265
+ timeoutMs: options.mediaUploadTimeoutMs
266
+ });
267
+ await fs.unlink(filePath);
268
+ const obj = WAProto.Message.fromObject({
269
+ // todo: add more support here
270
+ [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
271
+ url: mediaUrl,
272
+ directPath,
273
+ fileSha256,
274
+ fileLength,
275
+ ...uploadData,
276
+ media: undefined
277
+ })
278
+ });
279
+ if (uploadData.ptv) {
280
+ obj.ptvMessage = obj.videoMessage;
281
+ delete obj.videoMessage;
282
+ }
283
+ if (obj.stickerMessage) {
284
+ obj.stickerMessage.stickerSentTs = Date.now();
285
+ }
286
+ if (cacheableKey) {
287
+ logger?.debug({ cacheableKey }, 'set cache');
288
+ await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
289
+ }
290
+ return obj;
291
+ }
292
+ const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
293
+ const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
294
+ const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true && typeof uploadData.waveform === 'undefined';
146
295
  const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
147
296
  const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
148
-
149
- const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, opusConverted } = await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
297
+ const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await encryptedStream(uploadData.media, options.mediaTypeOverride || mediaType, {
150
298
  logger,
151
299
  saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
152
- opts: options.options,
153
- isPtt: uploadData.ptt,
154
- forceOpus: (mediaType === "audio" && uploadData.mimetype && uploadData.mimetype.includes('opus'))
300
+ opts: options.options
155
301
  });
156
-
157
- if (mediaType === 'audio' && opusConverted) {
158
- uploadData.mimetype = 'audio/ogg; codecs=opus';
159
- }
160
-
161
- const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 !== void 0 ? fileEncSha256 : fileSha256).toString('base64');
162
-
163
- const [{ mediaUrl, directPath, handle }] = await Promise.all([
302
+ const fileEncSha256B64 = fileEncSha256.toString('base64');
303
+ const [{ mediaUrl, directPath }] = await Promise.all([
164
304
  (async () => {
165
- const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
166
- logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
305
+ const result = await options.upload(encFilePath, {
306
+ fileEncSha256B64,
307
+ mediaType,
308
+ timeoutMs: options.mediaUploadTimeoutMs
309
+ });
310
+ logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
167
311
  return result;
168
312
  })(),
169
313
  (async () => {
170
314
  try {
171
315
  if (requiresThumbnailComputation) {
172
- const { thumbnail, originalImageDimensions } = await (0, messages_media_1.generateThumbnail)(bodyPath, mediaType, options);
316
+ const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options);
173
317
  uploadData.jpegThumbnail = thumbnail;
174
318
  if (!uploadData.width && originalImageDimensions) {
175
319
  uploadData.width = originalImageDimensions.width;
176
320
  uploadData.height = originalImageDimensions.height;
177
- logger === null || logger === void 0 ? void 0 : logger.debug('set dimensions');
321
+ logger?.debug('set dimensions');
178
322
  }
179
- logger === null || logger === void 0 ? void 0 : logger.debug('generated thumbnail');
323
+ logger?.debug('generated thumbnail');
180
324
  }
181
325
  if (requiresDurationComputation) {
182
- uploadData.seconds = await (0, messages_media_1.getAudioDuration)(bodyPath);
183
- logger === null || logger === void 0 ? void 0 : logger.debug('computed audio duration');
326
+ uploadData.seconds = await getAudioDuration(originalFilePath);
327
+ logger?.debug('computed audio duration');
184
328
  }
185
329
  if (requiresWaveformProcessing) {
186
- uploadData.waveform = await (0, messages_media_1.getAudioWaveform)(bodyPath, logger);
187
- logger === null || logger === void 0 ? void 0 : logger.debug('processed waveform');
330
+ uploadData.waveform = await getAudioWaveform(originalFilePath, logger);
331
+ logger?.debug('processed waveform');
188
332
  }
189
333
  if (requiresAudioBackground) {
190
334
  uploadData.backgroundArgb = await assertColor(options.backgroundColor);
191
- logger === null || logger === void 0 ? void 0 : logger.debug('computed backgroundColor audio status');
335
+ logger?.debug('computed backgroundColor audio status');
192
336
  }
193
337
  }
194
338
  catch (error) {
195
- logger === null || logger === void 0 ? void 0 : logger.warn({ trace: error.stack }, 'failed to obtain extra info');
339
+ logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
196
340
  }
197
- })(),
198
- ])
199
- .finally(async () => {
200
- if (!Buffer.isBuffer(encWriteStream)) {
201
- encWriteStream.destroy();
202
- }
203
- // remove tmp files
204
- if (didSaveToTmpPath && bodyPath) {
205
- try {
206
- await fs_1.promises.access(bodyPath);
207
- await fs_1.promises.unlink(bodyPath);
208
- logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp file');
209
- }
210
- catch (error) {
211
- logger === null || logger === void 0 ? void 0 : logger.warn('failed to remove tmp file');
341
+ })()
342
+ ]).finally(async () => {
343
+ try {
344
+ await fs.unlink(encFilePath);
345
+ if (originalFilePath) {
346
+ await fs.unlink(originalFilePath);
212
347
  }
348
+ logger?.debug('removed tmp files');
349
+ }
350
+ catch (error) {
351
+ logger?.warn('failed to remove tmp file');
213
352
  }
214
353
  });
215
- const obj = Types_1.WAProto.Message.fromObject({
354
+ const obj = WAProto.Message.fromObject({
216
355
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
217
- url: handle ? undefined : mediaUrl,
356
+ url: mediaUrl,
218
357
  directPath,
219
- mediaKey: mediaKey,
220
- fileEncSha256: fileEncSha256,
358
+ mediaKey,
359
+ fileEncSha256,
221
360
  fileSha256,
222
361
  fileLength,
223
- mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
362
+ mediaKeyTimestamp: unixTimestampSeconds(),
224
363
  ...uploadData,
225
364
  media: undefined
226
365
  })
227
366
  });
228
-
229
- // START PERBAIKAN PTV UNTUK CHANNEL
230
367
  if (uploadData.ptv) {
231
- if (options.newsletter) {
232
- // Untuk Channel (Newsletter), set flag viewOnce di videoMessage
233
- obj.videoMessage = obj.videoMessage;
234
- obj.videoMessage.viewOnce = true;
235
- } else {
236
- // Untuk chat biasa, gunakan ptvMessage
237
- obj.ptvMessage = obj.videoMessage;
238
- delete obj.videoMessage;
239
- }
368
+ obj.ptvMessage = obj.videoMessage;
369
+ delete obj.videoMessage;
240
370
  }
241
- // END PERBAIKAN PTV UNTUK CHANNEL
242
-
243
371
  if (cacheableKey) {
244
- logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'set cache');
245
- options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish());
372
+ logger?.debug({ cacheableKey }, 'set cache');
373
+ await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
246
374
  }
247
375
  return obj;
248
376
  };
249
- exports.prepareWAMessageMedia = prepareWAMessageMedia;
250
- const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
377
+ export const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
251
378
  ephemeralExpiration = ephemeralExpiration || 0;
252
379
  const content = {
253
380
  ephemeralMessage: {
254
381
  message: {
255
382
  protocolMessage: {
256
- type: Types_1.WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
383
+ type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
257
384
  ephemeralExpiration
258
385
  }
259
386
  }
260
387
  }
261
388
  };
262
- return Types_1.WAProto.Message.fromObject(content);
389
+ return WAProto.Message.fromObject(content);
263
390
  };
264
- exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
265
391
  /**
266
392
  * Generate forwarded message content like WA does
267
393
  * @param message the message to forward
268
394
  * @param options.forceForward will show the message as forwarded even if it is from you
269
395
  */
270
- const generateForwardMessageContent = (message, forceForward) => {
271
- var _a;
396
+ export const generateForwardMessageContent = (message, forceForward) => {
272
397
  let content = message.message;
273
398
  if (!content) {
274
- throw new boom_1.Boom('no content in message', { statusCode: 400 });
399
+ throw new Boom('no content in message', { statusCode: 400 });
275
400
  }
276
401
  // hacky copy
277
- content = (0, exports.normalizeMessageContent)(content);
278
- content = WAProto_1.proto.Message.decode(WAProto_1.proto.Message.encode(content).finish());
402
+ content = normalizeMessageContent(content);
403
+ content = proto.Message.decode(proto.Message.encode(content).finish());
279
404
  let key = Object.keys(content)[0];
280
- let score = ((_a = content[key].contextInfo) === null || _a === void 0 ? void 0 : _a.forwardingScore) || 0;
405
+ let score = content?.[key]?.contextInfo?.forwardingScore || 0;
281
406
  score += message.key.fromMe && !forceForward ? 0 : 1;
282
407
  if (key === 'conversation') {
283
408
  content.extendedTextMessage = { text: content[key] };
284
409
  delete content.conversation;
285
410
  key = 'extendedTextMessage';
286
411
  }
412
+ const key_ = content?.[key];
287
413
  if (score > 0) {
288
- content[key].contextInfo = { forwardingScore: score, isForwarded: true };
414
+ key_.contextInfo = { forwardingScore: score, isForwarded: true };
289
415
  }
290
416
  else {
291
- content[key].contextInfo = {};
417
+ key_.contextInfo = {};
292
418
  }
293
419
  return content;
294
420
  };
295
- exports.generateForwardMessageContent = generateForwardMessageContent;
296
- const generateWAMessageContent = async (message, options) => {
297
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
298
- var _p, _q;
421
+ const prepareNativeFlowButtons = (message) => {
422
+ const buttons = message.nativeFlow;
423
+ const correctedField = Array.isArray(buttons) ? buttons : buttons.buttons;
424
+ return {
425
+ buttons: correctedField.map((button) => {
426
+ const buttonText = button.text || button.buttonText;
427
+ const icon = button.icon?.toUpperCase();
428
+ if (button.id) {
429
+ return {
430
+ name: 'quick_reply',
431
+ buttonParamsJson: JSON.stringify({ display_text: buttonText || 'Click', id: button.id, icon })
432
+ };
433
+ }
434
+ else if (button.copy) {
435
+ return {
436
+ name: 'cta_copy',
437
+ buttonParamsJson: JSON.stringify({ display_text: buttonText || 'Copy', copy_code: button.copy, icon })
438
+ };
439
+ }
440
+ else if (button.url) {
441
+ return {
442
+ name: 'cta_url',
443
+ buttonParamsJson: JSON.stringify({
444
+ display_text: buttonText || 'Visit',
445
+ url: button.url,
446
+ merchant_url: button.url,
447
+ webview_interaction: button.useWebview,
448
+ icon
449
+ })
450
+ };
451
+ }
452
+ else if (button.call) {
453
+ return {
454
+ name: 'cta_call',
455
+ buttonParamsJson: JSON.stringify({ display_text: buttonText || 'Call', phone_number: button.call, icon })
456
+ };
457
+ }
458
+ else if (button.sections) {
459
+ return {
460
+ name: 'single_select',
461
+ buttonParamsJson: JSON.stringify({ title: buttonText || 'Select', sections: button.sections, icon })
462
+ };
463
+ }
464
+ return { name: button.name, buttonParamsJson: button.paramsJson };
465
+ })
466
+ };
467
+ };
468
+ export const hasValidInteractiveHeader = (message) => {
469
+ return !!(message.imageMessage ||
470
+ message.videoMessage ||
471
+ message.documentMessage ||
472
+ message.productMessage ||
473
+ message.locationMessage);
474
+ };
475
+ export const hasValidCarouselHeader = (message) => {
476
+ return !!(message.imageMessage || message.videoMessage || message.productMessage);
477
+ };
478
+ export const hasNonNullishProperty = (message, key) => {
479
+ return (typeof message === 'object' &&
480
+ message !== null &&
481
+ key in message &&
482
+ message[key] !== null &&
483
+ message[key] !== undefined);
484
+ };
485
+ function hasOptionalProperty(obj, key) {
486
+ return typeof obj === 'object' && obj !== null && key in obj && obj[key] !== null;
487
+ }
488
+ export const generateWAMessageContent = async (message, options) => {
489
+ var _a, _b;
299
490
  let m = {};
300
- if ('text' in message) {
491
+ if (hasNonNullishProperty(message, 'raw')) {
492
+ delete message.raw;
493
+ return message;
494
+ }
495
+ else if (hasNonNullishProperty(message, 'buttons')) {
496
+ const buttonsMessage = {
497
+ buttons: message.buttons.map((button) => {
498
+ const buttonText = button.text || button.buttonText;
499
+ if (button.nativeFlowInfo) {
500
+ return {
501
+ buttonId: button.id || button.buttonId,
502
+ buttonText: typeof buttonText === 'string' ? { displayText: buttonText } : buttonText,
503
+ nativeFlowInfo: button.nativeFlowInfo,
504
+ type: ButtonType.NATIVE_FLOW
505
+ };
506
+ }
507
+ else if (button.sections) {
508
+ return {
509
+ nativeFlowInfo: {
510
+ name: 'single_select',
511
+ paramsJson: JSON.stringify({ title: buttonText, sections: button.sections })
512
+ },
513
+ type: ButtonType.NATIVE_FLOW
514
+ };
515
+ }
516
+ else if (button.name) {
517
+ return {
518
+ nativeFlowInfo: { name: button.name, paramsJson: button.paramsJson },
519
+ type: ButtonType.NATIVE_FLOW
520
+ };
521
+ }
522
+ return {
523
+ buttonId: button.id || button.buttonId,
524
+ buttonText: typeof buttonText === 'string' ? { displayText: buttonText } : buttonText,
525
+ type: button.type || ButtonType.RESPONSE
526
+ };
527
+ })
528
+ };
529
+ if (message.text) {
530
+ buttonsMessage.contentText = message.text;
531
+ buttonsMessage.headerType = ButtonHeaderType.EMPTY;
532
+ }
533
+ else {
534
+ const media = await prepareWAMessageMedia(message, options);
535
+ if (message.caption) {
536
+ buttonsMessage.contentText = message.caption;
537
+ }
538
+ const mediaKey = Object.keys(media)[0];
539
+ if (!mediaKey) {
540
+ throw new Boom('buttons message needs either "text" or a media field (image/video/document) as header', {
541
+ statusCode: 400
542
+ });
543
+ }
544
+ const type = mediaKey.replace('Message', '').toUpperCase();
545
+ buttonsMessage.headerType = ButtonHeaderType[type];
546
+ Object.assign(buttonsMessage, media);
547
+ }
548
+ if (message.footer) {
549
+ buttonsMessage.footerText = message.footer;
550
+ }
551
+ m.buttonsMessage = buttonsMessage;
552
+ }
553
+ else if (hasNonNullishProperty(message, 'sections')) {
554
+ m.listMessage = {
555
+ sections: message.sections,
556
+ buttonText: message.buttonText,
557
+ title: message.title,
558
+ footerText: message.footer,
559
+ description: message.description,
560
+ listType: ListType.SINGLE_SELECT
561
+ };
562
+ }
563
+ else if (hasNonNullishProperty(message, 'templateButtons')) {
564
+ const hydratedTemplate = {
565
+ hydratedButtons: message.templateButtons.map((button, i) => {
566
+ const buttonText = button.text || button.buttonText;
567
+ if (button.id) {
568
+ return { index: i, quickReplyButton: { displayText: buttonText || 'Click', id: button.id } };
569
+ }
570
+ else if (button.url) {
571
+ return { index: i, urlButton: { displayText: buttonText || 'Visit', url: button.url } };
572
+ }
573
+ else if (button.call) {
574
+ return { index: i, callButton: { displayText: buttonText || 'Call', phoneNumber: button.call } };
575
+ }
576
+ button.index = button.index || i;
577
+ return button;
578
+ })
579
+ };
580
+ if (message.text) {
581
+ hydratedTemplate.hydratedContentText = message.text;
582
+ }
583
+ else {
584
+ const media = await prepareWAMessageMedia(message, options);
585
+ if (message.caption) {
586
+ hydratedTemplate.hydratedTitleText = message.title;
587
+ hydratedTemplate.hydratedContentText = message.caption;
588
+ }
589
+ Object.assign(hydratedTemplate, media);
590
+ }
591
+ if (message.footer) {
592
+ hydratedTemplate.hydratedFooterText = message.footer;
593
+ }
594
+ hydratedTemplate.templateId = message.id || `template-${Date.now()}`;
595
+ m.templateMessage = {
596
+ hydratedFourRowTemplate: hydratedTemplate,
597
+ hydratedTemplate
598
+ };
599
+ }
600
+ else if (hasNonNullishProperty(message, 'nativeFlow')) {
601
+ const interactiveMessage = {
602
+ nativeFlowMessage: prepareNativeFlowButtons(message)
603
+ };
604
+ if (message.text) {
605
+ interactiveMessage.body = { text: message.text };
606
+ }
607
+ else {
608
+ const media = await prepareWAMessageMedia(message, options);
609
+ if (message.caption) {
610
+ const isValidHeader = hasValidInteractiveHeader(media);
611
+ if (!isValidHeader) {
612
+ throw new Boom('Invalid media type for interactive message header', { statusCode: 400 });
613
+ }
614
+ interactiveMessage.header = {
615
+ title: message.title || '',
616
+ subtitle: message.subtitle || '',
617
+ hasMediaAttachment: isValidHeader
618
+ };
619
+ interactiveMessage.body = { text: message.caption };
620
+ }
621
+ Object.assign(interactiveMessage.header || (interactiveMessage.header = {}), media);
622
+ }
623
+ if (message.audioFooter) {
624
+ const { audioMessage } = await prepareWAMessageMedia({ audio: message.audioFooter }, options);
625
+ interactiveMessage.footer = { audioMessage, hasMediaAttachment: true };
626
+ }
627
+ else if (message.footer) {
628
+ interactiveMessage.footer = { text: message.footer };
629
+ }
630
+ m.interactiveMessage = interactiveMessage;
631
+ }
632
+ else if (hasNonNullishProperty(message, 'cards')) {
633
+ const interactiveMessage = {
634
+ carouselMessage: {
635
+ cards: await Promise.all(message.cards.map(async (card) => {
636
+ const carouselHeader = await prepareWAMessageMedia(card, options).catch(() => ({}));
637
+ const isValidHeader = hasValidCarouselHeader(carouselHeader);
638
+ if (!isValidHeader) {
639
+ throw new Boom('Invalid media type for carousel card', { statusCode: 400 });
640
+ }
641
+ const carouselCard = {
642
+ nativeFlowMessage: prepareNativeFlowButtons({ nativeFlow: card.nativeFlow || [] })
643
+ };
644
+ if (card.text) {
645
+ carouselCard.body = { text: card.text };
646
+ }
647
+ else if (card.caption) {
648
+ carouselCard.header = {
649
+ title: card.title || '',
650
+ subtitle: card.subtitle || '',
651
+ hasMediaAttachment: isValidHeader,
652
+ ...carouselHeader
653
+ };
654
+ carouselCard.body = { text: card.caption };
655
+ }
656
+ if (card.audioFooter) {
657
+ const { audioMessage } = await prepareWAMessageMedia({ audio: card.audioFooter }, options);
658
+ carouselCard.footer = { audioMessage, hasMediaAttachment: true };
659
+ }
660
+ else if (card.footer) {
661
+ carouselCard.footer = { text: card.footer };
662
+ }
663
+ if (card.contextInfo) {
664
+ carouselCard.contextInfo = card.contextInfo;
665
+ }
666
+ return carouselCard;
667
+ })),
668
+ carouselCardType: CarouselCardType.UNKNOWN,
669
+ messageVersion: 1
670
+ }
671
+ };
672
+ if (message.footer) {
673
+ interactiveMessage.footer = { text: message.footer };
674
+ }
675
+ m.interactiveMessage = interactiveMessage;
676
+ }
677
+ else if (hasNonNullishProperty(message, 'text')) {
301
678
  const extContent = { text: message.text };
302
679
  let urlInfo = message.linkPreview;
303
680
  if (typeof urlInfo === 'undefined') {
304
- urlInfo = await (0, exports.generateLinkPreviewIfRequired)(message.text, options.getUrlInfo, options.logger);
681
+ urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
305
682
  }
306
683
  if (urlInfo) {
307
684
  extContent.matchedText = urlInfo['matched-text'];
@@ -328,43 +705,45 @@ const generateWAMessageContent = async (message, options) => {
328
705
  }
329
706
  m.extendedTextMessage = extContent;
330
707
  }
331
- else if ('contacts' in message) {
708
+ else if (hasNonNullishProperty(message, 'contacts')) {
332
709
  const contactLen = message.contacts.contacts.length;
333
710
  if (!contactLen) {
334
- throw new boom_1.Boom('require atleast 1 contact', { statusCode: 400 });
711
+ throw new Boom('require atleast 1 contact', { statusCode: 400 });
335
712
  }
336
713
  if (contactLen === 1) {
337
- m.contactMessage = Types_1.WAProto.Message.ContactMessage.fromObject(message.contacts.contacts[0]);
714
+ m.contactMessage = WAProto.Message.ContactMessage.create(message.contacts.contacts[0]);
338
715
  }
339
716
  else {
340
- m.contactsArrayMessage = Types_1.WAProto.Message.ContactsArrayMessage.fromObject(message.contacts);
717
+ m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.create(message.contacts);
341
718
  }
342
719
  }
343
- else if ('location' in message) {
344
- m.locationMessage = Types_1.WAProto.Message.LocationMessage.fromObject(message.location);
720
+ else if (hasNonNullishProperty(message, 'location')) {
721
+ m.locationMessage = WAProto.Message.LocationMessage.create(message.location);
345
722
  }
346
- else if ('react' in message) {
723
+ else if (hasNonNullishProperty(message, 'react')) {
347
724
  if (!message.react.senderTimestampMs) {
348
725
  message.react.senderTimestampMs = Date.now();
349
726
  }
350
- m.reactionMessage = Types_1.WAProto.Message.ReactionMessage.fromObject(message.react);
727
+ m.reactionMessage = WAProto.Message.ReactionMessage.create(message.react);
351
728
  }
352
- else if ('delete' in message) {
729
+ else if (hasNonNullishProperty(message, 'delete')) {
353
730
  m.protocolMessage = {
354
731
  key: message.delete,
355
- type: Types_1.WAProto.Message.ProtocolMessage.Type.REVOKE
732
+ type: WAProto.Message.ProtocolMessage.Type.REVOKE
356
733
  };
357
734
  }
358
- else if ('forward' in message) {
359
- m = (0, exports.generateForwardMessageContent)(message.forward, message.force);
735
+ else if (hasNonNullishProperty(message, 'forward')) {
736
+ m = generateForwardMessageContent(message.forward, message.force);
360
737
  }
361
- else if ('disappearingMessagesInChat' in message) {
362
- const exp = typeof message.disappearingMessagesInChat === 'boolean' ?
363
- (message.disappearingMessagesInChat ? Defaults_1.WA_DEFAULT_EPHEMERAL : 0) :
364
- message.disappearingMessagesInChat;
365
- m = (0, exports.prepareDisappearingMessageSettingContent)(exp);
738
+ else if (hasNonNullishProperty(message, 'disappearingMessagesInChat')) {
739
+ const exp = typeof message.disappearingMessagesInChat === 'boolean'
740
+ ? message.disappearingMessagesInChat
741
+ ? WA_DEFAULT_EPHEMERAL
742
+ : 0
743
+ : message.disappearingMessagesInChat;
744
+ m = prepareDisappearingMessageSettingContent(exp);
366
745
  }
367
- else if ('groupInvite' in message) {
746
+ else if (hasNonNullishProperty(message, 'groupInvite')) {
368
747
  m.groupInviteMessage = {};
369
748
  m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
370
749
  m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
@@ -376,14 +755,15 @@ const generateWAMessageContent = async (message, options) => {
376
755
  if (options.getProfilePicUrl) {
377
756
  const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
378
757
  if (pfpUrl) {
379
- const resp = await axios_1.default.get(pfpUrl, { responseType: 'arraybuffer' });
380
- if (resp.status === 200) {
381
- m.groupInviteMessage.jpegThumbnail = resp.data;
758
+ const resp = await fetch(pfpUrl, { method: 'GET', dispatcher: options?.options?.dispatcher });
759
+ if (resp.ok) {
760
+ const buf = Buffer.from(await resp.arrayBuffer());
761
+ m.groupInviteMessage.jpegThumbnail = buf;
382
762
  }
383
763
  }
384
764
  }
385
765
  }
386
- else if ('pin' in message) {
766
+ else if (hasNonNullishProperty(message, 'pin')) {
387
767
  m.pinInChatMessage = {};
388
768
  m.messageContextInfo = {};
389
769
  m.pinInChatMessage.key = message.pin;
@@ -391,95 +771,80 @@ const generateWAMessageContent = async (message, options) => {
391
771
  m.pinInChatMessage.senderTimestampMs = Date.now();
392
772
  m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
393
773
  }
394
- else if ('keep' in message) {
395
- m.keepInChatMessage = {};
396
- m.keepInChatMessage.key = message.keep;
397
- m.keepInChatMessage.keepType = message.type;
398
- m.keepInChatMessage.timestampMs = Date.now();
399
- }
400
- else if ('call' in message) {
401
- m = {
402
- scheduledCallCreationMessage: {
403
- scheduledTimestampMs: (_a = message.call.time) !== null && _a !== void 0 ? _a : Date.now(),
404
- callType: (_b = message.call.type) !== null && _b !== void 0 ? _b : 1,
405
- title: message.call.title
406
- }
407
- };
408
- }
409
- else if ('paymentInvite' in message) {
410
- m.paymentInviteMessage = {
411
- serviceType: message.paymentInvite.type,
412
- expiryTimestamp: message.paymentInvite.expiry
413
- };
414
- }
415
- else if ('buttonReply' in message) {
774
+ else if (hasNonNullishProperty(message, 'buttonReply')) {
416
775
  switch (message.type) {
417
776
  case 'template':
418
777
  m.templateButtonReplyMessage = {
419
778
  selectedDisplayText: message.buttonReply.displayText,
420
779
  selectedId: message.buttonReply.id,
421
- selectedIndex: message.buttonReply.index,
780
+ selectedIndex: message.buttonReply.index
422
781
  };
423
782
  break;
424
783
  case 'plain':
425
784
  m.buttonsResponseMessage = {
426
785
  selectedButtonId: message.buttonReply.id,
427
786
  selectedDisplayText: message.buttonReply.displayText,
428
- type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
787
+ type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
429
788
  };
430
789
  break;
431
790
  }
432
791
  }
433
- else if ('ptv' in message && message.ptv) {
434
- const { videoMessage } = await (0, exports.prepareWAMessageMedia)({ video: message.video, ptv: true }, options); // <-- Perbaikan ptv: true
792
+ else if (hasOptionalProperty(message, 'ptv') && message.ptv) {
793
+ const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
435
794
  m.ptvMessage = videoMessage;
436
795
  }
437
- else if ('product' in message) {
438
- const { imageMessage } = await (0, exports.prepareWAMessageMedia)({ image: message.product.productImage }, options);
439
- m.productMessage = Types_1.WAProto.Message.ProductMessage.fromObject({
796
+ else if (hasNonNullishProperty(message, 'product')) {
797
+ const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
798
+ m.productMessage = WAProto.Message.ProductMessage.create({
440
799
  ...message,
441
800
  product: {
442
801
  ...message.product,
443
- productImage: imageMessage,
802
+ productImage: imageMessage
444
803
  }
445
804
  });
446
805
  }
447
- else if ('order' in message) {
448
- m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
449
- orderId: message.order.id,
450
- thumbnail: message.order.thumbnail,
451
- itemCount: message.order.itemCount,
452
- status: message.order.status,
453
- surface: message.order.surface,
454
- orderTitle: message.order.title,
455
- message: message.order.text,
456
- sellerJid: message.order.seller,
457
- token: message.order.token,
458
- totalAmount1000: message.order.amount,
459
- totalCurrencyCode: message.order.currency
460
- });
461
- }
462
- else if ('listReply' in message) {
806
+ else if (hasNonNullishProperty(message, 'listReply')) {
463
807
  m.listResponseMessage = { ...message.listReply };
464
808
  }
465
- else if ('poll' in message) {
466
- (_p = message.poll).selectableCount || (_p.selectableCount = 0);
467
- (_q = message.poll).toAnnouncementGroup || (_q.toAnnouncementGroup = false);
809
+ else if (hasNonNullishProperty(message, 'event')) {
810
+ m.eventMessage = {};
811
+ const startTime = Math.floor(message.event.startDate.getTime() / 1000);
812
+ if (message.event.call && options.getCallLink) {
813
+ const token = await options.getCallLink(message.event.call, { startTime });
814
+ m.eventMessage.joinLink = (message.event.call === 'audio' ? CALL_AUDIO_PREFIX : CALL_VIDEO_PREFIX) + token;
815
+ }
816
+ m.messageContextInfo = {
817
+ // encKey
818
+ messageSecret: message.event.messageSecret || randomBytes(32)
819
+ };
820
+ m.eventMessage.name = message.event.name;
821
+ m.eventMessage.description = message.event.description;
822
+ m.eventMessage.startTime = startTime;
823
+ m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
824
+ m.eventMessage.isCanceled = message.event.isCancelled ?? false;
825
+ m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
826
+ m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
827
+ m.eventMessage.location = message.event.location;
828
+ }
829
+ else if (hasNonNullishProperty(message, 'poll')) {
830
+ (_a = message.poll).selectableCount || (_a.selectableCount = 0);
831
+ (_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
468
832
  if (!Array.isArray(message.poll.values)) {
469
- throw new boom_1.Boom('Invalid poll values', { statusCode: 400 });
833
+ throw new Boom('Invalid poll values', { statusCode: 400 });
470
834
  }
471
- if (message.poll.selectableCount < 0
472
- || message.poll.selectableCount > message.poll.values.length) {
473
- throw new boom_1.Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, { statusCode: 400 });
835
+ if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
836
+ throw new Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
837
+ statusCode: 400
838
+ });
474
839
  }
475
840
  m.messageContextInfo = {
476
841
  // encKey
477
- messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
842
+ messageSecret: message.poll.messageSecret || randomBytes(32)
478
843
  };
479
844
  const pollCreationMessage = {
480
845
  name: message.poll.name,
481
846
  selectableOptionsCount: message.poll.selectableCount,
482
- options: message.poll.values.map(optionName => ({ optionName })),
847
+ options: message.poll.values.map(optionName => ({ optionName }))
483
848
  };
484
849
  if (message.poll.toAnnouncementGroup) {
485
850
  // poll v2 is for community announcement groups (single select and multiple)
@@ -487,7 +852,7 @@ const generateWAMessageContent = async (message, options) => {
487
852
  }
488
853
  else {
489
854
  if (message.poll.selectableCount === 1) {
490
- // poll v3 is for single select polls
855
+ //poll v3 is for single select polls
491
856
  m.pollCreationMessageV3 = pollCreationMessage;
492
857
  }
493
858
  else {
@@ -496,338 +861,198 @@ const generateWAMessageContent = async (message, options) => {
496
861
  }
497
862
  }
498
863
  }
499
- else if ('event' in message) {
500
- m.messageContextInfo = {
501
- messageSecret: message.event.messageSecret || (0, crypto_1.randomBytes)(32),
864
+ else if (hasNonNullishProperty(message, 'album')) {
865
+ m.albumMessage = {
866
+ expectedImageCount: message.album.expectedImageCount,
867
+ expectedVideoCount: message.album.expectedVideoCount
502
868
  };
503
- m.eventMessage = { ...message.event };
504
- }
505
- else if ('inviteAdmin' in message) {
506
- m.newsletterAdminInviteMessage = {};
507
- m.newsletterAdminInviteMessage.inviteExpiration = message.inviteAdmin.inviteExpiration;
508
- m.newsletterAdminInviteMessage.caption = message.inviteAdmin.text;
509
- m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
510
- m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
511
- m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
512
- }
513
- else if ('requestPayment' in message) {
514
- const sticker = ((_c = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _c === void 0 ? void 0 : _c.sticker) ?
515
- await (0, exports.prepareWAMessageMedia)({ sticker: (_d = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _d === void 0 ? void 0 : _d.sticker, ...options }, options)
516
- : null;
517
- let notes = {};
518
- if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
519
- notes = {
520
- stickerMessage: {
521
- ...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
522
- contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
523
- }
524
- };
525
- }
526
- else if (message.requestPayment.note) {
527
- notes = {
528
- extendedTextMessage: {
529
- text: message.requestPayment.note,
530
- contextInfo: (_g = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _g === void 0 ? void 0 : _g.contextInfo,
531
- }
532
- };
533
- }
534
- else {
535
- throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
536
- }
537
- m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
538
- expiryTimestamp: message.requestPayment.expiry,
539
- amount1000: message.requestPayment.amount,
540
- currencyCodeIso4217: message.requestPayment.currency,
541
- requestFrom: message.requestPayment.from,
542
- noteMessage: { ...notes },
543
- background: (_h = message.requestPayment.background) !== null && _h !== void 0 ? _h : null,
544
- });
545
869
  }
546
- else if ('sharePhoneNumber' in message) {
870
+ else if (hasNonNullishProperty(message, 'sharePhoneNumber')) {
547
871
  m.protocolMessage = {
548
- type: WAProto_1.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
872
+ type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
549
873
  };
550
874
  }
551
- else if ('requestPhoneNumber' in message) {
875
+ else if (hasNonNullishProperty(message, 'requestPhoneNumber')) {
552
876
  m.requestPhoneNumberMessage = {};
553
877
  }
554
- else if ('album' in message) {
555
- const imageMessages = message.album.filter(item => 'image' in item);
556
- const videoMessages = message.album.filter(item => 'video' in item);
557
- m.albumMessage = WAProto_1.proto.Message.AlbumMessage.fromObject({
558
- expectedImageCount: imageMessages.length,
559
- expectedVideoCount: videoMessages.length,
560
- });
878
+ else if (hasNonNullishProperty(message, 'limitSharing')) {
879
+ m.protocolMessage = {
880
+ type: proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
881
+ limitSharing: {
882
+ sharingLimited: message.limitSharing === true,
883
+ trigger: 1,
884
+ limitSharingSettingTimestamp: Date.now(),
885
+ initiatedByMe: true
886
+ }
887
+ };
888
+ }
889
+ else if (hasNonNullishProperty(message, 'stickerPack')) {
890
+ m.stickerPackMessage = await generateStickerPackMessage(message.stickerPack, options);
891
+ m.stickerPackMessage.contextInfo = {
892
+ ...(message.contextInfo || {}),
893
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
894
+ };
561
895
  }
562
896
  else {
563
- m = await (0, exports.prepareWAMessageMedia)(message, options);
897
+ m = await prepareWAMessageMedia(message, options);
564
898
  }
565
- if ('buttons' in message && !!message.buttons) {
566
- const buttonsMessage = {
567
- buttons: message.buttons.map(b => ({ ...b, type: WAProto_1.proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
568
- };
569
- if ('text' in message) {
570
- buttonsMessage.contentText = message.text;
571
- buttonsMessage.headerType = ButtonType.EMPTY;
572
- }
573
- else {
574
- if ('caption' in message) {
575
- buttonsMessage.contentText = message.caption;
576
- }
577
- const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
578
- buttonsMessage.headerType = ButtonType[type];
579
- Object.assign(buttonsMessage, m);
580
- }
581
- if ('title' in message && !!message.title) {
582
- buttonsMessage.text = message.title,
583
- buttonsMessage.headerType = ButtonType.TEXT;
584
- }
585
- if ('footer' in message && !!message.footer) {
586
- buttonsMessage.footerText = message.footer;
587
- }
588
- if ('contextInfo' in message && !!message.contextInfo) {
589
- buttonsMessage.contextInfo = message.contextInfo;
590
- }
591
- if ('mentions' in message && !!message.mentions) {
592
- buttonsMessage.contextInfo = { mentionedJid: message.mentions };
593
- }
594
- m = { buttonsMessage };
899
+ if (hasOptionalProperty(message, 'isLottie') && !!message.isLottie) {
900
+ m = { lottieStickerMessage: { message: m } };
595
901
  }
596
- else if ('templateButtons' in message && !!message.templateButtons) {
597
- const msg = {
598
- hydratedButtons: message.hasOwnProperty("templateButtons") ? message.templateButtons : message.templateButtons
599
- };
600
- if ('text' in message) {
601
- msg.hydratedContentText = message.text;
602
- }
603
- else {
604
- if ('caption' in message) {
605
- msg.hydratedContentText = message.caption;
606
- }
607
- Object.assign(msg, m);
608
- }
609
- if ('footer' in message && !!message.footer) {
610
- msg.hydratedFooterText = message.footer;
611
- }
612
- m = {
613
- templateMessage: {
614
- fourRowTemplate: msg,
615
- hydratedTemplate: msg
616
- }
617
- };
902
+ if (hasOptionalProperty(message, 'viewOnceV2Extension') && !!message.viewOnceV2Extension) {
903
+ m = { viewOnceMessageV2Extension: { message: m } };
618
904
  }
619
- if ('sections' in message && !!message.sections) {
620
- const listMessage = {
621
- sections: message.sections,
622
- buttonText: message.buttonText,
623
- title: message.title,
624
- footerText: message.footer,
625
- description: message.text,
626
- listType: WAProto_1.proto.Message.ListMessage.ListType.SINGLE_SELECT
627
- };
628
- m = { listMessage };
905
+ else if (hasOptionalProperty(message, 'viewOnceV2') && !!message.viewOnceV2) {
906
+ m = { viewOnceMessageV2: { message: m } };
629
907
  }
630
- if ('interactiveButtons' in message && !!message.interactiveButtons) {
631
- const interactiveMessage = {
632
- nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
633
- buttons: message.interactiveButtons,
634
- })
635
- };
636
- if ('text' in message) {
637
- interactiveMessage.body = {
638
- text: message.text
639
- };
640
- }
641
- else if ('caption' in message) {
642
- interactiveMessage.body = {
643
- text: message.caption
644
- };
645
- interactiveMessage.header = {
646
- title: message.title,
647
- subtitle: message.subtitle,
648
- hasMediaAttachment: (_j = message === null || message === void 0 ? void 0 : message.media) !== null && _j !== void 0 ? _j : false,
649
- };
650
- Object.assign(interactiveMessage.header, m);
651
- }
652
- if ('footer' in message && !!message.footer) {
653
- interactiveMessage.footer = {
654
- text: message.footer
655
- };
656
- }
657
- if ('title' in message && !!message.title) {
658
- interactiveMessage.header = {
659
- title: message.title,
660
- subtitle: message.subtitle,
661
- hasMediaAttachment: (_k = message === null || message === void 0 ? void 0 : message.media) !== null && _k !== void 0 ? _k : false,
662
- };
663
- Object.assign(interactiveMessage.header, m);
664
- }
665
- if ('contextInfo' in message && !!message.contextInfo) {
666
- interactiveMessage.contextInfo = message.contextInfo;
667
- }
668
- if ('mentions' in message && !!message.mentions) {
669
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
670
- }
671
- m = { interactiveMessage };
908
+ else if (hasOptionalProperty(message, 'viewOnce') && !!message.viewOnce) {
909
+ m = { viewOnceMessage: { message: m } };
672
910
  }
673
- if ('shop' in message && !!message.shop) {
674
- const interactiveMessage = {
675
- shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
676
- surface: message.shop,
677
- id: message.id
678
- })
679
- };
680
- if ('text' in message) {
681
- interactiveMessage.body = {
682
- text: message.text
683
- };
684
- }
685
- else if ('caption' in message) {
686
- interactiveMessage.body = {
687
- text: message.caption
688
- };
689
- interactiveMessage.header = {
690
- title: message.title,
691
- subtitle: message.subtitle,
692
- hasMediaAttachment: (_l = message === null || message === void 0 ? void 0 : message.media) !== null && _l !== void 0 ? _l : false,
693
- };
694
- Object.assign(interactiveMessage.header, m);
695
- }
696
- if ('footer' in message && !!message.footer) {
697
- interactiveMessage.footer = {
698
- text: message.footer
699
- };
911
+ if ((hasOptionalProperty(message, 'mentions') && message.mentions?.length) ||
912
+ (hasOptionalProperty(message, 'mentionAll') && message.mentionAll)) {
913
+ const messageType = Object.keys(m)[0];
914
+ const key = m[messageType];
915
+ if (key && 'contextInfo' in key) {
916
+ key.contextInfo = key.contextInfo || {};
917
+ if (message.mentions?.length) {
918
+ key.contextInfo.mentionedJid = message.mentions;
919
+ }
920
+ if (message.mentionAll) {
921
+ key.contextInfo.nonJidMentions = 1;
922
+ }
700
923
  }
701
- if ('title' in message && !!message.title) {
702
- interactiveMessage.header = {
703
- title: message.title,
704
- subtitle: message.subtitle,
705
- hasMediaAttachment: (_m = message === null || message === void 0 ? void 0 : message.media) !== null && _m !== void 0 ? _m : false,
924
+ else if (key) {
925
+ key.contextInfo = {
926
+ mentionedJid: message.mentions,
927
+ nonJidMentions: message.mentionAll ? 1 : 0
706
928
  };
707
- Object.assign(interactiveMessage.header, m);
708
- }
709
- if ('contextInfo' in message && !!message.contextInfo) {
710
- interactiveMessage.contextInfo = message.contextInfo;
711
929
  }
712
- if ('mentions' in message && !!message.mentions) {
713
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
714
- }
715
- m = { interactiveMessage };
716
930
  }
717
- if ('viewOnce' in message && !!message.viewOnce) {
718
- m = { viewOnceMessage: { message: m } };
719
- }
720
- if ('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length)) {
721
- const [messageType] = Object.keys(m);
722
- m[messageType].contextInfo = m[messageType] || {};
723
- m[messageType].contextInfo.mentionedJid = message.mentions;
724
- }
725
- if ('edit' in message) {
931
+ if (hasOptionalProperty(message, 'edit')) {
726
932
  m = {
727
933
  protocolMessage: {
728
934
  key: message.edit,
729
935
  editedMessage: m,
730
936
  timestampMs: Date.now(),
731
- type: Types_1.WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
937
+ type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
732
938
  }
733
939
  };
734
940
  }
735
- if ('contextInfo' in message && !!message.contextInfo) {
736
- const [messageType] = Object.keys(m);
737
- m[messageType] = m[messageType] || {};
738
- m[messageType].contextInfo = message.contextInfo;
941
+ if (hasOptionalProperty(message, 'contextInfo') && !!message.contextInfo) {
942
+ const messageType = Object.keys(m)[0];
943
+ const key = m[messageType];
944
+ if ('contextInfo' in key && !!key.contextInfo) {
945
+ key.contextInfo = { ...key.contextInfo, ...message.contextInfo };
946
+ }
947
+ else if (key) {
948
+ key.contextInfo = message.contextInfo;
949
+ }
950
+ }
951
+ if (hasOptionalProperty(message, 'albumParentKey') && !!message.albumParentKey) {
952
+ m.messageContextInfo = {
953
+ ...m.messageContextInfo,
954
+ messageAssociation: {
955
+ associationType: WAProto.MessageAssociation.AssociationType.MEDIA_ALBUM,
956
+ parentMessageKey: message.albumParentKey
957
+ }
958
+ };
959
+ }
960
+ if (shouldIncludeReportingToken(m)) {
961
+ m.messageContextInfo = m.messageContextInfo || {};
962
+ if (!m.messageContextInfo.messageSecret) {
963
+ m.messageContextInfo.messageSecret = randomBytes(32);
964
+ }
739
965
  }
740
- return Types_1.WAProto.Message.fromObject(m);
966
+ return WAProto.Message.create(m);
741
967
  };
742
- exports.generateWAMessageContent = generateWAMessageContent;
743
- const generateWAMessageFromContent = (jid, message, options) => {
968
+ export const generateWAMessageFromContent = (jid, message, options) => {
744
969
  // set timestamp to now
745
970
  // if not specified
746
971
  if (!options.timestamp) {
747
972
  options.timestamp = new Date();
748
973
  }
749
- const innerMessage = (0, exports.normalizeMessageContent)(message);
750
- const key = (0, exports.getContentType)(innerMessage);
751
- const timestamp = (0, generics_1.unixTimestampSeconds)(options.timestamp);
974
+ const innerMessage = normalizeMessageContent(message);
975
+ const key = getContentType(innerMessage);
976
+ const timestamp = unixTimestampSeconds(options.timestamp);
752
977
  const { quoted, userJid } = options;
753
- // only set quoted if isn't a newsletter message
754
- if (quoted && !(0, WABinary_1.isJidNewsletter)(jid)) {
755
- const participant = quoted.key.fromMe ? userJid : (quoted.participant || quoted.key.participant || quoted.key.remoteJid);
756
- let quotedMsg = (0, exports.normalizeMessageContent)(quoted.message);
757
- const msgType = (0, exports.getContentType)(quotedMsg);
978
+ if (quoted && !isJidNewsletter(jid)) {
979
+ const participant = quoted.key.fromMe
980
+ ? userJid // TODO: Add support for LIDs
981
+ : quoted.participant || quoted.key.participant || quoted.key.remoteJid;
982
+ let quotedMsg = normalizeMessageContent(quoted.message);
983
+ const msgType = getContentType(quotedMsg);
758
984
  // strip any redundant properties
759
- if (quotedMsg) {
760
- quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
761
- const quotedContent = quotedMsg[msgType];
762
- if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
763
- delete quotedContent.contextInfo;
764
- }
765
- const contextInfo = innerMessage[key].contextInfo || {};
766
- contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
767
- contextInfo.stanzaId = quoted.key.id;
768
- contextInfo.quotedMessage = quotedMsg;
769
- // if a participant is quoted, then it must be a group
770
- // hence, remoteJid of group must also be entered
771
- if (jid !== quoted.key.remoteJid) {
772
- contextInfo.remoteJid = quoted.key.remoteJid;
773
- }
985
+ quotedMsg = proto.Message.create({ [msgType]: quotedMsg[msgType] });
986
+ const quotedContent = quotedMsg[msgType];
987
+ if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
988
+ delete quotedContent.contextInfo;
989
+ }
990
+ const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
991
+ contextInfo.participant = jidNormalizedUser(participant);
992
+ contextInfo.stanzaId = quoted.key.id;
993
+ contextInfo.quotedMessage = quotedMsg;
994
+ // if a participant is quoted, then it must be a group
995
+ // hence, remoteJid of group must also be entered
996
+ if (jid !== quoted.key.remoteJid) {
997
+ contextInfo.remoteJid = quoted.key.remoteJid;
998
+ }
999
+ if (contextInfo && innerMessage[key]) {
1000
+ /* @ts-ignore */
774
1001
  innerMessage[key].contextInfo = contextInfo;
775
1002
  }
776
1003
  }
777
1004
  if (
778
1005
  // if we want to send a disappearing message
779
- !!(options === null || options === void 0 ? void 0 : options.ephemeralExpiration) &&
1006
+ !!options?.ephemeralExpiration &&
780
1007
  // and it's not a protocol message -- delete, toggle disappear message
781
1008
  key !== 'protocolMessage' &&
782
1009
  // already not converted to disappearing message
783
1010
  key !== 'ephemeralMessage' &&
784
- // newsletter not accept disappearing messages
785
- !(0, WABinary_1.isJidNewsletter)(jid)) {
1011
+ // newsletters don't support ephemeral messages
1012
+ !isJidNewsletter(jid)) {
1013
+ /* @ts-ignore */
786
1014
  innerMessage[key].contextInfo = {
787
1015
  ...(innerMessage[key].contextInfo || {}),
788
- expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
1016
+ expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
789
1017
  //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
790
1018
  };
791
1019
  }
792
- message = Types_1.WAProto.Message.fromObject(message);
1020
+ message = WAProto.Message.create(message);
793
1021
  const messageJSON = {
794
1022
  key: {
795
1023
  remoteJid: jid,
796
1024
  fromMe: true,
797
- id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageIDV2)(),
1025
+ id: options?.messageId || generateMessageIDV2()
798
1026
  },
799
1027
  message: message,
800
1028
  messageTimestamp: timestamp,
801
1029
  messageStubParameters: [],
802
- participant: (0, WABinary_1.isJidGroup)(jid) || (0, WABinary_1.isJidStatusBroadcast)(jid) ? userJid : undefined,
803
- status: Types_1.WAMessageStatus.PENDING
1030
+ participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined, // TODO: Add support for LIDs
1031
+ status: WAMessageStatus.PENDING
804
1032
  };
805
- return Types_1.WAProto.WebMessageInfo.fromObject(messageJSON);
1033
+ return WAProto.WebMessageInfo.fromObject(messageJSON);
806
1034
  };
807
- exports.generateWAMessageFromContent = generateWAMessageFromContent;
808
- const generateWAMessage = async (jid, content, options) => {
809
- var _a;
1035
+ export const generateWAMessage = async (jid, content, options) => {
810
1036
  // ensure msg ID is with every log
811
- options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
812
- return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsletter)(jid), ...options }), options);
1037
+ options.logger = options?.logger?.child({ msgId: options.messageId });
1038
+ // Pass jid in the options to generateWAMessageContent
1039
+ return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { ...options, jid }), options);
813
1040
  };
814
- exports.generateWAMessage = generateWAMessage;
815
1041
  /** Get the key to access the true type of content */
816
- const getContentType = (content) => {
1042
+ export const getContentType = (content) => {
817
1043
  if (content) {
818
1044
  const keys = Object.keys(content);
819
1045
  const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
820
1046
  return key;
821
1047
  }
822
1048
  };
823
- exports.getContentType = getContentType;
824
1049
  /**
825
1050
  * Normalizes ephemeral, view once messages to regular message content
826
1051
  * Eg. image messages in ephemeral messages, in view once messages etc.
827
1052
  * @param content
828
1053
  * @returns
829
1054
  */
830
- const normalizeMessageContent = (content) => {
1055
+ export const normalizeMessageContent = (content) => {
831
1056
  if (!content) {
832
1057
  return undefined;
833
1058
  }
@@ -841,38 +1066,23 @@ const normalizeMessageContent = (content) => {
841
1066
  }
842
1067
  return content;
843
1068
  function getFutureProofMessage(message) {
844
- return ((message === null || message === void 0 ? void 0 : message.ephemeralMessage)
845
- || (message === null || message === void 0 ? void 0 : message.viewOnceMessage)
846
- || (message === null || message === void 0 ? void 0 : message.documentWithCaptionMessage)
847
- || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2)
848
- || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension)
849
- || (message === null || message === void 0 ? void 0 : message.editedMessage)
850
- || (message === null || message === void 0 ? void 0 : message.groupMentionedMessage)
851
- || (message === null || message === void 0 ? void 0 : message.botInvokeMessage)
852
- || (message === null || message === void 0 ? void 0 : message.lottieStickerMessage)
853
- || (message === null || message === void 0 ? void 0 : message.eventCoverImage)
854
- || (message === null || message === void 0 ? void 0 : message.statusMentionMessage)
855
- || (message === null || message === void 0 ? void 0 : message.pollCreationOptionImageMessage)
856
- || (message === null || message === void 0 ? void 0 : message.associatedChildMessage)
857
- || (message === null || message === void 0 ? void 0 : message.groupStatusMentionMessage)
858
- || (message === null || message === void 0 ? void 0 : message.pollCreationMessageV4)
859
- || (message === null || message === void 0 ? void 0 : message.pollCreationMessageV5)
860
- || (message === null || message === void 0 ? void 0 : message.statusAddYours)
861
- || (message === null || message === void 0 ? void 0 : message.groupStatusMessage)
862
- || (message === null || message === void 0 ? void 0 : message.limitSharingMessage)
863
- || (message === null || message === void 0 ? void 0 : message.botTaskMessage)
864
- || (message === null || message === void 0 ? void 0 : message.questionMessage)
865
- || (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
866
- || (message === null || message === void 0 ? void 0 : message.botForwardedMessage));
1069
+ return (message?.ephemeralMessage ||
1070
+ message?.viewOnceMessage ||
1071
+ message?.documentWithCaptionMessage ||
1072
+ message?.viewOnceMessageV2 ||
1073
+ message?.viewOnceMessageV2Extension ||
1074
+ message?.editedMessage ||
1075
+ message?.associatedChildMessage ||
1076
+ message?.groupStatusMessage ||
1077
+ message?.groupStatusMessageV2 ||
1078
+ message?.lottieStickerMessage);
867
1079
  }
868
1080
  };
869
- exports.normalizeMessageContent = normalizeMessageContent;
870
1081
  /**
871
1082
  * Extract the true message content from a message
872
1083
  * Eg. extracts the inner message from a disappearing message/view once message
873
1084
  */
874
- const extractMessageContent = (content) => {
875
- var _a, _b, _c, _d, _e, _f;
1085
+ export const extractMessageContent = (content) => {
876
1086
  const extractFromTemplateMessage = (msg) => {
877
1087
  if (msg.imageMessage) {
878
1088
  return { imageMessage: msg.imageMessage };
@@ -888,39 +1098,39 @@ const extractMessageContent = (content) => {
888
1098
  }
889
1099
  else {
890
1100
  return {
891
- conversation: 'contentText' in msg
892
- ? msg.contentText
893
- : ('hydratedContentText' in msg ? msg.hydratedContentText : '')
1101
+ conversation: 'contentText' in msg ? msg.contentText : 'hydratedContentText' in msg ? msg.hydratedContentText : ''
894
1102
  };
895
1103
  }
896
1104
  };
897
- content = (0, exports.normalizeMessageContent)(content);
898
- if (content === null || content === void 0 ? void 0 : content.buttonsMessage) {
1105
+ content = normalizeMessageContent(content);
1106
+ if (content?.buttonsMessage) {
899
1107
  return extractFromTemplateMessage(content.buttonsMessage);
900
1108
  }
901
- if ((_a = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _a === void 0 ? void 0 : _a.hydratedFourRowTemplate) {
902
- return extractFromTemplateMessage((_b = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _b === void 0 ? void 0 : _b.hydratedFourRowTemplate);
1109
+ if (content?.templateMessage?.hydratedFourRowTemplate) {
1110
+ return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
903
1111
  }
904
- if ((_c = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _c === void 0 ? void 0 : _c.hydratedTemplate) {
905
- return extractFromTemplateMessage((_d = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _d === void 0 ? void 0 : _d.hydratedTemplate);
1112
+ if (content?.templateMessage?.hydratedTemplate) {
1113
+ return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
906
1114
  }
907
- if ((_e = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _e === void 0 ? void 0 : _e.fourRowTemplate) {
908
- return extractFromTemplateMessage((_f = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _f === void 0 ? void 0 : _f.fourRowTemplate);
1115
+ if (content?.templateMessage?.fourRowTemplate) {
1116
+ return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
909
1117
  }
910
1118
  return content;
911
1119
  };
912
- exports.extractMessageContent = extractMessageContent;
913
1120
  /**
914
1121
  * Returns the device predicted by message ID
915
1122
  */
916
- const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' :
917
- /^3E.{20}$/.test(id) ? 'web' :
918
- /^(.{21}|.{32})$/.test(id) ? 'android' :
919
- /^(3F|.{18}$)/.test(id) ? 'desktop' :
920
- 'unknown';
921
- exports.getDevice = getDevice;
1123
+ export const getDevice = (id) => /^3A.{18}$/.test(id)
1124
+ ? 'ios'
1125
+ : /^3E.{20}$/.test(id)
1126
+ ? 'web'
1127
+ : /^(.{21}|.{32})$/.test(id)
1128
+ ? 'android'
1129
+ : /^(3F|.{18}$)/.test(id)
1130
+ ? 'desktop'
1131
+ : 'unknown';
922
1132
  /** Upserts a receipt in the message */
923
- const updateMessageWithReceipt = (msg, receipt) => {
1133
+ export const updateMessageWithReceipt = (msg, receipt) => {
924
1134
  msg.userReceipt = msg.userReceipt || [];
925
1135
  const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
926
1136
  if (recp) {
@@ -930,40 +1140,43 @@ const updateMessageWithReceipt = (msg, receipt) => {
930
1140
  msg.userReceipt.push(receipt);
931
1141
  }
932
1142
  };
933
- exports.updateMessageWithReceipt = updateMessageWithReceipt;
934
1143
  /** Update the message with a new reaction */
935
- const updateMessageWithReaction = (msg, reaction) => {
936
- const authorID = (0, generics_1.getKeyAuthor)(reaction.key);
937
- const reactions = (msg.reactions || [])
938
- .filter(r => (0, generics_1.getKeyAuthor)(r.key) !== authorID);
1144
+ export const updateMessageWithReaction = (msg, reaction) => {
1145
+ const authorID = getKeyAuthor(reaction.key);
1146
+ const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
939
1147
  reaction.text = reaction.text || '';
940
1148
  reactions.push(reaction);
941
1149
  msg.reactions = reactions;
942
1150
  };
943
- exports.updateMessageWithReaction = updateMessageWithReaction;
944
1151
  /** Update the message with a new poll update */
945
- const updateMessageWithPollUpdate = (msg, update) => {
946
- var _a, _b;
947
- const authorID = (0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey);
948
- const reactions = (msg.pollUpdates || [])
949
- .filter(r => (0, generics_1.getKeyAuthor)(r.pollUpdateMessageKey) !== authorID);
950
- if ((_b = (_a = update.vote) === null || _a === void 0 ? void 0 : _a.selectedOptions) === null || _b === void 0 ? void 0 : _b.length) {
1152
+ export const updateMessageWithPollUpdate = (msg, update) => {
1153
+ const authorID = getKeyAuthor(update.pollUpdateMessageKey);
1154
+ const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
1155
+ if (update.vote?.selectedOptions?.length) {
951
1156
  reactions.push(update);
952
1157
  }
953
1158
  msg.pollUpdates = reactions;
954
1159
  };
955
- exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
1160
+ /** Update the message with a new event response */
1161
+ export const updateMessageWithEventResponse = (msg, update) => {
1162
+ const authorID = getKeyAuthor(update.eventResponseMessageKey);
1163
+ const responses = (msg.eventResponses || []).filter(r => getKeyAuthor(r.eventResponseMessageKey) !== authorID);
1164
+ responses.push(update);
1165
+ msg.eventResponses = responses;
1166
+ };
956
1167
  /**
957
1168
  * Aggregates all poll updates in a poll.
958
1169
  * @param msg the poll creation message
959
1170
  * @param meId your jid
960
1171
  * @returns A list of options & their voters
961
1172
  */
962
- function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
963
- var _a, _b, _c;
964
- const opts = ((_a = message === null || message === void 0 ? void 0 : message.pollCreationMessage) === null || _a === void 0 ? void 0 : _a.options) || ((_b = message === null || message === void 0 ? void 0 : message.pollCreationMessageV2) === null || _b === void 0 ? void 0 : _b.options) || ((_c = message === null || message === void 0 ? void 0 : message.pollCreationMessageV3) === null || _c === void 0 ? void 0 : _c.options) || [];
1173
+ export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
1174
+ const opts = message?.pollCreationMessage?.options ||
1175
+ message?.pollCreationMessageV2?.options ||
1176
+ message?.pollCreationMessageV3?.options ||
1177
+ [];
965
1178
  const voteHashMap = opts.reduce((acc, opt) => {
966
- const hash = (0, crypto_2.sha256)(Buffer.from(opt.optionName || '')).toString();
1179
+ const hash = sha256(Buffer.from(opt.optionName || '')).toString();
967
1180
  acc[hash] = {
968
1181
  name: opt.optionName || '',
969
1182
  voters: []
@@ -985,13 +1198,36 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
985
1198
  };
986
1199
  data = voteHashMap[hash];
987
1200
  }
988
- voteHashMap[hash].voters.push((0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey, meId));
1201
+ voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
989
1202
  }
990
1203
  }
991
1204
  return Object.values(voteHashMap);
992
1205
  }
1206
+ /**
1207
+ * Aggregates all event responses in an event message.
1208
+ * @param msg the event creation message
1209
+ * @param meId your jid
1210
+ * @returns A list of response types & their responders
1211
+ */
1212
+ export function getAggregateResponsesInEventMessage({ eventResponses }, meId) {
1213
+ const responseTypes = ['GOING', 'NOT_GOING', 'MAYBE'];
1214
+ const responseMap = {};
1215
+ for (const type of responseTypes) {
1216
+ responseMap[type] = {
1217
+ response: type,
1218
+ responders: []
1219
+ };
1220
+ }
1221
+ for (const update of eventResponses || []) {
1222
+ const responseType = update.eventResponse || 'UNKNOWN';
1223
+ if (responseType !== 'UNKNOWN' && responseMap[responseType]) {
1224
+ responseMap[responseType].responders.push(getKeyAuthor(update.eventResponseMessageKey, meId));
1225
+ }
1226
+ }
1227
+ return Object.values(responseMap);
1228
+ }
993
1229
  /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
994
- const aggregateMessageKeysNotFromMe = (keys) => {
1230
+ export const aggregateMessageKeysNotFromMe = (keys) => {
995
1231
  const keyMap = {};
996
1232
  for (const { remoteJid, id, participant, fromMe } of keys) {
997
1233
  if (!fromMe) {
@@ -1008,40 +1244,34 @@ const aggregateMessageKeysNotFromMe = (keys) => {
1008
1244
  }
1009
1245
  return Object.values(keyMap);
1010
1246
  };
1011
- exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
1012
1247
  const REUPLOAD_REQUIRED_STATUS = [410, 404];
1013
1248
  /**
1014
1249
  * Downloads the given message. Throws an error if it's not a media message
1015
1250
  */
1016
- const downloadMediaMessage = async (message, type, options, ctx) => {
1017
- const result = await downloadMsg()
1018
- .catch(async (error) => {
1019
- var _a;
1020
- if (ctx) {
1021
- if (axios_1.default.isAxiosError(error)) {
1022
- // check if the message requires a reupload
1023
- if (REUPLOAD_REQUIRED_STATUS.includes((_a = error.response) === null || _a === void 0 ? void 0 : _a.status)) {
1024
- ctx.logger.info({ key: message.key }, 'sending reupload media request...');
1025
- // request reupload
1026
- message = await ctx.reuploadRequest(message);
1027
- const result = await downloadMsg();
1028
- return result;
1029
- }
1030
- }
1251
+ export const downloadMediaMessage = async (message, type, options, ctx) => {
1252
+ const result = await downloadMsg().catch(async (error) => {
1253
+ if (ctx &&
1254
+ typeof error?.status === 'number' && // treat errors with status as HTTP failures requiring reupload
1255
+ REUPLOAD_REQUIRED_STATUS.includes(error.status)) {
1256
+ ctx.logger.info({ key: message.key }, 'sending reupload media request...');
1257
+ // request reupload
1258
+ message = await ctx.reuploadRequest(message);
1259
+ const result = await downloadMsg();
1260
+ return result;
1031
1261
  }
1032
1262
  throw error;
1033
1263
  });
1034
1264
  return result;
1035
1265
  async function downloadMsg() {
1036
- const mContent = (0, exports.extractMessageContent)(message.message);
1266
+ const mContent = extractMessageContent(message.message);
1037
1267
  if (!mContent) {
1038
- throw new boom_1.Boom('No message present', { statusCode: 400, data: message });
1268
+ throw new Boom('No message present', { statusCode: 400, data: message });
1039
1269
  }
1040
- const contentType = (0, exports.getContentType)(mContent);
1041
- let mediaType = contentType === null || contentType === void 0 ? void 0 : contentType.replace('Message', '');
1270
+ const contentType = getContentType(mContent);
1271
+ let mediaType = contentType?.replace('Message', '');
1042
1272
  const media = mContent[contentType];
1043
1273
  if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
1044
- throw new boom_1.Boom(`"${contentType}" message is not a media message`);
1274
+ throw new Boom(`"${contentType}" message is not a media message`);
1045
1275
  }
1046
1276
  let download;
1047
1277
  if ('thumbnailDirectPath' in media && !('url' in media)) {
@@ -1054,7 +1284,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
1054
1284
  else {
1055
1285
  download = media;
1056
1286
  }
1057
- const stream = await (0, messages_media_1.downloadContentFromMessage)(download, mediaType, options);
1287
+ const stream = await downloadContentFromMessage(download, mediaType, options);
1058
1288
  if (type === 'buffer') {
1059
1289
  const bufferArray = [];
1060
1290
  for await (const chunk of stream) {
@@ -1065,37 +1295,40 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
1065
1295
  return stream;
1066
1296
  }
1067
1297
  };
1068
- exports.downloadMediaMessage = downloadMediaMessage;
1069
1298
  /** Checks whether the given message is a media message; if it is returns the inner content */
1070
- const assertMediaContent = (content) => {
1071
- content = (0, exports.extractMessageContent)(content);
1072
- const mediaContent = (content === null || content === void 0 ? void 0 : content.documentMessage)
1073
- || (content === null || content === void 0 ? void 0 : content.imageMessage)
1074
- || (content === null || content === void 0 ? void 0 : content.videoMessage)
1075
- || (content === null || content === void 0 ? void 0 : content.audioMessage)
1076
- || (content === null || content === void 0 ? void 0 : content.stickerMessage);
1299
+ export const assertMediaContent = (content) => {
1300
+ content = extractMessageContent(content);
1301
+ const mediaContent = content?.documentMessage ||
1302
+ content?.imageMessage ||
1303
+ content?.videoMessage ||
1304
+ content?.audioMessage ||
1305
+ content?.stickerMessage;
1077
1306
  if (!mediaContent) {
1078
- throw new boom_1.Boom('given message is not a media message', { statusCode: 400, data: content });
1307
+ throw new Boom('given message is not a media message', { statusCode: 400, data: content });
1079
1308
  }
1080
1309
  return mediaContent;
1081
1310
  };
1082
- exports.assertMediaContent = assertMediaContent;
1083
-
1084
- const toJid = (id) => {
1085
- if (!id)
1311
+ /**
1312
+ * Normaliza cualquier identificador (número suelto, JID con @lid, o JID ya completo)
1313
+ * a un JID válido de tipo @s.whatsapp.net
1314
+ */
1315
+ export const toJid = (id) => {
1316
+ if (!id) {
1086
1317
  return '';
1087
- if (id.endsWith('@lid'))
1318
+ }
1319
+ if (id.endsWith('@lid')) {
1088
1320
  return id.replace('@lid', '@s.whatsapp.net');
1089
- if (id.includes('@'))
1321
+ }
1322
+ if (id.includes('@')) {
1090
1323
  return id;
1324
+ }
1091
1325
  return `${id}@s.whatsapp.net`;
1092
1326
  };
1093
- exports.toJid = toJid;
1094
- const getSenderLid = (message) => {
1095
- const sender = message.key.participant || message.key.remoteJid;
1096
- const user = (0, WABinary_1.jidDecode)(sender)?.user || '';
1097
- const lid = (0, WABinary_1.jidEncode)(user, 'lid');
1098
- console.log('sender lid:', lid);
1327
+ /** Obtiene el JID y el LID del remitente de un mensaje */
1328
+ export const getSenderLid = (message) => {
1329
+ const sender = message.key?.participant || message.key?.remoteJid;
1330
+ const user = jidDecode(sender)?.user || '';
1331
+ const lid = jidEncode(user, 'lid');
1099
1332
  return { jid: sender, lid };
1100
1333
  };
1101
- exports.getSenderLid = getSenderLid;
1334
+ //# sourceMappingURL=messages.js.map