import _ from "lodash"; const MASK = "[REDACTED]"; const redactString = (value) => { if (typeof value !== "string") return value; return value .replace( /([a-zA-Z0-9._%+-]{1,})@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/g, `${MASK}@${MASK}` ) .replace(/Bearer\s+[A-Za-z0-9._\-]+/gi, `Bearer ${MASK}`) .replace(/("client_secret"\s*:\s*")[^"]+("?)/gi, `$1${MASK}$2`) .replace(/("access_token"\s*:\s*")[^"]+("?)/gi, `$1${MASK}$2`); }; export const redactSensitive = (value) => { if (value == null) return value; if (typeof value === "string") { return redactString(value); } try { const json = JSON.stringify(value); return redactString(json); } catch (_error) { return MASK; } }; export const getIP = (req) => { const forwarded = req.headers["x-forwarded-for"]; const ip = typeof forwarded === "string" ? forwarded.split(/, /)[0] : req.socket.remoteAddress; console.info( "\n====================\n Client IP address: " + ip, "\n=====================\n" ); }; export const consoleLogger = (err) => { console.log( "\n\n/////////////////////////////////////////////////\nRaw Error " + redactSensitive(err) + "\n\n/////////////////////////////////////////////////\n" ); var errStr = "\n\n/////////////////////////////////////////////////\nServer Error " + "\n" + (_.has(err, "name") ? "Name: " + err.name + "\n" : "") + (_.has(err, "code") ? "Code: " + err.code + "\n" : "") + (_.has(err, "query") ? "Query: " + err.query + "\n" : "") + (_.has(err, "message") ? "Message: " + err.message + "\n" : "") + (_.has(err, "request.url") ? "request.url: " + err.request.url + "\n" : "") + (_.has(err, "response.status") ? "Status: " + err.code + "\n" : "") + (_.has(err, "response.statusText") ? "\nStatusText: " + err.response.status + "\n" : "") + (_.has(err, "response.request.socket.remoteAddress") ? "\nRequest IP: " + err.response.request.socket.remoteAddress + "\n" : "") + (_.has(err, "response.data.error.message") ? "\nMessage: " + redactSensitive(err.response.data.error.message) + "\n" : "") + (_.has(err, "response.config.url") ? "\nRequest URL: " + redactSensitive(err.config.url) + "\n" : "") + (_.has(err, "response.headers.date") ? "\nRequest Time: " + err.response.headers.date + "\n" : "") + (_.has(err, "config.url") ? "\nAxios config url: " + redactSensitive(err.config.url) + "\n" : "") + (_.has(err, "config.url") ? "\nAxios message url: " + redactSensitive(err.message) + "\n" : "") + (_.has(err, "config.data") ? "\nRequest payload: " + redactSensitive(err.config.data) + "\n" : "") + "\n/////////////////////////////////////////////////\n"; console.log(errStr); }; export const conLog = (err) => { var errStr = "\n\n/////////////////////////////////////////////////\nResponse: " + "\n" + err + "\n/////////////////////////////////////////////////\n\n"; console.log(errStr); return errStr; };