@@ -3,26 +3,53 @@ use crate::api::error::LdkServerErrorCode::InvalidRequestError;
33use crate :: service:: Context ;
44use ldk_node:: bitcoin:: secp256k1:: PublicKey ;
55use ldk_node:: UserChannelId ;
6- use ldk_server_protos:: api:: { CloseChannelRequest , CloseChannelResponse } ;
6+ use ldk_server_protos:: api:: {
7+ CloseChannelRequest , CloseChannelResponse , ForceCloseChannelRequest , ForceCloseChannelResponse ,
8+ } ;
79use std:: str:: FromStr ;
810
911pub ( crate ) const CLOSE_CHANNEL_PATH : & str = "CloseChannel" ;
1012
1113pub ( crate ) fn handle_close_channel_request (
1214 context : Context , request : CloseChannelRequest ,
1315) -> Result < CloseChannelResponse , LdkServerError > {
14- let user_channel_id =
15- UserChannelId ( ( & request. user_channel_id ) . parse :: < u128 > ( ) . map_err ( |_| {
16- LdkServerError :: new ( InvalidRequestError , "Invalid UserChannelId." . to_string ( ) )
17- } ) ?) ;
18- let counterparty_node_id = PublicKey :: from_str ( & request. counterparty_node_id ) . map_err ( |e| {
16+ let user_channel_id = parse_user_channel_id ( & request. user_channel_id ) ?;
17+ let counterparty_node_id = parse_counterparty_node_id ( & request. counterparty_node_id ) ?;
18+
19+ context. node . close_channel ( & user_channel_id, counterparty_node_id) ?;
20+
21+ Ok ( CloseChannelResponse { } )
22+ }
23+
24+ pub ( crate ) const FORCE_CLOSE_CHANNEL_PATH : & str = "ForceCloseChannel" ;
25+
26+ pub ( crate ) fn handle_force_close_channel_request (
27+ context : Context , request : ForceCloseChannelRequest ,
28+ ) -> Result < ForceCloseChannelResponse , LdkServerError > {
29+ let user_channel_id = parse_user_channel_id ( & request. user_channel_id ) ?;
30+ let counterparty_node_id = parse_counterparty_node_id ( & request. counterparty_node_id ) ?;
31+
32+ context. node . force_close_channel (
33+ & user_channel_id,
34+ counterparty_node_id,
35+ request. force_close_reason ,
36+ ) ?;
37+
38+ Ok ( ForceCloseChannelResponse { } )
39+ }
40+
41+ fn parse_user_channel_id ( id : & str ) -> Result < UserChannelId , LdkServerError > {
42+ let parsed = id. parse :: < u128 > ( ) . map_err ( |_| {
43+ LdkServerError :: new ( InvalidRequestError , "Invalid UserChannelId." . to_string ( ) )
44+ } ) ?;
45+ Ok ( UserChannelId ( parsed) )
46+ }
47+
48+ fn parse_counterparty_node_id ( id : & str ) -> Result < PublicKey , LdkServerError > {
49+ PublicKey :: from_str ( id) . map_err ( |e| {
1950 LdkServerError :: new (
2051 InvalidRequestError ,
2152 format ! ( "Invalid counterparty node ID, error: {}" , e) ,
2253 )
23- } ) ?;
24- context. node . close_channel ( & user_channel_id, counterparty_node_id) ?;
25-
26- let response = CloseChannelResponse { } ;
27- Ok ( response)
54+ } )
2855}
0 commit comments