1
- use crate :: p2p:: { Peer , PeerEvent } ;
1
+ use crate :: {
2
+ p2p:: { Peer , PeerEvent } ,
3
+ repeater:: MessageRepeater ,
4
+ } ;
2
5
use libp2p:: Multiaddr ;
3
6
use mithril_common:: {
4
7
messages:: { RegisterSignatureMessage , RegisterSignerMessage } ,
5
8
test_utils:: test_http_server:: { test_http_server_with_socket_address, TestHttpServer } ,
6
9
StdResult ,
7
10
} ;
8
11
use slog_scope:: { debug, info} ;
9
- use std:: net:: SocketAddr ;
12
+ use std:: { net:: SocketAddr , sync :: Arc , time :: Duration } ;
10
13
use tokio:: sync:: mpsc:: { unbounded_channel, UnboundedReceiver , UnboundedSender } ;
11
14
use warp:: Filter ;
12
15
@@ -16,6 +19,7 @@ pub struct SignerRelay {
16
19
peer : Peer ,
17
20
signature_rx : UnboundedReceiver < RegisterSignatureMessage > ,
18
21
signer_rx : UnboundedReceiver < RegisterSignerMessage > ,
22
+ signer_repeater : Arc < MessageRepeater < RegisterSignerMessage > > ,
19
23
}
20
24
21
25
impl SignerRelay {
@@ -28,17 +32,25 @@ impl SignerRelay {
28
32
debug ! ( "SignerRelay: starting..." ) ;
29
33
let ( signature_tx, signature_rx) = unbounded_channel :: < RegisterSignatureMessage > ( ) ;
30
34
let ( signer_tx, signer_rx) = unbounded_channel :: < RegisterSignerMessage > ( ) ;
35
+ let repeat_frequency = Duration :: from_secs ( 30 ) ;
36
+ let signer_repeater = Arc :: new ( MessageRepeater :: new ( signer_tx. clone ( ) , repeat_frequency) ) ;
31
37
let peer = Peer :: new ( address) . start ( ) . await ?;
32
- let server =
33
- Self :: start_http_server ( server_port, aggregator_endpoint, signer_tx, signature_tx)
34
- . await ;
38
+ let server = Self :: start_http_server (
39
+ server_port,
40
+ aggregator_endpoint,
41
+ signer_tx,
42
+ signature_tx,
43
+ signer_repeater. clone ( ) ,
44
+ )
45
+ . await ;
35
46
info ! ( "SignerRelay: listening on" ; "address" => format!( "{:?}" , server. address( ) ) ) ;
36
47
37
48
Ok ( Self {
38
49
server,
39
50
peer,
40
51
signature_rx,
41
52
signer_rx,
53
+ signer_repeater,
42
54
} )
43
55
}
44
56
@@ -47,6 +59,7 @@ impl SignerRelay {
47
59
aggregator_endpoint : & str ,
48
60
signer_tx : UnboundedSender < RegisterSignerMessage > ,
49
61
signature_tx : UnboundedSender < RegisterSignatureMessage > ,
62
+ signer_repeater : Arc < MessageRepeater < RegisterSignerMessage > > ,
50
63
) -> TestHttpServer {
51
64
test_http_server_with_socket_address (
52
65
warp:: path ( "register-signatures" )
@@ -58,6 +71,7 @@ impl SignerRelay {
58
71
. and ( warp:: post ( ) )
59
72
. and ( warp:: body:: json ( ) )
60
73
. and ( middlewares:: with_transmitter ( signer_tx) )
74
+ . and ( middlewares:: with_repeater ( signer_repeater. clone ( ) ) )
61
75
. and_then ( handlers:: register_signer_handler) )
62
76
. or ( warp:: path ( "epoch-settings" )
63
77
. and ( warp:: get ( ) )
@@ -104,6 +118,7 @@ impl SignerRelay {
104
118
}
105
119
}
106
120
} ,
121
+ _ = self . signer_repeater. repeat_message( ) => { Ok ( ( ) ) } ,
107
122
_event = self . peer. tick_swarm( ) => { Ok ( ( ) ) }
108
123
}
109
124
}
@@ -136,16 +151,24 @@ impl SignerRelay {
136
151
}
137
152
138
153
mod middlewares {
139
- use std:: convert:: Infallible ;
154
+ use std:: { convert:: Infallible , fmt :: Debug , sync :: Arc } ;
140
155
use tokio:: sync:: mpsc:: UnboundedSender ;
141
156
use warp:: Filter ;
142
157
158
+ use crate :: repeater:: MessageRepeater ;
159
+
143
160
pub fn with_transmitter < T : Send + Sync > (
144
161
tx : UnboundedSender < T > ,
145
162
) -> impl Filter < Extract = ( UnboundedSender < T > , ) , Error = Infallible > + Clone {
146
163
warp:: any ( ) . map ( move || tx. clone ( ) )
147
164
}
148
165
166
+ pub fn with_repeater < M : Clone + Debug + Sync + Send + ' static > (
167
+ repeater : Arc < MessageRepeater < M > > ,
168
+ ) -> impl Filter < Extract = ( Arc < MessageRepeater < M > > , ) , Error = Infallible > + Clone {
169
+ warp:: any ( ) . map ( move || repeater. clone ( ) )
170
+ }
171
+
149
172
pub fn with_aggregator_endpoint (
150
173
aggregator_endpoint : String ,
151
174
) -> impl Filter < Extract = ( String , ) , Error = Infallible > + Clone {
@@ -157,15 +180,20 @@ mod handlers {
157
180
use mithril_common:: messages:: { RegisterSignatureMessage , RegisterSignerMessage } ;
158
181
use reqwest:: { Error , Response } ;
159
182
use slog_scope:: debug;
160
- use std:: convert:: Infallible ;
183
+ use std:: { convert:: Infallible , sync :: Arc } ;
161
184
use tokio:: sync:: mpsc:: UnboundedSender ;
162
185
use warp:: http:: StatusCode ;
163
186
187
+ use crate :: repeater;
188
+
164
189
pub async fn register_signer_handler (
165
190
register_signer_message : RegisterSignerMessage ,
166
191
tx : UnboundedSender < RegisterSignerMessage > ,
192
+ repeater : Arc < repeater:: MessageRepeater < RegisterSignerMessage > > ,
167
193
) -> Result < impl warp:: Reply , Infallible > {
168
194
debug ! ( "SignerRelay: serve HTTP route /register-signer" ; "register_signer_message" => format!( "{register_signer_message:#?}" ) ) ;
195
+
196
+ repeater. set_message ( register_signer_message. clone ( ) ) . await ;
169
197
match tx. send ( register_signer_message) {
170
198
Ok ( _) => Ok ( Box :: new ( warp:: reply:: with_status (
171
199
"" . to_string ( ) ,
0 commit comments