diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index cffbea346..599c068a6 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -19,6 +19,7 @@ import feeApi from './fee-api'; import BlocksAuditsRepository from '../repositories/BlocksAuditsRepository'; import BlocksSummariesRepository from '../repositories/BlocksSummariesRepository'; import Audit from './audit'; +import { deepClone } from '../utils/clone'; class WebsocketHandler { private wss: WebSocket.Server | undefined; @@ -421,7 +422,7 @@ class WebsocketHandler { let projectedBlocks; // template calculation functions have mempool side effects, so calculate audits using // a cloned copy of the mempool if we're running a different algorithm for mempool updates - const auditMempool = (config.MEMPOOL.ADVANCED_GBT_AUDIT === config.MEMPOOL.ADVANCED_GBT_MEMPOOL) ? _memPool : JSON.parse(JSON.stringify(_memPool)); + const auditMempool = (config.MEMPOOL.ADVANCED_GBT_AUDIT === config.MEMPOOL.ADVANCED_GBT_MEMPOOL) ? _memPool : deepClone(_memPool); if (config.MEMPOOL.ADVANCED_GBT_AUDIT) { projectedBlocks = await mempoolBlocks.makeBlockTemplates(auditMempool, false); } else { diff --git a/backend/src/utils/clone.ts b/backend/src/utils/clone.ts new file mode 100644 index 000000000..38e36096f --- /dev/null +++ b/backend/src/utils/clone.ts @@ -0,0 +1,14 @@ +// simple recursive deep clone for literal-type objects +// does not preserve Dates, Maps, Sets etc +// does not support recursive objects +// properties deeper than maxDepth will be shallow cloned +export function deepClone(obj: any, maxDepth: number = 50, depth: number = 0): any { + let cloned = obj; + if (depth < maxDepth && typeof obj === 'object') { + cloned = Array.isArray(obj) ? [] : {}; + for (const key in obj) { + cloned[key] = deepClone(obj[key], maxDepth, depth + 1); + } + } + return cloned; +} \ No newline at end of file