Skip to content

Commit 4fa587f

Browse files
authored
Merge pull request #184 from benthecarman/grpc-followups
gRPC follow ups
2 parents 17d3f6f + d048e9f commit 4fa587f

3 files changed

Lines changed: 29 additions & 22 deletions

File tree

ldk-server-client/src/client.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ use ldk_server_grpc::endpoints::{
5353
UNIFIED_SEND_PATH, UPDATE_CHANNEL_CONFIG_PATH, VERIFY_SIGNATURE_PATH,
5454
};
5555
use ldk_server_grpc::events::EventEnvelope;
56-
use ldk_server_grpc::grpc::{decode_grpc_body, encode_grpc_frame, percent_decode};
56+
use ldk_server_grpc::grpc::{
57+
decode_grpc_body, encode_grpc_frame, percent_decode, GRPC_STATUS_FAILED_PRECONDITION,
58+
GRPC_STATUS_INTERNAL, GRPC_STATUS_INVALID_ARGUMENT, GRPC_STATUS_OK,
59+
GRPC_STATUS_UNAUTHENTICATED, GRPC_STATUS_UNAVAILABLE,
60+
};
5761
use prost::Message;
5862
use reqwest::{header::HeaderMap, Certificate, Client};
5963
use rustls::{ClientConfig, RootCertStore};
@@ -506,18 +510,18 @@ impl LdkServerClient {
506510
/// Map a gRPC status code to an LdkServerError.
507511
fn grpc_code_to_error(code: u32, message: String) -> LdkServerError {
508512
match code {
509-
3 => LdkServerError::new(InvalidRequestError, message), // INVALID_ARGUMENT
510-
9 => LdkServerError::new(LightningError, message), // FAILED_PRECONDITION
511-
13 => LdkServerError::new(InternalServerError, message), // INTERNAL
512-
14 => LdkServerError::new(
513+
GRPC_STATUS_INVALID_ARGUMENT => LdkServerError::new(InvalidRequestError, message),
514+
GRPC_STATUS_FAILED_PRECONDITION => LdkServerError::new(LightningError, message),
515+
GRPC_STATUS_INTERNAL => LdkServerError::new(InternalServerError, message),
516+
GRPC_STATUS_UNAVAILABLE => LdkServerError::new(
513517
InternalError,
514518
if message.is_empty() {
515519
"gRPC stream became unavailable".to_string()
516520
} else {
517521
format!("gRPC stream became unavailable: {message}")
518522
},
519523
),
520-
16 => LdkServerError::new(AuthError, message), // UNAUTHENTICATED
524+
GRPC_STATUS_UNAUTHENTICATED => LdkServerError::new(AuthError, message),
521525
_ => LdkServerError::new(
522526
InternalError,
523527
if message.is_empty() {
@@ -531,7 +535,7 @@ fn grpc_code_to_error(code: u32, message: String) -> LdkServerError {
531535

532536
fn grpc_error_from_headers(headers: &HeaderMap) -> Option<LdkServerError> {
533537
let code = headers.get("grpc-status")?.to_str().ok()?.parse::<u32>().ok()?;
534-
if code == 0 {
538+
if code == GRPC_STATUS_OK {
535539
return None;
536540
}
537541

@@ -680,7 +684,7 @@ mod tests {
680684

681685
#[test]
682686
fn test_grpc_code_to_error_marks_unavailable_streams() {
683-
let err = grpc_code_to_error(14, "server shutting down".to_string());
687+
let err = grpc_code_to_error(GRPC_STATUS_UNAVAILABLE, "server shutting down".to_string());
684688
assert_eq!(err.error_code, InternalError);
685689
assert_eq!(err.message, "gRPC stream became unavailable: server shutting down");
686690
}
@@ -710,10 +714,10 @@ mod tests {
710714
#[test]
711715
fn test_grpc_code_to_error_all_known_codes() {
712716
let cases = [
713-
(3u32, InvalidRequestError, "msg"),
714-
(16, AuthError, "msg"),
715-
(9, LightningError, "msg"),
716-
(13, InternalServerError, "msg"),
717+
(GRPC_STATUS_INVALID_ARGUMENT, InvalidRequestError, "msg"),
718+
(GRPC_STATUS_UNAUTHENTICATED, AuthError, "msg"),
719+
(GRPC_STATUS_FAILED_PRECONDITION, LightningError, "msg"),
720+
(GRPC_STATUS_INTERNAL, InternalServerError, "msg"),
717721
];
718722
for (code, expected_error_code, msg) in cases {
719723
let err = grpc_code_to_error(code, msg.to_string());

ldk-server-grpc/src/grpc.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use bytes::{BufMut, Bytes, BytesMut};
1616

1717
// gRPC status codes (a subset — only those we use).
18+
pub const GRPC_STATUS_OK: u32 = 0;
1819
pub const GRPC_STATUS_INVALID_ARGUMENT: u32 = 3;
1920
pub const GRPC_STATUS_DEADLINE_EXCEEDED: u32 = 4;
2021
pub const GRPC_STATUS_FAILED_PRECONDITION: u32 = 9;
@@ -160,7 +161,8 @@ impl http_body::Body for GrpcBody {
160161
/// Build trailers for a successful gRPC response.
161162
fn ok_trailers() -> http::HeaderMap {
162163
let mut trailers = http::HeaderMap::with_capacity(1);
163-
trailers.insert("grpc-status", http::HeaderValue::from_static("0"));
164+
trailers
165+
.insert("grpc-status", http::HeaderValue::from_str(&GRPC_STATUS_OK.to_string()).unwrap());
164166
trailers
165167
}
166168

ldk-server/src/service.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,16 @@ impl Service<Request<Incoming>> for NodeService {
369369
tokio::spawn(async move {
370370
loop {
371371
tokio::select! {
372+
biased;
373+
_ = shutdown_rx.changed() => {
374+
let _ = tx
375+
.send(Err(GrpcStatus::new(
376+
GRPC_STATUS_UNAVAILABLE,
377+
"server shutting down",
378+
)))
379+
.await;
380+
break;
381+
},
372382
result = rx.recv() => {
373383
match result {
374384
Ok(event) => {
@@ -391,15 +401,6 @@ impl Service<Request<Incoming>> for NodeService {
391401
},
392402
}
393403
},
394-
_ = shutdown_rx.changed() => {
395-
let _ = tx
396-
.send(Err(GrpcStatus::new(
397-
GRPC_STATUS_UNAVAILABLE,
398-
"server shutting down",
399-
)))
400-
.await;
401-
break;
402-
},
403404
}
404405
}
405406
});

0 commit comments

Comments
 (0)