rpc: Update jsonrpsee v0.15.1 (#11939)

* Bump jsonrpsee to v0.15.1

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* Update cargo.lock

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc-servers: Adjust RpcMiddleware to WS and HTTP traits

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc/author: Use `SubscriptionSink`

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc/chain: Use `SubscriptionSink`

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc/state:  Use `SubscriptionSink`

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc/finality-grandpa: Use `SubscriptionSink`

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc/beefy: Use `SubscriptionSink`

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* client: Extract RPC string result from queries

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* Apply rust-fmt

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* Fix warnings

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* Fix testing

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc/tests: Remove trailing comma

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc: Use `SubscriptionResult` for implementations

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc: Remove comment

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc: Delegate middleware calls to `RpcMiddleware`

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc: Remove comment

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* Revert Cargo.lock

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* Update Cargo.lock with minimal changes

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc: Update imports for `SubscriptionResult`

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* Apply cargo fmt

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>

* rpc/tests: Submit raw json requests to validate DenyUnsafe

Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>
This commit is contained in:
Alexandru Vasile
2022-08-02 20:00:18 +03:00
committed by GitHub
parent 103f770e75
commit 63f847c24f
32 changed files with 201 additions and 136 deletions
+7 -10
View File
@@ -29,7 +29,8 @@ use codec::{Decode, Encode};
use futures::{FutureExt, TryFutureExt};
use jsonrpsee::{
core::{async_trait, Error as JsonRpseeError, RpcResult},
PendingSubscription,
types::SubscriptionResult,
SubscriptionSink,
};
use sc_rpc_api::DenyUnsafe;
use sc_transaction_pool_api::{
@@ -176,13 +177,13 @@ where
.collect())
}
fn watch_extrinsic(&self, pending: PendingSubscription, xt: Bytes) {
fn watch_extrinsic(&self, mut sink: SubscriptionSink, xt: Bytes) -> SubscriptionResult {
let best_block_hash = self.client.info().best_hash;
let dxt = match TransactionFor::<P>::decode(&mut &xt[..]).map_err(|e| Error::from(e)) {
Ok(dxt) => dxt,
Err(e) => {
pending.reject(JsonRpseeError::from(e));
return
let _ = sink.reject(JsonRpseeError::from(e));
return Ok(())
},
};
@@ -199,19 +200,15 @@ where
let stream = match submit.await {
Ok(stream) => stream,
Err(err) => {
pending.reject(JsonRpseeError::from(err));
let _ = sink.reject(JsonRpseeError::from(err));
return
},
};
let mut sink = match pending.accept() {
Some(sink) => sink,
_ => return,
};
sink.pipe_from_stream(stream).await;
};
self.executor.spawn("substrate-rpc-subscription", Some("rpc"), fut.boxed());
Ok(())
}
}
+6 -8
View File
@@ -26,7 +26,7 @@ use futures::{
future::{self, FutureExt},
stream::{self, Stream, StreamExt},
};
use jsonrpsee::PendingSubscription;
use jsonrpsee::SubscriptionSink;
use sc_client_api::{BlockBackend, BlockchainEvents};
use sp_blockchain::HeaderBackend;
use sp_runtime::{
@@ -69,7 +69,7 @@ where
self.client.block(&BlockId::Hash(self.unwrap_or_best(hash))).map_err(client_err)
}
fn subscribe_all_heads(&self, sink: PendingSubscription) {
fn subscribe_all_heads(&self, sink: SubscriptionSink) {
subscribe_headers(
&self.client,
&self.executor,
@@ -83,7 +83,7 @@ where
)
}
fn subscribe_new_heads(&self, sink: PendingSubscription) {
fn subscribe_new_heads(&self, sink: SubscriptionSink) {
subscribe_headers(
&self.client,
&self.executor,
@@ -98,7 +98,7 @@ where
)
}
fn subscribe_finalized_heads(&self, sink: PendingSubscription) {
fn subscribe_finalized_heads(&self, sink: SubscriptionSink) {
subscribe_headers(
&self.client,
&self.executor,
@@ -117,7 +117,7 @@ where
fn subscribe_headers<Block, Client, F, G, S>(
client: &Arc<Client>,
executor: &SubscriptionTaskExecutor,
pending: PendingSubscription,
mut sink: SubscriptionSink,
best_block_hash: G,
stream: F,
) where
@@ -143,9 +143,7 @@ fn subscribe_headers<Block, Client, F, G, S>(
let stream = stream::iter(maybe_header).chain(stream());
let fut = async move {
if let Some(mut sink) = pending.accept() {
sink.pipe_from_stream(stream).await;
}
sink.pipe_from_stream(stream).await;
};
executor.spawn("substrate-rpc-subscription", Some("rpc"), fut.boxed());
+13 -10
View File
@@ -27,7 +27,7 @@ use std::sync::Arc;
use crate::SubscriptionTaskExecutor;
use jsonrpsee::{core::RpcResult, PendingSubscription};
use jsonrpsee::{core::RpcResult, types::SubscriptionResult, SubscriptionSink};
use sc_client_api::BlockchainEvents;
use sp_rpc::{list::ListOrValue, number::NumberOrHex};
use sp_runtime::{
@@ -95,13 +95,13 @@ where
}
/// All new head subscription
fn subscribe_all_heads(&self, sink: PendingSubscription);
fn subscribe_all_heads(&self, sink: SubscriptionSink);
/// New best head subscription
fn subscribe_new_heads(&self, sink: PendingSubscription);
fn subscribe_new_heads(&self, sink: SubscriptionSink);
/// Finalized head subscription
fn subscribe_finalized_heads(&self, sink: PendingSubscription);
fn subscribe_finalized_heads(&self, sink: SubscriptionSink);
}
/// Create new state API that works on full node.
@@ -160,16 +160,19 @@ where
self.backend.finalized_head().map_err(Into::into)
}
fn subscribe_all_heads(&self, sink: PendingSubscription) {
self.backend.subscribe_all_heads(sink)
fn subscribe_all_heads(&self, sink: SubscriptionSink) -> SubscriptionResult {
self.backend.subscribe_all_heads(sink);
Ok(())
}
fn subscribe_new_heads(&self, sink: PendingSubscription) {
self.backend.subscribe_new_heads(sink)
fn subscribe_new_heads(&self, sink: SubscriptionSink) -> SubscriptionResult {
self.backend.subscribe_new_heads(sink);
Ok(())
}
fn subscribe_finalized_heads(&self, sink: PendingSubscription) {
self.backend.subscribe_finalized_heads(sink)
fn subscribe_finalized_heads(&self, sink: SubscriptionSink) -> SubscriptionResult {
self.backend.subscribe_finalized_heads(sink);
Ok(())
}
}
+13 -6
View File
@@ -17,8 +17,6 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use super::*;
use assert_matches::assert_matches;
use jsonrpsee::{core::Error as JsonRpseeError, types::error::CallError};
use sc_block_builder::BlockBuilderProvider;
use sp_blockchain::HeaderBackend;
use sp_consensus::BlockOrigin;
@@ -61,9 +59,18 @@ async fn deny_unsafe_works() {
let block = client.new_block(Default::default()).unwrap().build().unwrap().block;
client.import(BlockOrigin::Own, block).await.unwrap();
assert_matches!(
api.call::<_, Option<BlockStats>>("dev_getBlockStats", [client.info().best_hash])
.await,
Err(JsonRpseeError::Call(CallError::Custom(err))) if err.message().contains("RPC call is unsafe to be called externally")
let best_hash = client.info().best_hash;
let best_hash_param =
serde_json::to_string(&best_hash).expect("To string must always succeed for block hashes");
let request = format!(
"{{\"jsonrpc\":\"2.0\",\"method\":\"dev_getBlockStats\",\"params\":[{}],\"id\":1}}",
best_hash_param
);
let (resp, _) = api.raw_json_request(&request).await.expect("Raw calls should succeed");
assert_eq!(
resp.result,
r#"{"jsonrpc":"2.0","error":{"code":-32601,"message":"RPC call is unsafe to be called externally"},"id":1}"#
);
}
+15 -8
View File
@@ -29,7 +29,8 @@ use crate::SubscriptionTaskExecutor;
use jsonrpsee::{
core::{Error as JsonRpseeError, RpcResult},
ws_server::PendingSubscription,
types::SubscriptionResult,
ws_server::SubscriptionSink,
};
use sc_rpc_api::{state::ReadProof, DenyUnsafe};
@@ -155,10 +156,10 @@ where
) -> Result<sp_rpc::tracing::TraceBlockResponse, Error>;
/// New runtime version subscription
fn subscribe_runtime_version(&self, sink: PendingSubscription);
fn subscribe_runtime_version(&self, sink: SubscriptionSink);
/// New storage subscription
fn subscribe_storage(&self, sink: PendingSubscription, keys: Option<Vec<StorageKey>>);
fn subscribe_storage(&self, sink: SubscriptionSink, keys: Option<Vec<StorageKey>>);
}
/// Create new state API that works on full node.
@@ -318,19 +319,25 @@ where
.map_err(Into::into)
}
fn subscribe_runtime_version(&self, sink: PendingSubscription) {
self.backend.subscribe_runtime_version(sink)
fn subscribe_runtime_version(&self, sink: SubscriptionSink) -> SubscriptionResult {
self.backend.subscribe_runtime_version(sink);
Ok(())
}
fn subscribe_storage(&self, sink: PendingSubscription, keys: Option<Vec<StorageKey>>) {
fn subscribe_storage(
&self,
mut sink: SubscriptionSink,
keys: Option<Vec<StorageKey>>,
) -> SubscriptionResult {
if keys.is_none() {
if let Err(err) = self.deny_unsafe.check_if_safe() {
let _ = sink.reject(JsonRpseeError::from(err));
return
return Ok(())
}
}
self.backend.subscribe_storage(sink, keys)
self.backend.subscribe_storage(sink, keys);
Ok(())
}
}
+7 -11
View File
@@ -28,7 +28,7 @@ use super::{
use crate::SubscriptionTaskExecutor;
use futures::{future, stream, FutureExt, StreamExt};
use jsonrpsee::{core::Error as JsonRpseeError, PendingSubscription};
use jsonrpsee::{core::Error as JsonRpseeError, SubscriptionSink};
use sc_client_api::{
Backend, BlockBackend, BlockchainEvents, CallExecutor, ExecutorProvider, ProofProvider,
StorageProvider,
@@ -357,7 +357,7 @@ where
.map_err(client_err)
}
fn subscribe_runtime_version(&self, pending: PendingSubscription) {
fn subscribe_runtime_version(&self, mut sink: SubscriptionSink) {
let client = self.client.clone();
let initial = match self
@@ -369,7 +369,7 @@ where
{
Ok(initial) => initial,
Err(e) => {
pending.reject(JsonRpseeError::from(e));
let _ = sink.reject(JsonRpseeError::from(e));
return
},
};
@@ -397,19 +397,17 @@ where
let stream = futures::stream::once(future::ready(initial)).chain(version_stream);
let fut = async move {
if let Some(mut sink) = pending.accept() {
sink.pipe_from_stream(stream).await;
}
sink.pipe_from_stream(stream).await;
};
self.executor.spawn("substrate-rpc-subscription", Some("rpc"), fut.boxed());
}
fn subscribe_storage(&self, pending: PendingSubscription, keys: Option<Vec<StorageKey>>) {
fn subscribe_storage(&self, mut sink: SubscriptionSink, keys: Option<Vec<StorageKey>>) {
let stream = match self.client.storage_changes_notification_stream(keys.as_deref(), None) {
Ok(stream) => stream,
Err(blockchain_err) => {
pending.reject(JsonRpseeError::from(Error::Client(Box::new(blockchain_err))));
let _ = sink.reject(JsonRpseeError::from(Error::Client(Box::new(blockchain_err))));
return
},
};
@@ -442,9 +440,7 @@ where
.filter(|storage| future::ready(!storage.changes.is_empty()));
let fut = async move {
if let Some(mut sink) = pending.accept() {
sink.pipe_from_stream(stream).await;
}
sink.pipe_from_stream(stream).await;
};
self.executor.spawn("substrate-rpc-subscription", Some("rpc"), fut.boxed());