mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00

Co-authored-by: Luigi Pinca <luigipinca@gmail.com> PR-URL: https://github.com/nodejs/node/pull/58948 Fixes: https://github.com/nodejs/node/issues/58949 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Mattias Buelens <mattias@buelens.com> Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Zeyu "Alex" Yang <himself65@outlook.com> Reviewed-By: Daeyeon Jeong <daeyeon.dev@gmail.com>
64 lines
1.6 KiB
JavaScript
64 lines
1.6 KiB
JavaScript
import { mustCall } from '../common/index.mjs';
|
|
import { Readable } from 'node:stream';
|
|
import { memoryUsage } from 'node:process';
|
|
import assert from 'node:assert';
|
|
import { setImmediate } from 'node:timers/promises';
|
|
|
|
// Based on: https://github.com/nodejs/node/issues/46347#issuecomment-1413886707
|
|
// edit: make it cross-platform as /dev/urandom is not available on Windows
|
|
|
|
const MAX_MEM = 256 * 1024 * 1024; // 256 MiB
|
|
|
|
function checkMemoryUsage() {
|
|
assert(memoryUsage().arrayBuffers < MAX_MEM);
|
|
}
|
|
|
|
const MAX_BUFFERS = 1000;
|
|
let buffersCreated = 0;
|
|
|
|
const randomNodeStream = new Readable({
|
|
read(size) {
|
|
if (buffersCreated >= MAX_BUFFERS) {
|
|
this.push(null);
|
|
return;
|
|
}
|
|
|
|
this.push(Buffer.alloc(size));
|
|
buffersCreated++;
|
|
}
|
|
});
|
|
|
|
randomNodeStream.on('error', (err) => {
|
|
assert.fail(err);
|
|
});
|
|
|
|
// Before doing anything, make sure memory usage is okay
|
|
checkMemoryUsage();
|
|
|
|
// Create stream and check memory usage remains okay
|
|
|
|
const randomWebStream = Readable.toWeb(randomNodeStream);
|
|
|
|
checkMemoryUsage();
|
|
|
|
let timeout;
|
|
try {
|
|
// Wait two seconds before consuming the stream to see if memory usage increases
|
|
timeout = setTimeout(mustCall(async () => {
|
|
// Did the stream leak memory?
|
|
checkMemoryUsage();
|
|
// eslint-disable-next-line no-unused-vars
|
|
for await (const _ of randomWebStream) {
|
|
// Yield event loop to allow garbage collection
|
|
await setImmediate();
|
|
// consume the stream
|
|
// check memory usage remains okay
|
|
checkMemoryUsage();
|
|
}
|
|
}), 2000);
|
|
} catch (err) {
|
|
if (timeout) {
|
|
clearTimeout(timeout);
|
|
}
|
|
assert.fail(err);
|
|
}
|