@@ -15,6 +15,7 @@ use std::collections::HashMap;
1515use std:: error:: Error ;
1616use std:: str:: FromStr ;
1717use std:: time:: Duration ;
18+ use tokio:: sync:: Mutex ;
1819use tokio:: time;
1920use triggered:: Listener ;
2021
@@ -83,7 +84,7 @@ impl TryInto<EclairClient> for EclairConnection {
8384}
8485
8586pub struct EclairNode {
86- client : EclairClient ,
87+ client : Mutex < EclairClient > ,
8788 info : NodeInfo ,
8889 network : Network ,
8990}
@@ -110,7 +111,7 @@ impl EclairNode {
110111 let features = parse_json_to_node_features ( & info. features ) ;
111112
112113 Ok ( Self {
113- client,
114+ client : Mutex :: new ( client ) ,
114115 info : NodeInfo {
115116 pubkey,
116117 alias : info. alias ,
@@ -127,31 +128,30 @@ impl LightningNode for EclairNode {
127128 & self . info
128129 }
129130
130- async fn get_network ( & mut self ) -> Result < Network , LightningError > {
131+ async fn get_network ( & self ) -> Result < Network , LightningError > {
131132 Ok ( self . network )
132133 }
133134
134135 async fn send_payment (
135- & mut self ,
136+ & self ,
136137 dest : PublicKey ,
137138 amount_msat : u64 ,
138139 ) -> Result < PaymentHash , LightningError > {
140+ let client = self . client . lock ( ) . await ;
139141 let preimage = PaymentPreimage ( rand:: random ( ) ) . 0 ;
140142 let mut params = HashMap :: new ( ) ;
141143 params. insert ( "nodeId" . to_string ( ) , hex:: encode ( dest. serialize ( ) ) ) ;
142144 params. insert ( "amountMsat" . to_string ( ) , amount_msat. to_string ( ) ) ;
143145 params. insert ( "paymentHash" . to_string ( ) , hex:: encode ( preimage) ) ;
144- let uuid: String = self
145- . client
146+ let uuid: String = client
146147 . request ( "sendtonode" , Some ( params) )
147148 . await
148149 . map_err ( |err| LightningError :: SendPaymentError ( err. to_string ( ) ) ) ?;
149150
150151 let mut params = HashMap :: new ( ) ;
151152 params. insert ( "paymentHash" . to_string ( ) , hex:: encode ( preimage) ) ;
152153 params. insert ( "id" . to_string ( ) , uuid) ;
153- let payment_parts: PaymentInfoResponse = self
154- . client
154+ let payment_parts: PaymentInfoResponse = client
155155 . request ( "getsentinfo" , Some ( params) )
156156 . await
157157 . map_err ( |_| LightningError :: InvalidPaymentHash ) ?;
@@ -164,7 +164,7 @@ impl LightningNode for EclairNode {
164164 }
165165
166166 async fn track_payment (
167- & mut self ,
167+ & self ,
168168 hash : & PaymentHash ,
169169 shutdown : Listener ,
170170 ) -> Result < PaymentResult , LightningError > {
@@ -175,11 +175,11 @@ impl LightningNode for EclairNode {
175175 return Err ( LightningError :: TrackPaymentError ( "Shutdown before tracking results" . to_string( ) ) ) ;
176176 } ,
177177 _ = time:: sleep( Duration :: from_millis( 500 ) ) => {
178+ let client = self . client. lock( ) . await ;
178179 let mut params = HashMap :: new( ) ;
179180 params. insert( "paymentHash" . to_string( ) , hex:: encode( hash. 0 ) ) ;
180181
181- let payment_parts: PaymentInfoResponse = self
182- . client
182+ let payment_parts: PaymentInfoResponse = client
183183 . request( "getsentinfo" , Some ( params) )
184184 . await
185185 . map_err( |err| LightningError :: TrackPaymentError ( err. to_string( ) ) ) ?;
@@ -204,12 +204,12 @@ impl LightningNode for EclairNode {
204204 }
205205 }
206206
207- async fn get_node_info ( & mut self , node_id : & PublicKey ) -> Result < NodeInfo , LightningError > {
207+ async fn get_node_info ( & self , node_id : & PublicKey ) -> Result < NodeInfo , LightningError > {
208208 let mut params = HashMap :: new ( ) ;
209209 params. insert ( "nodeId" . to_string ( ) , hex:: encode ( node_id. serialize ( ) ) ) ;
210210
211- let node_info : NodeResponse = self
212- . client
211+ let client = self . client . lock ( ) . await ;
212+ let node_info : NodeResponse = client
213213 . request ( "node" , Some ( params) )
214214 . await
215215 . map_err ( |err| LightningError :: GetNodeInfoError ( err. to_string ( ) ) ) ?;
@@ -223,8 +223,8 @@ impl LightningNode for EclairNode {
223223 }
224224
225225 async fn list_channels ( & mut self ) -> Result < Vec < u64 > , LightningError > {
226- let channels : ChannelsResponse = self
227- . client
226+ let client = self . client . lock ( ) . await ;
227+ let channels : ChannelsResponse = client
228228 . request ( "channels" , None )
229229 . await
230230 . map_err ( |err| LightningError :: ListChannelsError ( err. to_string ( ) ) ) ?;
@@ -245,9 +245,9 @@ impl LightningNode for EclairNode {
245245 Ok ( capacities_msat)
246246 }
247247
248- async fn get_graph ( & mut self ) -> Result < Graph , LightningError > {
249- let nodes : NodesResponse = self
250- . client
248+ async fn get_graph ( & self ) -> Result < Graph , LightningError > {
249+ let client = self . client . lock ( ) . await ;
250+ let nodes : NodesResponse = client
251251 . request ( "nodes" , None )
252252 . await
253253 . map_err ( |err| LightningError :: GetNodeInfoError ( err. to_string ( ) ) ) ?;
0 commit comments