sdarbinyan 92e2ee5f49
Some checks failed
Architecture Governance / architecture (push) Has been cancelled
feat: normalize API errors and handle 429 rate limiting
Nothing in the frontend parsed the backend error envelope, and nothing
anywhere handled 429 - a rate-limited backend surfaced as a generic failure
with no retry and no user-visible explanation. core/error-handling and
core/interceptors were empty directories.

- api-error.model.ts    typed envelope per BACKEND-API-REFERENCE.md section 5,
                        plus a status-to-code fallback so a response with no
                        envelope still arrives as a usable ApiError
- api-error.mapper.ts   total function: HTML bodies, empty bodies and
                        differently-shaped JSON all produce an ApiError rather
                        than throwing inside the error path
- api-error.interceptor bounded retry on 429 honouring Retry-After (seconds or
                        HTTP-date), idempotent methods only - replaying a POST
                        after a 429 can double-submit, and that call belongs to
                        the caller that knows whether it holds an idempotency key
- rate-limit-notifier   signal-based state so the UI can say "throttled,
                        resumes in N seconds" instead of "something went wrong";
                        self-clearing, because a banner outliving the throttle
                        trains users to ignore it

A 429 carrying no delay hint defaults to a non-zero wait so callers cannot
busy-loop the endpoint that just asked them to stop.

14 mapper tests. Suite 115/115 green, boundaries pass, build clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 13:15:13 +04:00
2026-07-19 15:28:35 +04:00
2026-01-18 18:57:06 +04:00
2026-06-01 00:47:26 +04:00
2026-01-18 18:57:06 +04:00
2026-03-24 02:25:50 +04:00
2026-07-09 01:40:22 +04:00
2026-05-28 12:56:41 +00:00
2026-06-21 23:42:39 +04:00
Description
No description provided
16 MiB
Languages
TypeScript 71.4%
HTML 15.3%
SCSS 11.9%
Shell 1.3%
JavaScript 0.1%