UNPKG

syntropylog

Version:

An instance manager with observability for Node.js applications

70 lines 2.19 kB
/** * @file src/serialization/utils/DataSanitizer.ts * @description Simple data sanitization utility for sensitive data redaction */ export class DataSanitizer { defaultSensitiveFields = [ 'password', 'token', 'secret', 'key', 'auth', 'authorization', 'api_key', 'apikey', 'private_key', 'privatekey', 'credential', 'credential_id', 'credentialid', 'access_token', 'accesstoken', 'refresh_token', 'refreshtoken', 'session_id', 'sessionid', ]; defaultMaxDepth = 10; sanitize(data, context = {}) { const sensitiveFields = context.sensitiveFields || this.defaultSensitiveFields; const maxDepth = context.maxDepth || this.defaultMaxDepth; const currentDepth = context.currentDepth || 0; if (currentDepth >= maxDepth) { return '[MAX_DEPTH_REACHED]'; } if (data === null || data === undefined) { return data; } if (typeof data === 'string') { return data; } if (typeof data === 'number' || typeof data === 'boolean') { return data; } if (Array.isArray(data)) { return data.map((_item, _index) => this.sanitize(_item, { ...context, currentDepth: currentDepth + 1, })); } if (typeof data === 'object') { const sanitized = {}; for (const [key, value] of Object.entries(data)) { const lowerKey = key.toLowerCase(); const isSensitive = sensitiveFields.some((field) => lowerKey.includes(field.toLowerCase())); if (isSensitive) { sanitized[key] = '[REDACTED]'; } else { sanitized[key] = this.sanitize(value, { ...context, currentDepth: currentDepth + 1, }); } } return sanitized; } return data; } } //# sourceMappingURL=DataSanitizer.js.map