readable-stream-async-iterator-polyfill.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // @ts-nocheck
  2. /**
  3. * A polyfill for `ReadableStream.protototype[Symbol.asyncIterator]`,
  4. * aligning as closely as possible to the specification.
  5. *
  6. * from https://gist.github.com/MattiasBuelens/496fc1d37adb50a733edd43853f2f60e
  7. *
  8. * @see https://streams.spec.whatwg.org/#rs-asynciterator
  9. * @see https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream#async_iteration
  10. */
  11. ReadableStream.prototype.values ??= function ({ preventCancel = false } = {}) {
  12. const reader = this.getReader()
  13. return {
  14. async next() {
  15. try {
  16. const result = await reader.read()
  17. if (result.done) {
  18. reader.releaseLock()
  19. }
  20. return result
  21. } catch (e) {
  22. reader.releaseLock()
  23. throw e
  24. }
  25. },
  26. async return(value) {
  27. if (!preventCancel) {
  28. const cancelPromise = reader.cancel(value)
  29. reader.releaseLock()
  30. await cancelPromise
  31. } else {
  32. reader.releaseLock()
  33. }
  34. return { done: true, value }
  35. },
  36. [Symbol.asyncIterator]() {
  37. return this
  38. },
  39. }
  40. }
  41. ReadableStream.prototype[Symbol.asyncIterator] ??=
  42. ReadableStream.prototype.values