/
inssane
/
Axios-api
Обзор
Документация
Войти
/
inssane
/
Axios-api
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
api/core/redact.ts
53 строки
2 KB
Павел Чернышев
refactor(core): общий request-meta и бережный redact
18 июн 2026, 12:03
18 июн 2026, 12:03
eb1c25f
Код
Авторство
О чём код?
/** * Единый список чувствительных ключей. Используется и логгером (через pino `redact`), * и Sentry-мидлварой (через функцию `redact` ниже) — чтобы перс. данные не утекали * ни в логи, ни в трекер ошибок. */ export const SENSITIVE_KEYS = [ 'casId', 'cas_id', 'authorities', 'phone', 'firstName', 'first_name', 'middle_name', 'middleName', 'authorization', 'cookie', 'set-cookie' ] as const; const sensitiveSet = new Set<string>(SENSITIVE_KEYS); /** * Рекурсивно удаляет чувствительные ключи из значения, возвращая безопасную копию. * Циклические ссылки заменяются на строку `'[Circular]'`. */ export const redact = <T>(value: T, seen: WeakSet<object> = new WeakSet()): T => { if (Array.isArray(value)) { return value.map(item => redact(item, seen)) as unknown as T; } // Date и прочие встроенные «непрозрачные» объекты не разбираем по ключам — // иначе Date превратился бы в `{}`. Возвращаем как есть (они не несут ПДн по ключам). if (value instanceof Date) { return value; } if (value !== null && typeof value === 'object') { if (seen.has(value)) { return '[Circular]' as unknown as T; } seen.add(value); const result: Record<string, unknown> = {}; for (const [key, item] of Object.entries(value)) { if (sensitiveSet.has(key)) continue; result[key] = redact(item, seen); } return result as T; } return value; };