- Added rate_limit() method to ErrorResponse for proper HTTP 429 responses
- Added check_detailed() to LocalSearchUiRateLimiter returning (allowed, remaining, reset_after)
- Implemented IP-based rate limiting in mint_session using Redis or local backend
- Extracts client IP from X-Forwarded-For or X-Real-IP headers
- Parses rate limit config (e.g., "60/minute" -> limit=60, window=60s)
- Returns accurate rate limit info (remaining, reset_in) in session response
The rate limit info is now tracked in Redis (miroir:ratelimit:searchui:<ip>)
or in local memory, with proper TTL handling.
Closes: bf-607z
Additions:
- Standalone Meilisearch instance on port 7704 in docker-compose-dev.yml
for API compatibility testing against plain Meilisearch
- Cross-compatibility test script (run_cross_compat_tests.sh) that runs
each SDK smoke test against both Miroir and plain Meilisearch
- Documentation of intentional API differences (X-Miroir-* headers,
Miroir-specific error codes, admin endpoints)
Fixes:
- Clone state.query_planner and state.metrics before moving into async
closure in multi_search.rs to fix compilation error
- Add catch-all pattern in error_response.rs MiroirError match to
handle non-exhaustive enum variants
Closes: miroir-89x.3
Adds core proxy server modules that were previously untracked:
- client.rs: HTTP client for node communication with connection pooling
- state.rs: Shared application state for proxy server
- error_response.rs: Meilisearch-compatible error responses
These modules are foundational to the proxy server and complete the Phase 0
scaffolding requirements.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>