diff --git a/include/fc/rpc/websocket_api.hpp b/include/fc/rpc/websocket_api.hpp index ebb6fe7..61348ce 100755 --- a/include/fc/rpc/websocket_api.hpp +++ b/include/fc/rpc/websocket_api.hpp @@ -10,7 +10,7 @@ namespace fc { namespace rpc { class websocket_api_connection : public api_connection { public: - websocket_api_connection( fc::http::websocket_connection& c, uint32_t max_conversion_depth ); + websocket_api_connection( const std::shared_ptr &c, uint32_t max_conversion_depth ); ~websocket_api_connection(); virtual variant send_call( @@ -29,7 +29,7 @@ namespace fc { namespace rpc { const std::string& message, bool send_message = true ); - fc::http::websocket_connection& _connection; + std::shared_ptr _connection; fc::rpc::state _rpc_state; }; diff --git a/src/rpc/websocket_api.cpp b/src/rpc/websocket_api.cpp index ae4e26e..5f3af85 100755 --- a/src/rpc/websocket_api.cpp +++ b/src/rpc/websocket_api.cpp @@ -7,9 +7,10 @@ websocket_api_connection::~websocket_api_connection() { } -websocket_api_connection::websocket_api_connection( fc::http::websocket_connection& c, uint32_t max_depth ) +websocket_api_connection::websocket_api_connection( const std::shared_ptr& c, uint32_t max_depth ) : api_connection(max_depth),_connection(c) { + FC_ASSERT( c ); _rpc_state.add_method( "call", [this]( const variants& args ) -> variant { FC_ASSERT( args.size() == 3 && args[2].is_array() ); @@ -47,9 +48,9 @@ websocket_api_connection::websocket_api_connection( fc::http::websocket_connecti return this->receive_call( 0, method_name, args ); } ); - _connection.on_message_handler( [&]( const std::string& msg ){ on_message(msg,true); } ); - _connection.on_http_handler( [&]( const std::string& msg ){ return on_message(msg,false); } ); - _connection.closed.connect( [this](){ closed(); } ); + _connection->on_message_handler( [&]( const std::string& msg ){ on_message(msg,true); } ); + _connection->on_http_handler( [&]( const std::string& msg ){ return on_message(msg,false); } ); + _connection->closed.connect( [this](){ closed(); } ); } variant websocket_api_connection::send_call( @@ -57,29 +58,40 @@ variant websocket_api_connection::send_call( string method_name, variants args /* = variants() */ ) { - auto request = _rpc_state.start_remote_call( "call", {api_id, std::move(method_name), std::move(args) } ); - _connection.send_message( fc::json::to_string(fc::variant(request, _max_conversion_depth), + if( _connection ) + { + auto request = _rpc_state.start_remote_call( "call", {api_id, std::move(method_name), std::move(args) } ); + _connection->send_message( fc::json::to_string(fc::variant(request, _max_conversion_depth), fc::json::stringify_large_ints_and_doubles, _max_conversion_depth ) ); - return _rpc_state.wait_for_response( *request.id ); + return _rpc_state.wait_for_response( *request.id ); + } + return variant(); } variant websocket_api_connection::send_callback( uint64_t callback_id, variants args /* = variants() */ ) { - auto request = _rpc_state.start_remote_call( "callback", {callback_id, std::move(args) } ); - _connection.send_message( fc::json::to_string(fc::variant(request, _max_conversion_depth), + if( _connection ) + { + auto request = _rpc_state.start_remote_call( "callback", {callback_id, std::move(args) } ); + _connection->send_message( fc::json::to_string(fc::variant(request, _max_conversion_depth), fc::json::stringify_large_ints_and_doubles, _max_conversion_depth ) ); - return _rpc_state.wait_for_response( *request.id ); + return _rpc_state.wait_for_response( *request.id ); + } + return variant(); } void websocket_api_connection::send_notice( uint64_t callback_id, variants args /* = variants() */ ) { - fc::rpc::request req{ optional(), "notice", {callback_id, std::move(args)}}; - _connection.send_message( fc::json::to_string(fc::variant(req, _max_conversion_depth), + if( _connection ) + { + fc::rpc::request req{ optional(), "notice", {callback_id, std::move(args)}}; + _connection.send_message( fc::json::to_string(fc::variant(req, _max_conversion_depth), fc::json::stringify_large_ints_and_doubles, _max_conversion_depth ) ); + } } std::string websocket_api_connection::on_message( @@ -117,8 +129,8 @@ std::string websocket_api_connection::on_message( if( call.id ) { auto reply = fc::json::to_string( response( *call.id, result, "2.0" ), fc::json::stringify_large_ints_and_doubles, _max_conversion_depth ); - if( send_message ) - _connection.send_message( reply ); + if( send_message && _connection ) + _connection->send_message( reply ); return reply; } } @@ -135,8 +147,8 @@ std::string websocket_api_connection::on_message( auto reply = fc::json::to_string( variant(response( *call.id, error_object{ 1, optexcept->to_string(), fc::variant(*optexcept, _max_conversion_depth)}, "2.0" ), _max_conversion_depth ), fc::json::stringify_large_ints_and_doubles, _max_conversion_depth ); - if( send_message ) - _connection.send_message( reply ); + if( send_message && _connection ) + _connection->send_message( reply ); return reply; } diff --git a/tests/api.cpp b/tests/api.cpp index e0514c3..fbe42f2 100755 --- a/tests/api.cpp +++ b/tests/api.cpp @@ -61,7 +61,7 @@ int main( int argc, char** argv ) fc::http::websocket_server server; server.on_connection([&]( const websocket_connection_ptr& c ){ - auto wsc = std::make_shared(*c, MAX_DEPTH); + auto wsc = std::make_shared(c, MAX_DEPTH); auto login = std::make_shared(); login->calc = calc_api; wsc->register_api(fc::api(login)); @@ -76,7 +76,7 @@ int main( int argc, char** argv ) try { fc::http::websocket_client client; auto con = client.connect( "ws://localhost:8090" ); - auto apic = std::make_shared(*con, MAX_DEPTH); + auto apic = std::make_shared(con, MAX_DEPTH); auto remote_login_api = apic->get_remote_api(); auto remote_calc = remote_login_api->get_calc(); remote_calc->on_result( []( uint32_t r ) { elog( "callback result ${r}", ("r",r) ); } );