diff --git a/bin/democratic-csi b/bin/democratic-csi index b6853a6..c07386c 100755 --- a/bin/democratic-csi +++ b/bin/democratic-csi @@ -3,6 +3,7 @@ const yaml = require("js-yaml"); const fs = require("fs"); const { grpc } = require("../src/utils/grpc"); +const { stringify } = require("../src/utils/general"); let options; const args = require("yargs") @@ -127,7 +128,7 @@ try { let operationLock = new Set(); async function requestHandlerProxy(call, callback, serviceMethodName) { - const cleansedCall = JSON.parse(JSON.stringify(call)); + const cleansedCall = JSON.parse(stringify(call)); for (const key in cleansedCall.request) { if (key.includes("secret")) { cleansedCall.request[key] = "redacted"; diff --git a/src/utils/general.js b/src/utils/general.js index ff76c50..9b37f70 100644 --- a/src/utils/general.js +++ b/src/utils/general.js @@ -51,6 +51,24 @@ function getLargestNumber() { return number; } +function stringify(value) { + const getCircularReplacer = () => { + const seen = new WeakSet(); + return (key, value) => { + if (typeof value === "object" && value !== null) { + if (seen.has(value)) { + return; + } + seen.add(value); + } + return value; + }; + }; + + return JSON.stringify(value, getCircularReplacer()); +} + module.exports.sleep = sleep; module.exports.lockKeysFromRequest = lockKeysFromRequest; module.exports.getLargestNumber = getLargestNumber; +module.exports.stringify = stringify; \ No newline at end of file