/** * Base error class for all keyserver-related errors */ export class KeyserverError extends Error { public readonly statusCode?: number constructor(message: string, statusCode?: number) { super(message) this.name = 'KeyserverError' this.statusCode = statusCode Object.setPrototypeOf(this, KeyserverError.prototype) } } /** * Thrown when authentication fails (401 Unauthorized) */ export class UnauthorizedError extends KeyserverError { constructor(message: string = 'Authentication required') { super(message, 401) this.name = 'UnauthorizedError' Object.setPrototypeOf(this, UnauthorizedError.prototype) } } /** * Thrown when access is denied (403 Forbidden) */ export class ForbiddenError extends KeyserverError { constructor(message: string = 'Access denied') { super(message, 403) this.name = 'ForbiddenError' Object.setPrototypeOf(this, ForbiddenError.prototype) } } /** * Thrown when a resource is not found (404 Not Found) */ export class NotFoundError extends KeyserverError { constructor(message: string = 'Resource not found') { super(message, 404) this.name = 'NotFoundError' Object.setPrototypeOf(this, NotFoundError.prototype) } } /** * Thrown for network errors (5xx status codes, timeouts, etc.) */ export class NetworkError extends KeyserverError { constructor(message: string = 'Network error occurred', statusCode?: number) { super(message, statusCode) this.name = 'NetworkError' Object.setPrototypeOf(this, NetworkError.prototype) } } /** * Thrown when decryption fails */ export class DecryptionError extends Error { constructor(message: string = 'Failed to decrypt message') { super(message) this.name = 'DecryptionError' Object.setPrototypeOf(this, DecryptionError.prototype) } }