phantom-baileys 0.0.8 → 0.1.3

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 (441) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +592 -0
  3. package/WAProto/GenerateStatics.sh +3 -0
  4. package/WAProto/WAProto.proto +5479 -0
  5. package/WAProto/fix-imports.js +81 -0
  6. package/WAProto/index.d.ts +5147 -41513
  7. package/WAProto/index.js +84008 -142014
  8. package/lib/Defaults/index.d.ts +29 -8
  9. package/lib/Defaults/index.d.ts.map +1 -0
  10. package/lib/Defaults/index.js +80 -60
  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/{WASignalGroup/sender_message_key.js → lib/Signal/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 -3
  61. package/lib/Signal/libsignal.d.ts.map +1 -0
  62. package/lib/Signal/libsignal.js +331 -80
  63. package/lib/Signal/libsignal.js.map +1 -0
  64. package/lib/Signal/lid-mapping.d.ts +19 -0
  65. package/lib/Signal/lid-mapping.d.ts.map +1 -0
  66. package/lib/Signal/lid-mapping.js +271 -0
  67. package/lib/Signal/lid-mapping.js.map +1 -0
  68. package/lib/Socket/Client/index.d.ts +3 -3
  69. package/lib/Socket/Client/index.d.ts.map +1 -0
  70. package/lib/Socket/Client/index.js +3 -19
  71. package/lib/Socket/Client/index.js.map +1 -0
  72. package/lib/Socket/Client/{abstract-socket-client.d.ts → types.d.ts} +4 -5
  73. package/lib/Socket/Client/types.d.ts.map +1 -0
  74. package/lib/Socket/Client/types.js +11 -0
  75. package/lib/Socket/Client/types.js.map +1 -0
  76. package/lib/Socket/Client/{web-socket-client.d.ts → websocket.d.ts} +3 -2
  77. package/lib/Socket/Client/websocket.d.ts.map +1 -0
  78. package/lib/Socket/Client/websocket.js +54 -0
  79. package/lib/Socket/Client/websocket.js.map +1 -0
  80. package/lib/Socket/business.d.ts +184 -101
  81. package/lib/Socket/business.d.ts.map +1 -0
  82. package/lib/Socket/business.js +162 -43
  83. package/lib/Socket/business.js.map +1 -0
  84. package/lib/Socket/chats.d.ts +72 -42
  85. package/lib/Socket/chats.d.ts.map +1 -0
  86. package/lib/Socket/chats.js +340 -299
  87. package/lib/Socket/chats.js.map +1 -0
  88. package/lib/Socket/communities.d.ts +309 -0
  89. package/lib/Socket/communities.d.ts.map +1 -0
  90. package/lib/Socket/communities.js +431 -0
  91. package/lib/Socket/communities.js.map +1 -0
  92. package/lib/Socket/dugong.d.ts +79 -0
  93. package/lib/Socket/dugong.d.ts.map +1 -0
  94. package/lib/Socket/dugong.js +527 -0
  95. package/lib/Socket/dugong.js.map +1 -0
  96. package/lib/Socket/groups.d.ts +93 -58
  97. package/lib/Socket/groups.d.ts.map +1 -0
  98. package/lib/Socket/groups.js +96 -84
  99. package/lib/Socket/groups.js.map +1 -0
  100. package/lib/Socket/index.d.ts +232 -107
  101. package/lib/Socket/index.d.ts.map +1 -0
  102. package/lib/Socket/index.js +13 -10
  103. package/lib/Socket/index.js.map +1 -0
  104. package/lib/Socket/messages-recv.d.ts +170 -90
  105. package/lib/Socket/messages-recv.d.ts.map +1 -0
  106. package/lib/Socket/messages-recv.js +798 -462
  107. package/lib/Socket/messages-recv.js.map +1 -0
  108. package/lib/Socket/messages-send.d.ts +180 -99
  109. package/lib/Socket/messages-send.d.ts.map +1 -0
  110. package/lib/Socket/messages-send.js +833 -709
  111. package/lib/Socket/messages-send.js.map +1 -0
  112. package/lib/Socket/mex.d.ts +3 -0
  113. package/lib/Socket/mex.d.ts.map +1 -0
  114. package/lib/Socket/mex.js +42 -0
  115. package/lib/Socket/mex.js.map +1 -0
  116. package/lib/Socket/newsletter.d.ts +120 -75
  117. package/lib/Socket/newsletter.d.ts.map +1 -0
  118. package/lib/Socket/newsletter.js +227 -198
  119. package/lib/Socket/newsletter.js.map +1 -0
  120. package/lib/Socket/socket.d.ts +31 -20
  121. package/lib/Socket/socket.d.ts.map +1 -0
  122. package/lib/Socket/socket.js +508 -215
  123. package/lib/Socket/socket.js.map +1 -0
  124. package/lib/Types/Auth.d.ts +18 -11
  125. package/lib/Types/Auth.d.ts.map +1 -0
  126. package/lib/Types/Auth.js +2 -2
  127. package/lib/Types/Auth.js.map +1 -0
  128. package/lib/Types/Bussines.d.ts +25 -0
  129. package/lib/Types/Bussines.d.ts.map +1 -0
  130. package/lib/Types/Bussines.js +2 -0
  131. package/lib/Types/Bussines.js.map +1 -0
  132. package/lib/Types/Call.d.ts +2 -0
  133. package/lib/Types/Call.d.ts.map +1 -0
  134. package/lib/Types/Call.js +2 -2
  135. package/lib/Types/Call.js.map +1 -0
  136. package/lib/Types/Chat.d.ts +24 -8
  137. package/lib/Types/Chat.d.ts.map +1 -0
  138. package/lib/Types/Chat.js +8 -4
  139. package/lib/Types/Chat.js.map +1 -0
  140. package/lib/Types/Contact.d.ts +6 -1
  141. package/lib/Types/Contact.d.ts.map +1 -0
  142. package/lib/Types/Contact.js +2 -2
  143. package/lib/Types/Contact.js.map +1 -0
  144. package/lib/Types/Events.d.ts +82 -17
  145. package/lib/Types/Events.d.ts.map +1 -0
  146. package/lib/Types/Events.js +2 -2
  147. package/lib/Types/Events.js.map +1 -0
  148. package/lib/Types/GroupMetadata.d.ts +15 -3
  149. package/lib/Types/GroupMetadata.d.ts.map +1 -0
  150. package/lib/Types/GroupMetadata.js +2 -2
  151. package/lib/Types/GroupMetadata.js.map +1 -0
  152. package/lib/Types/Label.d.ts +1 -0
  153. package/lib/Types/Label.d.ts.map +1 -0
  154. package/lib/Types/Label.js +3 -5
  155. package/lib/Types/Label.js.map +1 -0
  156. package/lib/Types/LabelAssociation.d.ts +1 -0
  157. package/lib/Types/LabelAssociation.d.ts.map +1 -0
  158. package/lib/Types/LabelAssociation.js +3 -5
  159. package/lib/Types/LabelAssociation.js.map +1 -0
  160. package/lib/Types/Message.d.ts +77 -202
  161. package/lib/Types/Message.d.ts.map +1 -0
  162. package/lib/Types/Message.js +11 -9
  163. package/lib/Types/Message.js.map +1 -0
  164. package/lib/Types/Newsletter.d.ts +128 -85
  165. package/lib/Types/Newsletter.d.ts.map +1 -0
  166. package/lib/Types/Newsletter.js +25 -26
  167. package/lib/Types/Newsletter.js.map +1 -0
  168. package/lib/Types/Product.d.ts +2 -1
  169. package/lib/Types/Product.d.ts.map +1 -0
  170. package/lib/Types/Product.js +2 -2
  171. package/lib/Types/Product.js.map +1 -0
  172. package/lib/Types/Signal.d.ts +20 -1
  173. package/lib/Types/Signal.d.ts.map +1 -0
  174. package/lib/Types/Signal.js +2 -2
  175. package/lib/Types/Signal.js.map +1 -0
  176. package/lib/Types/Socket.d.ts +41 -24
  177. package/lib/Types/Socket.d.ts.map +1 -0
  178. package/lib/Types/Socket.js +3 -2
  179. package/lib/Types/Socket.js.map +1 -0
  180. package/lib/Types/State.d.ts +14 -2
  181. package/lib/Types/State.d.ts.map +1 -0
  182. package/lib/Types/State.js +13 -2
  183. package/lib/Types/State.js.map +1 -0
  184. package/lib/Types/USync.d.ts +3 -2
  185. package/lib/Types/USync.d.ts.map +1 -0
  186. package/lib/Types/USync.js +2 -2
  187. package/lib/Types/USync.js.map +1 -0
  188. package/lib/Types/index.d.ts +15 -16
  189. package/lib/Types/index.d.ts.map +1 -0
  190. package/lib/Types/index.js +15 -31
  191. package/lib/Types/index.js.map +1 -0
  192. package/lib/Utils/auth-utils.d.ts +7 -6
  193. package/lib/Utils/auth-utils.d.ts.map +1 -0
  194. package/lib/Utils/auth-utils.js +228 -165
  195. package/lib/Utils/auth-utils.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 +4 -3
  201. package/lib/Utils/business.d.ts.map +1 -0
  202. package/lib/Utils/business.js +66 -69
  203. package/lib/Utils/business.js.map +1 -0
  204. package/lib/Utils/chat-utils.d.ts +16 -16
  205. package/lib/Utils/chat-utils.d.ts.map +1 -0
  206. package/lib/Utils/chat-utils.js +299 -232
  207. package/lib/Utils/chat-utils.js.map +1 -0
  208. package/lib/Utils/crypto.d.ts +18 -21
  209. package/lib/Utils/crypto.d.ts.map +1 -0
  210. package/lib/Utils/crypto.js +44 -125
  211. package/lib/Utils/crypto.js.map +1 -0
  212. package/lib/Utils/decode-wa-message.d.ts +20 -8
  213. package/lib/Utils/decode-wa-message.d.ts.map +1 -0
  214. package/lib/Utils/decode-wa-message.js +139 -90
  215. package/lib/Utils/decode-wa-message.js.map +1 -0
  216. package/lib/Utils/event-buffer.d.ts +7 -8
  217. package/lib/Utils/event-buffer.d.ts.map +1 -0
  218. package/lib/Utils/event-buffer.js +129 -72
  219. package/lib/Utils/event-buffer.js.map +1 -0
  220. package/lib/Utils/generics.d.ts +25 -22
  221. package/lib/Utils/generics.d.ts.map +1 -0
  222. package/lib/Utils/generics.js +157 -175
  223. package/lib/Utils/generics.js.map +1 -0
  224. package/lib/Utils/history.d.ts +14 -11
  225. package/lib/Utils/history.d.ts.map +1 -0
  226. package/lib/Utils/history.js +83 -46
  227. package/lib/Utils/history.js.map +1 -0
  228. package/lib/Utils/identity-change-handler.d.ts +37 -0
  229. package/lib/Utils/identity-change-handler.d.ts.map +1 -0
  230. package/lib/Utils/identity-change-handler.js +49 -0
  231. package/lib/Utils/identity-change-handler.js.map +1 -0
  232. package/lib/Utils/index.d.ts +22 -17
  233. package/lib/Utils/index.d.ts.map +1 -0
  234. package/lib/Utils/index.js +22 -33
  235. package/lib/Utils/index.js.map +1 -0
  236. package/lib/Utils/link-preview.d.ts +5 -5
  237. package/lib/Utils/link-preview.d.ts.map +1 -0
  238. package/lib/Utils/link-preview.js +14 -22
  239. package/lib/Utils/link-preview.js.map +1 -0
  240. package/lib/Utils/logger.d.ts +12 -1
  241. package/lib/Utils/logger.d.ts.map +1 -0
  242. package/lib/Utils/logger.js +3 -7
  243. package/lib/Utils/logger.js.map +1 -0
  244. package/lib/Utils/lt-hash.d.ts +8 -12
  245. package/lib/Utils/lt-hash.d.ts.map +1 -0
  246. package/lib/Utils/lt-hash.js +3 -46
  247. package/lib/Utils/lt-hash.js.map +1 -0
  248. package/lib/Utils/make-mutex.d.ts +2 -0
  249. package/lib/Utils/make-mutex.d.ts.map +1 -0
  250. package/lib/Utils/make-mutex.js +24 -34
  251. package/lib/Utils/make-mutex.js.map +1 -0
  252. package/lib/Utils/message-retry-manager.d.ts +110 -0
  253. package/lib/Utils/message-retry-manager.d.ts.map +1 -0
  254. package/lib/Utils/message-retry-manager.js +225 -0
  255. package/lib/Utils/message-retry-manager.js.map +1 -0
  256. package/lib/Utils/messages-media.d.ts +59 -42
  257. package/lib/Utils/messages-media.d.ts.map +1 -0
  258. package/lib/Utils/messages-media.js +411 -356
  259. package/lib/Utils/messages-media.js.map +1 -0
  260. package/lib/Utils/messages.d.ts +32 -18
  261. package/lib/Utils/messages.d.ts.map +1 -0
  262. package/lib/Utils/messages.js +412 -723
  263. package/lib/Utils/messages.js.map +1 -0
  264. package/lib/Utils/noise-handler.d.ts +13 -13
  265. package/lib/Utils/noise-handler.d.ts.map +1 -0
  266. package/lib/Utils/noise-handler.js +149 -108
  267. package/lib/Utils/noise-handler.js.map +1 -0
  268. package/lib/Utils/offline-node-processor.d.ts +17 -0
  269. package/lib/Utils/offline-node-processor.d.ts.map +1 -0
  270. package/lib/Utils/offline-node-processor.js +40 -0
  271. package/lib/Utils/offline-node-processor.js.map +1 -0
  272. package/lib/Utils/pre-key-manager.d.ts +28 -0
  273. package/lib/Utils/pre-key-manager.d.ts.map +1 -0
  274. package/lib/Utils/pre-key-manager.js +106 -0
  275. package/lib/Utils/pre-key-manager.js.map +1 -0
  276. package/lib/Utils/process-message.d.ts +30 -11
  277. package/lib/Utils/process-message.d.ts.map +1 -0
  278. package/lib/Utils/process-message.js +321 -166
  279. package/lib/Utils/process-message.js.map +1 -0
  280. package/lib/Utils/reporting-utils.d.ts +11 -0
  281. package/lib/Utils/reporting-utils.d.ts.map +1 -0
  282. package/lib/Utils/reporting-utils.js +258 -0
  283. package/lib/Utils/reporting-utils.js.map +1 -0
  284. package/lib/Utils/rich-messages.d.ts +129 -0
  285. package/lib/Utils/rich-messages.d.ts.map +1 -0
  286. package/lib/Utils/rich-messages.js +455 -0
  287. package/lib/Utils/rich-messages.js.map +1 -0
  288. package/lib/Utils/signal.d.ts +7 -6
  289. package/lib/Utils/signal.d.ts.map +1 -0
  290. package/lib/Utils/signal.js +65 -65
  291. package/lib/Utils/signal.js.map +1 -0
  292. package/lib/Utils/stanza-ack.d.ts +11 -0
  293. package/lib/Utils/stanza-ack.d.ts.map +1 -0
  294. package/lib/Utils/stanza-ack.js +38 -0
  295. package/lib/Utils/stanza-ack.js.map +1 -0
  296. package/lib/Utils/sync-action-utils.d.ts +19 -0
  297. package/lib/Utils/sync-action-utils.d.ts.map +1 -0
  298. package/lib/Utils/sync-action-utils.js +48 -0
  299. package/lib/Utils/sync-action-utils.js.map +1 -0
  300. package/lib/Utils/tc-token-utils.d.ts +12 -0
  301. package/lib/Utils/tc-token-utils.d.ts.map +1 -0
  302. package/lib/Utils/tc-token-utils.js +18 -0
  303. package/lib/Utils/tc-token-utils.js.map +1 -0
  304. package/lib/Utils/use-multi-file-auth-state.d.ts +2 -1
  305. package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
  306. package/lib/Utils/use-multi-file-auth-state.js +79 -253
  307. package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
  308. package/lib/Utils/validate-connection.d.ts +6 -6
  309. package/lib/Utils/validate-connection.d.ts.map +1 -0
  310. package/lib/Utils/validate-connection.js +111 -116
  311. package/lib/Utils/validate-connection.js.map +1 -0
  312. package/lib/WABinary/constants.d.ts +5 -4
  313. package/lib/WABinary/constants.d.ts.map +1 -0
  314. package/lib/WABinary/constants.js +1281 -20
  315. package/lib/WABinary/constants.js.map +1 -0
  316. package/lib/WABinary/decode.d.ts +4 -3
  317. package/lib/WABinary/decode.d.ts.map +1 -0
  318. package/lib/WABinary/decode.js +51 -53
  319. package/lib/WABinary/decode.js.map +1 -0
  320. package/lib/WABinary/encode.d.ts +2 -1
  321. package/lib/WABinary/encode.d.ts.map +1 -0
  322. package/lib/WABinary/encode.js +12 -44
  323. package/lib/WABinary/encode.js.map +1 -0
  324. package/lib/WABinary/generic-utils.d.ts +9 -6
  325. package/lib/WABinary/generic-utils.d.ts.map +1 -0
  326. package/lib/WABinary/generic-utils.js +124 -43
  327. package/lib/WABinary/generic-utils.js.map +1 -0
  328. package/lib/WABinary/index.d.ts +6 -5
  329. package/lib/WABinary/index.d.ts.map +1 -0
  330. package/lib/WABinary/index.js +6 -21
  331. package/lib/WABinary/index.js.map +1 -0
  332. package/lib/WABinary/jid-utils.d.ts +24 -7
  333. package/lib/WABinary/jid-utils.d.ts.map +1 -0
  334. package/lib/WABinary/jid-utils.js +74 -40
  335. package/lib/WABinary/jid-utils.js.map +1 -0
  336. package/lib/WABinary/types.d.ts +2 -1
  337. package/lib/WABinary/types.d.ts.map +1 -0
  338. package/lib/WABinary/types.js +2 -2
  339. package/lib/WABinary/types.js.map +1 -0
  340. package/lib/WAM/BinaryInfo.d.ts +2 -1
  341. package/lib/WAM/BinaryInfo.d.ts.map +1 -0
  342. package/lib/WAM/BinaryInfo.js +2 -5
  343. package/lib/WAM/BinaryInfo.js.map +1 -0
  344. package/lib/WAM/constants.d.ts +5 -3
  345. package/lib/WAM/constants.d.ts.map +1 -0
  346. package/lib/WAM/constants.js +19071 -11568
  347. package/lib/WAM/constants.js.map +1 -0
  348. package/lib/WAM/encode.d.ts +3 -2
  349. package/lib/WAM/encode.d.ts.map +1 -0
  350. package/lib/WAM/encode.js +17 -22
  351. package/lib/WAM/encode.js.map +1 -0
  352. package/lib/WAM/index.d.ts +4 -3
  353. package/lib/WAM/index.d.ts.map +1 -0
  354. package/lib/WAM/index.js +4 -19
  355. package/lib/WAM/index.js.map +1 -0
  356. package/lib/WAProto/fix-imports.d.ts +1 -0
  357. package/lib/WAProto/fix-imports.js +71 -0
  358. package/lib/WAProto/index.js +89345 -0
  359. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +4 -3
  360. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
  361. package/lib/WAUSync/Protocols/USyncContactProtocol.js +8 -11
  362. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
  363. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +3 -2
  364. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
  365. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +11 -14
  366. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
  367. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +3 -2
  368. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
  369. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +9 -12
  370. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
  371. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +3 -2
  372. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
  373. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +9 -13
  374. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
  375. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +4 -3
  376. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
  377. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +20 -22
  378. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
  379. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +5 -3
  380. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
  381. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +13 -8
  382. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
  383. package/lib/WAUSync/Protocols/index.d.ts +5 -4
  384. package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
  385. package/lib/WAUSync/Protocols/index.js +5 -20
  386. package/lib/WAUSync/Protocols/index.js.map +1 -0
  387. package/lib/WAUSync/USyncQuery.d.ts +5 -4
  388. package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
  389. package/lib/WAUSync/USyncQuery.js +40 -35
  390. package/lib/WAUSync/USyncQuery.js.map +1 -0
  391. package/lib/WAUSync/USyncUser.d.ts +7 -4
  392. package/lib/WAUSync/USyncUser.d.ts.map +1 -0
  393. package/lib/WAUSync/USyncUser.js +2 -5
  394. package/lib/WAUSync/USyncUser.js.map +1 -0
  395. package/lib/WAUSync/index.d.ts +4 -3
  396. package/lib/WAUSync/index.d.ts.map +1 -0
  397. package/lib/WAUSync/index.js +4 -19
  398. package/lib/WAUSync/index.js.map +1 -0
  399. package/lib/index.d.ts +13 -0
  400. package/lib/index.d.ts.map +1 -0
  401. package/lib/index.js +16 -31
  402. package/lib/index.js.map +1 -0
  403. package/package.json +34 -74
  404. package/Readme.md +0 -1
  405. package/WASignalGroup/GroupProtocol.js +0 -1697
  406. package/WASignalGroup/ciphertext_message.js +0 -16
  407. package/WASignalGroup/group_cipher.js +0 -120
  408. package/WASignalGroup/group_session_builder.js +0 -46
  409. package/WASignalGroup/index.js +0 -5
  410. package/WASignalGroup/keyhelper.js +0 -21
  411. package/WASignalGroup/protobufs.js +0 -3
  412. package/WASignalGroup/queue_job.js +0 -69
  413. package/WASignalGroup/sender_chain_key.js +0 -50
  414. package/WASignalGroup/sender_key_distribution_message.js +0 -78
  415. package/WASignalGroup/sender_key_message.js +0 -92
  416. package/WASignalGroup/sender_key_name.js +0 -70
  417. package/WASignalGroup/sender_key_record.js +0 -56
  418. package/WASignalGroup/sender_key_state.js +0 -129
  419. package/lib/Defaults/baileys-version.json +0 -3
  420. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  421. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -13
  422. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  423. package/lib/Socket/Client/web-socket-client.js +0 -62
  424. package/lib/Socket/registration.d.ts +0 -264
  425. package/lib/Socket/registration.js +0 -166
  426. package/lib/Socket/usync.d.ts +0 -37
  427. package/lib/Socket/usync.js +0 -70
  428. package/lib/Store/index.d.ts +0 -3
  429. package/lib/Store/index.js +0 -10
  430. package/lib/Store/make-cache-manager-store.d.ts +0 -14
  431. package/lib/Store/make-cache-manager-store.js +0 -83
  432. package/lib/Store/make-in-memory-store.d.ts +0 -118
  433. package/lib/Store/make-in-memory-store.js +0 -431
  434. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  435. package/lib/Store/make-ordered-dictionary.js +0 -81
  436. package/lib/Store/object-repository.d.ts +0 -10
  437. package/lib/Store/object-repository.js +0 -27
  438. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  439. package/lib/Utils/baileys-event-stream.js +0 -63
  440. package/lib/Utils/use-single-file-auth-state.d.ts +0 -12
  441. package/lib/Utils/use-single-file-auth-state.js +0 -75
@@ -1,56 +1,49 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.assertMediaContent = exports.downloadMediaMessage = exports.aggregateMessageKeysNotFromMe = exports.getAggregateVotesInPollMessage = exports.updateMessageWithPollUpdate = exports.updateMessageWithReaction = exports.updateMessageWithReceipt = exports.getDevice = exports.extractMessageContent = exports.normalizeMessageContent = exports.getContentType = exports.generateWAMessage = exports.generateWAMessageFromContent = exports.generateWAMessageContent = exports.generateForwardMessageContent = exports.prepareDisappearingMessageSettingContent = exports.prepareWAMessageMedia = exports.generateLinkPreviewIfRequired = exports.extractUrlFromText = void 0;
7
- const boom_1 = require("@hapi/boom");
8
- const axios_1 = __importDefault(require("axios"));
9
- const crypto_1 = require("crypto");
10
- const fs_1 = require("fs");
11
- const WAProto_1 = require("../../WAProto");
12
- const Defaults_1 = require("../Defaults");
13
- const Types_1 = require("../Types");
14
- const WABinary_1 = require("../WABinary");
15
- const crypto_2 = require("./crypto");
16
- const generics_1 = require("./generics");
17
- const messages_media_1 = require("./messages-media");
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';
12
+ import { shouldIncludeReportingToken } from './reporting-utils.js';
18
13
  const MIMETYPE_MAP = {
19
14
  image: 'image/jpeg',
20
15
  video: 'video/mp4',
21
16
  document: 'application/pdf',
22
17
  audio: 'audio/ogg; codecs=opus',
23
18
  sticker: 'image/webp',
24
- 'product-catalog-image': 'image/jpeg',
19
+ 'product-catalog-image': 'image/jpeg'
25
20
  };
26
21
  const MessageTypeProto = {
27
- 'image': Types_1.WAProto.Message.ImageMessage,
28
- 'video': Types_1.WAProto.Message.VideoMessage,
29
- 'audio': Types_1.WAProto.Message.AudioMessage,
30
- 'sticker': Types_1.WAProto.Message.StickerMessage,
31
- 'document': Types_1.WAProto.Message.DocumentMessage,
22
+ image: WAProto.Message.ImageMessage,
23
+ video: WAProto.Message.VideoMessage,
24
+ audio: WAProto.Message.AudioMessage,
25
+ sticker: WAProto.Message.StickerMessage,
26
+ document: WAProto.Message.DocumentMessage
32
27
  };
33
- const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
34
28
  /**
35
29
  * Uses a regex to test whether the string contains a URL, and returns the URL if it does.
36
30
  * @param text eg. hello https://google.com
37
31
  * @returns the URL, eg. https://google.com
38
32
  */
39
- const extractUrlFromText = (text) => { var _a; return (_a = text.match(Defaults_1.URL_REGEX)) === null || _a === void 0 ? void 0 : _a[0]; };
40
- exports.extractUrlFromText = extractUrlFromText;
41
- const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
42
- const url = (0, exports.extractUrlFromText)(text);
33
+ export const extractUrlFromText = (text) => text.match(URL_REGEX)?.[0];
34
+ export const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
35
+ const url = extractUrlFromText(text);
43
36
  if (!!getUrlInfo && url) {
44
37
  try {
45
38
  const urlInfo = await getUrlInfo(url);
46
39
  return urlInfo;
47
40
  }
48
- catch (error) { // ignore if fails
49
- logger === null || logger === void 0 ? void 0 : logger.warn({ trace: error.stack }, 'url generation failed');
41
+ catch (error) {
42
+ // ignore if fails
43
+ logger?.warn({ trace: error.stack }, 'url generation failed');
50
44
  }
51
45
  }
52
46
  };
53
- exports.generateLinkPreviewIfRequired = generateLinkPreviewIfRequired;
54
47
  const assertColor = async (color) => {
55
48
  let assertedColor;
56
49
  if (typeof color === 'number') {
@@ -65,16 +58,16 @@ const assertColor = async (color) => {
65
58
  return assertedColor;
66
59
  }
67
60
  };
68
- const prepareWAMessageMedia = async (message, options) => {
61
+ export const prepareWAMessageMedia = async (message, options) => {
69
62
  const logger = options.logger;
70
63
  let mediaType;
71
- for (const key of Defaults_1.MEDIA_KEYS) {
64
+ for (const key of MEDIA_KEYS) {
72
65
  if (key in message) {
73
66
  mediaType = key;
74
67
  }
75
68
  }
76
69
  if (!mediaType) {
77
- throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
70
+ throw new Boom('Invalid media type', { statusCode: 400 });
78
71
  }
79
72
  const uploadData = {
80
73
  ...message,
@@ -83,100 +76,164 @@ const prepareWAMessageMedia = async (message, options) => {
83
76
  delete uploadData[mediaType];
84
77
  // check if cacheable + generate cache key
85
78
  const cacheableKey = typeof uploadData.media === 'object' &&
86
- ('url' in uploadData.media) &&
79
+ 'url' in uploadData.media &&
87
80
  !!uploadData.media.url &&
88
- !!options.mediaCache && (
89
- // generate the key
90
- mediaType + ':' + uploadData.media.url.toString());
81
+ !!options.mediaCache &&
82
+ mediaType + ':' + uploadData.media.url.toString();
91
83
  if (mediaType === 'document' && !uploadData.fileName) {
92
84
  uploadData.fileName = 'file';
93
85
  }
94
86
  if (!uploadData.mimetype) {
95
87
  uploadData.mimetype = MIMETYPE_MAP[mediaType];
96
88
  }
97
- // check for cache hit
98
89
  if (cacheableKey) {
99
- const mediaBuff = options.mediaCache.get(cacheableKey);
90
+ const mediaBuff = await options.mediaCache.get(cacheableKey);
100
91
  if (mediaBuff) {
101
- logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'got media cache hit');
102
- const obj = Types_1.WAProto.Message.decode(mediaBuff);
92
+ logger?.debug({ cacheableKey }, 'got media cache hit');
93
+ const obj = proto.Message.decode(mediaBuff);
103
94
  const key = `${mediaType}Message`;
104
95
  Object.assign(obj[key], { ...uploadData, media: undefined });
105
96
  return obj;
106
97
  }
107
98
  }
99
+ const isNewsletter = !!options.jid && isJidNewsletter(options.jid);
100
+ if (isNewsletter) {
101
+ logger?.info({ key: cacheableKey }, 'Preparing raw media for newsletter');
102
+ const { filePath, fileSha256, fileLength } = await getRawMediaUploadData(uploadData.media, options.mediaTypeOverride || mediaType, logger);
103
+ const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
104
+ const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
105
+ const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true && typeof uploadData.waveform === 'undefined';
106
+ const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
107
+ try {
108
+ if (requiresThumbnailComputation) {
109
+ const { thumbnail, originalImageDimensions } = await generateThumbnail(filePath, mediaType, options);
110
+ uploadData.jpegThumbnail = thumbnail;
111
+ if (!uploadData.width && originalImageDimensions) {
112
+ uploadData.width = originalImageDimensions.width;
113
+ uploadData.height = originalImageDimensions.height;
114
+ logger?.debug('set dimensions');
115
+ }
116
+ logger?.debug('generated thumbnail');
117
+ }
118
+ if (requiresDurationComputation) {
119
+ uploadData.seconds = await getAudioDuration(filePath);
120
+ logger?.debug('computed audio duration');
121
+ }
122
+ if (requiresWaveformProcessing) {
123
+ uploadData.waveform = await getAudioWaveform(filePath, logger);
124
+ logger?.debug('processed waveform');
125
+ }
126
+ if (requiresAudioBackground) {
127
+ uploadData.backgroundArgb = await assertColor(options.backgroundColor);
128
+ logger?.debug('computed backgroundColor audio status');
129
+ }
130
+ }
131
+ catch (error) {
132
+ logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
133
+ }
134
+ const fileSha256B64 = fileSha256.toString('base64');
135
+ const { mediaUrl, directPath } = await options.upload(filePath, {
136
+ fileEncSha256B64: fileSha256B64,
137
+ mediaType: mediaType,
138
+ newsletter: true,
139
+ timeoutMs: options.mediaUploadTimeoutMs
140
+ });
141
+ await fs.unlink(filePath);
142
+ const obj = WAProto.Message.fromObject({
143
+ [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
144
+ url: mediaUrl,
145
+ directPath,
146
+ fileSha256,
147
+ fileLength,
148
+ mediaKeyTimestamp: unixTimestampSeconds(),
149
+ ...uploadData,
150
+ media: undefined
151
+ })
152
+ });
153
+ if (uploadData.ptv) {
154
+ obj.ptvMessage = obj.videoMessage;
155
+ delete obj.videoMessage;
156
+ }
157
+ if (obj.stickerMessage) {
158
+ obj.stickerMessage.stickerSentTs = Date.now();
159
+ }
160
+ if (cacheableKey) {
161
+ logger?.debug({ cacheableKey }, 'set cache');
162
+ await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
163
+ }
164
+ return obj;
165
+ }
108
166
  const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
109
- const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
110
- (typeof uploadData['jpegThumbnail'] === 'undefined');
111
- const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
167
+ const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
168
+ const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true && typeof uploadData.waveform === 'undefined';
112
169
  const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
113
170
  const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
114
- const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, } = await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
171
+ const { mediaKey, encFilePath, originalFilePath, fileEncSha256, fileSha256, fileLength } = await encryptedStream(uploadData.media, options.mediaTypeOverride || mediaType, {
115
172
  logger,
116
173
  saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
117
174
  opts: options.options
118
175
  });
119
- // url safe Base64 encode the SHA256 hash of the body
120
- const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 !== null && fileEncSha256 !== void 0 ? fileEncSha256 : fileSha256).toString('base64');
121
- const [{ mediaUrl, directPath, handle }] = await Promise.all([
176
+ const fileEncSha256B64 = fileEncSha256.toString('base64');
177
+ const [{ mediaUrl, directPath }] = await Promise.all([
122
178
  (async () => {
123
- const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
124
- logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
179
+ const result = await options.upload(encFilePath, {
180
+ fileEncSha256B64,
181
+ mediaType,
182
+ timeoutMs: options.mediaUploadTimeoutMs
183
+ });
184
+ logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
125
185
  return result;
126
186
  })(),
127
187
  (async () => {
128
188
  try {
129
189
  if (requiresThumbnailComputation) {
130
- const { thumbnail, originalImageDimensions } = await (0, messages_media_1.generateThumbnail)(bodyPath, mediaType, options);
190
+ const { thumbnail, originalImageDimensions } = await generateThumbnail(originalFilePath, mediaType, options);
131
191
  uploadData.jpegThumbnail = thumbnail;
132
192
  if (!uploadData.width && originalImageDimensions) {
133
193
  uploadData.width = originalImageDimensions.width;
134
194
  uploadData.height = originalImageDimensions.height;
135
- logger === null || logger === void 0 ? void 0 : logger.debug('set dimensions');
195
+ logger?.debug('set dimensions');
136
196
  }
137
- logger === null || logger === void 0 ? void 0 : logger.debug('generated thumbnail');
197
+ logger?.debug('generated thumbnail');
138
198
  }
139
199
  if (requiresDurationComputation) {
140
- uploadData.seconds = await (0, messages_media_1.getAudioDuration)(bodyPath);
141
- logger === null || logger === void 0 ? void 0 : logger.debug('computed audio duration');
142
- }
143
- if (requiresWaveformProcessing) {
144
- uploadData.waveform = await (0, messages_media_1.getAudioWaveform)(bodyPath, logger);
145
- logger === null || logger === void 0 ? void 0 : logger.debug('processed waveform');
200
+ uploadData.seconds = await getAudioDuration(originalFilePath);
201
+ logger?.debug('computed audio duration');
146
202
  }
147
203
  if (requiresWaveformProcessing) {
148
- uploadData.waveform = await (0, messages_media_1.getAudioWaveform)(bodyPath, logger);
149
- logger === null || logger === void 0 ? void 0 : logger.debug('processed waveform');
204
+ uploadData.waveform = await getAudioWaveform(originalFilePath, logger);
205
+ logger?.debug('processed waveform');
150
206
  }
151
207
  if (requiresAudioBackground) {
152
208
  uploadData.backgroundArgb = await assertColor(options.backgroundColor);
153
- logger === null || logger === void 0 ? void 0 : logger.debug('computed backgroundColor audio status');
209
+ logger?.debug('computed backgroundColor audio status');
154
210
  }
155
211
  }
156
212
  catch (error) {
157
- logger === null || logger === void 0 ? void 0 : logger.warn({ trace: error.stack }, 'failed to obtain extra info');
213
+ logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
158
214
  }
159
- })(),
160
- ])
161
- .finally(async () => {
162
- if (!Buffer.isBuffer(encWriteStream)) {
163
- encWriteStream.destroy();
215
+ })()
216
+ ]).finally(async () => {
217
+ try {
218
+ await fs.unlink(encFilePath);
219
+ if (originalFilePath) {
220
+ await fs.unlink(originalFilePath);
221
+ }
222
+ logger?.debug('removed tmp files');
164
223
  }
165
- // remove tmp files
166
- if (didSaveToTmpPath && bodyPath) {
167
- await fs_1.promises.unlink(bodyPath);
168
- logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp files');
224
+ catch (error) {
225
+ logger?.warn('failed to remove tmp file');
169
226
  }
170
227
  });
171
- const obj = Types_1.WAProto.Message.fromObject({
228
+ const obj = WAProto.Message.fromObject({
172
229
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
173
- url: handle ? undefined : mediaUrl,
230
+ url: mediaUrl,
174
231
  directPath,
175
- mediaKey: mediaKey,
176
- fileEncSha256: fileEncSha256,
232
+ mediaKey,
233
+ fileEncSha256,
177
234
  fileSha256,
178
235
  fileLength,
179
- mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
236
+ mediaKeyTimestamp: unixTimestampSeconds(),
180
237
  ...uploadData,
181
238
  media: undefined
182
239
  })
@@ -186,70 +243,75 @@ const prepareWAMessageMedia = async (message, options) => {
186
243
  delete obj.videoMessage;
187
244
  }
188
245
  if (cacheableKey) {
189
- logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'set cache');
190
- options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish());
246
+ logger?.debug({ cacheableKey }, 'set cache');
247
+ await options.mediaCache.set(cacheableKey, WAProto.Message.encode(obj).finish());
191
248
  }
192
249
  return obj;
193
250
  };
194
- exports.prepareWAMessageMedia = prepareWAMessageMedia;
195
- const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
251
+ export const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
196
252
  ephemeralExpiration = ephemeralExpiration || 0;
197
253
  const content = {
198
254
  ephemeralMessage: {
199
255
  message: {
200
256
  protocolMessage: {
201
- type: Types_1.WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
257
+ type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
202
258
  ephemeralExpiration
203
259
  }
204
260
  }
205
261
  }
206
262
  };
207
- return Types_1.WAProto.Message.fromObject(content);
263
+ return WAProto.Message.fromObject(content);
208
264
  };
209
- exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
210
265
  /**
211
266
  * Generate forwarded message content like WA does
212
267
  * @param message the message to forward
213
268
  * @param options.forceForward will show the message as forwarded even if it is from you
214
269
  */
215
- const generateForwardMessageContent = (message, forceForward) => {
216
- var _a;
270
+ export const generateForwardMessageContent = (message, forceForward) => {
217
271
  let content = message.message;
218
272
  if (!content) {
219
- throw new boom_1.Boom('no content in message', { statusCode: 400 });
273
+ throw new Boom('no content in message', { statusCode: 400 });
220
274
  }
221
275
  // hacky copy
222
- content = (0, exports.normalizeMessageContent)(content);
223
- content = WAProto_1.proto.Message.decode(WAProto_1.proto.Message.encode(content).finish());
276
+ content = normalizeMessageContent(content);
277
+ content = proto.Message.decode(proto.Message.encode(content).finish());
224
278
  let key = Object.keys(content)[0];
225
- let score = ((_a = content[key].contextInfo) === null || _a === void 0 ? void 0 : _a.forwardingScore) || 0;
279
+ let score = content?.[key]?.contextInfo?.forwardingScore || 0;
226
280
  score += message.key.fromMe && !forceForward ? 0 : 1;
227
281
  if (key === 'conversation') {
228
282
  content.extendedTextMessage = { text: content[key] };
229
283
  delete content.conversation;
230
284
  key = 'extendedTextMessage';
231
285
  }
286
+ const key_ = content?.[key];
232
287
  if (score > 0) {
233
- content[key].contextInfo = { forwardingScore: score, isForwarded: true };
288
+ key_.contextInfo = { forwardingScore: score, isForwarded: true };
234
289
  }
235
290
  else {
236
- content[key].contextInfo = {};
291
+ key_.contextInfo = {};
237
292
  }
238
293
  return content;
239
294
  };
240
- exports.generateForwardMessageContent = generateForwardMessageContent;
241
- const generateWAMessageContent = async (message, options) => {
242
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5;
243
- var _6, _7;
295
+ export const hasNonNullishProperty = (message, key) => {
296
+ return (typeof message === 'object' &&
297
+ message !== null &&
298
+ key in message &&
299
+ message[key] !== null &&
300
+ message[key] !== undefined);
301
+ };
302
+ function hasOptionalProperty(obj, key) {
303
+ return typeof obj === 'object' && obj !== null && key in obj && obj[key] !== null;
304
+ }
305
+ export const generateWAMessageContent = async (message, options) => {
306
+ var _a, _b;
244
307
  let m = {};
245
- if ('text' in message) {
308
+ if (hasNonNullishProperty(message, 'text')) {
246
309
  const extContent = { text: message.text };
247
310
  let urlInfo = message.linkPreview;
248
311
  if (typeof urlInfo === 'undefined') {
249
- urlInfo = await (0, exports.generateLinkPreviewIfRequired)(message.text, options.getUrlInfo, options.logger);
312
+ urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
250
313
  }
251
314
  if (urlInfo) {
252
- extContent.canonicalUrl = urlInfo['canonical-url'];
253
315
  extContent.matchedText = urlInfo['matched-text'];
254
316
  extContent.jpegThumbnail = urlInfo.jpegThumbnail;
255
317
  extContent.description = urlInfo.description;
@@ -274,81 +336,65 @@ const generateWAMessageContent = async (message, options) => {
274
336
  }
275
337
  m.extendedTextMessage = extContent;
276
338
  }
277
- else if ('contacts' in message) {
339
+ else if (hasNonNullishProperty(message, 'contacts')) {
278
340
  const contactLen = message.contacts.contacts.length;
279
341
  if (!contactLen) {
280
- throw new boom_1.Boom('require atleast 1 contact', { statusCode: 400 });
342
+ throw new Boom('require atleast 1 contact', { statusCode: 400 });
281
343
  }
282
344
  if (contactLen === 1) {
283
- m.contactMessage = Types_1.WAProto.Message.ContactMessage.fromObject(message.contacts.contacts[0]);
345
+ m.contactMessage = WAProto.Message.ContactMessage.create(message.contacts.contacts[0]);
284
346
  }
285
347
  else {
286
- m.contactsArrayMessage = Types_1.WAProto.Message.ContactsArrayMessage.fromObject(message.contacts);
348
+ m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.create(message.contacts);
287
349
  }
288
350
  }
289
- else if ('location' in message) {
290
- m.locationMessage = Types_1.WAProto.Message.LocationMessage.fromObject(message.location);
291
- if ('contextInfo' in message && !!message.contextInfo) {
292
- m.locationMessage.contextInfo = message.contextInfo;
293
- }
294
- }
295
- else if ('liveLocation' in message) {
296
- m.liveLocationMessage = Types_1.WAProto.Message.LiveLocationMessage.fromObject(message.liveLocation);
297
- if ('contextInfo' in message && !!message.contextInfo) {
298
- m.liveLocationMessage.contextInfo = message.contextInfo;
299
- }
351
+ else if (hasNonNullishProperty(message, 'location')) {
352
+ m.locationMessage = WAProto.Message.LocationMessage.create(message.location);
300
353
  }
301
- else if ('react' in message) {
354
+ else if (hasNonNullishProperty(message, 'react')) {
302
355
  if (!message.react.senderTimestampMs) {
303
356
  message.react.senderTimestampMs = Date.now();
304
357
  }
305
- m.reactionMessage = Types_1.WAProto.Message.ReactionMessage.fromObject(message.react);
358
+ m.reactionMessage = WAProto.Message.ReactionMessage.create(message.react);
306
359
  }
307
- else if ('delete' in message) {
360
+ else if (hasNonNullishProperty(message, 'delete')) {
308
361
  m.protocolMessage = {
309
362
  key: message.delete,
310
- type: Types_1.WAProto.Message.ProtocolMessage.Type.REVOKE
363
+ type: WAProto.Message.ProtocolMessage.Type.REVOKE
311
364
  };
312
365
  }
313
- else if ('forward' in message) {
314
- m = (0, exports.generateForwardMessageContent)(message.forward, message.force);
366
+ else if (hasNonNullishProperty(message, 'forward')) {
367
+ m = generateForwardMessageContent(message.forward, message.force);
315
368
  }
316
- else if ('disappearingMessagesInChat' in message) {
317
- const exp = typeof message.disappearingMessagesInChat === 'boolean' ?
318
- (message.disappearingMessagesInChat ? Defaults_1.WA_DEFAULT_EPHEMERAL : 0) :
319
- message.disappearingMessagesInChat;
320
- m = (0, exports.prepareDisappearingMessageSettingContent)(exp);
369
+ else if (hasNonNullishProperty(message, 'disappearingMessagesInChat')) {
370
+ const exp = typeof message.disappearingMessagesInChat === 'boolean'
371
+ ? message.disappearingMessagesInChat
372
+ ? WA_DEFAULT_EPHEMERAL
373
+ : 0
374
+ : message.disappearingMessagesInChat;
375
+ m = prepareDisappearingMessageSettingContent(exp);
321
376
  }
322
- else if ('groupInvite' in message) {
377
+ else if (hasNonNullishProperty(message, 'groupInvite')) {
323
378
  m.groupInviteMessage = {};
324
379
  m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
325
380
  m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
326
381
  m.groupInviteMessage.caption = message.groupInvite.text;
327
382
  m.groupInviteMessage.groupJid = message.groupInvite.jid;
328
383
  m.groupInviteMessage.groupName = message.groupInvite.subject;
329
- m.groupInviteMessage.jpegThumbnail = message.groupInvite.thumbnail;
330
384
  //TODO: use built-in interface and get disappearing mode info etc.
331
385
  //TODO: cache / use store!?
332
386
  if (options.getProfilePicUrl) {
333
- let pfpUrl;
334
- try {
335
- pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
336
- }
337
- catch (_8) {
338
- pfpUrl = null;
339
- }
387
+ const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
340
388
  if (pfpUrl) {
341
- const resp = await axios_1.default.get(pfpUrl, { responseType: 'arraybuffer' });
342
- if (resp.status === 200) {
343
- m.groupInviteMessage.jpegThumbnail = resp.data;
389
+ const resp = await fetch(pfpUrl, { method: 'GET', dispatcher: options?.options?.dispatcher });
390
+ if (resp.ok) {
391
+ const buf = Buffer.from(await resp.arrayBuffer());
392
+ m.groupInviteMessage.jpegThumbnail = buf;
344
393
  }
345
394
  }
346
- else {
347
- m.groupInviteMessage.jpegThumbnail = null;
348
- }
349
395
  }
350
396
  }
351
- else if ('pin' in message) {
397
+ else if (hasNonNullishProperty(message, 'pin')) {
352
398
  m.pinInChatMessage = {};
353
399
  m.messageContextInfo = {};
354
400
  m.pinInChatMessage.key = message.pin;
@@ -356,573 +402,193 @@ const generateWAMessageContent = async (message, options) => {
356
402
  m.pinInChatMessage.senderTimestampMs = Date.now();
357
403
  m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
358
404
  }
359
- else if ('keep' in message) {
360
- m.keepInChatMessage = {};
361
- m.keepInChatMessage.key = message.keep;
362
- m.keepInChatMessage.keepType = message.type;
363
- m.keepInChatMessage.timestampMs = Date.now();
364
- }
365
- else if ('call' in message) {
366
- m = {
367
- scheduledCallCreationMessage: {
368
- scheduledTimestampMs: (_a = message.call.time) !== null && _a !== void 0 ? _a : Date.now(),
369
- callType: (_b = message.call.type) !== null && _b !== void 0 ? _b : 1,
370
- title: message.call.title
371
- }
372
- };
373
- }
374
- else if ('paymentInvite' in message) {
375
- m.paymentInviteMessage = {
376
- serviceType: message.paymentInvite.type,
377
- expiryTimestamp: message.paymentInvite.expiry
378
- };
379
- }
380
- else if ('buttonReply' in message) {
405
+ else if (hasNonNullishProperty(message, 'buttonReply')) {
381
406
  switch (message.type) {
382
407
  case 'template':
383
408
  m.templateButtonReplyMessage = {
384
409
  selectedDisplayText: message.buttonReply.displayText,
385
410
  selectedId: message.buttonReply.id,
386
- selectedIndex: message.buttonReply.index,
411
+ selectedIndex: message.buttonReply.index
387
412
  };
388
413
  break;
389
414
  case 'plain':
390
415
  m.buttonsResponseMessage = {
391
416
  selectedButtonId: message.buttonReply.id,
392
417
  selectedDisplayText: message.buttonReply.displayText,
393
- type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
394
- };
395
- break;
396
- case 'interactive':
397
- m.interactiveResponseMessage = {
398
- body: {
399
- text: message.buttonReply.text,
400
- format: WAProto_1.proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1
401
- },
402
- nativeFlowResponseMessage: {
403
- name: message.buttonReply.nativeFlow.name,
404
- paramsJson: message.buttonReply.nativeFlow.paramsJson,
405
- version: message.buttonReply.nativeFlow.version
406
- }
418
+ type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
407
419
  };
408
420
  break;
409
421
  }
410
422
  }
411
- else if ('ptv' in message && message.ptv) {
412
- const { videoMessage } = await (0, exports.prepareWAMessageMedia)({ video: message.video }, options);
423
+ else if (hasOptionalProperty(message, 'ptv') && message.ptv) {
424
+ const { videoMessage } = await prepareWAMessageMedia({ video: message.video }, options);
413
425
  m.ptvMessage = videoMessage;
414
426
  }
415
- else if ('product' in message) {
416
- const { imageMessage } = await (0, exports.prepareWAMessageMedia)({ image: (_c = message === null || message === void 0 ? void 0 : message.product) === null || _c === void 0 ? void 0 : _c.productImage }, options);
417
- m.productMessage = Types_1.WAProto.Message.ProductMessage.fromObject({
427
+ else if (hasNonNullishProperty(message, 'product')) {
428
+ const { imageMessage } = await prepareWAMessageMedia({ image: message.product.productImage }, options);
429
+ m.productMessage = WAProto.Message.ProductMessage.create({
418
430
  ...message,
419
431
  product: {
420
432
  ...message.product,
421
- productImage: imageMessage,
433
+ productImage: imageMessage
422
434
  }
423
435
  });
424
- if ('contextInfo' in message && !!message.contextInfo) {
425
- m.productMessage.contextInfo = message.contextInfo;
426
- }
427
- if ('mentions' in message && !!message.mentions) {
428
- m.productMessage.contextInfo = { mentionedJid: message.mentions };
429
- }
430
- }
431
- else if ('order' in message) {
432
- m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
433
- orderId: message.order.id,
434
- thumbnail: message.order.thumbnail,
435
- itemCount: message.order.itemCount,
436
- status: message.order.status,
437
- surface: message.order.surface,
438
- orderTitle: message.order.title,
439
- message: message.order.text,
440
- sellerJid: message.order.seller,
441
- token: message.order.token,
442
- totalAmount1000: message.order.amount,
443
- totalCurrencyCode: message.order.currency
444
- });
445
436
  }
446
- else if ('listReply' in message) {
437
+ else if (hasNonNullishProperty(message, 'listReply')) {
447
438
  m.listResponseMessage = { ...message.listReply };
448
439
  }
449
- else if ('poll' in message) {
450
- (_6 = message.poll).selectableCount || (_6.selectableCount = 0);
451
- (_7 = message.poll).toAnnouncementGroup || (_7.toAnnouncementGroup = false);
440
+ else if (hasNonNullishProperty(message, 'event')) {
441
+ m.eventMessage = {};
442
+ const startTime = Math.floor(message.event.startDate.getTime() / 1000);
443
+ if (message.event.call && options.getCallLink) {
444
+ const token = await options.getCallLink(message.event.call, { startTime });
445
+ m.eventMessage.joinLink = (message.event.call === 'audio' ? CALL_AUDIO_PREFIX : CALL_VIDEO_PREFIX) + token;
446
+ }
447
+ m.messageContextInfo = {
448
+ // encKey
449
+ messageSecret: message.event.messageSecret || randomBytes(32)
450
+ };
451
+ m.eventMessage.name = message.event.name;
452
+ m.eventMessage.description = message.event.description;
453
+ m.eventMessage.startTime = startTime;
454
+ m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
455
+ m.eventMessage.isCanceled = message.event.isCancelled ?? false;
456
+ m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
457
+ m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
458
+ m.eventMessage.location = message.event.location;
459
+ }
460
+ else if (hasNonNullishProperty(message, 'poll')) {
461
+ (_a = message.poll).selectableCount || (_a.selectableCount = 0);
462
+ (_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
452
463
  if (!Array.isArray(message.poll.values)) {
453
- throw new boom_1.Boom('Invalid poll values', { statusCode: 400 });
464
+ throw new Boom('Invalid poll values', { statusCode: 400 });
454
465
  }
455
- if (message.poll.selectableCount < 0
456
- || message.poll.selectableCount > message.poll.values.length) {
457
- throw new boom_1.Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, { statusCode: 400 });
466
+ if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
467
+ throw new Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
468
+ statusCode: 400
469
+ });
458
470
  }
459
471
  m.messageContextInfo = {
460
472
  // encKey
461
- messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
473
+ messageSecret: message.poll.messageSecret || randomBytes(32)
462
474
  };
463
475
  const pollCreationMessage = {
464
476
  name: message.poll.name,
465
477
  selectableOptionsCount: message.poll.selectableCount,
466
- options: message.poll.values.map(optionName => ({ optionName })),
478
+ options: message.poll.values.map(optionName => ({ optionName }))
467
479
  };
468
480
  if (message.poll.toAnnouncementGroup) {
469
481
  // poll v2 is for community announcement groups (single select and multiple)
470
482
  m.pollCreationMessageV2 = pollCreationMessage;
471
483
  }
472
484
  else {
473
- if (message.poll.selectableCount > 0) {
485
+ if (message.poll.selectableCount === 1) {
474
486
  //poll v3 is for single select polls
475
487
  m.pollCreationMessageV3 = pollCreationMessage;
476
488
  }
477
489
  else {
478
- // poll v3 for multiple choice polls
490
+ // poll for multiple choice polls
479
491
  m.pollCreationMessage = pollCreationMessage;
480
492
  }
481
493
  }
482
- if ('contextInfo' in message && !!message.contextInfo) {
483
- pollCreationMessage.contextInfo = message.contextInfo;
484
- }
485
- }
486
- else if ('pollResult' in message) {
487
- if (!Array.isArray(message.pollResult.votes)) {
488
- throw new boom_1.Boom('Invalid poll votes result', { statusCode: 400 });
489
- }
490
- m.messageContextInfo = {
491
- // encKey
492
- messageSecret: message.pollResult.messageSecret || (0, crypto_1.randomBytes)(32),
493
- };
494
- const pollResultSnapshotMessage = {
495
- name: message.pollResult.name,
496
- pollVotes: message.pollResult.votes.map((option) => ({
497
- optionName: option[0],
498
- optionVoteCount: option[1]
499
- })),
500
- };
501
- if ('contextInfo' in message && !!message.contextInfo) {
502
- pollResultSnapshotMessage.contextInfo = message.contextInfo;
503
- }
504
- if ('mentions' in message && !!message.mentions) {
505
- pollResultSnapshotMessage.contextInfo = { mentionedJid: message.mentions };
506
- }
507
- m.pollResultSnapshotMessage = pollResultSnapshotMessage;
508
- }
509
- else if ('event' in message) {
510
- m.messageContextInfo = {
511
- messageSecret: message.event.messageSecret || (0, crypto_1.randomBytes)(32),
512
- };
513
- m.eventMessage = { ...message.event };
514
- }
515
- else if ('inviteAdmin' in message) {
516
- m.newsletterAdminInviteMessage = {};
517
- m.newsletterAdminInviteMessage.inviteExpiration = message.inviteAdmin.inviteExpiration;
518
- m.newsletterAdminInviteMessage.caption = message.inviteAdmin.text;
519
- m.newsletterAdminInviteMessage.newsletterJid = message.inviteAdmin.jid;
520
- m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
521
- m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
522
- //TODO: use built-in interface and get disappearing mode info etc.
523
- //TODO: cache / use store!?
524
- if (options.getProfilePicUrl) {
525
- let pfpUrl;
526
- try {
527
- pfpUrl = await options.getProfilePicUrl(message.inviteAdmin.jid, 'preview');
528
- }
529
- catch (_9) {
530
- pfpUrl = null;
531
- }
532
- if (pfpUrl) {
533
- const resp = await axios_1.default.get(pfpUrl, { responseType: 'arraybuffer' });
534
- if (resp.status === 200) {
535
- m.newsletterAdminInviteMessage.jpegThumbnail = resp.data;
536
- }
537
- }
538
- else {
539
- m.newsletterAdminInviteMessage.jpegThumbnail = null;
540
- }
541
- }
542
- }
543
- else if ('requestPayment' in message) {
544
- const sticker = ((_d = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _d === void 0 ? void 0 : _d.sticker) ?
545
- await (0, exports.prepareWAMessageMedia)({ sticker: (_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker, ...options }, options)
546
- : null;
547
- let notes = {};
548
- if ((_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.sticker) {
549
- notes = {
550
- stickerMessage: {
551
- ...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
552
- contextInfo: {
553
- stanzaId: (_h = (_g = options === null || options === void 0 ? void 0 : options.quoted) === null || _g === void 0 ? void 0 : _g.key) === null || _h === void 0 ? void 0 : _h.id,
554
- participant: (_k = (_j = options === null || options === void 0 ? void 0 : options.quoted) === null || _j === void 0 ? void 0 : _j.key) === null || _k === void 0 ? void 0 : _k.participant,
555
- quotedMessage: (_l = options === null || options === void 0 ? void 0 : options.quoted) === null || _l === void 0 ? void 0 : _l.message,
556
- ...(_m = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _m === void 0 ? void 0 : _m.contextInfo,
557
- }
558
- }
559
- };
560
- }
561
- else if (message.requestPayment.note) {
562
- notes = {
563
- extendedTextMessage: {
564
- text: message.requestPayment.note,
565
- contextInfo: {
566
- stanzaId: (_p = (_o = options === null || options === void 0 ? void 0 : options.quoted) === null || _o === void 0 ? void 0 : _o.key) === null || _p === void 0 ? void 0 : _p.id,
567
- participant: (_r = (_q = options === null || options === void 0 ? void 0 : options.quoted) === null || _q === void 0 ? void 0 : _q.key) === null || _r === void 0 ? void 0 : _r.participant,
568
- quotedMessage: (_s = options === null || options === void 0 ? void 0 : options.quoted) === null || _s === void 0 ? void 0 : _s.message,
569
- ...(_t = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _t === void 0 ? void 0 : _t.contextInfo,
570
- }
571
- }
572
- };
573
- }
574
- m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
575
- expiryTimestamp: message.requestPayment.expiry,
576
- amount1000: message.requestPayment.amount,
577
- currencyCodeIso4217: message.requestPayment.currency,
578
- requestFrom: message.requestPayment.from,
579
- noteMessage: { ...notes },
580
- background: (_u = message.requestPayment.background) !== null && _u !== void 0 ? _u : null,
581
- });
582
494
  }
583
- else if ('sharePhoneNumber' in message) {
495
+ else if (hasNonNullishProperty(message, 'sharePhoneNumber')) {
584
496
  m.protocolMessage = {
585
- type: WAProto_1.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
497
+ type: proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
586
498
  };
587
499
  }
588
- else if ('requestPhoneNumber' in message) {
500
+ else if (hasNonNullishProperty(message, 'requestPhoneNumber')) {
589
501
  m.requestPhoneNumberMessage = {};
590
502
  }
591
- else {
592
- m = await (0, exports.prepareWAMessageMedia)(message, options);
593
- }
594
- if ('buttons' in message && !!message.buttons) {
595
- const buttonsMessage = {
596
- buttons: message.buttons.map(b => ({ ...b, type: WAProto_1.proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
597
- };
598
- if ('text' in message) {
599
- buttonsMessage.contentText = message.text;
600
- buttonsMessage.headerType = ButtonType.EMPTY;
601
- }
602
- else {
603
- if ('caption' in message) {
604
- buttonsMessage.contentText = message.caption;
605
- }
606
- const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
607
- buttonsMessage.headerType = ButtonType[type];
608
- Object.assign(buttonsMessage, m);
609
- }
610
- if ('footer' in message && !!message.footer) {
611
- buttonsMessage.footerText = message.footer;
612
- }
613
- if ('title' in message && !!message.title) {
614
- buttonsMessage.text = message.title,
615
- buttonsMessage.headerType = ButtonType.TEXT;
616
- }
617
- if ('contextInfo' in message && !!message.contextInfo) {
618
- buttonsMessage.contextInfo = message.contextInfo;
619
- }
620
- if ('mentions' in message && !!message.mentions) {
621
- buttonsMessage.contextInfo = { mentionedJid: message.mentions };
622
- }
623
- m = { buttonsMessage };
624
- }
625
- else if ('templateButtons' in message && !!message.templateButtons) {
626
- const msg = {
627
- hydratedButtons: message.hasOwnProperty("templateButtons") ? message.templateButtons : message.templateButtons
628
- };
629
- if ('text' in message) {
630
- msg.hydratedContentText = message.text;
631
- }
632
- else {
633
- if ('caption' in message) {
634
- msg.hydratedContentText = message.caption;
635
- }
636
- Object.assign(msg, m);
637
- }
638
- if ('footer' in message && !!message.footer) {
639
- msg.hydratedFooterText = message.footer;
640
- }
641
- m = {
642
- templateMessage: {
643
- fourRowTemplate: msg,
644
- hydratedTemplate: msg
503
+ else if (hasNonNullishProperty(message, 'limitSharing')) {
504
+ m.protocolMessage = {
505
+ type: proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
506
+ limitSharing: {
507
+ sharingLimited: message.limitSharing === true,
508
+ trigger: 1,
509
+ limitSharingSettingTimestamp: Date.now(),
510
+ initiatedByMe: true
645
511
  }
646
512
  };
647
513
  }
648
- if ('interactiveButtons' in message && !!message.interactiveButtons) {
649
- const interactiveMessage = {
650
- nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
651
- buttons: message.interactiveButtons,
652
- })
653
- };
654
- if ('text' in message) {
655
- body: interactiveMessage.body = {
656
- text: message.text
657
- };
658
- header: interactiveMessage.header = {
659
- title: message.title,
660
- subtitle: message.subtitle,
661
- hasMediaAttachment: (_v = message === null || message === void 0 ? void 0 : message.media) !== null && _v !== void 0 ? _v : false,
662
- };
663
- }
664
- else {
665
- if ('caption' in message) {
666
- body: interactiveMessage.body = {
667
- text: message.caption
668
- };
669
- header: interactiveMessage.header = {
670
- title: message.title,
671
- subtitle: message.subtitle,
672
- hasMediaAttachment: (_w = message === null || message === void 0 ? void 0 : message.media) !== null && _w !== void 0 ? _w : false,
673
- };
674
- Object.assign(interactiveMessage.header, m);
675
- }
676
- }
677
- if ('footer' in message && !!message.footer) {
678
- footer: interactiveMessage.footer = {
679
- text: message.footer
680
- };
681
- }
682
- if ('contextInfo' in message && !!message.contextInfo) {
683
- interactiveMessage.contextInfo = message.contextInfo;
684
- }
685
- if ('mentions' in message && !!message.mentions) {
686
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
687
- }
688
- m = { interactiveMessage };
689
- }
690
- if ('shop' in message && !!message.shop) {
691
- const interactiveMessage = {
692
- shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
693
- surface: message.shop,
694
- id: message.id
695
- })
696
- };
697
- if ('text' in message) {
698
- body: interactiveMessage.body = {
699
- text: message.text
700
- };
701
- header: interactiveMessage.header = {
702
- title: message.title,
703
- subtitle: message.subtitle,
704
- hasMediaAttachment: (_x = message === null || message === void 0 ? void 0 : message.media) !== null && _x !== void 0 ? _x : false,
705
- };
706
- }
707
- else {
708
- if ('caption' in message) {
709
- body: interactiveMessage.body = {
710
- text: message.caption
711
- };
712
- header: interactiveMessage.header = {
713
- title: message.title,
714
- subtitle: message.subtitle,
715
- hasMediaAttachment: (_y = message === null || message === void 0 ? void 0 : message.media) !== null && _y !== void 0 ? _y : false,
716
- };
717
- Object.assign(interactiveMessage.header, m);
718
- }
719
- }
720
- if ('footer' in message && !!message.footer) {
721
- footer: interactiveMessage.footer = {
722
- text: message.footer
723
- };
724
- }
725
- if ('contextInfo' in message && !!message.contextInfo) {
726
- interactiveMessage.contextInfo = message.contextInfo;
727
- }
728
- if ('mentions' in message && !!message.mentions) {
729
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
730
- }
731
- m = { interactiveMessage };
514
+ else {
515
+ m = await prepareWAMessageMedia(message, options);
732
516
  }
733
- if ('collection' in message && !!message.shop) {
734
- const interactiveMessage = {
735
- collectionMessage: Types_1.WAProto.Message.InteractiveMessage.CollectionMessage.fromObject({
736
- bizJid: (_z = message === null || message === void 0 ? void 0 : message.collection) === null || _z === void 0 ? void 0 : _z.bizJid,
737
- id: (_0 = message === null || message === void 0 ? void 0 : message.collection) === null || _0 === void 0 ? void 0 : _0.id,
738
- messageVersion: (_1 = message === null || message === void 0 ? void 0 : message.collection) === null || _1 === void 0 ? void 0 : _1.version
739
- })
740
- };
741
- if ('text' in message) {
742
- body: interactiveMessage.body = {
743
- text: message.text
744
- };
745
- header: interactiveMessage.header = {
746
- title: message.title,
747
- subtitle: message.subtitle,
748
- hasMediaAttachment: (_2 = message === null || message === void 0 ? void 0 : message.media) !== null && _2 !== void 0 ? _2 : false,
749
- };
750
- }
751
- else {
752
- if ('caption' in message) {
753
- body: interactiveMessage.body = {
754
- text: message.caption
755
- };
756
- header: interactiveMessage.header = {
757
- title: message.title,
758
- subtitle: message.subtitle,
759
- hasMediaAttachment: (_3 = message === null || message === void 0 ? void 0 : message.media) !== null && _3 !== void 0 ? _3 : false,
760
- };
761
- Object.assign(interactiveMessage.header, m);
762
- }
763
- }
764
- if ('footer' in message && !!message.footer) {
765
- footer: interactiveMessage.footer = {
766
- text: message.footer
767
- };
768
- }
769
- if ('contextInfo' in message && !!message.contextInfo) {
770
- interactiveMessage.contextInfo = message.contextInfo;
771
- }
772
- if ('mentions' in message && !!message.mentions) {
773
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
774
- }
775
- m = { interactiveMessage };
517
+ if (hasOptionalProperty(message, 'viewOnce') && !!message.viewOnce) {
518
+ m = { viewOnceMessage: { message: m } };
776
519
  }
777
- if ('cards' in message && !!message.cards) {
778
- const slides = await Promise.all(message.cards.map(async (slide) => {
779
- const { image, video, product, title, caption, footer, buttons } = slide;
780
- let header;
781
- if (product) {
782
- const { imageMessage } = await (0, exports.prepareWAMessageMedia)({ image: product.productImage, ...options }, options);
783
- header = {
784
- productMesage: Types_1.WAProto.Message.ProductMessage.fromObject({
785
- product: {
786
- ...product,
787
- productImage: imageMessage,
788
- },
789
- ...slide
790
- })
791
- };
792
- }
793
- else if (image) {
794
- header = await (0, exports.prepareWAMessageMedia)({ image: image, ...options }, options);
520
+ if ((hasOptionalProperty(message, 'mentions') && message.mentions?.length) ||
521
+ (hasOptionalProperty(message, 'mentionAll') && message.mentionAll)) {
522
+ const messageType = Object.keys(m)[0];
523
+ const key = m[messageType];
524
+ if (key && 'contextInfo' in key) {
525
+ key.contextInfo = key.contextInfo || {};
526
+ if (message.mentions?.length) {
527
+ key.contextInfo.mentionedJid = message.mentions;
795
528
  }
796
- else if (video) {
797
- header = await (0, exports.prepareWAMessageMedia)({ video: video, ...options }, options);
529
+ if (message.mentionAll) {
530
+ key.contextInfo.nonJidMentions = 1;
798
531
  }
799
- const msg = {
800
- header: Types_1.WAProto.Message.InteractiveMessage.Header.fromObject({
801
- title,
802
- hasMediaAttachment: true,
803
- ...header
804
- }),
805
- body: Types_1.WAProto.Message.InteractiveMessage.Body.fromObject({
806
- text: caption
807
- }),
808
- footer: Types_1.WAProto.Message.InteractiveMessage.Footer.fromObject({
809
- text: footer
810
- }),
811
- nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
812
- buttons,
813
- }),
814
- };
815
- return msg;
816
- }));
817
- const interactiveMessage = {
818
- carouselMessage: Types_1.WAProto.Message.InteractiveMessage.CarouselMessage.fromObject({
819
- cards: slides
820
- })
821
- };
822
- if ('text' in message) {
823
- interactiveMessage.body = Types_1.WAProto.Message.InteractiveMessage.Body.fromObject({
824
- text: message.text
825
- });
826
- interactiveMessage.header = Types_1.WAProto.Message.InteractiveMessage.Header.fromObject({
827
- title: message.title,
828
- subtitle: message.subtitle,
829
- hasMediaAttachment: (_4 = message === null || message === void 0 ? void 0 : message.media) !== null && _4 !== void 0 ? _4 : false,
830
- });
831
- }
832
- if ('footer' in message && !!message.footer) {
833
- interactiveMessage.footer = Types_1.WAProto.Message.InteractiveMessage.Footer.fromObject({
834
- text: message.footer
835
- });
836
532
  }
837
- if ('contextInfo' in message && !!message.contextInfo) {
838
- interactiveMessage.contextInfo = message.contextInfo;
839
- }
840
- if ('mentions' in message && !!message.mentions) {
841
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
533
+ else if (key) {
534
+ key.contextInfo = {
535
+ mentionedJid: message.mentions,
536
+ nonJidMentions: message.mentionAll ? 1 : 0
537
+ };
842
538
  }
843
- m = { interactiveMessage };
844
- }
845
- if ('sections' in message && !!message.sections) {
846
- const listMessage = WAProto_1.proto.Message.ListMessage.fromObject({
847
- sections: message.sections,
848
- buttonText: message.buttonText,
849
- title: message.title,
850
- footerText: message.footer,
851
- description: message.text,
852
- listType: WAProto_1.proto.Message.ListMessage.ListType.PRODUCT_LIST
853
- });
854
- m = { listMessage };
855
- }
856
- if ('viewOnce' in message && !!message.viewOnce) {
857
- m = { viewOnceMessage: { message: m } };
858
- }
859
- if ('viewOnceV2' in message && !!message.viewOnceV2) {
860
- m = { viewOnceMessageV2: { message: m } };
861
- }
862
- if ('viewOnceV2Extension' in message && !!message.viewOnceV2Extension) {
863
- m = { viewOnceMessageV2Extension: { message: m } };
864
- }
865
- if ('ephemeral' in message && !!message.ephemeral) {
866
- m = { ephemeralMessage: { message: m } };
867
539
  }
868
- if ('lottie' in message && !!message.lottie) {
869
- m = { lottieStickerMessage: { message: m } };
870
- }
871
- if ('mentions' in message && ((_5 = message.mentions) === null || _5 === void 0 ? void 0 : _5.length)) {
872
- const [messageType] = Object.keys(m);
873
- m[messageType].contextInfo = m[messageType] || {};
874
- m[messageType].contextInfo.mentionedJid = message.mentions;
875
- }
876
- if ('edit' in message) {
540
+ if (hasOptionalProperty(message, 'edit')) {
877
541
  m = {
878
542
  protocolMessage: {
879
543
  key: message.edit,
880
544
  editedMessage: m,
881
545
  timestampMs: Date.now(),
882
- type: Types_1.WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
546
+ type: WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
883
547
  }
884
548
  };
885
549
  }
886
- if ('contextInfo' in message && !!message.contextInfo) {
887
- const [messageType] = Object.keys(m);
888
- m[messageType] = m[messageType] || {};
889
- m[messageType].contextInfo = message.contextInfo;
550
+ if (hasOptionalProperty(message, 'contextInfo') && !!message.contextInfo) {
551
+ const messageType = Object.keys(m)[0];
552
+ const key = m[messageType];
553
+ if ('contextInfo' in key && !!key.contextInfo) {
554
+ key.contextInfo = { ...key.contextInfo, ...message.contextInfo };
555
+ }
556
+ else if (key) {
557
+ key.contextInfo = message.contextInfo;
558
+ }
559
+ }
560
+ if (shouldIncludeReportingToken(m)) {
561
+ m.messageContextInfo = m.messageContextInfo || {};
562
+ if (!m.messageContextInfo.messageSecret) {
563
+ m.messageContextInfo.messageSecret = randomBytes(32);
564
+ }
890
565
  }
891
- return Types_1.WAProto.Message.fromObject(m);
566
+ return WAProto.Message.create(m);
892
567
  };
893
- exports.generateWAMessageContent = generateWAMessageContent;
894
- const generateWAMessageFromContent = (jid, message, options) => {
895
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
568
+ export const generateWAMessageFromContent = (jid, message, options) => {
896
569
  // set timestamp to now
897
570
  // if not specified
898
571
  if (!options.timestamp) {
899
572
  options.timestamp = new Date();
900
573
  }
901
- const innerMessage = (0, exports.normalizeMessageContent)(message);
902
- const key = (0, exports.getContentType)(innerMessage);
903
- const timestamp = (0, generics_1.unixTimestampSeconds)(options.timestamp);
574
+ const innerMessage = normalizeMessageContent(message);
575
+ const key = getContentType(innerMessage);
576
+ const timestamp = unixTimestampSeconds(options.timestamp);
904
577
  const { quoted, userJid } = options;
905
- if (quoted && !(0, WABinary_1.isJidNewsLetter)(jid)) {
906
- const participant = quoted.key.fromMe ? userJid : (quoted.participant || quoted.key.participant || quoted.key.remoteJid);
907
- let quotedMsg = (0, exports.normalizeMessageContent)(quoted.message);
908
- const msgType = (0, exports.getContentType)(quotedMsg);
578
+ if (quoted && !isJidNewsletter(jid)) {
579
+ const participant = quoted.key.fromMe
580
+ ? userJid // TODO: Add support for LIDs
581
+ : quoted.participant || quoted.key.participant || quoted.key.remoteJid;
582
+ let quotedMsg = normalizeMessageContent(quoted.message);
583
+ const msgType = getContentType(quotedMsg);
909
584
  // strip any redundant properties
910
- quotedMsg = WAProto_1.proto.Message.fromObject({ [msgType]: quotedMsg[msgType] });
585
+ quotedMsg = proto.Message.create({ [msgType]: quotedMsg[msgType] });
911
586
  const quotedContent = quotedMsg[msgType];
912
587
  if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
913
588
  delete quotedContent.contextInfo;
914
589
  }
915
- let requestPayment;
916
- if (key === 'requestPaymentMessage') {
917
- if (((_a = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _a === void 0 ? void 0 : _a.noteMessage) && ((_c = (_b = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _b === void 0 ? void 0 : _b.noteMessage) === null || _c === void 0 ? void 0 : _c.extendedTextMessage)) {
918
- requestPayment = (_e = (_d = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _d === void 0 ? void 0 : _d.noteMessage) === null || _e === void 0 ? void 0 : _e.extendedTextMessage;
919
- }
920
- else if (((_f = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _f === void 0 ? void 0 : _f.noteMessage) && ((_h = (_g = innerMessage === null || innerMessage === void 0 ? void 0 : innerMessage.requestPaymentMessage) === null || _g === void 0 ? void 0 : _g.noteMessage) === null || _h === void 0 ? void 0 : _h.stickerMessage)) {
921
- requestPayment = (_k = (_j = innerMessage.requestPaymentMessage) === null || _j === void 0 ? void 0 : _j.noteMessage) === null || _k === void 0 ? void 0 : _k.stickerMessage;
922
- }
923
- }
924
- const contextInfo = (key === 'requestPaymentMessage' ? requestPayment.contextInfo : innerMessage[key].contextInfo) || {};
925
- contextInfo.participant = (0, WABinary_1.jidNormalizedUser)(participant);
590
+ const contextInfo = ('contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo) || {};
591
+ contextInfo.participant = jidNormalizedUser(participant);
926
592
  contextInfo.stanzaId = quoted.key.id;
927
593
  contextInfo.quotedMessage = quotedMsg;
928
594
  // if a participant is quoted, then it must be a group
@@ -930,62 +596,63 @@ const generateWAMessageFromContent = (jid, message, options) => {
930
596
  if (jid !== quoted.key.remoteJid) {
931
597
  contextInfo.remoteJid = quoted.key.remoteJid;
932
598
  }
933
- innerMessage[key].contextInfo = contextInfo;
599
+ if (contextInfo && innerMessage[key]) {
600
+ /* @ts-ignore */
601
+ innerMessage[key].contextInfo = contextInfo;
602
+ }
934
603
  }
935
604
  if (
936
605
  // if we want to send a disappearing message
937
- !!(options === null || options === void 0 ? void 0 : options.ephemeralExpiration) &&
606
+ !!options?.ephemeralExpiration &&
938
607
  // and it's not a protocol message -- delete, toggle disappear message
939
608
  key !== 'protocolMessage' &&
940
609
  // already not converted to disappearing message
941
610
  key !== 'ephemeralMessage' &&
942
- // newsletter not accept disappearing messages
943
- !(0, WABinary_1.isJidNewsLetter)(jid)) {
611
+ // newsletters don't support ephemeral messages
612
+ !isJidNewsletter(jid)) {
613
+ /* @ts-ignore */
944
614
  innerMessage[key].contextInfo = {
945
615
  ...(innerMessage[key].contextInfo || {}),
946
- expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
616
+ expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL
947
617
  //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
948
618
  };
949
619
  }
950
- message = Types_1.WAProto.Message.fromObject(message);
620
+ message = WAProto.Message.create(message);
951
621
  const messageJSON = {
952
622
  key: {
953
623
  remoteJid: jid,
954
624
  fromMe: true,
955
- id: (options === null || options === void 0 ? void 0 : options.messageId) || (0, generics_1.generateMessageID)(),
625
+ id: options?.messageId || generateMessageIDV2()
956
626
  },
957
627
  message: message,
958
628
  messageTimestamp: timestamp,
959
629
  messageStubParameters: [],
960
- participant: (0, WABinary_1.isJidGroup)(jid) || (0, WABinary_1.isJidStatusBroadcast)(jid) ? userJid : undefined,
961
- status: Types_1.WAMessageStatus.PENDING
630
+ participant: isJidGroup(jid) || isJidStatusBroadcast(jid) ? userJid : undefined, // TODO: Add support for LIDs
631
+ status: WAMessageStatus.PENDING
962
632
  };
963
- return Types_1.WAProto.WebMessageInfo.fromObject(messageJSON);
633
+ return WAProto.WebMessageInfo.fromObject(messageJSON);
964
634
  };
965
- exports.generateWAMessageFromContent = generateWAMessageFromContent;
966
- const generateWAMessage = async (jid, content, options) => {
967
- var _a;
635
+ export const generateWAMessage = async (jid, content, options) => {
968
636
  // ensure msg ID is with every log
969
- options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
970
- return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsLetter)(jid), ...options }), options);
637
+ options.logger = options?.logger?.child({ msgId: options.messageId });
638
+ // Pass jid in the options to generateWAMessageContent
639
+ return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { ...options, jid }), options);
971
640
  };
972
- exports.generateWAMessage = generateWAMessage;
973
641
  /** Get the key to access the true type of content */
974
- const getContentType = (content) => {
642
+ export const getContentType = (content) => {
975
643
  if (content) {
976
644
  const keys = Object.keys(content);
977
645
  const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
978
646
  return key;
979
647
  }
980
648
  };
981
- exports.getContentType = getContentType;
982
649
  /**
983
650
  * Normalizes ephemeral, view once messages to regular message content
984
651
  * Eg. image messages in ephemeral messages, in view once messages etc.
985
652
  * @param content
986
653
  * @returns
987
654
  */
988
- const normalizeMessageContent = (content) => {
655
+ export const normalizeMessageContent = (content) => {
989
656
  if (!content) {
990
657
  return undefined;
991
658
  }
@@ -999,21 +666,22 @@ const normalizeMessageContent = (content) => {
999
666
  }
1000
667
  return content;
1001
668
  function getFutureProofMessage(message) {
1002
- return ((message === null || message === void 0 ? void 0 : message.ephemeralMessage)
1003
- || (message === null || message === void 0 ? void 0 : message.viewOnceMessage)
1004
- || (message === null || message === void 0 ? void 0 : message.documentWithCaptionMessage)
1005
- || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2)
1006
- || (message === null || message === void 0 ? void 0 : message.viewOnceMessageV2Extension)
1007
- || (message === null || message === void 0 ? void 0 : message.editedMessage));
669
+ return (message?.ephemeralMessage ||
670
+ message?.viewOnceMessage ||
671
+ message?.documentWithCaptionMessage ||
672
+ message?.viewOnceMessageV2 ||
673
+ message?.viewOnceMessageV2Extension ||
674
+ message?.editedMessage ||
675
+ message?.associatedChildMessage ||
676
+ message?.groupStatusMessage ||
677
+ message?.groupStatusMessageV2);
1008
678
  }
1009
679
  };
1010
- exports.normalizeMessageContent = normalizeMessageContent;
1011
680
  /**
1012
681
  * Extract the true message content from a message
1013
682
  * Eg. extracts the inner message from a disappearing message/view once message
1014
683
  */
1015
- const extractMessageContent = (content) => {
1016
- var _a, _b, _c, _d, _e, _f;
684
+ export const extractMessageContent = (content) => {
1017
685
  const extractFromTemplateMessage = (msg) => {
1018
686
  if (msg.imageMessage) {
1019
687
  return { imageMessage: msg.imageMessage };
@@ -1029,35 +697,39 @@ const extractMessageContent = (content) => {
1029
697
  }
1030
698
  else {
1031
699
  return {
1032
- conversation: 'contentText' in msg
1033
- ? msg.contentText
1034
- : ('hydratedContentText' in msg ? msg.hydratedContentText : '')
700
+ conversation: 'contentText' in msg ? msg.contentText : 'hydratedContentText' in msg ? msg.hydratedContentText : ''
1035
701
  };
1036
702
  }
1037
703
  };
1038
- content = (0, exports.normalizeMessageContent)(content);
1039
- if (content === null || content === void 0 ? void 0 : content.buttonsMessage) {
704
+ content = normalizeMessageContent(content);
705
+ if (content?.buttonsMessage) {
1040
706
  return extractFromTemplateMessage(content.buttonsMessage);
1041
707
  }
1042
- if ((_a = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _a === void 0 ? void 0 : _a.hydratedFourRowTemplate) {
1043
- return extractFromTemplateMessage((_b = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _b === void 0 ? void 0 : _b.hydratedFourRowTemplate);
708
+ if (content?.templateMessage?.hydratedFourRowTemplate) {
709
+ return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
1044
710
  }
1045
- if ((_c = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _c === void 0 ? void 0 : _c.hydratedTemplate) {
1046
- return extractFromTemplateMessage((_d = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _d === void 0 ? void 0 : _d.hydratedTemplate);
711
+ if (content?.templateMessage?.hydratedTemplate) {
712
+ return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
1047
713
  }
1048
- if ((_e = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _e === void 0 ? void 0 : _e.fourRowTemplate) {
1049
- return extractFromTemplateMessage((_f = content === null || content === void 0 ? void 0 : content.templateMessage) === null || _f === void 0 ? void 0 : _f.fourRowTemplate);
714
+ if (content?.templateMessage?.fourRowTemplate) {
715
+ return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
1050
716
  }
1051
717
  return content;
1052
718
  };
1053
- exports.extractMessageContent = extractMessageContent;
1054
719
  /**
1055
720
  * Returns the device predicted by message ID
1056
721
  */
1057
- const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' : /^3E.{20}$/.test(id) ? 'web' : /^(.{21}|.{32})$/.test(id) ? 'android' : /^.{18}$/.test(id) ? 'desktop' : 'unknown';
1058
- exports.getDevice = getDevice;
722
+ export const getDevice = (id) => /^3A.{18}$/.test(id)
723
+ ? 'ios'
724
+ : /^3E.{20}$/.test(id)
725
+ ? 'web'
726
+ : /^(.{21}|.{32})$/.test(id)
727
+ ? 'android'
728
+ : /^(3F|.{18}$)/.test(id)
729
+ ? 'desktop'
730
+ : 'unknown';
1059
731
  /** Upserts a receipt in the message */
1060
- const updateMessageWithReceipt = (msg, receipt) => {
732
+ export const updateMessageWithReceipt = (msg, receipt) => {
1061
733
  msg.userReceipt = msg.userReceipt || [];
1062
734
  const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
1063
735
  if (recp) {
@@ -1067,41 +739,43 @@ const updateMessageWithReceipt = (msg, receipt) => {
1067
739
  msg.userReceipt.push(receipt);
1068
740
  }
1069
741
  };
1070
- exports.updateMessageWithReceipt = updateMessageWithReceipt;
1071
742
  /** Update the message with a new reaction */
1072
- const updateMessageWithReaction = (msg, reaction) => {
1073
- const authorID = (0, generics_1.getKeyAuthor)(reaction.key);
1074
- const reactions = (msg.reactions || [])
1075
- .filter(r => (0, generics_1.getKeyAuthor)(r.key) !== authorID);
1076
- if (reaction.text) {
1077
- reactions.push(reaction);
1078
- }
743
+ export const updateMessageWithReaction = (msg, reaction) => {
744
+ const authorID = getKeyAuthor(reaction.key);
745
+ const reactions = (msg.reactions || []).filter(r => getKeyAuthor(r.key) !== authorID);
746
+ reaction.text = reaction.text || '';
747
+ reactions.push(reaction);
1079
748
  msg.reactions = reactions;
1080
749
  };
1081
- exports.updateMessageWithReaction = updateMessageWithReaction;
1082
750
  /** Update the message with a new poll update */
1083
- const updateMessageWithPollUpdate = (msg, update) => {
1084
- var _a, _b;
1085
- const authorID = (0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey);
1086
- const reactions = (msg.pollUpdates || [])
1087
- .filter(r => (0, generics_1.getKeyAuthor)(r.pollUpdateMessageKey) !== authorID);
1088
- if ((_b = (_a = update.vote) === null || _a === void 0 ? void 0 : _a.selectedOptions) === null || _b === void 0 ? void 0 : _b.length) {
751
+ export const updateMessageWithPollUpdate = (msg, update) => {
752
+ const authorID = getKeyAuthor(update.pollUpdateMessageKey);
753
+ const reactions = (msg.pollUpdates || []).filter(r => getKeyAuthor(r.pollUpdateMessageKey) !== authorID);
754
+ if (update.vote?.selectedOptions?.length) {
1089
755
  reactions.push(update);
1090
756
  }
1091
757
  msg.pollUpdates = reactions;
1092
758
  };
1093
- exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
759
+ /** Update the message with a new event response */
760
+ export const updateMessageWithEventResponse = (msg, update) => {
761
+ const authorID = getKeyAuthor(update.eventResponseMessageKey);
762
+ const responses = (msg.eventResponses || []).filter(r => getKeyAuthor(r.eventResponseMessageKey) !== authorID);
763
+ responses.push(update);
764
+ msg.eventResponses = responses;
765
+ };
1094
766
  /**
1095
767
  * Aggregates all poll updates in a poll.
1096
768
  * @param msg the poll creation message
1097
769
  * @param meId your jid
1098
770
  * @returns A list of options & their voters
1099
771
  */
1100
- function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
1101
- var _a, _b, _c;
1102
- const opts = ((_a = message === null || message === void 0 ? void 0 : message.pollCreationMessage) === null || _a === void 0 ? void 0 : _a.options) || ((_b = message === null || message === void 0 ? void 0 : message.pollCreationMessageV2) === null || _b === void 0 ? void 0 : _b.options) || ((_c = message === null || message === void 0 ? void 0 : message.pollCreationMessageV3) === null || _c === void 0 ? void 0 : _c.options) || [];
772
+ export function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
773
+ const opts = message?.pollCreationMessage?.options ||
774
+ message?.pollCreationMessageV2?.options ||
775
+ message?.pollCreationMessageV3?.options ||
776
+ [];
1103
777
  const voteHashMap = opts.reduce((acc, opt) => {
1104
- const hash = (0, crypto_2.sha256)(Buffer.from(opt.optionName || '')).toString();
778
+ const hash = sha256(Buffer.from(opt.optionName || '')).toString();
1105
779
  acc[hash] = {
1106
780
  name: opt.optionName || '',
1107
781
  voters: []
@@ -1123,14 +797,36 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
1123
797
  };
1124
798
  data = voteHashMap[hash];
1125
799
  }
1126
- voteHashMap[hash].voters.push((0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey, meId));
800
+ voteHashMap[hash].voters.push(getKeyAuthor(update.pollUpdateMessageKey, meId));
1127
801
  }
1128
802
  }
1129
803
  return Object.values(voteHashMap);
1130
804
  }
1131
- exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
805
+ /**
806
+ * Aggregates all event responses in an event message.
807
+ * @param msg the event creation message
808
+ * @param meId your jid
809
+ * @returns A list of response types & their responders
810
+ */
811
+ export function getAggregateResponsesInEventMessage({ eventResponses }, meId) {
812
+ const responseTypes = ['GOING', 'NOT_GOING', 'MAYBE'];
813
+ const responseMap = {};
814
+ for (const type of responseTypes) {
815
+ responseMap[type] = {
816
+ response: type,
817
+ responders: []
818
+ };
819
+ }
820
+ for (const update of eventResponses || []) {
821
+ const responseType = update.eventResponse || 'UNKNOWN';
822
+ if (responseType !== 'UNKNOWN' && responseMap[responseType]) {
823
+ responseMap[responseType].responders.push(getKeyAuthor(update.eventResponseMessageKey, meId));
824
+ }
825
+ }
826
+ return Object.values(responseMap);
827
+ }
1132
828
  /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
1133
- const aggregateMessageKeysNotFromMe = (keys) => {
829
+ export const aggregateMessageKeysNotFromMe = (keys) => {
1134
830
  const keyMap = {};
1135
831
  for (const { remoteJid, id, participant, fromMe } of keys) {
1136
832
  if (!fromMe) {
@@ -1147,40 +843,34 @@ const aggregateMessageKeysNotFromMe = (keys) => {
1147
843
  }
1148
844
  return Object.values(keyMap);
1149
845
  };
1150
- exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
1151
846
  const REUPLOAD_REQUIRED_STATUS = [410, 404];
1152
847
  /**
1153
848
  * Downloads the given message. Throws an error if it's not a media message
1154
849
  */
1155
- const downloadMediaMessage = async (message, type, options, ctx) => {
1156
- const result = await downloadMsg()
1157
- .catch(async (error) => {
1158
- var _a;
1159
- if (ctx) {
1160
- if (axios_1.default.isAxiosError(error)) {
1161
- // check if the message requires a reupload
1162
- if (REUPLOAD_REQUIRED_STATUS.includes((_a = error.response) === null || _a === void 0 ? void 0 : _a.status)) {
1163
- ctx.logger.info({ key: message.key }, 'sending reupload media request...');
1164
- // request reupload
1165
- message = await ctx.reuploadRequest(message);
1166
- const result = await downloadMsg();
1167
- return result;
1168
- }
1169
- }
850
+ export const downloadMediaMessage = async (message, type, options, ctx) => {
851
+ const result = await downloadMsg().catch(async (error) => {
852
+ if (ctx &&
853
+ typeof error?.status === 'number' && // treat errors with status as HTTP failures requiring reupload
854
+ REUPLOAD_REQUIRED_STATUS.includes(error.status)) {
855
+ ctx.logger.info({ key: message.key }, 'sending reupload media request...');
856
+ // request reupload
857
+ message = await ctx.reuploadRequest(message);
858
+ const result = await downloadMsg();
859
+ return result;
1170
860
  }
1171
861
  throw error;
1172
862
  });
1173
863
  return result;
1174
864
  async function downloadMsg() {
1175
- const mContent = (0, exports.extractMessageContent)(message.message);
865
+ const mContent = extractMessageContent(message.message);
1176
866
  if (!mContent) {
1177
- throw new boom_1.Boom('No message present', { statusCode: 400, data: message });
867
+ throw new Boom('No message present', { statusCode: 400, data: message });
1178
868
  }
1179
- const contentType = (0, exports.getContentType)(mContent);
1180
- let mediaType = contentType === null || contentType === void 0 ? void 0 : contentType.replace('Message', '');
869
+ const contentType = getContentType(mContent);
870
+ let mediaType = contentType?.replace('Message', '');
1181
871
  const media = mContent[contentType];
1182
872
  if (!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) {
1183
- throw new boom_1.Boom(`"${contentType}" message is not a media message`);
873
+ throw new Boom(`"${contentType}" message is not a media message`);
1184
874
  }
1185
875
  let download;
1186
876
  if ('thumbnailDirectPath' in media && !('url' in media)) {
@@ -1193,7 +883,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
1193
883
  else {
1194
884
  download = media;
1195
885
  }
1196
- const stream = await (0, messages_media_1.downloadContentFromMessage)(download, mediaType, options);
886
+ const stream = await downloadContentFromMessage(download, mediaType, options);
1197
887
  if (type === 'buffer') {
1198
888
  const bufferArray = [];
1199
889
  for await (const chunk of stream) {
@@ -1204,18 +894,17 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
1204
894
  return stream;
1205
895
  }
1206
896
  };
1207
- exports.downloadMediaMessage = downloadMediaMessage;
1208
897
  /** Checks whether the given message is a media message; if it is returns the inner content */
1209
- const assertMediaContent = (content) => {
1210
- content = (0, exports.extractMessageContent)(content);
1211
- const mediaContent = (content === null || content === void 0 ? void 0 : content.documentMessage)
1212
- || (content === null || content === void 0 ? void 0 : content.imageMessage)
1213
- || (content === null || content === void 0 ? void 0 : content.videoMessage)
1214
- || (content === null || content === void 0 ? void 0 : content.audioMessage)
1215
- || (content === null || content === void 0 ? void 0 : content.stickerMessage);
898
+ export const assertMediaContent = (content) => {
899
+ content = extractMessageContent(content);
900
+ const mediaContent = content?.documentMessage ||
901
+ content?.imageMessage ||
902
+ content?.videoMessage ||
903
+ content?.audioMessage ||
904
+ content?.stickerMessage;
1216
905
  if (!mediaContent) {
1217
- throw new boom_1.Boom('given message is not a media message', { statusCode: 400, data: content });
906
+ throw new Boom('given message is not a media message', { statusCode: 400, data: content });
1218
907
  }
1219
908
  return mediaContent;
1220
909
  };
1221
- exports.assertMediaContent = assertMediaContent;
910
+ //# sourceMappingURL=messages.js.map