Distributed cache * cache deleteKey now uses an options object instead of a lonely argument variable fuzzy * merge * remove debug logs and cleanup * cleanup * add fault handling * add fault handling * add pid when logging redis client creation * add identifier when logging redis client creation * cleanup * feat: add redis-api as it's own app * feature: use http wrapper for redis * feat: add the possibility to fallback to unstable_cache * Add error handling if redis cache is unresponsive * add logging for unstable_cache * merge * don't cache errors * fix: metadatabase on branchdeploys * Handle when /en/destinations throws add ErrorBoundary * Add sentry-logging when ErrorBoundary catches exception * Fix error handling for distributed cache * cleanup code * Added Application Insights back * Update generateApiKeys script and remove duplicate * Merge branch 'feature/redis' of bitbucket.org:scandic-swap/web into feature/redis * merge Approved-by: Linus Flood
43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
/**
|
|
* Masks a string by replacing characters with a mask character
|
|
* @param value - The string to mask
|
|
* @param visibleStart - Number of characters to show at start (default: 0)
|
|
* @param visibleEnd - Number of characters to show at end (default: 4)
|
|
* @param maskChar - Character to use for masking (default: '*')
|
|
* @returns The masked string
|
|
*/
|
|
const maskChar = "*";
|
|
export function mask(
|
|
value: string,
|
|
options?: { visibleStart?: number; visibleEnd?: number; maxLength?: number },
|
|
): string {
|
|
if (!value) return "";
|
|
|
|
const { visibleStart = 2, visibleEnd = 2, maxLength = 10 } = options ?? {};
|
|
|
|
if (isEmail(value)) {
|
|
return maskEmail(value);
|
|
}
|
|
|
|
const totalVisible = visibleStart + visibleEnd;
|
|
if (value.length <= totalVisible) {
|
|
return maskChar.repeat(value.length);
|
|
}
|
|
|
|
const start = value.slice(0, visibleStart);
|
|
const middle = value.slice(visibleStart, -visibleEnd || undefined);
|
|
const end = visibleEnd ? value.slice(-visibleEnd) : "";
|
|
|
|
const maskedLength = Math.min(middle.length, maxLength);
|
|
return start + maskChar.repeat(maskedLength) + end;
|
|
}
|
|
|
|
function maskEmail(email: string): string {
|
|
const [local, domain] = email.split("@");
|
|
if (!domain || !local) return mask(email);
|
|
const [subDomain, tld] = domain.split(/\.(?=[^.]+$)/);
|
|
return `${mask(local)}@${mask(subDomain ?? "")}.${tld}`;
|
|
}
|
|
|
|
const isEmail = (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
|