diff --git a/src/middlewares/debugging/transit-logger.js b/src/middlewares/debugging/transit-logger.js index 39775a987..5f1e51da8 100644 --- a/src/middlewares/debugging/transit-logger.js +++ b/src/middlewares/debugging/transit-logger.js @@ -10,7 +10,7 @@ const _ = require("lodash"); const kleur = require("kleur"); const fs = require("fs"); const path = require("path"); -const { makeDirs } = require("../../utils"); +const { makeDirs, safetyObject } = require("../../utils"); module.exports = function TransitLoggerMiddleware(opts) { opts = _.defaultsDeep(opts, { @@ -35,11 +35,20 @@ module.exports = function TransitLoggerMiddleware(opts) { let targetFolder; function saveToFile(filename, payload) { - const data = JSON.stringify( - payload, - payload instanceof Error ? Object.getOwnPropertyNames(payload) : null, - 4 - ); + let data; + try { + data = JSON.stringify( + payload, + payload instanceof Error ? Object.getOwnPropertyNames(payload) : null, + 4 + ); + } catch (err) { + data = JSON.stringify( + safetyObject(payload), + payload instanceof Error ? Object.getOwnPropertyNames(payload) : null, + 4 + ); + } fs.writeFile(path.join(targetFolder, filename), data, () => { /* Silent error */ }); diff --git a/test/unit/middlewares/debugging/transit-logger.spec.js b/test/unit/middlewares/debugging/transit-logger.spec.js index 37b2cf298..b607b3f28 100644 --- a/test/unit/middlewares/debugging/transit-logger.spec.js +++ b/test/unit/middlewares/debugging/transit-logger.spec.js @@ -110,6 +110,38 @@ describe("Test ActionLogger", () => { expect.any(Function) ); }); + + it("should log published packet to file with circular payload", async () => { + fs.writeFile.mockClear(); + Date.now = jest.fn(() => 123456); + const mw = createMW({ + logger, + colors: false, + folder: "./logs", + extension: ".log", + logParams: true + }); + + const next = jest.fn(); + const payload = { + a: 5, + b: {} + }; + payload.b.c = payload; + const packet = { type: "REQUEST", target: "server-2", payload }; + mw.transitPublish(next)(packet); + + expect(next).toBeCalledTimes(1); + expect(next).toBeCalledWith(packet); + + expect(fs.writeFile).toBeCalledTimes(1); + expect(fs.writeFile).toHaveBeenNthCalledWith( + 1, + path.join("logs", "server-1", "123456-send-REQUEST-to-server-2.log"), + stringify({ a: 5, b: {} }), + expect.any(Function) + ); + }); }); describe("Test logging received packets", () => {