/** * Service Unavailable Error * * Error thrown when the gas-free backend service is unavailable * * @module features/gas-free/errors/ServiceUnavailableError */ import { GasFreeError, GasFreeErrorCode } from './GasFreeError'; /** * ServiceUnavailableError class * * Thrown when the gas-free service is down or unreachable. */ export class ServiceUnavailableError extends GasFreeError { /** Service URL that was unavailable */ public readonly serviceUrl: string; /** HTTP status code (if available) */ public readonly statusCode?: number; /** Number of retries attempted */ public readonly retriesAttempted?: number; /** * Create a ServiceUnavailableError * * @param serviceUrl - Service URL * @param message - Error message * @param statusCode - HTTP status code (if available) * @param retriesAttempted - Number of retries attempted * @param originalError - Original error */ constructor( serviceUrl: string, message?: string, statusCode?: number, retriesAttempted?: number, originalError?: Error ) { const errorMessage = message || `Gas-Free service at '${serviceUrl}' is unavailable` + (statusCode ? ` (HTTP ${statusCode})` : '') + (retriesAttempted ? ` after ${retriesAttempted} retries` : ''); super(errorMessage, GasFreeErrorCode.SERVICE_UNAVAILABLE, originalError, { serviceUrl, statusCode, retriesAttempted, }); this.name = 'ServiceUnavailableError'; this.serviceUrl = serviceUrl; this.statusCode = statusCode; this.retriesAttempted = retriesAttempted; // Maintains proper stack trace for where our error was thrown (only available on V8) if (Error.captureStackTrace) { Error.captureStackTrace(this, ServiceUnavailableError); } } /** * Create error for network timeout */ static timeout( serviceUrl: string, timeoutMs: number, retriesAttempted?: number ): ServiceUnavailableError { return new ServiceUnavailableError( serviceUrl, `Request timed out after ${timeoutMs}ms`, undefined, retriesAttempted ); } /** * Create error for HTTP status code */ static httpError( serviceUrl: string, statusCode: number, statusText?: string ): ServiceUnavailableError { return new ServiceUnavailableError(serviceUrl, statusText, statusCode); } /** * Convert error to JSON */ toJSON(): Record { return { ...super.toJSON(), serviceUrl: this.serviceUrl, statusCode: this.statusCode, retriesAttempted: this.retriesAttempted, }; } }