// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once #include "td/telegram/net/DcId.h" #include "td/telegram/net/NetQuery.h" #include "td/actor/actor.h" #include "td/utils/common.h" #include "td/utils/Promise.h" #include "td/utils/ScopeGuard.h" #include "td/utils/Status.h" #include #include #include #include #include namespace td { class DcAuthManager; class MultiSequenceDispatcher; class NetQueryDelayer; class PublicRsaKeyShared; class PublicRsaKeyWatchdog; class SessionMultiProxy; // Not just dispatcher. class NetQueryDispatcher { public: explicit NetQueryDispatcher(const std::function()> &create_reference); NetQueryDispatcher(); NetQueryDispatcher(const NetQueryDispatcher &) = delete; NetQueryDispatcher &operator=(const NetQueryDispatcher &) = delete; NetQueryDispatcher(NetQueryDispatcher &&) = delete; NetQueryDispatcher &operator=(NetQueryDispatcher &&) = delete; ~NetQueryDispatcher(); void dispatch(NetQueryPtr net_query); void dispatch_with_callback(NetQueryPtr net_query, ActorShared callback); void stop(); void update_session_count(); void destroy_auth_keys(Promise<> promise); void update_use_pfs(); void update_mtproto_header(); DcId get_main_dc_id() const { return DcId::internal(main_dc_id_.load(std::memory_order_relaxed)); } void set_main_dc_id(int32 new_main_dc_id); void check_authorization_is_ok(); private: std::atomic stop_flag_{false}; bool need_destroy_auth_key_{false}; ActorOwn delayer_; ActorOwn dc_auth_manager_; ActorOwn sequence_dispatcher_; struct Dc { DcId id_; std::atomic is_valid_{false}; std::atomic is_inited_{false}; // TODO: cache in scheduler local storage :D ActorOwn main_session_; ActorOwn download_session_; ActorOwn download_small_session_; ActorOwn upload_session_; }; static constexpr size_t MAX_DC_COUNT = 1000; std::array dcs_; #if TD_EMSCRIPTEN // FIXME std::atomic main_dc_id_{2}; #else std::atomic main_dc_id_{1}; #endif std::shared_ptr common_public_rsa_key_; ActorOwn public_rsa_key_watchdog_; std::mutex main_dc_id_mutex_; std::shared_ptr td_guard_; Status wait_dc_init(DcId dc_id, bool force); bool is_dc_inited(int32 raw_dc_id); static int32 get_session_count(); static bool get_use_pfs(); static void complete_net_query(NetQueryPtr net_query); void try_fix_migrate(NetQueryPtr &net_query); }; } // namespace td