|
3 | 3 |
|
4 | 4 | #![doc = include_str!("../README.md")] |
5 | 5 |
|
6 | | -use std::collections::HashSet; |
7 | | -use std::str::FromStr; |
| 6 | +use std::{collections::HashSet, str::FromStr}; |
8 | 7 |
|
9 | | -use alloy::dyn_abi::Eip712Domain; |
10 | | -use alloy::primitives::Address; |
11 | | -use alloy::signers::local::PrivateKeySigner; |
| 8 | +use alloy::{dyn_abi::Eip712Domain, primitives::Address, signers::local::PrivateKeySigner}; |
12 | 9 | use anyhow::Result; |
13 | | -use axum::error_handling::HandleError; |
14 | | -use axum::routing::post_service; |
15 | | -use axum::BoxError; |
16 | | -use axum::Router; |
17 | 10 | use clap::Parser; |
18 | | -use hyper::StatusCode; |
| 11 | +use log::{debug, info}; |
19 | 12 | use tap_core::tap_eip712_domain; |
20 | | -use tokio::net::TcpListener; |
21 | 13 |
|
22 | | -use log::{debug, info}; |
23 | | -use tap_aggregator::metrics; |
24 | | -use tap_aggregator::server; |
25 | | -use tokio::signal; |
26 | | -use tower::make::Shared; |
| 14 | +use tap_aggregator::{metrics, server}; |
27 | 15 |
|
28 | 16 | #[derive(Parser, Debug)] |
29 | 17 | #[command(author, version, about, long_about = None)] |
@@ -119,96 +107,25 @@ async fn main() -> Result<()> { |
119 | 107 |
|
120 | 108 | // Start the JSON-RPC server. |
121 | 109 | // This await is non-blocking |
122 | | - let (service, handle) = server::create_rpc_tower_service( |
123 | | - wallet.clone(), |
124 | | - accepted_addresses.clone(), |
125 | | - domain_separator.clone(), |
| 110 | + let (handle, _) = server::run_server( |
| 111 | + args.port, |
| 112 | + wallet, |
| 113 | + accepted_addresses, |
| 114 | + domain_separator, |
126 | 115 | args.max_request_body_size, |
127 | 116 | args.max_response_body_size, |
128 | 117 | args.max_connections, |
129 | | - )?; |
130 | | - |
| 118 | + ) |
| 119 | + .await?; |
131 | 120 | info!("Server started. Listening on port {}.", args.port); |
132 | 121 |
|
133 | | - async fn handle_anyhow_error(err: BoxError) -> (StatusCode, String) { |
134 | | - ( |
135 | | - StatusCode::INTERNAL_SERVER_ERROR, |
136 | | - format!("Something went wrong: {err}"), |
137 | | - ) |
138 | | - } |
139 | | - let router = Router::new().route_service( |
140 | | - "/", |
141 | | - HandleError::new(post_service(service), handle_anyhow_error), |
142 | | - ); |
143 | | - |
144 | | - let grpc_service = server::create_grpc_service(wallet, accepted_addresses, domain_separator)?; |
145 | | - |
146 | | - let service = tower::steer::Steer::new( |
147 | | - [router, grpc_service.into_axum_router()], |
148 | | - |req: &hyper::Request<_>, _services: &[_]| { |
149 | | - if req |
150 | | - .headers() |
151 | | - .get(hyper::header::CONTENT_TYPE) |
152 | | - .map(|content_type| content_type.as_bytes()) |
153 | | - .filter(|content_type| content_type.starts_with(b"application/grpc")) |
154 | | - .is_some() |
155 | | - { |
156 | | - // route to the gRPC service (second service element) when the |
157 | | - // header is set |
158 | | - 1 |
159 | | - } else { |
160 | | - // otherwise route to the REST service |
161 | | - 0 |
162 | | - } |
163 | | - }, |
164 | | - ); |
165 | | - |
166 | | - // Create a `TcpListener` using tokio. |
167 | | - let listener = TcpListener::bind(&format!("0.0.0.0:{}", args.port)) |
168 | | - .await |
169 | | - .expect("Failed to bind to indexer-service port"); |
170 | | - |
171 | | - if let Err(e) = axum::serve(listener, Shared::new(service)) |
172 | | - .with_graceful_shutdown(shutdown_handler()) |
173 | | - .await |
174 | | - { |
175 | | - anyhow::bail!("Indexer service error: {e}"); |
176 | | - } |
| 122 | + let _ = handle.await; |
177 | 123 |
|
178 | 124 | // If we're here, we've received a signal to exit. |
179 | 125 | info!("Shutting down..."); |
180 | | - |
181 | | - // Stop the server and wait for it to finish gracefully. |
182 | | - let _ = handle.stop(); |
183 | | - handle.stopped().await; |
184 | | - |
185 | | - debug!("Goodbye!"); |
186 | 126 | Ok(()) |
187 | 127 | } |
188 | 128 |
|
189 | | -/// Graceful shutdown handler |
190 | | -async fn shutdown_handler() { |
191 | | - let ctrl_c = async { |
192 | | - signal::ctrl_c() |
193 | | - .await |
194 | | - .expect("Failed to install Ctrl+C handler"); |
195 | | - }; |
196 | | - |
197 | | - let terminate = async { |
198 | | - signal::unix::signal(signal::unix::SignalKind::terminate()) |
199 | | - .expect("Failed to install signal handler") |
200 | | - .recv() |
201 | | - .await; |
202 | | - }; |
203 | | - |
204 | | - tokio::select! { |
205 | | - _ = ctrl_c => {}, |
206 | | - _ = terminate => {}, |
207 | | - } |
208 | | - |
209 | | - info!("Signal received, starting graceful shutdown"); |
210 | | -} |
211 | | - |
212 | 129 | fn create_eip712_domain(args: &Args) -> Result<Eip712Domain> { |
213 | 130 | // Transfrom the args into the types expected by Eip712Domain::new(). |
214 | 131 |
|
|
0 commit comments