const fs = require('fs');
const path = require('path');
// Define the output file path
const backpressureFile = path.join(__dirname, 'backpressure-example.txt');
// Create a WriteStream with a small highWaterMark to demonstrate backpressure
const writeStream = fs.createWriteStream(backpressureFile, {
highWaterMark: 1024 // 1KB buffer (small to demonstrate backpressure)
});
// Counter for how many chunks we've written
let chunksWritten = 0;
let drainEvents = 0;
// Function to write data until backpressure occurs
function writeChunks() {
console.log('Writing chunks...');
// Create a large chunk of data
const chunk = 'a'.repeat(256); // 256 bytes per chunk
// Try to write many chunks
let canContinue = true;
while (canContinue && chunksWritten < 100) {
// Attempt to write the chunk
canContinue = writeStream.write(`Chunk ${chunksWritten}: ${chunk}\n`);
chunksWritten++;
if (chunksWritten % 10 === 0) {
console.log(`Wrote ${chunksWritten} chunks so far`);
}
// If canContinue is false, we hit backpressure
if (!canContinue) {
console.log(`Backpressure hit after ${chunksWritten} chunks. Waiting for drain...`);
// Wait for the drain event before continuing
writeStream.once('drain', () => {
drainEvents++;
console.log(`Drain event #${drainEvents} occurred. Resuming writes...`);
writeChunks(); // Continue writing
});
}
}
// If we've written all chunks, end the stream
if (chunksWritten >= 100) {
writeStream.end('\nAll chunks have been written.\n', () => {
console.log('Ended the WriteStream after writing all chunks');
// Read back the file to show it was written correctly
fs.readFile(backpressureFile, 'utf8', (err, data) => {
if (err) {
console.error(`Error reading file: ${err.message}`);
return;
}
console.log('\nSample of written data:');
console.log('-'.repeat(40));
console.log(data.substring(0, 200) + '...'); // Show first 200 chars
console.log('...');
console.log(data.substring(data.length - 100)); // Show last 100 chars
console.log('-'.repeat(40));
});
});
}
}
// Start writing chunks when the stream is ready
writeStream.on('ready', () => {
console.log('WriteStream is ready with highWaterMark =',
writeStream.writableHighWaterMark, 'bytes');
// Start writing chunks
writeChunks();
});
// Handle finish event
writeStream.on('finish', () => {
console.log('\nWrite operation completed');
console.log(`Total chunks written: ${chunksWritten}`);
console.log(`Total drain events: ${drainEvents}`);
console.log(`Total bytes written: ${writeStream.bytesWritten}`);
// Clean up the sample file
fs.unlink(backpressureFile, (err) => {
if (err) {
console.error(`Error removing file: ${err.message}`);
return;
}
console.log('Sample file removed');
});
});
// Handle errors
writeStream.on('error', (err) => {
console.error(`Error: ${err.message}`);
});