/**
 * redact-error.ts — Internal credential-scrubbing helper.
 *
 * The `postgres` npm package can embed the full DSN (including the password)
 * in connection-failure error messages. This module provides a single helper
 * that strips the user:password portion from any such message before it is
 * re-thrown, logged, or surfaced in a structured health report.
 *
 * This file is intentionally NOT re-exported from the package index — it is
 * an internal utility for use within packages/storage/src only.
 */

/**
 * Redacts credentials from error messages that may include connection URLs.
 * The `postgres` npm package can embed the full DSN in connection-failure
 * messages, and ioredis can embed `redis://` / `rediss://` URLs similarly.
 * This helper strips the user:password portion before display.
 *
 * Handles `postgres://`, `postgresql://`, `redis://`, and `rediss://`
 * schemes (case-insensitive). Everything between `://` and `@` (the userinfo
 * component) is replaced with `***` so that the host, port, and database name
 * remain visible for diagnostics while the secret is never written to logs or
 * CI output.
 *
 * @example
 *   redactErrMsg('connect ECONNREFUSED postgres://admin:s3cr3t@db:5432/mosaic')
 *   // → 'connect ECONNREFUSED postgres://***@db:5432/mosaic'
 *
 *   redactErrMsg('connect ECONNREFUSED redis://user:pass@cache:6379')
 *   // → 'connect ECONNREFUSED redis://***@cache:6379'
 */
const CREDENTIAL_URL_RE = /(postgres(?:ql)?|rediss?):\/\/[^@\s]*@/gi;

export function redactErrMsg(msg: string): string {
  return msg.replace(
    CREDENTIAL_URL_RE,
    (_match, scheme: string) => `${scheme.toLowerCase()}://***@`,
  );
}
