@ubedsockets/baileys 1.6.8 → 1.7.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 (395) hide show
  1. package/WAProto/GenerateStatics.sh +26 -3
  2. package/WAProto/WAProto.proto +432 -180
  3. package/WAProto/add-missing-proto-deps.js +134 -0
  4. package/WAProto/imports-elaina.js +48 -0
  5. package/WAProto/index.js +78044 -140686
  6. package/WAProto/merge-elaina-ai-proto.js +187 -0
  7. package/engine-requirements.js +10 -0
  8. package/lib/Defaults/elaina-version.json +3 -0
  9. package/lib/Defaults/index.js +57 -55
  10. package/lib/Signal/Group/group_cipher.js +1 -1
  11. package/lib/Signal/Group/keyhelper.js +1 -1
  12. package/lib/Signal/Group/sender-chain-key.js +1 -1
  13. package/lib/Signal/Group/sender-key-message.js +1 -1
  14. package/lib/Signal/Group/sender-message-key.js +1 -1
  15. package/lib/Signal/libsignal.js +1 -1
  16. package/lib/Signal/libsignalnode/LICENSE +621 -0
  17. package/lib/Signal/libsignalnode/README.md +11 -0
  18. package/lib/Signal/libsignalnode/generate-proto.sh +1 -0
  19. package/lib/Signal/libsignalnode/index.js +10 -0
  20. package/lib/Signal/libsignalnode/protos/WhisperTextProtocol.proto +28 -0
  21. package/lib/Signal/libsignalnode/src/.eslintrc.json +31 -0
  22. package/lib/Signal/libsignalnode/src/WhisperTextProtocol.js +948 -0
  23. package/lib/Signal/libsignalnode/src/base_key_type.js +6 -0
  24. package/lib/Signal/libsignalnode/src/chain_type.js +6 -0
  25. package/lib/Signal/libsignalnode/src/crypto.js +98 -0
  26. package/lib/Signal/libsignalnode/src/curve.js +142 -0
  27. package/lib/Signal/libsignalnode/src/errors.js +33 -0
  28. package/lib/Signal/libsignalnode/src/keyhelper.js +45 -0
  29. package/lib/Signal/libsignalnode/src/numeric_fingerprint.js +70 -0
  30. package/lib/Signal/libsignalnode/src/protobufs.js +10 -0
  31. package/lib/Signal/libsignalnode/src/protocol_address.js +40 -0
  32. package/lib/Signal/libsignalnode/src/queue_job.js +70 -0
  33. package/lib/Signal/libsignalnode/src/session_builder.js +164 -0
  34. package/lib/Signal/libsignalnode/src/session_cipher.js +332 -0
  35. package/lib/Signal/libsignalnode/src/session_record.js +325 -0
  36. package/lib/Socket/Client/websocket.js +2 -41
  37. package/lib/Socket/Rhandler.js +533 -0
  38. package/lib/Socket/chats.js +249 -123
  39. package/lib/Socket/index.js +1 -1
  40. package/lib/Socket/messages-recv.js +57 -5
  41. package/lib/Socket/messages-send.js +47 -280
  42. package/lib/Socket/newsletter.js +100 -132
  43. package/lib/Socket/socket.js +79 -87
  44. package/lib/Socket/usync.js +0 -2
  45. package/lib/Store/make-in-memory-store.js +1 -1
  46. package/lib/Utils/browser-utils.js +30 -23
  47. package/lib/Utils/crypto.js +22 -18
  48. package/lib/Utils/decode-wa-message.js +12 -2
  49. package/lib/Utils/{baileys-event-stream.js → elaina-event-stream.js} +1 -1
  50. package/lib/Utils/event-buffer.js +2 -2
  51. package/lib/Utils/generics.js +36 -10
  52. package/lib/Utils/index.js +3 -1
  53. package/lib/Utils/message-retry-manager.js +48 -185
  54. package/lib/Utils/messages-media.js +127 -236
  55. package/lib/Utils/messages.js +745 -221
  56. package/lib/Utils/noise-handler.js +1 -2
  57. package/lib/Utils/process-message.js +108 -25
  58. package/lib/Utils/signal.js +1 -10
  59. package/lib/Utils/use-multi-file-auth-state.js +1 -1
  60. package/lib/Utils/validate-connection.js +3 -7
  61. package/lib/Voip/audio-feeder.js +166 -0
  62. package/lib/Voip/index.js +639 -0
  63. package/lib/Voip/relay-transport.js +829 -0
  64. package/lib/Voip/signaling.js +1102 -0
  65. package/lib/Voip/types.js +23 -0
  66. package/lib/Voip/wasm-engine.js +1255 -0
  67. package/lib/Voip/worker-bootstrap.js +1078 -0
  68. package/lib/WABinary/jid-utils.js +17 -1
  69. package/lib/assets/wasm/loader.js +5 -0
  70. package/lib/assets/wasm/whatsapp.wasm +0 -0
  71. package/lib/assets/wasm/worker-modules.js +273 -0
  72. package/lib/index.js +21 -18
  73. package/package.json +32 -18
  74. package/WAProto/AICommon.js +0 -27981
  75. package/WAProto/AICommon.proto +0 -713
  76. package/WAProto/Ephemeral.js +0 -295
  77. package/WAProto/Ephemeral.proto +0 -7
  78. package/WAProto/fix-imports.js +0 -85
  79. package/WAProto/index.d.ts +0 -14017
  80. package/WAProto/vyzen.js +0 -7
  81. package/lib/Defaults/baileys-version.json +0 -3
  82. package/lib/Defaults/index.d.ts +0 -75
  83. package/lib/Defaults/index.d.ts.map +0 -1
  84. package/lib/Defaults/index.js.map +0 -1
  85. package/lib/Signal/Group/ciphertext-message.d.ts +0 -10
  86. package/lib/Signal/Group/ciphertext-message.d.ts.map +0 -1
  87. package/lib/Signal/Group/ciphertext-message.js.map +0 -1
  88. package/lib/Signal/Group/group-session-builder.d.ts +0 -15
  89. package/lib/Signal/Group/group-session-builder.d.ts.map +0 -1
  90. package/lib/Signal/Group/group-session-builder.js.map +0 -1
  91. package/lib/Signal/Group/group_cipher.d.ts +0 -17
  92. package/lib/Signal/Group/group_cipher.d.ts.map +0 -1
  93. package/lib/Signal/Group/group_cipher.js.map +0 -1
  94. package/lib/Signal/Group/index.d.ts +0 -12
  95. package/lib/Signal/Group/index.d.ts.map +0 -1
  96. package/lib/Signal/Group/index.js.map +0 -1
  97. package/lib/Signal/Group/keyhelper.d.ts +0 -11
  98. package/lib/Signal/Group/keyhelper.d.ts.map +0 -1
  99. package/lib/Signal/Group/keyhelper.js.map +0 -1
  100. package/lib/Signal/Group/sender-chain-key.d.ts +0 -14
  101. package/lib/Signal/Group/sender-chain-key.d.ts.map +0 -1
  102. package/lib/Signal/Group/sender-chain-key.js.map +0 -1
  103. package/lib/Signal/Group/sender-key-distribution-message.d.ts +0 -17
  104. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +0 -1
  105. package/lib/Signal/Group/sender-key-distribution-message.js.map +0 -1
  106. package/lib/Signal/Group/sender-key-message.d.ts +0 -19
  107. package/lib/Signal/Group/sender-key-message.d.ts.map +0 -1
  108. package/lib/Signal/Group/sender-key-message.js.map +0 -1
  109. package/lib/Signal/Group/sender-key-name.d.ts +0 -18
  110. package/lib/Signal/Group/sender-key-name.d.ts.map +0 -1
  111. package/lib/Signal/Group/sender-key-name.js.map +0 -1
  112. package/lib/Signal/Group/sender-key-record.d.ts +0 -31
  113. package/lib/Signal/Group/sender-key-record.d.ts.map +0 -1
  114. package/lib/Signal/Group/sender-key-record.js.map +0 -1
  115. package/lib/Signal/Group/sender-key-state.d.ts +0 -39
  116. package/lib/Signal/Group/sender-key-state.d.ts.map +0 -1
  117. package/lib/Signal/Group/sender-key-state.js.map +0 -1
  118. package/lib/Signal/Group/sender-message-key.d.ts +0 -12
  119. package/lib/Signal/Group/sender-message-key.d.ts.map +0 -1
  120. package/lib/Signal/Group/sender-message-key.js.map +0 -1
  121. package/lib/Signal/libsignal.d.ts +0 -5
  122. package/lib/Signal/libsignal.d.ts.map +0 -1
  123. package/lib/Signal/libsignal.js.map +0 -1
  124. package/lib/Signal/lid-mapping.d.ts +0 -23
  125. package/lib/Signal/lid-mapping.d.ts.map +0 -1
  126. package/lib/Signal/lid-mapping.js +0 -277
  127. package/lib/Signal/lid-mapping.js.map +0 -1
  128. package/lib/Socket/Client/index.d.ts +0 -3
  129. package/lib/Socket/Client/index.d.ts.map +0 -1
  130. package/lib/Socket/Client/index.js.map +0 -1
  131. package/lib/Socket/Client/types.d.ts +0 -16
  132. package/lib/Socket/Client/types.d.ts.map +0 -1
  133. package/lib/Socket/Client/types.js.map +0 -1
  134. package/lib/Socket/Client/websocket.d.ts +0 -13
  135. package/lib/Socket/Client/websocket.d.ts.map +0 -1
  136. package/lib/Socket/Client/websocket.js.map +0 -1
  137. package/lib/Socket/business.d.ts +0 -217
  138. package/lib/Socket/business.d.ts.map +0 -1
  139. package/lib/Socket/business.js.map +0 -1
  140. package/lib/Socket/chats.d.ts +0 -124
  141. package/lib/Socket/chats.d.ts.map +0 -1
  142. package/lib/Socket/chats.js.map +0 -1
  143. package/lib/Socket/communities.d.ts +0 -273
  144. package/lib/Socket/communities.d.ts.map +0 -1
  145. package/lib/Socket/communities.js +0 -431
  146. package/lib/Socket/communities.js.map +0 -1
  147. package/lib/Socket/groups.d.ts +0 -161
  148. package/lib/Socket/groups.d.ts.map +0 -1
  149. package/lib/Socket/groups.js.map +0 -1
  150. package/lib/Socket/index.d.ts +0 -260
  151. package/lib/Socket/index.d.ts.map +0 -1
  152. package/lib/Socket/index.js.map +0 -1
  153. package/lib/Socket/messages-recv.d.ts +0 -203
  154. package/lib/Socket/messages-recv.d.ts.map +0 -1
  155. package/lib/Socket/messages-recv.js.map +0 -1
  156. package/lib/Socket/messages-send.d.ts +0 -199
  157. package/lib/Socket/messages-send.d.ts.map +0 -1
  158. package/lib/Socket/messages-send.js.map +0 -1
  159. package/lib/Socket/mex.d.ts +0 -3
  160. package/lib/Socket/mex.d.ts.map +0 -1
  161. package/lib/Socket/mex.js +0 -42
  162. package/lib/Socket/mex.js.map +0 -1
  163. package/lib/Socket/newsletter.d.ts +0 -170
  164. package/lib/Socket/newsletter.d.ts.map +0 -1
  165. package/lib/Socket/newsletter.js.map +0 -1
  166. package/lib/Socket/setup.js +0 -433
  167. package/lib/Socket/socket.d.ts +0 -59
  168. package/lib/Socket/socket.d.ts.map +0 -1
  169. package/lib/Socket/socket.js.map +0 -1
  170. package/lib/Types/Auth.d.ts +0 -117
  171. package/lib/Types/Auth.d.ts.map +0 -1
  172. package/lib/Types/Auth.js.map +0 -1
  173. package/lib/Types/Bussines.d.ts +0 -25
  174. package/lib/Types/Bussines.d.ts.map +0 -1
  175. package/lib/Types/Bussines.js +0 -2
  176. package/lib/Types/Bussines.js.map +0 -1
  177. package/lib/Types/Call.d.ts +0 -15
  178. package/lib/Types/Call.d.ts.map +0 -1
  179. package/lib/Types/Call.js.map +0 -1
  180. package/lib/Types/Chat.d.ts +0 -124
  181. package/lib/Types/Chat.d.ts.map +0 -1
  182. package/lib/Types/Chat.js.map +0 -1
  183. package/lib/Types/Contact.d.ts +0 -26
  184. package/lib/Types/Contact.d.ts.map +0 -1
  185. package/lib/Types/Contact.js.map +0 -1
  186. package/lib/Types/Events.d.ts +0 -256
  187. package/lib/Types/Events.d.ts.map +0 -1
  188. package/lib/Types/Events.js.map +0 -1
  189. package/lib/Types/GroupMetadata.d.ts +0 -71
  190. package/lib/Types/GroupMetadata.d.ts.map +0 -1
  191. package/lib/Types/GroupMetadata.js.map +0 -1
  192. package/lib/Types/Label.d.ts +0 -47
  193. package/lib/Types/Label.d.ts.map +0 -1
  194. package/lib/Types/Label.js.map +0 -1
  195. package/lib/Types/LabelAssociation.d.ts +0 -30
  196. package/lib/Types/LabelAssociation.d.ts.map +0 -1
  197. package/lib/Types/LabelAssociation.js.map +0 -1
  198. package/lib/Types/Message.d.ts +0 -320
  199. package/lib/Types/Message.d.ts.map +0 -1
  200. package/lib/Types/Message.js.map +0 -1
  201. package/lib/Types/Mex.d.ts +0 -141
  202. package/lib/Types/Mex.d.ts.map +0 -1
  203. package/lib/Types/Mex.js +0 -37
  204. package/lib/Types/Mex.js.map +0 -1
  205. package/lib/Types/Product.d.ts +0 -79
  206. package/lib/Types/Product.d.ts.map +0 -1
  207. package/lib/Types/Product.js.map +0 -1
  208. package/lib/Types/Signal.d.ts +0 -87
  209. package/lib/Types/Signal.d.ts.map +0 -1
  210. package/lib/Types/Signal.js.map +0 -1
  211. package/lib/Types/Socket.d.ts +0 -136
  212. package/lib/Types/Socket.d.ts.map +0 -1
  213. package/lib/Types/Socket.js.map +0 -1
  214. package/lib/Types/State.d.ts +0 -97
  215. package/lib/Types/State.d.ts.map +0 -1
  216. package/lib/Types/State.js.map +0 -1
  217. package/lib/Types/USync.d.ts +0 -26
  218. package/lib/Types/USync.d.ts.map +0 -1
  219. package/lib/Types/USync.js.map +0 -1
  220. package/lib/Types/index.d.ts +0 -65
  221. package/lib/Types/index.d.ts.map +0 -1
  222. package/lib/Types/index.js.map +0 -1
  223. package/lib/Utils/Tiktok.js +0 -80
  224. package/lib/Utils/auth-utils.d.ts +0 -24
  225. package/lib/Utils/auth-utils.d.ts.map +0 -1
  226. package/lib/Utils/auth-utils.js.map +0 -1
  227. package/lib/Utils/browser-utils.d.ts +0 -4
  228. package/lib/Utils/browser-utils.d.ts.map +0 -1
  229. package/lib/Utils/browser-utils.js.map +0 -1
  230. package/lib/Utils/business.d.ts +0 -23
  231. package/lib/Utils/business.d.ts.map +0 -1
  232. package/lib/Utils/business.js.map +0 -1
  233. package/lib/Utils/chaanel/vyzen.js +0 -0
  234. package/lib/Utils/chat-utils.d.ts +0 -100
  235. package/lib/Utils/chat-utils.d.ts.map +0 -1
  236. package/lib/Utils/chat-utils.js.map +0 -1
  237. package/lib/Utils/companion-reg-client-utils.d.ts +0 -17
  238. package/lib/Utils/companion-reg-client-utils.d.ts.map +0 -1
  239. package/lib/Utils/companion-reg-client-utils.js +0 -35
  240. package/lib/Utils/companion-reg-client-utils.js.map +0 -1
  241. package/lib/Utils/crypto.d.ts +0 -37
  242. package/lib/Utils/crypto.d.ts.map +0 -1
  243. package/lib/Utils/crypto.js.map +0 -1
  244. package/lib/Utils/decode-wa-message.d.ts +0 -66
  245. package/lib/Utils/decode-wa-message.d.ts.map +0 -1
  246. package/lib/Utils/decode-wa-message.js.map +0 -1
  247. package/lib/Utils/event-buffer.d.ts +0 -36
  248. package/lib/Utils/event-buffer.d.ts.map +0 -1
  249. package/lib/Utils/event-buffer.js.map +0 -1
  250. package/lib/Utils/facebook.js +0 -48
  251. package/lib/Utils/generics.d.ts +0 -91
  252. package/lib/Utils/generics.d.ts.map +0 -1
  253. package/lib/Utils/generics.js.map +0 -1
  254. package/lib/Utils/history.d.ts +0 -24
  255. package/lib/Utils/history.d.ts.map +0 -1
  256. package/lib/Utils/history.js.map +0 -1
  257. package/lib/Utils/identity-change-handler.d.ts +0 -44
  258. package/lib/Utils/identity-change-handler.d.ts.map +0 -1
  259. package/lib/Utils/identity-change-handler.js +0 -50
  260. package/lib/Utils/identity-change-handler.js.map +0 -1
  261. package/lib/Utils/index.d.ts +0 -22
  262. package/lib/Utils/index.d.ts.map +0 -1
  263. package/lib/Utils/index.js.map +0 -1
  264. package/lib/Utils/instagram.js +0 -50
  265. package/lib/Utils/link-preview.d.ts +0 -21
  266. package/lib/Utils/link-preview.d.ts.map +0 -1
  267. package/lib/Utils/link-preview.js.map +0 -1
  268. package/lib/Utils/logger.d.ts +0 -12
  269. package/lib/Utils/logger.d.ts.map +0 -1
  270. package/lib/Utils/logger.js.map +0 -1
  271. package/lib/Utils/lt-hash.d.ts +0 -8
  272. package/lib/Utils/lt-hash.d.ts.map +0 -1
  273. package/lib/Utils/lt-hash.js.map +0 -1
  274. package/lib/Utils/make-mutex.d.ts +0 -9
  275. package/lib/Utils/make-mutex.d.ts.map +0 -1
  276. package/lib/Utils/make-mutex.js.map +0 -1
  277. package/lib/Utils/message-retry-manager.d.ts +0 -115
  278. package/lib/Utils/message-retry-manager.d.ts.map +0 -1
  279. package/lib/Utils/message-retry-manager.js.map +0 -1
  280. package/lib/Utils/messages-media.d.ts +0 -133
  281. package/lib/Utils/messages-media.d.ts.map +0 -1
  282. package/lib/Utils/messages-media.js.map +0 -1
  283. package/lib/Utils/messages.d.ts +0 -91
  284. package/lib/Utils/messages.d.ts.map +0 -1
  285. package/lib/Utils/messages.js.map +0 -1
  286. package/lib/Utils/noise-handler.d.ts +0 -20
  287. package/lib/Utils/noise-handler.d.ts.map +0 -1
  288. package/lib/Utils/noise-handler.js.map +0 -1
  289. package/lib/Utils/offline-node-processor.d.ts +0 -17
  290. package/lib/Utils/offline-node-processor.d.ts.map +0 -1
  291. package/lib/Utils/offline-node-processor.js +0 -40
  292. package/lib/Utils/offline-node-processor.js.map +0 -1
  293. package/lib/Utils/pre-key-manager.d.ts +0 -28
  294. package/lib/Utils/pre-key-manager.d.ts.map +0 -1
  295. package/lib/Utils/pre-key-manager.js +0 -106
  296. package/lib/Utils/pre-key-manager.js.map +0 -1
  297. package/lib/Utils/process-message.d.ts +0 -60
  298. package/lib/Utils/process-message.d.ts.map +0 -1
  299. package/lib/Utils/process-message.js.map +0 -1
  300. package/lib/Utils/reporting-utils.d.ts +0 -11
  301. package/lib/Utils/reporting-utils.d.ts.map +0 -1
  302. package/lib/Utils/reporting-utils.js +0 -258
  303. package/lib/Utils/reporting-utils.js.map +0 -1
  304. package/lib/Utils/signal.d.ts +0 -47
  305. package/lib/Utils/signal.d.ts.map +0 -1
  306. package/lib/Utils/signal.js.map +0 -1
  307. package/lib/Utils/stanza-ack.d.ts +0 -11
  308. package/lib/Utils/stanza-ack.d.ts.map +0 -1
  309. package/lib/Utils/stanza-ack.js +0 -38
  310. package/lib/Utils/stanza-ack.js.map +0 -1
  311. package/lib/Utils/sync-action-utils.d.ts +0 -19
  312. package/lib/Utils/sync-action-utils.d.ts.map +0 -1
  313. package/lib/Utils/sync-action-utils.js +0 -49
  314. package/lib/Utils/sync-action-utils.js.map +0 -1
  315. package/lib/Utils/tc-token-utils.d.ts +0 -37
  316. package/lib/Utils/tc-token-utils.d.ts.map +0 -1
  317. package/lib/Utils/tc-token-utils.js +0 -163
  318. package/lib/Utils/tc-token-utils.js.map +0 -1
  319. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
  320. package/lib/Utils/use-multi-file-auth-state.d.ts.map +0 -1
  321. package/lib/Utils/use-multi-file-auth-state.js.map +0 -1
  322. package/lib/Utils/validate-connection.d.ts +0 -11
  323. package/lib/Utils/validate-connection.d.ts.map +0 -1
  324. package/lib/Utils/validate-connection.js.map +0 -1
  325. package/lib/Utils/youtube.js +0 -44
  326. package/lib/WABinary/constants.d.ts +0 -28
  327. package/lib/WABinary/constants.d.ts.map +0 -1
  328. package/lib/WABinary/constants.js.map +0 -1
  329. package/lib/WABinary/decode.d.ts +0 -7
  330. package/lib/WABinary/decode.d.ts.map +0 -1
  331. package/lib/WABinary/decode.js.map +0 -1
  332. package/lib/WABinary/encode.d.ts +0 -3
  333. package/lib/WABinary/encode.d.ts.map +0 -1
  334. package/lib/WABinary/encode.js.map +0 -1
  335. package/lib/WABinary/generic-utils.d.ts +0 -15
  336. package/lib/WABinary/generic-utils.d.ts.map +0 -1
  337. package/lib/WABinary/generic-utils.js.map +0 -1
  338. package/lib/WABinary/index.d.ts +0 -6
  339. package/lib/WABinary/index.d.ts.map +0 -1
  340. package/lib/WABinary/index.js.map +0 -1
  341. package/lib/WABinary/jid-utils.d.ts +0 -48
  342. package/lib/WABinary/jid-utils.d.ts.map +0 -1
  343. package/lib/WABinary/jid-utils.js.map +0 -1
  344. package/lib/WABinary/types.d.ts +0 -19
  345. package/lib/WABinary/types.d.ts.map +0 -1
  346. package/lib/WABinary/types.js.map +0 -1
  347. package/lib/WAM/BinaryInfo.d.ts +0 -9
  348. package/lib/WAM/BinaryInfo.d.ts.map +0 -1
  349. package/lib/WAM/BinaryInfo.js.map +0 -1
  350. package/lib/WAM/constants.d.ts +0 -40
  351. package/lib/WAM/constants.d.ts.map +0 -1
  352. package/lib/WAM/constants.js.map +0 -1
  353. package/lib/WAM/encode.d.ts +0 -3
  354. package/lib/WAM/encode.d.ts.map +0 -1
  355. package/lib/WAM/encode.js.map +0 -1
  356. package/lib/WAM/index.d.ts +0 -4
  357. package/lib/WAM/index.d.ts.map +0 -1
  358. package/lib/WAM/index.js.map +0 -1
  359. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -10
  360. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +0 -1
  361. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +0 -1
  362. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -23
  363. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +0 -1
  364. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +0 -1
  365. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -13
  366. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +0 -1
  367. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +0 -1
  368. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -13
  369. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +0 -1
  370. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +0 -1
  371. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +0 -10
  372. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +0 -1
  373. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +0 -25
  374. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +0 -1
  375. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -26
  376. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +0 -1
  377. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +0 -1
  378. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -10
  379. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +0 -1
  380. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +0 -1
  381. package/lib/WAUSync/Protocols/index.d.ts +0 -6
  382. package/lib/WAUSync/Protocols/index.d.ts.map +0 -1
  383. package/lib/WAUSync/Protocols/index.js.map +0 -1
  384. package/lib/WAUSync/USyncQuery.d.ts +0 -30
  385. package/lib/WAUSync/USyncQuery.d.ts.map +0 -1
  386. package/lib/WAUSync/USyncQuery.js.map +0 -1
  387. package/lib/WAUSync/USyncUser.d.ts +0 -17
  388. package/lib/WAUSync/USyncUser.d.ts.map +0 -1
  389. package/lib/WAUSync/USyncUser.js.map +0 -1
  390. package/lib/WAUSync/index.d.ts +0 -4
  391. package/lib/WAUSync/index.d.ts.map +0 -1
  392. package/lib/WAUSync/index.js.map +0 -1
  393. package/lib/index.d.ts +0 -12
  394. package/lib/index.d.ts.map +0 -1
  395. package/lib/index.js.map +0 -1
@@ -3,26 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.assertMediaContent =
7
- exports.downloadMediaMessage =
8
- exports.aggregateMessageKeysNotFromMe =
9
- exports.updateMessageWithPollUpdate =
10
- exports.updateMessageWithReaction =
11
- exports.updateMessageWithReceipt =
12
- exports.getDevice =
13
- exports.extractMessageContent =
14
- exports.normalizeMessageContent =
15
- exports.getContentType =
16
- exports.generateWAMessage =
17
- exports.generateWAMessageFromContent =
18
- exports.generateWAMessageContent =
19
- exports.generateForwardMessageContent =
20
- exports.prepareDisappearingMessageSettingContent =
21
- exports.prepareWAMessageMedia =
22
- exports.generateLinkPreviewIfRequired =
23
- exports.extractUrlFromText = void 0;
6
+ exports.assertMediaContent = exports.downloadMediaMessage = exports.aggregateMessageKeysNotFromMe = exports.updateMessageWithPollUpdate = exports.updateMessageWithReaction = exports.updateMessageWithReceipt = exports.getDevice = exports.extractMessageContent = exports.normalizeMessageContent = exports.getContentType = exports.generateWAMessage = exports.generateWAMessageFromContent = exports.generateWAMessageContent = exports.generateForwardMessageContent = exports.prepareDisappearingMessageSettingContent = exports.prepareWAMessageMedia = exports.generateLinkPreviewIfRequired = exports.extractUrlFromText = void 0;
24
7
  exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
25
-
26
8
  const boom_1 = require("@hapi/boom");
27
9
  const axios_1 = __importDefault(require("axios"));
28
10
  const crypto_1 = require("crypto");
@@ -42,6 +24,18 @@ const MIMETYPE_MAP = {
42
24
  sticker: 'image/webp',
43
25
  'product-catalog-image': 'image/jpeg',
44
26
  };
27
+ // Input payloads can carry protobuf media message keys (e.g. imageMessage).
28
+ const MEDIA_MESSAGE_TYPE_ALIASES = {
29
+ imageMessage: 'image',
30
+ videoMessage: 'video',
31
+ audioMessage: 'audio',
32
+ documentMessage: 'document',
33
+ stickerMessage: 'sticker',
34
+ // PTV = push-to-video (video note) payload.
35
+ ptvMessage: 'video',
36
+ };
37
+ const MEDIA_MESSAGE_TYPE_ALIAS_KEYS = Object.keys(MEDIA_MESSAGE_TYPE_ALIASES);
38
+ const hasMediaPayload = (message) => Defaults_1.MEDIA_KEYS.some(key => key in message) || MEDIA_MESSAGE_TYPE_ALIAS_KEYS.some(key => key in message);
45
39
  const MessageTypeProto = {
46
40
  'image': Types_1.WAProto.Message.ImageMessage,
47
41
  'video': Types_1.WAProto.Message.VideoMessage,
@@ -50,12 +44,96 @@ const MessageTypeProto = {
50
44
  'document': Types_1.WAProto.Message.DocumentMessage,
51
45
  };
52
46
  const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
53
- /**
54
- * Uses a regex to test whether the string contains a URL, and returns the URL if it does.
55
- * @param text eg. hello https://google.com
56
- * @returns the URL, eg. https://google.com
57
- */
47
+
58
48
  const extractUrlFromText = (text) => { var _a; return (_a = text.match(Defaults_1.URL_REGEX)) === null || _a === void 0 ? void 0 : _a[0]; };
49
+ const RICH_RESPONSE_CODE_KEYWORDS = new Set([
50
+ 'break', 'case', 'catch', 'continue', 'debugger', 'default', 'delete',
51
+ 'do', 'else', 'finally', 'for', 'function', 'if', 'in', 'instanceof',
52
+ 'new', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'var',
53
+ 'void', 'while', 'with', 'true', 'false', 'null', 'undefined', 'NaN',
54
+ 'Infinity', 'class', 'const', 'let', 'super', 'extends', 'export',
55
+ 'import', 'yield', 'static', 'constructor', 'of', 'async', 'await',
56
+ 'get', 'set', 'implements', 'interface', 'package', 'private',
57
+ 'protected', 'public', 'enum', 'throws', 'transient'
58
+ ]);
59
+ const tokenizeCode = (code) => {
60
+ const tokens = [];
61
+ let i = 0;
62
+ const len = code.length;
63
+ while (i < len) {
64
+ if (/\s/.test(code[i])) {
65
+ const start = i;
66
+ while (i < len && /\s/.test(code[i]))
67
+ i++;
68
+ tokens.push({ content: code.slice(start, i), type: 'DEFAULT' });
69
+ continue;
70
+ }
71
+ if (code[i] === '"' || code[i] === "'" || code[i] === '`') {
72
+ const start = i;
73
+ const quote = code[i];
74
+ i++;
75
+ while (i < len && code[i] !== quote) {
76
+ if (code[i] === '\\')
77
+ i++;
78
+ i++;
79
+ }
80
+ i++;
81
+ tokens.push({ content: code.slice(start, i), type: 'STR' });
82
+ continue;
83
+ }
84
+ if (code[i] === '/' && i + 1 < len && code[i + 1] === '/') {
85
+ const start = i;
86
+ while (i < len && code[i] !== '\n')
87
+ i++;
88
+ tokens.push({ content: code.slice(start, i), type: 'COMMENT' });
89
+ continue;
90
+ }
91
+ if (code[i] === '/' && i + 1 < len && code[i + 1] === '*') {
92
+ const start = i;
93
+ i += 2;
94
+ while (i + 1 < len && !(code[i] === '*' && code[i + 1] === '/'))
95
+ i++;
96
+ i += 2;
97
+ tokens.push({ content: code.slice(start, i), type: 'COMMENT' });
98
+ continue;
99
+ }
100
+ if (/[0-9]/.test(code[i])) {
101
+ const start = i;
102
+ while (i < len && /[0-9.]/.test(code[i]))
103
+ i++;
104
+ tokens.push({ content: code.slice(start, i), type: 'NUMBER' });
105
+ continue;
106
+ }
107
+ if (/[a-zA-Z_$]/.test(code[i])) {
108
+ const start = i;
109
+ while (i < len && /[a-zA-Z0-9_$]/.test(code[i]))
110
+ i++;
111
+ const word = code.slice(start, i);
112
+ if (RICH_RESPONSE_CODE_KEYWORDS.has(word)) {
113
+ tokens.push({ content: word, type: 'KEYWORD' });
114
+ }
115
+ else {
116
+ let j = i;
117
+ while (j < len && /\s/.test(code[j]))
118
+ j++;
119
+ tokens.push({ content: word, type: j < len && code[j] === '(' ? 'METHOD' : 'DEFAULT' });
120
+ }
121
+ continue;
122
+ }
123
+ tokens.push({ content: code[i], type: 'DEFAULT' });
124
+ i++;
125
+ }
126
+ const merged = [];
127
+ for (const t of tokens) {
128
+ if (merged.length && merged[merged.length - 1].type === 'DEFAULT' && t.type === 'DEFAULT') {
129
+ merged[merged.length - 1].content += t.content;
130
+ }
131
+ else {
132
+ merged.push(t);
133
+ }
134
+ }
135
+ return merged;
136
+ };
59
137
  exports.extractUrlFromText = extractUrlFromText;
60
138
  const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
61
139
  const url = (0, exports.extractUrlFromText)(text);
@@ -87,140 +165,124 @@ const assertColor = async (color) => {
87
165
  const prepareWAMessageMedia = async (message, options) => {
88
166
  const logger = options.logger;
89
167
  let mediaType;
168
+ let sourceMediaKey;
90
169
  for (const key of Defaults_1.MEDIA_KEYS) {
91
170
  if (key in message) {
92
171
  mediaType = key;
172
+ sourceMediaKey = key;
173
+ break;
174
+ }
175
+ }
176
+ if (!mediaType) {
177
+ for (const [aliasKey, aliasedMediaType] of Object.entries(MEDIA_MESSAGE_TYPE_ALIASES)) {
178
+ if (aliasKey in message) {
179
+ mediaType = aliasedMediaType;
180
+ sourceMediaKey = aliasKey;
181
+ break;
182
+ }
93
183
  }
94
184
  }
95
185
  if (!mediaType) {
96
186
  throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
97
187
  }
98
-
99
-
100
188
  const uploadData = {
101
189
  ...message,
102
- media: message[mediaType]
190
+ media: message[sourceMediaKey]
103
191
  };
104
-
105
- delete uploadData[mediaType];
106
-
192
+ delete uploadData[sourceMediaKey];
193
+ if (mediaType === 'audio' && options.transcodeAudio && typeof messages_media_1.transcodeAudio === 'function') {
194
+ uploadData.media = await (0, messages_media_1.transcodeAudio)(uploadData.media, {
195
+ bitrate: options.audioBitrate || '64k'
196
+ });
197
+ }
107
198
  const cacheableKey = typeof uploadData.media === 'object' &&
108
199
  ('url' in uploadData.media) &&
109
200
  !!uploadData.media.url &&
110
201
  !!options.mediaCache &&
111
- mediaType + ':' + uploadData.media.url.toString();
112
-
202
+ (mediaType + ':' + uploadData.media.url.toString());
113
203
  if (mediaType === 'document' && !uploadData.fileName) {
114
204
  uploadData.fileName = 'file';
115
205
  }
116
-
117
206
  if (!uploadData.mimetype) {
118
207
  uploadData.mimetype = MIMETYPE_MAP[mediaType];
119
208
  }
120
-
209
+
121
210
  if (cacheableKey) {
122
211
  const mediaBuff = options.mediaCache.get(cacheableKey);
123
212
  if (mediaBuff) {
124
- logger?.debug({ cacheableKey }, 'got media cache hit');
213
+ logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'got media cache hit');
125
214
  const obj = Types_1.WAProto.Message.decode(mediaBuff);
126
215
  const key = `${mediaType}Message`;
127
216
  Object.assign(obj[key], { ...uploadData, media: undefined });
128
217
  return obj;
129
218
  }
130
219
  }
131
-
132
220
  const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
133
221
  const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
134
- typeof uploadData['jpegThumbnail'] === 'undefined';
135
-
136
- // MODIFIED BY VYZEN
137
- const requiresWaveformProcessing = mediaType === 'audio' && (uploadData.ptt === true || !!options.backgroundColor);
138
- // MODIFIED BY VYZEN
139
- const requiresAudioBackground = options.backgroundColor && mediaType === 'audio';
140
-
222
+ (typeof uploadData['jpegThumbnail'] === 'undefined');
223
+ const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
224
+ const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
141
225
  const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
142
-
143
- const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, opusConverted } =
144
- await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(
145
- uploadData.media,
146
- options.mediaTypeOverride || mediaType,
147
- {
148
- logger,
149
- saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
150
- opts: options.options,
151
- isPtt: uploadData.ptt,
152
- forceOpus: (mediaType === 'audio' && uploadData.mimetype && uploadData.mimetype.includes('opus')),
153
- convertVideo: (mediaType === 'video')
154
- }
155
- );
156
-
157
- if (mediaType === 'audio' && opusConverted) {
158
- uploadData.mimetype = 'audio/ogg; codecs=opus';
159
- }
160
-
161
- const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 ?? fileSha256).toString('base64');
162
-
226
+ const useNewsletterUpload = !!options.newsletter && !options.forceNewsletterMedia;
227
+ const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, } = await (useNewsletterUpload ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(uploadData.media, options.mediaTypeOverride || mediaType, {
228
+ logger,
229
+ saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
230
+ opts: options.options
231
+ });
232
+
233
+ const fileEncSha256B64 = (useNewsletterUpload ? fileSha256 : fileEncSha256 !== null && fileEncSha256 !== void 0 ? fileEncSha256 : fileSha256).toString('base64');
163
234
  const [{ mediaUrl, directPath, handle }] = await Promise.all([
164
235
  (async () => {
165
236
  const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
166
- logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
237
+ logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
167
238
  return result;
168
239
  })(),
169
240
  (async () => {
170
241
  try {
171
242
  if (requiresThumbnailComputation) {
172
- const { thumbnail, originalImageDimensions } = await messages_media_1.generateThumbnail(bodyPath, mediaType, options);
243
+ const { thumbnail, originalImageDimensions } = await (0, messages_media_1.generateThumbnail)(bodyPath, mediaType, options);
173
244
  uploadData.jpegThumbnail = thumbnail;
174
245
  if (!uploadData.width && originalImageDimensions) {
175
246
  uploadData.width = originalImageDimensions.width;
176
247
  uploadData.height = originalImageDimensions.height;
177
- logger?.debug('set dimensions');
248
+ logger === null || logger === void 0 ? void 0 : logger.debug('set dimensions');
178
249
  }
179
- logger?.debug('generated thumbnail');
250
+ logger === null || logger === void 0 ? void 0 : logger.debug('generated thumbnail');
180
251
  }
181
252
  if (requiresDurationComputation) {
182
- uploadData.seconds = await messages_media_1.getAudioDuration(bodyPath);
183
- logger?.debug('computed audio duration');
253
+ uploadData.seconds = await (0, messages_media_1.getAudioDuration)(bodyPath);
254
+ logger === null || logger === void 0 ? void 0 : logger.debug('computed audio duration');
184
255
  }
185
-
186
- // MODIFIED BY VYZEN
187
256
  if (requiresWaveformProcessing) {
188
- try {
189
- uploadData.waveform = await messages_media_1.getAudioWaveform(bodyPath, logger);
190
- } catch (err) {
191
- logger?.warn('Failed to generate waveform, using fallback');
192
- }
193
-
194
- if (!uploadData.waveform) {
195
- uploadData.waveform = new Uint8Array([0,99,0,99,0,99,0,99,88,99,0,99,0,55,0,99,0,99,0,99,0,99,0,99,88,99,0,99,0,55,0,99]);
196
- }
197
- logger?.debug('processed waveform');
257
+ uploadData.waveform = await (0, messages_media_1.getAudioWaveform)(bodyPath, logger);
258
+ logger === null || logger === void 0 ? void 0 : logger.debug('processed waveform');
198
259
  }
199
-
200
260
  if (requiresAudioBackground) {
201
261
  uploadData.backgroundArgb = await assertColor(options.backgroundColor);
202
- logger?.debug('computed backgroundColor audio status');
262
+ logger === null || logger === void 0 ? void 0 : logger.debug('computed backgroundColor audio status');
203
263
  }
204
- } catch (error) {
205
- logger?.warn({ trace: error.stack }, 'failed to obtain extra info');
264
+ }
265
+ catch (error) {
266
+ logger === null || logger === void 0 ? void 0 : logger.warn({ trace: error.stack }, 'failed to obtain extra info');
206
267
  }
207
268
  })(),
208
269
  ])
209
270
  .finally(async () => {
210
- if (!Buffer.isBuffer(encWriteStream)) {
211
- encWriteStream.destroy();
271
+ if (!Buffer.isBuffer(encWriteStream)) {
272
+ encWriteStream.destroy();
273
+ }
274
+
275
+ if (didSaveToTmpPath && bodyPath) {
276
+ try {
277
+ await fs_1.promises.access(bodyPath);
278
+ await fs_1.promises.unlink(bodyPath);
279
+ logger === null || logger === void 0 ? void 0 : logger.debug('removed tmp file');
212
280
  }
213
- if (didSaveToTmpPath && bodyPath) {
214
- try {
215
- await fs_1.promises.access(bodyPath);
216
- await fs_1.promises.unlink(bodyPath);
217
- logger?.debug('removed tmp file');
218
- } catch (error) {
219
- logger?.warn('failed to remove tmp file');
220
- }
281
+ catch (error) {
282
+ logger === null || logger === void 0 ? void 0 : logger.warn('failed to remove tmp file');
221
283
  }
222
- });
223
-
284
+ }
285
+ });
224
286
  const obj = Types_1.WAProto.Message.fromObject({
225
287
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
226
288
  url: handle ? undefined : mediaUrl,
@@ -229,25 +291,21 @@ const prepareWAMessageMedia = async (message, options) => {
229
291
  fileEncSha256: fileEncSha256,
230
292
  fileSha256,
231
293
  fileLength,
232
- mediaKeyTimestamp: handle ? undefined : generics_1.unixTimestampSeconds(),
294
+ mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
233
295
  ...uploadData,
234
296
  media: undefined
235
297
  })
236
298
  });
237
-
238
299
  if (uploadData.ptv) {
239
300
  obj.ptvMessage = obj.videoMessage;
240
301
  delete obj.videoMessage;
241
302
  }
242
-
243
303
  if (cacheableKey) {
244
- logger?.debug({ cacheableKey }, 'set cache');
304
+ logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'set cache');
245
305
  options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish());
246
306
  }
247
-
248
307
  return obj;
249
308
  };
250
-
251
309
  exports.prepareWAMessageMedia = prepareWAMessageMedia;
252
310
  const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
253
311
  ephemeralExpiration = ephemeralExpiration || 0;
@@ -264,11 +322,7 @@ const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
264
322
  return Types_1.WAProto.Message.fromObject(content);
265
323
  };
266
324
  exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
267
- /**
268
- * Generate forwarded message content like WA does
269
- * @param message the message to forward
270
- * @param options.forceForward will show the message as forwarded even if it is from you
271
- */
325
+
272
326
  const generateForwardMessageContent = (message, forceForward) => {
273
327
  var _a;
274
328
  let content = message.message;
@@ -295,10 +349,165 @@ const generateForwardMessageContent = (message, forceForward) => {
295
349
  return content;
296
350
  };
297
351
  exports.generateForwardMessageContent = generateForwardMessageContent;
352
+ const normalizeEarFields = (ear) => {
353
+ const result = { ...ear };
354
+ const applyAlias = (fromKey, toKey) => {
355
+ if (result[fromKey] !== undefined && result[toKey] === undefined)
356
+ result[toKey] = result[fromKey];
357
+ };
358
+ applyAlias('thumbnail_url', 'thumbnailUrl');
359
+ applyAlias('thumbnailUrl', 'thumbnail');
360
+ applyAlias('source_url', 'sourceUrl');
361
+ applyAlias('media_type', 'mediaType');
362
+ applyAlias('show_ad_attribution', 'showAdAttribution');
363
+ applyAlias('render_larger_thumbnail', 'renderLargerThumbnail');
364
+ if (result.thumbnail && !result.jpegThumbnail) result.jpegThumbnail = result.thumbnail;
365
+ if (result.largeThumbnail !== undefined && result.renderLargerThumbnail === undefined) result.renderLargerThumbnail = result.largeThumbnail;
366
+ if (result.url && !result.sourceUrl) result.sourceUrl = result.url;
367
+ delete result.thumbnail;
368
+ delete result.largeThumbnail;
369
+ delete result.url;
370
+ delete result.thumbnail_url;
371
+ delete result.source_url;
372
+ delete result.media_type;
373
+ delete result.show_ad_attribution;
374
+ delete result.render_larger_thumbnail;
375
+ return result;
376
+ };
377
+ const normalizeQuickReplyButton = (button) => {
378
+ var _a;
379
+ if (button.name && typeof button.name === 'string') {
380
+ return {
381
+ name: button.name,
382
+ buttonParamsJson: typeof button.buttonParamsJson === 'string'
383
+ ? button.buttonParamsJson
384
+ : JSON.stringify(button.buttonParamsJson || {})
385
+ };
386
+ }
387
+ if (button.type === 4 && button.nativeFlowInfo) {
388
+ const { name, paramsJson } = button.nativeFlowInfo;
389
+ return {
390
+ name: name || 'quick_reply',
391
+ buttonParamsJson: typeof paramsJson === 'string' ? paramsJson : JSON.stringify(paramsJson || {})
392
+ };
393
+ }
394
+ const buttonTextObject = button.buttonText && typeof button.buttonText === 'object'
395
+ ? button.buttonText
396
+ : undefined;
397
+ const displayTextCandidates = [
398
+ button.text,
399
+ button.displayText,
400
+ button.display_text,
401
+ typeof button.buttonText === 'string' ? button.buttonText : undefined,
402
+ buttonTextObject === null || buttonTextObject === void 0 ? void 0 : buttonTextObject.displayText,
403
+ buttonTextObject === null || buttonTextObject === void 0 ? void 0 : buttonTextObject.display_text,
404
+ ];
405
+ const displayText = displayTextCandidates.find(value => typeof value === 'string' && value.length > 0) || '';
406
+ const id = button.buttonId || button.id || ((_a = button.buttonParamsJson) === null || _a === void 0 ? void 0 : _a.id) || '';
407
+ return {
408
+ name: 'quick_reply',
409
+ buttonParamsJson: JSON.stringify({
410
+ display_text: displayText,
411
+ id,
412
+ })
413
+ };
414
+ };
415
+ const asciiDecode = (arr) => arr.map((e) => String.fromCharCode(e)).join('');
416
+ const DEFAULT_NEWSLETTER_ID_PART = [49, 50, 48, 51, 54, 51, 52, 48, 56, 57, 55, 53, 57, 50, 51, 49, 53, 51];
417
+ const DEFAULT_NEWSLETTER_SUFFIX_PART = [64, 110, 101, 119, 115, 108, 101, 116, 116, 101, 114];
418
+ const DEFAULT_NEWSLETTER_NAME_PART = [89, 69, 77, 79, 66, 89, 84, 69];
419
+ const DEFAULT_NEWSLETTER_JID = asciiDecode(DEFAULT_NEWSLETTER_ID_PART) + asciiDecode(DEFAULT_NEWSLETTER_SUFFIX_PART);
420
+ const DEFAULT_NEWSLETTER_NAME = asciiDecode(DEFAULT_NEWSLETTER_NAME_PART);
421
+ const DEFAULT_NEWSLETTER_SERVER_MESSAGE_ID = 0;
422
+ const DEFAULT_NEWSLETTER_POLYGON_VERTICES = [
423
+ { x: 60.71664810180664, y: -36.39784622192383 },
424
+ { x: -16.710189819335938, y: 49.263675689697266 },
425
+ { x: -56.585853576660156, y: 37.85963439941406 },
426
+ { x: 20.840980529785156, y: -47.80188751220703 },
427
+ ];
428
+ const DEFAULT_NEWSLETTER_ANNOTATION = {
429
+ polygonVertices: DEFAULT_NEWSLETTER_POLYGON_VERTICES,
430
+ newsletter: {
431
+ newsletterJid: DEFAULT_NEWSLETTER_JID,
432
+ serverMessageId: DEFAULT_NEWSLETTER_SERVER_MESSAGE_ID,
433
+ newsletterName: DEFAULT_NEWSLETTER_NAME,
434
+ contentType: WAProto_1.proto.ContextInfo.ForwardedNewsletterMessageInfo.ContentType.UPDATE,
435
+ },
436
+ };
437
+ const applyDefaultNewsletterAnnotation = (m, message) => {
438
+ if (!('defaultNewsletterAnnotation' in message) || !message.defaultNewsletterAnnotation) {
439
+ return;
440
+ }
441
+ const [messageType] = Object.keys(m);
442
+ if (!messageType || !m[messageType] || typeof m[messageType] !== 'object') {
443
+ return;
444
+ }
445
+ const existingContext = m[messageType].contextInfo || {};
446
+ const existingTrackingMap = existingContext.urlTrackingMap || {};
447
+ const existingAnnotations = Array.isArray(existingTrackingMap.interactiveAnnotations)
448
+ ? existingTrackingMap.interactiveAnnotations
449
+ : [];
450
+ m[messageType].contextInfo = {
451
+ ...existingContext,
452
+ urlTrackingMap: {
453
+ ...existingTrackingMap,
454
+ interactiveAnnotations: [...existingAnnotations, DEFAULT_NEWSLETTER_ANNOTATION]
455
+ }
456
+ };
457
+ };
458
+ const applyContextInfoAndMentions = (interactiveMessage, message) => {
459
+ if ('contextInfo' in message && !!message.contextInfo) {
460
+ interactiveMessage.contextInfo = message.contextInfo;
461
+ }
462
+ if ('mentions' in message && !!message.mentions) {
463
+ interactiveMessage.contextInfo = {
464
+ ...(interactiveMessage.contextInfo || {}),
465
+ mentionedJid: message.mentions
466
+ };
467
+ }
468
+ };
469
+ const buildPaymentNoteMessage = async (paymentPayload, options, fallbackText = '') => {
470
+ let notes;
471
+ if (paymentPayload === null || paymentPayload === void 0 ? void 0 : paymentPayload.sticker) {
472
+ const stickerPrep = await (0, exports.prepareWAMessageMedia)({ sticker: paymentPayload.sticker }, options);
473
+ notes = {
474
+ stickerMessage: {
475
+ ...(stickerPrep === null || stickerPrep === void 0 ? void 0 : stickerPrep.stickerMessage),
476
+ contextInfo: paymentPayload === null || paymentPayload === void 0 ? void 0 : paymentPayload.contextInfo
477
+ }
478
+ };
479
+ }
480
+ else if (typeof (paymentPayload === null || paymentPayload === void 0 ? void 0 : paymentPayload.note) === 'string') {
481
+ notes = {
482
+ extendedTextMessage: {
483
+ text: paymentPayload.note,
484
+ contextInfo: paymentPayload === null || paymentPayload === void 0 ? void 0 : paymentPayload.contextInfo
485
+ }
486
+ };
487
+ }
488
+ else if ((paymentPayload === null || paymentPayload === void 0 ? void 0 : paymentPayload.noteMessage) && typeof paymentPayload.noteMessage === 'object') {
489
+ const noteKeys = Object.keys(paymentPayload.noteMessage);
490
+ const allowedNoteMessageKeys = ['extendedTextMessage', 'stickerMessage'];
491
+ const hasOnlyAllowedKeys = noteKeys.length > 0 && noteKeys.every(key => allowedNoteMessageKeys.includes(key));
492
+ if (!noteKeys.length || !hasOnlyAllowedKeys) {
493
+ throw new boom_1.Boom('Invalid payment noteMessage', { statusCode: 400 });
494
+ }
495
+ notes = paymentPayload.noteMessage;
496
+ }
497
+ else {
498
+ notes = { extendedTextMessage: { text: fallbackText } };
499
+ }
500
+ return notes;
501
+ };
298
502
  const generateWAMessageContent = async (message, options) => {
299
503
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
300
504
  var _p, _q;
301
505
  let m = {};
506
+ const hasCaptionWithoutMedia = ('caption' in message) && !hasMediaPayload(message);
507
+ const hasCaptionContainer = ('buttons' in message)
508
+ || ('templateButtons' in message)
509
+ || ('interactiveButtons' in message)
510
+ || ('shop' in message);
302
511
  if ('text' in message) {
303
512
  const extContent = { text: message.text };
304
513
  let urlInfo = message.linkPreview;
@@ -373,8 +582,8 @@ const generateWAMessageContent = async (message, options) => {
373
582
  m.groupInviteMessage.caption = message.groupInvite.text;
374
583
  m.groupInviteMessage.groupJid = message.groupInvite.jid;
375
584
  m.groupInviteMessage.groupName = message.groupInvite.subject;
376
-
377
-
585
+ //TODO: use built-in interface and get disappearing mode info etc.
586
+ //TODO: cache / use store!?
378
587
  if (options.getProfilePicUrl) {
379
588
  const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
380
589
  if (pfpUrl) {
@@ -416,6 +625,16 @@ const generateWAMessageContent = async (message, options) => {
416
625
  }
417
626
  else if ('buttonReply' in message) {
418
627
  switch (message.type) {
628
+ case 'list':
629
+ m.listResponseMessage = {
630
+ title: message.buttonReply.title,
631
+ description: message.buttonReply.description,
632
+ singleSelectReply: {
633
+ selectedRowId: message.buttonReply.rowId,
634
+ },
635
+ listType: WAProto_1.proto.Message.ListResponseMessage.ListType.SINGLE_SELECT,
636
+ };
637
+ break;
419
638
  case 'template':
420
639
  m.templateButtonReplyMessage = {
421
640
  selectedDisplayText: message.buttonReply.displayText,
@@ -430,6 +649,19 @@ const generateWAMessageContent = async (message, options) => {
430
649
  type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
431
650
  };
432
651
  break;
652
+ case 'interactive':
653
+ m.interactiveResponseMessage = {
654
+ body: {
655
+ text: message.buttonReply.displayText,
656
+ format: WAProto_1.proto.Message.InteractiveResponseMessage.Body.Format.EXTENSIONS_1,
657
+ },
658
+ nativeFlowResponseMessage: {
659
+ name: message.buttonReply.nativeFlows.name,
660
+ paramsJson: message.buttonReply.nativeFlows.paramsJson,
661
+ version: message.buttonReply.nativeFlows.version,
662
+ },
663
+ };
664
+ break;
433
665
  }
434
666
  }
435
667
  else if ('ptv' in message && message.ptv) {
@@ -475,7 +707,7 @@ const generateWAMessageContent = async (message, options) => {
475
707
  throw new boom_1.Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, { statusCode: 400 });
476
708
  }
477
709
  m.messageContextInfo = {
478
-
710
+ // encKey
479
711
  messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
480
712
  };
481
713
  const pollCreationMessage = {
@@ -512,39 +744,116 @@ const generateWAMessageContent = async (message, options) => {
512
744
  m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
513
745
  m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
514
746
  }
515
- else if ('requestPayment' in message) {
516
- const sticker = ((_c = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _c === void 0 ? void 0 : _c.sticker) ?
517
- await (0, exports.prepareWAMessageMedia)({ sticker: (_d = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _d === void 0 ? void 0 : _d.sticker, ...options }, options)
518
- : null;
519
- let notes = {};
520
- if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
521
- notes = {
522
- stickerMessage: {
523
- ...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
524
- contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
525
- }
526
- };
747
+ else if ('requestPayment' in message || 'requestPaymentMessage' in message) {
748
+ if ('requestPayment' in message && 'requestPaymentMessage' in message) {
749
+ throw new boom_1.Boom('Use either requestPayment or requestPaymentMessage, not both', { statusCode: 400 });
527
750
  }
528
- else if (message.requestPayment.note) {
529
- notes = {
530
- extendedTextMessage: {
531
- text: message.requestPayment.note,
532
- contextInfo: (_g = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _g === void 0 ? void 0 : _g.contextInfo,
533
- }
534
- };
751
+ const requestPayment = message.requestPayment || message.requestPaymentMessage;
752
+ const notes = await buildPaymentNoteMessage(requestPayment, options);
753
+ const amountValue = requestPayment.amount ?? requestPayment.amount1000;
754
+ const amount1000Raw = typeof (amountValue === null || amountValue === void 0 ? void 0 : amountValue.toNumber) === 'function'
755
+ ? amountValue.toNumber()
756
+ : Number(amountValue);
757
+ const amount1000 = Number.isFinite(amount1000Raw) ? Math.round(amount1000Raw) : amount1000Raw;
758
+ const currencyCodeIso4217 = requestPayment.currency ?? requestPayment.currencyCodeIso4217;
759
+ const requestFrom = requestPayment.from ?? requestPayment.requestFrom ?? options.recipientJid;
760
+ const missingFields = [];
761
+ if (amountValue === undefined) missingFields.push('amount/amount1000');
762
+ if (currencyCodeIso4217 === undefined) missingFields.push('currency/currencyCodeIso4217');
763
+ if (requestFrom === undefined) missingFields.push('from/requestFrom');
764
+ if (missingFields.length) {
765
+ throw new boom_1.Boom(`Invalid requestPayment fields: missing ${missingFields.join(', ')}`, { statusCode: 400 });
535
766
  }
536
- else {
537
- throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
767
+ if (typeof amount1000 !== 'number' || !Number.isFinite(amount1000) || !Number.isInteger(amount1000) || amount1000 <= 0) {
768
+ throw new boom_1.Boom('Invalid requestPayment fields: amount/amount1000 must be a positive integer', { statusCode: 400 });
538
769
  }
770
+ const bg = requestPayment.background;
539
771
  m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
540
- expiryTimestamp: message.requestPayment.expiry,
541
- amount1000: message.requestPayment.amount,
542
- currencyCodeIso4217: message.requestPayment.currency,
543
- requestFrom: message.requestPayment.from,
544
- noteMessage: { ...notes },
545
- background: (_h = message.requestPayment.background) !== null && _h !== void 0 ? _h : null,
772
+ expiryTimestamp: requestPayment.expiry ?? requestPayment.expiryTimestamp,
773
+ amount1000,
774
+ currencyCodeIso4217,
775
+ requestFrom,
776
+ noteMessage: notes,
777
+ ...(bg != null ? { background: bg } : {})
546
778
  });
547
779
  }
780
+ else if ('sendPayment' in message || 'sendPaymentMessage' in message) {
781
+ if ('sendPayment' in message && 'sendPaymentMessage' in message) {
782
+ throw new boom_1.Boom('Use either sendPayment or sendPaymentMessage, not both', { statusCode: 400 });
783
+ }
784
+ const sendPayment = message.sendPayment || message.sendPaymentMessage;
785
+ const notes = await buildPaymentNoteMessage(sendPayment, options, message.text || '');
786
+ const requestMessageKey = sendPayment.requestMessageKey ?? sendPayment.requestKey ?? sendPayment.request;
787
+ if (!requestMessageKey) {
788
+ throw new boom_1.Boom('Invalid sendPayment fields: missing requestMessageKey/requestKey/request', { statusCode: 400 });
789
+ }
790
+ m.sendPaymentMessage = Types_1.WAProto.Message.SendPaymentMessage.fromObject({
791
+ noteMessage: notes,
792
+ requestMessageKey,
793
+ ...(sendPayment.background != null ? { background: sendPayment.background } : {}),
794
+ ...(sendPayment.transactionData != null ? { transactionData: sendPayment.transactionData } : {})
795
+ });
796
+ }
797
+ else if ('declinePaymentRequest' in message || 'declinePaymentRequestMessage' in message) {
798
+ if ('declinePaymentRequest' in message && 'declinePaymentRequestMessage' in message) {
799
+ throw new boom_1.Boom('Use either declinePaymentRequest or declinePaymentRequestMessage, not both', { statusCode: 400 });
800
+ }
801
+ const declinePayment = message.declinePaymentRequest || message.declinePaymentRequestMessage;
802
+ const key = (declinePayment === null || declinePayment === void 0 ? void 0 : declinePayment.key) || declinePayment;
803
+ if (!key) {
804
+ throw new boom_1.Boom('Invalid declinePaymentRequest fields: missing key', { statusCode: 400 });
805
+ }
806
+ m.declinePaymentRequestMessage = Types_1.WAProto.Message.DeclinePaymentRequestMessage.fromObject({ key });
807
+ }
808
+ else if ('cancelPaymentRequest' in message || 'cancelPaymentRequestMessage' in message) {
809
+ if ('cancelPaymentRequest' in message && 'cancelPaymentRequestMessage' in message) {
810
+ throw new boom_1.Boom('Use either cancelPaymentRequest or cancelPaymentRequestMessage, not both', { statusCode: 400 });
811
+ }
812
+ const cancelPayment = message.cancelPaymentRequest || message.cancelPaymentRequestMessage;
813
+ const key = (cancelPayment === null || cancelPayment === void 0 ? void 0 : cancelPayment.key) || cancelPayment;
814
+ if (!key) {
815
+ throw new boom_1.Boom('Invalid cancelPaymentRequest fields: missing key', { statusCode: 400 });
816
+ }
817
+ m.cancelPaymentRequestMessage = Types_1.WAProto.Message.CancelPaymentRequestMessage.fromObject({ key });
818
+ }
819
+ else if ('requestPaymentFrom' in message && !!message.requestPaymentFrom) {
820
+ const noteText = message.text || '';
821
+ m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
822
+ requestFrom: message.requestPaymentFrom,
823
+ noteMessage: { extendedTextMessage: { text: noteText } }
824
+ });
825
+ }
826
+ else if ('invoiceNote' in message) {
827
+ const preparedInvoice = await (0, exports.prepareWAMessageMedia)(message, options);
828
+ const mediaType = Object.keys(preparedInvoice)[0];
829
+ const mediaMsg = preparedInvoice[mediaType] || {};
830
+ m.invoiceMessage = Types_1.WAProto.Message.InvoiceMessage.fromObject({
831
+ note: message.invoiceNote,
832
+ token: message.invoiceToken || '',
833
+ attachmentType: mediaType === 'imageMessage' ? 1 : 0,
834
+ attachmentMimetype: mediaMsg.mimetype,
835
+ attachmentMediaKey: mediaMsg.mediaKey,
836
+ attachmentMediaKeyTimestamp: mediaMsg.mediaKeyTimestamp,
837
+ attachmentFileSha256: mediaMsg.fileSha256,
838
+ attachmentFileEncSha256: mediaMsg.fileEncSha256,
839
+ attachmentDirectPath: mediaMsg.directPath,
840
+ attachmentJpegThumbnail: mediaMsg.jpegThumbnail
841
+ });
842
+ }
843
+ else if ('orderText' in message) {
844
+ m.orderMessage = Types_1.WAProto.Message.OrderMessage.fromObject({
845
+ message: message.orderText,
846
+ thumbnail: message.thumbnail,
847
+ status: message.orderStatus || 1,
848
+ surface: message.orderSurface || 1
849
+ });
850
+ }
851
+ else if ('paymentInviteServiceType' in message) {
852
+ m.paymentInviteMessage = {
853
+ serviceType: message.paymentInviteServiceType,
854
+ expiryTimestamp: message.paymentInviteExpiry
855
+ };
856
+ }
548
857
  else if ('sharePhoneNumber' in message) {
549
858
  m.protocolMessage = {
550
859
  type: WAProto_1.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
@@ -553,6 +862,17 @@ const generateWAMessageContent = async (message, options) => {
553
862
  else if ('requestPhoneNumber' in message) {
554
863
  m.requestPhoneNumberMessage = {};
555
864
  }
865
+ else if ('limitSharing' in message) {
866
+ m.protocolMessage = {
867
+ type: WAProto_1.proto.Message.ProtocolMessage.Type.LIMIT_SHARING,
868
+ limitSharing: {
869
+ sharingLimited: message.limitSharing === true,
870
+ trigger: 1, // TriggerType.MANUAL = 1
871
+ limitSharingSettingTimestamp: Date.now(),
872
+ initiatedByMe: true
873
+ }
874
+ };
875
+ }
556
876
  else if ('album' in message) {
557
877
  const imageMessages = message.album.filter(item => 'image' in item);
558
878
  const videoMessages = message.album.filter(item => 'video' in item);
@@ -561,39 +881,91 @@ const generateWAMessageContent = async (message, options) => {
561
881
  expectedVideoCount: videoMessages.length,
562
882
  });
563
883
  }
564
- else {
884
+ else if ('pollResult' in message) {
885
+ if (!Array.isArray(message.pollResult.values)) {
886
+ throw new boom_1.Boom('Invalid pollResult values', { statusCode: 400 });
887
+ }
888
+ m.pollResultSnapshotMessage = {
889
+ name: message.pollResult.name,
890
+ pollVotes: message.pollResult.values.map(([optionName, optionVoteCount]) => ({
891
+ optionName,
892
+ optionVoteCount,
893
+ })),
894
+ };
895
+ }
896
+ else if ('stickerPack' in message || 'stickerPackMessage' in message) {
897
+ if ('stickerPack' in message && 'stickerPackMessage' in message) {
898
+ throw new boom_1.Boom('Cannot specify both stickerPack and stickerPackMessage; use only one property.', { statusCode: 400 });
899
+ }
900
+ const stickerPackMessage = 'stickerPack' in message
901
+ ? message.stickerPack
902
+ : message.stickerPackMessage;
903
+ m.stickerPackMessage = Types_1.WAProto.Message.StickerPackMessage.fromObject(stickerPackMessage);
904
+ }
905
+ else if ('listMessage' in message) {
906
+ const lm = { ...message.listMessage };
907
+ if (lm.text !== undefined && lm.description === undefined) {
908
+ lm.description = lm.text;
909
+ delete lm.text;
910
+ }
911
+ m = { listMessage: lm };
912
+ }
913
+ else if ('buttonsMessage' in message) {
914
+ m = {
915
+ buttonsMessage: Types_1.WAProto.Message.ButtonsMessage.fromObject(message.buttonsMessage)
916
+ };
917
+ }
918
+ else if ('interactiveMessage' in message) {
919
+ m = { interactiveMessage: message.interactiveMessage };
920
+ }
921
+ else if ('richResponse' in message) {
922
+ // handled in richResponse block below
923
+ }
924
+ else if (hasCaptionWithoutMedia && !hasCaptionContainer) {
925
+ m.extendedTextMessage = { text: message.caption };
926
+ }
927
+ else if (hasCaptionWithoutMedia && hasCaptionContainer) {
928
+ m = {};
929
+ }
930
+ else if (!hasCaptionWithoutMedia && hasMediaPayload(message)) {
565
931
  m = await (0, exports.prepareWAMessageMedia)(message, options);
566
932
  }
567
933
  if ('buttons' in message && !!message.buttons) {
568
- const buttonsMessage = {
569
- buttons: message.buttons.map(b => ({ ...b, type: WAProto_1.proto.Message.ButtonsMessage.Button.Type.RESPONSE }))
934
+ const interactiveMessage = {
935
+ nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
936
+ buttons: message.buttons.map(normalizeQuickReplyButton),
937
+ })
570
938
  };
571
939
  if ('text' in message) {
572
- buttonsMessage.contentText = message.text;
573
- buttonsMessage.headerType = ButtonType.EMPTY;
574
- }
575
- else {
576
- if ('caption' in message) {
577
- buttonsMessage.contentText = message.caption;
578
- }
579
- const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
580
- buttonsMessage.headerType = ButtonType[type];
581
- Object.assign(buttonsMessage, m);
940
+ interactiveMessage.body = { text: message.text };
582
941
  }
583
- if ('title' in message && !!message.title) {
584
- buttonsMessage.text = message.title,
585
- buttonsMessage.headerType = ButtonType.TEXT;
942
+ else if ('caption' in message) {
943
+ interactiveMessage.body = { text: message.caption };
944
+ interactiveMessage.header = {
945
+ title: message.title || '',
946
+ subtitle: message.subtitle,
947
+ hasMediaAttachment: Boolean(message.hasMediaAttachment),
948
+ };
949
+ Object.assign(interactiveMessage.header, m);
586
950
  }
587
- if ('footer' in message && !!message.footer) {
588
- buttonsMessage.footerText = message.footer;
951
+ if ('title' in message && !!message.title && !interactiveMessage.header) {
952
+ interactiveMessage.header = {
953
+ title: message.title,
954
+ subtitle: message.subtitle,
955
+ hasMediaAttachment: Boolean(message.hasMediaAttachment),
956
+ };
589
957
  }
590
- if ('contextInfo' in message && !!message.contextInfo) {
591
- buttonsMessage.contextInfo = message.contextInfo;
958
+ else if ('title' in message && !!message.title && interactiveMessage.header) {
959
+ interactiveMessage.header.title = message.title;
960
+ if (message.subtitle !== undefined) {
961
+ interactiveMessage.header.subtitle = message.subtitle;
962
+ }
592
963
  }
593
- if ('mentions' in message && !!message.mentions) {
594
- buttonsMessage.contextInfo = { mentionedJid: message.mentions };
964
+ if ('footer' in message && !!message.footer) {
965
+ interactiveMessage.footer = { text: message.footer };
595
966
  }
596
- m = { buttonsMessage };
967
+ applyContextInfoAndMentions(interactiveMessage, message);
968
+ m = { interactiveMessage };
597
969
  }
598
970
  else if ('templateButtons' in message && !!message.templateButtons) {
599
971
  const msg = {
@@ -629,6 +1001,26 @@ const generateWAMessageContent = async (message, options) => {
629
1001
  };
630
1002
  m = { listMessage };
631
1003
  }
1004
+ else if ('productList' in message && !!message.productList) {
1005
+ if (!Array.isArray(message.productList) || message.productList.length === 0 ||
1006
+ !Array.isArray(message.productList[0].products) || message.productList[0].products.length === 0) {
1007
+ throw new boom_1.Boom('Invalid productList: must contain at least one section with one product', { statusCode: 400 });
1008
+ }
1009
+ m.listMessage = {
1010
+ title: message.title,
1011
+ buttonText: message.buttonText,
1012
+ footerText: message.footer,
1013
+ description: message.text,
1014
+ productListInfo: {
1015
+ productSections: message.productList,
1016
+ headerImage: {
1017
+ productId: message.productList[0].products[0].productId,
1018
+ },
1019
+ businessOwnerJid: message.businessOwnerJid,
1020
+ },
1021
+ listType: WAProto_1.proto.Message.ListMessage.ListType.PRODUCT_LIST
1022
+ };
1023
+ }
632
1024
  if ('interactiveButtons' in message && !!message.interactiveButtons) {
633
1025
  const interactiveMessage = {
634
1026
  nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
@@ -647,7 +1039,7 @@ const generateWAMessageContent = async (message, options) => {
647
1039
  interactiveMessage.header = {
648
1040
  title: message.title,
649
1041
  subtitle: message.subtitle,
650
- hasMediaAttachment: (_j = message === null || message === void 0 ? void 0 : message.media) !== null && _j !== void 0 ? _j : false,
1042
+ hasMediaAttachment: Boolean(message.hasMediaAttachment),
651
1043
  };
652
1044
  Object.assign(interactiveMessage.header, m);
653
1045
  }
@@ -660,23 +1052,18 @@ const generateWAMessageContent = async (message, options) => {
660
1052
  interactiveMessage.header = {
661
1053
  title: message.title,
662
1054
  subtitle: message.subtitle,
663
- hasMediaAttachment: (_k = message === null || message === void 0 ? void 0 : message.media) !== null && _k !== void 0 ? _k : false,
1055
+ hasMediaAttachment: Boolean(message.hasMediaAttachment),
664
1056
  };
665
1057
  Object.assign(interactiveMessage.header, m);
666
1058
  }
667
- if ('contextInfo' in message && !!message.contextInfo) {
668
- interactiveMessage.contextInfo = message.contextInfo;
669
- }
670
- if ('mentions' in message && !!message.mentions) {
671
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
672
- }
1059
+ applyContextInfoAndMentions(interactiveMessage, message);
673
1060
  m = { interactiveMessage };
674
1061
  }
675
1062
  if ('shop' in message && !!message.shop) {
676
1063
  const interactiveMessage = {
677
1064
  shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
678
- surface: message.shop,
679
- id: message.id
1065
+ surface: (_l = message.shop) === null || _l === void 0 ? void 0 : _l.surface,
1066
+ id: (_m = message.shop) === null || _m === void 0 ? void 0 : _m.id
680
1067
  })
681
1068
  };
682
1069
  if ('text' in message) {
@@ -691,7 +1078,7 @@ const generateWAMessageContent = async (message, options) => {
691
1078
  interactiveMessage.header = {
692
1079
  title: message.title,
693
1080
  subtitle: message.subtitle,
694
- hasMediaAttachment: (_l = message === null || message === void 0 ? void 0 : message.media) !== null && _l !== void 0 ? _l : false,
1081
+ hasMediaAttachment: Boolean(message.hasMediaAttachment),
695
1082
  };
696
1083
  Object.assign(interactiveMessage.header, m);
697
1084
  }
@@ -704,25 +1091,137 @@ const generateWAMessageContent = async (message, options) => {
704
1091
  interactiveMessage.header = {
705
1092
  title: message.title,
706
1093
  subtitle: message.subtitle,
707
- hasMediaAttachment: (_m = message === null || message === void 0 ? void 0 : message.media) !== null && _m !== void 0 ? _m : false,
1094
+ hasMediaAttachment: Boolean(message.hasMediaAttachment),
708
1095
  };
709
1096
  Object.assign(interactiveMessage.header, m);
710
1097
  }
711
- if ('contextInfo' in message && !!message.contextInfo) {
712
- interactiveMessage.contextInfo = message.contextInfo;
1098
+ applyContextInfoAndMentions(interactiveMessage, message);
1099
+ m = { interactiveMessage };
1100
+ if ('interactiveAsTemplate' in message && message.interactiveAsTemplate !== false) {
1101
+ m = { templateMessage: { interactiveMessageTemplate: interactiveMessage } };
713
1102
  }
714
- if ('mentions' in message && !!message.mentions) {
715
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
1103
+ }
1104
+ if ('richResponse' in message) {
1105
+ const { text, code, language = 'javascript', botJid = '259786046210223@bot' } = message.richResponse;
1106
+ const sections = [
1107
+ {
1108
+ view_model: {
1109
+ primitive: {
1110
+ text: text,
1111
+ __typename: 'GenAIMarkdownTextUXPrimitive'
1112
+ },
1113
+ __typename: 'GenAISingleLayoutViewModel'
1114
+ }
1115
+ }
1116
+ ];
1117
+ if (code) {
1118
+ sections.push({
1119
+ view_model: {
1120
+ primitive: {
1121
+ language,
1122
+ code_blocks: tokenizeCode(String(code)),
1123
+ __typename: 'GenAICodeUXPrimitive'
1124
+ },
1125
+ __typename: 'GenAISingleLayoutViewModel'
1126
+ }
1127
+ });
716
1128
  }
717
- m = { interactiveMessage };
1129
+ const unifiedData = {
1130
+ response_id: (0, crypto_1.randomUUID)(),
1131
+ sections
1132
+ };
1133
+ return Types_1.WAProto.Message.fromObject({
1134
+ messageContextInfo: {
1135
+ deviceListMetadata: {},
1136
+ deviceListMetadataVersion: 2,
1137
+ messageSecret: (0, crypto_1.randomBytes)(32)
1138
+ },
1139
+ botForwardedMessage: {
1140
+ message: {
1141
+ richResponseMessage: {
1142
+ submessages: [],
1143
+ messageType: 1,
1144
+ unifiedResponse: { data: Buffer.from(JSON.stringify(unifiedData)) },
1145
+ contextInfo: {
1146
+ forwardingScore: 2,
1147
+ isForwarded: true,
1148
+ forwardedAiBotMessageInfo: { botJid },
1149
+ botMessageSharingInfo: {
1150
+ botEntryPointOrigin: 1,
1151
+ forwardScore: 2
1152
+ }
1153
+ }
1154
+ }
1155
+ }
1156
+ }
1157
+ });
1158
+ }
1159
+ if ('statusNotification' in message || 'statusNotificationMessage' in message) {
1160
+ const notifData = 'statusNotification' in message ? message.statusNotification : message.statusNotificationMessage;
1161
+ m = { statusNotificationMessage: Types_1.WAProto.Message.StatusNotificationMessage.fromObject(notifData) };
1162
+ }
1163
+ else if ('statusQuestionAnswer' in message || 'statusQuestionAnswerMessage' in message) {
1164
+ const qaData = 'statusQuestionAnswer' in message ? message.statusQuestionAnswer : message.statusQuestionAnswerMessage;
1165
+ m = { statusQuestionAnswerMessage: Types_1.WAProto.Message.StatusQuestionAnswerMessage.fromObject(qaData) };
1166
+ }
1167
+ else if ('questionResponse' in message || 'questionResponseMessage' in message) {
1168
+ const qrData = 'questionResponse' in message ? message.questionResponse : message.questionResponseMessage;
1169
+ m = { questionResponseMessage: Types_1.WAProto.Message.QuestionResponseMessage.fromObject(qrData) };
1170
+ }
1171
+ else if ('statusQuoted' in message || 'statusQuotedMessage' in message) {
1172
+ const sqData = 'statusQuoted' in message ? message.statusQuoted : message.statusQuotedMessage;
1173
+ m = { statusQuotedMessage: Types_1.WAProto.Message.StatusQuotedMessage.fromObject(sqData) };
1174
+ }
1175
+ else if ('statusStickerInteraction' in message || 'statusStickerInteractionMessage' in message) {
1176
+ const ssiData = 'statusStickerInteraction' in message ? message.statusStickerInteraction : message.statusStickerInteractionMessage;
1177
+ m = { statusStickerInteractionMessage: Types_1.WAProto.Message.StatusStickerInteractionMessage.fromObject(ssiData) };
1178
+ }
1179
+ else if ('newsletterFollowerInvite' in message || 'newsletterFollowerInviteMessageV2' in message) {
1180
+ const nfiData = 'newsletterFollowerInvite' in message ? message.newsletterFollowerInvite : message.newsletterFollowerInviteMessageV2;
1181
+ m = { newsletterFollowerInviteMessageV2: Types_1.WAProto.Message.NewsletterFollowerInviteMessage.fromObject(nfiData) };
1182
+ }
1183
+ else if ('messageHistoryNotice' in message) {
1184
+ m = { messageHistoryNotice: Types_1.WAProto.Message.MessageHistoryNotice.fromObject(message.messageHistoryNotice) };
1185
+ }
1186
+ if ('raw' in message && !!message.raw) {
1187
+ const { raw: _, externalAdReply: _ear, ...rawMsg } = message;
1188
+ if ('externalAdReply' in message && !!message.externalAdReply) {
1189
+ const ear = normalizeEarFields(message.externalAdReply);
1190
+ const [rawType] = Object.keys(rawMsg);
1191
+ if (rawType && rawMsg[rawType]) {
1192
+ rawMsg[rawType].contextInfo = {
1193
+ ...(rawMsg[rawType].contextInfo || {}),
1194
+ externalAdReply: ear
1195
+ };
1196
+ }
1197
+ }
1198
+ return Types_1.WAProto.Message.fromObject(rawMsg);
718
1199
  }
719
1200
  if ('viewOnce' in message && !!message.viewOnce) {
720
1201
  m = { viewOnceMessage: { message: m } };
721
1202
  }
722
- if ('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length)) {
1203
+ if ('viewOnceV2' in message && !!message.viewOnceV2) {
1204
+ m = { viewOnceMessageV2: { message: m } };
1205
+ }
1206
+ if ('viewOnceV2Extension' in message && !!message.viewOnceV2Extension) {
1207
+ m = { viewOnceMessageV2Extension: { message: m } };
1208
+ }
1209
+ if ('ephemeral' in message && !!message.ephemeral) {
1210
+ m = { ephemeralMessage: { message: m } };
1211
+ }
1212
+ if ('groupStatus' in message && !!message.groupStatus) {
1213
+ m = { groupStatusMessage: { message: m } };
1214
+ }
1215
+ if (('mentions' in message && ((_o = message.mentions) === null || _o === void 0 ? void 0 : _o.length))
1216
+ || ('mentionAll' in message && !!message.mentionAll)) {
723
1217
  const [messageType] = Object.keys(m);
724
- m[messageType].contextInfo = m[messageType] || {};
725
- m[messageType].contextInfo.mentionedJid = message.mentions;
1218
+ m[messageType].contextInfo = m[messageType].contextInfo || {};
1219
+ if ((_p = message.mentions) === null || _p === void 0 ? void 0 : _p.length) {
1220
+ m[messageType].contextInfo.mentionedJid = message.mentions;
1221
+ }
1222
+ if (message.mentionAll) {
1223
+ m[messageType].contextInfo.nonJidMentions = 1;
1224
+ }
726
1225
  }
727
1226
  if ('edit' in message) {
728
1227
  m = {
@@ -737,8 +1236,34 @@ const generateWAMessageContent = async (message, options) => {
737
1236
  if ('contextInfo' in message && !!message.contextInfo) {
738
1237
  const [messageType] = Object.keys(m);
739
1238
  m[messageType] = m[messageType] || {};
740
- m[messageType].contextInfo = message.contextInfo;
1239
+ m[messageType].contextInfo = {
1240
+ ...(m[messageType].contextInfo || {}),
1241
+ ...message.contextInfo
1242
+ };
1243
+ }
1244
+ if ('externalAdReply' in message && !!message.externalAdReply) {
1245
+ const wrappers = ['viewOnceMessage', 'viewOnceMessageV2', 'viewOnceMessageV2Extension', 'ephemeralMessage', 'groupStatusMessage', 'templateMessage'];
1246
+ const [outerType] = Object.keys(m);
1247
+ const inner = wrappers.includes(outerType) ? m[outerType].message : m;
1248
+ const [innerType] = Object.keys(inner);
1249
+ const innerPayload = innerType ? inner[innerType] : undefined;
1250
+ if (innerType && innerType !== 'carouselMessage' && innerPayload && typeof innerPayload === 'object') {
1251
+ const ear = normalizeEarFields(message.externalAdReply);
1252
+ innerPayload.contextInfo = {
1253
+ ...(innerPayload.contextInfo || {}),
1254
+ externalAdReply: ear
1255
+ };
1256
+ }
1257
+ }
1258
+ if ('secureMetaServiceLabel' in message && !!message.secureMetaServiceLabel) {
1259
+ const [messageType] = Object.keys(m);
1260
+ m[messageType] = m[messageType] || {};
1261
+ m[messageType].contextInfo = {
1262
+ ...(m[messageType].contextInfo || {}),
1263
+ secureMetaServiceLabel: 1
1264
+ };
741
1265
  }
1266
+ applyDefaultNewsletterAnnotation(m, message);
742
1267
  return Types_1.WAProto.Message.fromObject(m);
743
1268
  };
744
1269
  exports.generateWAMessageContent = generateWAMessageContent;
@@ -788,7 +1313,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
788
1313
  innerMessage[key].contextInfo = {
789
1314
  ...(innerMessage[key].contextInfo || {}),
790
1315
  expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
791
- //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
1316
+
792
1317
  };
793
1318
  }
794
1319
  message = Types_1.WAProto.Message.fromObject(message);
@@ -811,10 +1336,10 @@ const generateWAMessage = async (jid, content, options) => {
811
1336
  var _a;
812
1337
 
813
1338
  options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
814
- return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsletter)(jid), ...options }), options);
1339
+ return (0, exports.generateWAMessageFromContent)(jid, await (0, exports.generateWAMessageContent)(content, { newsletter: (0, WABinary_1.isJidNewsletter)(jid), recipientJid: jid, ...options }), options);
815
1340
  };
816
1341
  exports.generateWAMessage = generateWAMessage;
817
- /** Get the key to access the true type of content */
1342
+
818
1343
  const getContentType = (content) => {
819
1344
  if (content) {
820
1345
  const keys = Object.keys(content);
@@ -823,12 +1348,7 @@ const getContentType = (content) => {
823
1348
  }
824
1349
  };
825
1350
  exports.getContentType = getContentType;
826
- /**
827
- * Normalizes ephemeral, view once messages to regular message content
828
- * Eg. image messages in ephemeral messages, in view once messages etc.
829
- * @param content
830
- * @returns
831
- */
1351
+
832
1352
  const normalizeMessageContent = (content) => {
833
1353
  if (!content) {
834
1354
  return undefined;
@@ -865,14 +1385,12 @@ const normalizeMessageContent = (content) => {
865
1385
  || (message === null || message === void 0 ? void 0 : message.botTaskMessage)
866
1386
  || (message === null || message === void 0 ? void 0 : message.questionMessage)
867
1387
  || (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
868
- || (message === null || message === void 0 ? void 0 : message.botForwardedMessage));
1388
+ || (message === null || message === void 0 ? void 0 : message.botForwardedMessage)
1389
+ || (message === null || message === void 0 ? void 0 : message.questionReplyMessage));
869
1390
  }
870
1391
  };
871
1392
  exports.normalizeMessageContent = normalizeMessageContent;
872
- /**
873
- * Extract the true message content from a message
874
- * Eg. extracts the inner message from a disappearing message/view once message
875
- */
1393
+
876
1394
  const extractMessageContent = (content) => {
877
1395
  var _a, _b, _c, _d, _e, _f;
878
1396
  const extractFromTemplateMessage = (msg) => {
@@ -912,16 +1430,14 @@ const extractMessageContent = (content) => {
912
1430
  return content;
913
1431
  };
914
1432
  exports.extractMessageContent = extractMessageContent;
915
- /**
916
- * Returns the device predicted by message ID
917
- */
1433
+
918
1434
  const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' :
919
1435
  /^3E.{20}$/.test(id) ? 'web' :
920
1436
  /^(.{21}|.{32})$/.test(id) ? 'android' :
921
1437
  /^(3F|.{18}$)/.test(id) ? 'desktop' :
922
1438
  'unknown';
923
1439
  exports.getDevice = getDevice;
924
- /** Upserts a receipt in the message */
1440
+
925
1441
  const updateMessageWithReceipt = (msg, receipt) => {
926
1442
  msg.userReceipt = msg.userReceipt || [];
927
1443
  const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
@@ -933,7 +1449,7 @@ const updateMessageWithReceipt = (msg, receipt) => {
933
1449
  }
934
1450
  };
935
1451
  exports.updateMessageWithReceipt = updateMessageWithReceipt;
936
- /** Update the message with a new reaction */
1452
+
937
1453
  const updateMessageWithReaction = (msg, reaction) => {
938
1454
  const authorID = (0, generics_1.getKeyAuthor)(reaction.key);
939
1455
  const reactions = (msg.reactions || [])
@@ -943,7 +1459,7 @@ const updateMessageWithReaction = (msg, reaction) => {
943
1459
  msg.reactions = reactions;
944
1460
  };
945
1461
  exports.updateMessageWithReaction = updateMessageWithReaction;
946
- /** Update the message with a new poll update */
1462
+
947
1463
  const updateMessageWithPollUpdate = (msg, update) => {
948
1464
  var _a, _b;
949
1465
  const authorID = (0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey);
@@ -955,12 +1471,7 @@ const updateMessageWithPollUpdate = (msg, update) => {
955
1471
  msg.pollUpdates = reactions;
956
1472
  };
957
1473
  exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
958
- /**
959
- * Aggregates all poll updates in a poll.
960
- * @param msg the poll creation message
961
- * @param meId your jid
962
- * @returns A list of options & their voters
963
- */
1474
+
964
1475
  function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
965
1476
  var _a, _b, _c;
966
1477
  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) || [];
@@ -992,7 +1503,7 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
992
1503
  }
993
1504
  return Object.values(voteHashMap);
994
1505
  }
995
- /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
1506
+
996
1507
  const aggregateMessageKeysNotFromMe = (keys) => {
997
1508
  const keyMap = {};
998
1509
  for (const { remoteJid, id, participant, fromMe } of keys) {
@@ -1012,9 +1523,7 @@ const aggregateMessageKeysNotFromMe = (keys) => {
1012
1523
  };
1013
1524
  exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
1014
1525
  const REUPLOAD_REQUIRED_STATUS = [410, 404];
1015
- /**
1016
- * Downloads the given message. Throws an error if it's not a media message
1017
- */
1526
+
1018
1527
  const downloadMediaMessage = async (message, type, options, ctx) => {
1019
1528
  const result = await downloadMsg()
1020
1529
  .catch(async (error) => {
@@ -1068,7 +1577,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
1068
1577
  }
1069
1578
  };
1070
1579
  exports.downloadMediaMessage = downloadMediaMessage;
1071
- /** Checks whether the given message is a media message; if it is returns the inner content */
1580
+
1072
1581
  const assertMediaContent = (content) => {
1073
1582
  content = (0, exports.extractMessageContent)(content);
1074
1583
  const mediaContent = (content === null || content === void 0 ? void 0 : content.documentMessage)
@@ -1083,21 +1592,36 @@ const assertMediaContent = (content) => {
1083
1592
  };
1084
1593
  exports.assertMediaContent = assertMediaContent;
1085
1594
 
1595
+ /**
1596
+ * Normalizes a bare user id to @s.whatsapp.net. Does not convert LID↔PN; use lidMapping / PN in key.remoteJidAlt when needed.
1597
+ */
1086
1598
  const toJid = (id) => {
1087
1599
  if (!id)
1088
1600
  return '';
1089
- if (id.endsWith('@lid'))
1090
- return id.replace('@lid', '@s.whatsapp.net');
1091
1601
  if (id.includes('@'))
1092
1602
  return id;
1093
1603
  return `${id}@s.whatsapp.net`;
1094
1604
  };
1095
1605
  exports.toJid = toJid;
1606
+ /**
1607
+ * Returns the peer LID JID when the key is LID-primary (decode sets remoteJid/participant to @lid when WA sends LID).
1608
+ */
1096
1609
  const getSenderLid = (message) => {
1097
- const sender = message.key.participant || message.key.remoteJid;
1098
- const user = (0, WABinary_1.jidDecode)(sender)?.user || '';
1099
- const lid = (0, WABinary_1.jidEncode)(user, 'lid');
1100
- console.log('sender lid:', lid);
1101
- return { jid: sender, lid };
1610
+ const k = message.key;
1611
+ if (!k) {
1612
+ return { jid: '', lid: '' };
1613
+ }
1614
+ const jid = k.participant || k.remoteJid || '';
1615
+ if (jid.endsWith('@lid') || jid.endsWith('@hosted.lid')) {
1616
+ return { jid, lid: jid };
1617
+ }
1618
+ if (k.lid && typeof k.lid === 'string') {
1619
+ const lid = k.lid.includes('@') ? k.lid : (0, WABinary_1.jidEncode)(k.lid, 'lid');
1620
+ return { jid, lid };
1621
+ }
1622
+ if (k.participantLid && (0, WABinary_1.isLidUser)(k.participantLid)) {
1623
+ return { jid, lid: k.participantLid };
1624
+ }
1625
+ return { jid, lid: '' };
1102
1626
  };
1103
1627
  exports.getSenderLid = getSenderLid;