@@ -10,10 +10,10 @@ use cln_grpc::pb::{
1010} ;
1111use lightning:: ln:: features:: NodeFeatures ;
1212use lightning:: ln:: PaymentHash ;
13-
1413use serde:: { Deserialize , Serialize } ;
1514use tokio:: fs:: File ;
1615use tokio:: io:: { AsyncReadExt , Error } ;
16+ use tokio:: sync:: Mutex ;
1717use tokio:: time:: { self , Duration } ;
1818use tonic:: transport:: { Certificate , Channel , ClientTlsConfig , Identity } ;
1919use triggered:: Listener ;
@@ -38,7 +38,7 @@ pub struct ClnConnection {
3838}
3939
4040pub struct ClnNode {
41- pub client : NodeClient < Channel > ,
41+ pub client : Mutex < NodeClient < Channel > > ,
4242 info : NodeInfo ,
4343}
4444
@@ -63,7 +63,7 @@ impl ClnNode {
6363 } ) ?,
6464 ) ) ;
6565
66- let mut client = NodeClient :: new (
66+ let client = Mutex :: new ( NodeClient :: new (
6767 Channel :: from_shared ( connection. address )
6868 . map_err ( |err| LightningError :: ConnectionError ( err. to_string ( ) ) ) ?
6969 . tls_config ( tls)
@@ -81,9 +81,11 @@ impl ClnNode {
8181 err
8282 ) )
8383 } ) ?,
84- ) ;
84+ ) ) ;
8585
8686 let ( id, mut alias, our_features) = client
87+ . lock ( )
88+ . await
8789 . getinfo ( GetinfoRequest { } )
8890 . await
8991 . map ( |r| {
@@ -119,7 +121,7 @@ impl ClnNode {
119121 /// Fetch channels belonging to the local node, initiated locally if is_source is true, and initiated remotely if
120122 /// is_source is false. Introduced as a helper function because CLN doesn't have a single API to list all of our
121123 /// node's channels.
122- async fn node_channels ( & mut self , is_source : bool ) -> Result < Vec < u64 > , LightningError > {
124+ async fn node_channels ( & self , is_source : bool ) -> Result < Vec < u64 > , LightningError > {
123125 let req = if is_source {
124126 ListchannelsRequest {
125127 source : Some ( self . info . pubkey . serialize ( ) . to_vec ( ) ) ,
@@ -134,6 +136,8 @@ impl ClnNode {
134136
135137 let resp = self
136138 . client
139+ . lock ( )
140+ . await
137141 . list_channels ( req)
138142 . await
139143 . map_err ( |err| LightningError :: ListChannelsError ( err. to_string ( ) ) ) ?
@@ -153,9 +157,9 @@ impl LightningNode for ClnNode {
153157 & self . info
154158 }
155159
156- async fn get_network ( & mut self ) -> Result < Network , LightningError > {
157- let info = self
158- . client
160+ async fn get_network ( & self ) -> Result < Network , LightningError > {
161+ let mut client = self . client . lock ( ) . await ;
162+ let info = client
159163 . getinfo ( GetinfoRequest { } )
160164 . await
161165 . map_err ( |err| LightningError :: GetInfoError ( err. to_string ( ) ) ) ?
@@ -166,12 +170,12 @@ impl LightningNode for ClnNode {
166170 }
167171
168172 async fn send_payment (
169- & mut self ,
173+ & self ,
170174 dest : PublicKey ,
171175 amount_msat : u64 ,
172176 ) -> Result < PaymentHash , LightningError > {
173- let KeysendResponse { payment_hash , .. } = self
174- . client
177+ let mut client = self . client . lock ( ) . await ;
178+ let KeysendResponse { payment_hash , .. } = client
175179 . key_send ( KeysendRequest {
176180 destination : dest. serialize ( ) . to_vec ( ) ,
177181 amount_msat : Some ( Amount { msat : amount_msat } ) ,
@@ -200,7 +204,7 @@ impl LightningNode for ClnNode {
200204 }
201205
202206 async fn track_payment (
203- & mut self ,
207+ & self ,
204208 hash : & PaymentHash ,
205209 shutdown : Listener ,
206210 ) -> Result < PaymentResult , LightningError > {
@@ -211,8 +215,8 @@ impl LightningNode for ClnNode {
211215 return Err ( LightningError :: TrackPaymentError ( "Shutdown before tracking results" . to_string( ) ) ) ;
212216 } ,
213217 _ = time:: sleep( Duration :: from_millis( 500 ) ) => {
214- let ListpaysResponse { pays } = self
215- . client
218+ let mut client = self . client . lock ( ) . await ;
219+ let ListpaysResponse { pays } = client
216220 . list_pays( ListpaysRequest {
217221 payment_hash: Some ( hash. 0 . to_vec( ) ) ,
218222 ..Default :: default ( )
@@ -242,9 +246,9 @@ impl LightningNode for ClnNode {
242246 }
243247 }
244248
245- async fn get_node_info ( & mut self , node_id : & PublicKey ) -> Result < NodeInfo , LightningError > {
246- let mut nodes : Vec < cln_grpc :: pb :: ListnodesNodes > = self
247- . client
249+ async fn get_node_info ( & self , node_id : & PublicKey ) -> Result < NodeInfo , LightningError > {
250+ let mut client = self . client . lock ( ) . await ;
251+ let mut nodes : Vec < cln_grpc :: pb :: ListnodesNodes > = client
248252 . list_nodes ( ListnodesRequest {
249253 id : Some ( node_id. serialize ( ) . to_vec ( ) ) ,
250254 } )
@@ -270,15 +274,15 @@ impl LightningNode for ClnNode {
270274 }
271275 }
272276
273- async fn list_channels ( & mut self ) -> Result < Vec < u64 > , LightningError > {
277+ async fn list_channels ( & self ) -> Result < Vec < u64 > , LightningError > {
274278 let mut node_channels = self . node_channels ( true ) . await ?;
275279 node_channels. extend ( self . node_channels ( false ) . await ?) ;
276280 Ok ( node_channels)
277281 }
278282
279- async fn get_graph ( & mut self ) -> Result < Graph , LightningError > {
280- let nodes : Vec < cln_grpc :: pb :: ListnodesNodes > = self
281- . client
283+ async fn get_graph ( & self ) -> Result < Graph , LightningError > {
284+ let mut client = self . client . lock ( ) . await ;
285+ let nodes : Vec < cln_grpc :: pb :: ListnodesNodes > = client
282286 . list_nodes ( ListnodesRequest { id : None } )
283287 . await
284288 . map_err ( |err| LightningError :: GetNodeInfoError ( err. to_string ( ) ) ) ?
0 commit comments