()
| 1598 | } |
| 1599 | |
| 1600 | async function step() { |
| 1601 | if (shuttingDown) return true; |
| 1602 | |
| 1603 | if (dest[kState].backpressure) { |
| 1604 | await writerReadyPromise(writer).promise; |
| 1605 | if (shuttingDown) return true; |
| 1606 | } |
| 1607 | |
| 1608 | const controller = source[kState].controller; |
| 1609 | |
| 1610 | // Fast path: batch reads when data is buffered in a default controller. |
| 1611 | // This avoids creating PipeToReadableStreamReadRequest objects and |
| 1612 | // reduces promise allocation overhead. |
| 1613 | if (source[kState].state === 'readable' && |
| 1614 | isReadableStreamDefaultController(controller) && |
| 1615 | controller[kState].queue.length > 0) { |
| 1616 | |
| 1617 | while (controller[kState].queue.length > 0) { |
| 1618 | if (shuttingDown) return true; |
| 1619 | |
| 1620 | const chunk = dequeueValue(controller); |
| 1621 | |
| 1622 | if (controller[kState].closeRequested && !controller[kState].queue.length) { |
| 1623 | readableStreamDefaultControllerClearAlgorithms(controller); |
| 1624 | readableStreamClose(source); |
| 1625 | } |
| 1626 | |
| 1627 | // Write the chunk - we're already in a separate microtask from enqueue |
| 1628 | // because we awaited the writer ready promise above. |
| 1629 | state.currentWrite = writableStreamDefaultWriterWrite(writer, chunk); |
| 1630 | markPromiseAsHandled(state.currentWrite); |
| 1631 | |
| 1632 | // Check backpressure after each write |
| 1633 | if (dest[kState].backpressure) { |
| 1634 | // Backpressure - stop batch and wait for ready |
| 1635 | break; |
| 1636 | } else if (dest[kState].state !== 'writable' || writableStreamCloseQueuedOrInFlight(dest)) { |
| 1637 | // Closing or erroring - stop batch and wait for shutdown |
| 1638 | break; |
| 1639 | } |
| 1640 | } |
| 1641 | |
| 1642 | // Trigger pull if needed after batch |
| 1643 | readableStreamDefaultControllerCallPullIfNeeded(controller); |
| 1644 | |
| 1645 | // Check if stream closed during batch |
| 1646 | if (source[kState].state === 'closed') { |
| 1647 | return true; |
| 1648 | } |
| 1649 | |
| 1650 | // Yield to microtask queue between batches to allow events/signals to fire |
| 1651 | return false; |
| 1652 | } |
| 1653 | |
| 1654 | // Slow path: use read request for async reads |
| 1655 | const promise = PromiseWithResolvers(); |
| 1656 | // eslint-disable-next-line no-use-before-define |
| 1657 | readableStreamDefaultReaderRead(reader, new PipeToReadableStreamReadRequest(writer, state, promise)); |
no test coverage detected
searching dependent graphs…