cpupro
Version:
Rethinking of CPU profile (collected in Node.js or Chromium browsers) analysis
54 lines (43 loc) • 1.51 kB
JavaScript
/* eslint-env node */
const { deflateRawSync } = require('zlib');
module.exports = function createHtmlBase64DataPrinter(
maxChunkSize = 1024 * 1024,
compress = false,
type = 'unknown/data',
onDataChunk = ''
) {
const OPEN = `\n<script type="${type}">`;
const CLOSE = `</script><script>\n(chunk=>{${
onDataChunk
}})(document.currentScript.previousSibling.text)</script>`;
let buffer = new Uint8Array(maxChunkSize);
let bufferSize = 0;
function appendBuffer(chunkBuffer) {
buffer.set(chunkBuffer, bufferSize);
bufferSize += chunkBuffer.byteLength;
}
function flushBuffer() {
const payload = buffer.subarray(0, bufferSize);
const encoded = compress ? deflateRawSync(payload) : Buffer.from(payload);
const output = encoded.toString('base64');
bufferSize = 0;
return OPEN + output + CLOSE;
}
return {
*push(chunk) {
let chunkBuffer = chunk;
while (bufferSize + chunkBuffer.byteLength >= maxChunkSize) {
const usedChunkBufferSize = maxChunkSize - bufferSize;
appendBuffer(chunkBuffer.subarray(0, usedChunkBufferSize));
yield flushBuffer();
chunkBuffer = chunkBuffer.subarray(usedChunkBufferSize);
}
appendBuffer(chunkBuffer);
},
*finish() {
if (bufferSize > 0) {
yield flushBuffer();
}
}
};
};