193fb6ee3Sopenharmony_ciimport { readFile } from 'node:fs/promises';
293fb6ee3Sopenharmony_ciimport format from 'human-format';
393fb6ee3Sopenharmony_ciimport memwatch from '@airbnb/node-memwatch';
493fb6ee3Sopenharmony_ciimport { SAXParser } from '../../packages/parse5-sax-parser/dist/index.js';
593fb6ee3Sopenharmony_ciimport { finished } from 'parse5-test-utils/dist/common.js';
693fb6ee3Sopenharmony_ci
793fb6ee3Sopenharmony_ciconst heapDiffMeasurement = new memwatch.HeapDiff();
893fb6ee3Sopenharmony_ci
993fb6ee3Sopenharmony_cilet maxMemUsage = 0;
1093fb6ee3Sopenharmony_ci
1193fb6ee3Sopenharmony_cimemwatch.on('stats', (stats) => {
1293fb6ee3Sopenharmony_ci    maxMemUsage = Math.max(maxMemUsage, stats.used_heap_size);
1393fb6ee3Sopenharmony_ci});
1493fb6ee3Sopenharmony_ci
1593fb6ee3Sopenharmony_ciconst statsPromise = new Promise((resolve) => memwatch.once('stats', resolve));
1693fb6ee3Sopenharmony_ci
1793fb6ee3Sopenharmony_ciconst startDate = new Date();
1893fb6ee3Sopenharmony_ci
1993fb6ee3Sopenharmony_ciconst parsedDataSize = await parse();
2093fb6ee3Sopenharmony_ciconst endDate = new Date();
2193fb6ee3Sopenharmony_ciconst heapDiff = heapDiffMeasurement.end();
2293fb6ee3Sopenharmony_ci
2393fb6ee3Sopenharmony_ci// NOTE: we need at least one `stats` result to get maxMemUsage
2493fb6ee3Sopenharmony_ciawait statsPromise;
2593fb6ee3Sopenharmony_ci
2693fb6ee3Sopenharmony_ciasync function parse() {
2793fb6ee3Sopenharmony_ci    const data = await readFile(new URL('../../test/data/huge-page/huge-page.html', import.meta.url), 'utf8');
2893fb6ee3Sopenharmony_ci    let parsedDataSize = 0;
2993fb6ee3Sopenharmony_ci    const stream = new SAXParser();
3093fb6ee3Sopenharmony_ci
3193fb6ee3Sopenharmony_ci    for (let i = 0; i < 200; i++) {
3293fb6ee3Sopenharmony_ci        parsedDataSize += data.length;
3393fb6ee3Sopenharmony_ci        stream.write(data);
3493fb6ee3Sopenharmony_ci    }
3593fb6ee3Sopenharmony_ci
3693fb6ee3Sopenharmony_ci    stream.end();
3793fb6ee3Sopenharmony_ci
3893fb6ee3Sopenharmony_ci    await finished(stream);
3993fb6ee3Sopenharmony_ci
4093fb6ee3Sopenharmony_ci    return parsedDataSize;
4193fb6ee3Sopenharmony_ci}
4293fb6ee3Sopenharmony_ci
4393fb6ee3Sopenharmony_ciconsole.log('Input data size:', format(parsedDataSize, { unit: 'B' }));
4493fb6ee3Sopenharmony_ci
4593fb6ee3Sopenharmony_ciconst scale = new format.Scale({
4693fb6ee3Sopenharmony_ci    seconds: 1,
4793fb6ee3Sopenharmony_ci    minutes: 60,
4893fb6ee3Sopenharmony_ci    hours: 3600,
4993fb6ee3Sopenharmony_ci});
5093fb6ee3Sopenharmony_ci
5193fb6ee3Sopenharmony_ciconsole.log('Duration:', format((endDate - startDate) / 1000, { scale }));
5293fb6ee3Sopenharmony_ciconsole.log('Memory before:', heapDiff.before.size);
5393fb6ee3Sopenharmony_ciconsole.log('Memory after:', heapDiff.after.size);
5493fb6ee3Sopenharmony_ciconsole.log('Memory max:', format(maxMemUsage, { unit: 'B' }));
55