1
1
use crate :: mpsc;
2
2
use crate :: Actor ;
3
3
use crate :: Builder ;
4
- use crate :: ClientId ;
5
4
use crate :: CloneSender ;
6
5
use crate :: ConcurrentServerActor ;
7
6
use crate :: ConcurrentServerMessageBox ;
7
+ use crate :: DynRequestSender ;
8
8
use crate :: DynSender ;
9
- use crate :: KeyedSender ;
10
9
use crate :: LoggingReceiver ;
11
- use crate :: LoggingSender ;
12
10
use crate :: Message ;
11
+ use crate :: MessageSink ;
13
12
use crate :: NoConfig ;
13
+ use crate :: RequestEnvelope ;
14
+ use crate :: RequestSender ;
14
15
use crate :: RuntimeError ;
15
16
use crate :: RuntimeRequest ;
16
17
use crate :: RuntimeRequestSink ;
17
- use crate :: SenderVec ;
18
18
use crate :: Server ;
19
19
use crate :: ServerActor ;
20
20
use crate :: ServerMessageBox ;
21
21
use crate :: ServiceProvider ;
22
- use crate :: SimpleMessageBox ;
23
22
use std:: convert:: Infallible ;
24
23
use std:: fmt:: Debug ;
25
24
26
25
/// A message box builder for request-response services
27
26
pub struct ServerMessageBoxBuilder < Request : Debug , Response > {
28
- service_name : String ,
29
27
max_concurrency : usize ,
30
- request_sender : mpsc:: Sender < ( ClientId , Request ) > ,
31
- input_receiver : LoggingReceiver < ( ClientId , Request ) > ,
28
+ request_sender : mpsc:: Sender < RequestEnvelope < Request , Response > > ,
29
+ request_receiver : LoggingReceiver < RequestEnvelope < Request , Response > > ,
32
30
signal_sender : mpsc:: Sender < RuntimeRequest > ,
33
- clients : Vec < DynSender < Response > > ,
34
31
}
35
32
36
33
impl < Request : Message , Response : Message > ServerMessageBoxBuilder < Request , Response > {
@@ -39,16 +36,14 @@ impl<Request: Message, Response: Message> ServerMessageBoxBuilder<Request, Respo
39
36
let max_concurrency = 1 ;
40
37
let ( request_sender, request_receiver) = mpsc:: channel ( capacity) ;
41
38
let ( signal_sender, signal_receiver) = mpsc:: channel ( 4 ) ;
42
- let input_receiver =
39
+ let request_receiver =
43
40
LoggingReceiver :: new ( server_name. to_string ( ) , request_receiver, signal_receiver) ;
44
41
45
42
ServerMessageBoxBuilder {
46
- service_name : server_name. to_string ( ) ,
47
43
max_concurrency,
48
44
request_sender,
49
- input_receiver ,
45
+ request_receiver ,
50
46
signal_sender,
51
- clients : vec ! [ ] ,
52
47
}
53
48
}
54
49
@@ -59,19 +54,19 @@ impl<Request: Message, Response: Message> ServerMessageBoxBuilder<Request, Respo
59
54
}
60
55
}
61
56
57
+ /// Return a sender for the requests
58
+ pub fn request_sender ( & self ) -> DynRequestSender < Request , Response > {
59
+ self . request_sender . sender_clone ( )
60
+ }
61
+
62
62
/// Build a message box ready to be used by the server actor
63
63
fn build_server ( self ) -> ServerMessageBox < Request , Response > {
64
- let response_sender = SenderVec :: new_sender ( self . clients ) ;
65
- let logging_sender = LoggingSender :: new ( self . service_name . clone ( ) , response_sender) ;
66
-
67
- SimpleMessageBox :: new ( self . input_receiver , logging_sender)
64
+ self . request_receiver
68
65
}
69
66
70
67
/// Build a message box aimed to concurrently serve requests
71
68
fn build_concurrent ( self ) -> ConcurrentServerMessageBox < Request , Response > {
72
- let max_concurrency = self . max_concurrency ;
73
- let clients = self . build_server ( ) ;
74
- ConcurrentServerMessageBox :: new ( max_concurrency, clients)
69
+ ConcurrentServerMessageBox :: new ( self . max_concurrency , self . request_receiver )
75
70
}
76
71
}
77
72
@@ -84,15 +79,23 @@ impl<Req: Message, Res: Message> RuntimeRequestSink for ServerMessageBoxBuilder<
84
79
impl < Req : Message , Res : Message > ServiceProvider < Req , Res , NoConfig >
85
80
for ServerMessageBoxBuilder < Req , Res >
86
81
{
87
- fn connect_consumer (
88
- & mut self ,
89
- _config : NoConfig ,
90
- response_sender : DynSender < Res > ,
91
- ) -> DynSender < Req > {
92
- let client_id = self . clients . len ( ) ;
93
- let request_sender = KeyedSender :: new_sender ( client_id, self . request_sender . clone ( ) ) ;
94
- self . clients . push ( response_sender) ;
95
- request_sender
82
+ fn connect_consumer ( & mut self , _config : NoConfig , reply_to : DynSender < Res > ) -> DynSender < Req > {
83
+ Box :: new ( RequestSender {
84
+ sender : self . request_sender . sender_clone ( ) ,
85
+ reply_to,
86
+ } )
87
+ }
88
+ }
89
+
90
+ impl < Req : Message , Res : Message > MessageSink < RequestEnvelope < Req , Res > , NoConfig >
91
+ for ServerMessageBoxBuilder < Req , Res >
92
+ {
93
+ fn get_config ( & self ) -> NoConfig {
94
+ NoConfig
95
+ }
96
+
97
+ fn get_sender ( & self ) -> DynSender < RequestEnvelope < Req , Res > > {
98
+ self . request_sender ( ) . sender_clone ( )
96
99
}
97
100
}
98
101
@@ -138,8 +141,7 @@ pub struct ServerActorBuilder<S: Server, K> {
138
141
139
142
impl < S : Server , K > ServerActorBuilder < S , K > {
140
143
pub fn new ( server : S , config : & ServerConfig , kind : K ) -> Self {
141
- let service_name = server. name ( ) . to_string ( ) ;
142
- let box_builder = ServerMessageBoxBuilder :: new ( & service_name, config. capacity )
144
+ let box_builder = ServerMessageBoxBuilder :: new ( server. name ( ) , config. capacity )
143
145
. with_max_concurrency ( config. max_concurrency ) ;
144
146
145
147
ServerActorBuilder {
@@ -148,6 +150,11 @@ impl<S: Server, K> ServerActorBuilder<S, K> {
148
150
box_builder,
149
151
}
150
152
}
153
+
154
+ /// Return a sender for the requests
155
+ pub fn request_sender ( & self ) -> DynRequestSender < S :: Request , S :: Response > {
156
+ self . box_builder . request_sender ( )
157
+ }
151
158
}
152
159
153
160
impl < S : Server > ServerActorBuilder < S , Sequential > {
@@ -204,6 +211,18 @@ impl<S: Server, K> ServiceProvider<S::Request, S::Response, NoConfig> for Server
204
211
}
205
212
}
206
213
214
+ impl < S : Server , K > MessageSink < RequestEnvelope < S :: Request , S :: Response > , NoConfig >
215
+ for ServerActorBuilder < S , K >
216
+ {
217
+ fn get_config ( & self ) -> NoConfig {
218
+ self . box_builder . get_config ( )
219
+ }
220
+
221
+ fn get_sender ( & self ) -> DynSender < RequestEnvelope < S :: Request , S :: Response > > {
222
+ self . box_builder . get_sender ( )
223
+ }
224
+ }
225
+
207
226
impl < S : Server , K > RuntimeRequestSink for ServerActorBuilder < S , K > {
208
227
fn get_signal_sender ( & self ) -> DynSender < RuntimeRequest > {
209
228
self . box_builder . get_signal_sender ( )
0 commit comments