UNPKG

@dima_aryze/reforge

Version:

TypeScript/JavaScript SDK for Reforge - Cross-chain token operations

163 lines 5.28 kB
/** * HTTP request interceptors for the Reforge SDK */ import { generateRequestId } from '../utils'; /** * Request interceptor for handling authentication and request preparation */ export class RequestInterceptor { constructor( // eslint-disable-next-line no-unused-vars apiKey, // eslint-disable-next-line no-unused-vars logger) { Object.defineProperty(this, "apiKey", { enumerable: true, configurable: true, writable: true, value: apiKey }); Object.defineProperty(this, "logger", { enumerable: true, configurable: true, writable: true, value: logger }); } /** * Setup request interceptor on axios instance */ setup(axiosInstance) { axiosInstance.interceptors.request.use(config => this.handleRequest(config), error => this.handleRequestError(error)); } /** * Handle outgoing requests */ handleRequest(config) { // Add API key if available and not explicitly skipped if (this.apiKey && !config.headers?.['skip-auth']) { config.headers = { ...config.headers, 'x-api-key': this.apiKey, }; } // Remove skip-auth header if present if (config.headers?.['skip-auth']) { delete config.headers['skip-auth']; } // Add request ID for tracking if (!config.headers?.['X-Request-ID']) { config.headers = { ...config.headers, 'X-Request-ID': generateRequestId(), }; } // Add timestamp config.headers = { ...config.headers, 'X-Request-Timestamp': new Date().toISOString(), }; // Log request details this.logger?.debug('Outgoing request', { method: config.method?.toUpperCase(), url: config.url, baseURL: config.baseURL, headers: this.sanitizeHeaders(config.headers), hasData: !!config.data, }); return config; } /** * Handle request interceptor errors */ handleRequestError(error) { this.logger?.error('Request interceptor error', error); return Promise.reject(error); } /** * Sanitize headers for logging (remove sensitive information) */ sanitizeHeaders(headers) { if (!headers) return {}; const sanitized = { ...headers }; // Mask sensitive headers const sensitiveHeaders = ['x-api-key', 'authorization', 'cookie']; for (const header of sensitiveHeaders) { if (sanitized[header]) { sanitized[header] = '[REDACTED]'; } } return sanitized; } /** * Update the API key */ updateApiKey(apiKey) { this.apiKey = apiKey; } } /** * Response interceptor for handling response processing */ export class ResponseInterceptor { constructor( // eslint-disable-next-line no-unused-vars logger) { Object.defineProperty(this, "logger", { enumerable: true, configurable: true, writable: true, value: logger }); } /** * Setup response interceptor on axios instance */ setup(axiosInstance) { axiosInstance.interceptors.response.use(response => this.handleResponse(response), error => this.handleResponseError(error)); } /** * Handle successful responses */ handleResponse(response) { const requestId = response.config?.headers?.['X-Request-ID']; const requestTimestamp = response.config?.headers?.['X-Request-Timestamp']; // Calculate response time if timestamp is available const responseTime = requestTimestamp ? Date.now() - new Date(requestTimestamp).getTime() : undefined; this.logger?.debug('Response received', { status: response.status, statusText: response.statusText, url: response.config?.url, requestId, responseTime: responseTime ? `${responseTime}ms` : undefined, contentType: response.headers?.['content-type'], contentLength: response.headers?.['content-length'], }); return response; } /** * Handle response errors */ handleResponseError(error) { const requestId = error.config?.headers?.['X-Request-ID']; const requestTimestamp = error.config?.headers?.['X-Request-Timestamp']; // Calculate response time if timestamp is available const responseTime = requestTimestamp ? Date.now() - new Date(requestTimestamp).getTime() : undefined; this.logger?.error('Response error', { status: error.response?.status, statusText: error.response?.statusText, url: error.config?.url, requestId, responseTime: responseTime ? `${responseTime}ms` : undefined, errorCode: error.code, message: error.message, }); return Promise.reject(error); } } //# sourceMappingURL=interceptors.js.map