diff --git a/lib/internal/inspect_repl.js b/lib/internal/inspect_repl.js index 937c184..e99dbb0 100644 --- a/lib/internal/inspect_repl.js +++ b/lib/internal/inspect_repl.js @@ -25,6 +25,7 @@ const Path = require('path'); const Repl = require('repl'); const util = require('util'); const vm = require('vm'); +const JSONSplitStream = require('json-split-stream'); const debuglog = util.debuglog('inspect'); @@ -900,10 +901,10 @@ function createRepl(inspector) { return new Promise((resolve, reject) => { const absoluteFile = Path.resolve(filename); const writer = FS.createWriteStream(absoluteFile); - let totalSize; + const jsonChunker = new JSONSplitStream({ storeData: false }); + jsonChunker.on('finishedJSON', onFinishedJSON); let sizeWritten = 0; function onProgress({ done, total, finished }) { - totalSize = total; if (finished) { print('Heap snaphost prepared.'); } else { @@ -912,14 +913,16 @@ function createRepl(inspector) { } function onChunk({ chunk }) { sizeWritten += chunk.length; - writer.write(chunk); - print(`Writing snapshot: ${sizeWritten}/${totalSize}`, true); - if (sizeWritten >= totalSize) { - writer.end(); - teardown(); - print(`Wrote snapshot: ${absoluteFile}`); - resolve(); - } + writer.write(chunk, () => { + print(`Writing snapshot: ${sizeWritten} bytes`, true); + jsonChunker.write(chunk); + }); + } + function onFinishedJSON() { + writer.end(); + teardown(); + print(`Wrote snapshot: ${absoluteFile} (${sizeWritten} bytes)`); + resolve(); } function teardown() { HeapProfiler.removeListener( diff --git a/package.json b/package.json index f31666d..bae3de5 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,9 @@ ] } }, - "dependencies": {}, + "dependencies": { + "json-split-stream": "^1.1.0" + }, "devDependencies": { "eslint": "^3.10.2", "nlm": "^3.0.0",