123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.profiler = void 0;
- const fs = require("fs");
- const ora = require("ora");
- const readline = require("readline");
- const tmp = require("tmp");
- const abort_controller_1 = require("abort-controller");
- const apiv2_1 = require("./apiv2");
- const api_1 = require("./database/api");
- const logger_1 = require("./logger");
- const profileReport_1 = require("./profileReport");
- const responseToError_1 = require("./responseToError");
- const utils = require("./utils");
- tmp.setGracefulCleanup();
- async function profiler(options) {
- const origin = (0, api_1.realtimeOriginOrEmulatorOrCustomUrl)(options.instanceDetails.databaseUrl);
- const url = new URL(utils.getDatabaseUrl(origin, options.instance, "/.settings/profile.json?"));
- const rl = readline.createInterface({ input: process.stdin });
- const fileOut = !!options.output;
- const tmpFile = tmp.tmpNameSync();
- const tmpStream = fs.createWriteStream(tmpFile);
- const outStream = fileOut ? fs.createWriteStream(options.output) : process.stdout;
- const spinner = ora({
- text: "0 operations recorded. Press [enter] to stop",
- color: "yellow",
- });
- const outputFormat = options.raw ? "RAW" : options.parent.json ? "JSON" : "TXT";
- const controller = new abort_controller_1.default();
- const generateReport = () => {
- rl.close();
- spinner.stop();
- controller.abort();
- const dataFile = options.input || tmpFile;
- const reportOptions = {
- format: outputFormat,
- isFile: fileOut,
- isInput: !!options.input,
- collapse: options.collapse,
- };
- const report = new profileReport_1.ProfileReport(dataFile, outStream, reportOptions);
- return report.generate();
- };
- if (options.input) {
- return generateReport();
- }
- const c = new apiv2_1.Client({ urlPrefix: url.origin, auth: true });
- const res = await c.request({
- method: "GET",
- path: url.pathname,
- responseType: "stream",
- resolveOnHTTPError: true,
- headers: {
- Accept: "text/event-stream",
- },
- signal: controller.signal,
- });
- if (res.response.status >= 400) {
- throw (0, responseToError_1.responseToError)(res.response, await res.response.text());
- }
- if (!options.duration) {
- spinner.start();
- }
- let counter = 0;
- res.body.on("data", (chunk) => {
- if (chunk.toString().includes("event: log")) {
- counter++;
- spinner.text = `${counter} operations recorded. Press [enter] to stop`;
- }
- });
- res.body.on("end", () => {
- spinner.text = counter + " operations recorded.\n";
- });
- let resError;
- res.body.on("error", (e) => {
- if (e.type !== "aborted") {
- resError = e;
- logger_1.logger.error("Unexpected error from response stream:", e);
- }
- });
- const p = new Promise((resolve, reject) => {
- const fn = () => {
- controller.abort();
- if (resError) {
- return reject(resError);
- }
- resolve(generateReport());
- };
- if (options.duration) {
- setTimeout(fn, options.duration * 1000);
- }
- else {
- rl.question("", fn);
- }
- });
- res.body.pipe(tmpStream);
- return p;
- }
- exports.profiler = profiler;
|