From aaa3f2cdf90bede466e3f6976ff3479537101f65 Mon Sep 17 00:00:00 2001 From: Palak Jha Date: Fri, 24 Apr 2026 12:18:15 +0530 Subject: [PATCH] feat: support gRPC-Web on frontend gRPC server (#8027) feat: add gRPC-Web support using tonic-web Signed-off-by: polar --- .gitignore | 1 + Cargo.lock | 19 +++++++++++++++++++ src/servers/Cargo.toml | 1 + src/servers/src/grpc.rs | 6 +++++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1e6194369f..7885340245 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,4 @@ AGENTS.md # local design docs docs/specs/ +.vs/ diff --git a/Cargo.lock b/Cargo.lock index a006c7403c..92422004e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12118,6 +12118,7 @@ dependencies = [ "tokio-util", "tonic 0.14.2", "tonic-reflection", + "tonic-web", "tower 0.5.2", "tower-http 0.6.6", "tracing", @@ -14102,6 +14103,24 @@ dependencies = [ "tonic-prost", ] +[[package]] +name = "tonic-web" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29453d84de05f4f1b573db22e6f9f6c95c189a6089a440c9a098aa9dea009299" +dependencies = [ + "base64 0.22.1", + "bytes", + "http 1.3.1", + "http-body 1.0.1", + "pin-project", + "tokio-stream", + "tonic 0.14.2", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower" version = "0.4.13" diff --git a/src/servers/Cargo.toml b/src/servers/Cargo.toml index 7d8c01f048..d82e607f0e 100644 --- a/src/servers/Cargo.toml +++ b/src/servers/Cargo.toml @@ -133,6 +133,7 @@ tokio-stream = { workspace = true, features = ["net"] } tokio-util.workspace = true tonic.workspace = true tonic-reflection = "0.14" +tonic-web = "0.14" tower = { workspace = true, features = ["full"] } tower-http = { version = "0.6", features = ["full"] } tracing.workspace = true diff --git a/src/servers/src/grpc.rs b/src/servers/src/grpc.rs index ab4caafc34..43a066e423 100644 --- a/src/servers/src/grpc.rs +++ b/src/servers/src/grpc.rs @@ -355,7 +355,11 @@ impl Server for GrpcServer { .layer(MetricsMiddlewareLayer) .into_inner(); - let mut builder = tonic::transport::Server::builder().layer(metrics_layer); + let mut builder = tonic::transport::Server::builder() + .accept_http1(true) + .layer(metrics_layer) + .layer(tonic_web::GrpcWebLayer::new()); + if let Some(tls_config) = self.tls_config.clone() { builder = builder.tls_config(tls_config).context(StartGrpcSnafu)?; }