UNPKG

dnsweeper

Version:

Advanced CLI tool for DNS record risk analysis and cleanup. Features CSV import for Cloudflare/Route53, automated risk assessment, and parallel DNS validation.

191 lines 6.12 kB
/** * DNSweeperの基底エラークラス */ export class DnsSweeperError extends Error { code; details; constructor(message, code, details) { super(message); this.code = code; this.details = details; this.name = 'DnsSweeperError'; // スタックトレースを保持 if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor); } } /** * エラーの詳細情報を整形して返す */ toDetailedString() { let result = `${this.name} [${this.code}]: ${this.message}`; if (this.details) { result += '\n詳細情報:'; for (const [key, value] of Object.entries(this.details)) { result += `\n ${key}: ${JSON.stringify(value)}`; } } return result; } } /** * DNS解決関連のエラー */ export class DnsResolutionError extends DnsSweeperError { constructor(message, details) { super(message, 'DNS_RESOLUTION_ERROR', details); this.name = 'DnsResolutionError'; } } /** * CSV処理関連のエラー */ export class CsvProcessingError extends DnsSweeperError { constructor(message, details) { super(message, 'CSV_PROCESSING_ERROR', details); this.name = 'CsvProcessingError'; } } /** * 設定関連のエラー */ export class ConfigurationError extends DnsSweeperError { constructor(message, details) { super(message, 'CONFIGURATION_ERROR', details); this.name = 'ConfigurationError'; } } /** * 検証エラー */ export class ValidationError extends DnsSweeperError { constructor(message, details) { super(message, 'VALIDATION_ERROR', details); this.name = 'ValidationError'; } } /** * API関連のエラー */ export class ApiError extends DnsSweeperError { statusCode; constructor(message, statusCode, details) { super(message, 'API_ERROR', details); this.statusCode = statusCode; this.name = 'ApiError'; } } /** * ファイル操作関連のエラー */ export class FileOperationError extends DnsSweeperError { constructor(message, details) { super(message, 'FILE_OPERATION_ERROR', details); this.name = 'FileOperationError'; } } /** * タイムアウトエラー */ export class TimeoutError extends DnsSweeperError { constructor(message, details) { super(message, 'TIMEOUT_ERROR', details); this.name = 'TimeoutError'; } } /** * エラーハンドリングユーティリティ */ export class ErrorHandler { /** * エラーをラップして詳細情報を追加 */ static wrap(error, context, details) { if (error instanceof DnsSweeperError) { // 既存のDnsSweeperErrorの場合は詳細を追加 return new DnsSweeperError(`${context}: ${error.message}`, error.code, { ...error.details, ...details, }); } if (error instanceof Error) { // 通常のErrorの場合はラップ return new DnsSweeperError(`${context}: ${error.message}`, 'WRAPPED_ERROR', { originalError: error.name, stack: error.stack, ...details, }); } // その他の場合 return new DnsSweeperError(`${context}: 不明なエラーが発生しました`, 'UNKNOWN_ERROR', { error: String(error), ...details, }); } /** * エラーメッセージをユーザーフレンドリーに変換 */ static getUserFriendlyMessage(error) { if (error instanceof DnsResolutionError) { return `DNS解決エラー: ${error.message}`; } if (error instanceof CsvProcessingError) { return `CSV処理エラー: ${error.message}`; } if (error instanceof ConfigurationError) { return `設定エラー: ${error.message}`; } if (error instanceof ValidationError) { return `入力検証エラー: ${error.message}`; } if (error instanceof ApiError) { const status = error.statusCode ? ` (ステータスコード: ${error.statusCode})` : ''; return `APIエラー: ${error.message}${status}`; } if (error instanceof FileOperationError) { return `ファイル操作エラー: ${error.message}`; } if (error instanceof TimeoutError) { return `タイムアウトエラー: ${error.message}`; } if (error instanceof Error) { return `エラー: ${error.message}`; } return '予期しないエラーが発生しました'; } /** * リトライ可能なエラーかどうかを判定 */ static isRetryable(error) { if (error instanceof TimeoutError) { return true; } if (error instanceof DnsResolutionError) { // DNS一時的なエラーはリトライ可能 const code = error.details?.code || ''; return ['ETIMEDOUT', 'ECONNRESET', 'ENOTFOUND'].includes(code); } if (error instanceof ApiError) { // 5xx系のエラーや429(Rate Limit)はリトライ可能 const status = error.statusCode || 0; return status >= 500 || status === 429; } return false; } /** * エラーの重要度を判定 */ static getSeverity(error) { if (error instanceof ConfigurationError || error instanceof ValidationError) { return 'critical'; // 設定ミスは修正が必要 } if (error instanceof ApiError && error.statusCode && error.statusCode >= 500) { return 'error'; // サーバーエラー } if (error instanceof TimeoutError || error instanceof DnsResolutionError) { return 'warning'; // 一時的な問題の可能性 } return 'error'; } } //# sourceMappingURL=errors.js.map