Get your own Node server
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}`);
});

              
WriteStream is ready with highWaterMark = 1024 bytes
Writing chunks...
Wrote 10 chunks so far
Wrote 20 chunks so far
Backpressure hit after 22 chunks. Waiting for drain...
Drain event #1 occurred. Resuming writes...
Writing chunks...
Wrote 30 chunks so far
Wrote 40 chunks so far
Backpressure hit after 44 chunks. Waiting for drain...
Drain event #2 occurred. Resuming writes...
Writing chunks...
Wrote 50 chunks so far
Wrote 60 chunks so far
Backpressure hit after 66 chunks. Waiting for drain...
Drain event #3 occurred. Resuming writes...
Writing chunks...
Wrote 70 chunks so far
Wrote 80 chunks so far
Backpressure hit after 88 chunks. Waiting for drain...
Drain event #4 occurred. Resuming writes...
Writing chunks...
Wrote 90 chunks so far
Wrote 100 chunks so far
Ended the WriteStream after writing all chunks

Sample of written data:
----------------------------------------
Chunk 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
...
Chunk 99: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

All chunks have been written.

----------------------------------------

Write operation completed
Total chunks written: 100
Total drain events: 4
Total bytes written: 25800
Sample file removed