import type { Key } from "./index.js"; const codes = [ "storage", "transport", "validation", "record", "blob", "discovery", "conflict", "resolution", "unconfirmed-write", "stale", "unsupported", "collection-not-loaded", "protocol", "binding", "initialization", "closed", "cancelled", ] as const; export type FolioErrorCode = typeof codes[number]; /** Rust and host failures share these classifications at the JavaScript boundary. */ export interface FolioError extends Error { readonly name: "FolioError"; readonly code: FolioErrorCode; readonly key?: Key; } export function isFolioError(value: unknown): value is FolioError { return value instanceof Error && value.name === "FolioError" && "code" in value && codes.some((code) => code === value.code); } export function failure(code: FolioErrorCode, cause: unknown): FolioError { if (code === "binding" && isFolioError(cause)) return cause; return Object.assign(new Error(cause instanceof Error ? cause.message : String(cause), { cause }), { name: "FolioError" as const, code, }); }