Skip to content

Commit 7bdda0f

Browse files
committed
refactor: introduce dash-serialized-consensus-error-bin header to avoid CBOR
1 parent dd785cc commit 7bdda0f

File tree

4 files changed

+28
-13
lines changed

4 files changed

+28
-13
lines changed

packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ async function createGrpcErrorFromDriveResponse(code, info) {
6464
const message = decodedInfo.message;
6565
const data = decodedInfo.data || {};
6666

67+
const serializedConsensusError = data.serializedError;
68+
delete data.serializedError;
69+
6770
// gRPC error codes
6871
if (code <= 16) {
6972
const CommonErrorClass = COMMON_ERROR_CLASSES[code.toString()];
@@ -111,6 +114,12 @@ async function createGrpcErrorFromDriveResponse(code, info) {
111114

112115
// DPP errors
113116
if (code >= 10000 && code < 50000) {
117+
const consensusMetadata = {
118+
code,
119+
...createRawMetadata(data),
120+
'dash-serialized-consensus-error-bin': serializedConsensusError
121+
};
122+
114123
let consensusError;
115124
try {
116125
consensusError = deserializeConsensusError(data.serializedError || []);
@@ -128,7 +137,7 @@ async function createGrpcErrorFromDriveResponse(code, info) {
128137
if (code >= 10000 && code < 20000) {
129138
return new InvalidArgumentGrpcError(
130139
consensusError.message,
131-
{ code, ...createRawMetadata(data) },
140+
consensusMetadata,
132141
);
133142
}
134143

@@ -137,23 +146,23 @@ async function createGrpcErrorFromDriveResponse(code, info) {
137146
return new GrpcError(
138147
GrpcErrorCodes.UNAUTHENTICATED,
139148
consensusError.message,
140-
{ code, ...createRawMetadata(data) },
149+
consensusMetadata,
141150
);
142151
}
143152

144153
// Fee
145154
if (code >= 30000 && code < 40000) {
146155
return new FailedPreconditionGrpcError(
147156
consensusError.message,
148-
{ code, ...createRawMetadata(data) },
157+
consensusMetadata,
149158
);
150159
}
151160

152161
// State
153162
if (code >= 40000 && code < 50000) {
154163
return new InvalidArgumentGrpcError(
155164
consensusError.message,
156-
{ code, ...createRawMetadata(data) },
165+
consensusMetadata,
157166
);
158167
}
159168
}

packages/js-dapi-client/lib/transport/GrpcTransport/createGrpcTransportError.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,13 @@ async function createGrpcTransportError(grpcError, dapiAddress) {
119119

120120
// DPP consensus errors
121121
if (code >= 10000 && code < 50000) {
122-
const consensusError = deserializeConsensusError(data.serializedError || []);
122+
const consensusErrorString = metadata['dash-serialized-consensus-error-bin'];
123+
if (!consensusErrorString) {
124+
throw new Error(`Can't deserialize consensus error ${code}: serialized data is missing`);
125+
}
126+
127+
const consensusErrorBytes = Buffer.from(consensusErrorString, 'base64');
128+
const consensusError = deserializeConsensusError(consensusErrorBytes);
123129

124130
delete data.serializedError;
125131

packages/rs-dapi-client/src/mock.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@
1111
//!
1212
//! See `tests/mock_dapi_client.rs` for an example.
1313
14-
use crate::{
15-
transport::{TransportClient, TransportRequest},
16-
DapiClientError, DapiRequestExecutor, RequestSettings,
17-
};
14+
use crate::{transport::TransportRequest, DapiClientError, DapiRequestExecutor, RequestSettings};
1815
use dapi_grpc::mock::Mockable;
1916
use dapi_grpc::tonic::async_trait;
2017
use hex::ToHex;
@@ -74,12 +71,12 @@ impl MockDapiClient {
7471
///
7572
/// Panics if the file can't be read or the data can't be parsed.
7673
#[cfg(feature = "dump")]
77-
pub fn load<T: TransportRequest, P: AsRef<std::path::Path>>(
74+
pub fn load<T, P: AsRef<std::path::Path>>(
7875
&mut self,
7976
file: P,
8077
) -> Result<(T, MockResult<T>), std::io::Error>
8178
where
82-
T: Mockable,
79+
T: TransportRequest + Mockable,
8380
T::Response: Mockable,
8481
{
8582
use crate::DumpData;

packages/rs-sdk/src/error.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,14 @@ pub enum Error {
7474
StaleNode(#[from] StaleNodeError),
7575
}
7676

77-
// TODO: Return a more specific errors like connection, node error instead of DAPI client error
77+
// TODO: Decompose DapiClientError to more specific errors like connection, node error instead of DAPI client error
7878
impl From<DapiClientError> for Error {
7979
fn from(value: DapiClientError) -> Self {
8080
if let DapiClientError::Transport(TransportError::Grpc(status), _) = &value {
81-
if let Some(consensus_error_value) = status.metadata().get_bin("drive-error-data-bin") {
81+
if let Some(consensus_error_value) = status
82+
.metadata()
83+
.get_bin("dash-serialized-consensus-error-bin")
84+
{
8285
return ConsensusError::deserialize_from_bytes(
8386
consensus_error_value.as_encoded_bytes(),
8487
)

0 commit comments

Comments
 (0)