/**
* Developed by eBrook Group.
* Copyright © 2026 eBrook Group (https://www.ebrook.com.tw)
*/
/**
* Error response sanitizer
* Removes sensitive information from error responses
*/
/**
* Sanitize error response for client output
* Only returns safe error information, logs full details
* @param status - HTTP status code
* @param body - Error response body
* @returns Sanitized error message
*/
export function sanitizeErrorResponse(status: number, body: unknown): string {
// Only return error code and safe message
if (typeof body === 'object' && body !== null) {
const errorBody = body as Record<string, unknown>;
// Extract safe error information
const errorCode = errorBody.ECODE ? ` (${errorBody.ECODE})` : '';
const errorMessage = errorBody.err ? String(errorBody.err) : 'Unknown error';
// Return sanitized error
return `HTTP ${status}${errorCode}: ${errorMessage}`;
}
return `HTTP ${status}: Request failed`;
}
/**
* Sanitize API response for logging or output
* Removes sensitive fields like tokens, keys, etc.
* @param response - API response object
* @returns Sanitized response
*/
export function sanitizeApiResponse(response: unknown): unknown {
if (typeof response !== 'object' || response === null) {
return response;
}
const sanitized = { ...response } as Record<string, unknown>;
// Remove potentially sensitive fields
const sensitiveFields = [
'token', 'api_key', 'secret', 'password', 'authorization',
'auth', 'bearer', 'credential', 'key', 'access_token',
'refresh_token', 'session_id', 'cookie'
];
for (const field of sensitiveFields) {
if (field in sanitized) {
sanitized[field] = '[REDACTED]';
}
}
// Recursively sanitize nested objects
for (const key in sanitized) {
if (typeof sanitized[key] === 'object' && sanitized[key] !== null) {
sanitized[key] = sanitizeApiResponse(sanitized[key]);
}
}
return sanitized;
}