openreplay/utilities/utils/HeapSnapshot.js
2022-04-13 17:11:23 +02:00

66 lines
No EOL
1.9 KiB
JavaScript

const fs = require('fs');
const v8 = require('v8');
const express = require('express');
const router = express.Router();
const location = '/tmp/';
let creationStatus = null;
let fileName = null;
async function createHeapSnapshot() {
if (creationStatus) {
return console.log(`In progress ${fileName}`);
}
if (fileName === null) {
fileName = `${Date.now()}.heapsnapshot`;
}
console.log(`Creating ${fileName}`);
await fs.promises.writeFile(
location + fileName,
v8.getHeapSnapshot()
);
console.log(`Created ${fileName}`);
creationStatus = true;
}
async function downloadHeapSnapshot(req, res) {
if (creationStatus === null) {
return res.end("should call /new first");
} else if (!creationStatus) {
return res.end("should wait for done status");
}
res.download(location + fileName, function (err) {
if (err) {
return console.error("error while uploading HeapSnapshot file");
}
try {
fs.unlinkSync(location + fileName)
} catch (err) {
console.error("error while deleting heapsnapshot file");
console.error(err);
}
});
}
function getHeapSnapshotStatus(req, res) {
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({path: location + fileName, 'done': creationStatus}));
}
function createNewHeapSnapshot(req, res) {
creationStatus = false;
fileName = `${Date.now()}.heapsnapshot`;
setTimeout(() => {
createHeapSnapshot()
}, 0);
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({path: location + fileName, 'done': creationStatus}));
}
router.get(`/status`, getHeapSnapshotStatus);
router.get(`/new`, createNewHeapSnapshot);
router.get(`/download`, downloadHeapSnapshot);
module.exports = {router}