1
- use crate :: events:: { Event , EventHandler } ;
2
- use crate :: transport:: msgs:: { LSPSMessage , Prefix , RawLSPSMessage , LSPS_MESSAGE_TYPE } ;
1
+ use crate :: events:: Event ;
2
+ use crate :: transport:: msgs:: { LSPSMessage , RawLSPSMessage , LSPS_MESSAGE_TYPE } ;
3
+ use crate :: transport:: protocol:: LSPS0MessageHandler ;
4
+
3
5
use bitcoin:: secp256k1:: PublicKey ;
6
+ use lightning:: ln:: features:: { InitFeatures , NodeFeatures } ;
4
7
use lightning:: ln:: peer_handler:: CustomMessageHandler ;
5
8
use lightning:: ln:: wire:: CustomMessageReader ;
6
9
use lightning:: log_info;
10
+ use lightning:: sign:: EntropySource ;
7
11
use lightning:: util:: logger:: Logger ;
12
+ use lightning:: util:: ser:: Readable ;
8
13
use std:: collections:: HashMap ;
9
- use std:: convert:: { TryFrom , TryInto } ;
14
+ use std:: convert:: TryFrom ;
10
15
use std:: io;
11
16
use std:: ops:: Deref ;
12
17
use std:: sync:: { Arc , Mutex } ;
13
18
19
+ const LSPS_FEATURE_BIT : usize = 729 ;
20
+
14
21
/// A trait used to implement a specific LSPS protocol
15
22
/// The messages the protocol uses need to be able to be mapped
16
23
/// from and into LSPSMessages.
17
- pub trait ProtocolMessageHandler {
24
+ pub ( crate ) trait ProtocolMessageHandler {
18
25
type ProtocolMessage : TryFrom < LSPSMessage > + Into < LSPSMessage > ;
19
26
const PROTOCOL_NUMBER : Option < u16 > ;
20
27
21
28
fn handle_message (
22
29
& self , message : Self :: ProtocolMessage , counterparty_node_id : & PublicKey ,
23
30
) -> Result < ( ) , lightning:: ln:: msgs:: LightningError > ;
24
- fn get_and_clear_pending_protocol_messages ( & self ) -> Vec < ( PublicKey , Self :: ProtocolMessage ) > ;
25
- fn get_and_clear_pending_protocol_events ( & self ) -> Vec < Event > ;
26
- fn get_protocol_number ( & self ) -> Option < u16 > {
27
- Self :: PROTOCOL_NUMBER
28
- }
29
31
}
30
32
31
- /// A trait used to implement the mapping from a LSPS transport layer mesage
32
- /// to a specific protocol message. This enables the ProtocolMessageHandler's
33
- /// to not need to know about LSPSMessage and only have to deal with the specific
34
- /// messages related to the protocol that is being implemented.
35
- pub trait TransportMessageHandler {
36
- fn handle_lsps_message (
37
- & self , message : LSPSMessage , counterparty_node_id : & PublicKey ,
38
- ) -> Result < ( ) , lightning:: ln:: msgs:: LightningError > ;
39
- fn get_and_clear_pending_msg ( & self ) -> Vec < ( PublicKey , LSPSMessage ) > ;
40
- fn get_and_clear_pending_events ( & self ) -> Vec < Event > ;
41
- fn get_protocol_number ( & self ) -> Option < u16 > ;
33
+ /// Configuration for the LSPManager
34
+ /// Allows end-user to configure the behavior of the client
35
+ pub struct LSPConfig {
36
+ /// whether or not you intend to provide services
37
+ is_lsp : bool ,
42
38
}
43
39
44
- impl < T > TransportMessageHandler for T
45
- where
46
- T : ProtocolMessageHandler ,
47
- LSPSMessage : TryInto < <T as ProtocolMessageHandler >:: ProtocolMessage > ,
48
- {
49
- fn handle_lsps_message (
50
- & self , message : LSPSMessage , counterparty_node_id : & PublicKey ,
51
- ) -> Result < ( ) , lightning:: ln:: msgs:: LightningError > {
52
- if let Ok ( protocol_message) = message. try_into ( ) {
53
- self . handle_message ( protocol_message, counterparty_node_id) ?;
54
- }
55
-
56
- Ok ( ( ) )
57
- }
58
-
59
- fn get_and_clear_pending_msg ( & self ) -> Vec < ( PublicKey , LSPSMessage ) > {
60
- self . get_and_clear_pending_protocol_messages ( )
61
- . into_iter ( )
62
- . map ( |( public_key, protocol_message) | ( public_key, protocol_message. into ( ) ) )
63
- . collect ( )
64
- }
65
-
66
- fn get_and_clear_pending_events ( & self ) -> Vec < Event > {
67
- self . get_and_clear_pending_protocol_events ( )
68
- }
69
-
70
- fn get_protocol_number ( & self ) -> Option < u16 > {
71
- self . get_protocol_number ( )
72
- }
73
- }
74
-
75
- pub struct LSPManager < L : Deref >
40
+ /// The main interface into LSP functionality
41
+ pub struct LSPManager < L : Deref , ES : Deref >
76
42
where
77
43
L :: Target : Logger ,
44
+ ES :: Target : EntropySource ,
78
45
{
79
46
logger : L ,
80
- pending_messages : Mutex < Vec < ( PublicKey , RawLSPSMessage ) > > ,
47
+ pending_messages : Arc < Mutex < Vec < ( PublicKey , LSPSMessage ) > > > ,
48
+ pending_events : Arc < Mutex < Vec < Event > > > ,
81
49
request_id_to_method_map : Mutex < HashMap < String , String > > ,
82
- message_handlers : Arc < Mutex < HashMap < Prefix , Arc < dyn TransportMessageHandler > > > > ,
50
+ lsps0_message_handler : LSPS0MessageHandler < ES > ,
51
+ config : LSPConfig ,
83
52
}
84
53
85
- impl < L : Deref > LSPManager < L >
54
+ impl < L : Deref , ES : Deref > LSPManager < L , ES >
86
55
where
87
56
L :: Target : Logger ,
57
+ ES :: Target : EntropySource ,
88
58
{
89
- pub fn new ( logger : L ) -> Self {
59
+ /// Constructor for the LSPManager
60
+ ///
61
+ /// Sets up all required protocol message handlers based on configuration passed in
62
+ pub fn new ( logger : L , entropy_source : ES , config : LSPConfig ) -> Self {
63
+ let pending_messages = Arc :: new ( Mutex :: new ( vec ! [ ] ) ) ;
64
+ let pending_events = Arc :: new ( Mutex :: new ( vec ! [ ] ) ) ;
65
+
66
+ let lsps0_message_handler = LSPS0MessageHandler :: new (
67
+ entropy_source,
68
+ vec ! [ ] ,
69
+ pending_messages. clone ( ) ,
70
+ pending_events. clone ( ) ,
71
+ ) ;
72
+
90
73
Self {
91
74
logger,
92
- pending_messages : Mutex :: new ( Vec :: new ( ) ) ,
75
+ pending_messages,
76
+ pending_events,
93
77
request_id_to_method_map : Mutex :: new ( HashMap :: new ( ) ) ,
94
- message_handlers : Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ,
78
+ lsps0_message_handler,
79
+ config,
95
80
}
96
81
}
97
82
98
- pub fn get_message_handlers (
99
- & self ,
100
- ) -> Arc < Mutex < HashMap < Prefix , Arc < dyn TransportMessageHandler > > > > {
101
- self . message_handlers . clone ( )
102
- }
103
-
104
- pub fn register_message_handler (
105
- & self , prefix : Prefix , message_handler : Arc < dyn TransportMessageHandler > ,
106
- ) {
107
- self . message_handlers . lock ( ) . unwrap ( ) . insert ( prefix, message_handler) ;
108
- }
109
-
110
- pub fn process_pending_events < H : EventHandler > ( & self , handler : H ) {
111
- let message_handlers = self . message_handlers . lock ( ) . unwrap ( ) ;
112
-
113
- for message_handler in message_handlers. values ( ) {
114
- let events = message_handler. get_and_clear_pending_events ( ) ;
115
- for event in events {
116
- handler. handle_event ( event) ;
117
- }
118
- }
83
+ /// Needs to be polled regularly to surface events generated by the various protocols
84
+ pub fn get_and_clear_pending_events ( & self ) -> Vec < Event > {
85
+ self . pending_events . lock ( ) . unwrap ( ) . drain ( ..) . collect ( )
119
86
}
120
87
121
88
fn handle_lsps_message (
122
89
& self , msg : LSPSMessage , sender_node_id : & PublicKey ,
123
90
) -> Result < ( ) , lightning:: ln:: msgs:: LightningError > {
124
- if let Some ( prefix) = msg. prefix ( ) {
125
- let message_handlers = self . message_handlers . lock ( ) . unwrap ( ) ;
126
- // TODO: not sure what we are supposed to do when we receive a message we don't have a handler for
127
- if let Some ( message_handler) = message_handlers. get ( & prefix) {
128
- message_handler. handle_lsps_message ( msg, sender_node_id) ?;
129
- } else {
130
- log_info ! (
131
- self . logger,
132
- "Received a message from {:?} we do not have a handler for: {:?}" ,
133
- sender_node_id,
134
- msg
135
- ) ;
91
+ match msg {
92
+ LSPSMessage :: Invalid => {
93
+ log_info ! ( self . logger, "Received invalid message from {:?}" , sender_node_id) ;
94
+ }
95
+ LSPSMessage :: LSPS0 ( msg) => {
96
+ self . lsps0_message_handler . handle_message ( msg, sender_node_id) ?;
136
97
}
137
98
}
138
99
Ok ( ( ) )
139
100
}
140
101
141
- fn enqueue_message ( & self , node_id : PublicKey , msg : RawLSPSMessage ) {
102
+ fn enqueue_message ( & self , node_id : PublicKey , msg : LSPSMessage ) {
142
103
let mut pending_msgs = self . pending_messages . lock ( ) . unwrap ( ) ;
143
104
pending_msgs. push ( ( node_id, msg) ) ;
144
105
}
145
106
}
146
107
147
- impl < L : Deref > CustomMessageReader for LSPManager < L >
108
+ impl < L : Deref , ES : Deref > CustomMessageReader for LSPManager < L , ES >
148
109
where
149
110
L :: Target : Logger ,
111
+ ES :: Target : EntropySource ,
150
112
{
151
113
type CustomMessage = RawLSPSMessage ;
152
114
153
115
fn read < R : io:: Read > (
154
116
& self , message_type : u16 , buffer : & mut R ,
155
117
) -> Result < Option < Self :: CustomMessage > , lightning:: ln:: msgs:: DecodeError > {
156
118
match message_type {
157
- LSPS_MESSAGE_TYPE => {
158
- let mut payload = String :: new ( ) ;
159
- buffer. read_to_string ( & mut payload) ?;
160
- Ok ( Some ( RawLSPSMessage { payload } ) )
161
- }
119
+ LSPS_MESSAGE_TYPE => Ok ( Some ( RawLSPSMessage :: read ( buffer) ?) ) ,
162
120
_ => Ok ( None ) ,
163
121
}
164
122
}
165
123
}
166
124
167
- impl < L : Deref > CustomMessageHandler for LSPManager < L >
125
+ impl < L : Deref , ES : Deref > CustomMessageHandler for LSPManager < L , ES >
168
126
where
169
127
L :: Target : Logger ,
128
+ ES :: Target : EntropySource ,
170
129
{
171
130
fn handle_custom_message (
172
131
& self , msg : Self :: CustomMessage , sender_node_id : & PublicKey ,
@@ -176,35 +135,47 @@ where
176
135
match LSPSMessage :: from_str_with_id_map ( & msg. payload , & mut request_id_to_method_map) {
177
136
Ok ( msg) => self . handle_lsps_message ( msg, sender_node_id) ,
178
137
Err ( _) => {
179
- self . enqueue_message (
180
- * sender_node_id,
181
- RawLSPSMessage {
182
- payload : serde_json:: to_string ( & LSPSMessage :: Invalid ) . unwrap ( ) ,
183
- } ,
184
- ) ;
138
+ self . enqueue_message ( * sender_node_id, LSPSMessage :: Invalid ) ;
185
139
Ok ( ( ) )
186
140
}
187
141
}
188
142
}
189
143
190
144
fn get_and_clear_pending_msg ( & self ) -> Vec < ( PublicKey , Self :: CustomMessage ) > {
191
- let mut msgs = vec ! [ ] ;
145
+ let mut request_id_to_method_map = self . request_id_to_method_map . lock ( ) . unwrap ( ) ;
146
+ self . pending_messages
147
+ . lock ( )
148
+ . unwrap ( )
149
+ . drain ( ..)
150
+ . map ( |( public_key, lsps_message) | {
151
+ if let Some ( ( request_id, method_name) ) = lsps_message. get_request_id_and_method ( ) {
152
+ request_id_to_method_map. insert ( request_id, method_name) ;
153
+ }
154
+ (
155
+ public_key,
156
+ RawLSPSMessage { payload : serde_json:: to_string ( & lsps_message) . unwrap ( ) } ,
157
+ )
158
+ } )
159
+ . collect ( )
160
+ }
192
161
193
- {
194
- let mut pending_messages = self . pending_messages . lock ( ) . unwrap ( ) ;
195
- msgs . extend (
196
- pending_messages . drain ( .. ) . collect :: < Vec < ( PublicKey , Self :: CustomMessage ) > > ( ) ,
197
- ) ;
162
+ fn provided_node_features ( & self ) -> NodeFeatures {
163
+ let mut features = NodeFeatures :: empty ( ) ;
164
+
165
+ if self . config . is_lsp {
166
+ features . set_optional_custom_bit ( LSPS_FEATURE_BIT ) . unwrap ( ) ;
198
167
}
199
168
200
- let message_handlers = self . message_handlers . lock ( ) . unwrap ( ) ;
201
- for message_handler in message_handlers. values ( ) {
202
- let protocol_messages = message_handler. get_and_clear_pending_msg ( ) ;
203
- msgs. extend ( protocol_messages. into_iter ( ) . map ( |( node_id, message) | {
204
- ( node_id, RawLSPSMessage { payload : serde_json:: to_string ( & message) . unwrap ( ) } )
205
- } ) ) ;
169
+ features
170
+ }
171
+
172
+ fn provided_init_features ( & self , _their_node_id : & PublicKey ) -> InitFeatures {
173
+ let mut features = InitFeatures :: empty ( ) ;
174
+
175
+ if self . config . is_lsp {
176
+ features. set_optional_custom_bit ( LSPS_FEATURE_BIT ) . unwrap ( ) ;
206
177
}
207
178
208
- msgs
179
+ features
209
180
}
210
181
}
0 commit comments