From d49387140aa04183b612bbb296d9ccad20a258d1 Mon Sep 17 00:00:00 2001 From: Maggie Choy Date: Wed, 17 Sep 2025 11:43:11 -0700 Subject: [PATCH 1/3] treat presence of result value as null as success --- core/main/src/firebolt/rpc_router.rs | 105 ++++++++++++++++++++------- 1 file changed, 77 insertions(+), 28 deletions(-) diff --git a/core/main/src/firebolt/rpc_router.rs b/core/main/src/firebolt/rpc_router.rs index 4a2c1c5fd..997654b49 100644 --- a/core/main/src/firebolt/rpc_router.rs +++ b/core/main/src/firebolt/rpc_router.rs @@ -15,6 +15,7 @@ // SPDX-License-Identifier: Apache-2.0 // +use crate::tokio::sync::mpsc::Sender; use futures::StreamExt; use jsonrpsee::{ core::server::{ @@ -33,8 +34,9 @@ use ripple_sdk::{ extn::extn_client_message::ExtnMessage, log::{debug, error, info}, service::service_message::{ - Id as ServiceMessageId, JsonRpcMessage as ServiceJsonRpcMessage, - JsonRpcSuccess as ServiceJsonRpcSuccess, ServiceMessage, + Id as ServiceMessageId, JsonRpcError, JsonRpcErrorDetails, + JsonRpcMessage as ServiceJsonRpcMessage, JsonRpcSuccess as ServiceJsonRpcSuccess, + ServiceMessage, }, tokio, tokio_tungstenite::tungstenite::Message, @@ -203,7 +205,6 @@ async fn resolve_route( if let Some(api_stats) = platform_state.metrics.get_api_stats(&request_id) { msg.stats = Some(api_stats); } - return Ok(msg); } error!("Invalid output from method sink"); @@ -285,34 +286,68 @@ impl RpcRouter { serde_json::from_str::(msg.jsonrpc_msg.clone().as_str()) .unwrap(); - let result = json_rpc_response.get("result").cloned().unwrap_or_default(); - let jsonrpc = serde_json::to_string( - &json_rpc_response - .get("jsonrpc") - .cloned() - .unwrap_or_default(), - ) - .unwrap(); - let id = ServiceMessageId::String(msg.request_id.clone()); + // Treat presence of 'result' key (even if null) as success + if json_rpc_response.get("result").is_some() { + let result = json_rpc_response.get("result").cloned().unwrap(); + let jsonrpc = serde_json::to_string( + &json_rpc_response + .get("jsonrpc") + .cloned() + .unwrap_or_default(), + ) + .unwrap(); + let id = ServiceMessageId::String(msg.request_id.clone()); - let service_message = ServiceMessage { - message: ServiceJsonRpcMessage::Success(ServiceJsonRpcSuccess { - result, - jsonrpc, - id, - }), - context: Some(serde_json::to_value(req.ctx.clone()).unwrap_or_default()), - }; - let msg_str = serde_json::to_string(&service_message).unwrap(); - let message = Message::Text(msg_str.clone()); - debug!("Sending response to service {}: {:?}", service_id, message); - if let Err(err) = sender.try_send(message) { + let service_message = ServiceMessage { + message: ServiceJsonRpcMessage::Success(ServiceJsonRpcSuccess { + result, + jsonrpc, + id, + }), + context: Some( + serde_json::to_value(req.ctx.clone()).unwrap_or_default(), + ), + }; + send_response(&service_id, &sender, &service_message); + } else if let Some(error) = json_rpc_response.get("error") { + if !error.is_null() { + let jsonrpc = serde_json::to_string( + &json_rpc_response + .get("jsonrpc") + .cloned() + .unwrap_or_default(), + ) + .unwrap(); + let id = ServiceMessageId::String(msg.request_id.clone()); + let details = JsonRpcErrorDetails { + code: -32600, + message: "Ripple Main does not support this request from Service" + .to_string(), + data: Some(error.clone()), + }; + + let service_message = ServiceMessage { + message: ServiceJsonRpcMessage::Error(JsonRpcError { + error: details, + jsonrpc, + id, + }), + context: Some( + serde_json::to_value(req.ctx.clone()).unwrap_or_default(), + ), + }; + send_response(&service_id, &sender, &service_message); + } else { + error!( + "Received unexpected response from service {:?}", + json_rpc_response + ); + } + } else { error!( - "Failed to send request to service {}: {:?}", - service_id, err + "Received unexpected response from service {:?}", + json_rpc_response ); - } else { - debug!("Successfully sent request to service: {}", service_id); } } else { error!( @@ -333,3 +368,17 @@ impl RpcRouter { }); } } + +fn send_response(service_id: &str, sender: &Sender, service_message: &ServiceMessage) { + let msg_str = serde_json::to_string(&service_message).unwrap(); + let message = Message::Text(msg_str.clone()); + debug!("Sending response to service {}: {:?}", service_id, message); + if let Err(err) = sender.try_send(message) { + error!( + "Failed to send request to service {}: {:?}", + service_id, err + ); + } else { + debug!("Successfully sent request to service: {}", service_id); + } +} \ No newline at end of file From c03dda267992d1847ab3ca83d4e38c88ef9f7b0b Mon Sep 17 00:00:00 2001 From: Maggie Choy Date: Thu, 18 Sep 2025 09:10:35 -0700 Subject: [PATCH 2/3] fix: changed log level to warn for service attempts connection to ripple main --- core/sdk/src/utils/ws_utils.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/sdk/src/utils/ws_utils.rs b/core/sdk/src/utils/ws_utils.rs index 62eea7e23..0dd16a1e9 100644 --- a/core/sdk/src/utils/ws_utils.rs +++ b/core/sdk/src/utils/ws_utils.rs @@ -19,7 +19,7 @@ use std::time::Duration; use futures::stream::{SplitSink, SplitStream}; use futures_util::StreamExt; -use log::{error, info}; +use log::{error, info, warn}; use tokio::net::TcpStream; use tokio_tungstenite::{client_async, tungstenite::Message, WebSocketStream}; @@ -226,7 +226,7 @@ impl WebSocketUtils { } } index += 1; - error!( + warn!( "new Websocket TCP Connection with {} failed with retry for last {} millisecs in {}", url_path, delay_duration.as_millis(), From 314ffb0021248bd8f5ae8f46b6f10960dcefd04a Mon Sep 17 00:00:00 2001 From: Maggie Choy Date: Thu, 18 Sep 2025 09:19:16 -0700 Subject: [PATCH 3/3] update code --- core/main/src/firebolt/rpc_router.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/main/src/firebolt/rpc_router.rs b/core/main/src/firebolt/rpc_router.rs index 997654b49..b1c8a72cc 100644 --- a/core/main/src/firebolt/rpc_router.rs +++ b/core/main/src/firebolt/rpc_router.rs @@ -381,4 +381,4 @@ fn send_response(service_id: &str, sender: &Sender, service_message: &S } else { debug!("Successfully sent request to service: {}", service_id); } -} \ No newline at end of file +}