"use strict";
/**
* Every failure raised by this client is a plain `Error` tagged with a
* `kind`, so callers narrow with the type guards below (or on `kind`):
*
* try { await domains.check(client, 'x.ro') }
* catch (e) { if (isApiError(e) && e.status === 402) ... }
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.isUploadFailedError = exports.isJobFailedError = exports.isTimeoutError = exports.isDomainDeniedError = exports.isConfigError = exports.isTransportError = exports.isApiError = exports.isIrdError = exports.uploadFailed = exports.jobFailed = exports.timeoutError = exports.domainDenied = exports.configError = exports.transportError = exports.apiError = void 0;
const NAMES = {
api: 'IrdApiError',
transport: 'IrdTransportError',
config: 'IrdConfigError',
domainDenied: 'IrdDomainDeniedError',
timeout: 'IrdTimeoutError',
jobFailed: 'IrdJobFailedError',
uploadFailed: 'IrdUploadFailedError',
};
const tagged = (message, fields, cause) => {
const error = cause === undefined ? new Error(message) : new Error(message, { cause });
return Object.assign(error, { name: NAMES[fields.kind] }, fields);
};
/** Error returned by the ird API (non-2xx HTTP status). */
const apiError = (message, code, status, response) => tagged(message, { kind: 'api', code, status, response });
exports.apiError = apiError;
/** Low-level failure talking to the API (connection failure, non-JSON body, ...). */
const transportError = (message, detail, cause) => tagged(message, { kind: 'transport', detail }, cause);
exports.transportError = transportError;
/** Invalid client configuration or call arguments. */
const configError = (message, detail) => tagged(message, { kind: 'config', detail });
exports.configError = configError;
/**
* Client-side domain gate violation: the operation targets a domain that the
* client's deniedDomains/allowedDomains configuration forbids. Thrown before
* any request reaches the API.
*/
const domainDenied = (domain, matchedPattern, op) => tagged(`Domain gate: ${domain ?? '(unknown domain)'} may not be touched by ${op}`, {
kind: 'domainDenied',
domain,
matchedPattern,
op,
});
exports.domainDenied = domainDenied;
/** A polling helper ran past its deadline; `last` is the last response seen. */
const timeoutError = (message, last) => tagged(message, { kind: 'timeout', last });
exports.timeoutError = timeoutError;
/** An async job reached a terminal failed status. */
const jobFailed = (message, job) => tagged(message, { kind: 'jobFailed', job });
exports.jobFailed = jobFailed;
/** An IPFS upload failed or expired. */
const uploadFailed = (message, upload) => tagged(message, { kind: 'uploadFailed', upload });
exports.uploadFailed = uploadFailed;
const KINDS = new Set(Object.keys(NAMES));
const isIrdError = (e) => e instanceof Error && KINDS.has(e.kind);
exports.isIrdError = isIrdError;
const isApiError = (e) => (0, exports.isIrdError)(e) && e.kind === 'api';
exports.isApiError = isApiError;
const isTransportError = (e) => (0, exports.isIrdError)(e) && e.kind === 'transport';
exports.isTransportError = isTransportError;
const isConfigError = (e) => (0, exports.isIrdError)(e) && e.kind === 'config';
exports.isConfigError = isConfigError;
const isDomainDeniedError = (e) => (0, exports.isIrdError)(e) && e.kind === 'domainDenied';
exports.isDomainDeniedError = isDomainDeniedError;
const isTimeoutError = (e) => (0, exports.isIrdError)(e) && e.kind === 'timeout';
exports.isTimeoutError = isTimeoutError;
const isJobFailedError = (e) => (0, exports.isIrdError)(e) && e.kind === 'jobFailed';
exports.isJobFailedError = isJobFailedError;
const isUploadFailedError = (e) => (0, exports.isIrdError)(e) && e.kind === 'uploadFailed';
exports.isUploadFailedError = isUploadFailedError;