stream-utils.mjs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435
  1. /**
  2. * Most browsers don't yet have async iterable support for ReadableStream,
  3. * and Node has a very different way of reading bytes from its "ReadableStream".
  4. *
  5. * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490
  6. */
  7. export function ReadableStreamToAsyncIterable(stream) {
  8. if (stream[Symbol.asyncIterator])
  9. return stream;
  10. const reader = stream.getReader();
  11. return {
  12. async next() {
  13. try {
  14. const result = await reader.read();
  15. if (result?.done)
  16. reader.releaseLock(); // release lock when stream becomes closed
  17. return result;
  18. }
  19. catch (e) {
  20. reader.releaseLock(); // release lock when stream becomes errored
  21. throw e;
  22. }
  23. },
  24. async return() {
  25. const cancelPromise = reader.cancel();
  26. reader.releaseLock();
  27. await cancelPromise;
  28. return { done: true, value: undefined };
  29. },
  30. [Symbol.asyncIterator]() {
  31. return this;
  32. },
  33. };
  34. }
  35. //# sourceMappingURL=stream-utils.mjs.map