@@ -14,6 +14,7 @@ use hyper::server::conn::http1;
14
14
use hyper_util:: rt:: TokioIo ;
15
15
16
16
use crate :: io:: events:: event_publisher:: { EventPublisher , NoopEventPublisher } ;
17
+ use crate :: io:: events:: get_event_name;
17
18
use crate :: io:: persist:: paginated_kv_store:: PaginatedKVStore ;
18
19
use crate :: io:: persist:: sqlite_store:: SqliteStore ;
19
20
use crate :: io:: persist:: {
@@ -29,12 +30,14 @@ use ldk_node::lightning::ln::channelmanager::PaymentId;
29
30
use ldk_node:: logger:: LogLevel ;
30
31
use ldk_server_protos:: events;
31
32
use ldk_server_protos:: events:: { event_envelope, EventEnvelope } ;
33
+ use ldk_server_protos:: types:: Payment ;
32
34
use prost:: Message ;
33
35
use rand:: Rng ;
34
36
use std:: fs;
35
37
use std:: path:: { Path , PathBuf } ;
36
38
use std:: sync:: Arc ;
37
39
use std:: time:: { SystemTime , UNIX_EPOCH } ;
40
+ use tokio:: select;
38
41
39
42
const USAGE_GUIDE : & str = "Usage: ldk-server <config_path>" ;
40
43
@@ -124,14 +127,14 @@ fn main() {
124
127
Err ( e) => {
125
128
println ! ( "Failed to register for SIGTERM stream: {}" , e) ;
126
129
std:: process:: exit ( -1 ) ;
127
- } ,
130
+ }
128
131
} ;
129
132
let event_node = Arc :: clone ( & node) ;
130
133
let rest_svc_listener = TcpListener :: bind ( config_file. rest_service_addr )
131
134
. await
132
135
. expect ( "Failed to bind listening port" ) ;
133
136
loop {
134
- tokio :: select! {
137
+ select ! {
135
138
event = event_node. next_event_async( ) => {
136
139
match event {
137
140
Event :: ChannelPending { channel_id, counterparty_node_id, .. } => {
@@ -154,18 +157,44 @@ fn main() {
154
157
payment_id, payment_hash, amount_msat
155
158
) ;
156
159
let payment_id = payment_id. expect( "PaymentId expected for ldk-server >=0.1" ) ;
157
- upsert_payment_details( & event_node, Arc :: clone( & paginated_store) as Arc <dyn PaginatedKVStore >, & payment_id) ;
160
+
161
+ publish_event_and_upsert_payment( & payment_id,
162
+ |payment_ref| event_envelope:: Event :: PaymentReceived ( events:: PaymentReceived {
163
+ payment: Some ( payment_ref. clone( ) ) ,
164
+ } ) ,
165
+ & event_node,
166
+ Arc :: clone( & event_publisher) ,
167
+ Arc :: clone( & paginated_store) ) . await ;
158
168
} ,
159
169
Event :: PaymentSuccessful { payment_id, ..} => {
160
170
let payment_id = payment_id. expect( "PaymentId expected for ldk-server >=0.1" ) ;
161
- upsert_payment_details( & event_node, Arc :: clone( & paginated_store) as Arc <dyn PaginatedKVStore >, & payment_id) ;
171
+
172
+ publish_event_and_upsert_payment( & payment_id,
173
+ |payment_ref| event_envelope:: Event :: PaymentSuccessful ( events:: PaymentSuccessful {
174
+ payment: Some ( payment_ref. clone( ) ) ,
175
+ } ) ,
176
+ & event_node,
177
+ Arc :: clone( & event_publisher) ,
178
+ Arc :: clone( & paginated_store) ) . await ;
162
179
} ,
163
180
Event :: PaymentFailed { payment_id, ..} => {
164
181
let payment_id = payment_id. expect( "PaymentId expected for ldk-server >=0.1" ) ;
165
- upsert_payment_details( & event_node, Arc :: clone( & paginated_store) as Arc <dyn PaginatedKVStore >, & payment_id) ;
182
+
183
+ publish_event_and_upsert_payment( & payment_id,
184
+ |payment_ref| event_envelope:: Event :: PaymentFailed ( events:: PaymentFailed {
185
+ payment: Some ( payment_ref. clone( ) ) ,
186
+ } ) ,
187
+ & event_node,
188
+ Arc :: clone( & event_publisher) ,
189
+ Arc :: clone( & paginated_store) ) . await ;
166
190
} ,
167
191
Event :: PaymentClaimable { payment_id, ..} => {
168
- upsert_payment_details( & event_node, Arc :: clone( & paginated_store) as Arc <dyn PaginatedKVStore >, & payment_id) ;
192
+ if let Some ( payment_details) = event_node. payment( & payment_id) {
193
+ let payment = payment_to_proto( payment_details) ;
194
+ upsert_payment_details( & event_node, Arc :: clone( & paginated_store) , & payment) ;
195
+ } else {
196
+ eprintln!( "Unable to find payment with paymentId: {}" , payment_id. to_string( ) ) ;
197
+ }
169
198
} ,
170
199
Event :: PaymentForwarded {
171
200
prev_channel_id,
@@ -234,7 +263,6 @@ fn main() {
234
263
event_node. event_handled( ) ;
235
264
} ,
236
265
}
237
-
238
266
} ,
239
267
res = rest_svc_listener. accept( ) => {
240
268
match res {
@@ -266,30 +294,48 @@ fn main() {
266
294
println ! ( "Shutdown complete.." ) ;
267
295
}
268
296
269
- fn upsert_payment_details (
270
- event_node : & Node , paginated_store : Arc < dyn PaginatedKVStore > , payment_id : & PaymentId ,
297
+ async fn publish_event_and_upsert_payment (
298
+ payment_id : & PaymentId , payment_to_event : fn ( & Payment ) -> event_envelope:: Event ,
299
+ event_node : & Node , event_publisher : Arc < dyn EventPublisher > ,
300
+ paginated_store : Arc < dyn PaginatedKVStore > ,
271
301
) {
272
302
if let Some ( payment_details) = event_node. payment ( payment_id) {
273
303
let payment = payment_to_proto ( payment_details) ;
274
- let time =
275
- SystemTime :: now ( ) . duration_since ( UNIX_EPOCH ) . expect ( "Time must be > 1970" ) . as_secs ( )
276
- as i64 ;
277
-
278
- match paginated_store. write (
279
- PAYMENTS_PERSISTENCE_PRIMARY_NAMESPACE ,
280
- PAYMENTS_PERSISTENCE_SECONDARY_NAMESPACE ,
281
- & payment_id. 0 . to_lower_hex_string ( ) ,
282
- time,
283
- & payment. encode_to_vec ( ) ,
284
- ) {
285
- Ok ( _) => {
286
- event_node. event_handled ( ) ;
287
- } ,
304
+
305
+ let event = payment_to_event ( & payment) ;
306
+ let event_name = get_event_name ( & event) ;
307
+ match event_publisher. publish ( EventEnvelope { event : Some ( event) } ) . await {
308
+ Ok ( _) => { } ,
288
309
Err ( e) => {
289
- eprintln ! ( "Failed to write payment to persistence: {}" , e) ;
310
+ println ! ( "Failed to publish '{}' event, : {}" , event_name, e) ;
311
+ return ;
290
312
} ,
291
- }
313
+ } ;
314
+
315
+ upsert_payment_details ( event_node, Arc :: clone ( & paginated_store) , & payment) ;
292
316
} else {
293
- eprintln ! ( "Unable to find payment with paymentId: {}" , payment_id. 0 . to_lower_hex_string( ) ) ;
317
+ eprintln ! ( "Unable to find payment with paymentId: {}" , payment_id) ;
318
+ }
319
+ }
320
+
321
+ fn upsert_payment_details (
322
+ event_node : & Node , paginated_store : Arc < dyn PaginatedKVStore > , payment : & Payment ,
323
+ ) {
324
+ let time =
325
+ SystemTime :: now ( ) . duration_since ( UNIX_EPOCH ) . expect ( "Time must be > 1970" ) . as_secs ( ) as i64 ;
326
+
327
+ match paginated_store. write (
328
+ PAYMENTS_PERSISTENCE_PRIMARY_NAMESPACE ,
329
+ PAYMENTS_PERSISTENCE_SECONDARY_NAMESPACE ,
330
+ & payment. id ,
331
+ time,
332
+ & payment. encode_to_vec ( ) ,
333
+ ) {
334
+ Ok ( _) => {
335
+ event_node. event_handled ( ) ;
336
+ } ,
337
+ Err ( e) => {
338
+ eprintln ! ( "Failed to write payment to persistence: {}" , e) ;
339
+ } ,
294
340
}
295
341
}
0 commit comments