actionhero
Version:
The reusable, scalable, and quick node.js API server for stateless and stateful applications
52 lines (45 loc) • 1.45 kB
text/typescript
import { isPlainObject } from "./isPlainObject";
import { deepCopy } from "./deepCopy";
import { config } from "../config";
import * as dotProp from "dot-prop";
/**
* Prepares acton params for logging.
* Hides any sensitive data as defined by `api.config.general.filteredParams`
* Truncates long strings via `api.config.logger.maxLogStringLength`
*/
export function filterObjectForLogging(
params: Record<string, any>,
): Record<string, any> {
params = deepCopy(params);
const sanitizedParams: Record<string, any> = {};
for (const i in params) {
if (
Array.isArray(params[i]) &&
params[i].length > (config.logger?.maxLogArrayLength ?? 10)
) {
params[i] = `${params[i].length} items`;
}
if (isPlainObject(params[i])) {
sanitizedParams[i] = params[i];
} else if (typeof params[i] === "string") {
sanitizedParams[i] = params[i].substring(
0,
config.logger.maxLogStringLength,
);
} else {
sanitizedParams[i] = params[i];
}
}
let filteredParams: string[];
if (typeof config.general.filteredParams === "function") {
filteredParams = config.general.filteredParams();
} else {
filteredParams = config.general.filteredParams;
}
filteredParams.forEach((configParam) => {
if (dotProp.get(params, configParam) !== undefined) {
dotProp.set(sanitizedParams, configParam, "[FILTERED]");
}
});
return sanitizedParams;
}