1+ use super :: rpc:: {
2+ ZinitLoggingApiServer , ZinitRpcApiServer , ZinitServiceApiServer , ZinitSystemApiServer ,
3+ } ;
14use crate :: zinit:: ZInit ;
25use anyhow:: { bail, Context , Result } ;
36use jsonrpsee:: server:: ServerHandle ;
47use reth_ipc:: server:: Builder ;
58use serde:: { Deserialize , Serialize } ;
69use serde_json:: Value ;
710use std:: collections:: HashMap ;
8- use super :: rpc:: { ZinitLoggingApiServer , ZinitRpcApiServer , ZinitServiceApiServer , ZinitSystemApiServer } ;
911use std:: sync:: Arc ;
1012use tokio:: sync:: Mutex ;
13+ use tower_http:: cors:: { Any , CorsLayer } ;
14+ use tower_http:: cors:: { AllowMethods , AllowHeaders } ;
1115
1216#[ derive( Clone , Debug , Deserialize , Serialize ) ]
1317#[ serde( rename_all = "lowercase" ) ]
@@ -52,30 +56,37 @@ impl Api {
5256 }
5357
5458 pub async fn serve ( & self , endpoint : String ) -> Result < ApiServer > {
55-
5659 let server = Builder :: default ( ) . build ( endpoint) ;
5760 let mut module = ZinitRpcApiServer :: into_rpc ( self . clone ( ) ) ;
5861 module. merge ( ZinitSystemApiServer :: into_rpc ( self . clone ( ) ) ) ?;
5962 module. merge ( ZinitServiceApiServer :: into_rpc ( self . clone ( ) ) ) ?;
6063 module. merge ( ZinitLoggingApiServer :: into_rpc ( self . clone ( ) ) ) ?;
6164
62-
6365 let _handle = server. start ( module) . await ?;
6466
6567 Ok ( ApiServer { _handle } )
6668 }
67-
69+
6870 /// Start an HTTP/RPC server at a specified address
6971 pub async fn start_http_server ( & self , address : String ) -> Result < String > {
7072 // Parse the address string
71- let socket_addr = address. parse :: < std:: net:: SocketAddr > ( )
73+ let socket_addr = address
74+ . parse :: < std:: net:: SocketAddr > ( )
7275 . context ( "Failed to parse socket address" ) ?;
73-
74- // Create the JSON-RPC server
75- let server_rpc = jsonrpsee:: server:: ServerBuilder :: default ( )
76+
77+ let cors = CorsLayer :: new ( )
78+ // Allow `POST` when accessing the resource
79+ . allow_methods ( AllowMethods :: any ( ) )
80+ // Allow requests from any origin
81+ . allow_origin ( Any )
82+ . allow_headers ( AllowHeaders :: any ( ) ) ;
83+ let middleware = tower:: ServiceBuilder :: new ( ) . layer ( cors) ;
84+
85+ // Create the JSON-RPC server with CORS support
86+ let server_rpc = jsonrpsee:: server:: ServerBuilder :: default ( ) . set_http_middleware ( middleware)
7687 . build ( socket_addr)
7788 . await ?;
78-
89+
7990 // Create and merge all API modules
8091 let mut rpc_module = ZinitRpcApiServer :: into_rpc ( self . clone ( ) ) ;
8192 rpc_module. merge ( ZinitSystemApiServer :: into_rpc ( self . clone ( ) ) ) ?;
@@ -84,18 +95,18 @@ impl Api {
8495
8596 // Start the server
8697 let handle = server_rpc. start ( rpc_module) ;
87-
98+
8899 // Store the handle
89100 let mut http_handle = self . http_server_handle . lock ( ) . await ;
90101 * http_handle = Some ( handle) ;
91-
102+
92103 Ok ( format ! ( "HTTP/RPC server started at {}" , address) )
93104 }
94-
105+
95106 /// Stop the HTTP/RPC server if running
96107 pub async fn stop_http_server ( & self ) -> Result < ( ) > {
97108 let mut http_handle = self . http_server_handle . lock ( ) . await ;
98-
109+
99110 if http_handle. is_some ( ) {
100111 // The handle is automatically dropped, which should stop the server
101112 * http_handle = None ;
@@ -104,4 +115,4 @@ impl Api {
104115 bail ! ( "No HTTP/RPC server is currently running" )
105116 }
106117 }
107- }
118+ }
0 commit comments