diff options
author | Luca Casonato <hello@lcas.dev> | 2024-11-15 15:54:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-15 15:54:28 +0100 |
commit | b8cf2599242a9d85d03b57d3649ccdf8bce1530e (patch) | |
tree | 87a6288f2174aa6d22730a9ec020292b778c9dca /ext/fetch | |
parent | 3f26310728ef2d56ace7370a555eb9a862295983 (diff) |
feat(fetch): accept async iterables for body (#26882)
Reland of #24623, but with a fix for `String` objects.
Co-authored-by: crowlkats <crowlkats@toaxl.com>
Diffstat (limited to 'ext/fetch')
-rw-r--r-- | ext/fetch/22_body.js | 14 | ||||
-rw-r--r-- | ext/fetch/lib.deno_fetch.d.ts | 2 |
2 files changed, 16 insertions, 0 deletions
diff --git a/ext/fetch/22_body.js b/ext/fetch/22_body.js index 61a06b4af..c7e977c0b 100644 --- a/ext/fetch/22_body.js +++ b/ext/fetch/22_body.js @@ -15,6 +15,7 @@ import { core, primordials } from "ext:core/mod.js"; const { isAnyArrayBuffer, isArrayBuffer, + isStringObject, } = core; const { ArrayBufferIsView, @@ -466,6 +467,8 @@ function extractBody(object) { if (object.locked || isReadableStreamDisturbed(object)) { throw new TypeError("ReadableStream is locked or disturbed"); } + } else if (object[webidl.AsyncIterable] === webidl.AsyncIterable) { + stream = ReadableStream.from(object.open()); } if (typeof source === "string") { // WARNING: this deviates from spec (expects length to be set) @@ -483,6 +486,9 @@ function extractBody(object) { return { body, contentType }; } +webidl.converters["async iterable<Uint8Array>"] = webidl + .createAsyncIterableConverter(webidl.converters.Uint8Array); + webidl.converters["BodyInit_DOMString"] = (V, prefix, context, opts) => { // Union for (ReadableStream or Blob or ArrayBufferView or ArrayBuffer or FormData or URLSearchParams or USVString) if (ObjectPrototypeIsPrototypeOf(ReadableStreamPrototype, V)) { @@ -501,6 +507,14 @@ webidl.converters["BodyInit_DOMString"] = (V, prefix, context, opts) => { if (ArrayBufferIsView(V)) { return webidl.converters["ArrayBufferView"](V, prefix, context, opts); } + if (webidl.isAsyncIterable(V) && !isStringObject(V)) { + return webidl.converters["async iterable<Uint8Array>"]( + V, + prefix, + context, + opts, + ); + } } // BodyInit conversion is passed to extractBody(), which calls core.encode(). // core.encode() will UTF-8 encode strings with replacement, being equivalent to the USV normalization. diff --git a/ext/fetch/lib.deno_fetch.d.ts b/ext/fetch/lib.deno_fetch.d.ts index d219a3859..8614dec89 100644 --- a/ext/fetch/lib.deno_fetch.d.ts +++ b/ext/fetch/lib.deno_fetch.d.ts @@ -163,6 +163,8 @@ type BodyInit = | FormData | URLSearchParams | ReadableStream<Uint8Array> + | Iterable<Uint8Array> + | AsyncIterable<Uint8Array> | string; /** @category Fetch */ type RequestDestination = |