// Copyright 2019-2022 Parity Technologies (UK) Ltd. // This file is dual-licensed as Apache-2.0 or GPL-3.0. // see LICENSE for license details. use super::{RpcClientT, RpcFuture, RpcSubscription}; use crate::error::RpcError; use futures::stream::{StreamExt, TryStreamExt}; use jsonrpsee::{ core::{ client::{Client, ClientT, SubscriptionClientT, SubscriptionKind}, traits::ToRpcParams, Error as JsonRpseeError, }, types::SubscriptionId, }; use serde_json::value::RawValue; struct Params(Option>); impl ToRpcParams for Params { fn to_rpc_params(self) -> Result>, JsonRpseeError> { Ok(self.0) } } impl RpcClientT for Client { fn request_raw<'a>( &'a self, method: &'a str, params: Option>, ) -> RpcFuture<'a, Box> { Box::pin(async move { let res = ClientT::request(self, method, Params(params)) .await .map_err(|e| RpcError::ClientError(Box::new(e)))?; Ok(res) }) } fn subscribe_raw<'a>( &'a self, sub: &'a str, params: Option>, unsub: &'a str, ) -> RpcFuture<'a, RpcSubscription> { Box::pin(async move { let stream = SubscriptionClientT::subscribe::, _>( self, sub, Params(params), unsub, ) .await .map_err(|e| RpcError::ClientError(Box::new(e)))?; let id = match stream.kind() { SubscriptionKind::Subscription(SubscriptionId::Str(id)) => { Some(id.clone().into_owned()) } _ => None, }; let stream = stream .map_err(|e| RpcError::ClientError(Box::new(e))) .boxed(); Ok(RpcSubscription { stream, id }) }) } }