Backend:
- Fail fast on empty JWT_SECRET at startup
- Restrict CORS to explicit methods (GET/POST/PUT/DELETE/OPTIONS) and
headers (Authorization, Content-Type) instead of Any
- Add 1MB request body size limit (DefaultBodyLimit)
- Add gRPC status mappings: DeadlineExceeded->408, Cancelled->499,
AlreadyExists->409, ResourceExhausted->429, Unavailable->503
Frontend:
- Guard ErrorBoundary console.error behind import.meta.env.DEV
- Read VITE_API_URL and VITE_WS_URL from env vars with fallbacks
- Add max reconnect attempts (50) to WebSocket manager
- Tune React Query: staleTime 10s, refetchInterval 15s,
disable refetchOnWindowFocus to prevent thundering herd
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace impl Trait params with concrete types or named generics
- Rename shadowed variables (tx/ch/inner → unique names per scope)
- Add -> ! return type on infinite reconnect/heartbeat loops
- Replace wildcard enum match with explicit tonic::Code variants
- Use drop() on #[must_use] broadcast send results
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New web-gateway crate with:
- JWT auth middleware with claims extraction
- REST routes proxying to gRPC: trading, risk, ML, training, backtesting,
performance, config, and hyperparameter tuning
- Proto compilation from shared tli/proto definitions
- AppState with lazy gRPC channels and WebSocket broadcast
- Axum server with CORS, tracing, and graceful shutdown
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>