@dima_aryze/reforge
Version:
TypeScript/JavaScript SDK for Reforge - Cross-chain token operations
168 lines • 5.52 kB
JavaScript
;
/**
* HTTP request interceptors for the Reforge SDK
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ResponseInterceptor = exports.RequestInterceptor = void 0;
const utils_1 = require("../utils");
/**
* Request interceptor for handling authentication and request preparation
*/
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': (0, utils_1.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;
}
}
exports.RequestInterceptor = RequestInterceptor;
/**
* Response interceptor for handling response processing
*/
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);
}
}
exports.ResponseInterceptor = ResponseInterceptor;
//# sourceMappingURL=interceptors.js.map