@ubedsockets/baileys 1.6.9 → 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 (399) 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 +746 -232
  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/RichType.d.ts +0 -3
  209. package/lib/Types/RichType.d.ts.map +0 -1
  210. package/lib/Types/RichType.js +0 -31
  211. package/lib/Types/Signal.d.ts +0 -87
  212. package/lib/Types/Signal.d.ts.map +0 -1
  213. package/lib/Types/Signal.js.map +0 -1
  214. package/lib/Types/Socket.d.ts +0 -136
  215. package/lib/Types/Socket.d.ts.map +0 -1
  216. package/lib/Types/Socket.js.map +0 -1
  217. package/lib/Types/State.d.ts +0 -97
  218. package/lib/Types/State.d.ts.map +0 -1
  219. package/lib/Types/State.js.map +0 -1
  220. package/lib/Types/USync.d.ts +0 -26
  221. package/lib/Types/USync.d.ts.map +0 -1
  222. package/lib/Types/USync.js.map +0 -1
  223. package/lib/Types/index.d.ts +0 -65
  224. package/lib/Types/index.d.ts.map +0 -1
  225. package/lib/Types/index.js.map +0 -1
  226. package/lib/Utils/Tiktok.js +0 -80
  227. package/lib/Utils/auth-utils.d.ts +0 -24
  228. package/lib/Utils/auth-utils.d.ts.map +0 -1
  229. package/lib/Utils/auth-utils.js.map +0 -1
  230. package/lib/Utils/browser-utils.d.ts +0 -4
  231. package/lib/Utils/browser-utils.d.ts.map +0 -1
  232. package/lib/Utils/browser-utils.js.map +0 -1
  233. package/lib/Utils/business.d.ts +0 -23
  234. package/lib/Utils/business.d.ts.map +0 -1
  235. package/lib/Utils/business.js.map +0 -1
  236. package/lib/Utils/chaanel/vyzen.js +0 -0
  237. package/lib/Utils/chat-utils.d.ts +0 -100
  238. package/lib/Utils/chat-utils.d.ts.map +0 -1
  239. package/lib/Utils/chat-utils.js.map +0 -1
  240. package/lib/Utils/companion-reg-client-utils.d.ts +0 -17
  241. package/lib/Utils/companion-reg-client-utils.d.ts.map +0 -1
  242. package/lib/Utils/companion-reg-client-utils.js +0 -35
  243. package/lib/Utils/companion-reg-client-utils.js.map +0 -1
  244. package/lib/Utils/crypto.d.ts +0 -37
  245. package/lib/Utils/crypto.d.ts.map +0 -1
  246. package/lib/Utils/crypto.js.map +0 -1
  247. package/lib/Utils/decode-wa-message.d.ts +0 -66
  248. package/lib/Utils/decode-wa-message.d.ts.map +0 -1
  249. package/lib/Utils/decode-wa-message.js.map +0 -1
  250. package/lib/Utils/event-buffer.d.ts +0 -36
  251. package/lib/Utils/event-buffer.d.ts.map +0 -1
  252. package/lib/Utils/event-buffer.js.map +0 -1
  253. package/lib/Utils/facebook.js +0 -48
  254. package/lib/Utils/generics.d.ts +0 -91
  255. package/lib/Utils/generics.d.ts.map +0 -1
  256. package/lib/Utils/generics.js.map +0 -1
  257. package/lib/Utils/history.d.ts +0 -24
  258. package/lib/Utils/history.d.ts.map +0 -1
  259. package/lib/Utils/history.js.map +0 -1
  260. package/lib/Utils/identity-change-handler.d.ts +0 -44
  261. package/lib/Utils/identity-change-handler.d.ts.map +0 -1
  262. package/lib/Utils/identity-change-handler.js +0 -50
  263. package/lib/Utils/identity-change-handler.js.map +0 -1
  264. package/lib/Utils/index.d.ts +0 -22
  265. package/lib/Utils/index.d.ts.map +0 -1
  266. package/lib/Utils/index.js.map +0 -1
  267. package/lib/Utils/instagram.js +0 -50
  268. package/lib/Utils/link-preview.d.ts +0 -21
  269. package/lib/Utils/link-preview.d.ts.map +0 -1
  270. package/lib/Utils/link-preview.js.map +0 -1
  271. package/lib/Utils/logger.d.ts +0 -12
  272. package/lib/Utils/logger.d.ts.map +0 -1
  273. package/lib/Utils/logger.js.map +0 -1
  274. package/lib/Utils/lt-hash.d.ts +0 -8
  275. package/lib/Utils/lt-hash.d.ts.map +0 -1
  276. package/lib/Utils/lt-hash.js.map +0 -1
  277. package/lib/Utils/make-mutex.d.ts +0 -9
  278. package/lib/Utils/make-mutex.d.ts.map +0 -1
  279. package/lib/Utils/make-mutex.js.map +0 -1
  280. package/lib/Utils/message-retry-manager.d.ts +0 -115
  281. package/lib/Utils/message-retry-manager.d.ts.map +0 -1
  282. package/lib/Utils/message-retry-manager.js.map +0 -1
  283. package/lib/Utils/messages-media.d.ts +0 -133
  284. package/lib/Utils/messages-media.d.ts.map +0 -1
  285. package/lib/Utils/messages-media.js.map +0 -1
  286. package/lib/Utils/messages.d.ts +0 -91
  287. package/lib/Utils/messages.d.ts.map +0 -1
  288. package/lib/Utils/messages.js.map +0 -1
  289. package/lib/Utils/noise-handler.d.ts +0 -20
  290. package/lib/Utils/noise-handler.d.ts.map +0 -1
  291. package/lib/Utils/noise-handler.js.map +0 -1
  292. package/lib/Utils/offline-node-processor.d.ts +0 -17
  293. package/lib/Utils/offline-node-processor.d.ts.map +0 -1
  294. package/lib/Utils/offline-node-processor.js +0 -40
  295. package/lib/Utils/offline-node-processor.js.map +0 -1
  296. package/lib/Utils/pre-key-manager.d.ts +0 -28
  297. package/lib/Utils/pre-key-manager.d.ts.map +0 -1
  298. package/lib/Utils/pre-key-manager.js +0 -106
  299. package/lib/Utils/pre-key-manager.js.map +0 -1
  300. package/lib/Utils/process-message.d.ts +0 -60
  301. package/lib/Utils/process-message.d.ts.map +0 -1
  302. package/lib/Utils/process-message.js.map +0 -1
  303. package/lib/Utils/reporting-utils.d.ts +0 -11
  304. package/lib/Utils/reporting-utils.d.ts.map +0 -1
  305. package/lib/Utils/reporting-utils.js +0 -258
  306. package/lib/Utils/reporting-utils.js.map +0 -1
  307. package/lib/Utils/rich-message-utils.js +0 -387
  308. package/lib/Utils/signal.d.ts +0 -47
  309. package/lib/Utils/signal.d.ts.map +0 -1
  310. package/lib/Utils/signal.js.map +0 -1
  311. package/lib/Utils/stanza-ack.d.ts +0 -11
  312. package/lib/Utils/stanza-ack.d.ts.map +0 -1
  313. package/lib/Utils/stanza-ack.js +0 -38
  314. package/lib/Utils/stanza-ack.js.map +0 -1
  315. package/lib/Utils/sync-action-utils.d.ts +0 -19
  316. package/lib/Utils/sync-action-utils.d.ts.map +0 -1
  317. package/lib/Utils/sync-action-utils.js +0 -49
  318. package/lib/Utils/sync-action-utils.js.map +0 -1
  319. package/lib/Utils/tc-token-utils.d.ts +0 -37
  320. package/lib/Utils/tc-token-utils.d.ts.map +0 -1
  321. package/lib/Utils/tc-token-utils.js +0 -163
  322. package/lib/Utils/tc-token-utils.js.map +0 -1
  323. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -13
  324. package/lib/Utils/use-multi-file-auth-state.d.ts.map +0 -1
  325. package/lib/Utils/use-multi-file-auth-state.js.map +0 -1
  326. package/lib/Utils/validate-connection.d.ts +0 -11
  327. package/lib/Utils/validate-connection.d.ts.map +0 -1
  328. package/lib/Utils/validate-connection.js.map +0 -1
  329. package/lib/Utils/youtube.js +0 -44
  330. package/lib/WABinary/constants.d.ts +0 -28
  331. package/lib/WABinary/constants.d.ts.map +0 -1
  332. package/lib/WABinary/constants.js.map +0 -1
  333. package/lib/WABinary/decode.d.ts +0 -7
  334. package/lib/WABinary/decode.d.ts.map +0 -1
  335. package/lib/WABinary/decode.js.map +0 -1
  336. package/lib/WABinary/encode.d.ts +0 -3
  337. package/lib/WABinary/encode.d.ts.map +0 -1
  338. package/lib/WABinary/encode.js.map +0 -1
  339. package/lib/WABinary/generic-utils.d.ts +0 -15
  340. package/lib/WABinary/generic-utils.d.ts.map +0 -1
  341. package/lib/WABinary/generic-utils.js.map +0 -1
  342. package/lib/WABinary/index.d.ts +0 -6
  343. package/lib/WABinary/index.d.ts.map +0 -1
  344. package/lib/WABinary/index.js.map +0 -1
  345. package/lib/WABinary/jid-utils.d.ts +0 -48
  346. package/lib/WABinary/jid-utils.d.ts.map +0 -1
  347. package/lib/WABinary/jid-utils.js.map +0 -1
  348. package/lib/WABinary/types.d.ts +0 -19
  349. package/lib/WABinary/types.d.ts.map +0 -1
  350. package/lib/WABinary/types.js.map +0 -1
  351. package/lib/WAM/BinaryInfo.d.ts +0 -9
  352. package/lib/WAM/BinaryInfo.d.ts.map +0 -1
  353. package/lib/WAM/BinaryInfo.js.map +0 -1
  354. package/lib/WAM/constants.d.ts +0 -40
  355. package/lib/WAM/constants.d.ts.map +0 -1
  356. package/lib/WAM/constants.js.map +0 -1
  357. package/lib/WAM/encode.d.ts +0 -3
  358. package/lib/WAM/encode.d.ts.map +0 -1
  359. package/lib/WAM/encode.js.map +0 -1
  360. package/lib/WAM/index.d.ts +0 -4
  361. package/lib/WAM/index.d.ts.map +0 -1
  362. package/lib/WAM/index.js.map +0 -1
  363. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -10
  364. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +0 -1
  365. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +0 -1
  366. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -23
  367. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +0 -1
  368. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +0 -1
  369. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -13
  370. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +0 -1
  371. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +0 -1
  372. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -13
  373. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +0 -1
  374. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +0 -1
  375. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +0 -10
  376. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +0 -1
  377. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +0 -25
  378. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +0 -1
  379. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +0 -26
  380. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +0 -1
  381. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +0 -1
  382. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +0 -10
  383. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +0 -1
  384. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +0 -1
  385. package/lib/WAUSync/Protocols/index.d.ts +0 -6
  386. package/lib/WAUSync/Protocols/index.d.ts.map +0 -1
  387. package/lib/WAUSync/Protocols/index.js.map +0 -1
  388. package/lib/WAUSync/USyncQuery.d.ts +0 -30
  389. package/lib/WAUSync/USyncQuery.d.ts.map +0 -1
  390. package/lib/WAUSync/USyncQuery.js.map +0 -1
  391. package/lib/WAUSync/USyncUser.d.ts +0 -17
  392. package/lib/WAUSync/USyncUser.d.ts.map +0 -1
  393. package/lib/WAUSync/USyncUser.js.map +0 -1
  394. package/lib/WAUSync/index.d.ts +0 -4
  395. package/lib/WAUSync/index.d.ts.map +0 -1
  396. package/lib/WAUSync/index.js.map +0 -1
  397. package/lib/index.d.ts +0 -12
  398. package/lib/index.d.ts.map +0 -1
  399. package/lib/index.js.map +0 -1
@@ -1,30 +1,10 @@
1
1
  "use strict";
2
-
3
- const { prepareRichResponseMessage } = require('./rich-message-utils');
4
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
5
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
6
4
  };
7
5
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.assertMediaContent =
9
- exports.downloadMediaMessage =
10
- exports.aggregateMessageKeysNotFromMe =
11
- exports.updateMessageWithPollUpdate =
12
- exports.updateMessageWithReaction =
13
- exports.updateMessageWithReceipt =
14
- exports.getDevice =
15
- exports.extractMessageContent =
16
- exports.normalizeMessageContent =
17
- exports.getContentType =
18
- exports.generateWAMessage =
19
- exports.generateWAMessageFromContent =
20
- exports.generateWAMessageContent =
21
- exports.generateForwardMessageContent =
22
- exports.prepareDisappearingMessageSettingContent =
23
- exports.prepareWAMessageMedia =
24
- exports.generateLinkPreviewIfRequired =
25
- 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;
26
7
  exports.getAggregateVotesInPollMessage = getAggregateVotesInPollMessage;
27
-
28
8
  const boom_1 = require("@hapi/boom");
29
9
  const axios_1 = __importDefault(require("axios"));
30
10
  const crypto_1 = require("crypto");
@@ -44,6 +24,18 @@ const MIMETYPE_MAP = {
44
24
  sticker: 'image/webp',
45
25
  'product-catalog-image': 'image/jpeg',
46
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);
47
39
  const MessageTypeProto = {
48
40
  'image': Types_1.WAProto.Message.ImageMessage,
49
41
  'video': Types_1.WAProto.Message.VideoMessage,
@@ -52,12 +44,96 @@ const MessageTypeProto = {
52
44
  'document': Types_1.WAProto.Message.DocumentMessage,
53
45
  };
54
46
  const ButtonType = WAProto_1.proto.Message.ButtonsMessage.HeaderType;
55
- /**
56
- * Uses a regex to test whether the string contains a URL, and returns the URL if it does.
57
- * @param text eg. hello https://google.com
58
- * @returns the URL, eg. https://google.com
59
- */
47
+
60
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
+ };
61
137
  exports.extractUrlFromText = extractUrlFromText;
62
138
  const generateLinkPreviewIfRequired = async (text, getUrlInfo, logger) => {
63
139
  const url = (0, exports.extractUrlFromText)(text);
@@ -89,140 +165,124 @@ const assertColor = async (color) => {
89
165
  const prepareWAMessageMedia = async (message, options) => {
90
166
  const logger = options.logger;
91
167
  let mediaType;
168
+ let sourceMediaKey;
92
169
  for (const key of Defaults_1.MEDIA_KEYS) {
93
170
  if (key in message) {
94
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
+ }
95
183
  }
96
184
  }
97
185
  if (!mediaType) {
98
186
  throw new boom_1.Boom('Invalid media type', { statusCode: 400 });
99
187
  }
100
-
101
-
102
188
  const uploadData = {
103
189
  ...message,
104
- media: message[mediaType]
190
+ media: message[sourceMediaKey]
105
191
  };
106
-
107
- delete uploadData[mediaType];
108
-
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
+ }
109
198
  const cacheableKey = typeof uploadData.media === 'object' &&
110
199
  ('url' in uploadData.media) &&
111
200
  !!uploadData.media.url &&
112
201
  !!options.mediaCache &&
113
- mediaType + ':' + uploadData.media.url.toString();
114
-
202
+ (mediaType + ':' + uploadData.media.url.toString());
115
203
  if (mediaType === 'document' && !uploadData.fileName) {
116
204
  uploadData.fileName = 'file';
117
205
  }
118
-
119
206
  if (!uploadData.mimetype) {
120
207
  uploadData.mimetype = MIMETYPE_MAP[mediaType];
121
208
  }
122
-
209
+
123
210
  if (cacheableKey) {
124
211
  const mediaBuff = options.mediaCache.get(cacheableKey);
125
212
  if (mediaBuff) {
126
- logger?.debug({ cacheableKey }, 'got media cache hit');
213
+ logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'got media cache hit');
127
214
  const obj = Types_1.WAProto.Message.decode(mediaBuff);
128
215
  const key = `${mediaType}Message`;
129
216
  Object.assign(obj[key], { ...uploadData, media: undefined });
130
217
  return obj;
131
218
  }
132
219
  }
133
-
134
220
  const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined';
135
221
  const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') &&
136
- typeof uploadData['jpegThumbnail'] === 'undefined';
137
-
138
- // MODIFIED BY VYZEN
139
- const requiresWaveformProcessing = mediaType === 'audio' && (uploadData.ptt === true || !!options.backgroundColor);
140
- // MODIFIED BY VYZEN
141
- const requiresAudioBackground = options.backgroundColor && mediaType === 'audio';
142
-
222
+ (typeof uploadData['jpegThumbnail'] === 'undefined');
223
+ const requiresWaveformProcessing = mediaType === 'audio' && uploadData.ptt === true;
224
+ const requiresAudioBackground = options.backgroundColor && mediaType === 'audio' && uploadData.ptt === true;
143
225
  const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation;
144
-
145
- const { mediaKey, encWriteStream, bodyPath, fileEncSha256, fileSha256, fileLength, didSaveToTmpPath, opusConverted } =
146
- await (options.newsletter ? messages_media_1.prepareStream : messages_media_1.encryptedStream)(
147
- uploadData.media,
148
- options.mediaTypeOverride || mediaType,
149
- {
150
- logger,
151
- saveOriginalFileIfRequired: requiresOriginalForSomeProcessing,
152
- opts: options.options,
153
- isPtt: uploadData.ptt,
154
- forceOpus: (mediaType === 'audio' && uploadData.mimetype && uploadData.mimetype.includes('opus')),
155
- convertVideo: (mediaType === 'video')
156
- }
157
- );
158
-
159
- if (mediaType === 'audio' && opusConverted) {
160
- uploadData.mimetype = 'audio/ogg; codecs=opus';
161
- }
162
-
163
- const fileEncSha256B64 = (options.newsletter ? fileSha256 : fileEncSha256 ?? fileSha256).toString('base64');
164
-
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');
165
234
  const [{ mediaUrl, directPath, handle }] = await Promise.all([
166
235
  (async () => {
167
236
  const result = await options.upload(encWriteStream, { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs });
168
- logger?.debug({ mediaType, cacheableKey }, 'uploaded media');
237
+ logger === null || logger === void 0 ? void 0 : logger.debug({ mediaType, cacheableKey }, 'uploaded media');
169
238
  return result;
170
239
  })(),
171
240
  (async () => {
172
241
  try {
173
242
  if (requiresThumbnailComputation) {
174
- const { thumbnail, originalImageDimensions } = await messages_media_1.generateThumbnail(bodyPath, mediaType, options);
243
+ const { thumbnail, originalImageDimensions } = await (0, messages_media_1.generateThumbnail)(bodyPath, mediaType, options);
175
244
  uploadData.jpegThumbnail = thumbnail;
176
245
  if (!uploadData.width && originalImageDimensions) {
177
246
  uploadData.width = originalImageDimensions.width;
178
247
  uploadData.height = originalImageDimensions.height;
179
- logger?.debug('set dimensions');
248
+ logger === null || logger === void 0 ? void 0 : logger.debug('set dimensions');
180
249
  }
181
- logger?.debug('generated thumbnail');
250
+ logger === null || logger === void 0 ? void 0 : logger.debug('generated thumbnail');
182
251
  }
183
252
  if (requiresDurationComputation) {
184
- uploadData.seconds = await messages_media_1.getAudioDuration(bodyPath);
185
- 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');
186
255
  }
187
-
188
- // MODIFIED BY VYZEN
189
256
  if (requiresWaveformProcessing) {
190
- try {
191
- uploadData.waveform = await messages_media_1.getAudioWaveform(bodyPath, logger);
192
- } catch (err) {
193
- logger?.warn('Failed to generate waveform, using fallback');
194
- }
195
-
196
- if (!uploadData.waveform) {
197
- 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]);
198
- }
199
- 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');
200
259
  }
201
-
202
260
  if (requiresAudioBackground) {
203
261
  uploadData.backgroundArgb = await assertColor(options.backgroundColor);
204
- logger?.debug('computed backgroundColor audio status');
262
+ logger === null || logger === void 0 ? void 0 : logger.debug('computed backgroundColor audio status');
205
263
  }
206
- } catch (error) {
207
- 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');
208
267
  }
209
268
  })(),
210
269
  ])
211
270
  .finally(async () => {
212
- if (!Buffer.isBuffer(encWriteStream)) {
213
- 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');
214
280
  }
215
- if (didSaveToTmpPath && bodyPath) {
216
- try {
217
- await fs_1.promises.access(bodyPath);
218
- await fs_1.promises.unlink(bodyPath);
219
- logger?.debug('removed tmp file');
220
- } catch (error) {
221
- logger?.warn('failed to remove tmp file');
222
- }
281
+ catch (error) {
282
+ logger === null || logger === void 0 ? void 0 : logger.warn('failed to remove tmp file');
223
283
  }
224
- });
225
-
284
+ }
285
+ });
226
286
  const obj = Types_1.WAProto.Message.fromObject({
227
287
  [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({
228
288
  url: handle ? undefined : mediaUrl,
@@ -231,25 +291,21 @@ const prepareWAMessageMedia = async (message, options) => {
231
291
  fileEncSha256: fileEncSha256,
232
292
  fileSha256,
233
293
  fileLength,
234
- mediaKeyTimestamp: handle ? undefined : generics_1.unixTimestampSeconds(),
294
+ mediaKeyTimestamp: handle ? undefined : (0, generics_1.unixTimestampSeconds)(),
235
295
  ...uploadData,
236
296
  media: undefined
237
297
  })
238
298
  });
239
-
240
299
  if (uploadData.ptv) {
241
300
  obj.ptvMessage = obj.videoMessage;
242
301
  delete obj.videoMessage;
243
302
  }
244
-
245
303
  if (cacheableKey) {
246
- logger?.debug({ cacheableKey }, 'set cache');
304
+ logger === null || logger === void 0 ? void 0 : logger.debug({ cacheableKey }, 'set cache');
247
305
  options.mediaCache.set(cacheableKey, Types_1.WAProto.Message.encode(obj).finish());
248
306
  }
249
-
250
307
  return obj;
251
308
  };
252
-
253
309
  exports.prepareWAMessageMedia = prepareWAMessageMedia;
254
310
  const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
255
311
  ephemeralExpiration = ephemeralExpiration || 0;
@@ -266,11 +322,7 @@ const prepareDisappearingMessageSettingContent = (ephemeralExpiration) => {
266
322
  return Types_1.WAProto.Message.fromObject(content);
267
323
  };
268
324
  exports.prepareDisappearingMessageSettingContent = prepareDisappearingMessageSettingContent;
269
- /**
270
- * Generate forwarded message content like WA does
271
- * @param message the message to forward
272
- * @param options.forceForward will show the message as forwarded even if it is from you
273
- */
325
+
274
326
  const generateForwardMessageContent = (message, forceForward) => {
275
327
  var _a;
276
328
  let content = message.message;
@@ -297,19 +349,166 @@ const generateForwardMessageContent = (message, forceForward) => {
297
349
  return content;
298
350
  };
299
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
+ };
300
502
  const generateWAMessageContent = async (message, options) => {
301
503
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
302
504
  var _p, _q;
303
505
  let m = {};
304
- if (
305
- 'code' in message ||
306
- 'links' in message ||
307
- 'table' in message ||
308
- 'richResponse' in message
309
- ) {
310
- m = prepareRichResponseMessage(message);
311
- }
312
- else if ('text' in message) {
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);
511
+ if ('text' in message) {
313
512
  const extContent = { text: message.text };
314
513
  let urlInfo = message.linkPreview;
315
514
  if (typeof urlInfo === 'undefined') {
@@ -383,8 +582,8 @@ const generateWAMessageContent = async (message, options) => {
383
582
  m.groupInviteMessage.caption = message.groupInvite.text;
384
583
  m.groupInviteMessage.groupJid = message.groupInvite.jid;
385
584
  m.groupInviteMessage.groupName = message.groupInvite.subject;
386
-
387
-
585
+ //TODO: use built-in interface and get disappearing mode info etc.
586
+ //TODO: cache / use store!?
388
587
  if (options.getProfilePicUrl) {
389
588
  const pfpUrl = await options.getProfilePicUrl(message.groupInvite.jid, 'preview');
390
589
  if (pfpUrl) {
@@ -426,6 +625,16 @@ const generateWAMessageContent = async (message, options) => {
426
625
  }
427
626
  else if ('buttonReply' in message) {
428
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;
429
638
  case 'template':
430
639
  m.templateButtonReplyMessage = {
431
640
  selectedDisplayText: message.buttonReply.displayText,
@@ -440,6 +649,19 @@ const generateWAMessageContent = async (message, options) => {
440
649
  type: WAProto_1.proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT,
441
650
  };
442
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;
443
665
  }
444
666
  }
445
667
  else if ('ptv' in message && message.ptv) {
@@ -485,7 +707,7 @@ const generateWAMessageContent = async (message, options) => {
485
707
  throw new boom_1.Boom(`poll.selectableCount in poll should be >= 0 and <= ${message.poll.values.length}`, { statusCode: 400 });
486
708
  }
487
709
  m.messageContextInfo = {
488
-
710
+ // encKey
489
711
  messageSecret: message.poll.messageSecret || (0, crypto_1.randomBytes)(32),
490
712
  };
491
713
  const pollCreationMessage = {
@@ -522,39 +744,116 @@ const generateWAMessageContent = async (message, options) => {
522
744
  m.newsletterAdminInviteMessage.newsletterName = message.inviteAdmin.subject;
523
745
  m.newsletterAdminInviteMessage.jpegThumbnail = message.inviteAdmin.thumbnail;
524
746
  }
525
- else if ('requestPayment' in message) {
526
- const sticker = ((_c = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _c === void 0 ? void 0 : _c.sticker) ?
527
- 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)
528
- : null;
529
- let notes = {};
530
- if ((_e = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _e === void 0 ? void 0 : _e.sticker) {
531
- notes = {
532
- stickerMessage: {
533
- ...sticker === null || sticker === void 0 ? void 0 : sticker.stickerMessage,
534
- contextInfo: (_f = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _f === void 0 ? void 0 : _f.contextInfo
535
- }
536
- };
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 });
537
750
  }
538
- else if (message.requestPayment.note) {
539
- notes = {
540
- extendedTextMessage: {
541
- text: message.requestPayment.note,
542
- contextInfo: (_g = message === null || message === void 0 ? void 0 : message.requestPayment) === null || _g === void 0 ? void 0 : _g.contextInfo,
543
- }
544
- };
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 });
545
766
  }
546
- else {
547
- 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 });
548
769
  }
770
+ const bg = requestPayment.background;
549
771
  m.requestPaymentMessage = Types_1.WAProto.Message.RequestPaymentMessage.fromObject({
550
- expiryTimestamp: message.requestPayment.expiry,
551
- amount1000: message.requestPayment.amount,
552
- currencyCodeIso4217: message.requestPayment.currency,
553
- requestFrom: message.requestPayment.from,
554
- noteMessage: { ...notes },
555
- 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 } : {})
556
778
  });
557
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
+ }
558
857
  else if ('sharePhoneNumber' in message) {
559
858
  m.protocolMessage = {
560
859
  type: WAProto_1.proto.Message.ProtocolMessage.Type.SHARE_PHONE_NUMBER
@@ -563,6 +862,17 @@ const generateWAMessageContent = async (message, options) => {
563
862
  else if ('requestPhoneNumber' in message) {
564
863
  m.requestPhoneNumberMessage = {};
565
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
+ }
566
876
  else if ('album' in message) {
567
877
  const imageMessages = message.album.filter(item => 'image' in item);
568
878
  const videoMessages = message.album.filter(item => 'video' in item);
@@ -571,39 +881,91 @@ const generateWAMessageContent = async (message, options) => {
571
881
  expectedVideoCount: videoMessages.length,
572
882
  });
573
883
  }
574
- 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)) {
575
931
  m = await (0, exports.prepareWAMessageMedia)(message, options);
576
932
  }
577
933
  if ('buttons' in message && !!message.buttons) {
578
- const buttonsMessage = {
579
- 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
+ })
580
938
  };
581
939
  if ('text' in message) {
582
- buttonsMessage.contentText = message.text;
583
- buttonsMessage.headerType = ButtonType.EMPTY;
584
- }
585
- else {
586
- if ('caption' in message) {
587
- buttonsMessage.contentText = message.caption;
588
- }
589
- const type = Object.keys(m)[0].replace('Message', '').toUpperCase();
590
- buttonsMessage.headerType = ButtonType[type];
591
- Object.assign(buttonsMessage, m);
940
+ interactiveMessage.body = { text: message.text };
592
941
  }
593
- if ('title' in message && !!message.title) {
594
- buttonsMessage.text = message.title,
595
- 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);
596
950
  }
597
- if ('footer' in message && !!message.footer) {
598
- 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
+ };
599
957
  }
600
- if ('contextInfo' in message && !!message.contextInfo) {
601
- 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
+ }
602
963
  }
603
- if ('mentions' in message && !!message.mentions) {
604
- buttonsMessage.contextInfo = { mentionedJid: message.mentions };
964
+ if ('footer' in message && !!message.footer) {
965
+ interactiveMessage.footer = { text: message.footer };
605
966
  }
606
- m = { buttonsMessage };
967
+ applyContextInfoAndMentions(interactiveMessage, message);
968
+ m = { interactiveMessage };
607
969
  }
608
970
  else if ('templateButtons' in message && !!message.templateButtons) {
609
971
  const msg = {
@@ -639,6 +1001,26 @@ const generateWAMessageContent = async (message, options) => {
639
1001
  };
640
1002
  m = { listMessage };
641
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
+ }
642
1024
  if ('interactiveButtons' in message && !!message.interactiveButtons) {
643
1025
  const interactiveMessage = {
644
1026
  nativeFlowMessage: Types_1.WAProto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
@@ -657,7 +1039,7 @@ const generateWAMessageContent = async (message, options) => {
657
1039
  interactiveMessage.header = {
658
1040
  title: message.title,
659
1041
  subtitle: message.subtitle,
660
- hasMediaAttachment: (_j = message === null || message === void 0 ? void 0 : message.media) !== null && _j !== void 0 ? _j : false,
1042
+ hasMediaAttachment: Boolean(message.hasMediaAttachment),
661
1043
  };
662
1044
  Object.assign(interactiveMessage.header, m);
663
1045
  }
@@ -670,23 +1052,18 @@ const generateWAMessageContent = async (message, options) => {
670
1052
  interactiveMessage.header = {
671
1053
  title: message.title,
672
1054
  subtitle: message.subtitle,
673
- hasMediaAttachment: (_k = message === null || message === void 0 ? void 0 : message.media) !== null && _k !== void 0 ? _k : false,
1055
+ hasMediaAttachment: Boolean(message.hasMediaAttachment),
674
1056
  };
675
1057
  Object.assign(interactiveMessage.header, m);
676
1058
  }
677
- if ('contextInfo' in message && !!message.contextInfo) {
678
- interactiveMessage.contextInfo = message.contextInfo;
679
- }
680
- if ('mentions' in message && !!message.mentions) {
681
- interactiveMessage.contextInfo = { mentionedJid: message.mentions };
682
- }
1059
+ applyContextInfoAndMentions(interactiveMessage, message);
683
1060
  m = { interactiveMessage };
684
1061
  }
685
1062
  if ('shop' in message && !!message.shop) {
686
1063
  const interactiveMessage = {
687
1064
  shopStorefrontMessage: Types_1.WAProto.Message.InteractiveMessage.ShopMessage.fromObject({
688
- surface: message.shop,
689
- 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
690
1067
  })
691
1068
  };
692
1069
  if ('text' in message) {
@@ -701,7 +1078,7 @@ const generateWAMessageContent = async (message, options) => {
701
1078
  interactiveMessage.header = {
702
1079
  title: message.title,
703
1080
  subtitle: message.subtitle,
704
- hasMediaAttachment: (_l = message === null || message === void 0 ? void 0 : message.media) !== null && _l !== void 0 ? _l : false,
1081
+ hasMediaAttachment: Boolean(message.hasMediaAttachment),
705
1082
  };
706
1083
  Object.assign(interactiveMessage.header, m);
707
1084
  }
@@ -714,25 +1091,137 @@ const generateWAMessageContent = async (message, options) => {
714
1091
  interactiveMessage.header = {
715
1092
  title: message.title,
716
1093
  subtitle: message.subtitle,
717
- hasMediaAttachment: (_m = message === null || message === void 0 ? void 0 : message.media) !== null && _m !== void 0 ? _m : false,
1094
+ hasMediaAttachment: Boolean(message.hasMediaAttachment),
718
1095
  };
719
1096
  Object.assign(interactiveMessage.header, m);
720
1097
  }
721
- if ('contextInfo' in message && !!message.contextInfo) {
722
- interactiveMessage.contextInfo = message.contextInfo;
1098
+ applyContextInfoAndMentions(interactiveMessage, message);
1099
+ m = { interactiveMessage };
1100
+ if ('interactiveAsTemplate' in message && message.interactiveAsTemplate !== false) {
1101
+ m = { templateMessage: { interactiveMessageTemplate: interactiveMessage } };
723
1102
  }
724
- if ('mentions' in message && !!message.mentions) {
725
- 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
+ });
726
1128
  }
727
- 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);
728
1199
  }
729
1200
  if ('viewOnce' in message && !!message.viewOnce) {
730
1201
  m = { viewOnceMessage: { message: m } };
731
1202
  }
732
- 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)) {
733
1217
  const [messageType] = Object.keys(m);
734
- m[messageType].contextInfo = m[messageType] || {};
735
- 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
+ }
736
1225
  }
737
1226
  if ('edit' in message) {
738
1227
  m = {
@@ -747,8 +1236,34 @@ const generateWAMessageContent = async (message, options) => {
747
1236
  if ('contextInfo' in message && !!message.contextInfo) {
748
1237
  const [messageType] = Object.keys(m);
749
1238
  m[messageType] = m[messageType] || {};
750
- 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
+ };
751
1265
  }
1266
+ applyDefaultNewsletterAnnotation(m, message);
752
1267
  return Types_1.WAProto.Message.fromObject(m);
753
1268
  };
754
1269
  exports.generateWAMessageContent = generateWAMessageContent;
@@ -798,7 +1313,7 @@ const generateWAMessageFromContent = (jid, message, options) => {
798
1313
  innerMessage[key].contextInfo = {
799
1314
  ...(innerMessage[key].contextInfo || {}),
800
1315
  expiration: options.ephemeralExpiration || Defaults_1.WA_DEFAULT_EPHEMERAL,
801
- //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString()
1316
+
802
1317
  };
803
1318
  }
804
1319
  message = Types_1.WAProto.Message.fromObject(message);
@@ -821,10 +1336,10 @@ const generateWAMessage = async (jid, content, options) => {
821
1336
  var _a;
822
1337
 
823
1338
  options.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) === null || _a === void 0 ? void 0 : _a.child({ msgId: options.messageId });
824
- 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);
825
1340
  };
826
1341
  exports.generateWAMessage = generateWAMessage;
827
- /** Get the key to access the true type of content */
1342
+
828
1343
  const getContentType = (content) => {
829
1344
  if (content) {
830
1345
  const keys = Object.keys(content);
@@ -833,12 +1348,7 @@ const getContentType = (content) => {
833
1348
  }
834
1349
  };
835
1350
  exports.getContentType = getContentType;
836
- /**
837
- * Normalizes ephemeral, view once messages to regular message content
838
- * Eg. image messages in ephemeral messages, in view once messages etc.
839
- * @param content
840
- * @returns
841
- */
1351
+
842
1352
  const normalizeMessageContent = (content) => {
843
1353
  if (!content) {
844
1354
  return undefined;
@@ -875,14 +1385,12 @@ const normalizeMessageContent = (content) => {
875
1385
  || (message === null || message === void 0 ? void 0 : message.botTaskMessage)
876
1386
  || (message === null || message === void 0 ? void 0 : message.questionMessage)
877
1387
  || (message === null || message === void 0 ? void 0 : message.groupStatusMessageV2)
878
- || (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));
879
1390
  }
880
1391
  };
881
1392
  exports.normalizeMessageContent = normalizeMessageContent;
882
- /**
883
- * Extract the true message content from a message
884
- * Eg. extracts the inner message from a disappearing message/view once message
885
- */
1393
+
886
1394
  const extractMessageContent = (content) => {
887
1395
  var _a, _b, _c, _d, _e, _f;
888
1396
  const extractFromTemplateMessage = (msg) => {
@@ -922,16 +1430,14 @@ const extractMessageContent = (content) => {
922
1430
  return content;
923
1431
  };
924
1432
  exports.extractMessageContent = extractMessageContent;
925
- /**
926
- * Returns the device predicted by message ID
927
- */
1433
+
928
1434
  const getDevice = (id) => /^3A.{18}$/.test(id) ? 'ios' :
929
1435
  /^3E.{20}$/.test(id) ? 'web' :
930
1436
  /^(.{21}|.{32})$/.test(id) ? 'android' :
931
1437
  /^(3F|.{18}$)/.test(id) ? 'desktop' :
932
1438
  'unknown';
933
1439
  exports.getDevice = getDevice;
934
- /** Upserts a receipt in the message */
1440
+
935
1441
  const updateMessageWithReceipt = (msg, receipt) => {
936
1442
  msg.userReceipt = msg.userReceipt || [];
937
1443
  const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid);
@@ -943,7 +1449,7 @@ const updateMessageWithReceipt = (msg, receipt) => {
943
1449
  }
944
1450
  };
945
1451
  exports.updateMessageWithReceipt = updateMessageWithReceipt;
946
- /** Update the message with a new reaction */
1452
+
947
1453
  const updateMessageWithReaction = (msg, reaction) => {
948
1454
  const authorID = (0, generics_1.getKeyAuthor)(reaction.key);
949
1455
  const reactions = (msg.reactions || [])
@@ -953,7 +1459,7 @@ const updateMessageWithReaction = (msg, reaction) => {
953
1459
  msg.reactions = reactions;
954
1460
  };
955
1461
  exports.updateMessageWithReaction = updateMessageWithReaction;
956
- /** Update the message with a new poll update */
1462
+
957
1463
  const updateMessageWithPollUpdate = (msg, update) => {
958
1464
  var _a, _b;
959
1465
  const authorID = (0, generics_1.getKeyAuthor)(update.pollUpdateMessageKey);
@@ -965,12 +1471,7 @@ const updateMessageWithPollUpdate = (msg, update) => {
965
1471
  msg.pollUpdates = reactions;
966
1472
  };
967
1473
  exports.updateMessageWithPollUpdate = updateMessageWithPollUpdate;
968
- /**
969
- * Aggregates all poll updates in a poll.
970
- * @param msg the poll creation message
971
- * @param meId your jid
972
- * @returns A list of options & their voters
973
- */
1474
+
974
1475
  function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
975
1476
  var _a, _b, _c;
976
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) || [];
@@ -1002,7 +1503,7 @@ function getAggregateVotesInPollMessage({ message, pollUpdates }, meId) {
1002
1503
  }
1003
1504
  return Object.values(voteHashMap);
1004
1505
  }
1005
- /** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */
1506
+
1006
1507
  const aggregateMessageKeysNotFromMe = (keys) => {
1007
1508
  const keyMap = {};
1008
1509
  for (const { remoteJid, id, participant, fromMe } of keys) {
@@ -1022,9 +1523,7 @@ const aggregateMessageKeysNotFromMe = (keys) => {
1022
1523
  };
1023
1524
  exports.aggregateMessageKeysNotFromMe = aggregateMessageKeysNotFromMe;
1024
1525
  const REUPLOAD_REQUIRED_STATUS = [410, 404];
1025
- /**
1026
- * Downloads the given message. Throws an error if it's not a media message
1027
- */
1526
+
1028
1527
  const downloadMediaMessage = async (message, type, options, ctx) => {
1029
1528
  const result = await downloadMsg()
1030
1529
  .catch(async (error) => {
@@ -1078,7 +1577,7 @@ const downloadMediaMessage = async (message, type, options, ctx) => {
1078
1577
  }
1079
1578
  };
1080
1579
  exports.downloadMediaMessage = downloadMediaMessage;
1081
- /** Checks whether the given message is a media message; if it is returns the inner content */
1580
+
1082
1581
  const assertMediaContent = (content) => {
1083
1582
  content = (0, exports.extractMessageContent)(content);
1084
1583
  const mediaContent = (content === null || content === void 0 ? void 0 : content.documentMessage)
@@ -1093,21 +1592,36 @@ const assertMediaContent = (content) => {
1093
1592
  };
1094
1593
  exports.assertMediaContent = assertMediaContent;
1095
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
+ */
1096
1598
  const toJid = (id) => {
1097
1599
  if (!id)
1098
1600
  return '';
1099
- if (id.endsWith('@lid'))
1100
- return id.replace('@lid', '@s.whatsapp.net');
1101
1601
  if (id.includes('@'))
1102
1602
  return id;
1103
1603
  return `${id}@s.whatsapp.net`;
1104
1604
  };
1105
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
+ */
1106
1609
  const getSenderLid = (message) => {
1107
- const sender = message.key.participant || message.key.remoteJid;
1108
- const user = (0, WABinary_1.jidDecode)(sender)?.user || '';
1109
- const lid = (0, WABinary_1.jidEncode)(user, 'lid');
1110
- console.log('sender lid:', lid);
1111
- 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: '' };
1112
1626
  };
1113
1627
  exports.getSenderLid = getSenderLid;