Files
0pt/app/api/siax-error-mapping.ts
T

29 lines
1.3 KiB
TypeScript

/**
* app/api/siax-error-mapping.ts — shared error mapper for the LEGACY routes
* outside the /api/0pt matcher (`app/api/orders*`, `/subscriptions`,
* `/payments/*`, `/webhooks/stripe`, `/admin/metrics`).
*
* 0pt#53: `getSqlForDurableStore` (lib/db.ts) throws
* `SiaxError("DEPENDENCY_UNAVAILABLE")` (httpStatus 503, retryable) when a
* money-bearing store would otherwise fall back to an in-memory Map in a
* production runtime. The /api/0pt/* surface already maps that error via
* src/http/siax-error-response.ts; these legacy routes did not, so the
* documented 503 DEPENDENCY_UNAVAILABLE leaked as Next's opaque 500.
*
* The helpers preserve each route's OWN typed error contract
* (IdempotencyKeyConflictError -> 409, etc.) and only ADD the SiaxError
* branch — a plain rethrow is deliberately avoided because App Router turns
* any uncaught thrown SiaxError into a generic 500 with no error body.
*/
import { NextResponse } from "next/server";
import { SiaxError } from "@/src/platform/errors";
export function isSiaxError(error: unknown): error is SiaxError {
return error instanceof SiaxError;
}
/** Map a caught error to a NextResponse: SiaxError -> its pinned status/body. */
export function siaxErrorResponseForLegacy(error: SiaxError): NextResponse {
return NextResponse.json(error.toJSON(), { status: error.httpStatus });
}