* @param {AbortCallback} abort * @param {Iterable} body * @param {import('./client.js')} client * @param {import('../core/request.js')} request * @param {import('net').Socket} socket * @param {number} contentLength * @param {string} header * @param {boolean} expectsPayload * @returns {Promis
(abort, body, client, request, socket, contentLength, header, expectsPayload)
| 1552 | * @returns {Promise<void>} |
| 1553 | */ |
| 1554 | async function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) { |
| 1555 | assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined') |
| 1556 | |
| 1557 | let callback = null |
| 1558 | function onDrain () { |
| 1559 | if (callback) { |
| 1560 | const cb = callback |
| 1561 | callback = null |
| 1562 | cb() |
| 1563 | } |
| 1564 | } |
| 1565 | |
| 1566 | const waitForDrain = () => new Promise((resolve, reject) => { |
| 1567 | assert(callback === null) |
| 1568 | |
| 1569 | if (socket[kError]) { |
| 1570 | reject(socket[kError]) |
| 1571 | } else { |
| 1572 | callback = resolve |
| 1573 | } |
| 1574 | }) |
| 1575 | |
| 1576 | socket |
| 1577 | .on('close', onDrain) |
| 1578 | .on('drain', onDrain) |
| 1579 | |
| 1580 | const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }) |
| 1581 | try { |
| 1582 | // It's up to the user to somehow abort the async iterable. |
| 1583 | for await (const chunk of body) { |
| 1584 | if (socket[kError]) { |
| 1585 | throw socket[kError] |
| 1586 | } |
| 1587 | |
| 1588 | if (!writer.write(chunk)) { |
| 1589 | await waitForDrain() |
| 1590 | } |
| 1591 | } |
| 1592 | |
| 1593 | writer.end() |
| 1594 | } catch (err) { |
| 1595 | writer.destroy(err) |
| 1596 | } finally { |
| 1597 | socket |
| 1598 | .off('close', onDrain) |
| 1599 | .off('drain', onDrain) |
| 1600 | } |
| 1601 | } |
| 1602 | |
| 1603 | class AsyncWriter { |
| 1604 | /** |