syntropylog
Version:
An instance manager with observability for Node.js applications
70 lines • 2.19 kB
JavaScript
/**
* @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