diff --git a/Cargo.lock b/Cargo.lock index 5f3931b..3df2f08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4321,6 +4321,7 @@ dependencies = [ "clap", "dashmap", "futures", + "http", "parking_lot 0.12.3", "prost", "rln", @@ -4331,6 +4332,8 @@ dependencies = [ "tonic", "tonic-build", "tonic-reflection", + "tonic-web", + "tower-http", "tracing", "tracing-subscriber 0.3.19", "tracing-test", @@ -4724,6 +4727,24 @@ dependencies = [ "tonic", ] +[[package]] +name = "tonic-web" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774cad0f35370f81b6c59e3a1f5d0c3188bdb4a2a1b8b7f0921c860bfbd3aec6" +dependencies = [ + "base64", + "bytes", + "http", + "http-body", + "pin-project", + "tokio-stream", + "tonic", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower" version = "0.5.2" @@ -4743,6 +4764,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" +dependencies = [ + "bitflags 2.9.0", + "bytes", + "http", + "pin-project-lite", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 2148ea0..e583861 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -6,7 +6,8 @@ edition = "2024" [dependencies] clap = { version = "4.5.37", features = ["derive"] } tonic = { version = "0.13", features = ["gzip"] } -tonic-reflection = "0.13" +tonic-reflection = "*" +tonic-web = "*" prost = "0.13" tokio = { version = "1", features = ["macros", "rt-multi-thread"] } tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } @@ -24,6 +25,8 @@ bytesize = "2.0.1" rln_proof = { path = "../rln_proof" } chrono = "0.4.41" parking_lot = "0.12.3" +tower-http = { version = "0.6.4", features = ["cors"] } +http = "*" [build-dependencies] tonic-build = "*" diff --git a/prover/src/grpc_service.rs b/prover/src/grpc_service.rs index 967794c..bf5e25e 100644 --- a/prover/src/grpc_service.rs +++ b/prover/src/grpc_service.rs @@ -29,6 +29,11 @@ use tonic::{ transport::Server, // codec::CompressionEncoding }; +use tonic_web::{ + GrpcWebLayer, +}; +use tower_http::cors::{Any, CorsLayer}; +use http::Method; use tracing::{ debug, // error, @@ -206,7 +211,10 @@ impl RlnProver for ProverService { &self, _request: Request, ) -> Result, Status> { - todo!() + let reply = RegisterUserReply { + status: 0 + }; + Ok(Response::new(reply)) } type GetProofsStream = ReceiverStream>; @@ -278,6 +286,20 @@ impl GrpcProverService { //.send_compressed(CompressionEncoding::Gzip) ; + // CORS + let cors = CorsLayer::new() + // Allow `GET`, `POST` and `OPTIONS` when accessing the resource + .allow_methods([ + Method::GET, + // http POST && OPTIONS not required for grpc-web + // Method::POST, + // Method::OPTIONS + ]) + // Allow requests from any origin + // FIXME: config? + .allow_origin(Any) + .allow_headers(Any); + Server::builder() // service protection && limits // limits: connection @@ -288,9 +310,11 @@ impl GrpcProverService { .max_frame_size(PROVER_SERVICE_HTTP2_MAX_FRAME_SIZE.as_u64() as u32) // perf: tcp .tcp_nodelay(true) - // No http 1 - .accept_http1(false) + // http 1 layer required for GrpcWebLayer + .accept_http1(true) // services + .layer(cors) + .layer(GrpcWebLayer::new()) .add_service(reflection_service) .add_service(r) .serve(self.addr) diff --git a/prover/src/main.rs b/prover/src/main.rs index 44c0caa..110618e 100644 --- a/prover/src/main.rs +++ b/prover/src/main.rs @@ -1,5 +1,5 @@ mod args; -mod epoch_service; +// mod epoch_service; mod error; mod grpc_service; mod registry;