11use std:: marker:: PhantomData ;
22use std:: net:: SocketAddr ;
3+ use std:: sync:: Arc ;
34
45use async_trait:: async_trait;
56use serde:: de:: DeserializeOwned ;
67use serde:: Serialize ;
8+ use tokio:: sync:: Semaphore ;
79
810use crate :: { StorageError , StorageReader } ;
911
@@ -46,12 +48,35 @@ where
4648 Request : Serialize + DeserializeOwned + Send + ' static ,
4749 Response : Serialize + DeserializeOwned + Send + ' static ,
4850{
49- storage_reader : StorageReader ,
50- request_handler : RequestHandler ,
51+ app_state : AppState < RequestHandler , Request , Response > ,
5152 config : ServerConfig ,
53+ }
54+
55+ /// Application state shared across request handlers.
56+ struct AppState < RequestHandler , Request , Response >
57+ where
58+ RequestHandler : StorageReaderServerHandler < Request , Response > ,
59+ {
60+ storage_reader : Arc < StorageReader > ,
61+ request_handler : Arc < RequestHandler > ,
62+ semaphore : Arc < Semaphore > ,
5263 _req_res : PhantomData < ( Request , Response ) > ,
5364}
5465
66+ impl < RequestHandler , Request , Response > Clone for AppState < RequestHandler , Request , Response >
67+ where
68+ RequestHandler : StorageReaderServerHandler < Request , Response > ,
69+ {
70+ fn clone ( & self ) -> Self {
71+ Self {
72+ storage_reader : Arc :: clone ( & self . storage_reader ) ,
73+ request_handler : Arc :: clone ( & self . request_handler ) ,
74+ semaphore : Arc :: clone ( & self . semaphore ) ,
75+ _req_res : PhantomData ,
76+ }
77+ }
78+ }
79+
5580impl < RequestHandler , Request , Response > StorageReaderServer < RequestHandler , Request , Response >
5681where
5782 RequestHandler : StorageReaderServerHandler < Request , Response > ,
@@ -60,11 +85,17 @@ where
6085{
6186 /// Creates a new storage reader server with the given handler and configuration.
6287 pub fn new (
63- storage_reader : StorageReader ,
64- request_handler : RequestHandler ,
88+ storage_reader : Arc < StorageReader > ,
89+ request_handler : Arc < RequestHandler > ,
6590 config : ServerConfig ,
6691 ) -> Self {
67- Self { storage_reader, request_handler, config, _req_res : PhantomData }
92+ let app_state = AppState {
93+ storage_reader,
94+ request_handler,
95+ semaphore : Arc :: new ( Semaphore :: new ( config. max_concurrency ) ) ,
96+ _req_res : PhantomData ,
97+ } ;
98+ Self { app_state, config }
6899 }
69100
70101 /// Starts the server to handle incoming requests.
0 commit comments