Skip to content

Commit b57a52a

Browse files
apollo_storage: add AppState struct for axum server
1 parent c382dd5 commit b57a52a

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

crates/apollo_storage/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ starknet-types-core = { workspace = true, features = ["papyrus-serialization"] }
3535
starknet_api.workspace = true
3636
tempfile = { workspace = true, optional = true }
3737
thiserror.workspace = true
38+
tokio = { workspace = true, features = ["sync"] }
3839
tracing = { workspace = true, features = ["log"] }
3940
validator = { workspace = true, features = ["derive"] }
4041
zstd.workspace = true

crates/apollo_storage/src/storage_reader_server.rs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use std::marker::PhantomData;
22
use std::net::SocketAddr;
3+
use std::sync::Arc;
34

45
use async_trait::async_trait;
56
use serde::de::DeserializeOwned;
67
use serde::Serialize;
8+
use tokio::sync::Semaphore;
79

810
use 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+
5580
impl<RequestHandler, Request, Response> StorageReaderServer<RequestHandler, Request, Response>
5681
where
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

Comments
 (0)