iterable.js 951 B

12345678910111213141516171819202122232425262728293031323334
  1. import {BINARY_ENCODINGS} from '../arguments/encoding-option.js';
  2. import {getFromStream} from '../arguments/fd-options.js';
  3. import {iterateOnSubprocessStream} from '../io/iterate.js';
  4. // Convert the subprocess to an async iterable
  5. export const createIterable = (subprocess, encoding, {
  6. from,
  7. binary: binaryOption = false,
  8. preserveNewlines = false,
  9. } = {}) => {
  10. const binary = binaryOption || BINARY_ENCODINGS.has(encoding);
  11. const subprocessStdout = getFromStream(subprocess, from);
  12. const onStdoutData = iterateOnSubprocessStream({
  13. subprocessStdout,
  14. subprocess,
  15. binary,
  16. shouldEncode: true,
  17. encoding,
  18. preserveNewlines,
  19. });
  20. return iterateOnStdoutData(onStdoutData, subprocessStdout, subprocess);
  21. };
  22. const iterateOnStdoutData = async function * (onStdoutData, subprocessStdout, subprocess) {
  23. try {
  24. yield * onStdoutData;
  25. } finally {
  26. if (subprocessStdout.readable) {
  27. subprocessStdout.destroy();
  28. }
  29. await subprocess;
  30. }
  31. };