@@ -21,9 +21,13 @@ use crate::lsps1::msgs::{
21
21
use crate :: lsps2:: msgs:: {
22
22
LSPS2Message , LSPS2Request , LSPS2Response , LSPS2_BUY_METHOD_NAME , LSPS2_GET_INFO_METHOD_NAME ,
23
23
} ;
24
+ use crate :: lsps5:: msgs:: {
25
+ LSPS5Message , LSPS5Request , LSPS5Response , LSPS5_LIST_WEBHOOKS_METHOD_NAME ,
26
+ LSPS5_REMOVE_WEBHOOK_METHOD_NAME , LSPS5_SET_WEBHOOK_METHOD_NAME ,
27
+ } ;
28
+
24
29
use crate :: prelude:: HashMap ;
25
30
26
- use chrono:: DateTime ;
27
31
use lightning:: ln:: msgs:: { DecodeError , LightningError } ;
28
32
use lightning:: ln:: wire;
29
33
use lightning:: util:: ser:: { LengthLimitedRead , LengthReadable , WithoutLength } ;
@@ -62,6 +66,9 @@ pub(crate) enum LSPSMethod {
62
66
LSPS1CreateOrder ,
63
67
LSPS2GetInfo ,
64
68
LSPS2Buy ,
69
+ LSPS5SetWebhook ,
70
+ LSPS5ListWebhooks ,
71
+ LSPS5RemoveWebhook ,
65
72
}
66
73
67
74
impl LSPSMethod {
@@ -73,6 +80,9 @@ impl LSPSMethod {
73
80
Self :: LSPS1GetOrder => LSPS1_GET_ORDER_METHOD_NAME ,
74
81
Self :: LSPS2GetInfo => LSPS2_GET_INFO_METHOD_NAME ,
75
82
Self :: LSPS2Buy => LSPS2_BUY_METHOD_NAME ,
83
+ Self :: LSPS5SetWebhook => LSPS5_SET_WEBHOOK_METHOD_NAME ,
84
+ Self :: LSPS5ListWebhooks => LSPS5_LIST_WEBHOOKS_METHOD_NAME ,
85
+ Self :: LSPS5RemoveWebhook => LSPS5_REMOVE_WEBHOOK_METHOD_NAME ,
76
86
}
77
87
}
78
88
}
@@ -87,6 +97,9 @@ impl FromStr for LSPSMethod {
87
97
LSPS1_GET_ORDER_METHOD_NAME => Ok ( Self :: LSPS1GetOrder ) ,
88
98
LSPS2_GET_INFO_METHOD_NAME => Ok ( Self :: LSPS2GetInfo ) ,
89
99
LSPS2_BUY_METHOD_NAME => Ok ( Self :: LSPS2Buy ) ,
100
+ LSPS5_SET_WEBHOOK_METHOD_NAME => Ok ( Self :: LSPS5SetWebhook ) ,
101
+ LSPS5_LIST_WEBHOOKS_METHOD_NAME => Ok ( Self :: LSPS5ListWebhooks ) ,
102
+ LSPS5_REMOVE_WEBHOOK_METHOD_NAME => Ok ( Self :: LSPS5RemoveWebhook ) ,
90
103
_ => Err ( & "Unknown method name" ) ,
91
104
}
92
105
}
@@ -119,6 +132,16 @@ impl From<&LSPS2Request> for LSPSMethod {
119
132
}
120
133
}
121
134
135
+ impl From < & LSPS5Request > for LSPSMethod {
136
+ fn from ( value : & LSPS5Request ) -> Self {
137
+ match value {
138
+ LSPS5Request :: SetWebhook ( _) => Self :: LSPS5SetWebhook ,
139
+ LSPS5Request :: ListWebhooks ( _) => Self :: LSPS5ListWebhooks ,
140
+ LSPS5Request :: RemoveWebhook ( _) => Self :: LSPS5RemoveWebhook ,
141
+ }
142
+ }
143
+ }
144
+
122
145
impl < ' de > Deserialize < ' de > for LSPSMethod {
123
146
fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
124
147
where
@@ -218,13 +241,13 @@ impl LSPSDateTime {
218
241
}
219
242
220
243
/// Returns the time in seconds since the unix epoch.
221
- pub fn abs_diff ( & self , other : & Self ) -> u64 {
244
+ pub fn abs_diff ( & self , other : Self ) -> u64 {
222
245
self . 0 . timestamp ( ) . abs_diff ( other. 0 . timestamp ( ) )
223
246
}
224
247
225
248
/// Returns the time in seconds since the unix epoch.
226
249
pub fn new_from_duration_since_epoch ( duration : Duration ) -> Self {
227
- Self ( DateTime :: UNIX_EPOCH + duration)
250
+ Self ( chrono :: DateTime :: UNIX_EPOCH + duration)
228
251
}
229
252
}
230
253
@@ -267,6 +290,8 @@ pub enum LSPSMessage {
267
290
LSPS1 ( LSPS1Message ) ,
268
291
/// An LSPS2 message.
269
292
LSPS2 ( LSPS2Message ) ,
293
+ /// An LSPS5 message.
294
+ LSPS5 ( LSPS5Message ) ,
270
295
}
271
296
272
297
impl LSPSMessage {
@@ -294,6 +319,9 @@ impl LSPSMessage {
294
319
LSPSMessage :: LSPS2 ( LSPS2Message :: Request ( request_id, request) ) => {
295
320
Some ( ( LSPSRequestId ( request_id. 0 . clone ( ) ) , request. into ( ) ) )
296
321
} ,
322
+ LSPSMessage :: LSPS5 ( LSPS5Message :: Request ( request_id, request) ) => {
323
+ Some ( ( LSPSRequestId ( request_id. 0 . clone ( ) ) , request. into ( ) ) )
324
+ } ,
297
325
_ => None ,
298
326
}
299
327
}
@@ -410,6 +438,47 @@ impl Serialize for LSPSMessage {
410
438
jsonrpc_object. serialize_field ( JSONRPC_ID_FIELD_KEY , & serde_json:: Value :: Null ) ?;
411
439
jsonrpc_object. serialize_field ( JSONRPC_ERROR_FIELD_KEY , & error) ?;
412
440
} ,
441
+ LSPSMessage :: LSPS5 ( LSPS5Message :: Request ( request_id, request) ) => {
442
+ jsonrpc_object. serialize_field ( JSONRPC_ID_FIELD_KEY , & request_id. 0 ) ?;
443
+ jsonrpc_object
444
+ . serialize_field ( JSONRPC_METHOD_FIELD_KEY , & LSPSMethod :: from ( request) ) ?;
445
+
446
+ match request {
447
+ LSPS5Request :: SetWebhook ( params) => {
448
+ jsonrpc_object. serialize_field ( JSONRPC_PARAMS_FIELD_KEY , params) ?
449
+ } ,
450
+ LSPS5Request :: ListWebhooks ( params) => {
451
+ jsonrpc_object. serialize_field ( JSONRPC_PARAMS_FIELD_KEY , params) ?
452
+ } ,
453
+ LSPS5Request :: RemoveWebhook ( params) => {
454
+ jsonrpc_object. serialize_field ( JSONRPC_PARAMS_FIELD_KEY , params) ?
455
+ } ,
456
+ }
457
+ } ,
458
+ LSPSMessage :: LSPS5 ( LSPS5Message :: Response ( request_id, response) ) => {
459
+ jsonrpc_object. serialize_field ( JSONRPC_ID_FIELD_KEY , & request_id. 0 ) ?;
460
+
461
+ match response {
462
+ LSPS5Response :: SetWebhook ( result) => {
463
+ jsonrpc_object. serialize_field ( JSONRPC_RESULT_FIELD_KEY , result) ?
464
+ } ,
465
+ LSPS5Response :: SetWebhookError ( error) => {
466
+ jsonrpc_object. serialize_field ( JSONRPC_ERROR_FIELD_KEY , error) ?
467
+ } ,
468
+ LSPS5Response :: ListWebhooks ( result) => {
469
+ jsonrpc_object. serialize_field ( JSONRPC_RESULT_FIELD_KEY , result) ?
470
+ } ,
471
+ LSPS5Response :: ListWebhooksError ( error) => {
472
+ jsonrpc_object. serialize_field ( JSONRPC_ERROR_FIELD_KEY , error) ?
473
+ } ,
474
+ LSPS5Response :: RemoveWebhook ( result) => {
475
+ jsonrpc_object. serialize_field ( JSONRPC_RESULT_FIELD_KEY , result) ?
476
+ } ,
477
+ LSPS5Response :: RemoveWebhookError ( error) => {
478
+ jsonrpc_object. serialize_field ( JSONRPC_ERROR_FIELD_KEY , error) ?
479
+ } ,
480
+ }
481
+ } ,
413
482
}
414
483
415
484
jsonrpc_object. end ( )
@@ -523,6 +592,31 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> {
523
592
. map_err ( de:: Error :: custom) ?;
524
593
Ok ( LSPSMessage :: LSPS2 ( LSPS2Message :: Request ( id, LSPS2Request :: Buy ( request) ) ) )
525
594
} ,
595
+ // Add LSPS5 methods
596
+ LSPSMethod :: LSPS5SetWebhook => {
597
+ let request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) )
598
+ . map_err ( de:: Error :: custom) ?;
599
+ Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Request (
600
+ id,
601
+ LSPS5Request :: SetWebhook ( request) ,
602
+ ) ) )
603
+ } ,
604
+ LSPSMethod :: LSPS5ListWebhooks => {
605
+ let request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) )
606
+ . map_err ( de:: Error :: custom) ?;
607
+ Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Request (
608
+ id,
609
+ LSPS5Request :: ListWebhooks ( request) ,
610
+ ) ) )
611
+ } ,
612
+ LSPSMethod :: LSPS5RemoveWebhook => {
613
+ let request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) )
614
+ . map_err ( de:: Error :: custom) ?;
615
+ Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Request (
616
+ id,
617
+ LSPS5Request :: RemoveWebhook ( request) ,
618
+ ) ) )
619
+ } ,
526
620
} ,
527
621
None => match self . request_id_to_method_map . remove ( & id) {
528
622
Some ( method) => match method {
@@ -628,6 +722,57 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> {
628
722
Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) )
629
723
}
630
724
} ,
725
+ LSPSMethod :: LSPS5SetWebhook => {
726
+ if let Some ( error) = error {
727
+ Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response (
728
+ id,
729
+ LSPS5Response :: SetWebhookError ( error. into ( ) ) ,
730
+ ) ) )
731
+ } else if let Some ( result) = result {
732
+ let response =
733
+ serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?;
734
+ Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response (
735
+ id,
736
+ LSPS5Response :: SetWebhook ( response) ,
737
+ ) ) )
738
+ } else {
739
+ Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) )
740
+ }
741
+ } ,
742
+ LSPSMethod :: LSPS5ListWebhooks => {
743
+ if let Some ( error) = error {
744
+ Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response (
745
+ id,
746
+ LSPS5Response :: ListWebhooksError ( error. into ( ) ) ,
747
+ ) ) )
748
+ } else if let Some ( result) = result {
749
+ let response =
750
+ serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?;
751
+ Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response (
752
+ id,
753
+ LSPS5Response :: ListWebhooks ( response) ,
754
+ ) ) )
755
+ } else {
756
+ Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) )
757
+ }
758
+ } ,
759
+ LSPSMethod :: LSPS5RemoveWebhook => {
760
+ if let Some ( error) = error {
761
+ Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response (
762
+ id,
763
+ LSPS5Response :: RemoveWebhookError ( error. into ( ) ) ,
764
+ ) ) )
765
+ } else if let Some ( result) = result {
766
+ let response =
767
+ serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?;
768
+ Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response (
769
+ id,
770
+ LSPS5Response :: RemoveWebhook ( response) ,
771
+ ) ) )
772
+ } else {
773
+ Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) )
774
+ }
775
+ } ,
631
776
} ,
632
777
None => Err ( de:: Error :: custom ( format ! (
633
778
"Received response for unknown request id: {}" ,
0 commit comments