diff options
author | Kitson Kelly <me@kitsonkelly.com> | 2020-04-23 00:06:51 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-22 10:06:51 -0400 |
commit | 8bcfc03d71cbd2cfd7ab68035ec0968d9f93b5b8 (patch) | |
tree | e1769ca51d2afde57ae18eb25b7a91388fcbf00a /cli/js/web/streams/readable_stream_async_iterator.ts | |
parent | b270d6c8d090669601465f8c9c94512d6c6a07d4 (diff) |
Rewrite streams (#4842)
Diffstat (limited to 'cli/js/web/streams/readable_stream_async_iterator.ts')
-rw-r--r-- | cli/js/web/streams/readable_stream_async_iterator.ts | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/cli/js/web/streams/readable_stream_async_iterator.ts b/cli/js/web/streams/readable_stream_async_iterator.ts new file mode 100644 index 000000000..cd656e73d --- /dev/null +++ b/cli/js/web/streams/readable_stream_async_iterator.ts @@ -0,0 +1,81 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. + +import * as sym from "./symbols.ts"; +import { + isReadableStreamAsyncIterator, + ReadableStreamAsyncIterator, + readableStreamCreateReadResult, + readableStreamReaderGenericCancel, + readableStreamReaderGenericRelease, + readableStreamDefaultReaderRead, +} from "./internals.ts"; +import { assert } from "../../util.ts"; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const AsyncIteratorPrototype: AsyncIterableIterator<any> = Object.getPrototypeOf( + Object.getPrototypeOf(async function* () {}).prototype +); + +export const ReadableStreamAsyncIteratorPrototype: ReadableStreamAsyncIterator = Object.setPrototypeOf( + { + next( + this: ReadableStreamAsyncIterator + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ): Promise<ReadableStreamReadResult<any>> { + if (!isReadableStreamAsyncIterator(this)) { + return Promise.reject( + new TypeError("invalid ReadableStreamAsyncIterator.") + ); + } + const reader = this[sym.asyncIteratorReader]; + if (!reader[sym.ownerReadableStream]) { + return Promise.reject( + new TypeError("reader owner ReadableStream is undefined.") + ); + } + return readableStreamDefaultReaderRead(reader).then((result) => { + assert(typeof result === "object"); + const { done } = result; + assert(typeof done === "boolean"); + if (done) { + readableStreamReaderGenericRelease(reader); + } + const { value } = result; + return readableStreamCreateReadResult(value, done, true); + }); + }, + return( + this: ReadableStreamAsyncIterator, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + value?: any | PromiseLike<any> + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ): Promise<ReadableStreamReadResult<any>> { + if (!isReadableStreamAsyncIterator(this)) { + return Promise.reject( + new TypeError("invalid ReadableStreamAsyncIterator.") + ); + } + const reader = this[sym.asyncIteratorReader]; + if (!reader[sym.ownerReadableStream]) { + return Promise.reject( + new TypeError("reader owner ReadableStream is undefined.") + ); + } + if (reader[sym.readRequests].length) { + return Promise.reject( + new TypeError("reader has outstanding read requests.") + ); + } + if (!this[sym.preventCancel]) { + const result = readableStreamReaderGenericCancel(reader, value); + readableStreamReaderGenericRelease(reader); + return result.then(() => + readableStreamCreateReadResult(value, true, true) + ); + } + readableStreamReaderGenericRelease(reader); + return Promise.resolve(readableStreamCreateReadResult(value, true, true)); + }, + }, + AsyncIteratorPrototype +); |