@neelegirl/baileys 1.5.6 → 1.5.8

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 (421) hide show
  1. package/README.md +24 -27
  2. package/WAProto/WAProto.proto +665 -291
  3. package/WAProto/index.d.ts +48037 -2294
  4. package/WAProto/index.js +139804 -45203
  5. package/lib/Defaults/baileys-version.json +3 -0
  6. package/lib/Defaults/index.d.ts +64 -58
  7. package/lib/Defaults/index.js +96 -74
  8. package/lib/Defaults/phonenumber-mcc.json +223 -0
  9. package/lib/Signal/WASignalGroup/GroupProtocol.js +1909 -0
  10. package/lib/Signal/WASignalGroup/ciphertext_message.js +16 -0
  11. package/lib/Signal/WASignalGroup/generate-proto.sh +1 -0
  12. package/lib/Signal/WASignalGroup/group.proto +42 -0
  13. package/lib/Signal/WASignalGroup/group_cipher.js +120 -0
  14. package/lib/Signal/WASignalGroup/group_session_builder.js +46 -0
  15. package/lib/Signal/WASignalGroup/index.js +6 -0
  16. package/lib/Signal/WASignalGroup/keyhelper.js +21 -0
  17. package/lib/Signal/WASignalGroup/protobufs.js +3 -0
  18. package/lib/Signal/WASignalGroup/queue_job.js +69 -0
  19. package/lib/Signal/WASignalGroup/readme.md +6 -0
  20. package/lib/Signal/WASignalGroup/sender_chain_key.js +50 -0
  21. package/lib/Signal/WASignalGroup/sender_key_distribution_message.js +78 -0
  22. package/lib/Signal/WASignalGroup/sender_key_message.js +92 -0
  23. package/lib/Signal/WASignalGroup/sender_key_name.js +70 -0
  24. package/lib/Signal/WASignalGroup/sender_key_record.js +56 -0
  25. package/lib/Signal/WASignalGroup/sender_key_state.js +129 -0
  26. package/lib/Signal/{Group/sender-message-key.js → WASignalGroup/sender_message_key.js} +16 -3
  27. package/lib/Signal/libsignal.d.ts +4 -5
  28. package/lib/Signal/libsignal.js +112 -292
  29. package/lib/Socket/Client/abstract-socket-client.d.ts +15 -0
  30. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  31. package/lib/Socket/Client/index.d.ts +2 -3
  32. package/lib/Socket/Client/index.js +22 -3
  33. package/lib/Socket/Client/mobile-socket-client.d.ts +12 -0
  34. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  35. package/lib/Socket/Client/types.d.ts +15 -15
  36. package/lib/Socket/Client/types.js +15 -8
  37. package/lib/Socket/Client/websocket.d.ts +12 -12
  38. package/lib/Socket/Client/websocket.js +36 -24
  39. package/lib/Socket/business.d.ts +177 -178
  40. package/lib/Socket/business.js +71 -179
  41. package/lib/Socket/chats.d.ts +93 -93
  42. package/lib/Socket/chats.js +625 -474
  43. package/lib/Socket/communities.d.ts +62 -83
  44. package/lib/Socket/communities.js +414 -412
  45. package/lib/Socket/groups.d.ts +112 -118
  46. package/lib/Socket/groups.js +171 -146
  47. package/lib/Socket/index.d.ts +182 -222
  48. package/lib/Socket/index.js +17 -12
  49. package/lib/Socket/messages-recv.d.ts +169 -165
  50. package/lib/Socket/messages-recv.js +1721 -1185
  51. package/lib/Socket/messages-send.d.ts +160 -161
  52. package/lib/Socket/messages-send.js +992 -642
  53. package/lib/Socket/mex.d.ts +0 -1
  54. package/lib/Socket/mex.js +9 -4
  55. package/lib/Socket/newsletter.d.ts +139 -139
  56. package/lib/Socket/newsletter.js +258 -153
  57. package/lib/Socket/registration.d.ts +266 -0
  58. package/lib/Socket/registration.js +166 -0
  59. package/lib/Socket/socket.d.ts +36 -42
  60. package/lib/Socket/socket.js +615 -533
  61. package/lib/Socket/usync.d.ts +37 -0
  62. package/lib/Socket/usync.js +83 -0
  63. package/lib/Store/index.d.ts +4 -0
  64. package/lib/Store/index.js +24 -0
  65. package/lib/Store/make-cache-manager-store.d.ts +14 -0
  66. package/lib/Store/make-cache-manager-store.js +90 -0
  67. package/lib/Store/make-in-memory-store.d.ts +123 -0
  68. package/lib/Store/make-in-memory-store.js +429 -0
  69. package/lib/Store/make-ordered-dictionary.d.ts +12 -0
  70. package/lib/Store/make-ordered-dictionary.js +86 -0
  71. package/lib/Store/object-repository.d.ts +10 -0
  72. package/lib/Store/object-repository.js +31 -0
  73. package/lib/Types/Auth.d.ts +96 -87
  74. package/lib/Types/Auth.js +3 -2
  75. package/lib/Types/Call.d.ts +13 -13
  76. package/lib/Types/Call.js +3 -2
  77. package/lib/Types/Chat.d.ts +94 -79
  78. package/lib/Types/Chat.js +9 -8
  79. package/lib/Types/Contact.d.ts +9 -13
  80. package/lib/Types/Contact.js +3 -2
  81. package/lib/Types/Events.d.ts +179 -152
  82. package/lib/Types/Events.js +3 -2
  83. package/lib/Types/GroupMetadata.d.ts +48 -49
  84. package/lib/Types/GroupMetadata.js +3 -2
  85. package/lib/Types/Label.d.ts +14 -13
  86. package/lib/Types/Label.js +30 -24
  87. package/lib/Types/LabelAssociation.d.ts +20 -15
  88. package/lib/Types/LabelAssociation.js +12 -6
  89. package/lib/Types/Message.d.ts +404 -234
  90. package/lib/Types/Message.js +13 -11
  91. package/lib/Types/MexUpdates.d.ts +9 -0
  92. package/lib/Types/MexUpdates.js +18 -0
  93. package/lib/Types/Newsletter.d.ts +104 -130
  94. package/lib/Types/Newsletter.js +40 -31
  95. package/lib/Types/Product.d.ts +71 -58
  96. package/lib/Types/Product.js +3 -2
  97. package/lib/Types/Signal.d.ts +55 -63
  98. package/lib/Types/Signal.js +3 -2
  99. package/lib/Types/Socket.d.ts +66 -77
  100. package/lib/Types/Socket.js +3 -3
  101. package/lib/Types/State.d.ts +19 -17
  102. package/lib/Types/State.js +14 -13
  103. package/lib/Types/USync.d.ts +8 -8
  104. package/lib/Types/USync.js +3 -2
  105. package/lib/Types/index.d.ts +61 -47
  106. package/lib/Types/index.js +48 -26
  107. package/lib/Utils/auth-utils.d.ts +10 -8
  108. package/lib/Utils/auth-utils.js +154 -206
  109. package/lib/Utils/baileys-event-stream.d.ts +7 -6
  110. package/lib/Utils/baileys-event-stream.js +43 -29
  111. package/lib/Utils/business.d.ts +20 -14
  112. package/lib/Utils/business.js +134 -110
  113. package/lib/Utils/chat-utils.d.ts +69 -57
  114. package/lib/Utils/chat-utils.js +380 -362
  115. package/lib/Utils/check-npm-version.d.ts +15 -0
  116. package/lib/Utils/check-npm-version.js +52 -0
  117. package/lib/Utils/crypto.d.ts +45 -30
  118. package/lib/Utils/crypto.js +178 -141
  119. package/lib/Utils/decode-wa-message.d.ts +35 -42
  120. package/lib/Utils/decode-wa-message.js +150 -176
  121. package/lib/Utils/event-buffer.d.ts +17 -12
  122. package/lib/Utils/event-buffer.js +286 -269
  123. package/lib/Utils/generics.d.ts +99 -60
  124. package/lib/Utils/generics.js +481 -244
  125. package/lib/Utils/history.d.ts +22 -18
  126. package/lib/Utils/history.js +80 -54
  127. package/lib/Utils/index.d.ts +19 -20
  128. package/lib/Utils/index.js +41 -19
  129. package/lib/Utils/link-preview.d.ts +14 -12
  130. package/lib/Utils/link-preview.js +75 -40
  131. package/lib/Utils/logger.d.ts +11 -10
  132. package/lib/Utils/logger.js +7 -3
  133. package/lib/Utils/lt-hash.d.ts +13 -12
  134. package/lib/Utils/lt-hash.js +37 -27
  135. package/lib/Utils/make-mutex.d.ts +7 -6
  136. package/lib/Utils/make-mutex.js +29 -20
  137. package/lib/Utils/message-retry-manager.d.ts +6 -6
  138. package/lib/Utils/message-retry-manager.js +36 -8
  139. package/lib/Utils/messages-media.d.ts +102 -87
  140. package/lib/Utils/messages-media.js +570 -427
  141. package/lib/Utils/messages.d.ts +64 -37
  142. package/lib/Utils/messages.js +1270 -511
  143. package/lib/Utils/noise-handler.d.ts +18 -18
  144. package/lib/Utils/noise-handler.js +109 -101
  145. package/lib/Utils/process-message.d.ts +32 -25
  146. package/lib/Utils/process-message.js +281 -266
  147. package/lib/Utils/signal.d.ts +32 -24
  148. package/lib/Utils/signal.js +105 -98
  149. package/lib/Utils/use-mongo-file-auth-state.d.ts +6 -0
  150. package/lib/Utils/use-mongo-file-auth-state.js +84 -0
  151. package/lib/Utils/use-multi-file-auth-state.d.ts +10 -5
  152. package/lib/Utils/use-multi-file-auth-state.js +186 -69
  153. package/lib/Utils/use-single-file-auth-state.d.ts +13 -0
  154. package/lib/Utils/use-single-file-auth-state.js +80 -0
  155. package/lib/Utils/validate-connection.d.ts +13 -11
  156. package/lib/Utils/validate-connection.js +116 -124
  157. package/lib/WABinary/constants.d.ts +27 -25
  158. package/lib/WABinary/constants.js +1292 -1277
  159. package/lib/WABinary/decode.d.ts +9 -7
  160. package/lib/WABinary/decode.js +189 -139
  161. package/lib/WABinary/encode.d.ts +3 -3
  162. package/lib/WABinary/encode.js +154 -105
  163. package/lib/WABinary/generic-utils.d.ts +27 -14
  164. package/lib/WABinary/generic-utils.js +102 -62
  165. package/lib/WABinary/index.d.ts +5 -6
  166. package/lib/WABinary/index.js +25 -6
  167. package/lib/WABinary/jid-utils.d.ts +46 -41
  168. package/lib/WABinary/jid-utils.js +80 -84
  169. package/lib/WABinary/types.d.ts +13 -10
  170. package/lib/WABinary/types.js +3 -2
  171. package/lib/WAM/BinaryInfo.d.ts +15 -8
  172. package/lib/WAM/BinaryInfo.js +14 -7
  173. package/lib/WAM/constants.d.ts +37 -30
  174. package/lib/WAM/constants.js +11983 -19465
  175. package/lib/WAM/encode.d.ts +3 -3
  176. package/lib/WAM/encode.js +110 -95
  177. package/lib/WAM/index.d.ts +3 -4
  178. package/lib/WAM/index.js +23 -4
  179. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.d.ts +28 -0
  180. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +69 -0
  181. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -9
  182. package/lib/WAUSync/Protocols/USyncContactProtocol.js +19 -12
  183. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -19
  184. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +26 -18
  185. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -11
  186. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +20 -12
  187. package/lib/WAUSync/Protocols/USyncLIDProtocol.d.ts +9 -0
  188. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +30 -0
  189. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -11
  190. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +24 -16
  191. package/lib/WAUSync/Protocols/index.d.ts +6 -5
  192. package/lib/WAUSync/Protocols/index.js +26 -5
  193. package/lib/WAUSync/USyncQuery.d.ts +28 -26
  194. package/lib/WAUSync/USyncQuery.js +62 -64
  195. package/lib/WAUSync/USyncUser.d.ts +10 -11
  196. package/lib/WAUSync/USyncUser.js +19 -12
  197. package/lib/WAUSync/index.d.ts +3 -4
  198. package/lib/WAUSync/index.js +23 -4
  199. package/lib/index.d.ts +11 -10
  200. package/lib/index.js +33 -11
  201. package/package.json +43 -48
  202. package/WAProto/GenerateStatics.sh +0 -3
  203. package/WAProto/fix-imports.js +0 -29
  204. package/engine-requirements.js +0 -10
  205. package/lib/Defaults/index.d.ts.map +0 -1
  206. package/lib/Defaults/index.js.map +0 -1
  207. package/lib/Signal/Group/ciphertext-message.d.ts +0 -10
  208. package/lib/Signal/Group/ciphertext-message.d.ts.map +0 -1
  209. package/lib/Signal/Group/ciphertext-message.js +0 -12
  210. package/lib/Signal/Group/ciphertext-message.js.map +0 -1
  211. package/lib/Signal/Group/group-session-builder.d.ts +0 -15
  212. package/lib/Signal/Group/group-session-builder.d.ts.map +0 -1
  213. package/lib/Signal/Group/group-session-builder.js +0 -30
  214. package/lib/Signal/Group/group-session-builder.js.map +0 -1
  215. package/lib/Signal/Group/group_cipher.d.ts +0 -17
  216. package/lib/Signal/Group/group_cipher.d.ts.map +0 -1
  217. package/lib/Signal/Group/group_cipher.js +0 -82
  218. package/lib/Signal/Group/group_cipher.js.map +0 -1
  219. package/lib/Signal/Group/index.d.ts +0 -12
  220. package/lib/Signal/Group/index.d.ts.map +0 -1
  221. package/lib/Signal/Group/index.js +0 -12
  222. package/lib/Signal/Group/index.js.map +0 -1
  223. package/lib/Signal/Group/keyhelper.d.ts +0 -11
  224. package/lib/Signal/Group/keyhelper.d.ts.map +0 -1
  225. package/lib/Signal/Group/keyhelper.js +0 -18
  226. package/lib/Signal/Group/keyhelper.js.map +0 -1
  227. package/lib/Signal/Group/sender-chain-key.d.ts +0 -14
  228. package/lib/Signal/Group/sender-chain-key.d.ts.map +0 -1
  229. package/lib/Signal/Group/sender-chain-key.js +0 -26
  230. package/lib/Signal/Group/sender-chain-key.js.map +0 -1
  231. package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -17
  232. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +0 -1
  233. package/lib/Signal/Group/sender-key-distribution-message.js +0 -63
  234. package/lib/Signal/Group/sender-key-distribution-message.js.map +0 -1
  235. package/lib/Signal/Group/sender-key-message.d.ts +0 -19
  236. package/lib/Signal/Group/sender-key-message.d.ts.map +0 -1
  237. package/lib/Signal/Group/sender-key-message.js +0 -66
  238. package/lib/Signal/Group/sender-key-message.js.map +0 -1
  239. package/lib/Signal/Group/sender-key-name.d.ts +0 -18
  240. package/lib/Signal/Group/sender-key-name.d.ts.map +0 -1
  241. package/lib/Signal/Group/sender-key-name.js +0 -48
  242. package/lib/Signal/Group/sender-key-name.js.map +0 -1
  243. package/lib/Signal/Group/sender-key-record.d.ts +0 -31
  244. package/lib/Signal/Group/sender-key-record.d.ts.map +0 -1
  245. package/lib/Signal/Group/sender-key-record.js +0 -41
  246. package/lib/Signal/Group/sender-key-record.js.map +0 -1
  247. package/lib/Signal/Group/sender-key-state.d.ts +0 -39
  248. package/lib/Signal/Group/sender-key-state.d.ts.map +0 -1
  249. package/lib/Signal/Group/sender-key-state.js +0 -84
  250. package/lib/Signal/Group/sender-key-state.js.map +0 -1
  251. package/lib/Signal/Group/sender-message-key.d.ts +0 -12
  252. package/lib/Signal/Group/sender-message-key.d.ts.map +0 -1
  253. package/lib/Signal/Group/sender-message-key.js.map +0 -1
  254. package/lib/Signal/libsignal.d.ts.map +0 -1
  255. package/lib/Signal/libsignal.js.map +0 -1
  256. package/lib/Signal/lid-mapping.d.ts +0 -23
  257. package/lib/Signal/lid-mapping.d.ts.map +0 -1
  258. package/lib/Signal/lid-mapping.js +0 -171
  259. package/lib/Signal/lid-mapping.js.map +0 -1
  260. package/lib/Socket/Client/index.d.ts.map +0 -1
  261. package/lib/Socket/Client/index.js.map +0 -1
  262. package/lib/Socket/Client/types.d.ts.map +0 -1
  263. package/lib/Socket/Client/types.js.map +0 -1
  264. package/lib/Socket/Client/websocket.d.ts.map +0 -1
  265. package/lib/Socket/Client/websocket.js.map +0 -1
  266. package/lib/Socket/business.d.ts.map +0 -1
  267. package/lib/Socket/business.js.map +0 -1
  268. package/lib/Socket/chats.d.ts.map +0 -1
  269. package/lib/Socket/chats.js.map +0 -1
  270. package/lib/Socket/communities.d.ts.map +0 -1
  271. package/lib/Socket/communities.js.map +0 -1
  272. package/lib/Socket/groups.d.ts.map +0 -1
  273. package/lib/Socket/groups.js.map +0 -1
  274. package/lib/Socket/index.d.ts.map +0 -1
  275. package/lib/Socket/index.js.map +0 -1
  276. package/lib/Socket/messages-recv.d.ts.map +0 -1
  277. package/lib/Socket/messages-recv.js.map +0 -1
  278. package/lib/Socket/messages-send.d.ts.map +0 -1
  279. package/lib/Socket/messages-send.js.map +0 -1
  280. package/lib/Socket/mex.d.ts.map +0 -1
  281. package/lib/Socket/mex.js.map +0 -1
  282. package/lib/Socket/newsletter.d.ts.map +0 -1
  283. package/lib/Socket/newsletter.js.map +0 -1
  284. package/lib/Socket/socket.d.ts.map +0 -1
  285. package/lib/Socket/socket.js.map +0 -1
  286. package/lib/Types/Auth.d.ts.map +0 -1
  287. package/lib/Types/Auth.js.map +0 -1
  288. package/lib/Types/Bussines.d.ts +0 -25
  289. package/lib/Types/Bussines.d.ts.map +0 -1
  290. package/lib/Types/Bussines.js +0 -2
  291. package/lib/Types/Bussines.js.map +0 -1
  292. package/lib/Types/Call.d.ts.map +0 -1
  293. package/lib/Types/Call.js.map +0 -1
  294. package/lib/Types/Chat.d.ts.map +0 -1
  295. package/lib/Types/Chat.js.map +0 -1
  296. package/lib/Types/Contact.d.ts.map +0 -1
  297. package/lib/Types/Contact.js.map +0 -1
  298. package/lib/Types/Events.d.ts.map +0 -1
  299. package/lib/Types/Events.js.map +0 -1
  300. package/lib/Types/GroupMetadata.d.ts.map +0 -1
  301. package/lib/Types/GroupMetadata.js.map +0 -1
  302. package/lib/Types/Label.d.ts.map +0 -1
  303. package/lib/Types/Label.js.map +0 -1
  304. package/lib/Types/LabelAssociation.d.ts.map +0 -1
  305. package/lib/Types/LabelAssociation.js.map +0 -1
  306. package/lib/Types/Message.d.ts.map +0 -1
  307. package/lib/Types/Message.js.map +0 -1
  308. package/lib/Types/Newsletter.d.ts.map +0 -1
  309. package/lib/Types/Newsletter.js.map +0 -1
  310. package/lib/Types/Product.d.ts.map +0 -1
  311. package/lib/Types/Product.js.map +0 -1
  312. package/lib/Types/Signal.d.ts.map +0 -1
  313. package/lib/Types/Signal.js.map +0 -1
  314. package/lib/Types/Socket.d.ts.map +0 -1
  315. package/lib/Types/Socket.js.map +0 -1
  316. package/lib/Types/State.d.ts.map +0 -1
  317. package/lib/Types/State.js.map +0 -1
  318. package/lib/Types/USync.d.ts.map +0 -1
  319. package/lib/Types/USync.js.map +0 -1
  320. package/lib/Types/index.d.ts.map +0 -1
  321. package/lib/Types/index.js.map +0 -1
  322. package/lib/Utils/auth-utils.d.ts.map +0 -1
  323. package/lib/Utils/auth-utils.js.map +0 -1
  324. package/lib/Utils/baileys-event-stream.d.ts.map +0 -1
  325. package/lib/Utils/baileys-event-stream.js.map +0 -1
  326. package/lib/Utils/browser-utils.d.ts +0 -4
  327. package/lib/Utils/browser-utils.d.ts.map +0 -1
  328. package/lib/Utils/browser-utils.js +0 -28
  329. package/lib/Utils/browser-utils.js.map +0 -1
  330. package/lib/Utils/business.d.ts.map +0 -1
  331. package/lib/Utils/business.js.map +0 -1
  332. package/lib/Utils/chat-utils.d.ts.map +0 -1
  333. package/lib/Utils/chat-utils.js.map +0 -1
  334. package/lib/Utils/crypto.d.ts.map +0 -1
  335. package/lib/Utils/crypto.js.map +0 -1
  336. package/lib/Utils/decode-wa-message.d.ts.map +0 -1
  337. package/lib/Utils/decode-wa-message.js.map +0 -1
  338. package/lib/Utils/event-buffer.d.ts.map +0 -1
  339. package/lib/Utils/event-buffer.js.map +0 -1
  340. package/lib/Utils/generics.d.ts.map +0 -1
  341. package/lib/Utils/generics.js.map +0 -1
  342. package/lib/Utils/history.d.ts.map +0 -1
  343. package/lib/Utils/history.js.map +0 -1
  344. package/lib/Utils/index.d.ts.map +0 -1
  345. package/lib/Utils/index.js.map +0 -1
  346. package/lib/Utils/link-preview.d.ts.map +0 -1
  347. package/lib/Utils/link-preview.js.map +0 -1
  348. package/lib/Utils/logger.d.ts.map +0 -1
  349. package/lib/Utils/logger.js.map +0 -1
  350. package/lib/Utils/lt-hash.d.ts.map +0 -1
  351. package/lib/Utils/lt-hash.js.map +0 -1
  352. package/lib/Utils/make-mutex.d.ts.map +0 -1
  353. package/lib/Utils/make-mutex.js.map +0 -1
  354. package/lib/Utils/message-retry-manager.d.ts.map +0 -1
  355. package/lib/Utils/message-retry-manager.js.map +0 -1
  356. package/lib/Utils/messages-media.d.ts.map +0 -1
  357. package/lib/Utils/messages-media.js.map +0 -1
  358. package/lib/Utils/messages.d.ts.map +0 -1
  359. package/lib/Utils/messages.js.map +0 -1
  360. package/lib/Utils/noise-handler.d.ts.map +0 -1
  361. package/lib/Utils/noise-handler.js.map +0 -1
  362. package/lib/Utils/pre-key-manager.d.ts +0 -28
  363. package/lib/Utils/pre-key-manager.d.ts.map +0 -1
  364. package/lib/Utils/pre-key-manager.js +0 -106
  365. package/lib/Utils/pre-key-manager.js.map +0 -1
  366. package/lib/Utils/process-message.d.ts.map +0 -1
  367. package/lib/Utils/process-message.js.map +0 -1
  368. package/lib/Utils/signal.d.ts.map +0 -1
  369. package/lib/Utils/signal.js.map +0 -1
  370. package/lib/Utils/use-multi-file-auth-state.d.ts.map +0 -1
  371. package/lib/Utils/use-multi-file-auth-state.js.map +0 -1
  372. package/lib/Utils/validate-connection.d.ts.map +0 -1
  373. package/lib/Utils/validate-connection.js.map +0 -1
  374. package/lib/WABinary/constants.d.ts.map +0 -1
  375. package/lib/WABinary/constants.js.map +0 -1
  376. package/lib/WABinary/decode.d.ts.map +0 -1
  377. package/lib/WABinary/decode.js.map +0 -1
  378. package/lib/WABinary/encode.d.ts.map +0 -1
  379. package/lib/WABinary/encode.js.map +0 -1
  380. package/lib/WABinary/generic-utils.d.ts.map +0 -1
  381. package/lib/WABinary/generic-utils.js.map +0 -1
  382. package/lib/WABinary/index.d.ts.map +0 -1
  383. package/lib/WABinary/index.js.map +0 -1
  384. package/lib/WABinary/jid-utils.d.ts.map +0 -1
  385. package/lib/WABinary/jid-utils.js.map +0 -1
  386. package/lib/WABinary/types.d.ts.map +0 -1
  387. package/lib/WABinary/types.js.map +0 -1
  388. package/lib/WAM/BinaryInfo.d.ts.map +0 -1
  389. package/lib/WAM/BinaryInfo.js.map +0 -1
  390. package/lib/WAM/constants.d.ts.map +0 -1
  391. package/lib/WAM/constants.js.map +0 -1
  392. package/lib/WAM/encode.d.ts.map +0 -1
  393. package/lib/WAM/encode.js.map +0 -1
  394. package/lib/WAM/index.d.ts.map +0 -1
  395. package/lib/WAM/index.js.map +0 -1
  396. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +0 -1
  397. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +0 -1
  398. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +0 -1
  399. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +0 -1
  400. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +0 -1
  401. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +0 -1
  402. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +0 -1
  403. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +0 -1
  404. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -26
  405. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +0 -1
  406. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +0 -51
  407. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +0 -1
  408. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -10
  409. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +0 -1
  410. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +0 -29
  411. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +0 -1
  412. package/lib/WAUSync/Protocols/index.d.ts.map +0 -1
  413. package/lib/WAUSync/Protocols/index.js.map +0 -1
  414. package/lib/WAUSync/USyncQuery.d.ts.map +0 -1
  415. package/lib/WAUSync/USyncQuery.js.map +0 -1
  416. package/lib/WAUSync/USyncUser.d.ts.map +0 -1
  417. package/lib/WAUSync/USyncUser.js.map +0 -1
  418. package/lib/WAUSync/index.d.ts.map +0 -1
  419. package/lib/WAUSync/index.js.map +0 -1
  420. package/lib/index.d.ts.map +0 -1
  421. package/lib/index.js.map +0 -1
@@ -1,820 +1,1579 @@
1
- import { Boom } from '@hapi/boom';
2
- import { randomBytes } from 'crypto';
3
- import { promises as fs } from 'fs';
4
- import {} from 'stream';
5
- import { proto } from '../../WAProto/index.js';
6
- import { CALL_AUDIO_PREFIX, CALL_VIDEO_PREFIX, MEDIA_KEYS, URL_REGEX, WA_DEFAULT_EPHEMERAL } from '../Defaults/index.js';
7
- import { WAMessageStatus, WAProto } from '../Types/index.js';
8
- import { isJidGroup, isJidNewsletter, isJidStatusBroadcast, jidNormalizedUser } from '../WABinary/index.js';
9
- import { sha256 } from './crypto.js';
10
- import { generateMessageIDV2, getKeyAuthor, unixTimestampSeconds } from './generics.js';
11
- import { downloadContentFromMessage, encryptedStream, generateThumbnail, getAudioDuration, getAudioWaveform, getRawMediaUploadData } from './messages-media.js';
1
+ "use strict"
2
+
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod }
5
+ }
6
+
7
+ Object.defineProperty(exports, "__esModule", { value: true })
8
+
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")
20
+
12
21
  const MIMETYPE_MAP = {
13
22
  image: 'image/jpeg',
14
23
  video: 'video/mp4',
15
24
  document: 'application/pdf',
16
- audio: 'audio/ogg; codecs=opus',
25
+ audio: 'audio/ogg codecs=opus',
17
26
  sticker: 'image/webp',
18
27
  'product-catalog-image': 'image/jpeg'
19
- };
28
+ }
29
+
20
30
  const MessageTypeProto = {
21
- image: WAProto.Message.ImageMessage,
22
- video: WAProto.Message.VideoMessage,
23
- audio: WAProto.Message.AudioMessage,
24
- sticker: WAProto.Message.StickerMessage,
25
- document: WAProto.Message.DocumentMessage
26
- };
31
+ 'image': Types_1.WAProto.Message.ImageMessage,
32
+ 'video': Types_1.WAProto.Message.VideoMessage,
33
+ 'audio': Types_1.WAProto.Message.AudioMessage,
34
+ 'sticker': Types_1.WAProto.Message.StickerMessage,
35
+ 'document': Types_1.WAProto.Message.DocumentMessage,
36
+ }
37
+
27
38
  /**
28
39
  * Uses a regex to test whether the string contains a URL, and returns the URL if it does.
29
40
  * @param text eg. hello https://google.com
30
41
  * @returns the URL, eg. https://google.com
31
42
  */
32
- export const extractUrlFromText = (text) => text.match(URL_REGEX)?.[0];
33
- export const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
34
- const url = extractUrlFromText(text);
43
+ const extractUrlFromText = (text) => text.match(Defaults_1.URL_REGEX)?.[0]
44
+
45
+ const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
46
+ const url = extractUrlFromText(text)
47
+
35
48
  if (!!getUrlInfo && url) {
36
49
  try {
37
- const urlInfo = await getUrlInfo(url);
38
- return urlInfo;
50
+ const urlInfo = await getUrlInfo(url)
51
+ return urlInfo
39
52
  }
40
- catch (error) {
41
- // ignore if fails
42
- logger?.warn({ trace: error.stack }, 'url generation failed');
53
+
54
+ catch (error) {
55
+ logger?.warn({ trace: error.stack }, 'url generation failed')
43
56
  }
44
57
  }
45
- };
58
+ }
59
+
46
60
  const assertColor = async (color) => {
47
- let assertedColor;
61
+ let assertedColor
62
+
48
63
  if (typeof color === 'number') {
49
- assertedColor = color > 0 ? color : 0xffffffff + Number(color) + 1;
64
+ assertedColor = color > 0 ? color : 0xffffffff + Number(color) + 1
50
65
  }
66
+
51
67
  else {
52
- let hex = color.trim().replace('#', '');
68
+ let hex = color.trim().replace('#', '')
53
69
  if (hex.length <= 6) {
54
- hex = 'FF' + hex.padStart(6, '0');
70
+ hex = 'FF' + hex.padStart(6, '0')
55
71
  }
56
- assertedColor = parseInt(hex, 16);
57
- return assertedColor;
72
+ assertedColor = parseInt(hex, 16)
73
+ return assertedColor
58
74
  }
59
- };
60
- export const prepareWAMessageMedia = async (message, options) => {
61
- const logger = options.logger;
62
- let mediaType;
63
- for (const key of MEDIA_KEYS) {
75
+ }
76
+
77
+ const prepareWAMessageMedia = async (message, options) => {
78
+ const logger = options.logger
79
+ let mediaType
80
+
81
+ for (const key of Defaults_1.MEDIA_KEYS) {
64
82
  if (key in message) {
65
- mediaType = key;
83
+ mediaType = key
66
84
  }
67
85
  }
86
+
68
87
  if (!mediaType) {
69
- throw new Boom('Invalid media type', { statusCode: 400 });
88
+ throw new boom_1.Boom('Invalid media type', { statusCode: 400 })
70
89
  }
90
+
71
91
  const uploadData = {
72
92
  ...message,
73
93
  media: message[mediaType]
74
- };
75
- delete uploadData[mediaType];
94
+ }
95
+
96
+ delete uploadData[mediaType]
97
+
76
98
  // check if cacheable + generate cache key
77
99
  const cacheableKey = typeof uploadData.media === 'object' &&
78
- 'url' in uploadData.media &&
100
+ ('url' in uploadData.media) &&
79
101
  !!uploadData.media.url &&
80
- !!options.mediaCache &&
81
- mediaType + ':' + uploadData.media.url.toString();
102
+ !!options.mediaCache && (
103
+ // generate the key
104
+ mediaType + ':' + uploadData.media.url.toString())
105
+
82
106
  if (mediaType === 'document' && !uploadData.fileName) {
83
- uploadData.fileName = 'file';
107
+ uploadData.fileName = 'file'
84
108
  }
109
+
85
110
  if (!uploadData.mimetype) {
86
- uploadData.mimetype = MIMETYPE_MAP[mediaType];
111
+ uploadData.mimetype = MIMETYPE_MAP[mediaType]
87
112
  }
113
+
114
+ // check for cache hit
88
115
  if (cacheableKey) {
89
- const mediaBuff = await options.mediaCache.get(cacheableKey);
116
+ const mediaBuff = options.mediaCache.get(cacheableKey)
90
117
  if (mediaBuff) {
91
- logger?.debug({ cacheableKey }, 'got media cache hit');
92
- const obj = proto.Message.decode(mediaBuff);
93
- const key = `${mediaType}Message`;
94
- Object.assign(obj[key], { ...uploadData, media: undefined });
95
- return obj;
96
- }
97
- }
98
- const isNewsletter = !!options.jid && isJidNewsletter(options.jid);
99
- if (isNewsletter) {
100
- logger?.info({ key: cacheableKey }, 'Preparing raw media for newsletter');
101
- const { filePath, fileSha256, fileLength } = await getRawMediaUploadData(uploadData.media, options.mediaTypeOverride || mediaType, logger);
102
- const fileSha256B64 = fileSha256.toString('base64');
103
- const { mediaUrl, directPath } = await options.upload(filePath, {
104
- fileEncSha256B64: fileSha256B64,
105
- mediaType: mediaType,
106
- timeoutMs: options.mediaUploadTimeoutMs
107
- });
108
- await fs.unlink(filePath);
109
- const obj = WAProto.Message.fromObject({
110
- // todo: add more support here
111
- [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
112
- url: mediaUrl,
113
- directPath,
114
- fileSha256,
115
- fileLength,
116
- ...uploadData,
117
- media: undefined
118
- })
119
- });
120
- if (uploadData.ptv) {
121
- obj.ptvMessage = obj.videoMessage;
122
- delete obj.videoMessage;
123
- }
124
- if (obj.stickerMessage) {
125
- obj.stickerMessage.stickerSentTs = Date.now();
126
- }
127
- if (cacheableKey) {
128
- logger?.debug({ cacheableKey }, 'set cache');
129
- await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
130
- }
131
- return obj;
132
- }
133
- const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
134
- const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
135
- const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
136
- const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
137
- const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
138
- const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await encryptedStream(uploadData.media, options.mediaTypeOverride || mediaType, {
118
+ logger?.debug({ cacheableKey }, 'got media cache hit')
119
+ const obj = Types_1.WAProto.Message.decode(mediaBuff)
120
+ const key = `${mediaType}Message`
121
+ Object.assign(obj[key], { ...uploadData, media: undefined })
122
+ return obj
123
+ }
124
+ }
125
+
126
+ const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined'
127
+ const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
128
+ (typeof uploadData['jpegThumbnail'] === 'undefined')
129
+ const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true
130
+ const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true
131
+ const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation
132
+
133
+ const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
139
134
  logger,
140
135
  saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
141
136
  opts: options.options
142
- });
143
- const fileEncSha256B64 = fileEncSha256.toString('base64');
144
- const [{ mediaUrl, directPath }] = await Promise.all([
137
+ })
138
+
139
+ // url safe Base64 encode the SHA256 hash of the body
140
+ const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 ? fileEncSha256 : fileSha256).toString('base64')
141
+
142
+ const [{ mediaUrl, directPath, handle }] = await Promise.all([
145
143
  (async () => {
146
- const result = await options.upload(encFilePath, {
147
- fileEncSha256B64,
148
- mediaType,
149
- timeoutMs: options.mediaUploadTimeoutMs
150
- });
151
- logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
152
- return result;
144
+ const result = await options.upload(encFilePath, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs })
145
+ logger?.debug({ mediaType, cacheableKey }, 'uploaded media')
146
+
147
+ return result
153
148
  })(),
154
149
  (async () => {
155
150
  try {
156
151
  if (requiresThumbnailComputation) {
157
- const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options);
158
- uploadData.jpegThumbnail = thumbnail;
152
+ const { thumbnail, originalImageDimensions } = await messages_media_1.generateThumbnail(originalFilePath, mediaType, options)
153
+ uploadData.jpegThumbnail = thumbnail
154
+
159
155
  if (!uploadData.width && originalImageDimensions) {
160
- uploadData.width = originalImageDimensions.width;
161
- uploadData.height = originalImageDimensions.height;
162
- logger?.debug('set dimensions');
156
+ uploadData.width = originalImageDimensions.width
157
+ uploadData.height = originalImageDimensions.height
158
+ logger?.debug('set dimensions')
163
159
  }
164
- logger?.debug('generated thumbnail');
160
+ logger?.debug('generated thumbnail')
165
161
  }
162
+
166
163
  if (requiresDurationComputation) {
167
- uploadData.seconds = await getAudioDuration(originalFilePath);
168
- logger?.debug('computed audio duration');
164
+ uploadData.seconds = await messages_media_1.getAudioDuration(originalFilePath)
165
+ logger?.debug('computed audio duration')
169
166
  }
167
+
170
168
  if (requiresWaveformProcessing) {
171
- uploadData.waveform = await getAudioWaveform(originalFilePath, logger);
172
- logger?.debug('processed waveform');
169
+ uploadData.waveform = await messages_media_1.getAudioWaveform(originalFilePath, logger)
170
+ logger?.debug('processed waveform')
173
171
  }
172
+
174
173
  if (requiresAudioBackground) {
175
- uploadData.backgroundArgb = await assertColor(options.backgroundColor);
176
- logger?.debug('computed backgroundColor audio status');
174
+ uploadData.backgroundArgb = await assertColor(options.backgroundColor)
175
+ logger?.debug('computed backgroundColor audio status')
177
176
  }
178
177
  }
178
+
179
179
  catch (error) {
180
- logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
180
+ logger?.warn({ trace: error.stack }, 'failed to obtain extra info')
181
181
  }
182
- })()
182
+ })(),
183
183
  ]).finally(async () => {
184
184
  try {
185
- await fs.unlink(encFilePath);
185
+ await fs_1.promises.unlink(encFilePath)
186
186
  if (originalFilePath) {
187
- await fs.unlink(originalFilePath);
187
+ await fs_1.promises.unlink(originalFilePath)
188
188
  }
189
- logger?.debug('removed tmp files');
189
+ logger?.debug('removed tmp files')
190
190
  }
191
191
  catch (error) {
192
- logger?.warn('failed to remove tmp file');
192
+ logger?.warn('failed to remove tmp file')
193
193
  }
194
- });
195
- const obj = WAProto.Message.fromObject({
194
+ })
195
+ const obj = Types_1.WAProto.Message.fromObject({
196
196
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
197
- url: mediaUrl,
197
+ url: handle ? undefined : mediaUrl,
198
198
  directPath,
199
- mediaKey,
200
- fileEncSha256,
199
+ mediaKey: mediaKey,
200
+ fileEncSha256: fileEncSha256,
201
201
  fileSha256,
202
202
  fileLength,
203
- mediaKeyTimestamp: unixTimestampSeconds(),
203
+ mediaKeyTimestamp: handle ? undefined : generics_1.unixTimestampSeconds(),
204
204
  ...uploadData,
205
205
  media: undefined
206
206
  })
207
- });
207
+ })
208
+
208
209
  if (uploadData.ptv) {
209
- obj.ptvMessage = obj.videoMessage;
210
- delete obj.videoMessage;
210
+ obj.ptvMessage = obj.videoMessage
211
+ delete obj.videoMessage
211
212
  }
213
+
212
214
  if (cacheableKey) {
213
- logger?.debug({ cacheableKey }, 'set cache');
214
- await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
215
+ logger?.debug({ cacheableKey }, 'set cache')
216
+ options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish())
215
217
  }
216
- return obj;
217
- };
218
- export const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
219
- ephemeralExpiration = ephemeralExpiration || 0;
218
+
219
+ return obj
220
+ }
221
+
222
+ const prepareDisappearingMessageSettingContent = (expiration) => {
220
223
  const content = {
221
224
  ephemeralMessage: {
222
225
  message: {
223
226
  protocolMessage: {
224
- type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
225
- ephemeralExpiration
227
+ type: Types_1.WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
228
+ ephemeralExpiration: expiration ? expiration : 0
226
229
  }
227
230
  }
228
231
  }
229
- };
230
- return WAProto.Message.fromObject(content);
231
- };
232
+ }
233
+
234
+ return Types_1.WAProto.Message.fromObject(content)
235
+ }
236
+
232
237
  /**
233
238
  * Generate forwarded message content like WA does
234
239
  * @param message the message to forward
235
240
  * @param options.forceForward will show the message as forwarded even if it is from you
236
241
  */
237
- export const generateForwardMessageContent = (message, forceForward) => {
238
- let content = message.message;
242
+ const generateForwardMessageContent = (message, forceForward) => {
243
+ let content = message.message
244
+
239
245
  if (!content) {
240
- throw new Boom('no content in message', { statusCode: 400 });
246
+ throw new boom_1.Boom('no content in message', { statusCode: 400 })
241
247
  }
248
+
242
249
  // hacky copy
243
- content = normalizeMessageContent(content);
244
- content = proto.Message.decode(proto.Message.encode(content).finish());
245
- let key = Object.keys(content)[0];
246
- let score = content?.[key]?.contextInfo?.forwardingScore || 0;
247
- score += message.key.fromMe && !forceForward ? 0 : 1;
250
+ content = normalizeMessageContent(content)
251
+ content = WAProto_1.proto.Message.decode(WAProto_1.proto.Message.encode(content).finish())
252
+
253
+ let key = Object.keys(content)[0]
254
+ let score = content[key].contextInfo?.forwardingScore || 0
255
+
256
+ if (forceForward) score += forceForward ? forceForward : 1
257
+
248
258
  if (key === 'conversation') {
249
- content.extendedTextMessage = { text: content[key] };
250
- delete content.conversation;
251
- key = 'extendedTextMessage';
259
+ content.extendedTextMessage = { text: content[key] }
260
+ delete content.conversation
261
+ key = 'extendedTextMessage'
252
262
  }
253
- const key_ = content?.[key];
263
+
254
264
  if (score > 0) {
255
- key_.contextInfo = { forwardingScore: score, isForwarded: true };
265
+ content[key].contextInfo = { forwardingScore: score, isForwarded: true }
256
266
  }
267
+
257
268
  else {
258
- key_.contextInfo = {};
269
+ content[key].contextInfo = {}
259
270
  }
260
- return content;
261
- };
262
- export const generateWAMessageContent = async (message, options) => {
263
- var _a, _b;
264
- let m = {};
271
+
272
+ return content
273
+ }
274
+
275
+ const generateWAMessageContent = async (message, options) => {
276
+ let m = {}
265
277
  if ('text' in message) {
266
- const extContent = { text: message.text };
267
- let urlInfo = message.linkPreview;
278
+ const extContent = { text: message.text }
279
+ let urlInfo = message.linkPreview
280
+
268
281
  if (typeof urlInfo === 'undefined') {
269
- urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
282
+ urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger)
270
283
  }
284
+
271
285
  if (urlInfo) {
272
- extContent.matchedText = urlInfo['matched-text'];
273
- extContent.jpegThumbnail = urlInfo.jpegThumbnail;
274
- extContent.description = urlInfo.description;
275
- extContent.title = urlInfo.title;
276
- extContent.previewType = 0;
277
- const img = urlInfo.highQualityThumbnail;
286
+ extContent.canonicalUrl = urlInfo['canonical-url']
287
+ extContent.matchedText = urlInfo['matched-text']
288
+ extContent.jpegThumbnail = urlInfo.jpegThumbnail
289
+ extContent.description = urlInfo.description
290
+ extContent.title = urlInfo.title
291
+ extContent.previewType = 0
292
+ const img = urlInfo.highQualityThumbnail
293
+
278
294
  if (img) {
279
- extContent.thumbnailDirectPath = img.directPath;
280
- extContent.mediaKey = img.mediaKey;
281
- extContent.mediaKeyTimestamp = img.mediaKeyTimestamp;
282
- extContent.thumbnailWidth = img.width;
283
- extContent.thumbnailHeight = img.height;
284
- extContent.thumbnailSha256 = img.fileSha256;
285
- extContent.thumbnailEncSha256 = img.fileEncSha256;
295
+ extContent.thumbnailDirectPath = img.directPath
296
+ extContent.mediaKey = img.mediaKey
297
+ extContent.mediaKeyTimestamp = img.mediaKeyTimestamp
298
+ extContent.thumbnailWidth = img.width
299
+ extContent.thumbnailHeight = img.height
300
+ extContent.thumbnailSha256 = img.fileSha256
301
+ extContent.thumbnailEncSha256 = img.fileEncSha256
286
302
  }
287
303
  }
304
+
288
305
  if (options.backgroundColor) {
289
- extContent.backgroundArgb = await assertColor(options.backgroundColor);
306
+ extContent.backgroundArgb = await assertColor(options.backgroundColor)
290
307
  }
308
+
309
+ if (options.textColor) {
310
+ extContent.textArgb = await assertColor(options.textColor)
311
+ }
312
+
291
313
  if (options.font) {
292
- extContent.font = options.font;
314
+ extContent.font = options.font
293
315
  }
294
- m.extendedTextMessage = extContent;
316
+
317
+ extContent.contextInfo = {
318
+ ...(message.contextInfo || {}),
319
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
320
+ }
321
+
322
+ m.extendedTextMessage = extContent
295
323
  }
324
+
296
325
  else if ('contacts' in message) {
297
- const contactLen = message.contacts.contacts.length;
326
+ const contactLen = message.contacts.contacts.length
327
+
328
+ let contactMessage
329
+
298
330
  if (!contactLen) {
299
- throw new Boom('require atleast 1 contact', { statusCode: 400 });
331
+ throw new boom_1.Boom('require atleast 1 contact', { statusCode: 400 })
300
332
  }
333
+
301
334
  if (contactLen === 1) {
302
- m.contactMessage = WAProto.Message.ContactMessage.create(message.contacts.contacts[0]);
335
+ contactMessage = {
336
+ contactMessage: Types_1.WAProto.Message.ContactMessage.fromObject(message.contacts.contacts[0])
337
+ }
303
338
  }
339
+
304
340
  else {
305
- m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.create(message.contacts);
341
+ contactMessage = {
342
+ contactsArrayMessage: Types_1.WAProto.Message.ContactsArrayMessage.fromObject(message.contacts)
343
+ }
344
+ }
345
+
346
+ const [type] = Object.keys(contactMessage)
347
+
348
+ contactMessage[type].contextInfo = {
349
+ ...(message.contextInfo || {}),
350
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
306
351
  }
352
+
353
+ m = contactMessage
307
354
  }
355
+
308
356
  else if ('location' in message) {
309
- m.locationMessage = WAProto.Message.LocationMessage.create(message.location);
357
+ let locationMessage
358
+
359
+ if (message.live) {
360
+ locationMessage = {
361
+ liveLocationMessage: Types_1.WAProto.Message.LiveLocationMessage.fromObject(message.location)
362
+ }
363
+ }
364
+
365
+ else {
366
+ locationMessage = {
367
+ locationMessage: Types_1.WAProto.Message.LocationMessage.fromObject(message.location)
368
+ }
369
+ }
370
+
371
+ const [type] = Object.keys(locationMessage)
372
+
373
+ locationMessage[type].contextInfo = {
374
+ ...(message.contextInfo || {}),
375
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
376
+ }
377
+
378
+ m = locationMessage
310
379
  }
380
+
311
381
  else if ('react' in message) {
312
382
  if (!message.react.senderTimestampMs) {
313
- message.react.senderTimestampMs = Date.now();
383
+ message.react.senderTimestampMs = Date.now()
314
384
  }
315
- m.reactionMessage = WAProto.Message.ReactionMessage.create(message.react);
385
+
386
+ m.reactionMessage = Types_1.WAProto.Message.ReactionMessage.fromObject(message.react)
316
387
  }
388
+
317
389
  else if ('delete' in message) {
318
390
  m.protocolMessage = {
319
391
  key: message.delete,
320
- type: WAProto.Message.ProtocolMessage.Type.REVOKE
321
- };
322
- }
392
+ type: Types_1.WAProto.Message.ProtocolMessage.Type.REVOKE
393
+ }
394
+ }
395
+
323
396
  else if ('forward' in message) {
324
- m = generateForwardMessageContent(message.forward, message.force);
397
+ const mess = generateForwardMessageContent(message.forward, message.force)
398
+ const [type] = Object.keys(mess)
399
+
400
+ mess[type].contextInfo = {
401
+ ...(message.contextInfo || {}),
402
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
403
+ }
404
+
405
+ m = mess
325
406
  }
407
+
326
408
  else if ('disappearingMessagesInChat' in message) {
327
- const exp = typeof message.disappearingMessagesInChat === 'boolean'
328
- ? message.disappearingMessagesInChat
329
- ? WA_DEFAULT_EPHEMERAL
330
- : 0
331
- : message.disappearingMessagesInChat;
332
- m = prepareDisappearingMessageSettingContent(exp);
409
+ const exp = typeof message.disappearingMessagesInChat === 'boolean' ?
410
+ (message.disappearingMessagesInChat ? Defaults_1.WA_DEFAULT_EPHEMERAL : 0) :
411
+ message.disappearingMessagesInChat
412
+ m = prepareDisappearingMessageSettingContent(exp)
333
413
  }
414
+
334
415
  else if ('groupInvite' in message) {
335
- m.groupInviteMessage = {};
336
- m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
337
- m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
338
- m.groupInviteMessage.caption = message.groupInvite.text;
339
- m.groupInviteMessage.groupJid = message.groupInvite.jid;
340
- m.groupInviteMessage.groupName = message.groupInvite.subject;
341
- //TODO: use built-in interface and get disappearing mode info etc.
342
- //TODO: cache / use store!?
416
+ m.messageContextInfo = {}
417
+ m.groupInviteMessage = {}
418
+
419
+ m.groupInviteMessage.inviteCode = message.groupInvite.code
420
+ m.groupInviteMessage.inviteExpiration = message.groupInvite.expiration
421
+ m.groupInviteMessage.caption = message.groupInvite.caption
422
+ m.groupInviteMessage.groupJid = message.groupInvite.jid
423
+ m.groupInviteMessage.groupName = message.groupInvite.name
424
+ m.groupInviteMessage.contextInfo = message.contextInfo
425
+
343
426
  if (options.getProfilePicUrl) {
344
- const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
345
- if (pfpUrl) {
346
- const resp = await fetch(pfpUrl, { method: 'GET', dispatcher: options?.options?.dispatcher });
347
- if (resp.ok) {
348
- const buf = Buffer.from(await resp.arrayBuffer());
349
- m.groupInviteMessage.jpegThumbnail = buf;
350
- }
351
- }
427
+ const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid)
428
+ const { thumbnail } = await messages_media_1.generateThumbnail(pfpUrl, 'image')
429
+ m.groupInviteMessage.jpegThumbnail = thumbnail
430
+ }
431
+
432
+ m.groupInviteMessage.contextInfo = {
433
+ ...(message.contextInfo || {}),
434
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
435
+ }
436
+ }
437
+
438
+ else if ('adminInvite' in message) {
439
+ m.messageContextInfo = {}
440
+ m.newsletterAdminInviteMessage = {}
441
+
442
+ m.newsletterAdminInviteMessage.newsletterJid = message.adminInvite.jid
443
+ m.newsletterAdminInviteMessage.newsletterName= message.adminInvite.name
444
+ m.newsletterAdminInviteMessage.caption = message.adminInvite.caption
445
+ m.newsletterAdminInviteMessage.inviteExpiration = message.adminInvite.expiration
446
+ m.newsletterAdminInviteMessage.contextInfo = message.contextInfo
447
+
448
+ if (options.getProfilePicUrl) {
449
+ const pfpUrl = await options.getProfilePicUrl(message.adminInvite.jid)
450
+ const { thumbnail } = await messages_media_1.generateThumbnail(pfpUrl, 'image')
451
+ m.newsletterAdminInviteMessage.jpegThumbnail = thumbnail
352
452
  }
453
+
454
+ m.newsletterAdminInviteMessage.contextInfo = {
455
+ ...(message.contextInfo || {}),
456
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
457
+ }
458
+ }
459
+
460
+ else if ('pin' in message) {
461
+ m.pinInChatMessage = {}
462
+ m.messageContextInfo = {}
463
+
464
+ m.pinInChatMessage.key = message.pin.key
465
+ m.pinInChatMessage.type = message.pin?.type || 1
466
+ m.pinInChatMessage.senderTimestampMs = message.pin?.time || Date.now()
467
+ m.messageContextInfo.messageAddOnDurationInSecs = message.pin.type === 1 ? message.pin.time || 86400 : 0
468
+ m.messageContextInfo.messageAddOnExpiryType = WAProto_1.proto.MessageContextInfo.MessageAddonExpiryType.STATIC
353
469
  }
354
- else if ('pin' in message) {
355
- m.pinInChatMessage = {};
356
- m.messageContextInfo = {};
357
- m.pinInChatMessage.key = message.pin;
358
- m.pinInChatMessage.type = message.type;
359
- m.pinInChatMessage.senderTimestampMs = Date.now();
360
- m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
470
+
471
+ else if ('keep' in message) {
472
+ m.keepInChatMessage = {}
473
+
474
+ m.keepInChatMessage.key = message.keep.key
475
+ m.keepInChatMessage.keepType = message.keep?.type || 1
476
+ m.keepInChatMessage.timestampMs = message.keep?.time || Date.now()
477
+ }
478
+
479
+ else if ('call' in message) {
480
+ m.messageContextInfo = {}
481
+ m.scheduledCallCreationMessage = {}
482
+
483
+ m.scheduledCallCreationMessage.scheduledTimestampMs = message.call?.time || Date.now()
484
+ m.scheduledCallCreationMessage.callType = message.call?.type || 1
485
+ m.scheduledCallCreationMessage.title = message.call?.name || 'Call Creation'
486
+
487
+ m.scheduledCallCreationMessage.contextInfo = {
488
+ ...(message.contextInfo || {}),
489
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
490
+ }
361
491
  }
492
+
493
+ else if ('paymentInvite' in message) {
494
+ m.messageContextInfo = {}
495
+ m.paymentInviteMessage = {}
496
+
497
+ m.paymentInviteMessage.expiryTimestamp = message.paymentInvite?.expiry || 0
498
+ m.paymentInviteMessage.serviceType = message.paymentInvite?.type || 2
499
+
500
+ m.paymentInviteMessage.contextInfo = {
501
+ ...(message.contextInfo || {}),
502
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
503
+ }
504
+ }
505
+
362
506
  else if ('buttonReply' in message) {
363
507
  switch (message.type) {
508
+ case 'list':
509
+ m.listResponseMessage = {
510
+ title: message.buttonReply.title,
511
+ description: message.buttonReply.description,
512
+ singleSelectReply: {
513
+ selectedRowId: message.buttonReply.rowId
514
+ },
515
+ lisType: WAProto_1.proto.Message.ListResponseMessage.ListType.SINGLE_SELECT
516
+ }
517
+ break
364
518
  case 'template':
365
519
  m.templateButtonReplyMessage = {
366
520
  selectedDisplayText: message.buttonReply.displayText,
367
521
  selectedId: message.buttonReply.id,
368
522
  selectedIndex: message.buttonReply.index
369
- };
370
- break;
523
+ }
524
+ break
371
525
  case 'plain':
372
526
  m.buttonsResponseMessage = {
373
527
  selectedButtonId: message.buttonReply.id,
374
528
  selectedDisplayText: message.buttonReply.displayText,
375
- type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
376
- };
377
- break;
529
+ type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
530
+ }
531
+ break
532
+ case 'interactive':
533
+ m.interactiveResponseMessage = {
534
+ body: {
535
+ text: message.buttonReply.displayText,
536
+ format: WAProto_1.proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1
537
+ },
538
+ nativeFlowResponseMessage: {
539
+ name: message.buttonReply.nativeFlows.name,
540
+ paramsJson: message.buttonReply.nativeFlows.paramsJson,
541
+ version: message.buttonReply.nativeFlows.version
542
+ }
543
+ }
544
+ break
378
545
  }
379
546
  }
547
+
380
548
  else if ('ptv' in message && message.ptv) {
381
- const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
382
- m.ptvMessage = videoMessage;
549
+ const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options)
550
+
551
+ m.ptvMessage = videoMessage
552
+ }
553
+
554
+ else if ('order' in message) {
555
+ m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject(message.order)
556
+
557
+ m.orderMessage.contextInfo = {
558
+ ...(message.contextInfo || {}),
559
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
560
+ }
383
561
  }
562
+
563
+ else if ('event' in message) {
564
+ m.eventMessage = Types_1.WAProto.Message.EventMessage.fromObject(message.event)
565
+
566
+ if (!message.event.startTime) {
567
+ m.eventMessage.startTime = generics_1.unixTimestampSeconds()
568
+ }
569
+
570
+ m.eventMessage.contextInfo = {
571
+ ...(message.contextInfo || {}),
572
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
573
+ }
574
+ }
575
+
384
576
  else if ('product' in message) {
385
- const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
386
- m.productMessage = WAProto.Message.ProductMessage.create({
577
+ const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options)
578
+
579
+ m.productMessage = Types_1.WAProto.Message.ProductMessage.fromObject({
387
580
  ...message,
388
581
  product: {
389
582
  ...message.product,
390
- productImage: imageMessage
583
+ productImage: imageMessage,
391
584
  }
392
- });
393
- }
394
- else if ('listReply' in message) {
395
- m.listResponseMessage = { ...message.listReply };
396
- }
397
- else if ('event' in message) {
398
- m.eventMessage = {};
399
- const startTime = Math.floor(message.event.startDate.getTime() / 1000);
400
- if (message.event.call && options.getCallLink) {
401
- const token = await options.getCallLink(message.event.call, { startTime });
402
- m.eventMessage.joinLink = (message.event.call === 'audio' ? CALL_AUDIO_PREFIX : CALL_VIDEO_PREFIX) + token;
403
- }
404
- m.messageContextInfo = {
405
- // encKey
406
- messageSecret: message.event.messageSecret || randomBytes(32)
407
- };
408
- m.eventMessage.name = message.event.name;
409
- m.eventMessage.description = message.event.description;
410
- m.eventMessage.startTime = startTime;
411
- m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
412
- m.eventMessage.isCanceled = message.event.isCancelled ?? false;
413
- m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
414
- m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
415
- m.eventMessage.location = message.event.location;
585
+ })
586
+
587
+ m.productMessage.contextInfo = {
588
+ ...(message.contextInfo || {}),
589
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
590
+ }
416
591
  }
592
+
593
+ else if ('pollResult' in message) {
594
+ if (!Array.isArray(message.pollResult.values)) {
595
+ throw new boom_1.Boom('Invalid pollResult values', { statusCode: 400 })
596
+ }
597
+
598
+ const pollResultSnapshotMessage = {
599
+ name: message.pollResult.name,
600
+ pollVotes: message.pollResult.values.map(([optionName, optionVoteCount]) => ({
601
+ optionName,
602
+ optionVoteCount
603
+ }))
604
+ }
605
+
606
+ pollResultSnapshotMessage.contextInfo = {
607
+ ...(message.contextInfo || {}),
608
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
609
+ }
610
+
611
+ m.pollResultSnapshotMessage = pollResultSnapshotMessage
612
+ }
613
+
417
614
  else if ('poll' in message) {
418
- (_a = message.poll).selectableCount || (_a.selectableCount = 0);
419
- (_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
420
615
  if (!Array.isArray(message.poll.values)) {
421
- throw new Boom('Invalid poll values', { statusCode: 400 });
616
+ throw new boom_1.Boom('Invalid poll values', { statusCode: 400 })
422
617
  }
423
- if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
424
- throw new Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
425
- statusCode: 400
426
- });
618
+
619
+ if (message.poll.selectableCount < 0
620
+ || message.poll.selectableCount > message.poll.values.length) {
621
+ throw new boom_1.Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, { statusCode: 400 })
427
622
  }
428
- m.messageContextInfo = {
429
- // encKey
430
- messageSecret: message.poll.messageSecret || randomBytes(32)
431
- };
623
+
432
624
  const pollCreationMessage = {
433
625
  name: message.poll.name,
434
- selectableOptionsCount: message.poll.selectableCount,
435
- options: message.poll.values.map(optionName => ({ optionName }))
436
- };
437
- if (message.poll.toAnnouncementGroup) {
438
- // poll v2 is for community announcement groups (single select and multiple)
439
- m.pollCreationMessageV2 = pollCreationMessage;
626
+ selectableOptionsCount: message.poll?.selectableCount || 0,
627
+ options: message.poll.values.map(optionName => ({ optionName })),
628
+ }
629
+
630
+ pollCreationMessage.contextInfo = {
631
+ ...(message.contextInfo || {}),
632
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
633
+ }
634
+
635
+ if(message.poll?.toAnnouncementGroup) {
636
+ m.pollCreationMessageV2 = pollCreationMessage
637
+ } else {
638
+ if(message.poll.selectableCount > 0) {
639
+ m.pollCreationMessageV3 = pollCreationMessage
640
+ } else {
641
+ m.pollCreationMessage = pollCreationMessage
642
+ }
643
+ }
644
+ }
645
+
646
+ else if ('payment' in message) {
647
+ const requestPaymentMessage = {
648
+ amount: {
649
+ currencyCode: message.payment?.currency || 'IDR',
650
+ offset: message.payment?.offset || 0,
651
+ value: message.payment?.amount || 999999999
652
+ },
653
+ expiryTimestamp: message.payment?.expiry || 0,
654
+ amount1000: message.payment?.amount || 999999999 * 1000,
655
+ currencyCodeIso4217: message.payment?.currency || 'IDR',
656
+ requestFrom: message.payment?.from || '0@s.whatsapp.net',
657
+ noteMessage: {
658
+ extendedTextMessage: {
659
+ text: message.payment?.note || 'Notes'
660
+ }
661
+ },
662
+ background: {
663
+ placeholderArgb: message.payment?.image?.placeholderArgb || 4278190080,
664
+ textArgb: message.payment?.image?.textArgb || 4294967295,
665
+ subtextArgb: message.payment?.image?.subtextArgb || 4294967295,
666
+ type: 1
667
+ }
668
+ }
669
+
670
+ requestPaymentMessage.noteMessage.extendedTextMessage.contextInfo = {
671
+ ...(message.contextInfo || {}),
672
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
440
673
  }
441
- else {
442
- if (message.poll.selectableCount === 1) {
443
- //poll v3 is for single select polls
444
- m.pollCreationMessageV3 = pollCreationMessage;
445
- }
446
- else {
447
- // poll for multiple choice polls
448
- m.pollCreationMessage = pollCreationMessage;
449
- }
674
+
675
+ m.requestPaymentMessage = requestPaymentMessage
676
+ }
677
+
678
+ else if ('stickerPack' in message) {
679
+ const { stickers, cover, name, publisher, packId, description } = message.stickerPack
680
+
681
+ const coverBuffer = await messages_media_1.toBuffer((await messages_media_1.getStream(cover)).stream)
682
+ const imageDataHash = crypto_2.sha256(coverBuffer).toString('base64')
683
+
684
+ const [coverUploadResult, ...stickerUploadResults] = await Promise.all([
685
+ prepareWAMessageMedia({ image: coverBuffer }, { ...options, mediaTypeOverride: 'image' }),
686
+ ...stickers.map(s => prepareWAMessageMedia({ sticker: s.data }, { ...options, mediaTypeOverride: 'sticker' }))
687
+ ])
688
+
689
+ const stickerPackId = packId || generics_1.generateMessageID()
690
+ const coverImage = coverUploadResult.imageMessage
691
+
692
+ const stickerPackSize = stickerUploadResults.reduce((acc, s) => acc + (s.stickerMessage?.fileLength ? +s.stickerMessage.fileLength : 0), 0)
693
+
694
+ m.stickerPackMessage = {
695
+ name,
696
+ publisher,
697
+ stickerPackId,
698
+ packDescription: description,
699
+ stickerPackOrigin: WAProto_1.proto.Message.StickerPackMessage.StickerPackOrigin.THIRD_PARTY,
700
+ stickerPackSize,
701
+ stickers: stickerUploadResults.map((uploadResult, i) => {
702
+ const stickerMsg = uploadResult.stickerMessage
703
+ const fileSha256B64 = Buffer.from(stickerMsg.fileSha256).toString('base64')
704
+
705
+ return {
706
+ fileName: `${fileSha256B64}.webp`,
707
+ mimetype: stickerMsg.mimetype,
708
+ isAnimated: stickerMsg.isAnimated,
709
+ emojis: stickers[i].emojis || [],
710
+ accessibilityLabel: stickers[i].accessibilityLabel
711
+ }
712
+ }),
713
+ fileSha256: coverImage.fileSha256,
714
+ fileEncSha256: coverImage.fileEncSha256,
715
+ mediaKey: coverImage.mediaKey,
716
+ directPath: coverImage.directPath,
717
+ fileLength: coverImage.fileLength,
718
+ mediaKeyTimestamp: coverImage.mediaKeyTimestamp,
719
+ trayIconFileName: `${stickerPackId}.png`,
720
+ imageDataHash,
721
+ thumbnailDirectPath: coverImage.directPath,
722
+ thumbnailFileSha256: coverImage.fileSha256,
723
+ thumbnailFileEncSha256: coverImage.fileEncSha256,
724
+ thumbnailHeight: coverImage.height,
725
+ thumbnailWidth: coverImage.width
726
+ }
727
+
728
+ m.stickerPackMessage.contextInfo = {
729
+ ...(message.contextInfo || {}),
730
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
450
731
  }
451
- }
452
- else if ('sharePhoneNumber' in message) {
732
+ }
733
+
734
+ else if ('sharePhoneNumber' in message) {
453
735
  m.protocolMessage = {
454
- type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
455
- };
736
+ type: Types_1.WAProto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
737
+ }
456
738
  }
739
+
457
740
  else if ('requestPhoneNumber' in message) {
458
- m.requestPhoneNumberMessage = {};
741
+ m.requestPhoneNumberMessage = {}
459
742
  }
460
- else if ('limitSharing' in message) {
461
- m.protocolMessage = {
462
- type: proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
463
- limitSharing: {
464
- sharingLimited: message.limitSharing === true,
465
- trigger: 1,
466
- limitSharingSettingTimestamp: Date.now(),
467
- initiatedByMe: true
743
+
744
+ else {
745
+ const mess = await prepareWAMessageMedia(message, options)
746
+ const [type] = Object.keys(mess)
747
+
748
+ mess[type].contextInfo = {
749
+ ...(message.contextInfo || {}),
750
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
751
+ }
752
+
753
+ m = mess
754
+ }
755
+
756
+ if ('sections' in message && !!message.sections) {
757
+ const listMessage = {
758
+ title: message.title,
759
+ buttonText: message.buttonText,
760
+ footerText: message.footer,
761
+ description: message.text,
762
+ sections: message.sections,
763
+ listType: WAProto_1.proto.Message.ListMessage.ListType.SINGLE_SELECT
764
+ }
765
+
766
+ listMessage.contextInfo = {
767
+ ...(message.contextInfo || {}),
768
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
769
+ }
770
+
771
+ m = { listMessage }
772
+ }
773
+
774
+ else if ('productList' in message && !!message.productList) {
775
+ const thumbnail = message.thumbnail ? await messages_media_1.generateThumbnail(message.thumbnail, 'image') : null
776
+
777
+ const listMessage = {
778
+ title: message.title,
779
+ buttonText: message.buttonText,
780
+ footerText: message.footer,
781
+ description: message.text,
782
+ productListInfo: {
783
+ productSections: message.productList,
784
+ headerImage: {
785
+ productId: message.productList[0].products[0].productId,
786
+ jpegThumbnail: thumbnail?.thumbnail || null
787
+ },
788
+ businessOwnerJid: message.businessOwnerJid
789
+ },
790
+ listType: WAProto_1.proto.Message.ListMessage.ListType.PRODUCT_LIST
791
+ }
792
+
793
+ listMessage.contextInfo = {
794
+ ...(message.contextInfo || {}),
795
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
796
+ }
797
+
798
+ m = { listMessage }
799
+ }
800
+
801
+ else if ('buttons' in message && !!message.buttons) {
802
+ const buttonsMessage = {
803
+ buttons: message.buttons.map(b => ({ ...b, type: WAProto_1.proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
804
+ }
805
+
806
+ if ('text' in message) {
807
+ buttonsMessage.contentText = message.text
808
+ buttonsMessage.headerType = WAProto_1.proto.Message.ButtonsMessage.HeaderType.EMPTY
809
+ }
810
+
811
+ else {
812
+ if ('caption' in message) {
813
+ buttonsMessage.contentText = message.caption
468
814
  }
469
- };
815
+
816
+ const type = Object.keys(m)[0].replace('Message', '').toUpperCase()
817
+
818
+ buttonsMessage.headerType = WAProto_1.proto.Message.ButtonsMessage.HeaderType[type]
819
+
820
+ Object.assign(buttonsMessage, m)
821
+ }
822
+
823
+ if ('footer' in message && !!message.footer) {
824
+ buttonsMessage.footerText = message.footer
825
+ }
826
+
827
+ if ('title' in message && !!message.title) {
828
+ buttonsMessage.text = message.title
829
+ buttonsMessage.headerType = WAProto_1.proto.Message.ButtonsMessage.HeaderType.TEXT
830
+ }
831
+
832
+ buttonsMessage.contextInfo = {
833
+ ...(message.contextInfo || {}),
834
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
835
+ }
836
+
837
+ m = { buttonsMessage }
470
838
  }
471
- else {
472
- m = await prepareWAMessageMedia(message, options);
839
+
840
+ else if ('templateButtons' in message && !!message.templateButtons) {
841
+ const hydratedTemplate = {
842
+ hydratedButtons: message.templateButtons
843
+ }
844
+
845
+ if ('text' in message) {
846
+ hydratedTemplate.hydratedContentText = message.text
847
+ }
848
+
849
+ else {
850
+ if ('caption' in message) {
851
+ hydratedTemplate.hydratedContentText = message.caption
852
+ }
853
+
854
+ Object.assign(msg, m)
855
+ }
856
+
857
+ if ('footer' in message && !!message.footer) {
858
+ hydratedTemplate.hydratedFooterText = message.footer
859
+ }
860
+
861
+ hydratedTemplate.contextInfo = {
862
+ ...(message.contextInfo || {}),
863
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
864
+ }
865
+
866
+ m = { templateMessage: { hydratedTemplate }}
473
867
  }
474
- if ('viewOnce' in message && !!message.viewOnce) {
475
- m = { viewOnceMessage: { message: m } };
868
+
869
+ else if ('interactiveButtons' in message && !!message.interactiveButtons) {
870
+ const interactiveMessage = {
871
+ nativeFlowMessage: {
872
+ buttons: message.interactiveButtons
873
+ }
874
+ }
875
+
876
+ if ('text' in message) {
877
+ interactiveMessage.body = {
878
+ text: message.text
879
+ },
880
+ interactiveMessage.header = {
881
+ title: message.title,
882
+ subtitle: message.subtitle,
883
+ hasMediaAttachment: false
884
+ }
885
+ }
886
+
887
+ else {
888
+ if ('caption' in message) {
889
+ interactiveMessage.body = {
890
+ text: message.caption
891
+ }
892
+
893
+ interactiveMessage.header = {
894
+ title: message.title,
895
+ subtitle: message.subtitle,
896
+ hasMediaAttachment: message.hasMediaAttachment ? message.hasMediaAttachment : false,
897
+ ...Object.assign(interactiveMessage, m)
898
+ }
899
+ }
900
+ }
901
+
902
+ if ('footer' in message && !!message.footer) {
903
+ interactiveMessage.footer = {
904
+ text: message.footer
905
+ }
906
+ }
907
+
908
+ interactiveMessage.contextInfo = {
909
+ ...(message.contextInfo || {}),
910
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
911
+ }
912
+
913
+ m = { interactiveMessage }
914
+ }
915
+
916
+ else if ('shop' in message && !!message.shop) {
917
+ const interactiveMessage = {
918
+ shopStorefrontMessage: {
919
+ surface: message.shop.surface,
920
+ id: message.shop.id
921
+ }
922
+ }
923
+
924
+ if ('text' in message) {
925
+ interactiveMessage.body = {
926
+ text: message.text
927
+ },
928
+ interactiveMessage.header = {
929
+ title: message.title,
930
+ subtitle: message.subtitle,
931
+ hasMediaAttachment: false
932
+ }
933
+ }
934
+
935
+ else {
936
+ if ('caption' in message) {
937
+ interactiveMessage.body = {
938
+ text: message.caption
939
+ }
940
+
941
+ interactiveMessage.header = {
942
+ title: message.title,
943
+ subtitle: message.subtitle,
944
+ hasMediaAttachment: message.hasMediaAttachment ? message.hasMediaAttachment : false,
945
+ ...Object.assign(interactiveMessage, m)
946
+ }
947
+ }
948
+ }
949
+
950
+ if ('footer' in message && !!message.footer) {
951
+ interactiveMessage.footer = {
952
+ text: message.footer
953
+ }
954
+ }
955
+
956
+ interactiveMessage.contextInfo = {
957
+ ...(message.contextInfo || {}),
958
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
959
+ }
960
+
961
+ m = { interactiveMessage }
962
+ }
963
+
964
+ else if ('collection' in message && !!message.collection) {
965
+ const interactiveMessage = {
966
+ collectionMessage: {
967
+ bizJid: message.collection.bizJid,
968
+ id: message.collection.id,
969
+ messageVersion: message?.collection?.version
970
+ }
971
+ }
972
+
973
+ if ('text' in message) {
974
+ interactiveMessage.body = {
975
+ text: message.text
976
+ },
977
+ interactiveMessage.header = {
978
+ title: message.title,
979
+ subtitle: message.subtitle,
980
+ hasMediaAttachment: false
981
+ }
982
+ }
983
+
984
+ else {
985
+ if ('caption' in message) {
986
+ interactiveMessage.body = {
987
+ text: message.caption
988
+ }
989
+ interactiveMessage.header = {
990
+ title: message.title,
991
+ subtitle: message.subtitle,
992
+ hasMediaAttachment: message.hasMediaAttachment ? message.hasMediaAttachment : false,
993
+ ...Object.assign(interactiveMessage, m)
994
+ }
995
+ }
996
+ }
997
+
998
+ if ('footer' in message && !message.footer) {
999
+ interactiveMessage.footer = {
1000
+ text: message.footer
1001
+ }
1002
+ }
1003
+
1004
+ interactiveMessage.contextInfo = {
1005
+ ...(message.contextInfo || {}),
1006
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
1007
+ }
1008
+
1009
+ m = { interactiveMessage }
476
1010
  }
477
- if ('mentions' in message && message.mentions?.length) {
478
- const messageType = Object.keys(m)[0];
479
- const key = m[messageType];
480
- if ('contextInfo' in key && !!key.contextInfo) {
481
- key.contextInfo.mentionedJid = message.mentions;
1011
+
1012
+ else if ('cards' in message && !!message.cards) {
1013
+ const slides = await Promise.all(message.cards.map(async (slide) => {
1014
+ const { image, video, product, title, body, footer, buttons } = slide
1015
+ let header
1016
+
1017
+ if (product) {
1018
+ const { imageMessage } = await prepareWAMessageMedia({ image: product.productImage, ...options }, options)
1019
+ header = {
1020
+ productMessage: {
1021
+ product: {
1022
+ ...product,
1023
+ productImage: imageMessage,
1024
+ },
1025
+ ...slide
1026
+ }
1027
+ }
1028
+ }
1029
+
1030
+ else if (image) {
1031
+ header = await prepareWAMessageMedia({ image: image, ...options }, options)
1032
+ }
1033
+
1034
+ else if (video) {
1035
+ header = await prepareWAMessageMedia({ video: video, ...options }, options)
1036
+ }
1037
+
1038
+ const msg = {
1039
+ header: {
1040
+ title,
1041
+ hasMediaAttachment: true,
1042
+ ...header
1043
+ },
1044
+ body: {
1045
+ text: body
1046
+ },
1047
+ footer: {
1048
+ text: footer
1049
+ },
1050
+ nativeFlowMessage: {
1051
+ buttons,
1052
+ }
1053
+ }
1054
+
1055
+ return msg
1056
+ }))
1057
+
1058
+ const interactiveMessage = {
1059
+ carouselMessage: {
1060
+ cards: slides
1061
+ }
1062
+ }
1063
+
1064
+ if ('text' in message) {
1065
+ interactiveMessage.body = {
1066
+ text: message.text
1067
+ },
1068
+ interactiveMessage.header = {
1069
+ title: message.title,
1070
+ subtitle: message.subtitle,
1071
+ hasMediaAttachment: false
1072
+ }
1073
+ }
1074
+
1075
+ if ('footer' in message && !!message.footer) {
1076
+ interactiveMessage.footer = {
1077
+ text: message.footer
1078
+ }
482
1079
  }
483
- else if (key) {
484
- key.contextInfo = {
485
- mentionedJid: message.mentions
486
- };
1080
+
1081
+ interactiveMessage.contextInfo = {
1082
+ ...(message.contextInfo || {}),
1083
+ ...(message.mentions ? { mentionedJid: message.mentions } : {})
487
1084
  }
1085
+
1086
+ m = { interactiveMessage }
488
1087
  }
1088
+
1089
+ if ('ephemeral' in message && !!message.ephemeral) {
1090
+ m = { ephemeralMessage: { message: m } }
1091
+ }
1092
+
1093
+ if ('viewOnce' in message && !!message.viewOnce) {
1094
+ m = { viewOnceMessageV2: { message: m } }
1095
+ }
1096
+
1097
+ if ('viewOnceExt' in message && !!message.viewOnceExt) {
1098
+ m = { viewOnceMessageV2Extension: { message: m } }
1099
+ }
1100
+
489
1101
  if ('edit' in message) {
490
1102
  m = {
491
1103
  protocolMessage: {
492
1104
  key: message.edit,
493
1105
  editedMessage: m,
494
1106
  timestampMs: Date.now(),
495
- type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
1107
+ type: Types_1.WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
496
1108
  }
497
- };
498
- }
499
- if ('contextInfo' in message && !!message.contextInfo) {
500
- const messageType = Object.keys(m)[0];
501
- const key = m[messageType];
502
- if ('contextInfo' in key && !!key.contextInfo) {
503
- key.contextInfo = { ...key.contextInfo, ...message.contextInfo };
504
- }
505
- else if (key) {
506
- key.contextInfo = message.contextInfo;
507
1109
  }
508
1110
  }
509
- return WAProto.Message.create(m);
510
- };
511
- export const generateWAMessageFromContent = (jid, message, options) => {
512
- // set timestamp to now
513
- // if not specified
1111
+
1112
+ return Types_1.WAProto.Message.fromObject(m)
1113
+ }
1114
+
1115
+ const generateWAMessageFromContent = (jid, message, options) => {
514
1116
  if (!options.timestamp) {
515
- options.timestamp = new Date();
1117
+ options.timestamp = new Date()
516
1118
  }
517
- const innerMessage = normalizeMessageContent(message);
518
- const key = getContentType(innerMessage);
519
- const timestamp = unixTimestampSeconds(options.timestamp);
520
- const { quoted, userJid } = options;
521
- if (quoted && !isJidNewsletter(jid)) {
1119
+
1120
+ const innerMessage = normalizeMessageContent(message)
1121
+ const key = getContentType(innerMessage)
1122
+ const timestamp = generics_1.unixTimestampSeconds(options.timestamp)
1123
+ const { quoted, userJid } = options
1124
+
1125
+ if (quoted && !WABinary_1.isJidNewsletter(jid)) {
522
1126
  const participant = quoted.key.fromMe
523
- ? userJid // TODO: Add support for LIDs
524
- : quoted.participant || quoted.key.participant || quoted.key.remoteJid;
525
- let quotedMsg = normalizeMessageContent(quoted.message);
526
- const msgType = getContentType(quotedMsg);
527
- // strip any redundant properties
528
- quotedMsg = proto.Message.create({ [msgType]: quotedMsg[msgType] });
529
- const quotedContent = quotedMsg[msgType];
1127
+ ? userJid
1128
+ : quoted.participant || quoted.key.participant || quoted.key.remoteJid
1129
+
1130
+ let quotedMsg = normalizeMessageContent(quoted.message)
1131
+ const msgType = getContentType(quotedMsg)
1132
+
1133
+ quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] })
1134
+
1135
+ const quotedContent = quotedMsg[msgType]
1136
+
530
1137
  if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
531
- delete quotedContent.contextInfo;
532
- }
533
- const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
534
- contextInfo.participant = jidNormalizedUser(participant);
535
- contextInfo.stanzaId = quoted.key.id;
536
- contextInfo.quotedMessage = quotedMsg;
537
- // if a participant is quoted, then it must be a group
538
- // hence, remoteJid of group must also be entered
1138
+ delete quotedContent.contextInfo
1139
+ }
1140
+
1141
+ let requestPayment
1142
+
1143
+ if (key === 'requestPaymentMessage') {
1144
+ if (innerMessage?.requestPaymentMessage && innerMessage?.requestPaymentMessage?.noteMessage?.extendedTextMessage) {
1145
+ requestPayment = innerMessage?.requestPaymentMessage?.noteMessage?.extendedTextMessage
1146
+ } else if (innerMessage?.requestPaymentMessage && innerMessage?.requestPaymentMessage?.noteMessage?.stickerMessage) {
1147
+ requestPayment = innerMessage.requestPaymentMessage?.noteMessage?.stickerMessage
1148
+ }
1149
+ }
1150
+
1151
+ const contextInfo = (key === 'requestPaymentMessage' ? requestPayment?.contextInfo : innerMessage[key].contextInfo) || {}
1152
+
1153
+ contextInfo.participant = WABinary_1.jidNormalizedUser(participant)
1154
+ contextInfo.stanzaId = quoted.key.id
1155
+ contextInfo.quotedMessage = quotedMsg
1156
+
539
1157
  if (jid !== quoted.key.remoteJid) {
540
- contextInfo.remoteJid = quoted.key.remoteJid;
1158
+ contextInfo.remoteJid = quoted.key.remoteJid
541
1159
  }
542
- if (contextInfo && innerMessage[key]) {
543
- /* @ts-ignore */
544
- innerMessage[key].contextInfo = contextInfo;
1160
+
1161
+ if (key === 'requestPaymentMessage' && requestPayment) {
1162
+ requestPayment.contextInfo = contextInfo
1163
+ } else {
1164
+ innerMessage[key].contextInfo = contextInfo
545
1165
  }
546
1166
  }
547
- if (
548
- // if we want to send a disappearing message
549
- !!options?.ephemeralExpiration &&
550
- // and it's not a protocol message -- delete, toggle disappear message
551
- key !== 'protocolMessage' &&
552
- // already not converted to disappearing message
1167
+
1168
+ if (key !== 'protocolMessage' &&
553
1169
  key !== 'ephemeralMessage' &&
554
- // newsletters don't support ephemeral messages
555
- !isJidNewsletter(jid)) {
556
- /* @ts-ignore */
1170
+ !WABinary_1.isJidNewsletter(jid)) {
1171
+ message.messageContextInfo = {
1172
+ messageSecret: crypto_1.randomBytes(32),
1173
+ ...message.messageContextInfo
1174
+ }
557
1175
  innerMessage[key].contextInfo = {
558
1176
  ...(innerMessage[key].contextInfo || {}),
559
- expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
560
- //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
561
- };
1177
+ expiration: options.ephemeralExpiration ? options.ephemeralExpiration : 0
1178
+ }
562
1179
  }
563
- message = WAProto.Message.create(message);
1180
+
1181
+ message = Types_1.WAProto.Message.fromObject(message)
1182
+
564
1183
  const messageJSON = {
565
1184
  key: {
566
1185
  remoteJid: jid,
567
1186
  fromMe: true,
568
- id: options?.messageId || generateMessageIDV2()
1187
+ id: options?.messageId || generics_1.generateMessageID()
569
1188
  },
570
1189
  message: message,
571
1190
  messageTimestamp: timestamp,
572
1191
  messageStubParameters: [],
573
- participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined, // TODO: Add support for LIDs
574
- status: WAMessageStatus.PENDING
575
- };
576
- return WAProto.WebMessageInfo.fromObject(messageJSON);
577
- };
578
- export const generateWAMessage = async (jid, content, options) => {
579
- // ensure msg ID is with every log
580
- options.logger = options?.logger?.child({ msgId: options.messageId });
581
- // Pass jid in the options to generateWAMessageContent
582
- return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { ...options, jid }), options);
583
- };
584
- /** Get the key to access the true type of content */
585
- export const getContentType = (content) => {
1192
+ participant: WABinary_1.isJidGroup(jid) || WABinary_1.isJidStatusBroadcast(jid) ? userJid : undefined,
1193
+ status: Types_1.WAMessageStatus.PENDING
1194
+ }
1195
+
1196
+ return Types_1.WAProto.WebMessageInfo.fromObject(messageJSON)
1197
+ }
1198
+
1199
+ const generateWAMessage = async (jid, content, options) => {
1200
+ options.logger = options?.logger?.child({ msgId: options.messageId })
1201
+
1202
+ return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { newsletter: WABinary_1.isJidNewsletter(jid), ...options }), options)
1203
+ }
1204
+
1205
+ const getContentType = (content) => {
586
1206
  if (content) {
587
- const keys = Object.keys(content);
588
- const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
589
- return key;
1207
+ const keys = Object.keys(content)
1208
+ const key = keys.find(k => (k === 'conversation' || k.endsWith('Message') || k.endsWith('V2') || k.endsWith('V3') || k.endsWith('V4') || k.endsWith('V5')) && k !== 'senderKeyDistributionMessage' && k !== 'messageContextInfo')
1209
+
1210
+ return key
590
1211
  }
591
- };
1212
+ }
1213
+
592
1214
  /**
593
1215
  * Normalizes ephemeral, view once messages to regular message content
594
1216
  * Eg. image messages in ephemeral messages, in view once messages etc.
595
1217
  * @param content
596
1218
  * @returns
597
1219
  */
598
- export const normalizeMessageContent = (content) => {
1220
+ const normalizeMessageContent = (content) => {
599
1221
  if (!content) {
600
- return undefined;
1222
+ return undefined
601
1223
  }
602
- // set max iterations to prevent an infinite loop
1224
+
603
1225
  for (let i = 0; i < 5; i++) {
604
- const inner = getFutureProofMessage(content);
1226
+ const inner = getFutureProofMessage(content)
605
1227
  if (!inner) {
606
- break;
1228
+ break
607
1229
  }
608
- content = inner.message;
1230
+
1231
+ content = inner.message
609
1232
  }
610
- return content;
1233
+
1234
+ return content
1235
+
611
1236
  function getFutureProofMessage(message) {
612
- return (message?.ephemeralMessage ||
613
- message?.viewOnceMessage ||
614
- message?.documentWithCaptionMessage ||
615
- message?.viewOnceMessageV2 ||
616
- message?.viewOnceMessageV2Extension ||
617
- message?.editedMessage);
618
- }
619
- };
1237
+ return (
1238
+ (message === null || message === void 0 ? void 0 : message.editedMessage)
1239
+ || (message === null || message === void 0 ? void 0 : message.statusAddYours)
1240
+ || (message === null || message === void 0 ? void 0 : message.botTaskMessage)
1241
+ || (message === null || message === void 0 ? void 0 : message.eventCoverImage)
1242
+ || (message === null || message === void 0 ? void 0 : message.questionMessage)
1243
+ || (message === null || message === void 0 ? void 0 : message.viewOnceMessage)
1244
+ || (message === null || message === void 0 ? void 0 : message.botInvokeMessage)
1245
+ || (message === null || message === void 0 ? void 0 : message.ephemeralMessage)
1246
+ || (message === null || message === void 0 ? void 0 : message.lottieStickerMessage)
1247
+ || (message === null || message === void 0 ? void 0 : message.groupStatusMessage)
1248
+ || (message === null || message === void 0 ? void 0 : message.limitSharingMessage)
1249
+ || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2)
1250
+ || (message === null || message === void 0 ? void 0 : message.botForwardedMessage)
1251
+ || (message === null || message === void 0 ? void 0 : message.statusMentionMessage)
1252
+ || (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
1253
+ || (message === null || message === void 0 ? void 0 : message.pollCreationMessageV4)
1254
+ || (message === null || message === void 0 ? void 0 : message.pollCreationMessageV5)
1255
+ || (message === null || message === void 0 ? void 0 : message.associatedChildMessage)
1256
+ || (message === null || message === void 0 ? void 0 : message.groupMentionedMessage)
1257
+ || (message === null || message === void 0 ? void 0 : message.groupStatusMentionMessage)
1258
+ || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension)
1259
+ || (message === null || message === void 0 ? void 0 : message.documentWithCaptionMessage)
1260
+ || (message === null || message === void 0 ? void 0 : message.pollCreationOptionImageMessage))
1261
+ }
1262
+ }
1263
+
620
1264
  /**
621
1265
  * Extract the true message content from a message
622
1266
  * Eg. extracts the inner message from a disappearing message/view once message
623
1267
  */
624
- export const extractMessageContent = (content) => {
625
- const extractFromTemplateMessage = (msg) => {
626
- if (msg.imageMessage) {
627
- return { imageMessage: msg.imageMessage };
1268
+ const extractMessageContent = (content) => {
1269
+ const extractFromButtonsMessage = (msg) => {
1270
+ const header = typeof msg.header === 'object' && msg.header !== null
1271
+
1272
+ if (header ? msg.header?.imageMessage : msg.imageMessage) {
1273
+ return { imageMessage: header ? msg.header.imageMessage : msg.imageMessage }
628
1274
  }
629
- else if (msg.documentMessage) {
630
- return { documentMessage: msg.documentMessage };
1275
+
1276
+ else if (header ? msg.header?.documentMessage : msg.documentMessage) {
1277
+ return { documentMessage: header ? msg.header.documentMessage : msg.documentMessage }
631
1278
  }
632
- else if (msg.videoMessage) {
633
- return { videoMessage: msg.videoMessage };
1279
+
1280
+ else if (header ? msg.header?.videoMessage : msg.videoMessage) {
1281
+ return { videoMessage: header ? msg.header.videoMessage: msg.videoMessage }
634
1282
  }
635
- else if (msg.locationMessage) {
636
- return { locationMessage: msg.locationMessage };
1283
+
1284
+ else if (header ? msg.header?.locationMessage : msg.locationMessage) {
1285
+ return { locationMessage: header ? msg.header.locationMessage : msg.locationMessage }
637
1286
  }
1287
+
1288
+ else if (header ? msg.header?.productMessage : msg.productMessage) {
1289
+ return { productMessage: header ? msg.header.productMessage : msg.productMessage }
1290
+ }
1291
+
638
1292
  else {
639
1293
  return {
640
- conversation: 'contentText' in msg ? msg.contentText : 'hydratedContentText' in msg ? msg.hydratedContentText : ''
641
- };
1294
+ conversation: 'contentText' in msg
1295
+ ? msg.contentText
1296
+ : ('hydratedContentText' in msg ? msg.hydratedContentText : 'body' in msg ? msg.body.text : '')
1297
+ }
642
1298
  }
643
- };
644
- content = normalizeMessageContent(content);
1299
+ }
1300
+
1301
+ content = normalizeMessageContent(content)
1302
+
645
1303
  if (content?.buttonsMessage) {
646
- return extractFromTemplateMessage(content.buttonsMessage);
1304
+ return extractFromButtonsMessage(content.buttonsMessage)
1305
+ }
1306
+
1307
+ if (content?.interactiveMessage) {
1308
+ return extractFromButtonsMessage(content.interactiveMessage)
647
1309
  }
1310
+
1311
+ if (content?.templateMessage?.interactiveMessageTemplate) {
1312
+ return extractFromButtonsMessage(content?.templateMessage?.interactiveMessageTemplate)
1313
+ }
1314
+
648
1315
  if (content?.templateMessage?.hydratedFourRowTemplate) {
649
- return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
1316
+ return extractFromButtonsMessage(content?.templateMessage?.hydratedFourRowTemplate)
650
1317
  }
1318
+
651
1319
  if (content?.templateMessage?.hydratedTemplate) {
652
- return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
1320
+ return extractFromButtonsMessage(content?.templateMessage?.hydratedTemplate)
653
1321
  }
1322
+
654
1323
  if (content?.templateMessage?.fourRowTemplate) {
655
- return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
1324
+ return extractFromButtonsMessage(content?.templateMessage?.fourRowTemplate)
656
1325
  }
657
- return content;
658
- };
1326
+
1327
+ return content
1328
+ }
1329
+
659
1330
  /**
660
1331
  * Returns the device predicted by message ID
661
1332
  */
662
- export const getDevice = (id) => /^3A.{18}$/.test(id)
663
- ? 'ios'
664
- : /^3E.{20}$/.test(id)
665
- ? 'web'
666
- : /^(.{21}|.{32})$/.test(id)
667
- ? 'android'
668
- : /^(3F|.{18}$)/.test(id)
669
- ? 'desktop'
670
- : 'unknown';
1333
+ const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' :
1334
+ /^3E.{20}$/.test(id) ? 'web' :
1335
+ /^(.{21}|.{32})$/.test(id) ? 'android' :
1336
+ /^(3F|.{18}$)/.test(id) ? 'desktop' :
1337
+ 'baileys'
1338
+
671
1339
  /** Upserts a receipt in the message */
672
- export const updateMessageWithReceipt = (msg, receipt) => {
673
- msg.userReceipt = msg.userReceipt || [];
674
- const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
1340
+ const updateMessageWithReceipt = (msg, receipt) => {
1341
+ msg.userReceipt = msg.userReceipt || []
1342
+ const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid)
1343
+
675
1344
  if (recp) {
676
- Object.assign(recp, receipt);
1345
+ Object.assign(recp, receipt)
677
1346
  }
1347
+
678
1348
  else {
679
- msg.userReceipt.push(receipt);
1349
+ msg.userReceipt.push(receipt)
680
1350
  }
681
- };
1351
+ }
1352
+
682
1353
  /** Update the message with a new reaction */
683
- export const updateMessageWithReaction = (msg, reaction) => {
684
- const authorID = getKeyAuthor(reaction.key);
685
- const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
686
- reaction.text = reaction.text || '';
687
- reactions.push(reaction);
688
- msg.reactions = reactions;
689
- };
1354
+ const updateMessageWithReaction = (msg, reaction) => {
1355
+ const authorID = generics_1.getKeyAuthor(reaction.key)
1356
+ const reactions = (msg.reactions || [])
1357
+ .filter(r => generics_1.getKeyAuthor(r.key) !== authorID)
1358
+
1359
+ reaction.text = reaction.text || ''
1360
+ reactions.push(reaction)
1361
+ msg.reactions = reactions
1362
+ }
1363
+
690
1364
  /** Update the message with a new poll update */
691
- export const updateMessageWithPollUpdate = (msg, update) => {
692
- const authorID = getKeyAuthor(update.pollUpdateMessageKey);
693
- const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
1365
+ const updateMessageWithPollUpdate = (msg, update) => {
1366
+ const authorID = generics_1.getKeyAuthor(update.pollUpdateMessageKey)
1367
+ const votes = (msg.pollUpdates || [])
1368
+ .filter(r => generics_1.getKeyAuthor(r.pollUpdateMessageKey) !== authorID)
1369
+
694
1370
  if (update.vote?.selectedOptions?.length) {
695
- reactions.push(update);
1371
+ votes.push(update)
696
1372
  }
697
- msg.pollUpdates = reactions;
698
- };
1373
+
1374
+ msg.pollUpdates = votes
1375
+ }
1376
+
699
1377
  /**
700
1378
  * Aggregates all poll updates in a poll.
701
1379
  * @param msg the poll creation message
702
1380
  * @param meId your jid
703
1381
  * @returns A list of options & their voters
704
1382
  */
705
- export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
706
- const opts = message?.pollCreationMessage?.options ||
707
- message?.pollCreationMessageV2?.options ||
708
- message?.pollCreationMessageV3?.options ||
709
- [];
1383
+ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
1384
+ message = normalizeMessageContent(message)
1385
+
1386
+ const opts = message?.pollCreationMessage?.options || message?.pollCreationMessageV2?.options || message?.pollCreationMessageV3?.options || []
1387
+
710
1388
  const voteHashMap = opts.reduce((acc, opt) => {
711
- const hash = sha256(Buffer.from(opt.optionName || '')).toString();
1389
+ const hash = crypto_2.sha256(Buffer.from(opt.optionName || '')).toString()
712
1390
  acc[hash] = {
713
1391
  name: opt.optionName || '',
714
1392
  voters: []
715
- };
716
- return acc;
717
- }, {});
1393
+ }
1394
+
1395
+ return acc
1396
+ }, {})
1397
+
718
1398
  for (const update of pollUpdates || []) {
719
- const { vote } = update;
1399
+ const { vote } = update
1400
+
720
1401
  if (!vote) {
721
- continue;
1402
+ continue
722
1403
  }
1404
+
723
1405
  for (const option of vote.selectedOptions || []) {
724
- const hash = option.toString();
725
- let data = voteHashMap[hash];
1406
+ const hash = option.toString()
1407
+ let data = voteHashMap[hash]
1408
+
726
1409
  if (!data) {
727
1410
  voteHashMap[hash] = {
728
1411
  name: 'Unknown',
729
1412
  voters: []
730
- };
731
- data = voteHashMap[hash];
1413
+ }
1414
+
1415
+ data = voteHashMap[hash]
732
1416
  }
733
- voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
1417
+
1418
+ voteHashMap[hash].voters.push(generics_1.getKeyAuthor(update.pollUpdateMessageKey, meId))
734
1419
  }
735
1420
  }
736
- return Object.values(voteHashMap);
1421
+
1422
+ return Object.values(voteHashMap)
737
1423
  }
1424
+
738
1425
  /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
739
- export const aggregateMessageKeysNotFromMe = (keys) => {
740
- const keyMap = {};
1426
+ const aggregateMessageKeysNotFromMe = (keys) => {
1427
+ const keyMap = {}
1428
+
741
1429
  for (const { remoteJid, id, participant, fromMe } of keys) {
742
1430
  if (!fromMe) {
743
- const uqKey = `${remoteJid}:${participant || ''}`;
1431
+ const uqKey = `${remoteJid}:${participant || ''}`
1432
+
744
1433
  if (!keyMap[uqKey]) {
745
1434
  keyMap[uqKey] = {
746
1435
  jid: remoteJid,
747
1436
  participant: participant,
748
1437
  messageIds: []
749
- };
1438
+ }
750
1439
  }
751
- keyMap[uqKey].messageIds.push(id);
1440
+
1441
+ keyMap[uqKey].messageIds.push(id)
752
1442
  }
753
1443
  }
754
- return Object.values(keyMap);
755
- };
756
- const REUPLOAD_REQUIRED_STATUS = [410, 404];
1444
+
1445
+ return Object.values(keyMap)
1446
+ }
1447
+
1448
+ const REUPLOAD_REQUIRED_STATUS = [410, 404]
1449
+
757
1450
  /**
758
1451
  * Downloads the given message. Throws an error if it's not a media message
759
1452
  */
760
- export const downloadMediaMessage = async (message, type, options, ctx) => {
1453
+ const downloadMediaMessage = async (message, type, options, ctx) => {
761
1454
  const result = await downloadMsg().catch(async (error) => {
762
- if (ctx &&
763
- typeof error?.status === 'number' && // treat errors with status as HTTP failures requiring reupload
764
- REUPLOAD_REQUIRED_STATUS.includes(error.status)) {
765
- ctx.logger.info({ key: message.key }, 'sending reupload media request...');
1455
+ if (ctx && axios_1.default.isAxiosError(error) && // check if the message requires a reupload
1456
+ REUPLOAD_REQUIRED_STATUS.includes(error.response?.status)) {
1457
+ ctx.logger.info({ key: message.key }, 'sending reupload media request...')
1458
+
766
1459
  // request reupload
767
- message = await ctx.reuploadRequest(message);
768
- const result = await downloadMsg();
769
- return result;
1460
+ message = await ctx.reuploadRequest(message)
1461
+
1462
+ const result = await downloadMsg()
1463
+
1464
+ return result
770
1465
  }
771
- throw error;
772
- });
773
- return result;
1466
+
1467
+ throw error
1468
+ })
1469
+
1470
+ return result
1471
+
774
1472
  async function downloadMsg() {
775
- const mContent = extractMessageContent(message.message);
1473
+ const mContent = extractMessageContent(message.message)
1474
+
776
1475
  if (!mContent) {
777
- throw new Boom('No message present', { statusCode: 400, data: message });
1476
+ throw new boom_1.Boom('No message present', { statusCode: 400, data: message })
778
1477
  }
779
- const contentType = getContentType(mContent);
780
- let mediaType = contentType?.replace('Message', '');
781
- const media = mContent[contentType];
1478
+
1479
+ const contentType = getContentType(mContent)
1480
+ let mediaType = contentType?.replace('Message', '')
1481
+ const media = contentType === 'productMessage' ? mContent[contentType]?.product?.productImage : mContent[contentType]
1482
+
782
1483
  if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
783
- throw new Boom(`"${contentType}" message is not a media message`);
1484
+ throw new boom_1.Boom(`"${contentType}" message is not a media message`)
784
1485
  }
785
- let download;
1486
+
1487
+ let download
1488
+
786
1489
  if ('thumbnailDirectPath' in media && !('url' in media)) {
787
1490
  download = {
788
1491
  directPath: media.thumbnailDirectPath,
789
1492
  mediaKey: media.mediaKey
790
- };
791
- mediaType = 'thumbnail-link';
1493
+ }
1494
+ mediaType = 'thumbnail-link'
792
1495
  }
1496
+
793
1497
  else {
794
- download = media;
1498
+ download = media
795
1499
  }
796
- const stream = await downloadContentFromMessage(download, mediaType, options);
1500
+
1501
+ const stream = await messages_media_1.downloadContentFromMessage(download, mediaType, options)
1502
+
797
1503
  if (type === 'buffer') {
798
- const bufferArray = [];
1504
+ const bufferArray = []
1505
+
799
1506
  for await (const chunk of stream) {
800
- bufferArray.push(chunk);
1507
+ bufferArray.push(chunk)
801
1508
  }
802
- return Buffer.concat(bufferArray);
803
- }
804
- return stream;
805
- }
806
- };
807
- /** Checks whether the given message is a media message; if it is returns the inner content */
808
- export const assertMediaContent = (content) => {
809
- content = extractMessageContent(content);
810
- const mediaContent = content?.documentMessage ||
811
- content?.imageMessage ||
812
- content?.videoMessage ||
813
- content?.audioMessage ||
814
- content?.stickerMessage;
1509
+
1510
+ return Buffer.concat(bufferArray)
1511
+ }
1512
+
1513
+ return stream
1514
+ }
1515
+ }
1516
+
1517
+ /** Checks whether the given message is a media message if it is returns the inner content */
1518
+ const assertMediaContent = (content) => {
1519
+ content = extractMessageContent(content)
1520
+
1521
+ const mediaContent = content?.documentMessage
1522
+ || content?.imageMessage
1523
+ || content?.videoMessage
1524
+ || content?.audioMessage
1525
+ || content?.stickerMessage
1526
+
815
1527
  if (!mediaContent) {
816
- throw new Boom('given message is not a media message', { statusCode: 400, data: content });
1528
+ throw new boom_1.Boom('given message is not a media message', { statusCode: 400, data: content })
817
1529
  }
818
- return mediaContent;
819
- };
820
- //# sourceMappingURL=messages.js.map
1530
+ return mediaContent
1531
+ }
1532
+
1533
+ /**
1534
+ * this is an experimental patch to make buttons work
1535
+ * Don't know how it works, but it does for now
1536
+ */
1537
+ const patchMessageForMdIfRequired = (message) => {
1538
+ if (message?.buttonsMessage ||
1539
+ message?.templateMessage ||
1540
+ message?.listMessage ||
1541
+ message?.interactiveMessage?.nativeFlowMesaage
1542
+ ) {
1543
+ message = {
1544
+ viewOnceMessageV2Extension: {
1545
+ message: {
1546
+ messageContextInfo: {
1547
+ deviceListMetadataVersion: 2,
1548
+ deviceListMetadata: {}
1549
+ },
1550
+ ...message
1551
+ }
1552
+ }
1553
+ }
1554
+ }
1555
+ return message
1556
+ }
1557
+
1558
+ module.exports = {
1559
+ extractUrlFromText,
1560
+ generateLinkPreviewIfRequired,
1561
+ prepareWAMessageMedia,
1562
+ prepareDisappearingMessageSettingContent,
1563
+ generateForwardMessageContent,
1564
+ generateWAMessageContent,
1565
+ generateWAMessageFromContent,
1566
+ generateWAMessage,
1567
+ getContentType,
1568
+ normalizeMessageContent,
1569
+ extractMessageContent,
1570
+ getDevice,
1571
+ updateMessageWithReceipt,
1572
+ updateMessageWithReaction,
1573
+ updateMessageWithPollUpdate,
1574
+ getAggregateVotesInPollMessage,
1575
+ aggregateMessageKeysNotFromMe,
1576
+ downloadMediaMessage,
1577
+ assertMediaContent,
1578
+ patchMessageForMdIfRequired
1579
+ }