yowtech 1.0.1-rv

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 (459) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +82 -0
  3. package/WAProto/W +1 -0
  4. package/WAProto/WAProto.proto +6035 -0
  5. package/WAProto/index.d.ts +15932 -0
  6. package/WAProto/index.js +115856 -0
  7. package/engine-requirements.js +13 -0
  8. package/lib/Defaults/D +1 -0
  9. package/lib/Defaults/index.d.ts +145 -0
  10. package/lib/Defaults/index.d.ts.map +1 -0
  11. package/lib/Defaults/index.js +152 -0
  12. package/lib/Defaults/index.js.map +1 -0
  13. package/lib/Signal/Group/G +1 -0
  14. package/lib/Signal/Group/ciphertext-message.d.ts +10 -0
  15. package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
  16. package/lib/Signal/Group/ciphertext-message.js +12 -0
  17. package/lib/Signal/Group/ciphertext-message.js.map +1 -0
  18. package/lib/Signal/Group/group-session-builder.d.ts +8 -0
  19. package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
  20. package/lib/Signal/Group/group-session-builder.js +30 -0
  21. package/lib/Signal/Group/group-session-builder.js.map +1 -0
  22. package/lib/Signal/Group/group_cipher.d.ts +11 -0
  23. package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
  24. package/lib/Signal/Group/group_cipher.js +82 -0
  25. package/lib/Signal/Group/group_cipher.js.map +1 -0
  26. package/lib/Signal/Group/index.d.ts +12 -0
  27. package/lib/Signal/Group/index.d.ts.map +1 -0
  28. package/lib/Signal/Group/index.js +12 -0
  29. package/lib/Signal/Group/index.js.map +1 -0
  30. package/lib/Signal/Group/keyhelper.d.ts +7 -0
  31. package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
  32. package/lib/Signal/Group/keyhelper.js +18 -0
  33. package/lib/Signal/Group/keyhelper.js.map +1 -0
  34. package/lib/Signal/Group/sender-chain-key.d.ts +14 -0
  35. package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
  36. package/lib/Signal/Group/sender-chain-key.js +26 -0
  37. package/lib/Signal/Group/sender-chain-key.js.map +1 -0
  38. package/lib/Signal/Group/sender-key-distribution-message.d.ts +17 -0
  39. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
  40. package/lib/Signal/Group/sender-key-distribution-message.js +63 -0
  41. package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
  42. package/lib/Signal/Group/sender-key-message.d.ts +19 -0
  43. package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
  44. package/lib/Signal/Group/sender-key-message.js +66 -0
  45. package/lib/Signal/Group/sender-key-message.js.map +1 -0
  46. package/lib/Signal/Group/sender-key-name.d.ts +12 -0
  47. package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
  48. package/lib/Signal/Group/sender-key-name.js +48 -0
  49. package/lib/Signal/Group/sender-key-name.js.map +1 -0
  50. package/lib/Signal/Group/sender-key-record.d.ts +13 -0
  51. package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
  52. package/lib/Signal/Group/sender-key-record.js +41 -0
  53. package/lib/Signal/Group/sender-key-record.js.map +1 -0
  54. package/lib/Signal/Group/sender-key-state.d.ts +17 -0
  55. package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
  56. package/lib/Signal/Group/sender-key-state.js +84 -0
  57. package/lib/Signal/Group/sender-key-state.js.map +1 -0
  58. package/lib/Signal/Group/sender-message-key.d.ts +12 -0
  59. package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
  60. package/lib/Signal/Group/sender-message-key.js +26 -0
  61. package/lib/Signal/Group/sender-message-key.js.map +1 -0
  62. package/lib/Signal/S +1 -0
  63. package/lib/Signal/libsignal.d.ts +55 -0
  64. package/lib/Signal/libsignal.d.ts.map +1 -0
  65. package/lib/Signal/libsignal.js +431 -0
  66. package/lib/Signal/libsignal.js.map +1 -0
  67. package/lib/Signal/lid-mapping.d.ts +21 -0
  68. package/lib/Signal/lid-mapping.d.ts.map +1 -0
  69. package/lib/Signal/lid-mapping.js +277 -0
  70. package/lib/Signal/lid-mapping.js.map +1 -0
  71. package/lib/Socket/Client/C +1 -0
  72. package/lib/Socket/Client/index.d.ts +3 -0
  73. package/lib/Socket/Client/index.d.ts.map +1 -0
  74. package/lib/Socket/Client/index.js +3 -0
  75. package/lib/Socket/Client/index.js.map +1 -0
  76. package/lib/Socket/Client/types.d.ts +6 -0
  77. package/lib/Socket/Client/types.d.ts.map +1 -0
  78. package/lib/Socket/Client/types.js +11 -0
  79. package/lib/Socket/Client/types.js.map +1 -0
  80. package/lib/Socket/Client/websocket.d.ts +13 -0
  81. package/lib/Socket/Client/websocket.d.ts.map +1 -0
  82. package/lib/Socket/Client/websocket.js +54 -0
  83. package/lib/Socket/Client/websocket.js.map +1 -0
  84. package/lib/Socket/business.d.ts +395 -0
  85. package/lib/Socket/business.d.ts.map +1 -0
  86. package/lib/Socket/business.js +380 -0
  87. package/lib/Socket/business.js.map +1 -0
  88. package/lib/Socket/chats.d.ts +144 -0
  89. package/lib/Socket/chats.d.ts.map +1 -0
  90. package/lib/Socket/chats.js +1219 -0
  91. package/lib/Socket/chats.js.map +1 -0
  92. package/lib/Socket/communities.d.ts +562 -0
  93. package/lib/Socket/communities.d.ts.map +1 -0
  94. package/lib/Socket/communities.js +432 -0
  95. package/lib/Socket/communities.js.map +1 -0
  96. package/lib/Socket/groups.d.ts +286 -0
  97. package/lib/Socket/groups.d.ts.map +1 -0
  98. package/lib/Socket/groups.js +348 -0
  99. package/lib/Socket/groups.js.map +1 -0
  100. package/lib/Socket/index.d.ts +530 -0
  101. package/lib/Socket/index.d.ts.map +1 -0
  102. package/lib/Socket/index.js +22 -0
  103. package/lib/Socket/index.js.map +1 -0
  104. package/lib/Socket/messages-recv.d.ts +334 -0
  105. package/lib/Socket/messages-recv.d.ts.map +1 -0
  106. package/lib/Socket/messages-recv.js +1797 -0
  107. package/lib/Socket/messages-recv.js.map +1 -0
  108. package/lib/Socket/messages-send.d.ts +330 -0
  109. package/lib/Socket/messages-send.d.ts.map +1 -0
  110. package/lib/Socket/messages-send.js +1396 -0
  111. package/lib/Socket/messages-send.js.map +1 -0
  112. package/lib/Socket/mex.d.ts +2 -0
  113. package/lib/Socket/mex.d.ts.map +1 -0
  114. package/lib/Socket/mex.js +42 -0
  115. package/lib/Socket/mex.js.map +1 -0
  116. package/lib/Socket/newsletter.d.ts +283 -0
  117. package/lib/Socket/newsletter.d.ts.map +1 -0
  118. package/lib/Socket/newsletter.js +226 -0
  119. package/lib/Socket/newsletter.js.map +1 -0
  120. package/lib/Socket/socket.d.ts +61 -0
  121. package/lib/Socket/socket.d.ts.map +1 -0
  122. package/lib/Socket/socket.js +970 -0
  123. package/lib/Socket/socket.js.map +1 -0
  124. package/lib/Store/S +1 -0
  125. package/lib/Store/index.d.ts +4 -0
  126. package/lib/Store/index.d.ts.map +1 -0
  127. package/lib/Store/index.js +4 -0
  128. package/lib/Store/index.js.map +1 -0
  129. package/lib/Store/make-in-memory-store.d.ts +63 -0
  130. package/lib/Store/make-in-memory-store.d.ts.map +1 -0
  131. package/lib/Store/make-in-memory-store.js +421 -0
  132. package/lib/Store/make-in-memory-store.js.map +1 -0
  133. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  134. package/lib/Store/make-ordered-dictionary.d.ts.map +1 -0
  135. package/lib/Store/make-ordered-dictionary.js +79 -0
  136. package/lib/Store/make-ordered-dictionary.js.map +1 -0
  137. package/lib/Store/object-repository.d.ts +11 -0
  138. package/lib/Store/object-repository.d.ts.map +1 -0
  139. package/lib/Store/object-repository.js +24 -0
  140. package/lib/Store/object-repository.js.map +1 -0
  141. package/lib/Types/Auth.d.ts +2 -0
  142. package/lib/Types/Auth.d.ts.map +1 -0
  143. package/lib/Types/Auth.js +2 -0
  144. package/lib/Types/Auth.js.map +1 -0
  145. package/lib/Types/Bussines.d.ts +2 -0
  146. package/lib/Types/Bussines.d.ts.map +1 -0
  147. package/lib/Types/Bussines.js +2 -0
  148. package/lib/Types/Bussines.js.map +1 -0
  149. package/lib/Types/Call.d.ts +2 -0
  150. package/lib/Types/Call.d.ts.map +1 -0
  151. package/lib/Types/Call.js +2 -0
  152. package/lib/Types/Call.js.map +1 -0
  153. package/lib/Types/Chat.d.ts +2 -0
  154. package/lib/Types/Chat.d.ts.map +1 -0
  155. package/lib/Types/Chat.js +8 -0
  156. package/lib/Types/Chat.js.map +1 -0
  157. package/lib/Types/Contact.d.ts +2 -0
  158. package/lib/Types/Contact.d.ts.map +1 -0
  159. package/lib/Types/Contact.js +2 -0
  160. package/lib/Types/Contact.js.map +1 -0
  161. package/lib/Types/Events.d.ts +2 -0
  162. package/lib/Types/Events.d.ts.map +1 -0
  163. package/lib/Types/Events.js +2 -0
  164. package/lib/Types/Events.js.map +1 -0
  165. package/lib/Types/GroupMetadata.d.ts +2 -0
  166. package/lib/Types/GroupMetadata.d.ts.map +1 -0
  167. package/lib/Types/GroupMetadata.js +2 -0
  168. package/lib/Types/GroupMetadata.js.map +1 -0
  169. package/lib/Types/Label.d.ts +3 -0
  170. package/lib/Types/Label.d.ts.map +1 -0
  171. package/lib/Types/Label.js +25 -0
  172. package/lib/Types/Label.js.map +1 -0
  173. package/lib/Types/LabelAssociation.d.ts +3 -0
  174. package/lib/Types/LabelAssociation.d.ts.map +1 -0
  175. package/lib/Types/LabelAssociation.js +7 -0
  176. package/lib/Types/LabelAssociation.js.map +1 -0
  177. package/lib/Types/Message.d.ts +12 -0
  178. package/lib/Types/Message.d.ts.map +1 -0
  179. package/lib/Types/Message.js +18 -0
  180. package/lib/Types/Message.js.map +1 -0
  181. package/lib/Types/Mex.d.ts +3 -0
  182. package/lib/Types/Mex.d.ts.map +1 -0
  183. package/lib/Types/Mex.js +39 -0
  184. package/lib/Types/Mex.js.map +1 -0
  185. package/lib/Types/Product.d.ts +2 -0
  186. package/lib/Types/Product.d.ts.map +1 -0
  187. package/lib/Types/Product.js +2 -0
  188. package/lib/Types/Product.js.map +1 -0
  189. package/lib/Types/RichType.d.ts +3 -0
  190. package/lib/Types/RichType.d.ts.map +1 -0
  191. package/lib/Types/RichType.js +23 -0
  192. package/lib/Types/RichType.js.map +1 -0
  193. package/lib/Types/Signal.d.ts +2 -0
  194. package/lib/Types/Signal.d.ts.map +1 -0
  195. package/lib/Types/Signal.js +2 -0
  196. package/lib/Types/Signal.js.map +1 -0
  197. package/lib/Types/Socket.d.ts +2 -0
  198. package/lib/Types/Socket.d.ts.map +1 -0
  199. package/lib/Types/Socket.js +2 -0
  200. package/lib/Types/Socket.js.map +1 -0
  201. package/lib/Types/State.d.ts +6 -0
  202. package/lib/Types/State.d.ts.map +1 -0
  203. package/lib/Types/State.js +56 -0
  204. package/lib/Types/State.js.map +1 -0
  205. package/lib/Types/T +1 -0
  206. package/lib/Types/USync.d.ts +2 -0
  207. package/lib/Types/USync.d.ts.map +1 -0
  208. package/lib/Types/USync.js +2 -0
  209. package/lib/Types/USync.js.map +1 -0
  210. package/lib/Types/index.d.ts +14 -0
  211. package/lib/Types/index.d.ts.map +1 -0
  212. package/lib/Types/index.js +26 -0
  213. package/lib/Types/index.js.map +1 -0
  214. package/lib/Utils/U +1 -0
  215. package/lib/Utils/advanced.js +89 -0
  216. package/lib/Utils/auth-utils.d.ts +58 -0
  217. package/lib/Utils/auth-utils.d.ts.map +1 -0
  218. package/lib/Utils/auth-utils.js +306 -0
  219. package/lib/Utils/auth-utils.js.map +1 -0
  220. package/lib/Utils/browser-utils.d.ts +10 -0
  221. package/lib/Utils/browser-utils.d.ts.map +1 -0
  222. package/lib/Utils/browser-utils.js +29 -0
  223. package/lib/Utils/browser-utils.js.map +1 -0
  224. package/lib/Utils/business.d.ts +50 -0
  225. package/lib/Utils/business.d.ts.map +1 -0
  226. package/lib/Utils/business.js +231 -0
  227. package/lib/Utils/business.js.map +1 -0
  228. package/lib/Utils/chat-utils.d.ts +409 -0
  229. package/lib/Utils/chat-utils.d.ts.map +1 -0
  230. package/lib/Utils/chat-utils.js +872 -0
  231. package/lib/Utils/chat-utils.js.map +1 -0
  232. package/lib/Utils/companion-reg-client-utils.d.ts +5 -0
  233. package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -0
  234. package/lib/Utils/companion-reg-client-utils.js +40 -0
  235. package/lib/Utils/companion-reg-client-utils.js.map +1 -0
  236. package/lib/Utils/crypto.d.ts +40 -0
  237. package/lib/Utils/crypto.d.ts.map +1 -0
  238. package/lib/Utils/crypto.js +118 -0
  239. package/lib/Utils/crypto.js.map +1 -0
  240. package/lib/Utils/decode-wa-message.d.ts +84 -0
  241. package/lib/Utils/decode-wa-message.d.ts.map +1 -0
  242. package/lib/Utils/decode-wa-message.js +317 -0
  243. package/lib/Utils/decode-wa-message.js.map +1 -0
  244. package/lib/Utils/enchanted-utils.js +93 -0
  245. package/lib/Utils/event-buffer.d.ts +13 -0
  246. package/lib/Utils/event-buffer.d.ts.map +1 -0
  247. package/lib/Utils/event-buffer.js +622 -0
  248. package/lib/Utils/event-buffer.js.map +1 -0
  249. package/lib/Utils/generics.d.ts +64 -0
  250. package/lib/Utils/generics.d.ts.map +1 -0
  251. package/lib/Utils/generics.js +395 -0
  252. package/lib/Utils/generics.js.map +1 -0
  253. package/lib/Utils/history.d.ts +76 -0
  254. package/lib/Utils/history.d.ts.map +1 -0
  255. package/lib/Utils/history.js +134 -0
  256. package/lib/Utils/history.js.map +1 -0
  257. package/lib/Utils/identity-change-handler.d.ts +14 -0
  258. package/lib/Utils/identity-change-handler.d.ts.map +1 -0
  259. package/lib/Utils/identity-change-handler.js +50 -0
  260. package/lib/Utils/identity-change-handler.js.map +1 -0
  261. package/lib/Utils/index.d.ts +25 -0
  262. package/lib/Utils/index.d.ts.map +1 -0
  263. package/lib/Utils/index.js +43 -0
  264. package/lib/Utils/index.js.map +1 -0
  265. package/lib/Utils/link-preview.d.ts +13 -0
  266. package/lib/Utils/link-preview.d.ts.map +1 -0
  267. package/lib/Utils/link-preview.js +85 -0
  268. package/lib/Utils/link-preview.js.map +1 -0
  269. package/lib/Utils/logger.d.ts +3 -0
  270. package/lib/Utils/logger.d.ts.map +1 -0
  271. package/lib/Utils/logger.js +3 -0
  272. package/lib/Utils/logger.js.map +1 -0
  273. package/lib/Utils/lt-hash.d.ts +7 -0
  274. package/lib/Utils/lt-hash.d.ts.map +1 -0
  275. package/lib/Utils/lt-hash.js +8 -0
  276. package/lib/Utils/lt-hash.js.map +1 -0
  277. package/lib/Utils/make-mutex.d.ts +7 -0
  278. package/lib/Utils/make-mutex.d.ts.map +1 -0
  279. package/lib/Utils/make-mutex.js +33 -0
  280. package/lib/Utils/make-mutex.js.map +1 -0
  281. package/lib/Utils/message-builder.js +198 -0
  282. package/lib/Utils/message-cache.js +144 -0
  283. package/lib/Utils/message-download-pipeline.js +216 -0
  284. package/lib/Utils/message-error.js +176 -0
  285. package/lib/Utils/message-framework.js +364 -0
  286. package/lib/Utils/message-logger.js +63 -0
  287. package/lib/Utils/message-metrics.js +173 -0
  288. package/lib/Utils/message-pipeline.js +236 -0
  289. package/lib/Utils/message-plugin.js +229 -0
  290. package/lib/Utils/message-queue.js +266 -0
  291. package/lib/Utils/message-retry-adaptive.js +216 -0
  292. package/lib/Utils/message-retry-manager.d.ts +80 -0
  293. package/lib/Utils/message-retry-manager.d.ts.map +1 -0
  294. package/lib/Utils/message-retry-manager.js +265 -0
  295. package/lib/Utils/message-retry-manager.js.map +1 -0
  296. package/lib/Utils/message-upload-pipeline.js +244 -0
  297. package/lib/Utils/messages-media.d.ts +137 -0
  298. package/lib/Utils/messages-media.d.ts.map +1 -0
  299. package/lib/Utils/messages-media.js +843 -0
  300. package/lib/Utils/messages-media.js.map +1 -0
  301. package/lib/Utils/messages.d.ts +46 -0
  302. package/lib/Utils/messages.d.ts.map +1 -0
  303. package/lib/Utils/messages.js +1840 -0
  304. package/lib/Utils/messages.js.map +1 -0
  305. package/lib/Utils/noise-handler.d.ts +21 -0
  306. package/lib/Utils/noise-handler.d.ts.map +1 -0
  307. package/lib/Utils/noise-handler.js +201 -0
  308. package/lib/Utils/noise-handler.js.map +1 -0
  309. package/lib/Utils/offline-node-processor.d.ts +10 -0
  310. package/lib/Utils/offline-node-processor.d.ts.map +1 -0
  311. package/lib/Utils/offline-node-processor.js +40 -0
  312. package/lib/Utils/offline-node-processor.js.map +1 -0
  313. package/lib/Utils/pre-key-manager.d.ts +26 -0
  314. package/lib/Utils/pre-key-manager.d.ts.map +1 -0
  315. package/lib/Utils/pre-key-manager.js +106 -0
  316. package/lib/Utils/pre-key-manager.js.map +1 -0
  317. package/lib/Utils/process-message.d.ts +84 -0
  318. package/lib/Utils/process-message.d.ts.map +1 -0
  319. package/lib/Utils/process-message.js +749 -0
  320. package/lib/Utils/process-message.js.map +1 -0
  321. package/lib/Utils/reliability.js +70 -0
  322. package/lib/Utils/reporting-utils.d.ts +13 -0
  323. package/lib/Utils/reporting-utils.d.ts.map +1 -0
  324. package/lib/Utils/reporting-utils.js +258 -0
  325. package/lib/Utils/reporting-utils.js.map +1 -0
  326. package/lib/Utils/rich-message-utils.d.ts +49 -0
  327. package/lib/Utils/rich-message-utils.d.ts.map +1 -0
  328. package/lib/Utils/rich-message-utils.js +370 -0
  329. package/lib/Utils/rich-message-utils.js.map +1 -0
  330. package/lib/Utils/signal.d.ts +83 -0
  331. package/lib/Utils/signal.d.ts.map +1 -0
  332. package/lib/Utils/signal.js +201 -0
  333. package/lib/Utils/signal.js.map +1 -0
  334. package/lib/Utils/stanza-ack.d.ts +17 -0
  335. package/lib/Utils/stanza-ack.d.ts.map +1 -0
  336. package/lib/Utils/stanza-ack.js +38 -0
  337. package/lib/Utils/stanza-ack.js.map +1 -0
  338. package/lib/Utils/sync-action-utils.d.ts +3 -0
  339. package/lib/Utils/sync-action-utils.d.ts.map +1 -0
  340. package/lib/Utils/sync-action-utils.js +49 -0
  341. package/lib/Utils/sync-action-utils.js.map +1 -0
  342. package/lib/Utils/tc-token-utils.d.ts +30 -0
  343. package/lib/Utils/tc-token-utils.d.ts.map +1 -0
  344. package/lib/Utils/tc-token-utils.js +164 -0
  345. package/lib/Utils/tc-token-utils.js.map +1 -0
  346. package/lib/Utils/use-multi-file-auth-state.d.ts +11 -0
  347. package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
  348. package/lib/Utils/use-multi-file-auth-state.js +121 -0
  349. package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
  350. package/lib/Utils/use-single-file-auth-state.d.ts +11 -0
  351. package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -0
  352. package/lib/Utils/use-single-file-auth-state.js +109 -0
  353. package/lib/Utils/use-single-file-auth-state.js.map +1 -0
  354. package/lib/Utils/use-sqlite-auth-state.d.ts +11 -0
  355. package/lib/Utils/use-sqlite-auth-state.d.ts.map +1 -0
  356. package/lib/Utils/use-sqlite-auth-state.js +109 -0
  357. package/lib/Utils/use-sqlite-auth-state.js.map +1 -0
  358. package/lib/Utils/validate-connection.d.ts +44 -0
  359. package/lib/Utils/validate-connection.d.ts.map +1 -0
  360. package/lib/Utils/validate-connection.js +210 -0
  361. package/lib/Utils/validate-connection.js.map +1 -0
  362. package/lib/WABinary/constants.d.ts +62 -0
  363. package/lib/WABinary/constants.d.ts.map +1 -0
  364. package/lib/WABinary/constants.js +1467 -0
  365. package/lib/WABinary/constants.js.map +1 -0
  366. package/lib/WABinary/decode.d.ts +10 -0
  367. package/lib/WABinary/decode.d.ts.map +1 -0
  368. package/lib/WABinary/decode.js +262 -0
  369. package/lib/WABinary/decode.js.map +1 -0
  370. package/lib/WABinary/enchanted-binary.js +38 -0
  371. package/lib/WABinary/encode.d.ts +3 -0
  372. package/lib/WABinary/encode.d.ts.map +1 -0
  373. package/lib/WABinary/encode.js +220 -0
  374. package/lib/WABinary/encode.js.map +1 -0
  375. package/lib/WABinary/generic-utils.d.ts +77 -0
  376. package/lib/WABinary/generic-utils.d.ts.map +1 -0
  377. package/lib/WABinary/generic-utils.js +226 -0
  378. package/lib/WABinary/generic-utils.js.map +1 -0
  379. package/lib/WABinary/index.d.ts +6 -0
  380. package/lib/WABinary/index.d.ts.map +1 -0
  381. package/lib/WABinary/index.js +8 -0
  382. package/lib/WABinary/index.js.map +1 -0
  383. package/lib/WABinary/jid-utils.d.ts +29 -0
  384. package/lib/WABinary/jid-utils.d.ts.map +1 -0
  385. package/lib/WABinary/jid-utils.js +96 -0
  386. package/lib/WABinary/jid-utils.js.map +1 -0
  387. package/lib/WABinary/types.d.ts +2 -0
  388. package/lib/WABinary/types.d.ts.map +1 -0
  389. package/lib/WABinary/types.js +2 -0
  390. package/lib/WABinary/types.js.map +1 -0
  391. package/lib/WABinary/w +1 -0
  392. package/lib/WAM/BinaryInfo.d.ts +8 -0
  393. package/lib/WAM/BinaryInfo.d.ts.map +1 -0
  394. package/lib/WAM/BinaryInfo.js +10 -0
  395. package/lib/WAM/BinaryInfo.js.map +1 -0
  396. package/lib/WAM/constants.d.ts +34927 -0
  397. package/lib/WAM/constants.d.ts.map +1 -0
  398. package/lib/WAM/constants.js +22853 -0
  399. package/lib/WAM/constants.js.map +1 -0
  400. package/lib/WAM/encode.d.ts +2 -0
  401. package/lib/WAM/encode.d.ts.map +1 -0
  402. package/lib/WAM/encode.js +150 -0
  403. package/lib/WAM/encode.js.map +1 -0
  404. package/lib/WAM/index.d.ts +4 -0
  405. package/lib/WAM/index.d.ts.map +1 -0
  406. package/lib/WAM/index.js +4 -0
  407. package/lib/WAM/index.js.map +1 -0
  408. package/lib/WAM/w +1 -0
  409. package/lib/WAUSync/Protocols/P +1 -0
  410. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +37 -0
  411. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
  412. package/lib/WAUSync/Protocols/USyncContactProtocol.js +52 -0
  413. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
  414. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +23 -0
  415. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
  416. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +54 -0
  417. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
  418. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +13 -0
  419. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
  420. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -0
  421. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
  422. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +13 -0
  423. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
  424. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +38 -0
  425. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
  426. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
  427. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -0
  428. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
  429. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +1 -0
  430. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +39 -0
  431. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
  432. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +51 -0
  433. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
  434. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +15 -0
  435. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
  436. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +29 -0
  437. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
  438. package/lib/WAUSync/Protocols/index.d.ts +6 -0
  439. package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
  440. package/lib/WAUSync/Protocols/index.js +6 -0
  441. package/lib/WAUSync/Protocols/index.js.map +1 -0
  442. package/lib/WAUSync/USyncQuery.d.ts +21 -0
  443. package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
  444. package/lib/WAUSync/USyncQuery.js +98 -0
  445. package/lib/WAUSync/USyncQuery.js.map +1 -0
  446. package/lib/WAUSync/USyncUser.d.ts +17 -0
  447. package/lib/WAUSync/USyncUser.d.ts.map +1 -0
  448. package/lib/WAUSync/USyncUser.js +31 -0
  449. package/lib/WAUSync/USyncUser.js.map +1 -0
  450. package/lib/WAUSync/W +1 -0
  451. package/lib/WAUSync/index.d.ts +4 -0
  452. package/lib/WAUSync/index.d.ts.map +1 -0
  453. package/lib/WAUSync/index.js +4 -0
  454. package/lib/WAUSync/index.js.map +1 -0
  455. package/lib/index.d.ts +12 -0
  456. package/lib/index.d.ts.map +1 -0
  457. package/lib/index.js +12 -0
  458. package/lib/index.js.map +1 -0
  459. package/package.json +80 -0
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Message Builder — Pipeline berbasis stage untuk membangun pesan.
3
+ * Stage: validate → normalize → prepareMedia → interactive → mentions → quoted → encode → send
4
+ * Setiap stage dapat di-override oleh plugin.
5
+ */
6
+
7
+ import { LifecycleEvents } from './message-pipeline.js';
8
+ import { ValidationError } from './message-error.js';
9
+
10
+ export const BuildStage = Object.freeze({
11
+ VALIDATE: 'validate',
12
+ NORMALIZE: 'normalize',
13
+ PREPARE_MEDIA: 'prepareMedia',
14
+ INTERACTIVE: 'interactive',
15
+ MENTIONS: 'mentions',
16
+ QUOTED: 'quoted',
17
+ ENCODE: 'encode',
18
+ PRE_SEND: 'preSend',
19
+ });
20
+
21
+ // ─────────────────────────────────────────────
22
+ // BUILD CONTEXT
23
+ // ─────────────────────────────────────────────
24
+
25
+ export function createBuildContext(overrides = {}) {
26
+ return {
27
+ jid: null,
28
+ content: null,
29
+ options: {},
30
+ message: null,
31
+ media: null,
32
+ mentions: [],
33
+ quoted: null,
34
+ interactive: null,
35
+ metadata: {},
36
+ cancelled: false,
37
+ cancelReason: null,
38
+ error: null,
39
+ timestamps: {
40
+ created: Date.now(),
41
+ validated: null,
42
+ prepared: null,
43
+ encoded: null,
44
+ },
45
+ ...overrides,
46
+ };
47
+ }
48
+
49
+ // ─────────────────────────────────────────────
50
+ // MESSAGE BUILDER
51
+ // ─────────────────────────────────────────────
52
+
53
+ export class MessageBuilder {
54
+ constructor(opts = {}) {
55
+ this._logger = opts.logger ?? console;
56
+ this._hooks = opts.hooks ?? null;
57
+ this._metrics = opts.metrics ?? null;
58
+ this._plugins = opts.plugins ?? null;
59
+
60
+ // Stage overrides: stageName → async (ctx) => {}
61
+ this._overrides = new Map();
62
+ // Stage middlewares: stageName → [(ctx, next) => {}]
63
+ this._stageMiddlewares = new Map();
64
+
65
+ for (const stage of Object.values(BuildStage)) {
66
+ this._stageMiddlewares.set(stage, []);
67
+ }
68
+ }
69
+
70
+ // ── Stage Override API ────────────────────
71
+
72
+ /** Override stage default handler */
73
+ overrideStage(stageName, fn) {
74
+ if (!BuildStage[stageName.toUpperCase().replace('-', '_')] &&
75
+ !Object.values(BuildStage).includes(stageName)) {
76
+ throw new Error(`[MessageBuilder] Stage "${stageName}" tidak dikenal`);
77
+ }
78
+ this._overrides.set(stageName, fn);
79
+ return this;
80
+ }
81
+
82
+ /** Tambah middleware ke stage tertentu */
83
+ useStage(stageName, fn) {
84
+ if (!this._stageMiddlewares.has(stageName))
85
+ this._stageMiddlewares.set(stageName, []);
86
+ this._stageMiddlewares.get(stageName).push(fn);
87
+ return this;
88
+ }
89
+
90
+ // ── Build Pipeline ────────────────────────
91
+
92
+ /**
93
+ * Jalankan semua stage build pipeline.
94
+ * @param {string} jid
95
+ * @param {object} content — isi pesan (format Baileys WAMessageContent)
96
+ * @param {object} options — generateWAMessage options
97
+ * @returns {Promise<BuildContext>}
98
+ */
99
+ async build(jid, content, options = {}) {
100
+ const ctx = createBuildContext({ jid, content, options });
101
+
102
+ // ── STAGE 1: Validate ──
103
+ await this._runStage(BuildStage.VALIDATE, ctx, async (c) => {
104
+ if (!c.jid) throw new ValidationError('JID tidak boleh kosong');
105
+ if (!c.content) throw new ValidationError('Konten pesan tidak boleh kosong');
106
+ c.timestamps.validated = Date.now();
107
+ });
108
+ if (ctx.cancelled) return ctx;
109
+
110
+ // ── STAGE 2: Normalize ──
111
+ await this._runStage(BuildStage.NORMALIZE, ctx, async (c) => {
112
+ // Normalisasi format konten — bisa di-override plugin
113
+ if (typeof c.content === 'string') {
114
+ c.content = { text: c.content };
115
+ }
116
+ });
117
+ if (ctx.cancelled) return ctx;
118
+
119
+ // ── STAGE 3: PrepareMedia ──
120
+ await this._runStage(BuildStage.PREPARE_MEDIA, ctx, async (c) => {
121
+ // Default: tidak ada transformasi, diserahkan ke generateWAMessage
122
+ // Plugin dapat inject media preprocessing di sini
123
+ });
124
+ if (ctx.cancelled) return ctx;
125
+
126
+ // ── STAGE 4: Interactive ──
127
+ await this._runStage(BuildStage.INTERACTIVE, ctx, async (c) => {
128
+ // Plugin dapat inject button, list, flow, dll.
129
+ });
130
+ if (ctx.cancelled) return ctx;
131
+
132
+ // ── STAGE 5: Mentions ──
133
+ await this._runStage(BuildStage.MENTIONS, ctx, async (c) => {
134
+ if (c.options?.mentions && Array.isArray(c.options.mentions)) {
135
+ c.mentions = c.options.mentions;
136
+ }
137
+ });
138
+ if (ctx.cancelled) return ctx;
139
+
140
+ // ── STAGE 6: Quoted ──
141
+ await this._runStage(BuildStage.QUOTED, ctx, async (c) => {
142
+ if (c.options?.quoted) {
143
+ c.quoted = c.options.quoted;
144
+ }
145
+ });
146
+ if (ctx.cancelled) return ctx;
147
+
148
+ // ── STAGE 7: Encode ──
149
+ await this._runStage(BuildStage.ENCODE, ctx, async (c) => {
150
+ c.timestamps.encoded = Date.now();
151
+ if (this._metrics) this._metrics.inc('encode.total');
152
+ });
153
+ if (ctx.cancelled) return ctx;
154
+
155
+ // ── Hooks ──
156
+ await this._emitHook(LifecycleEvents.MESSAGE_PREPARED, ctx);
157
+ await this._emitHook(LifecycleEvents.MESSAGE_VALIDATED, ctx);
158
+
159
+ // ── STAGE 8: Pre-Send ──
160
+ await this._runStage(BuildStage.PRE_SEND, ctx, async (c) => {
161
+ c.timestamps.prepared = Date.now();
162
+ });
163
+
164
+ return ctx;
165
+ }
166
+
167
+ // ── Internal ──────────────────────────────
168
+
169
+ async _runStage(stageName, ctx, defaultFn) {
170
+ if (ctx.cancelled) return;
171
+ const middlewares = this._stageMiddlewares.get(stageName) ?? [];
172
+ const handler = this._overrides.get(stageName) ?? defaultFn;
173
+
174
+ if (middlewares.length > 0) {
175
+ let idx = -1;
176
+ const dispatch = async (i) => {
177
+ if (i <= idx) throw new Error('next() dipanggil lebih dari sekali di stage ' + stageName);
178
+ idx = i;
179
+ if (i < middlewares.length) return middlewares[i](ctx, () => dispatch(i + 1));
180
+ return handler(ctx);
181
+ };
182
+ await dispatch(0);
183
+ } else {
184
+ await handler(ctx);
185
+ }
186
+ }
187
+
188
+ async _emitHook(event, ctx) {
189
+ if (this._hooks) try { await this._hooks.emit(event, ctx); } catch (_) {}
190
+ }
191
+
192
+ _log(level, msg, data) {
193
+ if (this._logger?.[level]) this._logger[level](data ?? {}, msg);
194
+ else console.log(msg, data);
195
+ }
196
+ }
197
+
198
+ export const globalMessageBuilder = new MessageBuilder();
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Cache Layer — LRU Memory Cache + NamespacedCache + CacheRegistry.
3
+ * Support adapter: Memory (default), Redis, SQLite, MongoDB, custom.
4
+ */
5
+
6
+ export class MemoryCacheAdapter {
7
+ constructor(opts = {}) {
8
+ this._store = new Map();
9
+ this._defaultTTL = opts.ttl ?? 5 * 60 * 1000;
10
+ this._maxSize = opts.maxSize ?? 5000;
11
+ this._hits = 0; this._misses = 0;
12
+ this._order = [];
13
+ }
14
+
15
+ async get(key) {
16
+ const entry = this._store.get(key);
17
+ if (!entry) { this._misses++; return undefined; }
18
+ if (entry.expiresAt && Date.now() > entry.expiresAt) {
19
+ this._store.delete(key); this._removeFromOrder(key);
20
+ this._misses++; return undefined;
21
+ }
22
+ this._touchKey(key); this._hits++;
23
+ return entry.value;
24
+ }
25
+
26
+ async set(key, value, ttlMs) {
27
+ if (!this._store.has(key) && this._store.size >= this._maxSize) {
28
+ const oldest = this._order.shift();
29
+ if (oldest) this._store.delete(oldest);
30
+ }
31
+ const expiresAt = Date.now() + (ttlMs ?? this._defaultTTL);
32
+ this._store.set(key, { value, expiresAt });
33
+ this._touchKey(key);
34
+ return true;
35
+ }
36
+
37
+ async delete(key) { this._removeFromOrder(key); return this._store.delete(key); }
38
+ async has(key) { return (await this.get(key)) !== undefined; }
39
+ async clear() { this._store.clear(); this._order = []; return true; }
40
+
41
+ async mget(keys) {
42
+ const result = {};
43
+ for (const k of keys) { const v = await this.get(k); if (v !== undefined) result[k] = v; }
44
+ return result;
45
+ }
46
+ async mset(entries) {
47
+ for (const { key, value, ttlMs } of entries) await this.set(key, value, ttlMs);
48
+ return true;
49
+ }
50
+
51
+ _touchKey(key) { this._removeFromOrder(key); this._order.push(key); }
52
+ _removeFromOrder(key) {
53
+ const idx = this._order.indexOf(key);
54
+ if (idx !== -1) this._order.splice(idx, 1);
55
+ }
56
+
57
+ get size() { return this._store.size; }
58
+ get hitRate() { const t = this._hits + this._misses; return t === 0 ? 0 : this._hits / t; }
59
+ get stats() { return { size: this._store.size, hits: this._hits, misses: this._misses, hitRate: this.hitRate }; }
60
+ }
61
+
62
+ // ─────────────────────────────────────────────
63
+ // NAMESPACED CACHE
64
+ // ─────────────────────────────────────────────
65
+
66
+ export class NamespacedCache {
67
+ constructor(namespace, adapter) {
68
+ this._ns = namespace;
69
+ this._adapter = adapter;
70
+ }
71
+ _key(k) { return `${this._ns}:${k}`; }
72
+
73
+ async get(key) { return this._adapter.get(this._key(key)); }
74
+ async set(key, value, ttlMs){ return this._adapter.set(this._key(key), value, ttlMs); }
75
+ async delete(key) { return this._adapter.delete(this._key(key)); }
76
+ async has(key) { return this._adapter.has(this._key(key)); }
77
+ async clear() { return this._adapter.clear(); }
78
+ async mget(keys) {
79
+ const raw = await this._adapter.mget(keys.map(k => this._key(k)));
80
+ const result = {};
81
+ for (const [k, v] of Object.entries(raw))
82
+ result[k.replace(`${this._ns}:`, '')] = v;
83
+ return result;
84
+ }
85
+ async mset(entries) {
86
+ return this._adapter.mset(entries.map(e => ({ ...e, key: this._key(e.key) })));
87
+ }
88
+ }
89
+
90
+ // ─────────────────────────────────────────────
91
+ // CACHE REGISTRY
92
+ // ─────────────────────────────────────────────
93
+
94
+ export class CacheRegistry {
95
+ constructor(opts = {}) {
96
+ this._adapter = opts.adapter ?? new MemoryCacheAdapter(opts);
97
+ this._namespaces = new Map();
98
+ this._ttls = {
99
+ jid: opts.jidTTL ?? 30 * 60 * 1000,
100
+ groupMetadata: opts.groupMetadataTTL ?? 10 * 60 * 1000,
101
+ businessProfile: opts.businessProfileTTL ?? 15 * 60 * 1000,
102
+ newsletter: opts.newsletterTTL ?? 10 * 60 * 1000,
103
+ mediaUpload: opts.mediaUploadTTL ?? 5 * 60 * 1000,
104
+ thumbnail: opts.thumbnailTTL ?? 60 * 60 * 1000,
105
+ quotedMessage: opts.quotedMsgTTL ?? 30 * 60 * 1000,
106
+ participantInfo: opts.participantTTL ?? 5 * 60 * 1000,
107
+ deviceList: opts.deviceListTTL ?? 5 * 60 * 1000,
108
+ };
109
+ for (const ns of Object.keys(this._ttls)) this._namespace(ns);
110
+ }
111
+
112
+ _namespace(name) {
113
+ if (!this._namespaces.has(name))
114
+ this._namespaces.set(name, new NamespacedCache(name, this._adapter));
115
+ return this._namespaces.get(name);
116
+ }
117
+
118
+ get jid() { return this._namespace('jid'); }
119
+ get groupMetadata() { return this._namespace('groupMetadata'); }
120
+ get businessProfile() { return this._namespace('businessProfile'); }
121
+ get newsletter() { return this._namespace('newsletter'); }
122
+ get mediaUpload() { return this._namespace('mediaUpload'); }
123
+ get thumbnail() { return this._namespace('thumbnail'); }
124
+ get quotedMessage() { return this._namespace('quotedMessage'); }
125
+ get participantInfo() { return this._namespace('participantInfo'); }
126
+ get deviceList() { return this._namespace('deviceList'); }
127
+
128
+ ns(name) { return this._namespace(name); }
129
+
130
+ setAdapter(adapter) {
131
+ this._adapter = adapter;
132
+ for (const [name] of this._namespaces)
133
+ this._namespaces.set(name, new NamespacedCache(name, adapter));
134
+ return this;
135
+ }
136
+
137
+ async clearAll() { await this._adapter.clear(); return this; }
138
+
139
+ get stats() {
140
+ return typeof this._adapter.stats === 'object' ? this._adapter.stats : {};
141
+ }
142
+ }
143
+
144
+ export const globalCache = new CacheRegistry();
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Download Pipeline — Streaming download dengan progress, cancel, retry, checksum, cache.
3
+ * Stage: validate → checkCache → request → decrypt → verify → cache
4
+ */
5
+
6
+ import { LifecycleEvents } from './message-pipeline.js';
7
+ import { MediaDownloadError, ValidationError, TimeoutError } from './message-error.js';
8
+ import { AdaptiveRetryManager, DEFAULT_MEDIA_POLICY } from './message-retry-adaptive.js';
9
+ import { globalMetrics } from './message-metrics.js';
10
+ import { globalCache } from './message-cache.js';
11
+
12
+ export const DownloadStage = Object.freeze({
13
+ VALIDATE: 'validate',
14
+ CHECK_CACHE: 'checkCache',
15
+ REQUEST: 'request',
16
+ DECRYPT: 'decrypt',
17
+ VERIFY: 'verify',
18
+ CACHE: 'cache',
19
+ });
20
+
21
+ // ─────────────────────────────────────────────
22
+ // DOWNLOAD CONTEXT
23
+ // ─────────────────────────────────────────────
24
+
25
+ export function createDownloadContext(overrides = {}) {
26
+ return {
27
+ url: null,
28
+ directPath: null,
29
+ mediaKey: null,
30
+ mediaType: null,
31
+ mimetype: null,
32
+ fileEncSha256: null,
33
+ fileSha256: null,
34
+ fileLength: null,
35
+ buffer: null,
36
+ stream: null,
37
+ progressBytes: 0,
38
+ totalBytes: null,
39
+ cached: false,
40
+ cacheKey: null,
41
+ checksum: null,
42
+ cancelled: false,
43
+ retryCount: 0,
44
+ error: null,
45
+ metadata: {},
46
+ options: {},
47
+ onProgress: null, // (downloaded, total) => void
48
+ timestamps: {
49
+ start: null,
50
+ requested: null,
51
+ decrypted: null,
52
+ verified: null,
53
+ cached: null,
54
+ },
55
+ ...overrides,
56
+ };
57
+ }
58
+
59
+ // ─────────────────────────────────────────────
60
+ // DOWNLOAD PIPELINE
61
+ // ─────────────────────────────────────────────
62
+
63
+ export class DownloadPipeline {
64
+ constructor(opts = {}) {
65
+ this._logger = opts.logger ?? console;
66
+ this._hooks = opts.hooks ?? null;
67
+ this._metrics = opts.metrics ?? globalMetrics;
68
+ this._cache = opts.cache ?? globalCache;
69
+ this._retryPolicy = opts.retryPolicy ?? DEFAULT_MEDIA_POLICY;
70
+ this._timeoutMs = opts.timeoutMs ?? 60_000;
71
+ this._retryMgr = new AdaptiveRetryManager({ logger: this._logger, metrics: this._metrics });
72
+
73
+ this._overrides = new Map();
74
+ this._stageMiddlewares = new Map();
75
+ for (const stage of Object.values(DownloadStage)) {
76
+ this._stageMiddlewares.set(stage, []);
77
+ }
78
+ }
79
+
80
+ overrideStage(stageName, fn) { this._overrides.set(stageName, fn); return this; }
81
+
82
+ useStage(stageName, fn) {
83
+ if (!this._stageMiddlewares.has(stageName)) this._stageMiddlewares.set(stageName, []);
84
+ this._stageMiddlewares.get(stageName).push(fn);
85
+ return this;
86
+ }
87
+
88
+ /**
89
+ * Jalankan download pipeline.
90
+ * @param {object} ctx — DownloadContext
91
+ * @param {Function} downloadFn — async (ctx) => Buffer|Stream
92
+ */
93
+ async run(ctx, downloadFn) {
94
+ ctx.timestamps.start = Date.now();
95
+ await this._emitHook(LifecycleEvents.MEDIA_DOWNLOAD_START, ctx);
96
+
97
+ // ── STAGE 1: Validate ──
98
+ await this._runStage(DownloadStage.VALIDATE, ctx, async (c) => {
99
+ if (!c.url && !c.directPath) throw new ValidationError('URL atau directPath wajib diisi');
100
+ if (!c.mediaKey) throw new ValidationError('mediaKey wajib diisi');
101
+ });
102
+ if (ctx.cancelled) return ctx;
103
+
104
+ // ── STAGE 2: Check Cache ──
105
+ await this._runStage(DownloadStage.CHECK_CACHE, ctx, async (c) => {
106
+ if (c.cacheKey && this._cache) {
107
+ const cached = await this._cache.mediaUpload.get(c.cacheKey);
108
+ if (cached) {
109
+ c.buffer = cached.buffer ?? c.buffer;
110
+ c.cached = true;
111
+ c.cancelled = true; // skip remaining stages
112
+ c.cancelReason = 'cache_hit';
113
+ }
114
+ }
115
+ });
116
+ if (ctx.cached || ctx.cancelled) {
117
+ await this._emitHook(LifecycleEvents.MEDIA_DOWNLOAD_END, ctx);
118
+ return ctx;
119
+ }
120
+
121
+ // ── STAGE 3: Request (dengan retry) ──
122
+ await this._runStage(DownloadStage.REQUEST, ctx, async (c) => {
123
+ if (!downloadFn) throw new MediaDownloadError('downloadFn tidak disediakan');
124
+ const start = Date.now();
125
+ const result = await this._retryMgr.run(
126
+ () => this._withTimeout(
127
+ downloadFn(c),
128
+ this._timeoutMs,
129
+ `Download timeout setelah ${this._timeoutMs}ms`
130
+ ),
131
+ this._retryPolicy,
132
+ `download_${Date.now()}`,
133
+ { mediaType: c.mediaType }
134
+ );
135
+ if (result instanceof Buffer) {
136
+ c.buffer = result;
137
+ } else if (result) {
138
+ c.buffer = result.buffer ?? result;
139
+ c.stream = result.stream ?? null;
140
+ }
141
+ const durationMs = Date.now() - start;
142
+ c.timestamps.requested = Date.now();
143
+ if (this._metrics) {
144
+ this._metrics.inc('media.download.total');
145
+ this._metrics.observe('download.duration_ms', durationMs);
146
+ }
147
+ });
148
+ if (ctx.cancelled) return ctx;
149
+
150
+ // ── STAGE 4: Decrypt ──
151
+ await this._runStage(DownloadStage.DECRYPT, ctx, async (c) => {
152
+ // Default: decryption dilakukan oleh Baileys downloadContentFromMessage
153
+ // Plugin dapat override jika butuh custom decryption
154
+ c.timestamps.decrypted = Date.now();
155
+ });
156
+ if (ctx.cancelled) return ctx;
157
+
158
+ // ── STAGE 5: Verify ──
159
+ await this._runStage(DownloadStage.VERIFY, ctx, async (c) => {
160
+ if (!c.buffer && !c.stream) {
161
+ throw new MediaDownloadError('Download selesai tapi buffer/stream kosong');
162
+ }
163
+ // Checksum verification jika ada
164
+ if (c.checksum && c.fileSha256 && c.buffer) {
165
+ // Plugin dapat override untuk verifikasi checksum
166
+ }
167
+ c.timestamps.verified = Date.now();
168
+ });
169
+ if (ctx.cancelled) return ctx;
170
+
171
+ // ── STAGE 6: Cache ──
172
+ await this._runStage(DownloadStage.CACHE, ctx, async (c) => {
173
+ if (c.cacheKey && c.buffer && this._cache) {
174
+ await this._cache.mediaUpload.set(c.cacheKey, { buffer: c.buffer }, 10 * 60 * 1000);
175
+ c.cached = true;
176
+ c.timestamps.cached = Date.now();
177
+ }
178
+ });
179
+
180
+ await this._emitHook(LifecycleEvents.MEDIA_DOWNLOAD_END, ctx);
181
+ return ctx;
182
+ }
183
+
184
+ async _runStage(stageName, ctx, defaultFn) {
185
+ if (ctx.cancelled) return;
186
+ const middlewares = this._stageMiddlewares.get(stageName) ?? [];
187
+ const handler = this._overrides.get(stageName) ?? defaultFn;
188
+ if (middlewares.length > 0) {
189
+ let idx = -1;
190
+ const dispatch = async (i) => {
191
+ if (i <= idx) throw new Error('next() di stage ' + stageName + ' dipanggil 2x');
192
+ idx = i;
193
+ if (i < middlewares.length) return middlewares[i](ctx, () => dispatch(i + 1));
194
+ return handler(ctx);
195
+ };
196
+ await dispatch(0);
197
+ } else {
198
+ await handler(ctx);
199
+ }
200
+ }
201
+
202
+ _withTimeout(promise, ms, message) {
203
+ return new Promise((resolve, reject) => {
204
+ const t = setTimeout(() => reject(new TimeoutError(message)), ms);
205
+ Promise.resolve(promise)
206
+ .then(v => { clearTimeout(t); resolve(v); })
207
+ .catch(e => { clearTimeout(t); reject(e); });
208
+ });
209
+ }
210
+
211
+ async _emitHook(event, ctx) {
212
+ if (this._hooks) try { await this._hooks.emit(event, ctx); } catch (_) {}
213
+ }
214
+ }
215
+
216
+ export const globalDownloadPipeline = new DownloadPipeline();