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.
- package/LICENSE +22 -0
- package/README.md +82 -0
- package/WAProto/W +1 -0
- package/WAProto/WAProto.proto +6035 -0
- package/WAProto/index.d.ts +15932 -0
- package/WAProto/index.js +115856 -0
- package/engine-requirements.js +13 -0
- package/lib/Defaults/D +1 -0
- package/lib/Defaults/index.d.ts +145 -0
- package/lib/Defaults/index.d.ts.map +1 -0
- package/lib/Defaults/index.js +152 -0
- package/lib/Defaults/index.js.map +1 -0
- package/lib/Signal/Group/G +1 -0
- package/lib/Signal/Group/ciphertext-message.d.ts +10 -0
- package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
- package/lib/Signal/Group/ciphertext-message.js +12 -0
- package/lib/Signal/Group/ciphertext-message.js.map +1 -0
- package/lib/Signal/Group/group-session-builder.d.ts +8 -0
- package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
- package/lib/Signal/Group/group-session-builder.js +30 -0
- package/lib/Signal/Group/group-session-builder.js.map +1 -0
- package/lib/Signal/Group/group_cipher.d.ts +11 -0
- package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
- package/lib/Signal/Group/group_cipher.js +82 -0
- package/lib/Signal/Group/group_cipher.js.map +1 -0
- package/lib/Signal/Group/index.d.ts +12 -0
- package/lib/Signal/Group/index.d.ts.map +1 -0
- package/lib/Signal/Group/index.js +12 -0
- package/lib/Signal/Group/index.js.map +1 -0
- package/lib/Signal/Group/keyhelper.d.ts +7 -0
- package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
- package/lib/Signal/Group/keyhelper.js +18 -0
- package/lib/Signal/Group/keyhelper.js.map +1 -0
- package/lib/Signal/Group/sender-chain-key.d.ts +14 -0
- package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-chain-key.js +26 -0
- package/lib/Signal/Group/sender-chain-key.js.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +17 -0
- package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-distribution-message.js +63 -0
- package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-message.d.ts +19 -0
- package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-message.js +66 -0
- package/lib/Signal/Group/sender-key-message.js.map +1 -0
- package/lib/Signal/Group/sender-key-name.d.ts +12 -0
- package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-name.js +48 -0
- package/lib/Signal/Group/sender-key-name.js.map +1 -0
- package/lib/Signal/Group/sender-key-record.d.ts +13 -0
- package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-record.js +41 -0
- package/lib/Signal/Group/sender-key-record.js.map +1 -0
- package/lib/Signal/Group/sender-key-state.d.ts +17 -0
- package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
- package/lib/Signal/Group/sender-key-state.js +84 -0
- package/lib/Signal/Group/sender-key-state.js.map +1 -0
- package/lib/Signal/Group/sender-message-key.d.ts +12 -0
- package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
- package/lib/Signal/Group/sender-message-key.js +26 -0
- package/lib/Signal/Group/sender-message-key.js.map +1 -0
- package/lib/Signal/S +1 -0
- package/lib/Signal/libsignal.d.ts +55 -0
- package/lib/Signal/libsignal.d.ts.map +1 -0
- package/lib/Signal/libsignal.js +431 -0
- package/lib/Signal/libsignal.js.map +1 -0
- package/lib/Signal/lid-mapping.d.ts +21 -0
- package/lib/Signal/lid-mapping.d.ts.map +1 -0
- package/lib/Signal/lid-mapping.js +277 -0
- package/lib/Signal/lid-mapping.js.map +1 -0
- package/lib/Socket/Client/C +1 -0
- package/lib/Socket/Client/index.d.ts +3 -0
- package/lib/Socket/Client/index.d.ts.map +1 -0
- package/lib/Socket/Client/index.js +3 -0
- package/lib/Socket/Client/index.js.map +1 -0
- package/lib/Socket/Client/types.d.ts +6 -0
- package/lib/Socket/Client/types.d.ts.map +1 -0
- package/lib/Socket/Client/types.js +11 -0
- package/lib/Socket/Client/types.js.map +1 -0
- package/lib/Socket/Client/websocket.d.ts +13 -0
- package/lib/Socket/Client/websocket.d.ts.map +1 -0
- package/lib/Socket/Client/websocket.js +54 -0
- package/lib/Socket/Client/websocket.js.map +1 -0
- package/lib/Socket/business.d.ts +395 -0
- package/lib/Socket/business.d.ts.map +1 -0
- package/lib/Socket/business.js +380 -0
- package/lib/Socket/business.js.map +1 -0
- package/lib/Socket/chats.d.ts +144 -0
- package/lib/Socket/chats.d.ts.map +1 -0
- package/lib/Socket/chats.js +1219 -0
- package/lib/Socket/chats.js.map +1 -0
- package/lib/Socket/communities.d.ts +562 -0
- package/lib/Socket/communities.d.ts.map +1 -0
- package/lib/Socket/communities.js +432 -0
- package/lib/Socket/communities.js.map +1 -0
- package/lib/Socket/groups.d.ts +286 -0
- package/lib/Socket/groups.d.ts.map +1 -0
- package/lib/Socket/groups.js +348 -0
- package/lib/Socket/groups.js.map +1 -0
- package/lib/Socket/index.d.ts +530 -0
- package/lib/Socket/index.d.ts.map +1 -0
- package/lib/Socket/index.js +22 -0
- package/lib/Socket/index.js.map +1 -0
- package/lib/Socket/messages-recv.d.ts +334 -0
- package/lib/Socket/messages-recv.d.ts.map +1 -0
- package/lib/Socket/messages-recv.js +1797 -0
- package/lib/Socket/messages-recv.js.map +1 -0
- package/lib/Socket/messages-send.d.ts +330 -0
- package/lib/Socket/messages-send.d.ts.map +1 -0
- package/lib/Socket/messages-send.js +1396 -0
- package/lib/Socket/messages-send.js.map +1 -0
- package/lib/Socket/mex.d.ts +2 -0
- package/lib/Socket/mex.d.ts.map +1 -0
- package/lib/Socket/mex.js +42 -0
- package/lib/Socket/mex.js.map +1 -0
- package/lib/Socket/newsletter.d.ts +283 -0
- package/lib/Socket/newsletter.d.ts.map +1 -0
- package/lib/Socket/newsletter.js +226 -0
- package/lib/Socket/newsletter.js.map +1 -0
- package/lib/Socket/socket.d.ts +61 -0
- package/lib/Socket/socket.d.ts.map +1 -0
- package/lib/Socket/socket.js +970 -0
- package/lib/Socket/socket.js.map +1 -0
- package/lib/Store/S +1 -0
- package/lib/Store/index.d.ts +4 -0
- package/lib/Store/index.d.ts.map +1 -0
- package/lib/Store/index.js +4 -0
- package/lib/Store/index.js.map +1 -0
- package/lib/Store/make-in-memory-store.d.ts +63 -0
- package/lib/Store/make-in-memory-store.d.ts.map +1 -0
- package/lib/Store/make-in-memory-store.js +421 -0
- package/lib/Store/make-in-memory-store.js.map +1 -0
- package/lib/Store/make-ordered-dictionary.d.ts +13 -0
- package/lib/Store/make-ordered-dictionary.d.ts.map +1 -0
- package/lib/Store/make-ordered-dictionary.js +79 -0
- package/lib/Store/make-ordered-dictionary.js.map +1 -0
- package/lib/Store/object-repository.d.ts +11 -0
- package/lib/Store/object-repository.d.ts.map +1 -0
- package/lib/Store/object-repository.js +24 -0
- package/lib/Store/object-repository.js.map +1 -0
- package/lib/Types/Auth.d.ts +2 -0
- package/lib/Types/Auth.d.ts.map +1 -0
- package/lib/Types/Auth.js +2 -0
- package/lib/Types/Auth.js.map +1 -0
- package/lib/Types/Bussines.d.ts +2 -0
- package/lib/Types/Bussines.d.ts.map +1 -0
- package/lib/Types/Bussines.js +2 -0
- package/lib/Types/Bussines.js.map +1 -0
- package/lib/Types/Call.d.ts +2 -0
- package/lib/Types/Call.d.ts.map +1 -0
- package/lib/Types/Call.js +2 -0
- package/lib/Types/Call.js.map +1 -0
- package/lib/Types/Chat.d.ts +2 -0
- package/lib/Types/Chat.d.ts.map +1 -0
- package/lib/Types/Chat.js +8 -0
- package/lib/Types/Chat.js.map +1 -0
- package/lib/Types/Contact.d.ts +2 -0
- package/lib/Types/Contact.d.ts.map +1 -0
- package/lib/Types/Contact.js +2 -0
- package/lib/Types/Contact.js.map +1 -0
- package/lib/Types/Events.d.ts +2 -0
- package/lib/Types/Events.d.ts.map +1 -0
- package/lib/Types/Events.js +2 -0
- package/lib/Types/Events.js.map +1 -0
- package/lib/Types/GroupMetadata.d.ts +2 -0
- package/lib/Types/GroupMetadata.d.ts.map +1 -0
- package/lib/Types/GroupMetadata.js +2 -0
- package/lib/Types/GroupMetadata.js.map +1 -0
- package/lib/Types/Label.d.ts +3 -0
- package/lib/Types/Label.d.ts.map +1 -0
- package/lib/Types/Label.js +25 -0
- package/lib/Types/Label.js.map +1 -0
- package/lib/Types/LabelAssociation.d.ts +3 -0
- package/lib/Types/LabelAssociation.d.ts.map +1 -0
- package/lib/Types/LabelAssociation.js +7 -0
- package/lib/Types/LabelAssociation.js.map +1 -0
- package/lib/Types/Message.d.ts +12 -0
- package/lib/Types/Message.d.ts.map +1 -0
- package/lib/Types/Message.js +18 -0
- package/lib/Types/Message.js.map +1 -0
- package/lib/Types/Mex.d.ts +3 -0
- package/lib/Types/Mex.d.ts.map +1 -0
- package/lib/Types/Mex.js +39 -0
- package/lib/Types/Mex.js.map +1 -0
- package/lib/Types/Product.d.ts +2 -0
- package/lib/Types/Product.d.ts.map +1 -0
- package/lib/Types/Product.js +2 -0
- package/lib/Types/Product.js.map +1 -0
- package/lib/Types/RichType.d.ts +3 -0
- package/lib/Types/RichType.d.ts.map +1 -0
- package/lib/Types/RichType.js +23 -0
- package/lib/Types/RichType.js.map +1 -0
- package/lib/Types/Signal.d.ts +2 -0
- package/lib/Types/Signal.d.ts.map +1 -0
- package/lib/Types/Signal.js +2 -0
- package/lib/Types/Signal.js.map +1 -0
- package/lib/Types/Socket.d.ts +2 -0
- package/lib/Types/Socket.d.ts.map +1 -0
- package/lib/Types/Socket.js +2 -0
- package/lib/Types/Socket.js.map +1 -0
- package/lib/Types/State.d.ts +6 -0
- package/lib/Types/State.d.ts.map +1 -0
- package/lib/Types/State.js +56 -0
- package/lib/Types/State.js.map +1 -0
- package/lib/Types/T +1 -0
- package/lib/Types/USync.d.ts +2 -0
- package/lib/Types/USync.d.ts.map +1 -0
- package/lib/Types/USync.js +2 -0
- package/lib/Types/USync.js.map +1 -0
- package/lib/Types/index.d.ts +14 -0
- package/lib/Types/index.d.ts.map +1 -0
- package/lib/Types/index.js +26 -0
- package/lib/Types/index.js.map +1 -0
- package/lib/Utils/U +1 -0
- package/lib/Utils/advanced.js +89 -0
- package/lib/Utils/auth-utils.d.ts +58 -0
- package/lib/Utils/auth-utils.d.ts.map +1 -0
- package/lib/Utils/auth-utils.js +306 -0
- package/lib/Utils/auth-utils.js.map +1 -0
- package/lib/Utils/browser-utils.d.ts +10 -0
- package/lib/Utils/browser-utils.d.ts.map +1 -0
- package/lib/Utils/browser-utils.js +29 -0
- package/lib/Utils/browser-utils.js.map +1 -0
- package/lib/Utils/business.d.ts +50 -0
- package/lib/Utils/business.d.ts.map +1 -0
- package/lib/Utils/business.js +231 -0
- package/lib/Utils/business.js.map +1 -0
- package/lib/Utils/chat-utils.d.ts +409 -0
- package/lib/Utils/chat-utils.d.ts.map +1 -0
- package/lib/Utils/chat-utils.js +872 -0
- package/lib/Utils/chat-utils.js.map +1 -0
- package/lib/Utils/companion-reg-client-utils.d.ts +5 -0
- package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -0
- package/lib/Utils/companion-reg-client-utils.js +40 -0
- package/lib/Utils/companion-reg-client-utils.js.map +1 -0
- package/lib/Utils/crypto.d.ts +40 -0
- package/lib/Utils/crypto.d.ts.map +1 -0
- package/lib/Utils/crypto.js +118 -0
- package/lib/Utils/crypto.js.map +1 -0
- package/lib/Utils/decode-wa-message.d.ts +84 -0
- package/lib/Utils/decode-wa-message.d.ts.map +1 -0
- package/lib/Utils/decode-wa-message.js +317 -0
- package/lib/Utils/decode-wa-message.js.map +1 -0
- package/lib/Utils/enchanted-utils.js +93 -0
- package/lib/Utils/event-buffer.d.ts +13 -0
- package/lib/Utils/event-buffer.d.ts.map +1 -0
- package/lib/Utils/event-buffer.js +622 -0
- package/lib/Utils/event-buffer.js.map +1 -0
- package/lib/Utils/generics.d.ts +64 -0
- package/lib/Utils/generics.d.ts.map +1 -0
- package/lib/Utils/generics.js +395 -0
- package/lib/Utils/generics.js.map +1 -0
- package/lib/Utils/history.d.ts +76 -0
- package/lib/Utils/history.d.ts.map +1 -0
- package/lib/Utils/history.js +134 -0
- package/lib/Utils/history.js.map +1 -0
- package/lib/Utils/identity-change-handler.d.ts +14 -0
- package/lib/Utils/identity-change-handler.d.ts.map +1 -0
- package/lib/Utils/identity-change-handler.js +50 -0
- package/lib/Utils/identity-change-handler.js.map +1 -0
- package/lib/Utils/index.d.ts +25 -0
- package/lib/Utils/index.d.ts.map +1 -0
- package/lib/Utils/index.js +43 -0
- package/lib/Utils/index.js.map +1 -0
- package/lib/Utils/link-preview.d.ts +13 -0
- package/lib/Utils/link-preview.d.ts.map +1 -0
- package/lib/Utils/link-preview.js +85 -0
- package/lib/Utils/link-preview.js.map +1 -0
- package/lib/Utils/logger.d.ts +3 -0
- package/lib/Utils/logger.d.ts.map +1 -0
- package/lib/Utils/logger.js +3 -0
- package/lib/Utils/logger.js.map +1 -0
- package/lib/Utils/lt-hash.d.ts +7 -0
- package/lib/Utils/lt-hash.d.ts.map +1 -0
- package/lib/Utils/lt-hash.js +8 -0
- package/lib/Utils/lt-hash.js.map +1 -0
- package/lib/Utils/make-mutex.d.ts +7 -0
- package/lib/Utils/make-mutex.d.ts.map +1 -0
- package/lib/Utils/make-mutex.js +33 -0
- package/lib/Utils/make-mutex.js.map +1 -0
- package/lib/Utils/message-builder.js +198 -0
- package/lib/Utils/message-cache.js +144 -0
- package/lib/Utils/message-download-pipeline.js +216 -0
- package/lib/Utils/message-error.js +176 -0
- package/lib/Utils/message-framework.js +364 -0
- package/lib/Utils/message-logger.js +63 -0
- package/lib/Utils/message-metrics.js +173 -0
- package/lib/Utils/message-pipeline.js +236 -0
- package/lib/Utils/message-plugin.js +229 -0
- package/lib/Utils/message-queue.js +266 -0
- package/lib/Utils/message-retry-adaptive.js +216 -0
- package/lib/Utils/message-retry-manager.d.ts +80 -0
- package/lib/Utils/message-retry-manager.d.ts.map +1 -0
- package/lib/Utils/message-retry-manager.js +265 -0
- package/lib/Utils/message-retry-manager.js.map +1 -0
- package/lib/Utils/message-upload-pipeline.js +244 -0
- package/lib/Utils/messages-media.d.ts +137 -0
- package/lib/Utils/messages-media.d.ts.map +1 -0
- package/lib/Utils/messages-media.js +843 -0
- package/lib/Utils/messages-media.js.map +1 -0
- package/lib/Utils/messages.d.ts +46 -0
- package/lib/Utils/messages.d.ts.map +1 -0
- package/lib/Utils/messages.js +1840 -0
- package/lib/Utils/messages.js.map +1 -0
- package/lib/Utils/noise-handler.d.ts +21 -0
- package/lib/Utils/noise-handler.d.ts.map +1 -0
- package/lib/Utils/noise-handler.js +201 -0
- package/lib/Utils/noise-handler.js.map +1 -0
- package/lib/Utils/offline-node-processor.d.ts +10 -0
- package/lib/Utils/offline-node-processor.d.ts.map +1 -0
- package/lib/Utils/offline-node-processor.js +40 -0
- package/lib/Utils/offline-node-processor.js.map +1 -0
- package/lib/Utils/pre-key-manager.d.ts +26 -0
- package/lib/Utils/pre-key-manager.d.ts.map +1 -0
- package/lib/Utils/pre-key-manager.js +106 -0
- package/lib/Utils/pre-key-manager.js.map +1 -0
- package/lib/Utils/process-message.d.ts +84 -0
- package/lib/Utils/process-message.d.ts.map +1 -0
- package/lib/Utils/process-message.js +749 -0
- package/lib/Utils/process-message.js.map +1 -0
- package/lib/Utils/reliability.js +70 -0
- package/lib/Utils/reporting-utils.d.ts +13 -0
- package/lib/Utils/reporting-utils.d.ts.map +1 -0
- package/lib/Utils/reporting-utils.js +258 -0
- package/lib/Utils/reporting-utils.js.map +1 -0
- package/lib/Utils/rich-message-utils.d.ts +49 -0
- package/lib/Utils/rich-message-utils.d.ts.map +1 -0
- package/lib/Utils/rich-message-utils.js +370 -0
- package/lib/Utils/rich-message-utils.js.map +1 -0
- package/lib/Utils/signal.d.ts +83 -0
- package/lib/Utils/signal.d.ts.map +1 -0
- package/lib/Utils/signal.js +201 -0
- package/lib/Utils/signal.js.map +1 -0
- package/lib/Utils/stanza-ack.d.ts +17 -0
- package/lib/Utils/stanza-ack.d.ts.map +1 -0
- package/lib/Utils/stanza-ack.js +38 -0
- package/lib/Utils/stanza-ack.js.map +1 -0
- package/lib/Utils/sync-action-utils.d.ts +3 -0
- package/lib/Utils/sync-action-utils.d.ts.map +1 -0
- package/lib/Utils/sync-action-utils.js +49 -0
- package/lib/Utils/sync-action-utils.js.map +1 -0
- package/lib/Utils/tc-token-utils.d.ts +30 -0
- package/lib/Utils/tc-token-utils.d.ts.map +1 -0
- package/lib/Utils/tc-token-utils.js +164 -0
- package/lib/Utils/tc-token-utils.js.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.d.ts +11 -0
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-multi-file-auth-state.js +121 -0
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
- package/lib/Utils/use-single-file-auth-state.d.ts +11 -0
- package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-single-file-auth-state.js +109 -0
- package/lib/Utils/use-single-file-auth-state.js.map +1 -0
- package/lib/Utils/use-sqlite-auth-state.d.ts +11 -0
- package/lib/Utils/use-sqlite-auth-state.d.ts.map +1 -0
- package/lib/Utils/use-sqlite-auth-state.js +109 -0
- package/lib/Utils/use-sqlite-auth-state.js.map +1 -0
- package/lib/Utils/validate-connection.d.ts +44 -0
- package/lib/Utils/validate-connection.d.ts.map +1 -0
- package/lib/Utils/validate-connection.js +210 -0
- package/lib/Utils/validate-connection.js.map +1 -0
- package/lib/WABinary/constants.d.ts +62 -0
- package/lib/WABinary/constants.d.ts.map +1 -0
- package/lib/WABinary/constants.js +1467 -0
- package/lib/WABinary/constants.js.map +1 -0
- package/lib/WABinary/decode.d.ts +10 -0
- package/lib/WABinary/decode.d.ts.map +1 -0
- package/lib/WABinary/decode.js +262 -0
- package/lib/WABinary/decode.js.map +1 -0
- package/lib/WABinary/enchanted-binary.js +38 -0
- package/lib/WABinary/encode.d.ts +3 -0
- package/lib/WABinary/encode.d.ts.map +1 -0
- package/lib/WABinary/encode.js +220 -0
- package/lib/WABinary/encode.js.map +1 -0
- package/lib/WABinary/generic-utils.d.ts +77 -0
- package/lib/WABinary/generic-utils.d.ts.map +1 -0
- package/lib/WABinary/generic-utils.js +226 -0
- package/lib/WABinary/generic-utils.js.map +1 -0
- package/lib/WABinary/index.d.ts +6 -0
- package/lib/WABinary/index.d.ts.map +1 -0
- package/lib/WABinary/index.js +8 -0
- package/lib/WABinary/index.js.map +1 -0
- package/lib/WABinary/jid-utils.d.ts +29 -0
- package/lib/WABinary/jid-utils.d.ts.map +1 -0
- package/lib/WABinary/jid-utils.js +96 -0
- package/lib/WABinary/jid-utils.js.map +1 -0
- package/lib/WABinary/types.d.ts +2 -0
- package/lib/WABinary/types.d.ts.map +1 -0
- package/lib/WABinary/types.js +2 -0
- package/lib/WABinary/types.js.map +1 -0
- package/lib/WABinary/w +1 -0
- package/lib/WAM/BinaryInfo.d.ts +8 -0
- package/lib/WAM/BinaryInfo.d.ts.map +1 -0
- package/lib/WAM/BinaryInfo.js +10 -0
- package/lib/WAM/BinaryInfo.js.map +1 -0
- package/lib/WAM/constants.d.ts +34927 -0
- package/lib/WAM/constants.d.ts.map +1 -0
- package/lib/WAM/constants.js +22853 -0
- package/lib/WAM/constants.js.map +1 -0
- package/lib/WAM/encode.d.ts +2 -0
- package/lib/WAM/encode.d.ts.map +1 -0
- package/lib/WAM/encode.js +150 -0
- package/lib/WAM/encode.js.map +1 -0
- package/lib/WAM/index.d.ts +4 -0
- package/lib/WAM/index.d.ts.map +1 -0
- package/lib/WAM/index.js +4 -0
- package/lib/WAM/index.js.map +1 -0
- package/lib/WAM/w +1 -0
- package/lib/WAUSync/Protocols/P +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +37 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +52 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +23 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +54 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +13 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +13 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +38 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +39 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +51 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +15 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +29 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
- package/lib/WAUSync/Protocols/index.d.ts +6 -0
- package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
- package/lib/WAUSync/Protocols/index.js +6 -0
- package/lib/WAUSync/Protocols/index.js.map +1 -0
- package/lib/WAUSync/USyncQuery.d.ts +21 -0
- package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
- package/lib/WAUSync/USyncQuery.js +98 -0
- package/lib/WAUSync/USyncQuery.js.map +1 -0
- package/lib/WAUSync/USyncUser.d.ts +17 -0
- package/lib/WAUSync/USyncUser.d.ts.map +1 -0
- package/lib/WAUSync/USyncUser.js +31 -0
- package/lib/WAUSync/USyncUser.js.map +1 -0
- package/lib/WAUSync/W +1 -0
- package/lib/WAUSync/index.d.ts +4 -0
- package/lib/WAUSync/index.d.ts.map +1 -0
- package/lib/WAUSync/index.js +4 -0
- package/lib/WAUSync/index.js.map +1 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +12 -0
- package/lib/index.js.map +1 -0
- 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();
|