@bellachu/xteambail 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/WAProto/GenerateStatics.sh +3 -0
  4. package/WAProto/WAProto.proto +5479 -0
  5. package/WAProto/fix-imports.js +38 -0
  6. package/WAProto/index.d.ts +14017 -0
  7. package/WAProto/index.js +2213 -0
  8. package/engine-requirements.js +10 -0
  9. package/lib/Defaults/index.d.ts +75 -0
  10. package/lib/Defaults/index.d.ts.map +1 -0
  11. package/lib/Defaults/index.js +139 -0
  12. package/lib/Defaults/index.js.map +1 -0
  13. package/lib/Signal/Group/ciphertext-message.d.ts +10 -0
  14. package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
  15. package/lib/Signal/Group/ciphertext-message.js +19 -0
  16. package/lib/Signal/Group/ciphertext-message.js.map +1 -0
  17. package/lib/Signal/Group/group-session-builder.d.ts +15 -0
  18. package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
  19. package/lib/Signal/Group/group-session-builder.js +38 -0
  20. package/lib/Signal/Group/group-session-builder.js.map +1 -0
  21. package/lib/Signal/Group/group_cipher.d.ts +17 -0
  22. package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
  23. package/lib/Signal/Group/group_cipher.js +87 -0
  24. package/lib/Signal/Group/group_cipher.js.map +1 -0
  25. package/lib/Signal/Group/index.d.ts +12 -0
  26. package/lib/Signal/Group/index.d.ts.map +1 -0
  27. package/lib/Signal/Group/index.js +79 -0
  28. package/lib/Signal/Group/index.js.map +1 -0
  29. package/lib/Signal/Group/keyhelper.d.ts +11 -0
  30. package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
  31. package/lib/Signal/Group/keyhelper.js +27 -0
  32. package/lib/Signal/Group/keyhelper.js.map +1 -0
  33. package/lib/Signal/Group/sender-chain-key.d.ts +14 -0
  34. package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
  35. package/lib/Signal/Group/sender-chain-key.js +33 -0
  36. package/lib/Signal/Group/sender-chain-key.js.map +1 -0
  37. package/lib/Signal/Group/sender-key-distribution-message.d.ts +17 -0
  38. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
  39. package/lib/Signal/Group/sender-key-distribution-message.js +62 -0
  40. package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
  41. package/lib/Signal/Group/sender-key-message.d.ts +19 -0
  42. package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
  43. package/lib/Signal/Group/sender-key-message.js +68 -0
  44. package/lib/Signal/Group/sender-key-message.js.map +1 -0
  45. package/lib/Signal/Group/sender-key-name.d.ts +18 -0
  46. package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
  47. package/lib/Signal/Group/sender-key-name.js +54 -0
  48. package/lib/Signal/Group/sender-key-name.js.map +1 -0
  49. package/lib/Signal/Group/sender-key-record.d.ts +31 -0
  50. package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
  51. package/lib/Signal/Group/sender-key-record.js +48 -0
  52. package/lib/Signal/Group/sender-key-record.js.map +1 -0
  53. package/lib/Signal/Group/sender-key-state.d.ts +39 -0
  54. package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
  55. package/lib/Signal/Group/sender-key-state.js +88 -0
  56. package/lib/Signal/Group/sender-key-state.js.map +1 -0
  57. package/lib/Signal/Group/sender-message-key.d.ts +12 -0
  58. package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
  59. package/lib/Signal/Group/sender-message-key.js +33 -0
  60. package/lib/Signal/Group/sender-message-key.js.map +1 -0
  61. package/lib/Signal/libsignal.d.ts +5 -0
  62. package/lib/Signal/libsignal.d.ts.map +1 -0
  63. package/lib/Signal/libsignal.js +575 -0
  64. package/lib/Signal/libsignal.js.map +1 -0
  65. package/lib/Signal/lid-mapping.d.ts +23 -0
  66. package/lib/Signal/lid-mapping.d.ts.map +1 -0
  67. package/lib/Signal/lid-mapping.js +309 -0
  68. package/lib/Signal/lid-mapping.js.map +1 -0
  69. package/lib/Socket/Client/index.d.ts +3 -0
  70. package/lib/Socket/Client/index.d.ts.map +1 -0
  71. package/lib/Socket/Client/index.js +27 -0
  72. package/lib/Socket/Client/index.js.map +1 -0
  73. package/lib/Socket/Client/types.d.ts +16 -0
  74. package/lib/Socket/Client/types.d.ts.map +1 -0
  75. package/lib/Socket/Client/types.js +18 -0
  76. package/lib/Socket/Client/types.js.map +1 -0
  77. package/lib/Socket/Client/websocket.d.ts +13 -0
  78. package/lib/Socket/Client/websocket.d.ts.map +1 -0
  79. package/lib/Socket/Client/websocket.js +62 -0
  80. package/lib/Socket/Client/websocket.js.map +1 -0
  81. package/lib/Socket/business.d.ts +217 -0
  82. package/lib/Socket/business.d.ts.map +1 -0
  83. package/lib/Socket/business.js +368 -0
  84. package/lib/Socket/business.js.map +1 -0
  85. package/lib/Socket/chats.d.ts +124 -0
  86. package/lib/Socket/chats.d.ts.map +1 -0
  87. package/lib/Socket/chats.js +1340 -0
  88. package/lib/Socket/chats.js.map +1 -0
  89. package/lib/Socket/communities.d.ts +273 -0
  90. package/lib/Socket/communities.d.ts.map +1 -0
  91. package/lib/Socket/communities.js +522 -0
  92. package/lib/Socket/communities.js.map +1 -0
  93. package/lib/Socket/groups.d.ts +161 -0
  94. package/lib/Socket/groups.d.ts.map +1 -0
  95. package/lib/Socket/groups.js +430 -0
  96. package/lib/Socket/groups.js.map +1 -0
  97. package/lib/Socket/index.d.ts +260 -0
  98. package/lib/Socket/index.d.ts.map +1 -0
  99. package/lib/Socket/index.js +11 -0
  100. package/lib/Socket/index.js.map +1 -0
  101. package/lib/Socket/luxu.js +422 -0
  102. package/lib/Socket/messages-recv.d.ts +203 -0
  103. package/lib/Socket/messages-recv.d.ts.map +1 -0
  104. package/lib/Socket/messages-recv.js +2374 -0
  105. package/lib/Socket/messages-recv.js.map +1 -0
  106. package/lib/Socket/messages-send.d.ts +199 -0
  107. package/lib/Socket/messages-send.d.ts.map +1 -0
  108. package/lib/Socket/messages-send.js +1502 -0
  109. package/lib/Socket/messages-send.js.map +1 -0
  110. package/lib/Socket/mex.d.ts +3 -0
  111. package/lib/Socket/mex.d.ts.map +1 -0
  112. package/lib/Socket/mex.js +55 -0
  113. package/lib/Socket/mex.js.map +1 -0
  114. package/lib/Socket/newsletter.d.ts +170 -0
  115. package/lib/Socket/newsletter.d.ts.map +1 -0
  116. package/lib/Socket/newsletter.js +238 -0
  117. package/lib/Socket/newsletter.js.map +1 -0
  118. package/lib/Socket/socket.d.ts +59 -0
  119. package/lib/Socket/socket.d.ts.map +1 -0
  120. package/lib/Socket/socket.js +1022 -0
  121. package/lib/Socket/socket.js.map +1 -0
  122. package/lib/Store/index.d.ts +3 -0
  123. package/lib/Store/index.js +10 -0
  124. package/lib/Store/make-cache-manager-store.d.ts +13 -0
  125. package/lib/Store/make-cache-manager-store.js +82 -0
  126. package/lib/Store/make-in-memory-store.d.ts +118 -0
  127. package/lib/Store/make-in-memory-store.js +429 -0
  128. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  129. package/lib/Store/make-ordered-dictionary.js +81 -0
  130. package/lib/Store/object-repository.d.ts +10 -0
  131. package/lib/Store/object-repository.js +27 -0
  132. package/lib/Types/Auth.d.ts +117 -0
  133. package/lib/Types/Auth.d.ts.map +1 -0
  134. package/lib/Types/Auth.js +5 -0
  135. package/lib/Types/Auth.js.map +1 -0
  136. package/lib/Types/Bussines.d.ts +25 -0
  137. package/lib/Types/Bussines.d.ts.map +1 -0
  138. package/lib/Types/Bussines.js +5 -0
  139. package/lib/Types/Bussines.js.map +1 -0
  140. package/lib/Types/Call.d.ts +15 -0
  141. package/lib/Types/Call.d.ts.map +1 -0
  142. package/lib/Types/Call.js +5 -0
  143. package/lib/Types/Call.js.map +1 -0
  144. package/lib/Types/Chat.d.ts +124 -0
  145. package/lib/Types/Chat.d.ts.map +1 -0
  146. package/lib/Types/Chat.js +8 -0
  147. package/lib/Types/Chat.js.map +1 -0
  148. package/lib/Types/Contact.d.ts +26 -0
  149. package/lib/Types/Contact.d.ts.map +1 -0
  150. package/lib/Types/Contact.js +5 -0
  151. package/lib/Types/Contact.js.map +1 -0
  152. package/lib/Types/Events.d.ts +256 -0
  153. package/lib/Types/Events.d.ts.map +1 -0
  154. package/lib/Types/Events.js +3 -0
  155. package/lib/Types/Events.js.map +1 -0
  156. package/lib/Types/GroupMetadata.d.ts +71 -0
  157. package/lib/Types/GroupMetadata.d.ts.map +1 -0
  158. package/lib/Types/GroupMetadata.js +5 -0
  159. package/lib/Types/GroupMetadata.js.map +1 -0
  160. package/lib/Types/Label.d.ts +47 -0
  161. package/lib/Types/Label.d.ts.map +1 -0
  162. package/lib/Types/Label.js +31 -0
  163. package/lib/Types/Label.js.map +1 -0
  164. package/lib/Types/LabelAssociation.d.ts +30 -0
  165. package/lib/Types/LabelAssociation.d.ts.map +1 -0
  166. package/lib/Types/LabelAssociation.js +13 -0
  167. package/lib/Types/LabelAssociation.js.map +1 -0
  168. package/lib/Types/Message.d.ts +320 -0
  169. package/lib/Types/Message.d.ts.map +1 -0
  170. package/lib/Types/Message.js +23 -0
  171. package/lib/Types/Message.js.map +1 -0
  172. package/lib/Types/Mex.d.ts +141 -0
  173. package/lib/Types/Mex.d.ts.map +1 -0
  174. package/lib/Types/Mex.js +43 -0
  175. package/lib/Types/Mex.js.map +1 -0
  176. package/lib/Types/Product.d.ts +79 -0
  177. package/lib/Types/Product.d.ts.map +1 -0
  178. package/lib/Types/Product.js +5 -0
  179. package/lib/Types/Product.js.map +1 -0
  180. package/lib/Types/Signal.d.ts +87 -0
  181. package/lib/Types/Signal.d.ts.map +1 -0
  182. package/lib/Types/Signal.js +3 -0
  183. package/lib/Types/Signal.js.map +1 -0
  184. package/lib/Types/Socket.d.ts +136 -0
  185. package/lib/Types/Socket.d.ts.map +1 -0
  186. package/lib/Types/Socket.js +4 -0
  187. package/lib/Types/Socket.js.map +1 -0
  188. package/lib/Types/State.d.ts +97 -0
  189. package/lib/Types/State.d.ts.map +1 -0
  190. package/lib/Types/State.js +62 -0
  191. package/lib/Types/State.js.map +1 -0
  192. package/lib/Types/USync.d.ts +26 -0
  193. package/lib/Types/USync.d.ts.map +1 -0
  194. package/lib/Types/USync.js +3 -0
  195. package/lib/Types/USync.js.map +1 -0
  196. package/lib/Types/index.d.ts +65 -0
  197. package/lib/Types/index.d.ts.map +1 -0
  198. package/lib/Types/index.js +167 -0
  199. package/lib/Types/index.js.map +1 -0
  200. package/lib/Utils/auth-utils.d.ts +24 -0
  201. package/lib/Utils/auth-utils.d.ts.map +1 -0
  202. package/lib/Utils/auth-utils.js +332 -0
  203. package/lib/Utils/auth-utils.js.map +1 -0
  204. package/lib/Utils/browser-utils.d.ts +4 -0
  205. package/lib/Utils/browser-utils.d.ts.map +1 -0
  206. package/lib/Utils/browser-utils.js +35 -0
  207. package/lib/Utils/browser-utils.js.map +1 -0
  208. package/lib/Utils/business.d.ts +23 -0
  209. package/lib/Utils/business.d.ts.map +1 -0
  210. package/lib/Utils/business.js +247 -0
  211. package/lib/Utils/business.js.map +1 -0
  212. package/lib/Utils/chat-utils.d.ts +100 -0
  213. package/lib/Utils/chat-utils.d.ts.map +1 -0
  214. package/lib/Utils/chat-utils.js +971 -0
  215. package/lib/Utils/chat-utils.js.map +1 -0
  216. package/lib/Utils/companion-reg-client-utils.d.ts +17 -0
  217. package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -0
  218. package/lib/Utils/companion-reg-client-utils.js +43 -0
  219. package/lib/Utils/companion-reg-client-utils.js.map +1 -0
  220. package/lib/Utils/crypto.d.ts +37 -0
  221. package/lib/Utils/crypto.d.ts.map +1 -0
  222. package/lib/Utils/crypto.js +160 -0
  223. package/lib/Utils/crypto.js.map +1 -0
  224. package/lib/Utils/decode-wa-message.d.ts +66 -0
  225. package/lib/Utils/decode-wa-message.d.ts.map +1 -0
  226. package/lib/Utils/decode-wa-message.js +380 -0
  227. package/lib/Utils/decode-wa-message.js.map +1 -0
  228. package/lib/Utils/event-buffer.d.ts +36 -0
  229. package/lib/Utils/event-buffer.d.ts.map +1 -0
  230. package/lib/Utils/event-buffer.js +666 -0
  231. package/lib/Utils/event-buffer.js.map +1 -0
  232. package/lib/Utils/generics.d.ts +91 -0
  233. package/lib/Utils/generics.d.ts.map +1 -0
  234. package/lib/Utils/generics.js +449 -0
  235. package/lib/Utils/generics.js.map +1 -0
  236. package/lib/Utils/history.d.ts +24 -0
  237. package/lib/Utils/history.d.ts.map +1 -0
  238. package/lib/Utils/history.js +160 -0
  239. package/lib/Utils/history.js.map +1 -0
  240. package/lib/Utils/identity-change-handler.d.ts +44 -0
  241. package/lib/Utils/identity-change-handler.d.ts.map +1 -0
  242. package/lib/Utils/identity-change-handler.js +94 -0
  243. package/lib/Utils/identity-change-handler.js.map +1 -0
  244. package/lib/Utils/index.d.ts +22 -0
  245. package/lib/Utils/index.d.ts.map +1 -0
  246. package/lib/Utils/index.js +236 -0
  247. package/lib/Utils/index.js.map +1 -0
  248. package/lib/Utils/link-preview.d.ts +21 -0
  249. package/lib/Utils/link-preview.d.ts.map +1 -0
  250. package/lib/Utils/link-preview.js +102 -0
  251. package/lib/Utils/link-preview.js.map +1 -0
  252. package/lib/Utils/logger.d.ts +12 -0
  253. package/lib/Utils/logger.d.ts.map +1 -0
  254. package/lib/Utils/logger.js +11 -0
  255. package/lib/Utils/logger.js.map +1 -0
  256. package/lib/Utils/lt-hash.d.ts +8 -0
  257. package/lib/Utils/lt-hash.d.ts.map +1 -0
  258. package/lib/Utils/lt-hash.js +14 -0
  259. package/lib/Utils/lt-hash.js.map +1 -0
  260. package/lib/Utils/make-mutex.d.ts +9 -0
  261. package/lib/Utils/make-mutex.d.ts.map +1 -0
  262. package/lib/Utils/make-mutex.js +43 -0
  263. package/lib/Utils/make-mutex.js.map +1 -0
  264. package/lib/Utils/message-retry-manager.d.ts +115 -0
  265. package/lib/Utils/message-retry-manager.d.ts.map +1 -0
  266. package/lib/Utils/message-retry-manager.js +283 -0
  267. package/lib/Utils/message-retry-manager.js.map +1 -0
  268. package/lib/Utils/messages-media.d.ts +133 -0
  269. package/lib/Utils/messages-media.d.ts.map +1 -0
  270. package/lib/Utils/messages-media.js +914 -0
  271. package/lib/Utils/messages-media.js.map +1 -0
  272. package/lib/Utils/messages.d.ts +91 -0
  273. package/lib/Utils/messages.d.ts.map +1 -0
  274. package/lib/Utils/messages.js +963 -0
  275. package/lib/Utils/messages.js.map +1 -0
  276. package/lib/Utils/noise-handler.d.ts +20 -0
  277. package/lib/Utils/noise-handler.d.ts.map +1 -0
  278. package/lib/Utils/noise-handler.js +238 -0
  279. package/lib/Utils/noise-handler.js.map +1 -0
  280. package/lib/Utils/offline-node-processor.d.ts +17 -0
  281. package/lib/Utils/offline-node-processor.d.ts.map +1 -0
  282. package/lib/Utils/offline-node-processor.js +54 -0
  283. package/lib/Utils/offline-node-processor.js.map +1 -0
  284. package/lib/Utils/pre-key-manager.d.ts +28 -0
  285. package/lib/Utils/pre-key-manager.d.ts.map +1 -0
  286. package/lib/Utils/pre-key-manager.js +109 -0
  287. package/lib/Utils/pre-key-manager.js.map +1 -0
  288. package/lib/Utils/process-message.d.ts +60 -0
  289. package/lib/Utils/process-message.d.ts.map +1 -0
  290. package/lib/Utils/process-message.js +710 -0
  291. package/lib/Utils/process-message.js.map +1 -0
  292. package/lib/Utils/reporting-utils.d.ts +11 -0
  293. package/lib/Utils/reporting-utils.d.ts.map +1 -0
  294. package/lib/Utils/reporting-utils.js +586 -0
  295. package/lib/Utils/reporting-utils.js.map +1 -0
  296. package/lib/Utils/signal.d.ts +47 -0
  297. package/lib/Utils/signal.d.ts.map +1 -0
  298. package/lib/Utils/signal.js +279 -0
  299. package/lib/Utils/signal.js.map +1 -0
  300. package/lib/Utils/stanza-ack.d.ts +11 -0
  301. package/lib/Utils/stanza-ack.d.ts.map +1 -0
  302. package/lib/Utils/stanza-ack.js +47 -0
  303. package/lib/Utils/stanza-ack.js.map +1 -0
  304. package/lib/Utils/sync-action-utils.d.ts +19 -0
  305. package/lib/Utils/sync-action-utils.d.ts.map +1 -0
  306. package/lib/Utils/sync-action-utils.js +61 -0
  307. package/lib/Utils/sync-action-utils.js.map +1 -0
  308. package/lib/Utils/tc-token-utils.d.ts +37 -0
  309. package/lib/Utils/tc-token-utils.d.ts.map +1 -0
  310. package/lib/Utils/tc-token-utils.js +176 -0
  311. package/lib/Utils/tc-token-utils.js.map +1 -0
  312. package/lib/Utils/use-multi-file-auth-state.d.ts +13 -0
  313. package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
  314. package/lib/Utils/use-multi-file-auth-state.js +124 -0
  315. package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
  316. package/lib/Utils/validate-connection.d.ts +11 -0
  317. package/lib/Utils/validate-connection.d.ts.map +1 -0
  318. package/lib/Utils/validate-connection.js +229 -0
  319. package/lib/Utils/validate-connection.js.map +1 -0
  320. package/lib/WABinary/constants.d.ts +28 -0
  321. package/lib/WABinary/constants.d.ts.map +1 -0
  322. package/lib/WABinary/constants.js +42 -0
  323. package/lib/WABinary/constants.js.map +1 -0
  324. package/lib/WABinary/decode.d.ts +7 -0
  325. package/lib/WABinary/decode.d.ts.map +1 -0
  326. package/lib/WABinary/decode.js +271 -0
  327. package/lib/WABinary/decode.js.map +1 -0
  328. package/lib/WABinary/encode.d.ts +3 -0
  329. package/lib/WABinary/encode.d.ts.map +1 -0
  330. package/lib/WABinary/encode.js +226 -0
  331. package/lib/WABinary/encode.js.map +1 -0
  332. package/lib/WABinary/generic-utils.d.ts +15 -0
  333. package/lib/WABinary/generic-utils.d.ts.map +1 -0
  334. package/lib/WABinary/generic-utils.js +219 -0
  335. package/lib/WABinary/generic-utils.js.map +1 -0
  336. package/lib/WABinary/index.d.ts +6 -0
  337. package/lib/WABinary/index.d.ts.map +1 -0
  338. package/lib/WABinary/index.js +60 -0
  339. package/lib/WABinary/index.js.map +1 -0
  340. package/lib/WABinary/jid-utils.d.ts +48 -0
  341. package/lib/WABinary/jid-utils.d.ts.map +1 -0
  342. package/lib/WABinary/jid-utils.js +121 -0
  343. package/lib/WABinary/jid-utils.js.map +1 -0
  344. package/lib/WABinary/types.d.ts +19 -0
  345. package/lib/WABinary/types.d.ts.map +1 -0
  346. package/lib/WABinary/types.js +4 -0
  347. package/lib/WABinary/types.js.map +1 -0
  348. package/lib/WAM/BinaryInfo.d.ts +9 -0
  349. package/lib/WAM/BinaryInfo.d.ts.map +1 -0
  350. package/lib/WAM/BinaryInfo.js +17 -0
  351. package/lib/WAM/BinaryInfo.js.map +1 -0
  352. package/lib/WAM/constants.d.ts +40 -0
  353. package/lib/WAM/constants.d.ts.map +1 -0
  354. package/lib/WAM/constants.js +1 -0
  355. package/lib/WAM/constants.js.map +1 -0
  356. package/lib/WAM/encode.d.ts +3 -0
  357. package/lib/WAM/encode.d.ts.map +1 -0
  358. package/lib/WAM/encode.js +150 -0
  359. package/lib/WAM/encode.js.map +1 -0
  360. package/lib/WAM/index.d.ts +4 -0
  361. package/lib/WAM/index.d.ts.map +1 -0
  362. package/lib/WAM/index.js +38 -0
  363. package/lib/WAM/index.js.map +1 -0
  364. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +10 -0
  365. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
  366. package/lib/WAUSync/Protocols/USyncContactProtocol.js +63 -0
  367. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
  368. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +23 -0
  369. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
  370. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +65 -0
  371. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
  372. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +13 -0
  373. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
  374. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +34 -0
  375. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
  376. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +13 -0
  377. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
  378. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +43 -0
  379. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
  380. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
  381. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -0
  382. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +32 -0
  383. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +1 -0
  384. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +26 -0
  385. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
  386. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +68 -0
  387. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
  388. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +10 -0
  389. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
  390. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +37 -0
  391. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
  392. package/lib/WAUSync/Protocols/index.d.ts +6 -0
  393. package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
  394. package/lib/WAUSync/Protocols/index.js +60 -0
  395. package/lib/WAUSync/Protocols/index.js.map +1 -0
  396. package/lib/WAUSync/USyncQuery.d.ts +30 -0
  397. package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
  398. package/lib/WAUSync/USyncQuery.js +103 -0
  399. package/lib/WAUSync/USyncQuery.js.map +1 -0
  400. package/lib/WAUSync/USyncUser.d.ts +17 -0
  401. package/lib/WAUSync/USyncUser.d.ts.map +1 -0
  402. package/lib/WAUSync/USyncUser.js +38 -0
  403. package/lib/WAUSync/USyncUser.js.map +1 -0
  404. package/lib/WAUSync/index.d.ts +4 -0
  405. package/lib/WAUSync/index.d.ts.map +1 -0
  406. package/lib/WAUSync/index.js +38 -0
  407. package/lib/WAUSync/index.js.map +1 -0
  408. package/lib/index.d.ts +13 -0
  409. package/lib/index.d.ts.map +1 -0
  410. package/lib/index.js +133 -0
  411. package/lib/index.js.map +1 -0
  412. package/package.json +72 -0
  413. package/scripts/patch-deps.js +35 -0
@@ -0,0 +1,963 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.generateWAMessageFromContent = exports.generateWAMessageContent = exports.generateWAMessage = exports.generateLinkPreviewIfRequired = exports.generateForwardMessageContent = exports.extractUrlFromText = exports.extractMessageContent = exports.downloadMediaMessage = exports.assertMediaContent = exports.aggregateMessageKeysNotFromMe = void 0;
7
+ exports.getAggregateResponsesInEventMessage = getAggregateResponsesInEventMessage;
8
+ exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
9
+ exports.updateMessageWithReceipt = exports.updateMessageWithReaction = exports.updateMessageWithPollUpdate = exports.updateMessageWithEventResponse = exports.prepareWAMessageMedia = exports.prepareDisappearingMessageSettingContent = exports.normalizeMessageContent = exports.hasNonNullishProperty = exports.getDevice = exports.getContentType = void 0;
10
+ var _boom = require("@hapi/boom");
11
+ var _crypto = require("crypto");
12
+ var _fs = require("fs");
13
+ require("stream");
14
+ var _index = require("../../WAProto/index.js");
15
+ var _index2 = require("../Defaults/index.js");
16
+ var _index3 = require("../Types/index.js");
17
+ var _index4 = require("../WABinary/index.js");
18
+ var _crypto2 = require("./crypto.js");
19
+ var _generics = require("./generics.js");
20
+ var _messagesMedia = require("./messages-media.js");
21
+ var _reportingUtils = require("./reporting-utils.js");
22
+ const MIMETYPE_MAP = {
23
+ image: 'image/jpeg',
24
+ video: 'video/mp4',
25
+ document: 'application/pdf',
26
+ audio: 'audio/ogg; codecs=opus',
27
+ sticker: 'image/webp',
28
+ 'product-catalog-image': 'image/jpeg'
29
+ };
30
+ const MessageTypeProto = {
31
+ image: _index3.WAProto.Message.ImageMessage,
32
+ video: _index3.WAProto.Message.VideoMessage,
33
+ audio: _index3.WAProto.Message.AudioMessage,
34
+ sticker: _index3.WAProto.Message.StickerMessage,
35
+ document: _index3.WAProto.Message.DocumentMessage
36
+ };
37
+ /**
38
+ * Uses a regex to test whether the string contains a URL, and returns the URL if it does.
39
+ * @param text eg. hello https://google.com
40
+ * @returns the URL, eg. https://google.com
41
+ */
42
+ const extractUrlFromText = text => text.match(_index2.URL_REGEX)?.[0];
43
+ exports.extractUrlFromText = extractUrlFromText;
44
+ const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
45
+ const url = extractUrlFromText(text);
46
+ if (!!getUrlInfo && url) {
47
+ try {
48
+ const urlInfo = await getUrlInfo(url);
49
+ return urlInfo;
50
+ } catch (error) {
51
+ // ignore if fails
52
+ logger?.warn({
53
+ trace: error.stack
54
+ }, 'url generation failed');
55
+ }
56
+ }
57
+ };
58
+ exports.generateLinkPreviewIfRequired = generateLinkPreviewIfRequired;
59
+ const assertColor = async color => {
60
+ let assertedColor;
61
+ if (typeof color === 'number') {
62
+ assertedColor = color > 0 ? color : 0xffffffff + Number(color) + 1;
63
+ } else {
64
+ let hex = color.trim().replace('#', '');
65
+ if (hex.length <= 6) {
66
+ hex = 'FF' + hex.padStart(6, '0');
67
+ }
68
+ assertedColor = parseInt(hex, 16);
69
+ return assertedColor;
70
+ }
71
+ };
72
+ const prepareWAMessageMedia = async (message, options) => {
73
+ const logger = options.logger;
74
+ let mediaType;
75
+ for (const key of _index2.MEDIA_KEYS) {
76
+ if (key in message) {
77
+ mediaType = key;
78
+ }
79
+ }
80
+ if (!mediaType) {
81
+ throw new _boom.Boom('Invalid media type', {
82
+ statusCode: 400
83
+ });
84
+ }
85
+ const uploadData = {
86
+ ...message,
87
+ media: message[mediaType]
88
+ };
89
+ delete uploadData[mediaType];
90
+ // check if cacheable + generate cache key
91
+ const cacheableKey = typeof uploadData.media === 'object' && 'url' in uploadData.media && !!uploadData.media.url && !!options.mediaCache && mediaType + ':' + uploadData.media.url.toString();
92
+ if (mediaType === 'document' && !uploadData.fileName) {
93
+ uploadData.fileName = 'file';
94
+ }
95
+ if (!uploadData.mimetype) {
96
+ uploadData.mimetype = MIMETYPE_MAP[mediaType];
97
+ }
98
+ if (cacheableKey) {
99
+ const mediaBuff = await options.mediaCache.get(cacheableKey);
100
+ if (mediaBuff) {
101
+ logger?.debug({
102
+ cacheableKey
103
+ }, 'got media cache hit');
104
+ const obj = _index.proto.Message.decode(mediaBuff);
105
+ const key = `${mediaType}Message`;
106
+ Object.assign(obj[key], {
107
+ ...uploadData,
108
+ media: undefined
109
+ });
110
+ return obj;
111
+ }
112
+ }
113
+ const isNewsletter = !!options.jid && (0, _index4.isJidNewsletter)(options.jid);
114
+ if (isNewsletter) {
115
+ logger?.info({
116
+ key: cacheableKey
117
+ }, 'Preparing raw media for newsletter');
118
+ const {
119
+ filePath,
120
+ fileSha256,
121
+ fileLength
122
+ } = await (0, _messagesMedia.getRawMediaUploadData)(uploadData.media, options.mediaTypeOverride || mediaType, logger);
123
+ const fileSha256B64 = fileSha256.toString('base64');
124
+ const {
125
+ mediaUrl,
126
+ directPath
127
+ } = await options.upload(filePath, {
128
+ fileEncSha256B64: fileSha256B64,
129
+ mediaType: mediaType,
130
+ timeoutMs: options.mediaUploadTimeoutMs
131
+ });
132
+ await _fs.promises.unlink(filePath);
133
+ const obj = _index3.WAProto.Message.fromObject({
134
+ // todo: add more support here
135
+ [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
136
+ url: mediaUrl,
137
+ directPath,
138
+ fileSha256,
139
+ fileLength,
140
+ ...uploadData,
141
+ media: undefined
142
+ })
143
+ });
144
+ if (uploadData.ptv) {
145
+ obj.ptvMessage = obj.videoMessage;
146
+ delete obj.videoMessage;
147
+ }
148
+ if (obj.stickerMessage) {
149
+ obj.stickerMessage.stickerSentTs = Date.now();
150
+ }
151
+ if (cacheableKey) {
152
+ logger?.debug({
153
+ cacheableKey
154
+ }, 'set cache');
155
+ await options.mediaCache.set(cacheableKey, _index3.WAProto.Message.encode(obj).finish());
156
+ }
157
+ return obj;
158
+ }
159
+ const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
160
+ const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined';
161
+ const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true && typeof uploadData.waveform === 'undefined';
162
+ const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
163
+ const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
164
+ const {
165
+ mediaKey,
166
+ encFilePath,
167
+ originalFilePath,
168
+ fileEncSha256,
169
+ fileSha256,
170
+ fileLength
171
+ } = await (0, _messagesMedia.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
172
+ logger,
173
+ saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
174
+ opts: options.options
175
+ });
176
+ const fileEncSha256B64 = fileEncSha256.toString('base64');
177
+ const [{
178
+ mediaUrl,
179
+ directPath
180
+ }] = await Promise.all([(async () => {
181
+ const result = await options.upload(encFilePath, {
182
+ fileEncSha256B64,
183
+ mediaType,
184
+ timeoutMs: options.mediaUploadTimeoutMs
185
+ });
186
+ logger?.debug({
187
+ mediaType,
188
+ cacheableKey
189
+ }, 'uploaded media');
190
+ return result;
191
+ })(), (async () => {
192
+ try {
193
+ if (requiresThumbnailComputation) {
194
+ const {
195
+ thumbnail,
196
+ originalImageDimensions
197
+ } = await (0, _messagesMedia.generateThumbnail)(originalFilePath, mediaType, options);
198
+ uploadData.jpegThumbnail = thumbnail;
199
+ if (!uploadData.width && originalImageDimensions) {
200
+ uploadData.width = originalImageDimensions.width;
201
+ uploadData.height = originalImageDimensions.height;
202
+ logger?.debug('set dimensions');
203
+ }
204
+ logger?.debug('generated thumbnail');
205
+ }
206
+ if (requiresDurationComputation) {
207
+ uploadData.seconds = await (0, _messagesMedia.getAudioDuration)(originalFilePath);
208
+ logger?.debug('computed audio duration');
209
+ }
210
+ if (requiresWaveformProcessing) {
211
+ uploadData.waveform = await (0, _messagesMedia.getAudioWaveform)(originalFilePath, logger);
212
+ logger?.debug('processed waveform');
213
+ }
214
+ if (requiresAudioBackground) {
215
+ uploadData.backgroundArgb = await assertColor(options.backgroundColor);
216
+ logger?.debug('computed backgroundColor audio status');
217
+ }
218
+ } catch (error) {
219
+ logger?.warn({
220
+ trace: error.stack
221
+ }, 'failed to obtain extra info');
222
+ }
223
+ })()]).finally(async () => {
224
+ try {
225
+ await _fs.promises.unlink(encFilePath);
226
+ if (originalFilePath) {
227
+ await _fs.promises.unlink(originalFilePath);
228
+ }
229
+ logger?.debug('removed tmp files');
230
+ } catch (error) {
231
+ logger?.warn('failed to remove tmp file');
232
+ }
233
+ });
234
+ const obj = _index3.WAProto.Message.fromObject({
235
+ [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
236
+ url: mediaUrl,
237
+ directPath,
238
+ mediaKey,
239
+ fileEncSha256,
240
+ fileSha256,
241
+ fileLength,
242
+ mediaKeyTimestamp: (0, _generics.unixTimestampSeconds)(),
243
+ ...uploadData,
244
+ media: undefined
245
+ })
246
+ });
247
+ if (uploadData.ptv) {
248
+ obj.ptvMessage = obj.videoMessage;
249
+ delete obj.videoMessage;
250
+ }
251
+ if (cacheableKey) {
252
+ logger?.debug({
253
+ cacheableKey
254
+ }, 'set cache');
255
+ await options.mediaCache.set(cacheableKey, _index3.WAProto.Message.encode(obj).finish());
256
+ }
257
+ return obj;
258
+ };
259
+ exports.prepareWAMessageMedia = prepareWAMessageMedia;
260
+ const prepareDisappearingMessageSettingContent = ephemeralExpiration => {
261
+ ephemeralExpiration = ephemeralExpiration || 0;
262
+ const content = {
263
+ ephemeralMessage: {
264
+ message: {
265
+ protocolMessage: {
266
+ type: _index3.WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING,
267
+ ephemeralExpiration
268
+ }
269
+ }
270
+ }
271
+ };
272
+ return _index3.WAProto.Message.fromObject(content);
273
+ };
274
+ /**
275
+ * Generate forwarded message content like WA does
276
+ * @param message the message to forward
277
+ * @param options.forceForward will show the message as forwarded even if it is from you
278
+ */
279
+ exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
280
+ const generateForwardMessageContent = (message, forceForward) => {
281
+ let content = message.message;
282
+ if (!content) {
283
+ throw new _boom.Boom('no content in message', {
284
+ statusCode: 400
285
+ });
286
+ }
287
+ // hacky copy
288
+ content = normalizeMessageContent(content);
289
+ content = _index.proto.Message.decode(_index.proto.Message.encode(content).finish());
290
+ let key = Object.keys(content)[0];
291
+ let score = content?.[key]?.contextInfo?.forwardingScore || 0;
292
+ score += message.key.fromMe && !forceForward ? 0 : 1;
293
+ if (key === 'conversation') {
294
+ content.extendedTextMessage = {
295
+ text: content[key]
296
+ };
297
+ delete content.conversation;
298
+ key = 'extendedTextMessage';
299
+ }
300
+ const key_ = content?.[key];
301
+ if (score > 0) {
302
+ key_.contextInfo = {
303
+ forwardingScore: score,
304
+ isForwarded: true
305
+ };
306
+ } else {
307
+ key_.contextInfo = {};
308
+ }
309
+ return content;
310
+ };
311
+ exports.generateForwardMessageContent = generateForwardMessageContent;
312
+ const hasNonNullishProperty = (message, key) => {
313
+ return typeof message === 'object' && message !== null && key in message && message[key] !== null && message[key] !== undefined;
314
+ };
315
+ exports.hasNonNullishProperty = hasNonNullishProperty;
316
+ function hasOptionalProperty(obj, key) {
317
+ return typeof obj === 'object' && obj !== null && key in obj && obj[key] !== null;
318
+ }
319
+ const generateWAMessageContent = async (message, options) => {
320
+ var _a, _b;
321
+ let m = {};
322
+ if (hasNonNullishProperty(message, 'text')) {
323
+ const extContent = {
324
+ text: message.text
325
+ };
326
+ let urlInfo = message.linkPreview;
327
+ if (typeof urlInfo === 'undefined') {
328
+ urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger);
329
+ }
330
+ if (urlInfo) {
331
+ extContent.matchedText = urlInfo['matched-text'];
332
+ extContent.jpegThumbnail = urlInfo.jpegThumbnail;
333
+ extContent.description = urlInfo.description;
334
+ extContent.title = urlInfo.title;
335
+ extContent.previewType = 0;
336
+ const img = urlInfo.highQualityThumbnail;
337
+ if (img) {
338
+ extContent.thumbnailDirectPath = img.directPath;
339
+ extContent.mediaKey = img.mediaKey;
340
+ extContent.mediaKeyTimestamp = img.mediaKeyTimestamp;
341
+ extContent.thumbnailWidth = img.width;
342
+ extContent.thumbnailHeight = img.height;
343
+ extContent.thumbnailSha256 = img.fileSha256;
344
+ extContent.thumbnailEncSha256 = img.fileEncSha256;
345
+ }
346
+ }
347
+ if (options.backgroundColor) {
348
+ extContent.backgroundArgb = await assertColor(options.backgroundColor);
349
+ }
350
+ if (options.font) {
351
+ extContent.font = options.font;
352
+ }
353
+ m.extendedTextMessage = extContent;
354
+ } else if (hasNonNullishProperty(message, 'contacts')) {
355
+ const contactLen = message.contacts.contacts.length;
356
+ if (!contactLen) {
357
+ throw new _boom.Boom('require atleast 1 contact', {
358
+ statusCode: 400
359
+ });
360
+ }
361
+ if (contactLen === 1) {
362
+ m.contactMessage = _index3.WAProto.Message.ContactMessage.create(message.contacts.contacts[0]);
363
+ } else {
364
+ m.contactsArrayMessage = _index3.WAProto.Message.ContactsArrayMessage.create(message.contacts);
365
+ }
366
+ } else if (hasNonNullishProperty(message, 'location')) {
367
+ m.locationMessage = _index3.WAProto.Message.LocationMessage.create(message.location);
368
+ } else if (hasNonNullishProperty(message, 'react')) {
369
+ if (!message.react.senderTimestampMs) {
370
+ message.react.senderTimestampMs = Date.now();
371
+ }
372
+ m.reactionMessage = _index3.WAProto.Message.ReactionMessage.create(message.react);
373
+ } else if (hasNonNullishProperty(message, 'delete')) {
374
+ m.protocolMessage = {
375
+ key: message.delete,
376
+ type: _index3.WAProto.Message.ProtocolMessage.Type.REVOKE
377
+ };
378
+ } else if (hasNonNullishProperty(message, 'forward')) {
379
+ m = generateForwardMessageContent(message.forward, message.force);
380
+ } else if (hasNonNullishProperty(message, 'disappearingMessagesInChat')) {
381
+ const exp = typeof message.disappearingMessagesInChat === 'boolean' ? message.disappearingMessagesInChat ? _index2.WA_DEFAULT_EPHEMERAL : 0 : message.disappearingMessagesInChat;
382
+ m = prepareDisappearingMessageSettingContent(exp);
383
+ } else if (hasNonNullishProperty(message, 'groupInvite')) {
384
+ m.groupInviteMessage = {};
385
+ m.groupInviteMessage.inviteCode = message.groupInvite.inviteCode;
386
+ m.groupInviteMessage.inviteExpiration = message.groupInvite.inviteExpiration;
387
+ m.groupInviteMessage.caption = message.groupInvite.text;
388
+ m.groupInviteMessage.groupJid = message.groupInvite.jid;
389
+ m.groupInviteMessage.groupName = message.groupInvite.subject;
390
+ //TODO: use built-in interface and get disappearing mode info etc.
391
+ //TODO: cache / use store!?
392
+ if (options.getProfilePicUrl) {
393
+ const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
394
+ if (pfpUrl) {
395
+ const resp = await fetch(pfpUrl, {
396
+ method: 'GET',
397
+ dispatcher: options?.options?.dispatcher
398
+ });
399
+ if (resp.ok) {
400
+ const buf = Buffer.from(await resp.arrayBuffer());
401
+ m.groupInviteMessage.jpegThumbnail = buf;
402
+ }
403
+ }
404
+ }
405
+ } else if (hasNonNullishProperty(message, 'pin')) {
406
+ m.pinInChatMessage = {};
407
+ m.messageContextInfo = {};
408
+ m.pinInChatMessage.key = message.pin;
409
+ m.pinInChatMessage.type = message.type;
410
+ m.pinInChatMessage.senderTimestampMs = Date.now();
411
+ m.messageContextInfo.messageAddOnDurationInSecs = message.type === 1 ? message.time || 86400 : 0;
412
+ } else if (hasNonNullishProperty(message, 'buttonReply')) {
413
+ switch (message.type) {
414
+ case 'template':
415
+ m.templateButtonReplyMessage = {
416
+ selectedDisplayText: message.buttonReply.displayText,
417
+ selectedId: message.buttonReply.id,
418
+ selectedIndex: message.buttonReply.index
419
+ };
420
+ break;
421
+ case 'plain':
422
+ m.buttonsResponseMessage = {
423
+ selectedButtonId: message.buttonReply.id,
424
+ selectedDisplayText: message.buttonReply.displayText,
425
+ type: _index.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT
426
+ };
427
+ break;
428
+ }
429
+ } else if (hasOptionalProperty(message, 'ptv') && message.ptv) {
430
+ const {
431
+ videoMessage
432
+ } = await prepareWAMessageMedia({
433
+ video: message.video
434
+ }, options);
435
+ m.ptvMessage = videoMessage;
436
+ } else if (hasNonNullishProperty(message, 'product')) {
437
+ const {
438
+ imageMessage
439
+ } = await prepareWAMessageMedia({
440
+ image: message.product.productImage
441
+ }, options);
442
+ m.productMessage = _index3.WAProto.Message.ProductMessage.create({
443
+ ...message,
444
+ product: {
445
+ ...message.product,
446
+ productImage: imageMessage
447
+ }
448
+ });
449
+ } else if (hasNonNullishProperty(message, 'listReply')) {
450
+ m.listResponseMessage = {
451
+ ...message.listReply
452
+ };
453
+ } else if (hasNonNullishProperty(message, 'event')) {
454
+ m.eventMessage = {};
455
+ const startTime = Math.floor(message.event.startDate.getTime() / 1000);
456
+ if (message.event.call && options.getCallLink) {
457
+ const token = await options.getCallLink(message.event.call, {
458
+ startTime
459
+ });
460
+ m.eventMessage.joinLink = (message.event.call === 'audio' ? _index2.CALL_AUDIO_PREFIX : _index2.CALL_VIDEO_PREFIX) + token;
461
+ }
462
+ m.messageContextInfo = {
463
+ // encKey
464
+ messageSecret: message.event.messageSecret || (0, _crypto.randomBytes)(32)
465
+ };
466
+ m.eventMessage.name = message.event.name;
467
+ m.eventMessage.description = message.event.description;
468
+ m.eventMessage.startTime = startTime;
469
+ m.eventMessage.endTime = message.event.endDate ? message.event.endDate.getTime() / 1000 : undefined;
470
+ m.eventMessage.isCanceled = message.event.isCancelled ?? false;
471
+ m.eventMessage.extraGuestsAllowed = message.event.extraGuestsAllowed;
472
+ m.eventMessage.isScheduleCall = message.event.isScheduleCall ?? false;
473
+ m.eventMessage.location = message.event.location;
474
+ } else if (hasNonNullishProperty(message, 'poll')) {
475
+ (_a = message.poll).selectableCount || (_a.selectableCount = 0);
476
+ (_b = message.poll).toAnnouncementGroup || (_b.toAnnouncementGroup = false);
477
+ if (!Array.isArray(message.poll.values)) {
478
+ throw new _boom.Boom('Invalid poll values', {
479
+ statusCode: 400
480
+ });
481
+ }
482
+ if (message.poll.selectableCount < 0 || message.poll.selectableCount > message.poll.values.length) {
483
+ throw new _boom.Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, {
484
+ statusCode: 400
485
+ });
486
+ }
487
+ m.messageContextInfo = {
488
+ // encKey
489
+ messageSecret: message.poll.messageSecret || (0, _crypto.randomBytes)(32)
490
+ };
491
+ const pollCreationMessage = {
492
+ name: message.poll.name,
493
+ selectableOptionsCount: message.poll.selectableCount,
494
+ options: message.poll.values.map(optionName => ({
495
+ optionName
496
+ }))
497
+ };
498
+ if (message.poll.toAnnouncementGroup) {
499
+ // poll v2 is for community announcement groups (single select and multiple)
500
+ m.pollCreationMessageV2 = pollCreationMessage;
501
+ } else {
502
+ if (message.poll.selectableCount === 1) {
503
+ //poll v3 is for single select polls
504
+ m.pollCreationMessageV3 = pollCreationMessage;
505
+ } else {
506
+ // poll for multiple choice polls
507
+ m.pollCreationMessage = pollCreationMessage;
508
+ }
509
+ }
510
+ } else if (hasNonNullishProperty(message, 'album')) {
511
+ m.albumMessage = {
512
+ expectedImageCount: message.album.expectedImageCount,
513
+ expectedVideoCount: message.album.expectedVideoCount
514
+ };
515
+ } else if (hasNonNullishProperty(message, 'sharePhoneNumber')) {
516
+ m.protocolMessage = {
517
+ type: _index.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
518
+ };
519
+ } else if (hasNonNullishProperty(message, 'requestPhoneNumber')) {
520
+ m.requestPhoneNumberMessage = {};
521
+ } else if (hasNonNullishProperty(message, 'limitSharing')) {
522
+ m.protocolMessage = {
523
+ type: _index.proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
524
+ limitSharing: {
525
+ sharingLimited: message.limitSharing === true,
526
+ trigger: 1,
527
+ limitSharingSettingTimestamp: Date.now(),
528
+ initiatedByMe: true
529
+ }
530
+ };
531
+ } else {
532
+ m = await prepareWAMessageMedia(message, options);
533
+ }
534
+ if (hasOptionalProperty(message, 'viewOnce') && !!message.viewOnce) {
535
+ m = {
536
+ viewOnceMessage: {
537
+ message: m
538
+ }
539
+ };
540
+ }
541
+ if (hasOptionalProperty(message, 'mentions') && message.mentions?.length || hasOptionalProperty(message, 'mentionAll') && message.mentionAll) {
542
+ const messageType = Object.keys(m)[0];
543
+ const key = m[messageType];
544
+ if (key && 'contextInfo' in key) {
545
+ key.contextInfo = key.contextInfo || {};
546
+ if (message.mentions?.length) {
547
+ key.contextInfo.mentionedJid = message.mentions;
548
+ }
549
+ if (message.mentionAll) {
550
+ key.contextInfo.nonJidMentions = 1;
551
+ }
552
+ } else if (key) {
553
+ key.contextInfo = {
554
+ mentionedJid: message.mentions,
555
+ nonJidMentions: message.mentionAll ? 1 : 0
556
+ };
557
+ }
558
+ }
559
+ if (hasOptionalProperty(message, 'edit')) {
560
+ m = {
561
+ protocolMessage: {
562
+ key: message.edit,
563
+ editedMessage: m,
564
+ timestampMs: Date.now(),
565
+ type: _index3.WAProto.Message.ProtocolMessage.Type.MESSAGE_EDIT
566
+ }
567
+ };
568
+ }
569
+ if (hasOptionalProperty(message, 'contextInfo') && !!message.contextInfo) {
570
+ const messageType = Object.keys(m)[0];
571
+ const key = m[messageType];
572
+ if ('contextInfo' in key && !!key.contextInfo) {
573
+ key.contextInfo = {
574
+ ...key.contextInfo,
575
+ ...message.contextInfo
576
+ };
577
+ } else if (key) {
578
+ key.contextInfo = message.contextInfo;
579
+ }
580
+ }
581
+ if (hasOptionalProperty(message, 'albumParentKey') && !!message.albumParentKey) {
582
+ m.messageContextInfo = {
583
+ ...m.messageContextInfo,
584
+ messageAssociation: {
585
+ associationType: _index3.WAProto.MessageAssociation.AssociationType.MEDIA_ALBUM,
586
+ parentMessageKey: message.albumParentKey
587
+ }
588
+ };
589
+ }
590
+ if ((0, _reportingUtils.shouldIncludeReportingToken)(m)) {
591
+ m.messageContextInfo = m.messageContextInfo || {};
592
+ if (!m.messageContextInfo.messageSecret) {
593
+ m.messageContextInfo.messageSecret = (0, _crypto.randomBytes)(32);
594
+ }
595
+ }
596
+ return _index3.WAProto.Message.create(m);
597
+ };
598
+ exports.generateWAMessageContent = generateWAMessageContent;
599
+ const generateWAMessageFromContent = (jid, message, options) => {
600
+ // set timestamp to now
601
+ // if not specified
602
+ if (!options.timestamp) {
603
+ options.timestamp = new Date();
604
+ }
605
+ const innerMessage = normalizeMessageContent(message);
606
+ const key = getContentType(innerMessage);
607
+ const timestamp = (0, _generics.unixTimestampSeconds)(options.timestamp);
608
+ const {
609
+ quoted,
610
+ userJid
611
+ } = options;
612
+ if (quoted && !(0, _index4.isJidNewsletter)(jid)) {
613
+ const participant = quoted.key.fromMe ? userJid // TODO: Add support for LIDs
614
+ : quoted.participant || quoted.key.participant || quoted.key.remoteJid;
615
+ let quotedMsg = normalizeMessageContent(quoted.message);
616
+ const msgType = getContentType(quotedMsg);
617
+ // strip any redundant properties
618
+ quotedMsg = _index.proto.Message.create({
619
+ [msgType]: quotedMsg[msgType]
620
+ });
621
+ const quotedContent = quotedMsg[msgType];
622
+ if (typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) {
623
+ delete quotedContent.contextInfo;
624
+ }
625
+ const contextInfo = 'contextInfo' in innerMessage[key] && innerMessage[key]?.contextInfo || {};
626
+ contextInfo.participant = (0, _index4.jidNormalizedUser)(participant);
627
+ contextInfo.stanzaId = quoted.key.id;
628
+ contextInfo.quotedMessage = quotedMsg;
629
+ // if a participant is quoted, then it must be a group
630
+ // hence, remoteJid of group must also be entered
631
+ if (jid !== quoted.key.remoteJid) {
632
+ contextInfo.remoteJid = quoted.key.remoteJid;
633
+ }
634
+ if (contextInfo && innerMessage[key]) {
635
+ /* @ts-ignore */
636
+ innerMessage[key].contextInfo = contextInfo;
637
+ }
638
+ }
639
+ if (
640
+ // if we want to send a disappearing message
641
+ !!options?.ephemeralExpiration &&
642
+ // and it's not a protocol message -- delete, toggle disappear message
643
+ key !== 'protocolMessage' &&
644
+ // already not converted to disappearing message
645
+ key !== 'ephemeralMessage' &&
646
+ // newsletters don't support ephemeral messages
647
+ !(0, _index4.isJidNewsletter)(jid)) {
648
+ /* @ts-ignore */
649
+ innerMessage[key].contextInfo = {
650
+ ...(innerMessage[key].contextInfo || {}),
651
+ expiration: options.ephemeralExpiration || _index2.WA_DEFAULT_EPHEMERAL
652
+ //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
653
+ };
654
+ }
655
+ message = _index3.WAProto.Message.create(message);
656
+ const messageJSON = {
657
+ key: {
658
+ remoteJid: jid,
659
+ fromMe: true,
660
+ id: options?.messageId || (0, _generics.generateMessageIDV2)()
661
+ },
662
+ message: message,
663
+ messageTimestamp: timestamp,
664
+ messageStubParameters: [],
665
+ participant: (0, _index4.isJidGroup)(jid) || (0, _index4.isJidStatusBroadcast)(jid) ? userJid : undefined,
666
+ // TODO: Add support for LIDs
667
+ status: _index3.WAMessageStatus.PENDING
668
+ };
669
+ return _index3.WAProto.WebMessageInfo.fromObject(messageJSON);
670
+ };
671
+ exports.generateWAMessageFromContent = generateWAMessageFromContent;
672
+ const generateWAMessage = async (jid, content, options) => {
673
+ // ensure msg ID is with every log
674
+ options.logger = options?.logger?.child({
675
+ msgId: options.messageId
676
+ });
677
+ // Pass jid in the options to generateWAMessageContent
678
+ return generateWAMessageFromContent(jid, await generateWAMessageContent(content, {
679
+ ...options,
680
+ jid
681
+ }), options);
682
+ };
683
+ /** Get the key to access the true type of content */
684
+ exports.generateWAMessage = generateWAMessage;
685
+ const getContentType = content => {
686
+ if (content) {
687
+ const keys = Object.keys(content);
688
+ const key = keys.find(k => (k === 'conversation' || k.includes('Message')) && k !== 'senderKeyDistributionMessage');
689
+ return key;
690
+ }
691
+ };
692
+ /**
693
+ * Normalizes ephemeral, view once messages to regular message content
694
+ * Eg. image messages in ephemeral messages, in view once messages etc.
695
+ * @param content
696
+ * @returns
697
+ */
698
+ exports.getContentType = getContentType;
699
+ const normalizeMessageContent = content => {
700
+ if (!content) {
701
+ return undefined;
702
+ }
703
+ // set max iterations to prevent an infinite loop
704
+ for (let i = 0; i < 5; i++) {
705
+ const inner = getFutureProofMessage(content);
706
+ if (!inner) {
707
+ break;
708
+ }
709
+ content = inner.message;
710
+ }
711
+ return content;
712
+ function getFutureProofMessage(message) {
713
+ return message?.ephemeralMessage || message?.viewOnceMessage || message?.documentWithCaptionMessage || message?.viewOnceMessageV2 || message?.viewOnceMessageV2Extension || message?.editedMessage || message?.associatedChildMessage || message?.groupStatusMessage || message?.groupStatusMessageV2;
714
+ }
715
+ };
716
+ /**
717
+ * Extract the true message content from a message
718
+ * Eg. extracts the inner message from a disappearing message/view once message
719
+ */
720
+ exports.normalizeMessageContent = normalizeMessageContent;
721
+ const extractMessageContent = content => {
722
+ const extractFromTemplateMessage = msg => {
723
+ if (msg.imageMessage) {
724
+ return {
725
+ imageMessage: msg.imageMessage
726
+ };
727
+ } else if (msg.documentMessage) {
728
+ return {
729
+ documentMessage: msg.documentMessage
730
+ };
731
+ } else if (msg.videoMessage) {
732
+ return {
733
+ videoMessage: msg.videoMessage
734
+ };
735
+ } else if (msg.locationMessage) {
736
+ return {
737
+ locationMessage: msg.locationMessage
738
+ };
739
+ } else {
740
+ return {
741
+ conversation: 'contentText' in msg ? msg.contentText : 'hydratedContentText' in msg ? msg.hydratedContentText : ''
742
+ };
743
+ }
744
+ };
745
+ content = normalizeMessageContent(content);
746
+ if (content?.buttonsMessage) {
747
+ return extractFromTemplateMessage(content.buttonsMessage);
748
+ }
749
+ if (content?.templateMessage?.hydratedFourRowTemplate) {
750
+ return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate);
751
+ }
752
+ if (content?.templateMessage?.hydratedTemplate) {
753
+ return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate);
754
+ }
755
+ if (content?.templateMessage?.fourRowTemplate) {
756
+ return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate);
757
+ }
758
+ return content;
759
+ };
760
+ /**
761
+ * Returns the device predicted by message ID
762
+ */
763
+ exports.extractMessageContent = extractMessageContent;
764
+ const getDevice = id => /^3A.{18}$/.test(id) ? 'ios' : /^3E.{20}$/.test(id) ? 'web' : /^(.{21}|.{32})$/.test(id) ? 'android' : /^(3F|.{18}$)/.test(id) ? 'desktop' : 'unknown';
765
+ /** Upserts a receipt in the message */
766
+ exports.getDevice = getDevice;
767
+ const updateMessageWithReceipt = (msg, receipt) => {
768
+ msg.userReceipt = msg.userReceipt || [];
769
+ const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
770
+ if (recp) {
771
+ Object.assign(recp, receipt);
772
+ } else {
773
+ msg.userReceipt.push(receipt);
774
+ }
775
+ };
776
+ /** Update the message with a new reaction */
777
+ exports.updateMessageWithReceipt = updateMessageWithReceipt;
778
+ const updateMessageWithReaction = (msg, reaction) => {
779
+ const authorID = (0, _generics.getKeyAuthor)(reaction.key);
780
+ const reactions = (msg.reactions || []).filter(r => (0, _generics.getKeyAuthor)(r.key) !== authorID);
781
+ reaction.text = reaction.text || '';
782
+ reactions.push(reaction);
783
+ msg.reactions = reactions;
784
+ };
785
+ /** Update the message with a new poll update */
786
+ exports.updateMessageWithReaction = updateMessageWithReaction;
787
+ const updateMessageWithPollUpdate = (msg, update) => {
788
+ const authorID = (0, _generics.getKeyAuthor)(update.pollUpdateMessageKey);
789
+ const reactions = (msg.pollUpdates || []).filter(r => (0, _generics.getKeyAuthor)(r.pollUpdateMessageKey) !== authorID);
790
+ if (update.vote?.selectedOptions?.length) {
791
+ reactions.push(update);
792
+ }
793
+ msg.pollUpdates = reactions;
794
+ };
795
+ /** Update the message with a new event response */
796
+ exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
797
+ const updateMessageWithEventResponse = (msg, update) => {
798
+ const authorID = (0, _generics.getKeyAuthor)(update.eventResponseMessageKey);
799
+ const responses = (msg.eventResponses || []).filter(r => (0, _generics.getKeyAuthor)(r.eventResponseMessageKey) !== authorID);
800
+ responses.push(update);
801
+ msg.eventResponses = responses;
802
+ };
803
+ /**
804
+ * Aggregates all poll updates in a poll.
805
+ * @param msg the poll creation message
806
+ * @param meId your jid
807
+ * @returns A list of options & their voters
808
+ */
809
+ exports.updateMessageWithEventResponse = updateMessageWithEventResponse;
810
+ function getAggregateVotesInPollMessage({
811
+ message,
812
+ pollUpdates
813
+ }, meId) {
814
+ const opts = message?.pollCreationMessage?.options || message?.pollCreationMessageV2?.options || message?.pollCreationMessageV3?.options || [];
815
+ const voteHashMap = opts.reduce((acc, opt) => {
816
+ const hash = (0, _crypto2.sha256)(Buffer.from(opt.optionName || '')).toString();
817
+ acc[hash] = {
818
+ name: opt.optionName || '',
819
+ voters: []
820
+ };
821
+ return acc;
822
+ }, {});
823
+ for (const update of pollUpdates || []) {
824
+ const {
825
+ vote
826
+ } = update;
827
+ if (!vote) {
828
+ continue;
829
+ }
830
+ for (const option of vote.selectedOptions || []) {
831
+ const hash = option.toString();
832
+ let data = voteHashMap[hash];
833
+ if (!data) {
834
+ voteHashMap[hash] = {
835
+ name: 'Unknown',
836
+ voters: []
837
+ };
838
+ data = voteHashMap[hash];
839
+ }
840
+ voteHashMap[hash].voters.push((0, _generics.getKeyAuthor)(update.pollUpdateMessageKey, meId));
841
+ }
842
+ }
843
+ return Object.values(voteHashMap);
844
+ }
845
+ /**
846
+ * Aggregates all event responses in an event message.
847
+ * @param msg the event creation message
848
+ * @param meId your jid
849
+ * @returns A list of response types & their responders
850
+ */
851
+ function getAggregateResponsesInEventMessage({
852
+ eventResponses
853
+ }, meId) {
854
+ const responseTypes = ['GOING', 'NOT_GOING', 'MAYBE'];
855
+ const responseMap = {};
856
+ for (const type of responseTypes) {
857
+ responseMap[type] = {
858
+ response: type,
859
+ responders: []
860
+ };
861
+ }
862
+ for (const update of eventResponses || []) {
863
+ const responseType = update.eventResponse || 'UNKNOWN';
864
+ if (responseType !== 'UNKNOWN' && responseMap[responseType]) {
865
+ responseMap[responseType].responders.push((0, _generics.getKeyAuthor)(update.eventResponseMessageKey, meId));
866
+ }
867
+ }
868
+ return Object.values(responseMap);
869
+ }
870
+ /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
871
+ const aggregateMessageKeysNotFromMe = keys => {
872
+ const keyMap = {};
873
+ for (const {
874
+ remoteJid,
875
+ id,
876
+ participant,
877
+ fromMe
878
+ } of keys) {
879
+ if (!fromMe) {
880
+ const uqKey = `${remoteJid}:${participant || ''}`;
881
+ if (!keyMap[uqKey]) {
882
+ keyMap[uqKey] = {
883
+ jid: remoteJid,
884
+ participant: participant,
885
+ messageIds: []
886
+ };
887
+ }
888
+ keyMap[uqKey].messageIds.push(id);
889
+ }
890
+ }
891
+ return Object.values(keyMap);
892
+ };
893
+ exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
894
+ const REUPLOAD_REQUIRED_STATUS = [410, 404];
895
+ /**
896
+ * Downloads the given message. Throws an error if it's not a media message
897
+ */
898
+ const downloadMediaMessage = async (message, type, options, ctx) => {
899
+ const result = await downloadMsg().catch(async error => {
900
+ if (ctx && typeof error?.status === 'number' &&
901
+ // treat errors with status as HTTP failures requiring reupload
902
+ REUPLOAD_REQUIRED_STATUS.includes(error.status)) {
903
+ ctx.logger.info({
904
+ key: message.key
905
+ }, 'sending reupload media request...');
906
+ // request reupload
907
+ message = await ctx.reuploadRequest(message);
908
+ const result = await downloadMsg();
909
+ return result;
910
+ }
911
+ throw error;
912
+ });
913
+ return result;
914
+ async function downloadMsg() {
915
+ const mContent = extractMessageContent(message.message);
916
+ if (!mContent) {
917
+ throw new _boom.Boom('No message present', {
918
+ statusCode: 400,
919
+ data: message
920
+ });
921
+ }
922
+ const contentType = getContentType(mContent);
923
+ let mediaType = contentType?.replace('Message', '');
924
+ const media = mContent[contentType];
925
+ if (!media || typeof media !== 'object' || !('url' in media) && !('thumbnailDirectPath' in media)) {
926
+ throw new _boom.Boom(`"${contentType}" message is not a media message`);
927
+ }
928
+ let download;
929
+ if ('thumbnailDirectPath' in media && !('url' in media)) {
930
+ download = {
931
+ directPath: media.thumbnailDirectPath,
932
+ mediaKey: media.mediaKey
933
+ };
934
+ mediaType = 'thumbnail-link';
935
+ } else {
936
+ download = media;
937
+ }
938
+ const stream = await (0, _messagesMedia.downloadContentFromMessage)(download, mediaType, options);
939
+ if (type === 'buffer') {
940
+ const bufferArray = [];
941
+ for await (const chunk of stream) {
942
+ bufferArray.push(chunk);
943
+ }
944
+ return Buffer.concat(bufferArray);
945
+ }
946
+ return stream;
947
+ }
948
+ };
949
+ /** Checks whether the given message is a media message; if it is returns the inner content */
950
+ exports.downloadMediaMessage = downloadMediaMessage;
951
+ const assertMediaContent = content => {
952
+ content = extractMessageContent(content);
953
+ const mediaContent = content?.documentMessage || content?.imageMessage || content?.videoMessage || content?.audioMessage || content?.stickerMessage;
954
+ if (!mediaContent) {
955
+ throw new _boom.Boom('given message is not a media message', {
956
+ statusCode: 400,
957
+ data: content
958
+ });
959
+ }
960
+ return mediaContent;
961
+ };
962
+ //# sourceMappingURL=messages.js.map
963
+ exports.assertMediaContent = assertMediaContent;