%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
'use strict'; const common = require('../common'); const stream = require('stream'); const assert = require('assert'); // A consumer stream with a very low highWaterMark, which starts in a state // where it buffers the chunk it receives rather than indicating that they // have been consumed. const writable = new stream.Writable({ highWaterMark: 5 }); let isCurrentlyBufferingWrites = true; const queue = []; writable._write = (chunk, encoding, cb) => { if (isCurrentlyBufferingWrites) queue.push({ chunk, cb }); else cb(); }; const readable = new stream.Readable({ read() {} }); readable.pipe(writable); readable.once('pause', common.mustCall(() => { assert.strictEqual( readable._readableState.awaitDrainWriters, writable, 'Expected awaitDrainWriters to be a Writable but instead got ' + `${readable._readableState.awaitDrainWriters}` ); // First pause, resume manually. The next write() to writable will still // return false, because chunks are still being buffered, so it will increase // the awaitDrain counter again. process.nextTick(common.mustCall(() => { readable.resume(); })); readable.once('pause', common.mustCall(() => { assert.strictEqual( readable._readableState.awaitDrainWriters, writable, '.resume() should not reset the awaitDrainWriters, but instead got ' + `${readable._readableState.awaitDrainWriters}` ); // Second pause, handle all chunks from now on. Once all callbacks that // are currently queued up are handled, the awaitDrain drain counter should // fall back to 0 and all chunks that are pending on the readable side // should be flushed. isCurrentlyBufferingWrites = false; for (const queued of queue) queued.cb(); })); })); readable.push(Buffer.alloc(100)); // Fill the writable HWM, first 'pause'. readable.push(Buffer.alloc(100)); // Second 'pause'. readable.push(Buffer.alloc(100)); // Should get through to the writable. readable.push(null); writable.on('finish', common.mustCall(() => { assert.strictEqual( readable._readableState.awaitDrainWriters, null, `awaitDrainWriters should be reset to null after all chunks are written but instead got ${readable._readableState.awaitDrainWriters}` ); // Everything okay, all chunks were written. }));