#pragma once #include #include #include #include #include #include #include #include #include #include "ByteStream.hpp" #include "NetLibrary.hpp" typedef std::function NetClientRecvCallback; class NetClient : public std::enable_shared_from_this { public: NetClient(const std::string& serverFullID); NetClient(NetServer& server); template void send_items_to_server(const std::string& channel, Args&&... items) { if(isDisconnected) return; auto ss(std::make_shared()); { cereal::PortableBinaryOutputArchive m(*ss); (m(items), ...); } send_string_stream_to_server(channel, ss); } void send_string_stream_to_server(const std::string& channel, const std::shared_ptr& ss); void update(); void add_recv_callback(MessageCommandType commandID, const NetClientRecvCallback& callback); bool is_disconnected() const; NetLibrary::DownloadProgress get_progress_into_fragmented_message(const std::string& channel) const; private: std::string localID; void init_channel(const std::string& channelName, std::shared_ptr channel); void parse_received_messages(); void send_queued_messages(); void send_str_as_bytes(std::shared_ptr channel, const std::string& str); struct OutgoingMessage { MessageOrder order; std::shared_ptr ss; }; std::unordered_map> messageQueues; struct ReceiveQueue { std::mutex mut; struct ReceivedMessage { std::string channel; rtc::binary data; }; std::queue messages; }; std::shared_ptr receiveQueue; std::unordered_map> channels; std::unordered_map pfm; std::unordered_map recvCallbacks; NetServer* directConnectServer = nullptr; std::atomic isDisconnected = false; MessageOrder nextMessageOrderToSend = 0; MessageOrder nextMessageOrderToExpect = 0; std::string serverFullID; bool fullyRegistered = false; std::chrono::steady_clock::time_point lastMessageTime; friend class NetLibrary; friend class NetServer; };