From 34e708cded6bac99f157b7923dd233b71fdf338e Mon Sep 17 00:00:00 2001 From: "Node.js GitHub Bot" Date: Wed, 30 Nov 2022 06:43:47 -0500 Subject: [PATCH] deps: update undici to 5.13.0 PR-URL: https://github.com/nodejs/node/pull/45634 Reviewed-By: Yagiz Nizipli Reviewed-By: Rich Trott Reviewed-By: Matteo Collina Reviewed-By: James M Snell Reviewed-By: Robert Nagy --- deps/undici/src/README.md | 12 +- .../src/docs/assets/lifecycle-diagram.png | Bin 76418 -> 47090 bytes deps/undici/src/index.d.ts | 46 +- deps/undici/src/lib/fetch/body.js | 38 +- deps/undici/src/lib/fetch/constants.js | 20 +- deps/undici/src/lib/fetch/dataURL.js | 75 +- deps/undici/src/lib/fetch/file.js | 56 +- deps/undici/src/lib/fetch/formdata.js | 97 +- deps/undici/src/lib/fetch/headers.js | 115 +-- deps/undici/src/lib/fetch/index.js | 48 +- deps/undici/src/lib/fetch/request.js | 146 +-- deps/undici/src/lib/fetch/response.js | 78 +- deps/undici/src/lib/fetch/util.js | 84 +- deps/undici/src/lib/fetch/webidl.js | 92 +- deps/undici/src/lib/fileapi/filereader.js | 100 +- deps/undici/src/lib/fileapi/progressevent.js | 12 +- deps/undici/src/lib/mock/mock-utils.js | 26 +- deps/undici/src/package.json | 8 +- deps/undici/src/types/agent.d.ts | 9 +- deps/undici/src/types/api.d.ts | 2 +- deps/undici/src/types/balanced-pool.d.ts | 7 +- deps/undici/src/types/client.d.ts | 10 +- deps/undici/src/types/connector.d.ts | 6 +- .../undici/src/types/diagnostics-channel.d.ts | 8 +- deps/undici/src/types/dispatcher.d.ts | 46 +- deps/undici/src/types/errors.d.ts | 6 +- deps/undici/src/types/fetch.d.ts | 2 +- deps/undici/src/types/filereader.d.ts | 11 +- deps/undici/src/types/global-dispatcher.d.ts | 2 +- deps/undici/src/types/interceptors.d.ts | 4 +- deps/undici/src/types/mock-agent.d.ts | 6 +- deps/undici/src/types/mock-client.d.ts | 8 +- deps/undici/src/types/mock-errors.d.ts | 6 +- deps/undici/src/types/mock-interceptor.d.ts | 2 +- deps/undici/src/types/mock-pool.d.ts | 8 +- deps/undici/src/types/patch.d.ts | 51 + deps/undici/src/types/pool-stats.d.ts | 4 +- deps/undici/src/types/pool.d.ts | 11 +- deps/undici/src/types/proxy-agent.d.ts | 6 +- deps/undici/src/types/readable.d.ts | 2 +- deps/undici/src/types/webidl.d.ts | 213 ++++ deps/undici/undici.js | 938 +++++++----------- 42 files changed, 1080 insertions(+), 1341 deletions(-) create mode 100644 deps/undici/src/types/patch.d.ts create mode 100644 deps/undici/src/types/webidl.d.ts diff --git a/deps/undici/src/README.md b/deps/undici/src/README.md index 475a9c1ba45397..bd991008a90e6d 100644 --- a/deps/undici/src/README.md +++ b/deps/undici/src/README.md @@ -178,10 +178,6 @@ Implements [fetch](https://fetch.spec.whatwg.org/#fetch-method). Only supported on Node 16.8+. -This is [experimental](https://nodejs.org/api/documentation.html#documentation_stability_index) and is not yet fully compliant with the Fetch Standard. -We plan to ship breaking changes to this feature until it is out of experimental. -Help us improve the test coverage by following instructions at [nodejs/undici/#951](https://github.com/nodejs/undici/issues/951). - Basic usage example: ```js @@ -234,9 +230,15 @@ const data = { }, } -await fetch('https://example.com', { body: data, method: 'POST' }) +await fetch('https://example.com', { body: data, method: 'POST', duplex: 'half' }) ``` +#### `request.duplex` + +- half + +In this implementation of fetch, `request.duplex` must be set if `request.body` is `ReadableStream` or `Async Iterables`. And fetch requests are currently always be full duplex. More detail refer to [Fetch Standard.](https://fetch.spec.whatwg.org/#dom-requestinit-duplex) + #### `response.body` Nodejs has two kinds of streams: [web streams](https://nodejs.org/dist/latest-v16.x/docs/api/webstreams.html), which follow the API of the WHATWG web standard found in browsers, and an older Node-specific [streams API](https://nodejs.org/api/stream.html). `response.body` returns a readable web stream. If you would prefer to work with a Node stream you can convert a web stream using `.fromWeb()`. diff --git a/deps/undici/src/docs/assets/lifecycle-diagram.png b/deps/undici/src/docs/assets/lifecycle-diagram.png index 01d1c321e3d3a53785ce8b517f7c53a5a3d2b33f..4ef17b5a71454bdd5d0920bdbc162d24347f7440 100644 GIT binary patch literal 47090 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 Mqas}-Y2^R^0VGg_TmS$7 literal 76418 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 diff --git a/deps/undici/src/index.d.ts b/deps/undici/src/index.d.ts index 1aaf14d38b2764..d663178d410d43 100644 --- a/deps/undici/src/index.d.ts +++ b/deps/undici/src/index.d.ts @@ -1,19 +1,19 @@ -import Dispatcher = require('./types/dispatcher') +import Dispatcher from'./types/dispatcher' import { setGlobalDispatcher, getGlobalDispatcher } from './types/global-dispatcher' import { setGlobalOrigin, getGlobalOrigin } from './types/global-origin' -import Pool = require('./types/pool') +import Pool from'./types/pool' import { RedirectHandler, DecoratorHandler } from './types/handlers' -import BalancedPool = require('./types/balanced-pool') -import Client = require('./types/client') -import buildConnector = require('./types/connector') -import errors = require('./types/errors') -import Agent = require('./types/agent') -import MockClient = require('./types/mock-client') -import MockPool = require('./types/mock-pool') -import MockAgent = require('./types/mock-agent') -import mockErrors = require('./types/mock-errors') -import ProxyAgent = require('./types/proxy-agent') +import BalancedPool from './types/balanced-pool' +import Client from'./types/client' +import buildConnector from'./types/connector' +import errors from'./types/errors' +import Agent from'./types/agent' +import MockClient from'./types/mock-client' +import MockPool from'./types/mock-pool' +import MockAgent from'./types/mock-agent' +import mockErrors from'./types/mock-errors' +import ProxyAgent from'./types/proxy-agent' import { request, pipeline, stream, connect, upgrade } from './types/api' export * from './types/fetch' @@ -27,16 +27,16 @@ export { Dispatcher, BalancedPool, Pool, Client, buildConnector, errors, Agent, export default Undici declare namespace Undici { - var Dispatcher: typeof import('./types/dispatcher') - var Pool: typeof import('./types/pool'); + var Dispatcher: typeof import('./types/dispatcher').default + var Pool: typeof import('./types/pool').default; var RedirectHandler: typeof import ('./types/handlers').RedirectHandler var DecoratorHandler: typeof import ('./types/handlers').DecoratorHandler var createRedirectInterceptor: typeof import ('./types/interceptors').createRedirectInterceptor - var BalancedPool: typeof import('./types/balanced-pool'); - var Client: typeof import('./types/client'); - var buildConnector: typeof import('./types/connector'); - var errors: typeof import('./types/errors'); - var Agent: typeof import('./types/agent'); + var BalancedPool: typeof import('./types/balanced-pool').default; + var Client: typeof import('./types/client').default; + var buildConnector: typeof import('./types/connector').default; + var errors: typeof import('./types/errors').default; + var Agent: typeof import('./types/agent').default; var setGlobalDispatcher: typeof import('./types/global-dispatcher').setGlobalDispatcher; var getGlobalDispatcher: typeof import('./types/global-dispatcher').getGlobalDispatcher; var request: typeof import('./types/api').request; @@ -44,9 +44,9 @@ declare namespace Undici { var pipeline: typeof import('./types/api').pipeline; var connect: typeof import('./types/api').connect; var upgrade: typeof import('./types/api').upgrade; - var MockClient: typeof import('./types/mock-client'); - var MockPool: typeof import('./types/mock-pool'); - var MockAgent: typeof import('./types/mock-agent'); - var mockErrors: typeof import('./types/mock-errors'); + var MockClient: typeof import('./types/mock-client').default; + var MockPool: typeof import('./types/mock-pool').default; + var MockAgent: typeof import('./types/mock-agent').default; + var mockErrors: typeof import('./types/mock-errors').default; var fetch: typeof import('./types/fetch').fetch; } diff --git a/deps/undici/src/lib/fetch/body.js b/deps/undici/src/lib/fetch/body.js index 7de30264d6898a..130a0bc669bb40 100644 --- a/deps/undici/src/lib/fetch/body.js +++ b/deps/undici/src/lib/fetch/body.js @@ -2,7 +2,7 @@ const Busboy = require('busboy') const util = require('../core/util') -const { ReadableStreamFrom, toUSVString, isBlobLike, isReadableStreamLike, readableStreamClose } = require('./util') +const { ReadableStreamFrom, isBlobLike, isReadableStreamLike, readableStreamClose } = require('./util') const { FormData } = require('./formdata') const { kState } = require('./symbols') const { webidl } = require('./webidl') @@ -66,9 +66,13 @@ function extractBody (object, keepalive = false) { let type = null // 10. Switch on object: - if (object == null) { - // Note: The IDL processor cannot handle this situation. See - // https://crbug.com/335871. + if (typeof object === 'string') { + // Set source to the UTF-8 encoding of object. + // Note: setting source to a Uint8Array here breaks some mocking assumptions. + source = object + + // Set type to `text/plain;charset=UTF-8`. + type = 'text/plain;charset=UTF-8' } else if (object instanceof URLSearchParams) { // URLSearchParams @@ -126,7 +130,8 @@ function extractBody (object, keepalive = false) { yield * value.stream() - yield enc.encode('\r\n') + // '\r\n' encoded + yield new Uint8Array([13, 10]) } } @@ -157,6 +162,11 @@ function extractBody (object, keepalive = false) { if (object.type) { type = object.type } + } else if (object instanceof Uint8Array) { + // byte sequence + + // Set source to object. + source = object } else if (typeof object[Symbol.asyncIterator] === 'function') { // If keepalive is true, then throw a TypeError. if (keepalive) { @@ -172,17 +182,10 @@ function extractBody (object, keepalive = false) { stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object) - } else { - // TODO: byte sequence? - // TODO: scalar value string? - // TODO: else? - source = toUSVString(object) - type = 'text/plain;charset=UTF-8' } // 11. If source is a byte sequence, then set action to a // step that returns source and length to source’s length. - // TODO: What is a "byte sequence?" if (typeof source === 'string' || util.isBuffer(source)) { length = Buffer.byteLength(source) } @@ -329,9 +332,7 @@ function bodyMixinMethods (instance) { }, async formData () { - if (!(this instanceof instance)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, instance) throwIfAborted(this[kState]) @@ -433,7 +434,7 @@ function bodyMixinMethods (instance) { throwIfAborted(this[kState]) // Otherwise, throw a TypeError. - webidl.errors.exception({ + throw webidl.errors.exception({ header: `${instance.name}.formData`, message: 'Could not parse content as FormData.' }) @@ -450,11 +451,8 @@ function mixinBody (prototype) { // https://fetch.spec.whatwg.org/#concept-body-consume-body async function specConsumeBody (object, type, instance) { - if (!(object instanceof instance)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(object, instance) - // TODO: why is this needed? throwIfAborted(object[kState]) // 1. If object is unusable, then return a promise rejected diff --git a/deps/undici/src/lib/fetch/constants.js b/deps/undici/src/lib/fetch/constants.js index fe5028304b07d7..bc90a031cde31a 100644 --- a/deps/undici/src/lib/fetch/constants.js +++ b/deps/undici/src/lib/fetch/constants.js @@ -8,6 +8,17 @@ const nullBodyStatus = [101, 204, 205, 304] const redirectStatus = [301, 302, 303, 307, 308] +// https://fetch.spec.whatwg.org/#block-bad-port +const badPorts = [ + '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79', + '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137', + '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532', + '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723', + '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697', + '10080' +] + +// https://w3c.github.io/webappsec-referrer-policy/#referrer-policies const referrerPolicy = [ '', 'no-referrer', @@ -44,6 +55,11 @@ const requestBodyHeader = [ 'content-type' ] +// https://fetch.spec.whatwg.org/#enumdef-requestduplex +const requestDuplex = [ + 'half' +] + // http://fetch.spec.whatwg.org/#forbidden-method const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK'] @@ -108,5 +124,7 @@ module.exports = { redirectStatus, corsSafeListedMethods, nullBodyStatus, - safeMethods + safeMethods, + badPorts, + requestDuplex } diff --git a/deps/undici/src/lib/fetch/dataURL.js b/deps/undici/src/lib/fetch/dataURL.js index a4269120e558a9..74b6d9ec472d76 100644 --- a/deps/undici/src/lib/fetch/dataURL.js +++ b/deps/undici/src/lib/fetch/dataURL.js @@ -1,6 +1,7 @@ const assert = require('assert') const { atob } = require('buffer') -const { isValidHTTPToken } = require('./util') +const { format } = require('url') +const { isValidHTTPToken, isomorphicDecode } = require('./util') const encoder = new TextEncoder() @@ -54,7 +55,6 @@ function dataURLProcessor (dataURL) { const encodedBody = input.slice(mimeTypeLength + 1) // 10. Let body be the percent-decoding of encodedBody. - /** @type {Uint8Array|string} */ let body = stringPercentDecode(encodedBody) // 11. If mimeType ends with U+003B (;), followed by @@ -62,7 +62,8 @@ function dataURLProcessor (dataURL) { // case-insensitive match for "base64", then: if (/;(\u0020){0,}base64$/i.test(mimeType)) { // 1. Let stringBody be the isomorphic decode of body. - const stringBody = decodeURIComponent(new TextDecoder('utf-8').decode(body)) + const stringBody = isomorphicDecode(body) + // 2. Set body to the forgiving-base64 decode of // stringBody. body = forgivingBase64(stringBody) @@ -111,73 +112,7 @@ function dataURLProcessor (dataURL) { * @param {boolean} excludeFragment */ function URLSerializer (url, excludeFragment = false) { - // 1. Let output be url’s scheme and U+003A (:) concatenated. - let output = url.protocol - - // 2. If url’s host is non-null: - if (url.host.length > 0) { - // 1. Append "//" to output. - output += '//' - - // 2. If url includes credentials, then: - if (url.username.length > 0 || url.password.length > 0) { - // 1. Append url’s username to output. - output += url.username - - // 2. If url’s password is not the empty string, then append U+003A (:), - // followed by url’s password, to output. - if (url.password.length > 0) { - output += ':' + url.password - } - - // 3. Append U+0040 (@) to output. - output += '@' - } - - // 3. Append url’s host, serialized, to output. - output += decodeURIComponent(url.hostname) - - // 4. If url’s port is non-null, append U+003A (:) followed by url’s port, - // serialized, to output. - if (url.port.length > 0) { - output += ':' + url.port - } - } - - // 3. If url’s host is null, url does not have an opaque path, - // url’s path’s size is greater than 1, and url’s path[0] - // is the empty string, then append U+002F (/) followed by - // U+002E (.) to output. - // Note: This prevents web+demo:/.//not-a-host/ or web+demo:/path/..//not-a-host/, - // when parsed and then serialized, from ending up as web+demo://not-a-host/ - // (they end up as web+demo:/.//not-a-host/). - // Undici implementation note: url's path[0] can never be an - // empty string, so we have to slightly alter what the spec says. - if ( - url.host.length === 0 && - url.pathname.length > 1 && - url.href.slice(url.protocol.length + 1)[0] === '.' - ) { - output += '/.' - } - - // 4. Append the result of URL path serializing url to output. - output += url.pathname - - // 5. If url’s query is non-null, append U+003F (?), - // followed by url’s query, to output. - if (url.search.length > 0) { - output += url.search - } - - // 6. If exclude fragment is false and url’s fragment is non-null, - // then append U+0023 (#), followed by url’s fragment, to output. - if (excludeFragment === false && url.hash.length > 0) { - output += url.hash - } - - // 7. Return output. - return output + return format(url, { fragment: !excludeFragment }) } // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points diff --git a/deps/undici/src/lib/fetch/file.js b/deps/undici/src/lib/fetch/file.js index d0d8c68d79322a..f27fc7fb7be61a 100644 --- a/deps/undici/src/lib/fetch/file.js +++ b/deps/undici/src/lib/fetch/file.js @@ -13,9 +13,7 @@ class File extends Blob { // The File constructor is invoked with two or three parameters, depending // on whether the optional dictionary parameter is used. When the File() // constructor is invoked, user agents must run the following steps: - if (arguments.length < 2) { - throw new TypeError('2 arguments required') - } + webidl.argumentLengthCheck(arguments, 2, { header: 'File constructor' }) fileBits = webidl.converters['sequence'](fileBits) fileName = webidl.converters.USVString(fileName) @@ -76,32 +74,22 @@ class File extends Blob { } get name () { - if (!(this instanceof File)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, File) return this[kState].name } get lastModified () { - if (!(this instanceof File)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, File) return this[kState].lastModified } get type () { - if (!(this instanceof File)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, File) return this[kState].type } - - get [Symbol.toStringTag] () { - return this.constructor.name - } } class FileLike { @@ -153,65 +141,49 @@ class FileLike { } stream (...args) { - if (!(this instanceof FileLike)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileLike) return this[kState].blobLike.stream(...args) } arrayBuffer (...args) { - if (!(this instanceof FileLike)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileLike) return this[kState].blobLike.arrayBuffer(...args) } slice (...args) { - if (!(this instanceof FileLike)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileLike) return this[kState].blobLike.slice(...args) } text (...args) { - if (!(this instanceof FileLike)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileLike) return this[kState].blobLike.text(...args) } get size () { - if (!(this instanceof FileLike)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileLike) return this[kState].blobLike.size } get type () { - if (!(this instanceof FileLike)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileLike) return this[kState].blobLike.type } get name () { - if (!(this instanceof FileLike)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileLike) return this[kState].name } get lastModified () { - if (!(this instanceof FileLike)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileLike) return this[kState].lastModified } @@ -222,6 +194,10 @@ class FileLike { } Object.defineProperties(File.prototype, { + [Symbol.toStringTag]: { + value: 'File', + configurable: true + }, name: kEnumerableProperty, lastModified: kEnumerableProperty }) diff --git a/deps/undici/src/lib/fetch/formdata.js b/deps/undici/src/lib/fetch/formdata.js index d5e2ba661da501..5d0649ba92efce 100644 --- a/deps/undici/src/lib/fetch/formdata.js +++ b/deps/undici/src/lib/fetch/formdata.js @@ -8,11 +8,9 @@ const { Blob } = require('buffer') // https://xhr.spec.whatwg.org/#formdata class FormData { - static name = 'FormData' - constructor (form) { if (form !== undefined) { - webidl.errors.conversionFailed({ + throw webidl.errors.conversionFailed({ prefix: 'FormData constructor', argument: 'Argument 1', types: ['undefined'] @@ -23,15 +21,9 @@ class FormData { } append (name, value, filename = undefined) { - if (!(this instanceof FormData)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FormData) - if (arguments.length < 2) { - throw new TypeError( - `Failed to execute 'append' on 'FormData': 2 arguments required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.append' }) if (arguments.length === 3 && !isBlobLike(value)) { throw new TypeError( @@ -58,15 +50,9 @@ class FormData { } delete (name) { - if (!(this instanceof FormData)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FormData) - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'delete' on 'FormData': 1 arguments required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.delete' }) name = webidl.converters.USVString(name) @@ -83,15 +69,9 @@ class FormData { } get (name) { - if (!(this instanceof FormData)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FormData) - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'get' on 'FormData': 1 arguments required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.get' }) name = webidl.converters.USVString(name) @@ -108,15 +88,9 @@ class FormData { } getAll (name) { - if (!(this instanceof FormData)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FormData) - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'getAll' on 'FormData': 1 arguments required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.getAll' }) name = webidl.converters.USVString(name) @@ -130,15 +104,9 @@ class FormData { } has (name) { - if (!(this instanceof FormData)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FormData) - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'has' on 'FormData': 1 arguments required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.has' }) name = webidl.converters.USVString(name) @@ -148,15 +116,9 @@ class FormData { } set (name, value, filename = undefined) { - if (!(this instanceof FormData)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FormData) - if (arguments.length < 2) { - throw new TypeError( - `Failed to execute 'set' on 'FormData': 2 arguments required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.set' }) if (arguments.length === 3 && !isBlobLike(value)) { throw new TypeError( @@ -196,14 +158,8 @@ class FormData { } } - get [Symbol.toStringTag] () { - return this.constructor.name - } - entries () { - if (!(this instanceof FormData)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FormData) return makeIterator( () => this[kState].map(pair => [pair.name, pair.value]), @@ -213,9 +169,7 @@ class FormData { } keys () { - if (!(this instanceof FormData)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FormData) return makeIterator( () => this[kState].map(pair => [pair.name, pair.value]), @@ -225,9 +179,7 @@ class FormData { } values () { - if (!(this instanceof FormData)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FormData) return makeIterator( () => this[kState].map(pair => [pair.name, pair.value]), @@ -241,15 +193,9 @@ class FormData { * @param {unknown} thisArg */ forEach (callbackFn, thisArg = globalThis) { - if (!(this instanceof FormData)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FormData) - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'forEach' on 'FormData': 1 argument required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.forEach' }) if (typeof callbackFn !== 'function') { throw new TypeError( @@ -265,6 +211,13 @@ class FormData { FormData.prototype[Symbol.iterator] = FormData.prototype.entries +Object.defineProperties(FormData.prototype, { + [Symbol.toStringTag]: { + value: 'FormData', + configurable: true + } +}) + /** * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry * @param {string} name diff --git a/deps/undici/src/lib/fetch/headers.js b/deps/undici/src/lib/fetch/headers.js index 3b0eb833e5a1a9..76d5cde578b341 100644 --- a/deps/undici/src/lib/fetch/headers.js +++ b/deps/undici/src/lib/fetch/headers.js @@ -38,7 +38,7 @@ function fill (headers, object) { for (const header of object) { // 1. If header does not contain exactly two items, then throw a TypeError. if (header.length !== 2) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Headers constructor', message: `expected name/value pair to be length 2, found ${header.length}.` }) @@ -56,7 +56,7 @@ function fill (headers, object) { headers.append(key, value) } } else { - webidl.errors.conversionFailed({ + throw webidl.errors.conversionFailed({ prefix: 'Headers constructor', argument: 'Argument 1', types: ['sequence>', 'record'] @@ -129,8 +129,6 @@ class HeadersList { // https://fetch.spec.whatwg.org/#concept-header-list-get get (name) { - name = name.toLowerCase() - // 1. If list does not contain name, then return null. if (!this.contains(name)) { return null @@ -139,12 +137,7 @@ class HeadersList { // 2. Return the values of all headers in list whose name // is a byte-case-insensitive match for name, // separated from each other by 0x2C 0x20, in order. - return this[kHeadersMap].get(name) ?? null - } - - has (name) { - name = name.toLowerCase() - return this[kHeadersMap].has(name) + return this[kHeadersMap].get(name.toLowerCase()) ?? null } * [Symbol.iterator] () { @@ -171,21 +164,11 @@ class Headers { } } - get [Symbol.toStringTag] () { - return this.constructor.name - } - // https://fetch.spec.whatwg.org/#dom-headers-append append (name, value) { - if (!(this instanceof Headers)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Headers) - if (arguments.length < 2) { - throw new TypeError( - `Failed to execute 'append' on 'Headers': 2 arguments required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.append' }) name = webidl.converters.ByteString(name) value = webidl.converters.ByteString(value) @@ -196,13 +179,13 @@ class Headers { // 2. If name is not a header name or value is not a // header value, then throw a TypeError. if (!isValidHeaderName(name)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: 'Headers.append', value: name, type: 'header name' }) } else if (!isValidHeaderValue(value)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: 'Headers.append', value, type: 'header value' @@ -231,21 +214,15 @@ class Headers { // https://fetch.spec.whatwg.org/#dom-headers-delete delete (name) { - if (!(this instanceof Headers)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Headers) - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'delete' on 'Headers': 1 argument required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.delete' }) name = webidl.converters.ByteString(name) // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: 'Headers.delete', value: name, type: 'header name' @@ -282,21 +259,15 @@ class Headers { // https://fetch.spec.whatwg.org/#dom-headers-get get (name) { - if (!(this instanceof Headers)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Headers) - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'get' on 'Headers': 1 argument required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.get' }) name = webidl.converters.ByteString(name) // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: 'Headers.get', value: name, type: 'header name' @@ -310,21 +281,15 @@ class Headers { // https://fetch.spec.whatwg.org/#dom-headers-has has (name) { - if (!(this instanceof Headers)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Headers) - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'has' on 'Headers': 1 argument required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.has' }) name = webidl.converters.ByteString(name) // 1. If name is not a header name, then throw a TypeError. if (!isValidHeaderName(name)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: 'Headers.has', value: name, type: 'header name' @@ -338,15 +303,9 @@ class Headers { // https://fetch.spec.whatwg.org/#dom-headers-set set (name, value) { - if (!(this instanceof Headers)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Headers) - if (arguments.length < 2) { - throw new TypeError( - `Failed to execute 'set' on 'Headers': 2 arguments required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.set' }) name = webidl.converters.ByteString(name) value = webidl.converters.ByteString(value) @@ -357,13 +316,13 @@ class Headers { // 2. If name is not a header name or value is not a // header value, then throw a TypeError. if (!isValidHeaderName(name)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: 'Headers.set', value: name, type: 'header name' }) } else if (!isValidHeaderValue(value)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: 'Headers.set', value, type: 'header value' @@ -399,9 +358,7 @@ class Headers { } keys () { - if (!(this instanceof Headers)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Headers) return makeIterator( () => [...this[kHeadersSortedMap].entries()], @@ -411,9 +368,7 @@ class Headers { } values () { - if (!(this instanceof Headers)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Headers) return makeIterator( () => [...this[kHeadersSortedMap].entries()], @@ -423,9 +378,7 @@ class Headers { } entries () { - if (!(this instanceof Headers)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Headers) return makeIterator( () => [...this[kHeadersSortedMap].entries()], @@ -439,15 +392,9 @@ class Headers { * @param {unknown} thisArg */ forEach (callbackFn, thisArg = globalThis) { - if (!(this instanceof Headers)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Headers) - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'forEach' on 'Headers': 1 argument required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.forEach' }) if (typeof callbackFn !== 'function') { throw new TypeError( @@ -461,9 +408,7 @@ class Headers { } [Symbol.for('nodejs.util.inspect.custom')] () { - if (!(this instanceof Headers)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Headers) return this[kHeadersList] } @@ -481,7 +426,11 @@ Object.defineProperties(Headers.prototype, { values: kEnumerableProperty, entries: kEnumerableProperty, forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false } + [Symbol.iterator]: { enumerable: false }, + [Symbol.toStringTag]: { + value: 'Headers', + configurable: true + } }) webidl.converters.HeadersInit = function (V) { @@ -493,7 +442,7 @@ webidl.converters.HeadersInit = function (V) { return webidl.converters['record'](V) } - webidl.errors.conversionFailed({ + throw webidl.errors.conversionFailed({ prefix: 'Headers constructor', argument: 'Argument 1', types: ['sequence>', 'record'] diff --git a/deps/undici/src/lib/fetch/index.js b/deps/undici/src/lib/fetch/index.js index 0b99d546380fb6..94f2d1e0aca5ab 100644 --- a/deps/undici/src/lib/fetch/index.js +++ b/deps/undici/src/lib/fetch/index.js @@ -36,7 +36,8 @@ const { isAborted, isErrorLike, fullyReadBody, - readableStreamClose + readableStreamClose, + isomorphicEncode } = require('./util') const { kState, kHeaders, kGuard, kRealm } = require('./symbols') const assert = require('assert') @@ -56,6 +57,7 @@ const { isErrored, isReadable } = require('../core/util') const { dataURLProcessor, serializeAMimeType } = require('./dataURL') const { TransformStream } = require('stream/web') const { getGlobalDispatcher } = require('../../index') +const { webidl } = require('./webidl') /** @type {import('buffer').resolveObjectURL} */ let resolveObjectURL @@ -121,11 +123,7 @@ class Fetch extends EE { // https://fetch.spec.whatwg.org/#fetch-method async function fetch (input, init = {}) { - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'fetch' on 'Window': 1 argument required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' }) // 1. Let p be a new promise. const p = createDeferredPromise() @@ -477,7 +475,7 @@ function fetching ({ } // 12. If request’s header list does not contain `Accept`, then: - if (!request.headersList.has('accept')) { + if (!request.headersList.contains('accept')) { // 1. Let value be `*/*`. const value = '*/*' @@ -500,7 +498,7 @@ function fetching ({ // 13. If request’s header list does not contain `Accept-Language`, then // user agents should append `Accept-Language`/an appropriate value to // request’s header list. - if (!request.headersList.has('accept-language')) { + if (!request.headersList.contains('accept-language')) { request.headersList.append('accept-language', '*') } @@ -723,7 +721,7 @@ async function mainFetch (fetchParams, recursive = false) { response.type === 'opaque' && internalResponse.status === 206 && internalResponse.rangeRequested && - !request.headers.has('range') + !request.headers.contains('range') ) { response = internalResponse = makeNetworkError() } @@ -832,7 +830,7 @@ async function schemeFetch (fetchParams) { const body = bodyWithType[0] // 5. Let length be body’s length, serialized and isomorphic encoded. - const length = `${body.length}` + const length = isomorphicEncode(`${body.length}`) // 6. Let type be bodyWithType’s type if it is non-null; otherwise the empty byte sequence. const type = bodyWithType[1] ?? '' @@ -1303,8 +1301,7 @@ async function httpNetworkOrCacheFetch ( // 7. If contentLength is non-null, then set contentLengthHeaderValue to // contentLength, serialized and isomorphic encoded. if (contentLength != null) { - // TODO: isomorphic encoded - contentLengthHeaderValue = String(contentLength) + contentLengthHeaderValue = isomorphicEncode(`${contentLength}`) } // 8. If contentLengthHeaderValue is non-null, then append @@ -1327,8 +1324,7 @@ async function httpNetworkOrCacheFetch ( // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded, // to httpRequest’s header list. if (httpRequest.referrer instanceof URL) { - // TODO: isomorphic encoded - httpRequest.headersList.append('referer', httpRequest.referrer.href) + httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href)) } // 12. Append a request `Origin` header for httpRequest. @@ -1340,7 +1336,7 @@ async function httpNetworkOrCacheFetch ( // 14. If httpRequest’s header list does not contain `User-Agent`, then // user agents should append `User-Agent`/default `User-Agent` value to // httpRequest’s header list. - if (!httpRequest.headersList.has('user-agent')) { + if (!httpRequest.headersList.contains('user-agent')) { httpRequest.headersList.append('user-agent', 'undici') } @@ -1350,11 +1346,11 @@ async function httpNetworkOrCacheFetch ( // httpRequest’s cache mode to "no-store". if ( httpRequest.cache === 'default' && - (httpRequest.headersList.has('if-modified-since') || - httpRequest.headersList.has('if-none-match') || - httpRequest.headersList.has('if-unmodified-since') || - httpRequest.headersList.has('if-match') || - httpRequest.headersList.has('if-range')) + (httpRequest.headersList.contains('if-modified-since') || + httpRequest.headersList.contains('if-none-match') || + httpRequest.headersList.contains('if-unmodified-since') || + httpRequest.headersList.contains('if-match') || + httpRequest.headersList.contains('if-range')) ) { httpRequest.cache = 'no-store' } @@ -1366,7 +1362,7 @@ async function httpNetworkOrCacheFetch ( if ( httpRequest.cache === 'no-cache' && !httpRequest.preventNoCacheCacheControlHeaderModification && - !httpRequest.headersList.has('cache-control') + !httpRequest.headersList.contains('cache-control') ) { httpRequest.headersList.append('cache-control', 'max-age=0') } @@ -1375,27 +1371,27 @@ async function httpNetworkOrCacheFetch ( if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') { // 1. If httpRequest’s header list does not contain `Pragma`, then append // `Pragma`/`no-cache` to httpRequest’s header list. - if (!httpRequest.headersList.has('pragma')) { + if (!httpRequest.headersList.contains('pragma')) { httpRequest.headersList.append('pragma', 'no-cache') } // 2. If httpRequest’s header list does not contain `Cache-Control`, // then append `Cache-Control`/`no-cache` to httpRequest’s header list. - if (!httpRequest.headersList.has('cache-control')) { + if (!httpRequest.headersList.contains('cache-control')) { httpRequest.headersList.append('cache-control', 'no-cache') } } // 18. If httpRequest’s header list contains `Range`, then append // `Accept-Encoding`/`identity` to httpRequest’s header list. - if (httpRequest.headersList.has('range')) { + if (httpRequest.headersList.contains('range')) { httpRequest.headersList.append('accept-encoding', 'identity') } // 19. Modify httpRequest’s header list per HTTP. Do not append a given // header if httpRequest’s header list contains that header’s name. // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129 - if (!httpRequest.headersList.has('accept-encoding')) { + if (!httpRequest.headersList.contains('accept-encoding')) { if (/^https:/.test(requestCurrentURL(httpRequest).protocol)) { httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate') } else { @@ -1484,7 +1480,7 @@ async function httpNetworkOrCacheFetch ( // 12. If httpRequest’s header list contains `Range`, then set response’s // range-requested flag. - if (httpRequest.headersList.has('range')) { + if (httpRequest.headersList.contains('range')) { response.rangeRequested = true } diff --git a/deps/undici/src/lib/fetch/request.js b/deps/undici/src/lib/fetch/request.js index 7c3032bd5ed372..533ee91bc1023c 100644 --- a/deps/undici/src/lib/fetch/request.js +++ b/deps/undici/src/lib/fetch/request.js @@ -18,7 +18,8 @@ const { requestRedirect, requestMode, requestCredentials, - requestCache + requestCache, + requestDuplex } = require('./constants') const { kEnumerableProperty } = util const { kHeaders, kSignal, kState, kGuard, kRealm } = require('./symbols') @@ -44,11 +45,7 @@ class Request { return } - if (arguments.length < 1) { - throw new TypeError( - `Failed to construct 'Request': 1 argument required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'Request constructor' }) input = webidl.converters.RequestInfo(input) init = webidl.converters.RequestInit(init) @@ -243,29 +240,19 @@ class Request { // to it. if (init.referrerPolicy !== undefined) { request.referrerPolicy = init.referrerPolicy - if (!referrerPolicy.includes(request.referrerPolicy)) { - throw new TypeError( - `Failed to construct 'Request': The provided value '${request.referrerPolicy}' is not a valid enum value of type ReferrerPolicy.` - ) - } } // 16. Let mode be init["mode"] if it exists, and fallbackMode otherwise. let mode if (init.mode !== undefined) { mode = init.mode - if (!requestMode.includes(mode)) { - throw new TypeError( - `Failed to construct 'Request': The provided value '${request.mode}' is not a valid enum value of type RequestMode.` - ) - } } else { mode = fallbackMode } // 17. If mode is "navigate", then throw a TypeError. if (mode === 'navigate') { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Request constructor', message: 'invalid request mode navigate.' }) @@ -280,21 +267,11 @@ class Request { // to it. if (init.credentials !== undefined) { request.credentials = init.credentials - if (!requestCredentials.includes(request.credentials)) { - throw new TypeError( - `Failed to construct 'Request': The provided value '${request.credentials}' is not a valid enum value of type RequestCredentials.` - ) - } } // 18. If init["cache"] exists, then set request’s cache mode to it. if (init.cache !== undefined) { request.cache = init.cache - if (!requestCache.includes(request.cache)) { - throw new TypeError( - `Failed to construct 'Request': The provided value '${request.cache}' is not a valid enum value of type RequestCache.` - ) - } } // 21. If request’s cache mode is "only-if-cached" and request’s mode is @@ -308,11 +285,6 @@ class Request { // 22. If init["redirect"] exists, then set request’s redirect mode to it. if (init.redirect !== undefined) { request.redirect = init.redirect - if (!requestRedirect.includes(request.redirect)) { - throw new TypeError( - `Failed to construct 'Request': The provided value '${request.redirect}' is not a valid enum value of type RequestRedirect.` - ) - } } // 23. If init["integrity"] exists, then set request’s integrity metadata to it. @@ -461,7 +433,7 @@ class Request { // 3, If Content-Type is non-null and this’s headers’s header list does // not contain `Content-Type`, then append `Content-Type`/Content-Type to // this’s headers. - if (contentType && !this[kHeaders].has('content-type')) { + if (contentType && !this[kHeaders][kHeadersList].contains('content-type')) { this[kHeaders].append('content-type', contentType) } } @@ -522,15 +494,9 @@ class Request { this[kState].body = finalBody } - get [Symbol.toStringTag] () { - return this.constructor.name - } - // Returns request’s HTTP method, which is "GET" by default. get method () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The method getter steps are to return this’s request’s method. return this[kState].method @@ -538,9 +504,7 @@ class Request { // Returns the URL of request as a string. get url () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The url getter steps are to return this’s request’s URL, serialized. return URLSerializer(this[kState].url) @@ -550,9 +514,7 @@ class Request { // Note that headers added in the network layer by the user agent will not // be accounted for in this object, e.g., the "Host" header. get headers () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The headers getter steps are to return this’s headers. return this[kHeaders] @@ -561,9 +523,7 @@ class Request { // Returns the kind of resource requested by request, e.g., "document" // or "script". get destination () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The destination getter are to return this’s request’s destination. return this[kState].destination @@ -575,9 +535,7 @@ class Request { // during fetching to determine the value of the `Referer` header of the // request being made. get referrer () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // 1. If this’s request’s referrer is "no-referrer", then return the // empty string. @@ -599,9 +557,7 @@ class Request { // This is used during fetching to compute the value of the request’s // referrer. get referrerPolicy () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The referrerPolicy getter steps are to return this’s request’s referrer policy. return this[kState].referrerPolicy @@ -611,9 +567,7 @@ class Request { // whether the request will use CORS, or will be restricted to same-origin // URLs. get mode () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The mode getter steps are to return this’s request’s mode. return this[kState].mode @@ -631,9 +585,7 @@ class Request { // which is a string indicating how the request will // interact with the browser’s cache when fetching. get cache () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The cache getter steps are to return this’s request’s cache mode. return this[kState].cache @@ -644,9 +596,7 @@ class Request { // request will be handled during fetching. A request // will follow redirects by default. get redirect () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The redirect getter steps are to return this’s request’s redirect mode. return this[kState].redirect @@ -656,9 +606,7 @@ class Request { // cryptographic hash of the resource being fetched. Its value // consists of multiple hashes separated by whitespace. [SRI] get integrity () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The integrity getter steps are to return this’s request’s integrity // metadata. @@ -668,9 +616,7 @@ class Request { // Returns a boolean indicating whether or not request can outlive the // global in which it was created. get keepalive () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The keepalive getter steps are to return this’s request’s keepalive. return this[kState].keepalive @@ -679,9 +625,7 @@ class Request { // Returns a boolean indicating whether or not request is for a reload // navigation. get isReloadNavigation () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The isReloadNavigation getter steps are to return true if this’s // request’s reload-navigation flag is set; otherwise false. @@ -691,9 +635,7 @@ class Request { // Returns a boolean indicating whether or not request is for a history // navigation (a.k.a. back-foward navigation). get isHistoryNavigation () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The isHistoryNavigation getter steps are to return true if this’s request’s // history-navigation flag is set; otherwise false. @@ -704,43 +646,33 @@ class Request { // object indicating whether or not request has been aborted, and its // abort event handler. get signal () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // The signal getter steps are to return this’s signal. return this[kSignal] } get body () { - if (!this || !this[kState]) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) return this[kState].body ? this[kState].body.stream : null } get bodyUsed () { - if (!this || !this[kState]) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) return !!this[kState].body && util.isDisturbed(this[kState].body.stream) } get duplex () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) return 'half' } // Returns a clone of request. clone () { - if (!(this instanceof Request)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Request) // 1. If this is unusable, then throw a TypeError. if (this.bodyUsed || this.body?.locked) { @@ -866,7 +798,11 @@ Object.defineProperties(Request.prototype, { attribute: kEnumerableProperty, referrerPolicy: kEnumerableProperty, referrer: kEnumerableProperty, - mode: kEnumerableProperty + mode: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'Request', + configurable: true + } }) webidl.converters.Request = webidl.interfaceConverter( @@ -914,45 +850,31 @@ webidl.converters.RequestInit = webidl.dictionaryConverter([ key: 'referrerPolicy', converter: webidl.converters.DOMString, // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy - allowedValues: [ - '', 'no-referrer', 'no-referrer-when-downgrade', - 'same-origin', 'origin', 'strict-origin', - 'origin-when-cross-origin', 'strict-origin-when-cross-origin', - 'unsafe-url' - ] + allowedValues: referrerPolicy }, { key: 'mode', converter: webidl.converters.DOMString, // https://fetch.spec.whatwg.org/#concept-request-mode - allowedValues: [ - 'same-origin', 'cors', 'no-cors', 'navigate', 'websocket' - ] + allowedValues: requestMode }, { key: 'credentials', converter: webidl.converters.DOMString, // https://fetch.spec.whatwg.org/#requestcredentials - allowedValues: [ - 'omit', 'same-origin', 'include' - ] + allowedValues: requestCredentials }, { key: 'cache', converter: webidl.converters.DOMString, // https://fetch.spec.whatwg.org/#requestcache - allowedValues: [ - 'default', 'no-store', 'reload', 'no-cache', 'force-cache', - 'only-if-cached' - ] + allowedValues: requestCache }, { key: 'redirect', converter: webidl.converters.DOMString, // https://fetch.spec.whatwg.org/#requestredirect - allowedValues: [ - 'follow', 'error', 'manual' - ] + allowedValues: requestRedirect }, { key: 'integrity', @@ -978,7 +900,7 @@ webidl.converters.RequestInit = webidl.dictionaryConverter([ { key: 'duplex', converter: webidl.converters.DOMString, - allowedValues: ['half'] + allowedValues: requestDuplex } ]) diff --git a/deps/undici/src/lib/fetch/response.js b/deps/undici/src/lib/fetch/response.js index be97d67ce6f436..fc6746bfa8d840 100644 --- a/deps/undici/src/lib/fetch/response.js +++ b/deps/undici/src/lib/fetch/response.js @@ -10,7 +10,8 @@ const { isAborted, isBlobLike, serializeJavascriptValueToJSONString, - isErrorLike + isErrorLike, + isomorphicEncode } = require('./util') const { redirectStatus, @@ -49,11 +50,7 @@ class Response { // https://fetch.spec.whatwg.org/#dom-response-json static json (data = undefined, init = {}) { - if (arguments.length === 0) { - throw new TypeError( - 'Failed to execute \'json\' on \'Response\': 1 argument required, but 0 present.' - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'Response.json' }) if (init !== null) { init = webidl.converters.ResponseInit(init) @@ -86,11 +83,7 @@ class Response { static redirect (url, status = 302) { const relevantRealm = { settingsObject: {} } - if (arguments.length < 1) { - throw new TypeError( - `Failed to execute 'redirect' on 'Response': 1 argument required, but only ${arguments.length} present.` - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'Response.redirect' }) url = webidl.converters.USVString(url) status = webidl.converters['unsigned short'](status) @@ -110,7 +103,7 @@ class Response { // 3. If status is not a redirect status, then throw a RangeError. if (!redirectStatus.includes(status)) { - throw new RangeError('Invalid status code') + throw new RangeError('Invalid status code ' + status) } // 4. Let responseObject be the result of creating a Response object, @@ -124,8 +117,7 @@ class Response { responseObject[kState].status = status // 6. Let value be parsedURL, serialized and isomorphic encoded. - // TODO: isomorphic encoded? - const value = parsedURL.toString() + const value = isomorphicEncode(URLSerializer(parsedURL)) // 7. Append `Location`/value to responseObject’s response’s header list. responseObject[kState].headersList.append('location', value) @@ -169,15 +161,9 @@ class Response { initializeResponse(this, init, bodyWithType) } - get [Symbol.toStringTag] () { - return this.constructor.name - } - // Returns response’s type, e.g., "cors". get type () { - if (!(this instanceof Response)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Response) // The type getter steps are to return this’s response’s type. return this[kState].type @@ -185,9 +171,7 @@ class Response { // Returns response’s URL, if it has one; otherwise the empty string. get url () { - if (!(this instanceof Response)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Response) const urlList = this[kState].urlList @@ -205,9 +189,7 @@ class Response { // Returns whether response was obtained through a redirect. get redirected () { - if (!(this instanceof Response)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Response) // The redirected getter steps are to return true if this’s response’s URL // list has more than one item; otherwise false. @@ -216,9 +198,7 @@ class Response { // Returns response’s status. get status () { - if (!(this instanceof Response)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Response) // The status getter steps are to return this’s response’s status. return this[kState].status @@ -226,9 +206,7 @@ class Response { // Returns whether response’s status is an ok status. get ok () { - if (!(this instanceof Response)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Response) // The ok getter steps are to return true if this’s response’s status is an // ok status; otherwise false. @@ -237,9 +215,7 @@ class Response { // Returns response’s status message. get statusText () { - if (!(this instanceof Response)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Response) // The statusText getter steps are to return this’s response’s status // message. @@ -248,39 +224,31 @@ class Response { // Returns response’s headers as Headers. get headers () { - if (!(this instanceof Response)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Response) // The headers getter steps are to return this’s headers. return this[kHeaders] } get body () { - if (!this || !this[kState]) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Response) return this[kState].body ? this[kState].body.stream : null } get bodyUsed () { - if (!this || !this[kState]) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Response) return !!this[kState].body && util.isDisturbed(this[kState].body.stream) } // Returns a clone of response. clone () { - if (!(this instanceof Response)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, Response) // 1. If this is unusable, then throw a TypeError. if (this.bodyUsed || (this.body && this.body.locked)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Response.clone', message: 'Body has already been consumed.' }) @@ -314,7 +282,11 @@ Object.defineProperties(Response.prototype, { headers: kEnumerableProperty, clone: kEnumerableProperty, body: kEnumerableProperty, - bodyUsed: kEnumerableProperty + bodyUsed: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'Response', + configurable: true + } }) Object.defineProperties(Response, { @@ -504,9 +476,9 @@ function initializeResponse (response, init, body) { if (body) { // 1. If response's status is a null body status, then throw a TypeError. if (nullBodyStatus.includes(response.status)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Response constructor', - message: 'Invalid response status code.' + message: 'Invalid response status code ' + response.status }) } @@ -515,7 +487,7 @@ function initializeResponse (response, init, body) { // 3. If body's type is non-null and response's header list does not contain // `Content-Type`, then append (`Content-Type`, body's type) to response's header list. - if (body.type != null && !response[kState].headersList.has('Content-Type')) { + if (body.type != null && !response[kState].headersList.contains('Content-Type')) { response[kState].headersList.append('content-type', body.type) } } diff --git a/deps/undici/src/lib/fetch/util.js b/deps/undici/src/lib/fetch/util.js index c71ab16eec1458..4d21e2e17b981c 100644 --- a/deps/undici/src/lib/fetch/util.js +++ b/deps/undici/src/lib/fetch/util.js @@ -1,6 +1,6 @@ 'use strict' -const { redirectStatus } = require('./constants') +const { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = require('./constants') const { performance } = require('perf_hooks') const { isBlobLike, toUSVString, ReadableStreamFrom } = require('../core/util') const assert = require('assert') @@ -16,16 +16,6 @@ try { } -// https://fetch.spec.whatwg.org/#block-bad-port -const badPorts = [ - '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79', - '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137', - '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532', - '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723', - '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697', - '10080' -] - function responseURL (response) { // https://fetch.spec.whatwg.org/#responses // A response has an associated URL. It is a pointer to the last URL @@ -156,13 +146,7 @@ function isValidHeaderName (potentialValue) { return false } - for (const char of potentialValue) { - if (!isValidHTTPToken(char)) { - return false - } - } - - return true + return isValidHTTPToken(potentialValue) } /** @@ -200,8 +184,31 @@ function setRequestReferrerPolicyOnRedirect (request, actualResponse) { // 1. Let policy be the result of executing § 8.1 Parse a referrer policy // from a Referrer-Policy header on actualResponse. - // TODO: https://w3c.github.io/webappsec-referrer-policy/#parse-referrer-policy-from-header - const policy = '' + + // 8.1 Parse a referrer policy from a Referrer-Policy header + // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list. + const { headersList } = actualResponse + // 2. Let policy be the empty string. + // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token. + // 4. Return policy. + const policyHeader = (headersList.get('referrer-policy') ?? '').split(',') + + // Note: As the referrer-policy can contain multiple policies + // separated by comma, we need to loop through all of them + // and pick the first valid one. + // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy + let policy = '' + if (policyHeader.length > 0) { + // The right-most policy takes precedence. + // The left-most policy is the fallback. + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim() + if (referrerPolicyTokens.includes(token)) { + policy = token + break + } + } + } // 2. If policy is not the empty string, then set request’s referrer policy to policy. if (policy !== '') { @@ -856,6 +863,23 @@ function isReadableStreamLike (stream) { ) } +/** + * @see https://infra.spec.whatwg.org/#isomorphic-decode + * @param {number[]|Uint8Array} input + */ +function isomorphicDecode (input) { + // 1. To isomorphic decode a byte sequence input, return a string whose code point + // length is equal to input’s length and whose code points have the same values + // as the values of input’s bytes, in the same order. + let output = '' + + for (let i = 0; i < input.length; i++) { + output += String.fromCharCode(input[i]) + } + + return output +} + /** * @param {ReadableStreamController} controller */ @@ -870,6 +894,22 @@ function readableStreamClose (controller) { } } +/** + * @see https://infra.spec.whatwg.org/#isomorphic-encode + * @param {string} input + */ +function isomorphicEncode (input) { + // 1. Assert: input contains no code points greater than U+00FF. + for (let i = 0; i < input.length; i++) { + assert(input.charCodeAt(i) <= 0xFF) + } + + // 2. Return a byte sequence whose length is equal to input’s code + // point length and whose bytes have the same values as the + // values of input’s code points, in the same order + return input +} + /** * Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0. */ @@ -912,5 +952,7 @@ module.exports = { fullyReadBody, bytesMatch, isReadableStreamLike, - readableStreamClose + readableStreamClose, + isomorphicEncode, + isomorphicDecode } diff --git a/deps/undici/src/lib/fetch/webidl.js b/deps/undici/src/lib/fetch/webidl.js index cd42de2ac8adf5..32c1befab000d7 100644 --- a/deps/undici/src/lib/fetch/webidl.js +++ b/deps/undici/src/lib/fetch/webidl.js @@ -3,30 +3,16 @@ const { types } = require('util') const { hasOwn, toUSVString } = require('./util') +/** @type {import('../../types/webidl').Webidl} */ const webidl = {} webidl.converters = {} webidl.util = {} webidl.errors = {} -/** - * - * @param {{ - * header: string - * message: string - * }} message - */ webidl.errors.exception = function (message) { - throw new TypeError(`${message.header}: ${message.message}`) + return new TypeError(`${message.header}: ${message.message}`) } -/** - * Throw an error when conversion from one type to another has failed - * @param {{ - * prefix: string - * argument: string - * types: string[] - * }} context - */ webidl.errors.conversionFailed = function (context) { const plural = context.types.length === 1 ? '' : ' one of' const message = @@ -39,14 +25,6 @@ webidl.errors.conversionFailed = function (context) { }) } -/** - * Throw an error when an invalid argument is provided - * @param {{ - * prefix: string - * value: string - * type: string - * }} context - */ webidl.errors.invalidArgument = function (context) { return webidl.errors.exception({ header: context.prefix, @@ -54,6 +32,23 @@ webidl.errors.invalidArgument = function (context) { }) } +// https://webidl.spec.whatwg.org/#implements +webidl.brandCheck = function (V, I) { + if (!(V instanceof I)) { + throw new TypeError('Illegal invocation') + } +} + +webidl.argumentLengthCheck = function ({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? 's' : ''} required, ` + + `but${length ? ' only' : ''} ${length} found.`, + ...ctx + }) + } +} + // https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values webidl.util.Type = function (V) { switch (typeof V) { @@ -113,7 +108,7 @@ webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) { let x = Number(V) // 5. If x is −0, then set x to +0. - if (Object.is(-0, x)) { + if (x === 0) { x = 0 } @@ -126,7 +121,7 @@ webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) { x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY ) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Integer conversion', message: `Could not convert ${V} to an integer.` }) @@ -138,7 +133,7 @@ webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) { // 3. If x < lowerBound or x > upperBound, then // throw a TypeError. if (x < lowerBound || x > upperBound) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Integer conversion', message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` }) @@ -171,7 +166,7 @@ webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) { // 8. If x is NaN, +0, +∞, or −∞, then return +0. if ( Number.isNaN(x) || - Object.is(0, x) || + (x === 0 && Object.is(0, x)) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY ) { @@ -213,7 +208,7 @@ webidl.sequenceConverter = function (converter) { return (V) => { // 1. If Type(V) is not Object, throw a TypeError. if (webidl.util.Type(V) !== 'Object') { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Sequence', message: `Value of type ${webidl.util.Type(V)} is not an Object.` }) @@ -229,7 +224,7 @@ webidl.sequenceConverter = function (converter) { method === undefined || typeof method.next !== 'function' ) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Sequence', message: 'Object is not an iterator.' }) @@ -255,7 +250,7 @@ webidl.recordConverter = function (keyConverter, valueConverter) { return (O) => { // 1. If Type(O) is not Object, throw a TypeError. if (webidl.util.Type(O) !== 'Object') { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Record', message: `Value of type ${webidl.util.Type(O)} is not an Object.` }) @@ -314,7 +309,7 @@ webidl.recordConverter = function (keyConverter, valueConverter) { webidl.interfaceConverter = function (i) { return (V, opts = {}) => { if (opts.strict !== false && !(V instanceof i)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: i.name, message: `Expected ${V} to be an instance of ${i.name}.` }) @@ -324,16 +319,6 @@ webidl.interfaceConverter = function (i) { } } -/** - * @param {{ - * key: string, - * defaultValue?: any, - * required?: boolean, - * converter: (...args: unknown[]) => unknown, - * allowedValues?: any[] - * }[]} converters - * @returns - */ webidl.dictionaryConverter = function (converters) { return (dictionary) => { const type = webidl.util.Type(dictionary) @@ -342,7 +327,7 @@ webidl.dictionaryConverter = function (converters) { if (type === 'Null' || type === 'Undefined') { return dict } else if (type !== 'Object') { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Dictionary', message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` }) @@ -353,7 +338,7 @@ webidl.dictionaryConverter = function (converters) { if (required === true) { if (!hasOwn(dictionary, key)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Dictionary', message: `Missing required key "${key}".` }) @@ -379,7 +364,7 @@ webidl.dictionaryConverter = function (converters) { options.allowedValues && !options.allowedValues.includes(value) ) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'Dictionary', message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.` }) @@ -450,7 +435,6 @@ webidl.converters.ByteString = function (V) { } // https://webidl.spec.whatwg.org/#es-USVString -// TODO: ensure that util.toUSVString follows webidl spec webidl.converters.USVString = toUSVString // https://webidl.spec.whatwg.org/#es-boolean @@ -469,9 +453,9 @@ webidl.converters.any = function (V) { } // https://webidl.spec.whatwg.org/#es-long-long -webidl.converters['long long'] = function (V, opts) { +webidl.converters['long long'] = function (V) { // 1. Let x be ? ConvertToInt(V, 64, "signed"). - const x = webidl.util.ConvertToInt(V, 64, 'signed', opts) + const x = webidl.util.ConvertToInt(V, 64, 'signed') // 2. Return the IDL long long value that represents // the same numeric value as x. @@ -509,7 +493,7 @@ webidl.converters.ArrayBuffer = function (V, opts = {}) { webidl.util.Type(V) !== 'Object' || !types.isAnyArrayBuffer(V) ) { - webidl.errors.conversionFailed({ + throw webidl.errors.conversionFailed({ prefix: `${V}`, argument: `${V}`, types: ['ArrayBuffer'] @@ -521,7 +505,7 @@ webidl.converters.ArrayBuffer = function (V, opts = {}) { // IsSharedArrayBuffer(V) is true, then throw a // TypeError. if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' }) @@ -549,7 +533,7 @@ webidl.converters.TypedArray = function (V, T, opts = {}) { !types.isTypedArray(V) || V.constructor.name !== T.name ) { - webidl.errors.conversionFailed({ + throw webidl.errors.conversionFailed({ prefix: `${T.name}`, argument: `${V}`, types: [T.name] @@ -561,7 +545,7 @@ webidl.converters.TypedArray = function (V, T, opts = {}) { // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is // true, then throw a TypeError. if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' }) @@ -582,7 +566,7 @@ webidl.converters.DataView = function (V, opts = {}) { // 1. If Type(V) is not Object, or V does not have a // [[DataView]] internal slot, then throw a TypeError. if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'DataView', message: 'Object is not a DataView.' }) @@ -593,7 +577,7 @@ webidl.converters.DataView = function (V, opts = {}) { // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true, // then throw a TypeError. if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: 'ArrayBuffer', message: 'SharedArrayBuffer is not allowed.' }) diff --git a/deps/undici/src/lib/fileapi/filereader.js b/deps/undici/src/lib/fileapi/filereader.js index fa18e8eb59354b..9a8bdd90335b87 100644 --- a/deps/undici/src/lib/fileapi/filereader.js +++ b/deps/undici/src/lib/fileapi/filereader.js @@ -37,15 +37,9 @@ class FileReader extends EventTarget { * @param {import('buffer').Blob} blob */ readAsArrayBuffer (blob) { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) - if (arguments.length === 0) { - throw new TypeError( - 'Failed to execute \'readAsArrayBuffer\' on \'FileReader\': 1 argument required, but 0 present.' - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsArrayBuffer' }) blob = webidl.converters.Blob(blob, { strict: false }) @@ -59,15 +53,9 @@ class FileReader extends EventTarget { * @param {import('buffer').Blob} blob */ readAsBinaryString (blob) { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) - if (arguments.length === 0) { - throw new TypeError( - 'Failed to execute \'readAsBinaryString\' on \'FileReader\': 1 argument required, but 0 present.' - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsBinaryString' }) blob = webidl.converters.Blob(blob, { strict: false }) @@ -82,15 +70,9 @@ class FileReader extends EventTarget { * @param {string?} encoding */ readAsText (blob, encoding = undefined) { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) - if (arguments.length === 0) { - throw new TypeError( - 'Failed to execute \'readAsText\' on \'FileReader\': 1 argument required, but 0 present.' - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsText' }) blob = webidl.converters.Blob(blob, { strict: false }) @@ -108,15 +90,9 @@ class FileReader extends EventTarget { * @param {import('buffer').Blob} blob */ readAsDataURL (blob) { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) - if (arguments.length === 0) { - throw new TypeError( - 'Failed to execute \'readAsDataURL\' on \'FileReader\': 1 argument required, but 0 present.' - ) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsDataURL' }) blob = webidl.converters.Blob(blob, { strict: false }) @@ -166,9 +142,7 @@ class FileReader extends EventTarget { * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate */ get readyState () { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) switch (this[kState]) { case 'empty': return this.EMPTY @@ -181,9 +155,7 @@ class FileReader extends EventTarget { * @see https://w3c.github.io/FileAPI/#dom-filereader-result */ get result () { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) // The result attribute’s getter, when invoked, must return // this's result. @@ -194,9 +166,7 @@ class FileReader extends EventTarget { * @see https://w3c.github.io/FileAPI/#dom-filereader-error */ get error () { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) // The error attribute’s getter, when invoked, must return // this's error. @@ -204,17 +174,13 @@ class FileReader extends EventTarget { } get onloadend () { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) return this[kEvents].loadend } set onloadend (fn) { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) if (typeof fn === 'function') { this[kEvents].loadend = fn @@ -224,17 +190,13 @@ class FileReader extends EventTarget { } get onerror () { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) return this[kEvents].error } set onerror (fn) { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) if (typeof fn === 'function') { this[kEvents].error = fn @@ -244,17 +206,13 @@ class FileReader extends EventTarget { } get onloadstart () { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) return this[kEvents].loadstart } set onloadstart (fn) { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) if (typeof fn === 'function') { this[kEvents].loadstart = fn @@ -264,17 +222,13 @@ class FileReader extends EventTarget { } get onprogress () { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) return this[kEvents].progress } set onprogress (fn) { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) if (typeof fn === 'function') { this[kEvents].progress = fn @@ -284,17 +238,13 @@ class FileReader extends EventTarget { } get onload () { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) return this[kEvents].load } set onload (fn) { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) if (typeof fn === 'function') { this[kEvents].load = fn @@ -304,17 +254,13 @@ class FileReader extends EventTarget { } get onabort () { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) return this[kEvents].abort } set onabort (fn) { - if (!(this instanceof FileReader)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, FileReader) if (typeof fn === 'function') { this[kEvents].abort = fn diff --git a/deps/undici/src/lib/fileapi/progressevent.js b/deps/undici/src/lib/fileapi/progressevent.js index ab3c6191e2dd54..778cf224c6a689 100644 --- a/deps/undici/src/lib/fileapi/progressevent.js +++ b/deps/undici/src/lib/fileapi/progressevent.js @@ -22,25 +22,19 @@ class ProgressEvent extends Event { } get lengthComputable () { - if (!(this instanceof ProgressEvent)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, ProgressEvent) return this[kState].lengthComputable } get loaded () { - if (!(this instanceof ProgressEvent)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, ProgressEvent) return this[kState].loaded } get total () { - if (!(this instanceof ProgressEvent)) { - throw new TypeError('Illegal invocation') - } + webidl.brandCheck(this, ProgressEvent) return this[kState].total } diff --git a/deps/undici/src/lib/mock/mock-utils.js b/deps/undici/src/lib/mock/mock-utils.js index 7d5ca5071d9470..9dc414d0a3578f 100644 --- a/deps/undici/src/lib/mock/mock-utils.js +++ b/deps/undici/src/lib/mock/mock-utils.js @@ -10,6 +10,11 @@ const { } = require('./mock-symbols') const { buildURL, nop } = require('../core/util') const { STATUS_CODES } = require('http') +const { + types: { + isPromise + } +} = require('util') function matchValue (match, value) { if (typeof match === 'string') { @@ -241,14 +246,27 @@ function mockDispatch (opts, handler) { handleReply(this[kDispatches]) } - function handleReply (mockDispatches) { + function handleReply (mockDispatches, _data = data) { // fetch's HeadersList is a 1D string array const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers - const responseData = getResponseData( - typeof data === 'function' ? data({ ...opts, headers: optsHeaders }) : data - ) + const body = typeof _data === 'function' + ? _data({ ...opts, headers: optsHeaders }) + : _data + + // util.types.isPromise is likely needed for jest. + if (isPromise(body)) { + // If handleReply is asynchronous, throwing an error + // in the callback will reject the promise, rather than + // synchronously throw the error, which breaks some tests. + // Rather, we wait for the callback to resolve if it is a + // promise, and then re-run handleReply with the new body. + body.then((newData) => handleReply(mockDispatches, newData)) + return + } + + const responseData = getResponseData(body) const responseHeaders = generateKeyValues(headers) const responseTrailers = generateKeyValues(trailers) diff --git a/deps/undici/src/package.json b/deps/undici/src/package.json index c82f1a6e5ab61f..a192b2d674ce61 100644 --- a/deps/undici/src/package.json +++ b/deps/undici/src/package.json @@ -1,6 +1,6 @@ { "name": "undici", - "version": "5.12.0", + "version": "5.13.0", "description": "An HTTP/1.1 client, written from scratch for Node.js", "homepage": "https://undici.nodejs.org", "bugs": { @@ -52,7 +52,7 @@ "test:jest": "node scripts/verifyVersion.js 14 || jest", "test:tap": "tap test/*.js test/diagnostics-channel/*.js", "test:tdd": "tap test/*.js test/diagnostics-channel/*.js -w", - "test:typescript": "tsd", + "test:typescript": "tsd && tsc test/imports/undici-import.ts", "test:wpt": "node scripts/verifyVersion 18 || (node test/wpt/start-fetch.mjs && node test/wpt/start-FileAPI.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs)", "coverage": "nyc --reporter=text --reporter=html npm run test", "coverage:ci": "nyc --reporter=lcov npm run test", @@ -95,6 +95,7 @@ "table": "^6.8.0", "tap": "^16.1.0", "tsd": "^0.24.1", + "typescript": "^4.8.4", "wait-on": "^6.0.0" }, "engines": { @@ -116,8 +117,7 @@ "compilerOptions": { "esModuleInterop": true, "lib": [ - "esnext", - "DOM" + "esnext" ] } }, diff --git a/deps/undici/src/types/agent.d.ts b/deps/undici/src/types/agent.d.ts index c09260b29130f0..0813735805824e 100644 --- a/deps/undici/src/types/agent.d.ts +++ b/deps/undici/src/types/agent.d.ts @@ -1,9 +1,8 @@ import { URL } from 'url' -import Dispatcher = require('./dispatcher') -import Pool = require('./pool') -import {DispatchInterceptor} from "./dispatcher"; +import Pool from './pool' +import Dispatcher from "./dispatcher"; -export = Agent +export default Agent declare class Agent extends Dispatcher{ constructor(opts?: Agent.Options) @@ -22,7 +21,7 @@ declare namespace Agent { /** Integer. Default: `0` */ maxRedirections?: number; - interceptors?: { Agent?: readonly DispatchInterceptor[] } & Pool.Options["interceptors"] + interceptors?: { Agent?: readonly Dispatcher.DispatchInterceptor[] } & Pool.Options["interceptors"] } export interface DispatchOptions extends Dispatcher.DispatchOptions { diff --git a/deps/undici/src/types/api.d.ts b/deps/undici/src/types/api.d.ts index 4bc3183e84eb09..400341dddc06f7 100644 --- a/deps/undici/src/types/api.d.ts +++ b/deps/undici/src/types/api.d.ts @@ -1,6 +1,6 @@ import { URL, UrlObject } from 'url' import { Duplex } from 'stream' -import Dispatcher = require('./dispatcher') +import Dispatcher from './dispatcher' export { request, diff --git a/deps/undici/src/types/balanced-pool.d.ts b/deps/undici/src/types/balanced-pool.d.ts index 5a765e15e10f21..b5de726eeca0e1 100644 --- a/deps/undici/src/types/balanced-pool.d.ts +++ b/deps/undici/src/types/balanced-pool.d.ts @@ -1,9 +1,8 @@ -import Client = require('./client') -import Pool = require('./pool') -import Dispatcher = require('./dispatcher') +import Pool from './pool' +import Dispatcher from './dispatcher' import { URL } from 'url' -export = BalancedPool +export default BalancedPool declare class BalancedPool extends Dispatcher { constructor(url: string | URL | string[], options?: Pool.Options); diff --git a/deps/undici/src/types/client.d.ts b/deps/undici/src/types/client.d.ts index d87f08f1a08ff0..3a954ac83a1b74 100644 --- a/deps/undici/src/types/client.d.ts +++ b/deps/undici/src/types/client.d.ts @@ -1,10 +1,10 @@ import { URL } from 'url' import { TlsOptions } from 'tls' -import Dispatcher = require('./dispatcher') -import {DispatchInterceptor} from './dispatcher' -import buildConnector, {connector} from "./connector"; +import Dispatcher from './dispatcher' +import DispatchInterceptor from './dispatcher' +import buildConnector from "./connector"; -export = Client +export default Client /** A basic HTTP/1.1 client, mapped on top a single TCP/TLS connection. Pipelining is disabled by default. */ declare class Client extends Dispatcher { @@ -28,7 +28,7 @@ declare namespace Client { /** The amount of concurrent requests to be sent over the single TCP/TLS connection according to [RFC7230](https://tools.ietf.org/html/rfc7230#section-6.3.2). Default: `1`. */ pipelining?: number | null; /** **/ - connect?: buildConnector.BuildOptions | connector | null; + connect?: buildConnector.BuildOptions | buildConnector.connector | null; /** The maximum length of request headers in bytes. Default: `16384` (16KiB). */ maxHeaderSize?: number | null; /** The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Default: `30e3` milliseconds (30s). */ diff --git a/deps/undici/src/types/connector.d.ts b/deps/undici/src/types/connector.d.ts index 9a47f87e59919f..8a425d2972c0c8 100644 --- a/deps/undici/src/types/connector.d.ts +++ b/deps/undici/src/types/connector.d.ts @@ -1,7 +1,7 @@ -import {TLSSocket, ConnectionOptions} from 'tls' -import {IpcNetConnectOpts, Socket, TcpNetConnectOpts} from 'net' +import { TLSSocket, ConnectionOptions } from 'tls' +import { IpcNetConnectOpts, Socket, TcpNetConnectOpts } from 'net' -export = buildConnector +export default buildConnector declare function buildConnector (options?: buildConnector.BuildOptions): buildConnector.connector declare namespace buildConnector { diff --git a/deps/undici/src/types/diagnostics-channel.d.ts b/deps/undici/src/types/diagnostics-channel.d.ts index 6c754491b89f3f..85d44823978df5 100644 --- a/deps/undici/src/types/diagnostics-channel.d.ts +++ b/deps/undici/src/types/diagnostics-channel.d.ts @@ -1,13 +1,13 @@ import { Socket } from "net"; import { URL } from "url"; -import { connector } from "./connector"; -import { HttpMethod } from "./dispatcher"; +import Connector from "./connector"; +import Dispatcher from "./dispatcher"; declare namespace DiagnosticsChannel { interface Request { origin?: string | URL; completed: boolean; - method?: HttpMethod; + method?: Dispatcher.HttpMethod; path: string; headers: string; addHeader(key: string, value: string): Request; @@ -25,7 +25,7 @@ declare namespace DiagnosticsChannel { port: URL["port"]; servername: string | null; } - type Connector = connector; + type Connector = Connector.connector; export interface RequestCreateMessage { request: Request; } diff --git a/deps/undici/src/types/dispatcher.d.ts b/deps/undici/src/types/dispatcher.d.ts index cbd558a932f848..adc95b9a0f336f 100644 --- a/deps/undici/src/types/dispatcher.d.ts +++ b/deps/undici/src/types/dispatcher.d.ts @@ -3,13 +3,13 @@ import { Duplex, Readable, Writable } from 'stream' import { EventEmitter } from 'events' import { IncomingHttpHeaders } from 'http' import { Blob } from 'buffer' -import type BodyReadable from './readable' +import BodyReadable from './readable' import { FormData } from './formdata' -import { UndiciError } from './errors' +import Errors from './errors' type AbortSignal = unknown; -export = Dispatcher; +export default Dispatcher /** Dispatcher is the core API used to dispatch requests. */ declare class Dispatcher extends EventEmitter { @@ -39,56 +39,56 @@ declare class Dispatcher extends EventEmitter { destroy(err: Error | null, callback: () => void): void; on(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - on(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; - on(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; + on(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; + on(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; on(eventName: 'drain', callback: (origin: URL) => void): this; once(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - once(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; - once(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; + once(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; + once(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; once(eventName: 'drain', callback: (origin: URL) => void): this; off(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - off(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; - off(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; + off(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; + off(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; off(eventName: 'drain', callback: (origin: URL) => void): this; addListener(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - addListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; - addListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; + addListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; + addListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; addListener(eventName: 'drain', callback: (origin: URL) => void): this; removeListener(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - removeListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; - removeListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; + removeListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; + removeListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; removeListener(eventName: 'drain', callback: (origin: URL) => void): this; prependListener(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - prependListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; - prependListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; + prependListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; + prependListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; prependListener(eventName: 'drain', callback: (origin: URL) => void): this; prependOnceListener(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - prependOnceListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; - prependOnceListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void): this; + prependOnceListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; + prependOnceListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; prependOnceListener(eventName: 'drain', callback: (origin: URL) => void): this; listeners(eventName: 'connect'): ((origin: URL, targets: readonly Dispatcher[]) => void)[] - listeners(eventName: 'disconnect'): ((origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void)[]; - listeners(eventName: 'connectionError'): ((origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void)[]; + listeners(eventName: 'disconnect'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[]; + listeners(eventName: 'connectionError'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[]; listeners(eventName: 'drain'): ((origin: URL) => void)[]; rawListeners(eventName: 'connect'): ((origin: URL, targets: readonly Dispatcher[]) => void)[] - rawListeners(eventName: 'disconnect'): ((origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void)[]; - rawListeners(eventName: 'connectionError'): ((origin: URL, targets: readonly Dispatcher[], error: UndiciError) => void)[]; + rawListeners(eventName: 'disconnect'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[]; + rawListeners(eventName: 'connectionError'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[]; rawListeners(eventName: 'drain'): ((origin: URL) => void)[]; emit(eventName: 'connect', origin: URL, targets: readonly Dispatcher[]): boolean; - emit(eventName: 'disconnect', origin: URL, targets: readonly Dispatcher[], error: UndiciError): boolean; - emit(eventName: 'connectionError', origin: URL, targets: readonly Dispatcher[], error: UndiciError): boolean; + emit(eventName: 'disconnect', origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError): boolean; + emit(eventName: 'connectionError', origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError): boolean; emit(eventName: 'drain', origin: URL): boolean; } diff --git a/deps/undici/src/types/errors.d.ts b/deps/undici/src/types/errors.d.ts index 492e31eb228863..c4ef4b6f6333a1 100644 --- a/deps/undici/src/types/errors.d.ts +++ b/deps/undici/src/types/errors.d.ts @@ -1,7 +1,7 @@ import {IncomingHttpHeaders} from "http"; +import Client from './client' -export = Errors -import { SocketInfo } from './client' +export default Errors declare namespace Errors { export class UndiciError extends Error { } @@ -79,7 +79,7 @@ declare namespace Errors { export class SocketError extends UndiciError { name: 'SocketError'; code: 'UND_ERR_SOCKET'; - socket: SocketInfo | null + socket: Client.SocketInfo | null } /** Encountered unsupported functionality. */ diff --git a/deps/undici/src/types/fetch.d.ts b/deps/undici/src/types/fetch.d.ts index d38e0d61242093..58bd4d2a76919a 100644 --- a/deps/undici/src/types/fetch.d.ts +++ b/deps/undici/src/types/fetch.d.ts @@ -7,7 +7,7 @@ import { URL, URLSearchParams } from 'url' import { ReadableStream } from 'stream/web' import { FormData } from './formdata' -import Dispatcher = require('./dispatcher') +import Dispatcher from './dispatcher' export type RequestInfo = string | URL | Request diff --git a/deps/undici/src/types/filereader.d.ts b/deps/undici/src/types/filereader.d.ts index 8bd7e15c24237a..f05d231b2ffac7 100644 --- a/deps/undici/src/types/filereader.d.ts +++ b/deps/undici/src/types/filereader.d.ts @@ -1,8 +1,11 @@ /// import { Blob } from 'buffer' +import { DOMException, Event, EventInit, EventTarget } from './patch' + +export declare class FileReader { + __proto__: EventTarget & FileReader -export declare class FileReader extends EventTarget { constructor () readAsArrayBuffer (blob: Blob): void @@ -40,10 +43,12 @@ export interface ProgressEventInit extends EventInit { total?: number } -export declare class ProgressEvent extends Event { +export declare class ProgressEvent { + __proto__: Event & ProgressEvent + constructor (type: string, eventInitDict?: ProgressEventInit) readonly lengthComputable: boolean readonly loaded: number readonly total: number -} \ No newline at end of file +} diff --git a/deps/undici/src/types/global-dispatcher.d.ts b/deps/undici/src/types/global-dispatcher.d.ts index 56abd53d6cfd16..728f95ce23ce69 100644 --- a/deps/undici/src/types/global-dispatcher.d.ts +++ b/deps/undici/src/types/global-dispatcher.d.ts @@ -1,4 +1,4 @@ -import Dispatcher = require("./dispatcher"); +import Dispatcher from "./dispatcher"; export { getGlobalDispatcher, diff --git a/deps/undici/src/types/interceptors.d.ts b/deps/undici/src/types/interceptors.d.ts index a920ea982e8ab1..047ac175d5005f 100644 --- a/deps/undici/src/types/interceptors.d.ts +++ b/deps/undici/src/types/interceptors.d.ts @@ -1,5 +1,5 @@ -import {DispatchInterceptor} from "./dispatcher"; +import Dispatcher from "./dispatcher"; type RedirectInterceptorOpts = { maxRedirections?: number } -export declare function createRedirectInterceptor (opts: RedirectInterceptorOpts): DispatchInterceptor +export declare function createRedirectInterceptor (opts: RedirectInterceptorOpts): Dispatcher.DispatchInterceptor diff --git a/deps/undici/src/types/mock-agent.d.ts b/deps/undici/src/types/mock-agent.d.ts index 825d2aeff6dc80..98cd645b29bd16 100644 --- a/deps/undici/src/types/mock-agent.d.ts +++ b/deps/undici/src/types/mock-agent.d.ts @@ -1,9 +1,9 @@ -import Agent = require('./agent') -import Dispatcher = require('./dispatcher') +import Agent from './agent' +import Dispatcher from './dispatcher' import { Interceptable, MockInterceptor } from './mock-interceptor' import MockDispatch = MockInterceptor.MockDispatch; -export = MockAgent +export default MockAgent interface PendingInterceptor extends MockDispatch { origin: string; diff --git a/deps/undici/src/types/mock-client.d.ts b/deps/undici/src/types/mock-client.d.ts index 9e751f42f351ab..51d008cc11c5cb 100644 --- a/deps/undici/src/types/mock-client.d.ts +++ b/deps/undici/src/types/mock-client.d.ts @@ -1,9 +1,9 @@ -import Client = require('./client') -import Dispatcher = require('./dispatcher') -import MockAgent = require('./mock-agent') +import Client from './client' +import Dispatcher from './dispatcher' +import MockAgent from './mock-agent' import { MockInterceptor, Interceptable } from './mock-interceptor' -export = MockClient +export default MockClient /** MockClient extends the Client API and allows one to mock requests. */ declare class MockClient extends Client implements Interceptable { diff --git a/deps/undici/src/types/mock-errors.d.ts b/deps/undici/src/types/mock-errors.d.ts index 31e7ba23c7ffe2..3d9e727d70a46a 100644 --- a/deps/undici/src/types/mock-errors.d.ts +++ b/deps/undici/src/types/mock-errors.d.ts @@ -1,10 +1,10 @@ -import { UndiciError } from './errors' +import Errors from './errors' -export = MockErrors +export default MockErrors declare namespace MockErrors { /** The request does not match any registered mock dispatches. */ - export class MockNotMatchedError extends UndiciError { + export class MockNotMatchedError extends Errors.UndiciError { constructor(message?: string); name: 'MockNotMatchedError'; code: 'UND_MOCK_ERR_MOCK_NOT_MATCHED'; diff --git a/deps/undici/src/types/mock-interceptor.d.ts b/deps/undici/src/types/mock-interceptor.d.ts index 87eedcd406053f..9dc423c0600a8e 100644 --- a/deps/undici/src/types/mock-interceptor.d.ts +++ b/deps/undici/src/types/mock-interceptor.d.ts @@ -1,5 +1,5 @@ import { IncomingHttpHeaders } from 'http' -import Dispatcher = require('./dispatcher'); +import Dispatcher from './dispatcher'; import { BodyInit, Headers } from './fetch' export { diff --git a/deps/undici/src/types/mock-pool.d.ts b/deps/undici/src/types/mock-pool.d.ts index d0c905152680d4..39e709aaf69a2c 100644 --- a/deps/undici/src/types/mock-pool.d.ts +++ b/deps/undici/src/types/mock-pool.d.ts @@ -1,9 +1,9 @@ -import Pool = require('./pool') -import MockAgent = require('./mock-agent') +import Pool from './pool' +import MockAgent from './mock-agent' import { Interceptable, MockInterceptor } from './mock-interceptor' -import Dispatcher = require('./dispatcher') +import Dispatcher from './dispatcher' -export = MockPool +export default MockPool /** MockPool extends the Pool API and allows one to mock requests. */ declare class MockPool extends Pool implements Interceptable { diff --git a/deps/undici/src/types/patch.d.ts b/deps/undici/src/types/patch.d.ts new file mode 100644 index 00000000000000..f3500b589a4e52 --- /dev/null +++ b/deps/undici/src/types/patch.d.ts @@ -0,0 +1,51 @@ +/// + +// See https://github.com/nodejs/undici/issues/1740 + +export type DOMException = typeof globalThis extends { DOMException: infer T } + ? T + : any + +export type EventTarget = typeof globalThis extends { EventTarget: infer T } + ? T + : { + addEventListener( + type: string, + listener: any, + options?: any, + ): void + dispatchEvent(event: Event): boolean + removeEventListener( + type: string, + listener: any, + options?: any | boolean, + ): void + } + +export type Event = typeof globalThis extends { Event: infer T } + ? T + : { + readonly bubbles: boolean + cancelBubble: () => void + readonly cancelable: boolean + readonly composed: boolean + composedPath(): [EventTarget?] + readonly currentTarget: EventTarget | null + readonly defaultPrevented: boolean + readonly eventPhase: 0 | 2 + readonly isTrusted: boolean + preventDefault(): void + returnValue: boolean + readonly srcElement: EventTarget | null + stopImmediatePropagation(): void + stopPropagation(): void + readonly target: EventTarget | null + readonly timeStamp: number + readonly type: string + } + +export interface EventInit { + bubbles?: boolean + cancelable?: boolean + composed?: boolean +} diff --git a/deps/undici/src/types/pool-stats.d.ts b/deps/undici/src/types/pool-stats.d.ts index 807e68f1b81dad..8b6d2bff4ad416 100644 --- a/deps/undici/src/types/pool-stats.d.ts +++ b/deps/undici/src/types/pool-stats.d.ts @@ -1,6 +1,6 @@ -import Pool = require("./pool") +import Pool from "./pool" -export = PoolStats +export default PoolStats declare class PoolStats { constructor(pool: Pool); diff --git a/deps/undici/src/types/pool.d.ts b/deps/undici/src/types/pool.d.ts index 0ef0bc39884db9..7747d48261ba84 100644 --- a/deps/undici/src/types/pool.d.ts +++ b/deps/undici/src/types/pool.d.ts @@ -1,10 +1,9 @@ -import Client = require('./client') -import Dispatcher = require('./dispatcher') -import TPoolStats = require('./pool-stats') +import Client from './client' +import TPoolStats from './pool-stats' import { URL } from 'url' -import {DispatchInterceptor} from "./dispatcher"; +import Dispatcher from "./dispatcher"; -export = Pool +export default Pool declare class Pool extends Dispatcher { constructor(url: string | URL, options?: Pool.Options) @@ -24,6 +23,6 @@ declare namespace Pool { /** The max number of clients to create. `null` if no limit. Default `null`. */ connections?: number | null; - interceptors?: { Pool?: readonly DispatchInterceptor[] } & Client.Options["interceptors"] + interceptors?: { Pool?: readonly Dispatcher.DispatchInterceptor[] } & Client.Options["interceptors"] } } diff --git a/deps/undici/src/types/proxy-agent.d.ts b/deps/undici/src/types/proxy-agent.d.ts index 118165d00d0cd4..5e3718e9f349e7 100644 --- a/deps/undici/src/types/proxy-agent.d.ts +++ b/deps/undici/src/types/proxy-agent.d.ts @@ -1,8 +1,8 @@ import { TlsOptions } from 'tls' -import Agent = require('./agent') -import Dispatcher = require('./dispatcher') +import Agent from './agent' +import Dispatcher from './dispatcher' -export = ProxyAgent +export default ProxyAgent declare class ProxyAgent extends Dispatcher { constructor(options: ProxyAgent.Options | string) diff --git a/deps/undici/src/types/readable.d.ts b/deps/undici/src/types/readable.d.ts index 0d82ba86776e7d..032b53b01f97a0 100644 --- a/deps/undici/src/types/readable.d.ts +++ b/deps/undici/src/types/readable.d.ts @@ -1,7 +1,7 @@ import { Readable } from "stream"; import { Blob } from 'buffer' -export = BodyReadable +export default BodyReadable declare class BodyReadable extends Readable { constructor( diff --git a/deps/undici/src/types/webidl.d.ts b/deps/undici/src/types/webidl.d.ts new file mode 100644 index 00000000000000..1b49fd6d769b0e --- /dev/null +++ b/deps/undici/src/types/webidl.d.ts @@ -0,0 +1,213 @@ +// These types are not exported, and are only used internally + +/** + * Take in an unknown value and return one that is of type T + */ +type Converter = (object: unknown) => T + +type SequenceConverter = (object: unknown) => T[] + +type RecordConverter = (object: unknown) => Record + +interface ConvertToIntOpts { + clamp?: boolean + enforceRange?: boolean +} + +interface WebidlErrors { + exception (opts: { header: string, message: string }): TypeError + /** + * @description Throw an error when conversion from one type to another has failed + */ + conversionFailed (opts: { + prefix: string + argument: string + types: string[] + }): TypeError + /** + * @description Throw an error when an invalid argument is provided + */ + invalidArgument (opts: { + prefix: string + value: string + type: string + }): TypeError +} + +interface WebidlUtil { + /** + * @see https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values + */ + Type (object: unknown): + | 'Undefined' + | 'Boolean' + | 'String' + | 'Symbol' + | 'Number' + | 'BigInt' + | 'Null' + | 'Object' + + /** + * @see https://webidl.spec.whatwg.org/#abstract-opdef-converttoint + */ + ConvertToInt ( + V: unknown, + bitLength: number, + signedness: 'signed' | 'unsigned', + opts?: ConvertToIntOpts + ): number + + /** + * @see https://webidl.spec.whatwg.org/#abstract-opdef-converttoint + */ + IntegerPart (N: number): number +} + +interface WebidlConverters { + /** + * @see https://webidl.spec.whatwg.org/#es-DOMString + */ + DOMString (V: unknown, opts?: { + legacyNullToEmptyString: boolean + }): string + + /** + * @see https://webidl.spec.whatwg.org/#es-ByteString + */ + ByteString (V: unknown): string + + /** + * @see https://webidl.spec.whatwg.org/#es-USVString + */ + USVString (V: unknown): string + + /** + * @see https://webidl.spec.whatwg.org/#es-boolean + */ + boolean (V: unknown): boolean + + /** + * @see https://webidl.spec.whatwg.org/#es-any + */ + any (V: Value): Value + + /** + * @see https://webidl.spec.whatwg.org/#es-long-long + */ + ['long long'] (V: unknown): number + + /** + * @see https://webidl.spec.whatwg.org/#es-unsigned-long-long + */ + ['unsigned long long'] (V: unknown): number + + /** + * @see https://webidl.spec.whatwg.org/#es-unsigned-short + */ + ['unsigned short'] (V: unknown): number + + /** + * @see https://webidl.spec.whatwg.org/#idl-ArrayBuffer + */ + ArrayBuffer (V: unknown): ArrayBufferLike + ArrayBuffer (V: unknown, opts: { allowShared: false }): ArrayBuffer + + /** + * @see https://webidl.spec.whatwg.org/#es-buffer-source-types + */ + TypedArray ( + V: unknown, + TypedArray: NodeJS.TypedArray | ArrayBufferLike + ): NodeJS.TypedArray | ArrayBufferLike + TypedArray ( + V: unknown, + TypedArray: NodeJS.TypedArray | ArrayBufferLike, + opts?: { allowShared: false } + ): NodeJS.TypedArray | ArrayBuffer + + /** + * @see https://webidl.spec.whatwg.org/#es-buffer-source-types + */ + DataView (V: unknown, opts?: { allowShared: boolean }): DataView + + /** + * @see https://webidl.spec.whatwg.org/#BufferSource + */ + BufferSource ( + V: unknown, + opts?: { allowShared: boolean } + ): NodeJS.TypedArray | ArrayBufferLike | DataView + + ['sequence']: SequenceConverter + + ['sequence>']: SequenceConverter + + ['record']: RecordConverter + + [Key: string]: (...args: any[]) => unknown +} + +export interface Webidl { + errors: WebidlErrors + util: WebidlUtil + converters: WebidlConverters + + /** + * @description Performs a brand-check on {@param V} to ensure it is a + * {@param cls} object. + */ + brandCheck (V: unknown, cls: Interface): asserts V is Interface + + /** + * @see https://webidl.spec.whatwg.org/#es-sequence + * @description Convert a value, V, to a WebIDL sequence type. + */ + sequenceConverter (C: Converter): SequenceConverter + + /** + * @see https://webidl.spec.whatwg.org/#es-to-record + * @description Convert a value, V, to a WebIDL record type. + */ + recordConverter ( + keyConverter: Converter, + valueConverter: Converter + ): RecordConverter + + /** + * Similar to {@link Webidl.brandCheck} but allows skipping the check if third party + * interfaces are allowed. + */ + interfaceConverter (cls: Interface): ( + V: unknown, + opts?: { strict: boolean } + ) => asserts V is typeof cls + + // TODO(@KhafraDev): a type could likely be implemented that can infer the return type + // from the converters given? + /** + * Converts a value, V, to a WebIDL dictionary types. Allows limiting which keys are + * allowed, values allowed, optional and required keys. Auto converts the value to + * a type given a converter. + */ + dictionaryConverter (converters: { + key: string, + defaultValue?: unknown, + required?: boolean, + converter: (...args: unknown[]) => unknown, + allowedValues?: unknown[] + }[]): (V: unknown) => Record + + /** + * @see https://webidl.spec.whatwg.org/#idl-nullable-type + * @description allows a type, V, to be null + */ + nullableConverter ( + converter: Converter + ): (V: unknown) => ReturnType | null + + argumentLengthCheck (args: { length: number }, min: number, context: { + header: string + message?: string + }): void +} diff --git a/deps/undici/undici.js b/deps/undici/undici.js index f8040e297b109a..8fd0c48f62b597 100644 --- a/deps/undici/undici.js +++ b/deps/undici/undici.js @@ -1,14 +1,8 @@ "use strict"; -var __defProp = Object.defineProperty; var __getOwnPropNames = Object.getOwnPropertyNames; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; -var __publicField = (obj, key, value) => { - __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); - return value; -}; // lib/core/symbols.js var require_symbols = __commonJS({ @@ -590,6 +584,88 @@ var require_constants = __commonJS({ var corsSafeListedMethods = ["GET", "HEAD", "POST"]; var nullBodyStatus = [101, 204, 205, 304]; var redirectStatus = [301, 302, 303, 307, 308]; + var badPorts = [ + "1", + "7", + "9", + "11", + "13", + "15", + "17", + "19", + "20", + "21", + "22", + "23", + "25", + "37", + "42", + "43", + "53", + "69", + "77", + "79", + "87", + "95", + "101", + "102", + "103", + "104", + "109", + "110", + "111", + "113", + "115", + "117", + "119", + "123", + "135", + "137", + "139", + "143", + "161", + "179", + "389", + "427", + "465", + "512", + "513", + "514", + "515", + "526", + "530", + "531", + "532", + "540", + "548", + "554", + "556", + "563", + "587", + "601", + "636", + "989", + "990", + "993", + "995", + "1719", + "1720", + "1723", + "2049", + "3659", + "4045", + "5060", + "5061", + "6000", + "6566", + "6665", + "6666", + "6667", + "6668", + "6669", + "6697", + "10080" + ]; var referrerPolicy = [ "", "no-referrer", @@ -619,6 +695,9 @@ var require_constants = __commonJS({ "content-location", "content-type" ]; + var requestDuplex = [ + "half" + ]; var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; var subresource = [ "audio", @@ -668,7 +747,9 @@ var require_constants = __commonJS({ redirectStatus, corsSafeListedMethods, nullBodyStatus, - safeMethods + safeMethods, + badPorts, + requestDuplex }; } }); @@ -677,7 +758,7 @@ var require_constants = __commonJS({ var require_util2 = __commonJS({ "lib/fetch/util.js"(exports2, module2) { "use strict"; - var { redirectStatus } = require_constants(); + var { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = require_constants(); var { performance: performance2 } = require("perf_hooks"); var { isBlobLike, toUSVString, ReadableStreamFrom } = require_util(); var assert = require("assert"); @@ -687,88 +768,6 @@ var require_util2 = __commonJS({ crypto = require("crypto"); } catch { } - var badPorts = [ - "1", - "7", - "9", - "11", - "13", - "15", - "17", - "19", - "20", - "21", - "22", - "23", - "25", - "37", - "42", - "43", - "53", - "69", - "77", - "79", - "87", - "95", - "101", - "102", - "103", - "104", - "109", - "110", - "111", - "113", - "115", - "117", - "119", - "123", - "135", - "137", - "139", - "143", - "161", - "179", - "389", - "427", - "465", - "512", - "513", - "514", - "515", - "526", - "530", - "531", - "532", - "540", - "548", - "554", - "556", - "563", - "587", - "601", - "636", - "989", - "990", - "993", - "995", - "1719", - "1720", - "1723", - "2049", - "3659", - "4045", - "5060", - "5061", - "6000", - "6566", - "6665", - "6666", - "6667", - "6668", - "6669", - "6697", - "10080" - ]; function responseURL(response) { const urlList = response.urlList; const length = urlList.length; @@ -826,12 +825,7 @@ var require_util2 = __commonJS({ if (potentialValue.length === 0) { return false; } - for (const char of potentialValue) { - if (!isValidHTTPToken(char)) { - return false; - } - } - return true; + return isValidHTTPToken(potentialValue); } function isValidHeaderValue(potentialValue) { if (potentialValue.startsWith(" ") || potentialValue.startsWith(" ") || potentialValue.endsWith(" ") || potentialValue.endsWith(" ")) { @@ -843,7 +837,18 @@ var require_util2 = __commonJS({ return true; } function setRequestReferrerPolicyOnRedirect(request, actualResponse) { - const policy = ""; + const { headersList } = actualResponse; + const policyHeader = (headersList.get("referrer-policy") ?? "").split(","); + let policy = ""; + if (policyHeader.length > 0) { + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.includes(token)) { + policy = token; + break; + } + } + } if (policy !== "") { request.referrerPolicy = policy; } @@ -1152,6 +1157,13 @@ var require_util2 = __commonJS({ } return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; } + function isomorphicDecode(input) { + let output = ""; + for (let i = 0; i < input.length; i++) { + output += String.fromCharCode(input[i]); + } + return output; + } function readableStreamClose(controller) { try { controller.close(); @@ -1161,6 +1173,12 @@ var require_util2 = __commonJS({ } } } + function isomorphicEncode(input) { + for (let i = 0; i < input.length; i++) { + assert(input.charCodeAt(i) <= 255); + } + return input; + } var hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); module2.exports = { isAborted, @@ -1199,7 +1217,9 @@ var require_util2 = __commonJS({ fullyReadBody, bytesMatch, isReadableStreamLike, - readableStreamClose + readableStreamClose, + isomorphicEncode, + isomorphicDecode }; } }); @@ -1215,7 +1235,7 @@ var require_webidl = __commonJS({ webidl.util = {}; webidl.errors = {}; webidl.errors.exception = function(message) { - throw new TypeError(`${message.header}: ${message.message}`); + return new TypeError(`${message.header}: ${message.message}`); }; webidl.errors.conversionFailed = function(context) { const plural = context.types.length === 1 ? "" : " one of"; @@ -1231,6 +1251,19 @@ var require_webidl = __commonJS({ message: `"${context.value}" is an invalid ${context.type}.` }); }; + webidl.brandCheck = function(V, I) { + if (!(V instanceof I)) { + throw new TypeError("Illegal invocation"); + } + }; + webidl.argumentLengthCheck = function({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, + ...ctx + }); + } + }; webidl.util.Type = function(V) { switch (typeof V) { case "undefined": @@ -1272,19 +1305,19 @@ var require_webidl = __commonJS({ upperBound = Math.pow(2, bitLength - 1) - 1; } let x = Number(V); - if (Object.is(-0, x)) { + if (x === 0) { x = 0; } if (opts.enforceRange === true) { if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Integer conversion", message: `Could not convert ${V} to an integer.` }); } x = webidl.util.IntegerPart(x); if (x < lowerBound || x > upperBound) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Integer conversion", message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` }); @@ -1300,7 +1333,7 @@ var require_webidl = __commonJS({ } return x; } - if (Number.isNaN(x) || Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { return 0; } x = webidl.util.IntegerPart(x); @@ -1320,7 +1353,7 @@ var require_webidl = __commonJS({ webidl.sequenceConverter = function(converter) { return (V) => { if (webidl.util.Type(V) !== "Object") { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Sequence", message: `Value of type ${webidl.util.Type(V)} is not an Object.` }); @@ -1328,7 +1361,7 @@ var require_webidl = __commonJS({ const method = V?.[Symbol.iterator]?.(); const seq = []; if (method === void 0 || typeof method.next !== "function") { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Sequence", message: "Object is not an iterator." }); @@ -1346,7 +1379,7 @@ var require_webidl = __commonJS({ webidl.recordConverter = function(keyConverter, valueConverter) { return (O) => { if (webidl.util.Type(O) !== "Object") { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Record", message: `Value of type ${webidl.util.Type(O)} is not an Object.` }); @@ -1376,7 +1409,7 @@ var require_webidl = __commonJS({ webidl.interfaceConverter = function(i) { return (V, opts = {}) => { if (opts.strict !== false && !(V instanceof i)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: i.name, message: `Expected ${V} to be an instance of ${i.name}.` }); @@ -1391,7 +1424,7 @@ var require_webidl = __commonJS({ if (type === "Null" || type === "Undefined") { return dict; } else if (type !== "Object") { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Dictionary", message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` }); @@ -1400,7 +1433,7 @@ var require_webidl = __commonJS({ const { key, defaultValue, required, converter } = options; if (required === true) { if (!hasOwn(dictionary, key)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Dictionary", message: `Missing required key "${key}".` }); @@ -1414,7 +1447,7 @@ var require_webidl = __commonJS({ if (required || hasDefault || value !== void 0) { value = converter(value); if (options.allowedValues && !options.allowedValues.includes(value)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Dictionary", message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` }); @@ -1460,8 +1493,8 @@ var require_webidl = __commonJS({ webidl.converters.any = function(V) { return V; }; - webidl.converters["long long"] = function(V, opts) { - const x = webidl.util.ConvertToInt(V, 64, "signed", opts); + webidl.converters["long long"] = function(V) { + const x = webidl.util.ConvertToInt(V, 64, "signed"); return x; }; webidl.converters["unsigned long long"] = function(V) { @@ -1474,14 +1507,14 @@ var require_webidl = __commonJS({ }; webidl.converters.ArrayBuffer = function(V, opts = {}) { if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { - webidl.errors.conversionFailed({ + throw webidl.errors.conversionFailed({ prefix: `${V}`, argument: `${V}`, types: ["ArrayBuffer"] }); } if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "ArrayBuffer", message: "SharedArrayBuffer is not allowed." }); @@ -1490,14 +1523,14 @@ var require_webidl = __commonJS({ }; webidl.converters.TypedArray = function(V, T, opts = {}) { if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { - webidl.errors.conversionFailed({ + throw webidl.errors.conversionFailed({ prefix: `${T.name}`, argument: `${V}`, types: [T.name] }); } if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "ArrayBuffer", message: "SharedArrayBuffer is not allowed." }); @@ -1506,13 +1539,13 @@ var require_webidl = __commonJS({ }; webidl.converters.DataView = function(V, opts = {}) { if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "DataView", message: "Object is not a DataView." }); } if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "ArrayBuffer", message: "SharedArrayBuffer is not allowed." }); @@ -1562,7 +1595,7 @@ var require_headers = __commonJS({ if (Array.isArray(object)) { for (const header of object) { if (header.length !== 2) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Headers constructor", message: `expected name/value pair to be length 2, found ${header.length}.` }); @@ -1574,7 +1607,7 @@ var require_headers = __commonJS({ headers.append(key, value); } } else { - webidl.errors.conversionFailed({ + throw webidl.errors.conversionFailed({ prefix: "Headers constructor", argument: "Argument 1", types: ["sequence>", "record"] @@ -1620,15 +1653,10 @@ var require_headers = __commonJS({ return this[kHeadersMap].delete(name); } get(name) { - name = name.toLowerCase(); if (!this.contains(name)) { return null; } - return this[kHeadersMap].get(name) ?? null; - } - has(name) { - name = name.toLowerCase(); - return this[kHeadersMap].has(name); + return this[kHeadersMap].get(name.toLowerCase()) ?? null; } *[Symbol.iterator]() { for (const pair of this[kHeadersMap]) { @@ -1645,27 +1673,20 @@ var require_headers = __commonJS({ fill(this, init); } } - get [Symbol.toStringTag]() { - return this.constructor.name; - } append(name, value) { - if (!(this instanceof Headers)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 2) { - throw new TypeError(`Failed to execute 'append' on 'Headers': 2 arguments required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 2, { header: "Headers.append" }); name = webidl.converters.ByteString(name); value = webidl.converters.ByteString(value); value = headerValueNormalize(value); if (!isValidHeaderName(name)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: "Headers.append", value: name, type: "header name" }); } else if (!isValidHeaderValue(value)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: "Headers.append", value, type: "header value" @@ -1678,15 +1699,11 @@ var require_headers = __commonJS({ return this[kHeadersList].append(name, value); } delete(name) { - if (!(this instanceof Headers)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'delete' on 'Headers': 1 argument required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.delete" }); name = webidl.converters.ByteString(name); if (!isValidHeaderName(name)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: "Headers.delete", value: name, type: "header name" @@ -1702,15 +1719,11 @@ var require_headers = __commonJS({ return this[kHeadersList].delete(name); } get(name) { - if (!(this instanceof Headers)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'get' on 'Headers': 1 argument required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.get" }); name = webidl.converters.ByteString(name); if (!isValidHeaderName(name)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: "Headers.get", value: name, type: "header name" @@ -1719,15 +1732,11 @@ var require_headers = __commonJS({ return this[kHeadersList].get(name); } has(name) { - if (!(this instanceof Headers)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'has' on 'Headers': 1 argument required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.has" }); name = webidl.converters.ByteString(name); if (!isValidHeaderName(name)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: "Headers.has", value: name, type: "header name" @@ -1736,23 +1745,19 @@ var require_headers = __commonJS({ return this[kHeadersList].contains(name); } set(name, value) { - if (!(this instanceof Headers)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 2) { - throw new TypeError(`Failed to execute 'set' on 'Headers': 2 arguments required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 2, { header: "Headers.set" }); name = webidl.converters.ByteString(name); value = webidl.converters.ByteString(value); value = headerValueNormalize(value); if (!isValidHeaderName(name)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: "Headers.set", value: name, type: "header name" }); } else if (!isValidHeaderValue(value)) { - webidl.errors.invalidArgument({ + throw webidl.errors.invalidArgument({ prefix: "Headers.set", value, type: "header value" @@ -1771,30 +1776,20 @@ var require_headers = __commonJS({ return this[kHeadersList][kHeadersSortedMap]; } keys() { - if (!(this instanceof Headers)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Headers); return makeIterator(() => [...this[kHeadersSortedMap].entries()], "Headers", "key"); } values() { - if (!(this instanceof Headers)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Headers); return makeIterator(() => [...this[kHeadersSortedMap].entries()], "Headers", "value"); } entries() { - if (!(this instanceof Headers)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Headers); return makeIterator(() => [...this[kHeadersSortedMap].entries()], "Headers", "key+value"); } forEach(callbackFn, thisArg = globalThis) { - if (!(this instanceof Headers)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'forEach' on 'Headers': 1 argument required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.forEach" }); if (typeof callbackFn !== "function") { throw new TypeError("Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'."); } @@ -1803,9 +1798,7 @@ var require_headers = __commonJS({ } } [Symbol.for("nodejs.util.inspect.custom")]() { - if (!(this instanceof Headers)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Headers); return this[kHeadersList]; } }; @@ -1820,7 +1813,11 @@ var require_headers = __commonJS({ values: kEnumerableProperty, entries: kEnumerableProperty, forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false } + [Symbol.iterator]: { enumerable: false }, + [Symbol.toStringTag]: { + value: "Headers", + configurable: true + } }); webidl.converters.HeadersInit = function(V) { if (webidl.util.Type(V) === "Object") { @@ -1829,7 +1826,7 @@ var require_headers = __commonJS({ } return webidl.converters["record"](V); } - webidl.errors.conversionFailed({ + throw webidl.errors.conversionFailed({ prefix: "Headers constructor", argument: "Argument 1", types: ["sequence>", "record"] @@ -5541,7 +5538,8 @@ var require_dataURL = __commonJS({ "lib/fetch/dataURL.js"(exports2, module2) { var assert = require("assert"); var { atob: atob2 } = require("buffer"); - var { isValidHTTPToken } = require_util2(); + var { format } = require("url"); + var { isValidHTTPToken, isomorphicDecode } = require_util2(); var encoder = new TextEncoder(); function dataURLProcessor(dataURL) { assert(dataURL.protocol === "data:"); @@ -5558,7 +5556,7 @@ var require_dataURL = __commonJS({ const encodedBody = input.slice(mimeTypeLength + 1); let body = stringPercentDecode(encodedBody); if (/;(\u0020){0,}base64$/i.test(mimeType)) { - const stringBody = decodeURIComponent(new TextDecoder("utf-8").decode(body)); + const stringBody = isomorphicDecode(body); body = forgivingBase64(stringBody); if (body === "failure") { return "failure"; @@ -5577,32 +5575,7 @@ var require_dataURL = __commonJS({ return { mimeType: mimeTypeRecord, body }; } function URLSerializer(url, excludeFragment = false) { - let output = url.protocol; - if (url.host.length > 0) { - output += "//"; - if (url.username.length > 0 || url.password.length > 0) { - output += url.username; - if (url.password.length > 0) { - output += ":" + url.password; - } - output += "@"; - } - output += decodeURIComponent(url.hostname); - if (url.port.length > 0) { - output += ":" + url.port; - } - } - if (url.host.length === 0 && url.pathname.length > 1 && url.href.slice(url.protocol.length + 1)[0] === ".") { - output += "/."; - } - output += url.pathname; - if (url.search.length > 0) { - output += url.search; - } - if (excludeFragment === false && url.hash.length > 0) { - output += url.hash; - } - return output; + return format(url, { fragment: !excludeFragment }); } function collectASequenceOfCodePoints(condition, input, position) { let result = ""; @@ -5777,9 +5750,7 @@ var require_file = __commonJS({ var { kEnumerableProperty } = require_util(); var File = class extends Blob { constructor(fileBits, fileName, options = {}) { - if (arguments.length < 2) { - throw new TypeError("2 arguments required"); - } + webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); fileBits = webidl.converters["sequence"](fileBits); fileName = webidl.converters.USVString(fileName); options = webidl.converters.FilePropertyBag(options); @@ -5805,26 +5776,17 @@ var require_file = __commonJS({ }; } get name() { - if (!(this instanceof File)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, File); return this[kState].name; } get lastModified() { - if (!(this instanceof File)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, File); return this[kState].lastModified; } get type() { - if (!(this instanceof File)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, File); return this[kState].type; } - get [Symbol.toStringTag]() { - return this.constructor.name; - } }; var FileLike = class { constructor(blobLike, fileName, options = {}) { @@ -5839,51 +5801,35 @@ var require_file = __commonJS({ }; } stream(...args) { - if (!(this instanceof FileLike)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileLike); return this[kState].blobLike.stream(...args); } arrayBuffer(...args) { - if (!(this instanceof FileLike)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileLike); return this[kState].blobLike.arrayBuffer(...args); } slice(...args) { - if (!(this instanceof FileLike)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileLike); return this[kState].blobLike.slice(...args); } text(...args) { - if (!(this instanceof FileLike)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileLike); return this[kState].blobLike.text(...args); } get size() { - if (!(this instanceof FileLike)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileLike); return this[kState].blobLike.size; } get type() { - if (!(this instanceof FileLike)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileLike); return this[kState].blobLike.type; } get name() { - if (!(this instanceof FileLike)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileLike); return this[kState].name; } get lastModified() { - if (!(this instanceof FileLike)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileLike); return this[kState].lastModified; } get [Symbol.toStringTag]() { @@ -5891,6 +5837,10 @@ var require_file = __commonJS({ } }; Object.defineProperties(File.prototype, { + [Symbol.toStringTag]: { + value: "File", + configurable: true + }, name: kEnumerableProperty, lastModified: kEnumerableProperty }); @@ -5977,10 +5927,10 @@ var require_formdata = __commonJS({ var { File, FileLike, isFileLike } = require_file(); var { webidl } = require_webidl(); var { Blob } = require("buffer"); - var _FormData = class { + var FormData = class { constructor(form) { if (form !== void 0) { - webidl.errors.conversionFailed({ + throw webidl.errors.conversionFailed({ prefix: "FormData constructor", argument: "Argument 1", types: ["undefined"] @@ -5989,12 +5939,8 @@ var require_formdata = __commonJS({ this[kState] = []; } append(name, value, filename = void 0) { - if (!(this instanceof _FormData)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 2) { - throw new TypeError(`Failed to execute 'append' on 'FormData': 2 arguments required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); if (arguments.length === 3 && !isBlobLike(value)) { throw new TypeError("Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'"); } @@ -6005,12 +5951,8 @@ var require_formdata = __commonJS({ this[kState].push(entry); } delete(name) { - if (!(this instanceof _FormData)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'delete' on 'FormData': 1 arguments required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); name = webidl.converters.USVString(name); const next = []; for (const entry of this[kState]) { @@ -6021,12 +5963,8 @@ var require_formdata = __commonJS({ this[kState] = next; } get(name) { - if (!(this instanceof _FormData)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'get' on 'FormData': 1 arguments required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); name = webidl.converters.USVString(name); const idx = this[kState].findIndex((entry) => entry.name === name); if (idx === -1) { @@ -6035,32 +5973,20 @@ var require_formdata = __commonJS({ return this[kState][idx].value; } getAll(name) { - if (!(this instanceof _FormData)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'getAll' on 'FormData': 1 arguments required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); name = webidl.converters.USVString(name); return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); } has(name) { - if (!(this instanceof _FormData)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'has' on 'FormData': 1 arguments required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); name = webidl.converters.USVString(name); return this[kState].findIndex((entry) => entry.name === name) !== -1; } set(name, value, filename = void 0) { - if (!(this instanceof _FormData)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 2) { - throw new TypeError(`Failed to execute 'set' on 'FormData': 2 arguments required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); if (arguments.length === 3 && !isBlobLike(value)) { throw new TypeError("Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'"); } @@ -6079,34 +6005,21 @@ var require_formdata = __commonJS({ this[kState].push(entry); } } - get [Symbol.toStringTag]() { - return this.constructor.name; - } entries() { - if (!(this instanceof _FormData)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FormData); return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "key+value"); } keys() { - if (!(this instanceof _FormData)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FormData); return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "key"); } values() { - if (!(this instanceof _FormData)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FormData); return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "value"); } forEach(callbackFn, thisArg = globalThis) { - if (!(this instanceof _FormData)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'forEach' on 'FormData': 1 argument required, but only ${arguments.length} present.`); - } + webidl.brandCheck(this, FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.forEach" }); if (typeof callbackFn !== "function") { throw new TypeError("Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'."); } @@ -6115,9 +6028,13 @@ var require_formdata = __commonJS({ } } }; - var FormData = _FormData; - __publicField(FormData, "name", "FormData"); FormData.prototype[Symbol.iterator] = FormData.prototype.entries; + Object.defineProperties(FormData.prototype, { + [Symbol.toStringTag]: { + value: "FormData", + configurable: true + } + }); function makeEntry(name, value, filename) { name = Buffer.from(name).toString("utf8"); if (typeof value === "string") { @@ -6146,7 +6063,7 @@ var require_body = __commonJS({ "use strict"; var Busboy = require_lib(); var util = require_util(); - var { ReadableStreamFrom, toUSVString, isBlobLike, isReadableStreamLike, readableStreamClose } = require_util2(); + var { ReadableStreamFrom, isBlobLike, isReadableStreamLike, readableStreamClose } = require_util2(); var { FormData } = require_formdata(); var { kState } = require_symbols2(); var { webidl } = require_webidl(); @@ -6185,7 +6102,9 @@ var require_body = __commonJS({ let source = null; let length = null; let type = null; - if (object == null) { + if (typeof object === "string") { + source = object; + type = "text/plain;charset=UTF-8"; } else if (object instanceof URLSearchParams) { source = object.toString(); type = "application/x-www-form-urlencoded;charset=UTF-8"; @@ -6213,7 +6132,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r \r `); yield* value.stream(); - yield enc.encode("\r\n"); + yield new Uint8Array([13, 10]); } } yield enc.encode(`--${boundary}--`); @@ -6226,6 +6145,8 @@ Content-Type: ${value.type || "application/octet-stream"}\r if (object.type) { type = object.type; } + } else if (object instanceof Uint8Array) { + source = object; } else if (typeof object[Symbol.asyncIterator] === "function") { if (keepalive) { throw new TypeError("keepalive"); @@ -6234,9 +6155,6 @@ Content-Type: ${value.type || "application/octet-stream"}\r throw new TypeError("Response body object should not be disturbed or locked"); } stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); - } else { - source = toUSVString(object); - type = "text/plain;charset=UTF-8"; } if (typeof source === "string" || util.isBuffer(source)) { length = Buffer.byteLength(source); @@ -6327,9 +6245,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r return specConsumeBody(this, "JSON", instance); }, async formData() { - if (!(this instanceof instance)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, instance); throwIfAborted(this[kState]); const contentType = this.headers.get("Content-Type"); if (/multipart\/form-data/.test(contentType)) { @@ -6404,7 +6320,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r } else { await Promise.resolve(); throwIfAborted(this[kState]); - webidl.errors.exception({ + throw webidl.errors.exception({ header: `${instance.name}.formData`, message: "Could not parse content as FormData." }); @@ -6417,9 +6333,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r Object.assign(prototype.prototype, bodyMixinMethods(prototype)); } async function specConsumeBody(object, type, instance) { - if (!(object instanceof instance)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(object, instance); throwIfAborted(object[kState]); if (bodyUnusable(object[kState].body)) { throw new TypeError("Body is unusable"); @@ -6566,7 +6480,8 @@ var require_response = __commonJS({ isAborted, isBlobLike, serializeJavascriptValueToJSONString, - isErrorLike + isErrorLike, + isomorphicEncode } = require_util2(); var { redirectStatus, @@ -6594,9 +6509,7 @@ var require_response = __commonJS({ return responseObject; } static json(data = void 0, init = {}) { - if (arguments.length === 0) { - throw new TypeError("Failed to execute 'json' on 'Response': 1 argument required, but 0 present."); - } + webidl.argumentLengthCheck(arguments, 1, { header: "Response.json" }); if (init !== null) { init = webidl.converters.ResponseInit(init); } @@ -6612,9 +6525,7 @@ var require_response = __commonJS({ } static redirect(url, status = 302) { const relevantRealm = { settingsObject: {} }; - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'redirect' on 'Response': 1 argument required, but only ${arguments.length} present.`); - } + webidl.argumentLengthCheck(arguments, 1, { header: "Response.redirect" }); url = webidl.converters.USVString(url); status = webidl.converters["unsigned short"](status); let parsedURL; @@ -6626,14 +6537,14 @@ var require_response = __commonJS({ }); } if (!redirectStatus.includes(status)) { - throw new RangeError("Invalid status code"); + throw new RangeError("Invalid status code " + status); } const responseObject = new Response(); responseObject[kRealm] = relevantRealm; responseObject[kHeaders][kGuard] = "immutable"; responseObject[kHeaders][kRealm] = relevantRealm; responseObject[kState].status = status; - const value = parsedURL.toString(); + const value = isomorphicEncode(URLSerializer(parsedURL)); responseObject[kState].headersList.append("location", value); return responseObject; } @@ -6655,19 +6566,12 @@ var require_response = __commonJS({ } initializeResponse(this, init, bodyWithType); } - get [Symbol.toStringTag]() { - return this.constructor.name; - } get type() { - if (!(this instanceof Response)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Response); return this[kState].type; } get url() { - if (!(this instanceof Response)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Response); const urlList = this[kState].urlList; const url = urlList[urlList.length - 1] ?? null; if (url === null) { @@ -6676,53 +6580,37 @@ var require_response = __commonJS({ return URLSerializer(url, true); } get redirected() { - if (!(this instanceof Response)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Response); return this[kState].urlList.length > 1; } get status() { - if (!(this instanceof Response)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Response); return this[kState].status; } get ok() { - if (!(this instanceof Response)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Response); return this[kState].status >= 200 && this[kState].status <= 299; } get statusText() { - if (!(this instanceof Response)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Response); return this[kState].statusText; } get headers() { - if (!(this instanceof Response)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Response); return this[kHeaders]; } get body() { - if (!this || !this[kState]) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Response); return this[kState].body ? this[kState].body.stream : null; } get bodyUsed() { - if (!this || !this[kState]) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Response); return !!this[kState].body && util.isDisturbed(this[kState].body.stream); } clone() { - if (!(this instanceof Response)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Response); if (this.bodyUsed || this.body && this.body.locked) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Response.clone", message: "Body has already been consumed." }); @@ -6748,7 +6636,11 @@ var require_response = __commonJS({ headers: kEnumerableProperty, clone: kEnumerableProperty, body: kEnumerableProperty, - bodyUsed: kEnumerableProperty + bodyUsed: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "Response", + configurable: true + } }); Object.defineProperties(Response, { json: kEnumerableProperty, @@ -6863,13 +6755,13 @@ var require_response = __commonJS({ } if (body) { if (nullBodyStatus.includes(response.status)) { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Response constructor", - message: "Invalid response status code." + message: "Invalid response status code " + response.status }); } response[kState].body = body.body; - if (body.type != null && !response[kState].headersList.has("Content-Type")) { + if (body.type != null && !response[kState].headersList.contains("Content-Type")) { response[kState].headersList.append("content-type", body.type); } } @@ -6984,7 +6876,8 @@ var require_request = __commonJS({ requestRedirect, requestMode, requestCredentials, - requestCache + requestCache, + requestDuplex } = require_constants(); var { kEnumerableProperty } = util; var { kHeaders, kSignal, kState, kGuard, kRealm } = require_symbols2(); @@ -7003,9 +6896,7 @@ var require_request = __commonJS({ if (input === kInit) { return; } - if (arguments.length < 1) { - throw new TypeError(`Failed to construct 'Request': 1 argument required, but only ${arguments.length} present.`); - } + webidl.argumentLengthCheck(arguments, 1, { header: "Request constructor" }); input = webidl.converters.RequestInfo(input); init = webidl.converters.RequestInit(init); this[kRealm] = { @@ -7093,21 +6984,15 @@ var require_request = __commonJS({ } if (init.referrerPolicy !== void 0) { request.referrerPolicy = init.referrerPolicy; - if (!referrerPolicy.includes(request.referrerPolicy)) { - throw new TypeError(`Failed to construct 'Request': The provided value '${request.referrerPolicy}' is not a valid enum value of type ReferrerPolicy.`); - } } let mode; if (init.mode !== void 0) { mode = init.mode; - if (!requestMode.includes(mode)) { - throw new TypeError(`Failed to construct 'Request': The provided value '${request.mode}' is not a valid enum value of type RequestMode.`); - } } else { mode = fallbackMode; } if (mode === "navigate") { - webidl.errors.exception({ + throw webidl.errors.exception({ header: "Request constructor", message: "invalid request mode navigate." }); @@ -7117,24 +7002,15 @@ var require_request = __commonJS({ } if (init.credentials !== void 0) { request.credentials = init.credentials; - if (!requestCredentials.includes(request.credentials)) { - throw new TypeError(`Failed to construct 'Request': The provided value '${request.credentials}' is not a valid enum value of type RequestCredentials.`); - } } if (init.cache !== void 0) { request.cache = init.cache; - if (!requestCache.includes(request.cache)) { - throw new TypeError(`Failed to construct 'Request': The provided value '${request.cache}' is not a valid enum value of type RequestCache.`); - } } if (request.cache === "only-if-cached" && request.mode !== "same-origin") { throw new TypeError("'only-if-cached' can be set only with 'same-origin' mode"); } if (init.redirect !== void 0) { request.redirect = init.redirect; - if (!requestRedirect.includes(request.redirect)) { - throw new TypeError(`Failed to construct 'Request': The provided value '${request.redirect}' is not a valid enum value of type RequestRedirect.`); - } } if (init.integrity !== void 0 && init.integrity != null) { request.integrity = String(init.integrity); @@ -7204,7 +7080,7 @@ var require_request = __commonJS({ if (init.body !== void 0 && init.body != null) { const [extractedBody, contentType] = extractBody(init.body, request.keepalive); initBody = extractedBody; - if (contentType && !this[kHeaders].has("content-type")) { + if (contentType && !this[kHeaders][kHeadersList].contains("content-type")) { this[kHeaders].append("content-type", contentType); } } @@ -7236,37 +7112,24 @@ var require_request = __commonJS({ } this[kState].body = finalBody; } - get [Symbol.toStringTag]() { - return this.constructor.name; - } get method() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].method; } get url() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return URLSerializer(this[kState].url); } get headers() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kHeaders]; } get destination() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].destination; } get referrer() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); if (this[kState].referrer === "no-referrer") { return ""; } @@ -7276,84 +7139,58 @@ var require_request = __commonJS({ return this[kState].referrer.toString(); } get referrerPolicy() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].referrerPolicy; } get mode() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].mode; } get credentials() { return this[kState].credentials; } get cache() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].cache; } get redirect() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].redirect; } get integrity() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].integrity; } get keepalive() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].keepalive; } get isReloadNavigation() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].reloadNavigation; } get isHistoryNavigation() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].historyNavigation; } get signal() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kSignal]; } get body() { - if (!this || !this[kState]) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return this[kState].body ? this[kState].body.stream : null; } get bodyUsed() { - if (!this || !this[kState]) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return !!this[kState].body && util.isDisturbed(this[kState].body.stream); } get duplex() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); return "half"; } clone() { - if (!(this instanceof Request)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, Request); if (this.bodyUsed || this.body?.locked) { throw new TypeError("unusable"); } @@ -7448,7 +7285,11 @@ var require_request = __commonJS({ attribute: kEnumerableProperty, referrerPolicy: kEnumerableProperty, referrer: kEnumerableProperty, - mode: kEnumerableProperty + mode: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "Request", + configurable: true + } }); webidl.converters.Request = webidl.interfaceConverter(Request); webidl.converters.RequestInfo = function(V) { @@ -7481,58 +7322,27 @@ var require_request = __commonJS({ { key: "referrerPolicy", converter: webidl.converters.DOMString, - allowedValues: [ - "", - "no-referrer", - "no-referrer-when-downgrade", - "same-origin", - "origin", - "strict-origin", - "origin-when-cross-origin", - "strict-origin-when-cross-origin", - "unsafe-url" - ] + allowedValues: referrerPolicy }, { key: "mode", converter: webidl.converters.DOMString, - allowedValues: [ - "same-origin", - "cors", - "no-cors", - "navigate", - "websocket" - ] + allowedValues: requestMode }, { key: "credentials", converter: webidl.converters.DOMString, - allowedValues: [ - "omit", - "same-origin", - "include" - ] + allowedValues: requestCredentials }, { key: "cache", converter: webidl.converters.DOMString, - allowedValues: [ - "default", - "no-store", - "reload", - "no-cache", - "force-cache", - "only-if-cached" - ] + allowedValues: requestCache }, { key: "redirect", converter: webidl.converters.DOMString, - allowedValues: [ - "follow", - "error", - "manual" - ] + allowedValues: requestRedirect }, { key: "integrity", @@ -7553,7 +7363,7 @@ var require_request = __commonJS({ { key: "duplex", converter: webidl.converters.DOMString, - allowedValues: ["half"] + allowedValues: requestDuplex } ]); module2.exports = { Request, makeRequest }; @@ -11530,6 +11340,11 @@ var require_mock_utils = __commonJS({ } = require_mock_symbols(); var { buildURL, nop } = require_util(); var { STATUS_CODES } = require("http"); + var { + types: { + isPromise + } + } = require("util"); function matchValue(match, value) { if (typeof match === "string") { return match === value; @@ -11703,9 +11518,14 @@ var require_mock_utils = __commonJS({ } else { handleReply(this[kDispatches]); } - function handleReply(mockDispatches) { + function handleReply(mockDispatches, _data = data) { const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; - const responseData = getResponseData(typeof data === "function" ? data({ ...opts, headers: optsHeaders }) : data); + const body = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; + if (isPromise(body)) { + body.then((newData) => handleReply(mockDispatches, newData)); + return; + } + const responseData = getResponseData(body); const responseHeaders = generateKeyValues(headers); const responseTrailers = generateKeyValues(trailers); handler.abort = nop; @@ -12459,21 +12279,15 @@ var require_progressevent = __commonJS({ }; } get lengthComputable() { - if (!(this instanceof ProgressEvent)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, ProgressEvent); return this[kState].lengthComputable; } get loaded() { - if (!(this instanceof ProgressEvent)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, ProgressEvent); return this[kState].loaded; } get total() { - if (!(this instanceof ProgressEvent)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, ProgressEvent); return this[kState].total; } }; @@ -13025,32 +12839,20 @@ var require_filereader = __commonJS({ }; } readAsArrayBuffer(blob) { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length === 0) { - throw new TypeError("Failed to execute 'readAsArrayBuffer' on 'FileReader': 1 argument required, but 0 present."); - } + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsArrayBuffer" }); blob = webidl.converters.Blob(blob, { strict: false }); readOperation(this, blob, "ArrayBuffer"); } readAsBinaryString(blob) { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length === 0) { - throw new TypeError("Failed to execute 'readAsBinaryString' on 'FileReader': 1 argument required, but 0 present."); - } + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsBinaryString" }); blob = webidl.converters.Blob(blob, { strict: false }); readOperation(this, blob, "BinaryString"); } readAsText(blob, encoding = void 0) { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length === 0) { - throw new TypeError("Failed to execute 'readAsText' on 'FileReader': 1 argument required, but 0 present."); - } + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsText" }); blob = webidl.converters.Blob(blob, { strict: false }); if (encoding !== void 0) { encoding = webidl.converters.DOMString(encoding); @@ -13058,12 +12860,8 @@ var require_filereader = __commonJS({ readOperation(this, blob, "Text", encoding); } readAsDataURL(blob) { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } - if (arguments.length === 0) { - throw new TypeError("Failed to execute 'readAsDataURL' on 'FileReader': 1 argument required, but 0 present."); - } + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsDataURL" }); blob = webidl.converters.Blob(blob, { strict: false }); readOperation(this, blob, "DataURL"); } @@ -13083,9 +12881,7 @@ var require_filereader = __commonJS({ } } get readyState() { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); switch (this[kState]) { case "empty": return this.EMPTY; @@ -13096,27 +12892,19 @@ var require_filereader = __commonJS({ } } get result() { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); return this[kResult]; } get error() { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); return this[kError]; } get onloadend() { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); return this[kEvents].loadend; } set onloadend(fn) { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); if (typeof fn === "function") { this[kEvents].loadend = fn; } else { @@ -13124,15 +12912,11 @@ var require_filereader = __commonJS({ } } get onerror() { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); return this[kEvents].error; } set onerror(fn) { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); if (typeof fn === "function") { this[kEvents].error = fn; } else { @@ -13140,15 +12924,11 @@ var require_filereader = __commonJS({ } } get onloadstart() { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); return this[kEvents].loadstart; } set onloadstart(fn) { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); if (typeof fn === "function") { this[kEvents].loadstart = fn; } else { @@ -13156,15 +12936,11 @@ var require_filereader = __commonJS({ } } get onprogress() { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); return this[kEvents].progress; } set onprogress(fn) { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); if (typeof fn === "function") { this[kEvents].progress = fn; } else { @@ -13172,15 +12948,11 @@ var require_filereader = __commonJS({ } } get onload() { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); return this[kEvents].load; } set onload(fn) { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); if (typeof fn === "function") { this[kEvents].load = fn; } else { @@ -13188,15 +12960,11 @@ var require_filereader = __commonJS({ } } get onabort() { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); return this[kEvents].abort; } set onabort(fn) { - if (!(this instanceof FileReader)) { - throw new TypeError("Illegal invocation"); - } + webidl.brandCheck(this, FileReader); if (typeof fn === "function") { this[kEvents].abort = fn; } else { @@ -13395,7 +13163,8 @@ var require_fetch = __commonJS({ isAborted, isErrorLike, fullyReadBody, - readableStreamClose + readableStreamClose, + isomorphicEncode } = require_util2(); var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); var assert = require("assert"); @@ -13415,6 +13184,7 @@ var require_fetch = __commonJS({ var { dataURLProcessor, serializeAMimeType } = require_dataURL(); var { TransformStream } = require("stream/web"); var { getGlobalDispatcher } = require_undici(); + var { webidl } = require_webidl(); var resolveObjectURL; var ReadableStream; var nodeVersion = process.versions.node.split("."); @@ -13451,9 +13221,7 @@ var require_fetch = __commonJS({ } }; async function fetch2(input, init = {}) { - if (arguments.length < 1) { - throw new TypeError(`Failed to execute 'fetch' on 'Window': 1 argument required, but only ${arguments.length} present.`); - } + webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" }); const p = createDeferredPromise(); let requestObject; try { @@ -13614,11 +13382,11 @@ var require_fetch = __commonJS({ request.policyContainer = makePolicyContainer(); } } - if (!request.headersList.has("accept")) { + if (!request.headersList.contains("accept")) { const value = "*/*"; request.headersList.append("accept", value); } - if (!request.headersList.has("accept-language")) { + if (!request.headersList.contains("accept-language")) { request.headersList.append("accept-language", "*"); } if (request.priority === null) { @@ -13693,7 +13461,7 @@ var require_fetch = __commonJS({ if (!request.timingAllowFailed) { response.timingAllowPassed = true; } - if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request.headers.has("range")) { + if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request.headers.contains("range")) { response = internalResponse = makeNetworkError(); } if (response.status !== 0 && (request.method === "HEAD" || request.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) { @@ -13743,7 +13511,7 @@ var require_fetch = __commonJS({ } const bodyWithType = safelyExtractBody(blobURLEntryObject); const body = bodyWithType[0]; - const length = `${body.length}`; + const length = isomorphicEncode(`${body.length}`); const type = bodyWithType[1] ?? ""; const response = makeResponse({ statusText: "OK", @@ -13945,7 +13713,7 @@ var require_fetch = __commonJS({ contentLengthHeaderValue = "0"; } if (contentLength != null) { - contentLengthHeaderValue = String(contentLength); + contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); } if (contentLengthHeaderValue != null) { httpRequest.headersList.append("content-length", contentLengthHeaderValue); @@ -13953,31 +13721,31 @@ var require_fetch = __commonJS({ if (contentLength != null && httpRequest.keepalive) { } if (httpRequest.referrer instanceof URL) { - httpRequest.headersList.append("referer", httpRequest.referrer.href); + httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href)); } appendRequestOriginHeader(httpRequest); appendFetchMetadata(httpRequest); - if (!httpRequest.headersList.has("user-agent")) { + if (!httpRequest.headersList.contains("user-agent")) { httpRequest.headersList.append("user-agent", "undici"); } - if (httpRequest.cache === "default" && (httpRequest.headersList.has("if-modified-since") || httpRequest.headersList.has("if-none-match") || httpRequest.headersList.has("if-unmodified-since") || httpRequest.headersList.has("if-match") || httpRequest.headersList.has("if-range"))) { + if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since") || httpRequest.headersList.contains("if-none-match") || httpRequest.headersList.contains("if-unmodified-since") || httpRequest.headersList.contains("if-match") || httpRequest.headersList.contains("if-range"))) { httpRequest.cache = "no-store"; } - if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.has("cache-control")) { + if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control")) { httpRequest.headersList.append("cache-control", "max-age=0"); } if (httpRequest.cache === "no-store" || httpRequest.cache === "reload") { - if (!httpRequest.headersList.has("pragma")) { + if (!httpRequest.headersList.contains("pragma")) { httpRequest.headersList.append("pragma", "no-cache"); } - if (!httpRequest.headersList.has("cache-control")) { + if (!httpRequest.headersList.contains("cache-control")) { httpRequest.headersList.append("cache-control", "no-cache"); } } - if (httpRequest.headersList.has("range")) { + if (httpRequest.headersList.contains("range")) { httpRequest.headersList.append("accept-encoding", "identity"); } - if (!httpRequest.headersList.has("accept-encoding")) { + if (!httpRequest.headersList.contains("accept-encoding")) { if (/^https:/.test(requestCurrentURL(httpRequest).protocol)) { httpRequest.headersList.append("accept-encoding", "br, gzip, deflate"); } else { @@ -14005,7 +13773,7 @@ var require_fetch = __commonJS({ } } response.urlList = [...httpRequest.urlList]; - if (httpRequest.headersList.has("range")) { + if (httpRequest.headersList.contains("range")) { response.rangeRequested = true; } response.requestIncludesCredentials = includeCredentials;