transport: complete M0–M7
Some checks failed
ci / rust (push) Failing after 2m21s
ci / ui (push) Failing after 28s
images / build-and-push (push) Failing after 18s

shared: add stream+consumer policy helpers; NATS context header builder

aggregate/runner/projection: centralize stream validation and header usage; set bounded consumer params

projection: add QueryService gRPC and wire into main; settings include PROJECTION_GRPC_ADDR

gateway: gRPC routing to Projection/Runner with deadlines; bounded read-only retries; pooled gRPC channels (bounded LRU+TTL); admin proxy forwards to gRPC; probes use concurrency limiter + TTL cache

runner: add RunnerAdmin gRPC server (drain, status, reload) and wire into main; settings include RUNNER_GRPC_ADDR

tests: add gateway authz for runner admin, projection tenant isolation, runner admin drain semantics

docs: update TRANSPORT_DEVELOPMENT_PLAN to reflect completed milestones and details
This commit is contained in:
2026-03-30 14:24:14 +03:00
parent 1ab112438b
commit 90c307016d
41 changed files with 2391 additions and 505 deletions

View File

@@ -1,6 +1,6 @@
pub const TENANT_ID_METADATA_KEY: &str = "x-tenant-id";
pub const CORRELATION_ID_METADATA_KEY: &str = "x-correlation-id";
pub const TRACEPARENT_METADATA_KEY: &str = "traceparent";
pub const TENANT_ID_METADATA_KEY: &str = shared::HEADER_X_TENANT_ID;
pub const CORRELATION_ID_METADATA_KEY: &str = shared::HEADER_X_CORRELATION_ID;
pub const TRACEPARENT_METADATA_KEY: &str = shared::HEADER_TRACEPARENT;
pub mod proto {
tonic::include_proto!("aggregate.gateway.v1");
@@ -47,7 +47,7 @@ impl GatewayClient {
let correlation_id = grpc_request
.get_ref()
.metadata
.get("x-correlation-id")
.get(shared::HEADER_X_CORRELATION_ID)
.or_else(|| grpc_request.get_ref().metadata.get("correlation_id"))
.map(|s| s.trim())
.filter(|s| !s.is_empty())
@@ -68,7 +68,7 @@ impl GatewayClient {
let traceparent = grpc_request
.get_ref()
.metadata
.get("traceparent")
.get(shared::HEADER_TRACEPARENT)
.map(|s| s.trim())
.filter(|s| !s.is_empty())
.map(|s| s.to_string())
@@ -78,10 +78,8 @@ impl GatewayClient {
.metadata
.get("trace_id")
.map(|s| s.trim())
.filter(|s| s.len() == 32 && s.chars().all(|c| c.is_ascii_hexdigit()))
.map(|trace_id| {
let span_id = uuid::Uuid::new_v4().simple().to_string()[..16].to_string();
format!("00-{trace_id}-{span_id}-01")
.and_then(|trace_id| {
shared::traceparent_from_trace_id(&shared::TraceId::new(trace_id))
})
});
if let Some(traceparent) = traceparent {