@neelegirl/baileys 1.5.2 → 1.5.4

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 (419) hide show
  1. package/README.md +26 -18
  2. package/WAProto/GenerateStatics.sh +3 -0
  3. package/WAProto/WAProto.proto +291 -665
  4. package/WAProto/fix-imports.js +29 -0
  5. package/WAProto/index.d.ts +2297 -48040
  6. package/WAProto/index.js +45500 -140101
  7. package/engine-requirements.js +10 -0
  8. package/lib/Defaults/index.d.ts +58 -64
  9. package/lib/Defaults/index.d.ts.map +1 -0
  10. package/lib/Defaults/index.js +74 -96
  11. package/lib/Defaults/index.js.map +1 -0
  12. package/lib/Signal/Group/ciphertext-message.d.ts +10 -0
  13. package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
  14. package/lib/Signal/Group/ciphertext-message.js +12 -0
  15. package/lib/Signal/Group/ciphertext-message.js.map +1 -0
  16. package/lib/Signal/Group/group-session-builder.d.ts +15 -0
  17. package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
  18. package/lib/Signal/Group/group-session-builder.js +30 -0
  19. package/lib/Signal/Group/group-session-builder.js.map +1 -0
  20. package/lib/Signal/Group/group_cipher.d.ts +17 -0
  21. package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
  22. package/lib/Signal/Group/group_cipher.js +82 -0
  23. package/lib/Signal/Group/group_cipher.js.map +1 -0
  24. package/lib/Signal/Group/index.d.ts +12 -0
  25. package/lib/Signal/Group/index.d.ts.map +1 -0
  26. package/lib/Signal/Group/index.js +12 -0
  27. package/lib/Signal/Group/index.js.map +1 -0
  28. package/lib/Signal/Group/keyhelper.d.ts +11 -0
  29. package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
  30. package/lib/Signal/Group/keyhelper.js +18 -0
  31. package/lib/Signal/Group/keyhelper.js.map +1 -0
  32. package/lib/Signal/Group/sender-chain-key.d.ts +14 -0
  33. package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
  34. package/lib/Signal/Group/sender-chain-key.js +26 -0
  35. package/lib/Signal/Group/sender-chain-key.js.map +1 -0
  36. package/lib/Signal/Group/sender-key-distribution-message.d.ts +17 -0
  37. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
  38. package/lib/Signal/Group/sender-key-distribution-message.js +63 -0
  39. package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
  40. package/lib/Signal/Group/sender-key-message.d.ts +19 -0
  41. package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
  42. package/lib/Signal/Group/sender-key-message.js +66 -0
  43. package/lib/Signal/Group/sender-key-message.js.map +1 -0
  44. package/lib/Signal/Group/sender-key-name.d.ts +18 -0
  45. package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
  46. package/lib/Signal/Group/sender-key-name.js +48 -0
  47. package/lib/Signal/Group/sender-key-name.js.map +1 -0
  48. package/lib/Signal/Group/sender-key-record.d.ts +31 -0
  49. package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
  50. package/lib/Signal/Group/sender-key-record.js +41 -0
  51. package/lib/Signal/Group/sender-key-record.js.map +1 -0
  52. package/lib/Signal/Group/sender-key-state.d.ts +39 -0
  53. package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
  54. package/lib/Signal/Group/sender-key-state.js +84 -0
  55. package/lib/Signal/Group/sender-key-state.js.map +1 -0
  56. package/lib/Signal/Group/sender-message-key.d.ts +12 -0
  57. package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
  58. package/lib/Signal/{WASignalGroup/sender_message_key.js → Group/sender-message-key.js} +3 -16
  59. package/lib/Signal/Group/sender-message-key.js.map +1 -0
  60. package/lib/Signal/libsignal.d.ts +5 -4
  61. package/lib/Signal/libsignal.d.ts.map +1 -0
  62. package/lib/Signal/libsignal.js +292 -112
  63. package/lib/Signal/libsignal.js.map +1 -0
  64. package/lib/Signal/lid-mapping.d.ts +23 -0
  65. package/lib/Signal/lid-mapping.d.ts.map +1 -0
  66. package/lib/Signal/lid-mapping.js +171 -0
  67. package/lib/Signal/lid-mapping.js.map +1 -0
  68. package/lib/Socket/Client/index.d.ts +3 -2
  69. package/lib/Socket/Client/index.d.ts.map +1 -0
  70. package/lib/Socket/Client/index.js +3 -22
  71. package/lib/Socket/Client/index.js.map +1 -0
  72. package/lib/Socket/Client/types.d.ts +15 -15
  73. package/lib/Socket/Client/types.d.ts.map +1 -0
  74. package/lib/Socket/Client/types.js +8 -15
  75. package/lib/Socket/Client/types.js.map +1 -0
  76. package/lib/Socket/Client/websocket.d.ts +12 -12
  77. package/lib/Socket/Client/websocket.d.ts.map +1 -0
  78. package/lib/Socket/Client/websocket.js +24 -36
  79. package/lib/Socket/Client/websocket.js.map +1 -0
  80. package/lib/Socket/business.d.ts +178 -177
  81. package/lib/Socket/business.d.ts.map +1 -0
  82. package/lib/Socket/business.js +179 -71
  83. package/lib/Socket/business.js.map +1 -0
  84. package/lib/Socket/chats.d.ts +93 -93
  85. package/lib/Socket/chats.d.ts.map +1 -0
  86. package/lib/Socket/chats.js +474 -625
  87. package/lib/Socket/chats.js.map +1 -0
  88. package/lib/Socket/communities.d.ts +83 -62
  89. package/lib/Socket/communities.d.ts.map +1 -0
  90. package/lib/Socket/communities.js +412 -414
  91. package/lib/Socket/communities.js.map +1 -0
  92. package/lib/Socket/groups.d.ts +118 -112
  93. package/lib/Socket/groups.d.ts.map +1 -0
  94. package/lib/Socket/groups.js +146 -171
  95. package/lib/Socket/groups.js.map +1 -0
  96. package/lib/Socket/index.d.ts +222 -182
  97. package/lib/Socket/index.d.ts.map +1 -0
  98. package/lib/Socket/index.js +12 -17
  99. package/lib/Socket/index.js.map +1 -0
  100. package/lib/Socket/messages-recv.d.ts +165 -169
  101. package/lib/Socket/messages-recv.d.ts.map +1 -0
  102. package/lib/Socket/messages-recv.js +1185 -1721
  103. package/lib/Socket/messages-recv.js.map +1 -0
  104. package/lib/Socket/messages-send.d.ts +161 -159
  105. package/lib/Socket/messages-send.d.ts.map +1 -0
  106. package/lib/Socket/messages-send.js +650 -991
  107. package/lib/Socket/messages-send.js.map +1 -0
  108. package/lib/Socket/mex.d.ts +1 -0
  109. package/lib/Socket/mex.d.ts.map +1 -0
  110. package/lib/Socket/mex.js +4 -9
  111. package/lib/Socket/mex.js.map +1 -0
  112. package/lib/Socket/newsletter.d.ts +139 -139
  113. package/lib/Socket/newsletter.d.ts.map +1 -0
  114. package/lib/Socket/newsletter.js +153 -258
  115. package/lib/Socket/newsletter.js.map +1 -0
  116. package/lib/Socket/socket.d.ts +42 -36
  117. package/lib/Socket/socket.d.ts.map +1 -0
  118. package/lib/Socket/socket.js +623 -507
  119. package/lib/Socket/socket.js.map +1 -0
  120. package/lib/Types/Auth.d.ts +87 -96
  121. package/lib/Types/Auth.d.ts.map +1 -0
  122. package/lib/Types/Auth.js +2 -3
  123. package/lib/Types/Auth.js.map +1 -0
  124. package/lib/Types/Bussines.d.ts +25 -0
  125. package/lib/Types/Bussines.d.ts.map +1 -0
  126. package/lib/Types/Bussines.js +2 -0
  127. package/lib/Types/Bussines.js.map +1 -0
  128. package/lib/Types/Call.d.ts +13 -13
  129. package/lib/Types/Call.d.ts.map +1 -0
  130. package/lib/Types/Call.js +2 -3
  131. package/lib/Types/Call.js.map +1 -0
  132. package/lib/Types/Chat.d.ts +79 -94
  133. package/lib/Types/Chat.d.ts.map +1 -0
  134. package/lib/Types/Chat.js +8 -9
  135. package/lib/Types/Chat.js.map +1 -0
  136. package/lib/Types/Contact.d.ts +13 -9
  137. package/lib/Types/Contact.d.ts.map +1 -0
  138. package/lib/Types/Contact.js +2 -3
  139. package/lib/Types/Contact.js.map +1 -0
  140. package/lib/Types/Events.d.ts +152 -179
  141. package/lib/Types/Events.d.ts.map +1 -0
  142. package/lib/Types/Events.js +2 -3
  143. package/lib/Types/Events.js.map +1 -0
  144. package/lib/Types/GroupMetadata.d.ts +49 -48
  145. package/lib/Types/GroupMetadata.d.ts.map +1 -0
  146. package/lib/Types/GroupMetadata.js +2 -3
  147. package/lib/Types/GroupMetadata.js.map +1 -0
  148. package/lib/Types/Label.d.ts +13 -14
  149. package/lib/Types/Label.d.ts.map +1 -0
  150. package/lib/Types/Label.js +24 -30
  151. package/lib/Types/Label.js.map +1 -0
  152. package/lib/Types/LabelAssociation.d.ts +15 -20
  153. package/lib/Types/LabelAssociation.d.ts.map +1 -0
  154. package/lib/Types/LabelAssociation.js +6 -12
  155. package/lib/Types/LabelAssociation.js.map +1 -0
  156. package/lib/Types/Message.d.ts +234 -404
  157. package/lib/Types/Message.d.ts.map +1 -0
  158. package/lib/Types/Message.js +11 -13
  159. package/lib/Types/Message.js.map +1 -0
  160. package/lib/Types/Newsletter.d.ts +130 -104
  161. package/lib/Types/Newsletter.d.ts.map +1 -0
  162. package/lib/Types/Newsletter.js +31 -40
  163. package/lib/Types/Newsletter.js.map +1 -0
  164. package/lib/Types/Product.d.ts +58 -71
  165. package/lib/Types/Product.d.ts.map +1 -0
  166. package/lib/Types/Product.js +2 -3
  167. package/lib/Types/Product.js.map +1 -0
  168. package/lib/Types/Signal.d.ts +63 -55
  169. package/lib/Types/Signal.d.ts.map +1 -0
  170. package/lib/Types/Signal.js +2 -3
  171. package/lib/Types/Signal.js.map +1 -0
  172. package/lib/Types/Socket.d.ts +78 -65
  173. package/lib/Types/Socket.d.ts.map +1 -0
  174. package/lib/Types/Socket.js +3 -3
  175. package/lib/Types/Socket.js.map +1 -0
  176. package/lib/Types/State.d.ts +17 -19
  177. package/lib/Types/State.d.ts.map +1 -0
  178. package/lib/Types/State.js +13 -14
  179. package/lib/Types/State.js.map +1 -0
  180. package/lib/Types/USync.d.ts +8 -8
  181. package/lib/Types/USync.d.ts.map +1 -0
  182. package/lib/Types/USync.js +2 -3
  183. package/lib/Types/USync.js.map +1 -0
  184. package/lib/Types/index.d.ts +47 -61
  185. package/lib/Types/index.d.ts.map +1 -0
  186. package/lib/Types/index.js +26 -48
  187. package/lib/Types/index.js.map +1 -0
  188. package/lib/Utils/auth-utils.d.ts +8 -10
  189. package/lib/Utils/auth-utils.d.ts.map +1 -0
  190. package/lib/Utils/auth-utils.js +206 -154
  191. package/lib/Utils/auth-utils.js.map +1 -0
  192. package/lib/Utils/baileys-event-stream.d.ts +6 -7
  193. package/lib/Utils/baileys-event-stream.d.ts.map +1 -0
  194. package/lib/Utils/baileys-event-stream.js +29 -43
  195. package/lib/Utils/baileys-event-stream.js.map +1 -0
  196. package/lib/Utils/browser-utils.d.ts +4 -0
  197. package/lib/Utils/browser-utils.d.ts.map +1 -0
  198. package/lib/Utils/browser-utils.js +28 -0
  199. package/lib/Utils/browser-utils.js.map +1 -0
  200. package/lib/Utils/business.d.ts +14 -20
  201. package/lib/Utils/business.d.ts.map +1 -0
  202. package/lib/Utils/business.js +110 -134
  203. package/lib/Utils/business.js.map +1 -0
  204. package/lib/Utils/chat-utils.d.ts +57 -69
  205. package/lib/Utils/chat-utils.d.ts.map +1 -0
  206. package/lib/Utils/chat-utils.js +362 -380
  207. package/lib/Utils/chat-utils.js.map +1 -0
  208. package/lib/Utils/crypto.d.ts +30 -45
  209. package/lib/Utils/crypto.d.ts.map +1 -0
  210. package/lib/Utils/crypto.js +141 -178
  211. package/lib/Utils/crypto.js.map +1 -0
  212. package/lib/Utils/decode-wa-message.d.ts +42 -35
  213. package/lib/Utils/decode-wa-message.d.ts.map +1 -0
  214. package/lib/Utils/decode-wa-message.js +176 -150
  215. package/lib/Utils/decode-wa-message.js.map +1 -0
  216. package/lib/Utils/event-buffer.d.ts +12 -17
  217. package/lib/Utils/event-buffer.d.ts.map +1 -0
  218. package/lib/Utils/event-buffer.js +269 -286
  219. package/lib/Utils/event-buffer.js.map +1 -0
  220. package/lib/Utils/generics.d.ts +60 -99
  221. package/lib/Utils/generics.d.ts.map +1 -0
  222. package/lib/Utils/generics.js +244 -487
  223. package/lib/Utils/generics.js.map +1 -0
  224. package/lib/Utils/history.d.ts +18 -22
  225. package/lib/Utils/history.d.ts.map +1 -0
  226. package/lib/Utils/history.js +54 -80
  227. package/lib/Utils/history.js.map +1 -0
  228. package/lib/Utils/index.d.ts +20 -19
  229. package/lib/Utils/index.d.ts.map +1 -0
  230. package/lib/Utils/index.js +19 -39
  231. package/lib/Utils/index.js.map +1 -0
  232. package/lib/Utils/link-preview.d.ts +12 -14
  233. package/lib/Utils/link-preview.d.ts.map +1 -0
  234. package/lib/Utils/link-preview.js +40 -75
  235. package/lib/Utils/link-preview.js.map +1 -0
  236. package/lib/Utils/logger.d.ts +10 -11
  237. package/lib/Utils/logger.d.ts.map +1 -0
  238. package/lib/Utils/logger.js +3 -7
  239. package/lib/Utils/logger.js.map +1 -0
  240. package/lib/Utils/lt-hash.d.ts +12 -13
  241. package/lib/Utils/lt-hash.d.ts.map +1 -0
  242. package/lib/Utils/lt-hash.js +27 -37
  243. package/lib/Utils/lt-hash.js.map +1 -0
  244. package/lib/Utils/make-mutex.d.ts +6 -7
  245. package/lib/Utils/make-mutex.d.ts.map +1 -0
  246. package/lib/Utils/make-mutex.js +20 -29
  247. package/lib/Utils/make-mutex.js.map +1 -0
  248. package/lib/Utils/message-retry-manager.d.ts +82 -0
  249. package/lib/Utils/message-retry-manager.d.ts.map +1 -0
  250. package/lib/Utils/message-retry-manager.js +149 -0
  251. package/lib/Utils/message-retry-manager.js.map +1 -0
  252. package/lib/Utils/messages-media.d.ts +87 -102
  253. package/lib/Utils/messages-media.d.ts.map +1 -0
  254. package/lib/Utils/messages-media.js +427 -570
  255. package/lib/Utils/messages-media.js.map +1 -0
  256. package/lib/Utils/messages.d.ts +37 -64
  257. package/lib/Utils/messages.d.ts.map +1 -0
  258. package/lib/Utils/messages.js +511 -1270
  259. package/lib/Utils/messages.js.map +1 -0
  260. package/lib/Utils/noise-handler.d.ts +18 -18
  261. package/lib/Utils/noise-handler.d.ts.map +1 -0
  262. package/lib/Utils/noise-handler.js +101 -109
  263. package/lib/Utils/noise-handler.js.map +1 -0
  264. package/lib/Utils/pre-key-manager.d.ts +28 -0
  265. package/lib/Utils/pre-key-manager.d.ts.map +1 -0
  266. package/lib/Utils/pre-key-manager.js +106 -0
  267. package/lib/Utils/pre-key-manager.js.map +1 -0
  268. package/lib/Utils/process-message.d.ts +25 -32
  269. package/lib/Utils/process-message.d.ts.map +1 -0
  270. package/lib/Utils/process-message.js +266 -281
  271. package/lib/Utils/process-message.js.map +1 -0
  272. package/lib/Utils/signal.d.ts +24 -32
  273. package/lib/Utils/signal.d.ts.map +1 -0
  274. package/lib/Utils/signal.js +98 -105
  275. package/lib/Utils/signal.js.map +1 -0
  276. package/lib/Utils/use-multi-file-auth-state.d.ts +5 -10
  277. package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
  278. package/lib/Utils/use-multi-file-auth-state.js +69 -186
  279. package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
  280. package/lib/Utils/validate-connection.d.ts +11 -13
  281. package/lib/Utils/validate-connection.d.ts.map +1 -0
  282. package/lib/Utils/validate-connection.js +124 -116
  283. package/lib/Utils/validate-connection.js.map +1 -0
  284. package/lib/WABinary/constants.d.ts +25 -27
  285. package/lib/WABinary/constants.d.ts.map +1 -0
  286. package/lib/WABinary/constants.js +1277 -1292
  287. package/lib/WABinary/constants.js.map +1 -0
  288. package/lib/WABinary/decode.d.ts +7 -9
  289. package/lib/WABinary/decode.d.ts.map +1 -0
  290. package/lib/WABinary/decode.js +139 -189
  291. package/lib/WABinary/decode.js.map +1 -0
  292. package/lib/WABinary/encode.d.ts +3 -3
  293. package/lib/WABinary/encode.d.ts.map +1 -0
  294. package/lib/WABinary/encode.js +105 -154
  295. package/lib/WABinary/encode.js.map +1 -0
  296. package/lib/WABinary/generic-utils.d.ts +14 -27
  297. package/lib/WABinary/generic-utils.d.ts.map +1 -0
  298. package/lib/WABinary/generic-utils.js +62 -102
  299. package/lib/WABinary/generic-utils.js.map +1 -0
  300. package/lib/WABinary/index.d.ts +6 -5
  301. package/lib/WABinary/index.d.ts.map +1 -0
  302. package/lib/WABinary/index.js +6 -25
  303. package/lib/WABinary/index.js.map +1 -0
  304. package/lib/WABinary/jid-utils.d.ts +41 -46
  305. package/lib/WABinary/jid-utils.d.ts.map +1 -0
  306. package/lib/WABinary/jid-utils.js +84 -80
  307. package/lib/WABinary/jid-utils.js.map +1 -0
  308. package/lib/WABinary/types.d.ts +10 -13
  309. package/lib/WABinary/types.d.ts.map +1 -0
  310. package/lib/WABinary/types.js +2 -3
  311. package/lib/WABinary/types.js.map +1 -0
  312. package/lib/WAM/BinaryInfo.d.ts +8 -15
  313. package/lib/WAM/BinaryInfo.d.ts.map +1 -0
  314. package/lib/WAM/BinaryInfo.js +7 -14
  315. package/lib/WAM/BinaryInfo.js.map +1 -0
  316. package/lib/WAM/constants.d.ts +30 -37
  317. package/lib/WAM/constants.d.ts.map +1 -0
  318. package/lib/WAM/constants.js +19193 -11711
  319. package/lib/WAM/constants.js.map +1 -0
  320. package/lib/WAM/encode.d.ts +3 -3
  321. package/lib/WAM/encode.d.ts.map +1 -0
  322. package/lib/WAM/encode.js +95 -110
  323. package/lib/WAM/encode.js.map +1 -0
  324. package/lib/WAM/index.d.ts +4 -3
  325. package/lib/WAM/index.d.ts.map +1 -0
  326. package/lib/WAM/index.js +4 -23
  327. package/lib/WAM/index.js.map +1 -0
  328. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -9
  329. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
  330. package/lib/WAUSync/Protocols/USyncContactProtocol.js +12 -19
  331. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
  332. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +19 -22
  333. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
  334. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +18 -26
  335. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
  336. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +11 -12
  337. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
  338. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +12 -20
  339. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
  340. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +11 -12
  341. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
  342. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +16 -24
  343. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
  344. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +26 -0
  345. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
  346. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +51 -0
  347. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
  348. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +10 -0
  349. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
  350. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +29 -0
  351. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
  352. package/lib/WAUSync/Protocols/index.d.ts +5 -6
  353. package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
  354. package/lib/WAUSync/Protocols/index.js +5 -26
  355. package/lib/WAUSync/Protocols/index.js.map +1 -0
  356. package/lib/WAUSync/USyncQuery.d.ts +26 -28
  357. package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
  358. package/lib/WAUSync/USyncQuery.js +64 -62
  359. package/lib/WAUSync/USyncQuery.js.map +1 -0
  360. package/lib/WAUSync/USyncUser.d.ts +11 -10
  361. package/lib/WAUSync/USyncUser.d.ts.map +1 -0
  362. package/lib/WAUSync/USyncUser.js +12 -19
  363. package/lib/WAUSync/USyncUser.js.map +1 -0
  364. package/lib/WAUSync/index.d.ts +4 -3
  365. package/lib/WAUSync/index.d.ts.map +1 -0
  366. package/lib/WAUSync/index.js +4 -23
  367. package/lib/WAUSync/index.js.map +1 -0
  368. package/lib/index.d.ts +10 -11
  369. package/lib/index.d.ts.map +1 -0
  370. package/lib/index.js +11 -33
  371. package/lib/index.js.map +1 -0
  372. package/package.json +48 -43
  373. package/lib/Defaults/baileys-version.json +0 -3
  374. package/lib/Defaults/phonenumber-mcc.json +0 -223
  375. package/lib/Signal/WASignalGroup/GroupProtocol.js +0 -1909
  376. package/lib/Signal/WASignalGroup/ciphertext_message.js +0 -16
  377. package/lib/Signal/WASignalGroup/generate-proto.sh +0 -1
  378. package/lib/Signal/WASignalGroup/group.proto +0 -42
  379. package/lib/Signal/WASignalGroup/group_cipher.js +0 -120
  380. package/lib/Signal/WASignalGroup/group_session_builder.js +0 -46
  381. package/lib/Signal/WASignalGroup/index.js +0 -6
  382. package/lib/Signal/WASignalGroup/keyhelper.js +0 -21
  383. package/lib/Signal/WASignalGroup/protobufs.js +0 -3
  384. package/lib/Signal/WASignalGroup/queue_job.js +0 -69
  385. package/lib/Signal/WASignalGroup/readme.md +0 -6
  386. package/lib/Signal/WASignalGroup/sender_chain_key.js +0 -50
  387. package/lib/Signal/WASignalGroup/sender_key_distribution_message.js +0 -78
  388. package/lib/Signal/WASignalGroup/sender_key_message.js +0 -92
  389. package/lib/Signal/WASignalGroup/sender_key_name.js +0 -70
  390. package/lib/Signal/WASignalGroup/sender_key_record.js +0 -56
  391. package/lib/Signal/WASignalGroup/sender_key_state.js +0 -129
  392. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -15
  393. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  394. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -12
  395. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  396. package/lib/Socket/registration.d.ts +0 -266
  397. package/lib/Socket/registration.js +0 -166
  398. package/lib/Socket/usync.d.ts +0 -37
  399. package/lib/Socket/usync.js +0 -83
  400. package/lib/Store/index.d.ts +0 -4
  401. package/lib/Store/index.js +0 -24
  402. package/lib/Store/make-cache-manager-store.d.ts +0 -14
  403. package/lib/Store/make-cache-manager-store.js +0 -90
  404. package/lib/Store/make-in-memory-store.d.ts +0 -123
  405. package/lib/Store/make-in-memory-store.js +0 -429
  406. package/lib/Store/make-ordered-dictionary.d.ts +0 -12
  407. package/lib/Store/make-ordered-dictionary.js +0 -86
  408. package/lib/Store/object-repository.d.ts +0 -10
  409. package/lib/Store/object-repository.js +0 -31
  410. package/lib/Types/MexUpdates.d.ts +0 -9
  411. package/lib/Types/MexUpdates.js +0 -18
  412. package/lib/Utils/use-mongo-file-auth-state.d.ts +0 -6
  413. package/lib/Utils/use-mongo-file-auth-state.js +0 -84
  414. package/lib/Utils/use-single-file-auth-state.d.ts +0 -13
  415. package/lib/Utils/use-single-file-auth-state.js +0 -80
  416. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.d.ts +0 -28
  417. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +0 -69
  418. package/lib/WAUSync/Protocols/USyncLIDProtocol.d.ts +0 -9
  419. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +0 -30
@@ -1,1579 +1,820 @@
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
-
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';
21
12
  const MIMETYPE_MAP = {
22
13
  image: 'image/jpeg',
23
14
  video: 'video/mp4',
24
15
  document: 'application/pdf',
25
- audio: 'audio/ogg codecs=opus',
16
+ audio: 'audio/ogg; codecs=opus',
26
17
  sticker: 'image/webp',
27
18
  'product-catalog-image': 'image/jpeg'
28
- }
29
-
19
+ };
30
20
  const MessageTypeProto = {
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
-
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
+ };
38
27
  /**
39
28
  * Uses a regex to test whether the string contains a URL, and returns the URL if it does.
40
29
  * @param text eg. hello https://google.com
41
30
  * @returns the URL, eg. https://google.com
42
31
  */
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
-
32
+ export const extractUrlFromText = (text) => text.match(URL_REGEX)?.[0];
33
+ export const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
34
+ const url = extractUrlFromText(text);
48
35
  if (!!getUrlInfo && url) {
49
36
  try {
50
- const urlInfo = await getUrlInfo(url)
51
- return urlInfo
37
+ const urlInfo = await getUrlInfo(url);
38
+ return urlInfo;
52
39
  }
53
-
54
- catch (error) {
55
- logger?.warn({ trace: error.stack }, 'url generation failed')
40
+ catch (error) {
41
+ // ignore if fails
42
+ logger?.warn({ trace: error.stack }, 'url generation failed');
56
43
  }
57
44
  }
58
- }
59
-
45
+ };
60
46
  const assertColor = async (color) => {
61
- let assertedColor
62
-
47
+ let assertedColor;
63
48
  if (typeof color === 'number') {
64
- assertedColor = color > 0 ? color : 0xffffffff + Number(color) + 1
49
+ assertedColor = color > 0 ? color : 0xffffffff + Number(color) + 1;
65
50
  }
66
-
67
51
  else {
68
- let hex = color.trim().replace('#', '')
52
+ let hex = color.trim().replace('#', '');
69
53
  if (hex.length <= 6) {
70
- hex = 'FF' + hex.padStart(6, '0')
54
+ hex = 'FF' + hex.padStart(6, '0');
71
55
  }
72
- assertedColor = parseInt(hex, 16)
73
- return assertedColor
56
+ assertedColor = parseInt(hex, 16);
57
+ return assertedColor;
74
58
  }
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) {
59
+ };
60
+ export const prepareWAMessageMedia = async (message, options) => {
61
+ const logger = options.logger;
62
+ let mediaType;
63
+ for (const key of MEDIA_KEYS) {
82
64
  if (key in message) {
83
- mediaType = key
65
+ mediaType = key;
84
66
  }
85
67
  }
86
-
87
68
  if (!mediaType) {
88
- throw new boom_1.Boom('Invalid media type', { statusCode: 400 })
69
+ throw new Boom('Invalid media type', { statusCode: 400 });
89
70
  }
90
-
91
71
  const uploadData = {
92
72
  ...message,
93
73
  media: message[mediaType]
94
- }
95
-
96
- delete uploadData[mediaType]
97
-
74
+ };
75
+ delete uploadData[mediaType];
98
76
  // check if cacheable + generate cache key
99
77
  const cacheableKey = typeof uploadData.media === 'object' &&
100
- ('url' in uploadData.media) &&
78
+ 'url' in uploadData.media &&
101
79
  !!uploadData.media.url &&
102
- !!options.mediaCache && (
103
- // generate the key
104
- mediaType + ':' + uploadData.media.url.toString())
105
-
80
+ !!options.mediaCache &&
81
+ mediaType + ':' + uploadData.media.url.toString();
106
82
  if (mediaType === 'document' && !uploadData.fileName) {
107
- uploadData.fileName = 'file'
83
+ uploadData.fileName = 'file';
108
84
  }
109
-
110
85
  if (!uploadData.mimetype) {
111
- uploadData.mimetype = MIMETYPE_MAP[mediaType]
86
+ uploadData.mimetype = MIMETYPE_MAP[mediaType];
112
87
  }
113
-
114
- // check for cache hit
115
88
  if (cacheableKey) {
116
- const mediaBuff = options.mediaCache.get(cacheableKey)
89
+ const mediaBuff = await options.mediaCache.get(cacheableKey);
117
90
  if (mediaBuff) {
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, {
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, {
134
139
  logger,
135
140
  saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
136
141
  opts: options.options
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([
142
+ });
143
+ const fileEncSha256B64 = fileEncSha256.toString('base64');
144
+ const [{ mediaUrl, directPath }] = await Promise.all([
143
145
  (async () => {
144
- const result = await options.upload(encFilePath, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs })
145
- logger?.debug({ mediaType, cacheableKey }, 'uploaded media')
146
-
147
- return result
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;
148
153
  })(),
149
154
  (async () => {
150
155
  try {
151
156
  if (requiresThumbnailComputation) {
152
- const { thumbnail, originalImageDimensions } = await messages_media_1.generateThumbnail(originalFilePath, mediaType, options)
153
- uploadData.jpegThumbnail = thumbnail
154
-
157
+ const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options);
158
+ uploadData.jpegThumbnail = thumbnail;
155
159
  if (!uploadData.width && originalImageDimensions) {
156
- uploadData.width = originalImageDimensions.width
157
- uploadData.height = originalImageDimensions.height
158
- logger?.debug('set dimensions')
160
+ uploadData.width = originalImageDimensions.width;
161
+ uploadData.height = originalImageDimensions.height;
162
+ logger?.debug('set dimensions');
159
163
  }
160
- logger?.debug('generated thumbnail')
164
+ logger?.debug('generated thumbnail');
161
165
  }
162
-
163
166
  if (requiresDurationComputation) {
164
- uploadData.seconds = await messages_media_1.getAudioDuration(originalFilePath)
165
- logger?.debug('computed audio duration')
167
+ uploadData.seconds = await getAudioDuration(originalFilePath);
168
+ logger?.debug('computed audio duration');
166
169
  }
167
-
168
170
  if (requiresWaveformProcessing) {
169
- uploadData.waveform = await messages_media_1.getAudioWaveform(originalFilePath, logger)
170
- logger?.debug('processed waveform')
171
+ uploadData.waveform = await getAudioWaveform(originalFilePath, logger);
172
+ logger?.debug('processed waveform');
171
173
  }
172
-
173
174
  if (requiresAudioBackground) {
174
- uploadData.backgroundArgb = await assertColor(options.backgroundColor)
175
- logger?.debug('computed backgroundColor audio status')
175
+ uploadData.backgroundArgb = await assertColor(options.backgroundColor);
176
+ logger?.debug('computed backgroundColor audio status');
176
177
  }
177
178
  }
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_1.promises.unlink(encFilePath)
185
+ await fs.unlink(encFilePath);
186
186
  if (originalFilePath) {
187
- await fs_1.promises.unlink(originalFilePath)
187
+ await fs.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 = Types_1.WAProto.Message.fromObject({
194
+ });
195
+ const obj = WAProto.Message.fromObject({
196
196
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
197
- url: handle ? undefined : mediaUrl,
197
+ url: mediaUrl,
198
198
  directPath,
199
- mediaKey: mediaKey,
200
- fileEncSha256: fileEncSha256,
199
+ mediaKey,
200
+ fileEncSha256,
201
201
  fileSha256,
202
202
  fileLength,
203
- mediaKeyTimestamp: handle ? undefined : generics_1.unixTimestampSeconds(),
203
+ mediaKeyTimestamp: unixTimestampSeconds(),
204
204
  ...uploadData,
205
205
  media: undefined
206
206
  })
207
- })
208
-
207
+ });
209
208
  if (uploadData.ptv) {
210
- obj.ptvMessage = obj.videoMessage
211
- delete obj.videoMessage
209
+ obj.ptvMessage = obj.videoMessage;
210
+ delete obj.videoMessage;
212
211
  }
213
-
214
212
  if (cacheableKey) {
215
- logger?.debug({ cacheableKey }, 'set cache')
216
- options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish())
213
+ logger?.debug({ cacheableKey }, 'set cache');
214
+ await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
217
215
  }
218
-
219
- return obj
220
- }
221
-
222
- const prepareDisappearingMessageSettingContent = (expiration) => {
216
+ return obj;
217
+ };
218
+ export const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
219
+ ephemeralExpiration = ephemeralExpiration || 0;
223
220
  const content = {
224
221
  ephemeralMessage: {
225
222
  message: {
226
223
  protocolMessage: {
227
- type: Types_1.WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
228
- ephemeralExpiration: expiration ? expiration : 0
224
+ type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
225
+ ephemeralExpiration
229
226
  }
230
227
  }
231
228
  }
232
- }
233
-
234
- return Types_1.WAProto.Message.fromObject(content)
235
- }
236
-
229
+ };
230
+ return WAProto.Message.fromObject(content);
231
+ };
237
232
  /**
238
233
  * Generate forwarded message content like WA does
239
234
  * @param message the message to forward
240
235
  * @param options.forceForward will show the message as forwarded even if it is from you
241
236
  */
242
- const generateForwardMessageContent = (message, forceForward) => {
243
- let content = message.message
244
-
237
+ export const generateForwardMessageContent = (message, forceForward) => {
238
+ let content = message.message;
245
239
  if (!content) {
246
- throw new boom_1.Boom('no content in message', { statusCode: 400 })
240
+ throw new Boom('no content in message', { statusCode: 400 });
247
241
  }
248
-
249
242
  // hacky copy
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
-
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;
258
248
  if (key === 'conversation') {
259
- content.extendedTextMessage = { text: content[key] }
260
- delete content.conversation
261
- key = 'extendedTextMessage'
249
+ content.extendedTextMessage = { text: content[key] };
250
+ delete content.conversation;
251
+ key = 'extendedTextMessage';
262
252
  }
263
-
253
+ const key_ = content?.[key];
264
254
  if (score > 0) {
265
- content[key].contextInfo = { forwardingScore: score, isForwarded: true }
255
+ key_.contextInfo = { forwardingScore: score, isForwarded: true };
266
256
  }
267
-
268
257
  else {
269
- content[key].contextInfo = {}
258
+ key_.contextInfo = {};
270
259
  }
271
-
272
- return content
273
- }
274
-
275
- const generateWAMessageContent = async (message, options) => {
276
- let m = {}
260
+ return content;
261
+ };
262
+ export const generateWAMessageContent = async (message, options) => {
263
+ var _a, _b;
264
+ let m = {};
277
265
  if ('text' in message) {
278
- const extContent = { text: message.text }
279
- let urlInfo = message.linkPreview
280
-
266
+ const extContent = { text: message.text };
267
+ let urlInfo = message.linkPreview;
281
268
  if (typeof urlInfo === 'undefined') {
282
- urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger)
269
+ urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
283
270
  }
284
-
285
271
  if (urlInfo) {
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
-
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;
294
278
  if (img) {
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
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;
302
286
  }
303
287
  }
304
-
305
288
  if (options.backgroundColor) {
306
- extContent.backgroundArgb = await assertColor(options.backgroundColor)
289
+ extContent.backgroundArgb = await assertColor(options.backgroundColor);
307
290
  }
308
-
309
- if (options.textColor) {
310
- extContent.textArgb = await assertColor(options.textColor)
311
- }
312
-
313
291
  if (options.font) {
314
- extContent.font = options.font
292
+ extContent.font = options.font;
315
293
  }
316
-
317
- extContent.contextInfo = {
318
- ...(message.contextInfo || {}),
319
- ...(message.mentions ? { mentionedJid: message.mentions } : {})
320
- }
321
-
322
- m.extendedTextMessage = extContent
294
+ m.extendedTextMessage = extContent;
323
295
  }
324
-
325
296
  else if ('contacts' in message) {
326
- const contactLen = message.contacts.contacts.length
327
-
328
- let contactMessage
329
-
297
+ const contactLen = message.contacts.contacts.length;
330
298
  if (!contactLen) {
331
- throw new boom_1.Boom('require atleast 1 contact', { statusCode: 400 })
299
+ throw new Boom('require atleast 1 contact', { statusCode: 400 });
332
300
  }
333
-
334
301
  if (contactLen === 1) {
335
- contactMessage = {
336
- contactMessage: Types_1.WAProto.Message.ContactMessage.fromObject(message.contacts.contacts[0])
337
- }
302
+ m.contactMessage = WAProto.Message.ContactMessage.create(message.contacts.contacts[0]);
338
303
  }
339
-
340
304
  else {
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 } : {})
305
+ m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.create(message.contacts);
351
306
  }
352
-
353
- m = contactMessage
354
307
  }
355
-
356
308
  else if ('location' in message) {
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
309
+ m.locationMessage = WAProto.Message.LocationMessage.create(message.location);
379
310
  }
380
-
381
311
  else if ('react' in message) {
382
312
  if (!message.react.senderTimestampMs) {
383
- message.react.senderTimestampMs = Date.now()
313
+ message.react.senderTimestampMs = Date.now();
384
314
  }
385
-
386
- m.reactionMessage = Types_1.WAProto.Message.ReactionMessage.fromObject(message.react)
315
+ m.reactionMessage = WAProto.Message.ReactionMessage.create(message.react);
387
316
  }
388
-
389
317
  else if ('delete' in message) {
390
318
  m.protocolMessage = {
391
319
  key: message.delete,
392
- type: Types_1.WAProto.Message.ProtocolMessage.Type.REVOKE
393
- }
394
- }
395
-
320
+ type: WAProto.Message.ProtocolMessage.Type.REVOKE
321
+ };
322
+ }
396
323
  else if ('forward' in message) {
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
324
+ m = generateForwardMessageContent(message.forward, message.force);
406
325
  }
407
-
408
326
  else if ('disappearingMessagesInChat' in message) {
409
- const exp = typeof message.disappearingMessagesInChat === 'boolean' ?
410
- (message.disappearingMessagesInChat ? Defaults_1.WA_DEFAULT_EPHEMERAL : 0) :
411
- message.disappearingMessagesInChat
412
- m = prepareDisappearingMessageSettingContent(exp)
327
+ const exp = typeof message.disappearingMessagesInChat === 'boolean'
328
+ ? message.disappearingMessagesInChat
329
+ ? WA_DEFAULT_EPHEMERAL
330
+ : 0
331
+ : message.disappearingMessagesInChat;
332
+ m = prepareDisappearingMessageSettingContent(exp);
413
333
  }
414
-
415
334
  else if ('groupInvite' in message) {
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
-
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!?
426
343
  if (options.getProfilePicUrl) {
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
452
- }
453
-
454
- m.newsletterAdminInviteMessage.contextInfo = {
455
- ...(message.contextInfo || {}),
456
- ...(message.mentions ? { mentionedJid: message.mentions } : {})
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
+ }
457
352
  }
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
469
353
  }
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
- }
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;
491
361
  }
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
-
506
362
  else if ('buttonReply' in message) {
507
363
  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
518
364
  case 'template':
519
365
  m.templateButtonReplyMessage = {
520
366
  selectedDisplayText: message.buttonReply.displayText,
521
367
  selectedId: message.buttonReply.id,
522
368
  selectedIndex: message.buttonReply.index
523
- }
524
- break
369
+ };
370
+ break;
525
371
  case 'plain':
526
372
  m.buttonsResponseMessage = {
527
373
  selectedButtonId: message.buttonReply.id,
528
374
  selectedDisplayText: message.buttonReply.displayText,
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
375
+ type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
376
+ };
377
+ break;
545
378
  }
546
379
  }
547
-
548
380
  else if ('ptv' in message && message.ptv) {
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
- }
381
+ const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
382
+ m.ptvMessage = videoMessage;
561
383
  }
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
-
576
384
  else if ('product' in message) {
577
- const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options)
578
-
579
- m.productMessage = Types_1.WAProto.Message.ProductMessage.fromObject({
385
+ const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
386
+ m.productMessage = WAProto.Message.ProductMessage.create({
580
387
  ...message,
581
388
  product: {
582
389
  ...message.product,
583
- productImage: imageMessage,
390
+ productImage: imageMessage
584
391
  }
585
- })
586
-
587
- m.productMessage.contextInfo = {
588
- ...(message.contextInfo || {}),
589
- ...(message.mentions ? { mentionedJid: message.mentions } : {})
590
- }
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;
591
416
  }
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
-
614
417
  else if ('poll' in message) {
418
+ (_a = message.poll).selectableCount || (_a.selectableCount = 0);
419
+ (_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
615
420
  if (!Array.isArray(message.poll.values)) {
616
- throw new boom_1.Boom('Invalid poll values', { statusCode: 400 })
421
+ throw new Boom('Invalid poll values', { statusCode: 400 });
617
422
  }
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 })
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
+ });
622
427
  }
623
-
428
+ m.messageContextInfo = {
429
+ // encKey
430
+ messageSecret: message.poll.messageSecret || randomBytes(32)
431
+ };
624
432
  const pollCreationMessage = {
625
433
  name: message.poll.name,
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 } : {})
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;
673
440
  }
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 } : {})
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
+ }
731
450
  }
732
- }
733
-
734
- else if ('sharePhoneNumber' in message) {
451
+ }
452
+ else if ('sharePhoneNumber' in message) {
735
453
  m.protocolMessage = {
736
- type: Types_1.WAProto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
737
- }
454
+ type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
455
+ };
738
456
  }
739
-
740
457
  else if ('requestPhoneNumber' in message) {
741
- m.requestPhoneNumberMessage = {}
742
- }
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
458
+ m.requestPhoneNumberMessage = {};
754
459
  }
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
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
814
468
  }
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 }
469
+ };
838
470
  }
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 }}
471
+ else {
472
+ m = await prepareWAMessageMedia(message, options);
867
473
  }
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 }
474
+ if ('viewOnce' in message && !!message.viewOnce) {
475
+ m = { viewOnceMessage: { message: m } };
1010
476
  }
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
- }
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;
1079
482
  }
1080
-
1081
- interactiveMessage.contextInfo = {
1082
- ...(message.contextInfo || {}),
1083
- ...(message.mentions ? { mentionedJid: message.mentions } : {})
483
+ else if (key) {
484
+ key.contextInfo = {
485
+ mentionedJid: message.mentions
486
+ };
1084
487
  }
1085
-
1086
- m = { interactiveMessage }
1087
488
  }
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
-
1101
489
  if ('edit' in message) {
1102
490
  m = {
1103
491
  protocolMessage: {
1104
492
  key: message.edit,
1105
493
  editedMessage: m,
1106
494
  timestampMs: Date.now(),
1107
- type: Types_1.WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
495
+ type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
1108
496
  }
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;
1109
507
  }
1110
508
  }
1111
-
1112
- return Types_1.WAProto.Message.fromObject(m)
1113
- }
1114
-
1115
- const generateWAMessageFromContent = (jid, message, options) => {
509
+ return WAProto.Message.create(m);
510
+ };
511
+ export const generateWAMessageFromContent = (jid, message, options) => {
512
+ // set timestamp to now
513
+ // if not specified
1116
514
  if (!options.timestamp) {
1117
- options.timestamp = new Date()
515
+ options.timestamp = new Date();
1118
516
  }
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)) {
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)) {
1126
522
  const participant = quoted.key.fromMe
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
-
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];
1137
530
  if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
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
-
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
1157
539
  if (jid !== quoted.key.remoteJid) {
1158
- contextInfo.remoteJid = quoted.key.remoteJid
540
+ contextInfo.remoteJid = quoted.key.remoteJid;
1159
541
  }
1160
-
1161
- if (key === 'requestPaymentMessage' && requestPayment) {
1162
- requestPayment.contextInfo = contextInfo
1163
- } else {
1164
- innerMessage[key].contextInfo = contextInfo
542
+ if (contextInfo && innerMessage[key]) {
543
+ /* @ts-ignore */
544
+ innerMessage[key].contextInfo = contextInfo;
1165
545
  }
1166
546
  }
1167
-
1168
- if (key !== 'protocolMessage' &&
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
1169
553
  key !== 'ephemeralMessage' &&
1170
- !WABinary_1.isJidNewsletter(jid)) {
1171
- message.messageContextInfo = {
1172
- messageSecret: crypto_1.randomBytes(32),
1173
- ...message.messageContextInfo
1174
- }
554
+ // newsletters don't support ephemeral messages
555
+ !isJidNewsletter(jid)) {
556
+ /* @ts-ignore */
1175
557
  innerMessage[key].contextInfo = {
1176
558
  ...(innerMessage[key].contextInfo || {}),
1177
- expiration: options.ephemeralExpiration ? options.ephemeralExpiration : 0
1178
- }
559
+ expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
560
+ //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
561
+ };
1179
562
  }
1180
-
1181
- message = Types_1.WAProto.Message.fromObject(message)
1182
-
563
+ message = WAProto.Message.create(message);
1183
564
  const messageJSON = {
1184
565
  key: {
1185
566
  remoteJid: jid,
1186
567
  fromMe: true,
1187
- id: options?.messageId || generics_1.generateMessageID()
568
+ id: options?.messageId || generateMessageIDV2()
1188
569
  },
1189
570
  message: message,
1190
571
  messageTimestamp: timestamp,
1191
572
  messageStubParameters: [],
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) => {
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) => {
1206
586
  if (content) {
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
587
+ const keys = Object.keys(content);
588
+ const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
589
+ return key;
1211
590
  }
1212
- }
1213
-
591
+ };
1214
592
  /**
1215
593
  * Normalizes ephemeral, view once messages to regular message content
1216
594
  * Eg. image messages in ephemeral messages, in view once messages etc.
1217
595
  * @param content
1218
596
  * @returns
1219
597
  */
1220
- const normalizeMessageContent = (content) => {
598
+ export const normalizeMessageContent = (content) => {
1221
599
  if (!content) {
1222
- return undefined
600
+ return undefined;
1223
601
  }
1224
-
602
+ // set max iterations to prevent an infinite loop
1225
603
  for (let i = 0; i < 5; i++) {
1226
- const inner = getFutureProofMessage(content)
604
+ const inner = getFutureProofMessage(content);
1227
605
  if (!inner) {
1228
- break
606
+ break;
1229
607
  }
1230
-
1231
- content = inner.message
608
+ content = inner.message;
1232
609
  }
1233
-
1234
- return content
1235
-
610
+ return content;
1236
611
  function getFutureProofMessage(message) {
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
-
612
+ return (message?.ephemeralMessage ||
613
+ message?.viewOnceMessage ||
614
+ message?.documentWithCaptionMessage ||
615
+ message?.viewOnceMessageV2 ||
616
+ message?.viewOnceMessageV2Extension ||
617
+ message?.editedMessage);
618
+ }
619
+ };
1264
620
  /**
1265
621
  * Extract the true message content from a message
1266
622
  * Eg. extracts the inner message from a disappearing message/view once message
1267
623
  */
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 }
624
+ export const extractMessageContent = (content) => {
625
+ const extractFromTemplateMessage = (msg) => {
626
+ if (msg.imageMessage) {
627
+ return { imageMessage: msg.imageMessage };
1274
628
  }
1275
-
1276
- else if (header ? msg.header?.documentMessage : msg.documentMessage) {
1277
- return { documentMessage: header ? msg.header.documentMessage : msg.documentMessage }
629
+ else if (msg.documentMessage) {
630
+ return { documentMessage: msg.documentMessage };
1278
631
  }
1279
-
1280
- else if (header ? msg.header?.videoMessage : msg.videoMessage) {
1281
- return { videoMessage: header ? msg.header.videoMessage: msg.videoMessage }
632
+ else if (msg.videoMessage) {
633
+ return { videoMessage: msg.videoMessage };
1282
634
  }
1283
-
1284
- else if (header ? msg.header?.locationMessage : msg.locationMessage) {
1285
- return { locationMessage: header ? msg.header.locationMessage : msg.locationMessage }
635
+ else if (msg.locationMessage) {
636
+ return { locationMessage: msg.locationMessage };
1286
637
  }
1287
-
1288
- else if (header ? msg.header?.productMessage : msg.productMessage) {
1289
- return { productMessage: header ? msg.header.productMessage : msg.productMessage }
1290
- }
1291
-
1292
638
  else {
1293
639
  return {
1294
- conversation: 'contentText' in msg
1295
- ? msg.contentText
1296
- : ('hydratedContentText' in msg ? msg.hydratedContentText : 'body' in msg ? msg.body.text : '')
1297
- }
640
+ conversation: 'contentText' in msg ? msg.contentText : 'hydratedContentText' in msg ? msg.hydratedContentText : ''
641
+ };
1298
642
  }
1299
- }
1300
-
1301
- content = normalizeMessageContent(content)
1302
-
643
+ };
644
+ content = normalizeMessageContent(content);
1303
645
  if (content?.buttonsMessage) {
1304
- return extractFromButtonsMessage(content.buttonsMessage)
1305
- }
1306
-
1307
- if (content?.interactiveMessage) {
1308
- return extractFromButtonsMessage(content.interactiveMessage)
646
+ return extractFromTemplateMessage(content.buttonsMessage);
1309
647
  }
1310
-
1311
- if (content?.templateMessage?.interactiveMessageTemplate) {
1312
- return extractFromButtonsMessage(content?.templateMessage?.interactiveMessageTemplate)
1313
- }
1314
-
1315
648
  if (content?.templateMessage?.hydratedFourRowTemplate) {
1316
- return extractFromButtonsMessage(content?.templateMessage?.hydratedFourRowTemplate)
649
+ return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
1317
650
  }
1318
-
1319
651
  if (content?.templateMessage?.hydratedTemplate) {
1320
- return extractFromButtonsMessage(content?.templateMessage?.hydratedTemplate)
652
+ return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
1321
653
  }
1322
-
1323
654
  if (content?.templateMessage?.fourRowTemplate) {
1324
- return extractFromButtonsMessage(content?.templateMessage?.fourRowTemplate)
655
+ return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
1325
656
  }
1326
-
1327
- return content
1328
- }
1329
-
657
+ return content;
658
+ };
1330
659
  /**
1331
660
  * Returns the device predicted by message ID
1332
661
  */
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
-
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';
1339
671
  /** Upserts a receipt in the message */
1340
- const updateMessageWithReceipt = (msg, receipt) => {
1341
- msg.userReceipt = msg.userReceipt || []
1342
- const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid)
1343
-
672
+ export const updateMessageWithReceipt = (msg, receipt) => {
673
+ msg.userReceipt = msg.userReceipt || [];
674
+ const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
1344
675
  if (recp) {
1345
- Object.assign(recp, receipt)
676
+ Object.assign(recp, receipt);
1346
677
  }
1347
-
1348
678
  else {
1349
- msg.userReceipt.push(receipt)
679
+ msg.userReceipt.push(receipt);
1350
680
  }
1351
- }
1352
-
681
+ };
1353
682
  /** Update the message with a new reaction */
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
-
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
+ };
1364
690
  /** Update the message with a new poll update */
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
-
691
+ export const updateMessageWithPollUpdate = (msg, update) => {
692
+ const authorID = getKeyAuthor(update.pollUpdateMessageKey);
693
+ const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
1370
694
  if (update.vote?.selectedOptions?.length) {
1371
- votes.push(update)
695
+ reactions.push(update);
1372
696
  }
1373
-
1374
- msg.pollUpdates = votes
1375
- }
1376
-
697
+ msg.pollUpdates = reactions;
698
+ };
1377
699
  /**
1378
700
  * Aggregates all poll updates in a poll.
1379
701
  * @param msg the poll creation message
1380
702
  * @param meId your jid
1381
703
  * @returns A list of options & their voters
1382
704
  */
1383
- function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
1384
- message = normalizeMessageContent(message)
1385
-
1386
- const opts = message?.pollCreationMessage?.options || message?.pollCreationMessageV2?.options || message?.pollCreationMessageV3?.options || []
1387
-
705
+ export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
706
+ const opts = message?.pollCreationMessage?.options ||
707
+ message?.pollCreationMessageV2?.options ||
708
+ message?.pollCreationMessageV3?.options ||
709
+ [];
1388
710
  const voteHashMap = opts.reduce((acc, opt) => {
1389
- const hash = crypto_2.sha256(Buffer.from(opt.optionName || '')).toString()
711
+ const hash = sha256(Buffer.from(opt.optionName || '')).toString();
1390
712
  acc[hash] = {
1391
713
  name: opt.optionName || '',
1392
714
  voters: []
1393
- }
1394
-
1395
- return acc
1396
- }, {})
1397
-
715
+ };
716
+ return acc;
717
+ }, {});
1398
718
  for (const update of pollUpdates || []) {
1399
- const { vote } = update
1400
-
719
+ const { vote } = update;
1401
720
  if (!vote) {
1402
- continue
721
+ continue;
1403
722
  }
1404
-
1405
723
  for (const option of vote.selectedOptions || []) {
1406
- const hash = option.toString()
1407
- let data = voteHashMap[hash]
1408
-
724
+ const hash = option.toString();
725
+ let data = voteHashMap[hash];
1409
726
  if (!data) {
1410
727
  voteHashMap[hash] = {
1411
728
  name: 'Unknown',
1412
729
  voters: []
1413
- }
1414
-
1415
- data = voteHashMap[hash]
730
+ };
731
+ data = voteHashMap[hash];
1416
732
  }
1417
-
1418
- voteHashMap[hash].voters.push(generics_1.getKeyAuthor(update.pollUpdateMessageKey, meId))
733
+ voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
1419
734
  }
1420
735
  }
1421
-
1422
- return Object.values(voteHashMap)
736
+ return Object.values(voteHashMap);
1423
737
  }
1424
-
1425
738
  /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
1426
- const aggregateMessageKeysNotFromMe = (keys) => {
1427
- const keyMap = {}
1428
-
739
+ export const aggregateMessageKeysNotFromMe = (keys) => {
740
+ const keyMap = {};
1429
741
  for (const { remoteJid, id, participant, fromMe } of keys) {
1430
742
  if (!fromMe) {
1431
- const uqKey = `${remoteJid}:${participant || ''}`
1432
-
743
+ const uqKey = `${remoteJid}:${participant || ''}`;
1433
744
  if (!keyMap[uqKey]) {
1434
745
  keyMap[uqKey] = {
1435
746
  jid: remoteJid,
1436
747
  participant: participant,
1437
748
  messageIds: []
1438
- }
749
+ };
1439
750
  }
1440
-
1441
- keyMap[uqKey].messageIds.push(id)
751
+ keyMap[uqKey].messageIds.push(id);
1442
752
  }
1443
753
  }
1444
-
1445
- return Object.values(keyMap)
1446
- }
1447
-
1448
- const REUPLOAD_REQUIRED_STATUS = [410, 404]
1449
-
754
+ return Object.values(keyMap);
755
+ };
756
+ const REUPLOAD_REQUIRED_STATUS = [410, 404];
1450
757
  /**
1451
758
  * Downloads the given message. Throws an error if it's not a media message
1452
759
  */
1453
- const downloadMediaMessage = async (message, type, options, ctx) => {
760
+ export const downloadMediaMessage = async (message, type, options, ctx) => {
1454
761
  const result = await downloadMsg().catch(async (error) => {
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
-
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...');
1459
766
  // request reupload
1460
- message = await ctx.reuploadRequest(message)
1461
-
1462
- const result = await downloadMsg()
1463
-
1464
- return result
767
+ message = await ctx.reuploadRequest(message);
768
+ const result = await downloadMsg();
769
+ return result;
1465
770
  }
1466
-
1467
- throw error
1468
- })
1469
-
1470
- return result
1471
-
771
+ throw error;
772
+ });
773
+ return result;
1472
774
  async function downloadMsg() {
1473
- const mContent = extractMessageContent(message.message)
1474
-
775
+ const mContent = extractMessageContent(message.message);
1475
776
  if (!mContent) {
1476
- throw new boom_1.Boom('No message present', { statusCode: 400, data: message })
777
+ throw new Boom('No message present', { statusCode: 400, data: message });
1477
778
  }
1478
-
1479
- const contentType = getContentType(mContent)
1480
- let mediaType = contentType?.replace('Message', '')
1481
- const media = contentType === 'productMessage' ? mContent[contentType]?.product?.productImage : mContent[contentType]
1482
-
779
+ const contentType = getContentType(mContent);
780
+ let mediaType = contentType?.replace('Message', '');
781
+ const media = mContent[contentType];
1483
782
  if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
1484
- throw new boom_1.Boom(`"${contentType}" message is not a media message`)
783
+ throw new Boom(`"${contentType}" message is not a media message`);
1485
784
  }
1486
-
1487
- let download
1488
-
785
+ let download;
1489
786
  if ('thumbnailDirectPath' in media && !('url' in media)) {
1490
787
  download = {
1491
788
  directPath: media.thumbnailDirectPath,
1492
789
  mediaKey: media.mediaKey
1493
- }
1494
- mediaType = 'thumbnail-link'
790
+ };
791
+ mediaType = 'thumbnail-link';
1495
792
  }
1496
-
1497
793
  else {
1498
- download = media
794
+ download = media;
1499
795
  }
1500
-
1501
- const stream = await messages_media_1.downloadContentFromMessage(download, mediaType, options)
1502
-
796
+ const stream = await downloadContentFromMessage(download, mediaType, options);
1503
797
  if (type === 'buffer') {
1504
- const bufferArray = []
1505
-
798
+ const bufferArray = [];
1506
799
  for await (const chunk of stream) {
1507
- bufferArray.push(chunk)
800
+ bufferArray.push(chunk);
1508
801
  }
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
-
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;
1527
815
  if (!mediaContent) {
1528
- throw new boom_1.Boom('given message is not a media message', { statusCode: 400, data: content })
816
+ throw new Boom('given message is not a media message', { statusCode: 400, data: content });
1529
817
  }
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
- }
818
+ return mediaContent;
819
+ };
820
+ //# sourceMappingURL=messages.js.map