#ifndef XRPL_SERVER_BASEPEER_H_INCLUDED #define XRPL_SERVER_BASEPEER_H_INCLUDED #include #include #include #include #include #include #include #include #include namespace ripple { // Common part of all peers template class BasePeer : public io_list::work { protected: using clock_type = std::chrono::system_clock; using error_code = boost::system::error_code; using endpoint_type = boost::asio::ip::tcp::endpoint; using waitable_timer = boost::asio::basic_waitable_timer; Port const& port_; Handler& handler_; endpoint_type remote_address_; beast::WrappedSink sink_; beast::Journal const j_; boost::asio::executor_work_guard work_; boost::asio::strand strand_; public: BasePeer( Port const& port, Handler& handler, boost::asio::executor const& executor, endpoint_type remote_address, beast::Journal journal); void close() override; private: Impl& impl() { return *static_cast(this); } }; //------------------------------------------------------------------------------ template BasePeer::BasePeer( Port const& port, Handler& handler, boost::asio::executor const& executor, endpoint_type remote_address, beast::Journal journal) : port_(port) , handler_(handler) , remote_address_(remote_address) , sink_( journal.sink(), [] { static std::atomic id{0}; return "##" + std::to_string(++id) + " "; }()) , j_(sink_) , work_(boost::asio::make_work_guard(executor)) , strand_(boost::asio::make_strand(executor)) { } template void BasePeer::close() { if (!strand_.running_in_this_thread()) return post( strand_, std::bind(&BasePeer::close, impl().shared_from_this())); error_code ec; ripple::get_lowest_layer(impl().ws_).socket().close(ec); } } // namespace ripple #endif