@@ -3,26 +3,53 @@ use crate::api::error::LdkServerErrorCode::InvalidRequestError;
3
3
use crate :: service:: Context ;
4
4
use ldk_node:: bitcoin:: secp256k1:: PublicKey ;
5
5
use ldk_node:: UserChannelId ;
6
- use ldk_server_protos:: api:: { CloseChannelRequest , CloseChannelResponse } ;
6
+ use ldk_server_protos:: api:: {
7
+ CloseChannelRequest , CloseChannelResponse , ForceCloseChannelRequest , ForceCloseChannelResponse ,
8
+ } ;
7
9
use std:: str:: FromStr ;
8
10
9
11
pub ( crate ) const CLOSE_CHANNEL_PATH : & str = "CloseChannel" ;
10
12
11
13
pub ( crate ) fn handle_close_channel_request (
12
14
context : Context , request : CloseChannelRequest ,
13
15
) -> 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| {
19
50
LdkServerError :: new (
20
51
InvalidRequestError ,
21
52
format ! ( "Invalid counterparty node ID, error: {}" , e) ,
22
53
)
23
- } ) ?;
24
- context. node . close_channel ( & user_channel_id, counterparty_node_id) ?;
25
-
26
- let response = CloseChannelResponse { } ;
27
- Ok ( response)
54
+ } )
28
55
}
0 commit comments