1// META: global=worker 2 3'use strict'; 4 5const classes = [ 6 { 7 constructor: TextDecoderStream, 8 input: new Uint8Array([65]) 9 }, 10 { 11 constructor: TextEncoderStream, 12 input: 'A' 13 } 14]; 15 16const microtasksRun = () => new Promise(resolve => step_timeout(resolve, 0)); 17 18for (const streamClass of classes) { 19 promise_test(async () => { 20 const stream = new streamClass.constructor(); 21 const writer = stream.writable.getWriter(); 22 const reader = stream.readable.getReader(); 23 const events = []; 24 await microtasksRun(); 25 const writePromise = writer.write(streamClass.input); 26 writePromise.then(() => events.push('write')); 27 await microtasksRun(); 28 events.push('paused'); 29 await reader.read(); 30 events.push('read'); 31 await writePromise; 32 assert_array_equals(events, ['paused', 'read', 'write'], 33 'write should happen after read'); 34 }, 'write() should not complete until read relieves backpressure for ' + 35 `${streamClass.constructor.name}`); 36 37 promise_test(async () => { 38 const stream = new streamClass.constructor(); 39 const writer = stream.writable.getWriter(); 40 const reader = stream.readable.getReader(); 41 const events = []; 42 await microtasksRun(); 43 const readPromise1 = reader.read(); 44 readPromise1.then(() => events.push('read1')); 45 const writePromise1 = writer.write(streamClass.input); 46 const writePromise2 = writer.write(streamClass.input); 47 writePromise1.then(() => events.push('write1')); 48 writePromise2.then(() => events.push('write2')); 49 await microtasksRun(); 50 events.push('paused'); 51 const readPromise2 = reader.read(); 52 readPromise2.then(() => events.push('read2')); 53 await Promise.all([writePromise1, writePromise2, 54 readPromise1, readPromise2]); 55 assert_array_equals(events, ['read1', 'write1', 'paused', 'read2', 56 'write2'], 57 'writes should not happen before read2'); 58 }, 'additional writes should wait for backpressure to be relieved for ' + 59 `class ${streamClass.constructor.name}`); 60} 61