@@ -14,7 +14,6 @@ const { |
14 | 14 | ObjectCreate, |
15 | 15 | ObjectDefineProperties, |
16 | 16 | ObjectSetPrototypeOf, |
17 | | - Promise, |
18 | 17 | PromisePrototypeThen, |
19 | 18 | PromiseResolve, |
20 | 19 | PromiseReject, |
@@ -1354,7 +1353,9 @@ function readableStreamPipeTo( |
1354 | 1353 |
|
1355 | 1354 | const promise = createDeferredPromise(); |
1356 | 1355 |
|
1357 | | - let currentWrite = PromiseResolve(); |
| 1356 | + const state = { |
| 1357 | + currentWrite: PromiseResolve(), |
| 1358 | + }; |
1358 | 1359 |
|
1359 | 1360 | // The error here can be undefined. The rejected arg |
1360 | 1361 | // tells us that the promise must be rejected even |
@@ -1371,9 +1372,9 @@ function readableStreamPipeTo( |
1371 | 1372 | } |
1372 | 1373 |
|
1373 | 1374 | async function waitForCurrentWrite() { |
1374 | | - const write = currentWrite; |
| 1375 | + const write = state.currentWrite; |
1375 | 1376 | await write; |
1376 | | - if (write !== currentWrite) |
| 1377 | + if (write !== state.currentWrite) |
1377 | 1378 | await waitForCurrentWrite(); |
1378 | 1379 | } |
1379 | 1380 |
|
@@ -1464,20 +1465,14 @@ function readableStreamPipeTo( |
1464 | 1465 | async function step() { |
1465 | 1466 | if (shuttingDown) |
1466 | 1467 | return true; |
| 1468 | + |
1467 | 1469 | await writer[kState].ready.promise; |
1468 | | - return new Promise((resolve, reject) => { |
1469 | | - readableStreamDefaultReaderRead( |
1470 | | - reader, |
1471 | | - { |
1472 | | - [kChunk](chunk) { |
1473 | | - currentWrite = writableStreamDefaultWriterWrite(writer, chunk); |
1474 | | - setPromiseHandled(currentWrite); |
1475 | | - resolve(false); |
1476 | | - }, |
1477 | | - [kClose]: () => resolve(true), |
1478 | | - [kError]: reject, |
1479 | | - }); |
1480 | | - }); |
| 1470 | + |
| 1471 | + const promise = createDeferredPromise(); |
| 1472 | + // eslint-disable-next-line no-use-before-define |
| 1473 | + readableStreamDefaultReaderRead(reader, new PipeToReadableStreamReadRequest(writer, state, promise)); |
| 1474 | + |
| 1475 | + return promise.promise; |
1481 | 1476 | } |
1482 | 1477 |
|
1483 | 1478 | async function run() { |
@@ -1539,6 +1534,28 @@ function readableStreamPipeTo( |
1539 | 1534 | return promise.promise; |
1540 | 1535 | } |
1541 | 1536 |
|
| 1537 | +class PipeToReadableStreamReadRequest { |
| 1538 | + constructor(writer, state, promise) { |
| 1539 | + this.writer = writer; |
| 1540 | + this.state = state; |
| 1541 | + this.promise = promise; |
| 1542 | + } |
| 1543 | + |
| 1544 | + [kChunk](chunk) { |
| 1545 | + this.state.currentWrite = writableStreamDefaultWriterWrite(this.writer, chunk); |
| 1546 | + setPromiseHandled(this.state.currentWrite); |
| 1547 | + this.promise.resolve(false); |
| 1548 | + } |
| 1549 | + |
| 1550 | + [kClose]() { |
| 1551 | + this.promise.resolve(true); |
| 1552 | + } |
| 1553 | + |
| 1554 | + [kError](error) { |
| 1555 | + this.promise.reject(error); |
| 1556 | + } |
| 1557 | +} |
| 1558 | + |
1542 | 1559 | function readableStreamTee(stream, cloneForBranch2) { |
1543 | 1560 | if (isReadableByteStreamController(stream[kState].controller)) { |
1544 | 1561 | return readableByteStreamTee(stream); |
|