diff --git a/docs/api-reference/next/image.md b/docs/api-reference/next/image.md
index 5fffe1b5213c4..04f14125aab9f 100644
--- a/docs/api-reference/next/image.md
+++ b/docs/api-reference/next/image.md
@@ -152,6 +152,7 @@ Try it out:
- [Demo the `blur` placeholder](https://image-component.nextjs.gallery/placeholder)
- [Demo the shimmer effect with `blurDataURL` prop](https://image-component.nextjs.gallery/shimmer)
+- [Demo the color effect with `blurDataURL` prop](https://image-component.nextjs.gallery/color)
## Advanced Props
@@ -208,6 +209,7 @@ Try it out:
- [Demo the default `blurDataURL` prop](https://image-component.nextjs.gallery/placeholder)
- [Demo the shimmer effect with `blurDataURL` prop](https://image-component.nextjs.gallery/shimmer)
+- [Demo the color effect with `blurDataURL` prop](https://image-component.nextjs.gallery/color)
You can also [generate a solid color Data URL](https://png-pixel.com) to match the image.
diff --git a/errors/page-data-collection-timeout.md b/errors/page-data-collection-timeout.md
index 12332bfb430be..431b61e4588df 100644
--- a/errors/page-data-collection-timeout.md
+++ b/errors/page-data-collection-timeout.md
@@ -11,7 +11,7 @@ When restarted it will retry all uncompleted jobs, but if a job was unsuccessful
- Make sure that there is no infinite loop during execution.
- Make sure all Promises in `getStaticPaths` `resolve` or `reject` correctly.
- Avoid very long timeouts for network requests.
-- Increase the timeout by changing the `experimental.pageDataCollectionTimeout` configuration option (default `60` in seconds).
+- Increase the timeout by changing the `config.staticPageGenerationTimeout` configuration option (default `60` in seconds).
### Useful Links
diff --git a/errors/static-page-generation-timeout.md b/errors/static-page-generation-timeout.md
index 6cef054dc5ddd..419731812b4dd 100644
--- a/errors/static-page-generation-timeout.md
+++ b/errors/static-page-generation-timeout.md
@@ -11,7 +11,7 @@ When restarted it will retry all uncompleted jobs, but if a job was unsuccessful
- Make sure that there is no infinite loop during execution.
- Make sure all Promises in `getStaticPaths`/`getStaticProps` `resolve` or `reject` correctly.
- Avoid very long timeouts for network requests.
-- Increase the timeout by changing the `experimental.staticPageGenerationTimeout` configuration option (default `60` in seconds).
+- Increase the timeout by changing the `staticPageGenerationTimeout` configuration option (default `60` in seconds).
### Useful Links
diff --git a/examples/image-component/pages/color.js b/examples/image-component/pages/color.js
new file mode 100644
index 0000000000000..dca5d6d3b9722
--- /dev/null
+++ b/examples/image-component/pages/color.js
@@ -0,0 +1,42 @@
+import Image from 'next/image'
+import ViewSource from '../components/view-source'
+
+// Pixel GIF code adapted from https://stackoverflow.com/a/33919020/266535
+const keyStr =
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
+
+const triplet = (e1, e2, e3) =>
+ keyStr.charAt(e1 >> 2) +
+ keyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +
+ keyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +
+ keyStr.charAt(e3 & 63)
+
+const rgbDataURL = (r, g, b) =>
+ `data:image/gif;base64,R0lGODlhAQABAPAA${
+ triplet(0, r, g) + triplet(b, 255, 255)
+ }/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`
+
+const Color = () => (
+
+
+
Image Component With Color Data URL
+
+
+
+)
+
+export default Color
diff --git a/examples/image-component/pages/index.js b/examples/image-component/pages/index.js
index df3f3d466a084..a676dc8666021 100644
--- a/examples/image-component/pages/index.js
+++ b/examples/image-component/pages/index.js
@@ -84,7 +84,12 @@ const Index = () => (
- placeholder="blur" with custom blurDataURL
+ placeholder="blur" with animated shimmer blurDataURL
+
+
+
+
+ placeholder="blur" with solid color blurDataURL
diff --git a/examples/image-component/public/cat.jpg b/examples/image-component/public/cat.jpg
new file mode 100644
index 0000000000000..32a673af2f5bc
Binary files /dev/null and b/examples/image-component/public/cat.jpg differ
diff --git a/examples/image-component/public/dog.jpg b/examples/image-component/public/dog.jpg
new file mode 100644
index 0000000000000..42093847732a8
Binary files /dev/null and b/examples/image-component/public/dog.jpg differ
diff --git a/examples/with-sentry/README.md b/examples/with-sentry/README.md
index c44e07980c44e..fbc56472effef 100644
--- a/examples/with-sentry/README.md
+++ b/examples/with-sentry/README.md
@@ -21,7 +21,7 @@ It only takes a few steps to create and deploy your own version of this example
You can deploy a copy of this project directly to [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example).
-[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/with-sentry&project-name=nextjs-sentry-example&repository-name=nextjs-sentry-example&env=NEXT_PUBLIC_SENTRY_DSN&envDescription=DSN%20Key%20required%20by%20Sentry&envLink=https://github.com/vercel/next.js/tree/canary/examples/with-sentry%23step-1-enable-error-tracking)
+[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/with-sentry&project-name=nextjs-sentry-example&repository-name=nextjs-sentry-example&integration-ids=oac_5lUsiANun1DEzgLg0NZx5Es3)
This will clone this example to your GitHub org, create a linked project in Vercel, and prompt you to install the Vercel Sentry Integration. (You can read more about the integration [on Vercel](https://vercel.com/integrations/sentry) and in [the Sentry docs](https://docs.sentry.io/product/integrations/deployment/vercel/).)
diff --git a/lerna.json b/lerna.json
index 0f701a205a2c1..66c6e0872e0bd 100644
--- a/lerna.json
+++ b/lerna.json
@@ -17,5 +17,5 @@
"registry": "https://registry.npmjs.org/"
}
},
- "version": "11.1.3-canary.87"
+ "version": "11.1.3-canary.89"
}
diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json
index 4b645e6182bbe..089777f1889d0 100644
--- a/packages/create-next-app/package.json
+++ b/packages/create-next-app/package.json
@@ -1,6 +1,6 @@
{
"name": "create-next-app",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"keywords": [
"react",
"next",
diff --git a/packages/eslint-config-next/package.json b/packages/eslint-config-next/package.json
index 62d369568416a..26b031f751986 100644
--- a/packages/eslint-config-next/package.json
+++ b/packages/eslint-config-next/package.json
@@ -1,6 +1,6 @@
{
"name": "eslint-config-next",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"description": "ESLint configuration used by NextJS.",
"main": "index.js",
"license": "MIT",
@@ -9,7 +9,7 @@
"directory": "packages/eslint-config-next"
},
"dependencies": {
- "@next/eslint-plugin-next": "11.1.3-canary.87",
+ "@next/eslint-plugin-next": "11.1.3-canary.89",
"@rushstack/eslint-patch": "^1.0.6",
"@typescript-eslint/parser": "^4.20.0",
"eslint-import-resolver-node": "^0.3.4",
diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json
index 6d438f05b88dd..202ca9862d99c 100644
--- a/packages/eslint-plugin-next/package.json
+++ b/packages/eslint-plugin-next/package.json
@@ -1,6 +1,6 @@
{
"name": "@next/eslint-plugin-next",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"description": "ESLint plugin for NextJS.",
"main": "lib/index.js",
"license": "MIT",
diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json
index 988a61be0c7e6..81109f9f89bb3 100644
--- a/packages/next-bundle-analyzer/package.json
+++ b/packages/next-bundle-analyzer/package.json
@@ -1,6 +1,6 @@
{
"name": "@next/bundle-analyzer",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"main": "index.js",
"license": "MIT",
"repository": {
diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json
index c99a002653bbf..894a7972f44f9 100644
--- a/packages/next-codemod/package.json
+++ b/packages/next-codemod/package.json
@@ -1,6 +1,6 @@
{
"name": "@next/codemod",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"license": "MIT",
"dependencies": {
"chalk": "4.1.0",
diff --git a/packages/next-env/package.json b/packages/next-env/package.json
index 94b94a0b0cd76..0ac81432195d3 100644
--- a/packages/next-env/package.json
+++ b/packages/next-env/package.json
@@ -1,6 +1,6 @@
{
"name": "@next/env",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"keywords": [
"react",
"next",
diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json
index 48b9a63500ef6..d5edbe17b1112 100644
--- a/packages/next-mdx/package.json
+++ b/packages/next-mdx/package.json
@@ -1,6 +1,6 @@
{
"name": "@next/mdx",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"main": "index.js",
"license": "MIT",
"repository": {
diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json
index 33c6bed3bdc9a..25c29a2f9fd65 100644
--- a/packages/next-plugin-storybook/package.json
+++ b/packages/next-plugin-storybook/package.json
@@ -1,6 +1,6 @@
{
"name": "@next/plugin-storybook",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"repository": {
"url": "vercel/next.js",
"directory": "packages/next-plugin-storybook"
diff --git a/packages/next-polyfill-module/package.json b/packages/next-polyfill-module/package.json
index 5bde38356d4b7..01e544941855d 100644
--- a/packages/next-polyfill-module/package.json
+++ b/packages/next-polyfill-module/package.json
@@ -1,6 +1,6 @@
{
"name": "@next/polyfill-module",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)",
"main": "dist/polyfill-module.js",
"license": "MIT",
diff --git a/packages/next-polyfill-nomodule/package.json b/packages/next-polyfill-nomodule/package.json
index bd0db7d2e7b94..864e467a36160 100644
--- a/packages/next-polyfill-nomodule/package.json
+++ b/packages/next-polyfill-nomodule/package.json
@@ -1,6 +1,6 @@
{
"name": "@next/polyfill-nomodule",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"description": "A polyfill for non-dead, nomodule browsers.",
"main": "dist/polyfill-nomodule.js",
"license": "MIT",
diff --git a/packages/next/build/entries.ts b/packages/next/build/entries.ts
index e090275e12b96..6882ff1ba0d11 100644
--- a/packages/next/build/entries.ts
+++ b/packages/next/build/entries.ts
@@ -2,16 +2,19 @@ import chalk from 'chalk'
import { posix, join } from 'path'
import { stringify } from 'querystring'
import { API_ROUTE, DOT_NEXT_ALIAS, PAGES_DIR_ALIAS } from '../lib/constants'
+import { MIDDLEWARE_ROUTE } from '../lib/constants'
import { __ApiPreviewProps } from '../server/api-utils'
import { isTargetLikeServerless } from '../server/config'
import { normalizePagePath } from '../server/normalize-page-path'
import { warn } from './output/log'
+import { MiddlewareLoaderOptions } from './webpack/loaders/next-middleware-loader'
import { ClientPagesLoaderOptions } from './webpack/loaders/next-client-pages-loader'
import { ServerlessLoaderQuery } from './webpack/loaders/next-serverless-loader'
import { LoadedEnvFiles } from '@next/env'
import { NextConfigComplete } from '../server/config-shared'
import type webpack5 from 'webpack5'
+type ObjectValue = T extends { [key: string]: infer V } ? V : never
type PagesMapping = {
[page: string]: string
}
@@ -118,6 +121,18 @@ export function createEntrypoints(
const isLikeServerless = isTargetLikeServerless(target)
+ if (page.match(MIDDLEWARE_ROUTE)) {
+ const loaderOpts: MiddlewareLoaderOptions = {
+ absolutePagePath: pages[page],
+ page,
+ }
+
+ client[clientBundlePath] = `next-middleware-loader?${stringify(
+ loaderOpts
+ )}!`
+ return
+ }
+
if (isApiRoute && isLikeServerless) {
const serverlessLoaderOptions: ServerlessLoaderQuery = {
page,
@@ -170,54 +185,56 @@ export function createEntrypoints(
}
}
-export function finalizeEntrypoint(
- name: string,
- value: any,
+export function finalizeEntrypoint({
+ name,
+ value,
+ isServer,
+}: {
isServer: boolean
-): any {
+ name: string
+ value: ObjectValue
+}): ObjectValue {
+ const entry =
+ typeof value !== 'object' || Array.isArray(value)
+ ? { import: value }
+ : value
+
if (isServer) {
const isApi = name.startsWith('pages/api/')
- const runtime = isApi ? 'webpack-api-runtime' : 'webpack-runtime'
- const layer = isApi ? 'api' : undefined
- const publicPath = isApi ? '' : undefined
- if (typeof value === 'object' && !Array.isArray(value)) {
- return {
- publicPath,
- runtime,
- layer,
- ...value,
- }
- } else {
- return {
- import: value,
- publicPath,
- runtime,
- layer,
- }
+ return {
+ publicPath: isApi ? '' : undefined,
+ runtime: isApi ? 'webpack-api-runtime' : 'webpack-runtime',
+ layer: isApi ? 'api' : undefined,
+ ...entry,
}
- } else {
- if (
- name !== 'polyfills' &&
- name !== 'main' &&
- name !== 'amp' &&
- name !== 'react-refresh'
- ) {
- const dependOn =
+ }
+
+ if (name.match(MIDDLEWARE_ROUTE)) {
+ return {
+ filename: 'server/[name].js',
+ layer: 'middleware',
+ library: {
+ name: ['_ENTRIES', `middleware_[name]`],
+ type: 'assign',
+ },
+ ...entry,
+ }
+ }
+
+ if (
+ name !== 'polyfills' &&
+ name !== 'main' &&
+ name !== 'amp' &&
+ name !== 'react-refresh'
+ ) {
+ return {
+ dependOn:
name.startsWith('pages/') && name !== 'pages/_app'
? 'pages/_app'
- : 'main'
- if (typeof value === 'object' && !Array.isArray(value)) {
- return {
- dependOn,
- ...value,
- }
- } else {
- return {
- import: value,
- dependOn,
- }
- }
+ : 'main',
+ ...entry,
}
}
- return value
+
+ return entry
}
diff --git a/packages/next/build/index.ts b/packages/next/build/index.ts
index c2fc765aaac88..4655e6c2d539a 100644
--- a/packages/next/build/index.ts
+++ b/packages/next/build/index.ts
@@ -13,6 +13,7 @@ import formatWebpackMessages from '../client/dev/error-overlay/format-webpack-me
import {
STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR,
PUBLIC_DIR_MIDDLEWARE_CONFLICT,
+ MIDDLEWARE_ROUTE,
} from '../lib/constants'
import { fileExists } from '../lib/file-exists'
import { findPagesDir } from '../lib/find-pages-dir'
@@ -46,6 +47,7 @@ import {
SERVER_DIRECTORY,
SERVER_FILES_MANIFEST,
STATIC_STATUS_PAGES,
+ MIDDLEWARE_MANIFEST,
} from '../shared/lib/constants'
import {
getRouteRegex,
@@ -94,6 +96,9 @@ import { normalizeLocalePath } from '../shared/lib/i18n/normalize-locale-path'
import { NextConfigComplete } from '../server/config-shared'
import isError from '../lib/is-error'
import { TelemetryPlugin } from './webpack/plugins/telemetry-plugin'
+import { MiddlewareManifest } from './webpack/plugins/middleware-plugin'
+
+const RESERVED_PAGE = /^\/(_app|_error|_document|api(\/|$))/
export type SsgRoute = {
initialRevalidateSeconds: number | false
@@ -394,6 +399,12 @@ export default async function build(
fallback: Array>
}
headers: Array>
+ staticRoutes: Array<{
+ page: string
+ regex: string
+ namedRegex?: string
+ routeKeys?: { [key: string]: string }
+ }>
dynamicRoutes: Array<{
page: string
regex: string
@@ -424,16 +435,16 @@ export default async function build(
redirects: redirects.map((r: any) => buildCustomRoute(r, 'redirect')),
headers: headers.map((r: any) => buildCustomRoute(r, 'header')),
dynamicRoutes: getSortedRoutes(pageKeys)
- .filter(isDynamicRoute)
- .map((page) => {
- const routeRegex = getRouteRegex(page)
- return {
- page,
- regex: normalizeRouteRegex(routeRegex.re.source),
- routeKeys: routeRegex.routeKeys,
- namedRegex: routeRegex.namedRegex,
- }
- }),
+ .filter((page) => isDynamicRoute(page) && !page.match(MIDDLEWARE_ROUTE))
+ .map(pageToRoute),
+ staticRoutes: getSortedRoutes(pageKeys)
+ .filter(
+ (page) =>
+ !isDynamicRoute(page) &&
+ !page.match(MIDDLEWARE_ROUTE) &&
+ !page.match(RESERVED_PAGE)
+ )
+ .map(pageToRoute),
dataRoutes: [],
i18n: config.i18n || undefined,
}))
@@ -680,7 +691,7 @@ export default async function build(
await promises.readFile(buildManifestPath, 'utf8')
) as BuildManifest
- const timeout = config.experimental.staticPageGenerationTimeout || 0
+ const timeout = config.staticPageGenerationTimeout || 0
const sharedPool = config.experimental.sharedPool || false
const staticWorker = sharedPool
? require.resolve('./worker')
@@ -833,11 +844,7 @@ export default async function build(
let isHybridAmp = false
let ssgPageRoutes: string[] | null = null
- const nonReservedPage = !page.match(
- /^\/(_app|_error|_document|api(\/|$))/
- )
-
- if (nonReservedPage) {
+ if (!page.match(MIDDLEWARE_ROUTE) && !page.match(RESERVED_PAGE)) {
try {
let isPageStaticSpan =
checkPageSpan.traceChild('is-page-static')
@@ -1694,6 +1701,25 @@ export default async function build(
)
}
+ const middlewareManifest: MiddlewareManifest = JSON.parse(
+ await promises.readFile(
+ path.join(distDir, SERVER_DIRECTORY, MIDDLEWARE_MANIFEST),
+ 'utf8'
+ )
+ )
+
+ await promises.writeFile(
+ path.join(
+ distDir,
+ CLIENT_STATIC_FILES_PATH,
+ buildId,
+ '_middlewareManifest.js'
+ ),
+ `self.__MIDDLEWARE_MANIFEST=${devalue(
+ middlewareManifest.sortedMiddleware
+ )};self.__MIDDLEWARE_MANIFEST_CB&&self.__MIDDLEWARE_MANIFEST_CB()`
+ )
+
const images = { ...config.images }
const { deviceSizes, imageSizes } = images
;(images as any).sizes = [...deviceSizes, ...imageSizes]
@@ -1797,3 +1823,13 @@ function generateClientSsgManifest(
function isTelemetryPlugin(plugin: unknown): plugin is TelemetryPlugin {
return plugin instanceof TelemetryPlugin
}
+
+function pageToRoute(page: string) {
+ const routeRegex = getRouteRegex(page)
+ return {
+ page,
+ regex: normalizeRouteRegex(routeRegex.re.source),
+ routeKeys: routeRegex.routeKeys,
+ namedRegex: routeRegex.namedRegex,
+ }
+}
diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts
index 388a6bf7343db..edd9cb480781d 100644
--- a/packages/next/build/webpack-config.ts
+++ b/packages/next/build/webpack-config.ts
@@ -13,6 +13,7 @@ import {
NEXT_PROJECT_ROOT,
NEXT_PROJECT_ROOT_DIST_CLIENT,
PAGES_DIR_ALIAS,
+ MIDDLEWARE_ROUTE,
} from '../lib/constants'
import { fileExists } from '../lib/file-exists'
import { getPackageVersion } from '../lib/get-package-version'
@@ -34,6 +35,7 @@ import { finalizeEntrypoint } from './entries'
import * as Log from './output/log'
import { build as buildConfiguration } from './webpack/config'
import { __overrideCssConfiguration } from './webpack/config/blocks/css/overrideCssConfiguration'
+import MiddlewarePlugin from './webpack/plugins/middleware-plugin'
import BuildManifestPlugin from './webpack/plugins/build-manifest-plugin'
import { JsConfigPathsPlugin } from './webpack/plugins/jsconfig-paths-plugin'
import { DropClientPage } from './webpack/plugins/next-drop-client-page-plugin'
@@ -323,6 +325,20 @@ export default async function getBaseWebpackConfig(
hasJsxRuntime: true,
},
},
+ babelMiddleware: {
+ loader: require.resolve('./babel/loader/index'),
+ options: {
+ cache: false,
+ configFile: babelConfigFile,
+ cwd: dir,
+ development: dev,
+ distDir,
+ hasJsxRuntime: true,
+ hasReactRefresh: false,
+ isServer: true,
+ pagesDir,
+ },
+ },
}
const babelIncludeRegexes: RegExp[] = [
@@ -576,10 +592,12 @@ export default async function getBaseWebpackConfig(
// as we don't need a separate vendor chunk from that
// and all other chunk depend on them so there is no
// duplication that need to be pulled out.
- chunks: (chunk) => !/^(polyfills|main|pages\/_app)$/.test(chunk.name),
+ chunks: (chunk) =>
+ !/^(polyfills|main|pages\/_app|\/_middleware)$/.test(chunk.name),
cacheGroups: {
framework: {
- chunks: 'all',
+ chunks: (chunk: webpack.compilation.Chunk) =>
+ !chunk.name?.match(MIDDLEWARE_ROUTE),
name: 'framework',
// This regex ignores nested copies of framework libraries so they're
// bundled with their issuer.
@@ -629,6 +647,12 @@ export default async function getBaseWebpackConfig(
minChunks: totalPages,
priority: 20,
},
+ middleware: {
+ chunks: (chunk: webpack.compilation.Chunk) =>
+ chunk.name?.match(MIDDLEWARE_ROUTE),
+ filename: 'server/middleware-chunks/[name].js',
+ minChunks: 2,
+ },
},
maxInitialRequests: 25,
minSize: 20000,
@@ -898,7 +922,7 @@ export default async function getBaseWebpackConfig(
: ({
filename: '[name].js',
// allow to split entrypoints
- chunks: 'all',
+ chunks: ({ name }: any) => !name?.match(MIDDLEWARE_ROUTE),
// size of files is not so relevant for server build
// we want to prefer deduplication to load less code
minSize: 1000,
@@ -988,6 +1012,8 @@ export default async function getBaseWebpackConfig(
strictModuleExceptionHandling: true,
crossOriginLoading: crossOrigin,
webassemblyModuleFilename: 'static/wasm/[modulehash].wasm',
+ hashFunction: 'xxhash64',
+ hashDigestLength: 16,
},
performance: false,
resolve: resolveConfig,
@@ -1001,6 +1027,7 @@ export default async function getBaseWebpackConfig(
'next-serverless-loader',
'next-style-loader',
'noop-loader',
+ 'next-middleware-loader',
].reduce((alias, loader) => {
// using multiple aliases to replace `resolveLoader.modules`
alias[loader] = path.join(__dirname, 'webpack', 'loaders', loader)
@@ -1046,6 +1073,11 @@ export default async function getBaseWebpackConfig(
},
use: defaultLoaders.babel,
},
+ {
+ ...codeCondition,
+ issuerLayer: 'middleware',
+ use: defaultLoaders.babelMiddleware,
+ },
{
...codeCondition,
use: hasReactRefresh
@@ -1238,6 +1270,9 @@ export default async function getBaseWebpackConfig(
isServerless && isServer && new ServerlessPlugin(),
isServer &&
new PagesManifestPlugin({ serverless: isLikeServerless, dev }),
+ // MiddlewarePlugin should be after DefinePlugin so NEXT_PUBLIC_*
+ // replacement is done before its process.env.* handling
+ !isServer && new MiddlewarePlugin({ dev }),
isServer && new NextJsSsrImportPlugin(),
!isServer &&
new BuildManifestPlugin({
@@ -1304,6 +1339,10 @@ export default async function getBaseWebpackConfig(
},
}
+ if (!isServer) {
+ webpack5Config.output!.enabledLibraryTypes = ['assign']
+ }
+
if (dev) {
// @ts-ignore unsafeCache exists
webpack5Config.module.unsafeCache = (module) =>
@@ -1819,7 +1858,11 @@ export default async function getBaseWebpackConfig(
delete entry['main.js']
for (const name of Object.keys(entry)) {
- entry[name] = finalizeEntrypoint(name, entry[name], isServer)
+ entry[name] = finalizeEntrypoint({
+ value: entry[name],
+ isServer,
+ name,
+ })
}
return entry
diff --git a/packages/next/build/webpack/loaders/next-middleware-loader.ts b/packages/next/build/webpack/loaders/next-middleware-loader.ts
new file mode 100644
index 0000000000000..d036508e177b3
--- /dev/null
+++ b/packages/next/build/webpack/loaders/next-middleware-loader.ts
@@ -0,0 +1,33 @@
+import loaderUtils from 'next/dist/compiled/loader-utils'
+
+export type MiddlewareLoaderOptions = {
+ absolutePagePath: string
+ page: string
+}
+
+export default function middlewareLoader(this: any) {
+ const { absolutePagePath, page }: MiddlewareLoaderOptions =
+ loaderUtils.getOptions(this)
+ const stringifiedPagePath = loaderUtils.stringifyRequest(
+ this,
+ absolutePagePath
+ )
+
+ return `
+ import { adapter } from 'next/dist/server/web/adapter'
+
+ var mod = require(${stringifiedPagePath})
+ var handler = mod.middleware || mod.default;
+
+ if (typeof handler !== 'function') {
+ throw new Error('The Middleware "pages${page}" must export a \`middleware\` or a \`default\` function');
+ }
+
+ export default function (opts) {
+ return adapter({
+ ...opts,
+ handler
+ })
+ }
+ `
+}
diff --git a/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts b/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts
index a0f98cc5942bc..27383855f07a2 100644
--- a/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts
+++ b/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts
@@ -16,7 +16,7 @@ import {
GetStaticPaths,
GetStaticProps,
} from '../../../../types'
-import accept from '@hapi/accept'
+import { acceptLanguage } from '../../../../server/accept-header'
import { detectLocaleCookie } from '../../../../shared/lib/i18n/detect-locale-cookie'
import { detectDomainLocale } from '../../../../shared/lib/i18n/detect-domain-locale'
import { denormalizePagePath } from '../../../../server/denormalize-page-path'
@@ -358,7 +358,7 @@ export function getUtils({
try {
acceptPreferredLocale =
i18n.localeDetection !== false
- ? accept.language(req.headers['accept-language'], i18n.locales)
+ ? acceptLanguage(req.headers['accept-language'], i18n.locales)
: detectedLocale
} catch (_) {
acceptPreferredLocale = detectedLocale
diff --git a/packages/next/build/webpack/plugins/build-manifest-plugin.ts b/packages/next/build/webpack/plugins/build-manifest-plugin.ts
index efe59ef633026..fac146a487bbe 100644
--- a/packages/next/build/webpack/plugins/build-manifest-plugin.ts
+++ b/packages/next/build/webpack/plugins/build-manifest-plugin.ts
@@ -204,6 +204,13 @@ export default class BuildManifestPlugin {
const ssgManifestPath = `${CLIENT_STATIC_FILES_PATH}/${this.buildId}/_ssgManifest.js`
assetMap.lowPriorityFiles.push(ssgManifestPath)
assets[ssgManifestPath] = new sources.RawSource(srcEmptySsgManifest)
+
+ const srcEmptyMiddlewareManifest = `self.__MIDDLEWARE_MANIFEST=new Set;self.__MIDDLEWARE_MANIFEST_CB&&self.__MIDDLEWARE_MANIFEST_CB()`
+ const middlewareManifestPath = `${CLIENT_STATIC_FILES_PATH}/${this.buildId}/_middlewareManifest.js`
+ assetMap.lowPriorityFiles.push(middlewareManifestPath)
+ assets[middlewareManifestPath] = new sources.RawSource(
+ srcEmptyMiddlewareManifest
+ )
}
assetMap.pages = Object.keys(assetMap.pages)
diff --git a/packages/next/build/webpack/plugins/middleware-plugin.ts b/packages/next/build/webpack/plugins/middleware-plugin.ts
new file mode 100644
index 0000000000000..677bdce29a86c
--- /dev/null
+++ b/packages/next/build/webpack/plugins/middleware-plugin.ts
@@ -0,0 +1,197 @@
+import { webpack, sources } from 'next/dist/compiled/webpack/webpack'
+import { getMiddlewareRegex } from '../../../shared/lib/router/utils'
+import { getSortedRoutes } from '../../../shared/lib/router/utils'
+import { MIDDLEWARE_MANIFEST } from '../../../shared/lib/constants'
+import { MIDDLEWARE_ROUTE } from '../../../lib/constants'
+
+const PLUGIN_NAME = 'MiddlewarePlugin'
+const MIDDLEWARE_FULL_ROUTE_REGEX = /^pages[/\\]?(.*)\/_middleware$/
+
+export interface MiddlewareManifest {
+ version: 1
+ sortedMiddleware: string[]
+ middleware: {
+ [page: string]: {
+ env: string[]
+ files: string[]
+ name: string
+ page: string
+ regexp: string
+ }
+ }
+}
+
+export default class MiddlewarePlugin {
+ dev: boolean
+
+ constructor({ dev }: { dev: boolean }) {
+ this.dev = dev
+ }
+
+ createAssets(
+ compilation: any,
+ assets: any,
+ envPerRoute: Map
+ ) {
+ const entrypoints = compilation.entrypoints
+ const middlewareManifest: MiddlewareManifest = {
+ sortedMiddleware: [],
+ middleware: {},
+ version: 1,
+ }
+
+ for (const entrypoint of entrypoints.values()) {
+ const result = MIDDLEWARE_FULL_ROUTE_REGEX.exec(entrypoint.name)
+ const location = result ? `/${result[1]}` : null
+ if (!location) {
+ continue
+ }
+
+ const files = entrypoint
+ .getFiles()
+ .filter((file: string) => !file.endsWith('.hot-update.js'))
+
+ middlewareManifest.middleware[location] = {
+ env: envPerRoute.get(entrypoint.name)!,
+ files,
+ name: entrypoint.name,
+ page: location,
+ regexp: getMiddlewareRegex(location).namedRegex!,
+ }
+ }
+
+ middlewareManifest.sortedMiddleware = getSortedRoutes(
+ Object.keys(middlewareManifest.middleware)
+ )
+
+ assets[`server/${MIDDLEWARE_MANIFEST}`] = new sources.RawSource(
+ JSON.stringify(middlewareManifest, null, 2)
+ )
+ }
+
+ apply(compiler: webpack.Compiler) {
+ compiler.hooks.compilation.tap(
+ PLUGIN_NAME,
+ (compilation, { normalModuleFactory }) => {
+ const envPerRoute = new Map()
+
+ compilation.hooks.finishModules.tap(PLUGIN_NAME, () => {
+ const { moduleGraph } = compilation as any
+ envPerRoute.clear()
+
+ for (const [name, info] of compilation.entries) {
+ if (name.match(MIDDLEWARE_ROUTE)) {
+ const middlewareEntries = new Set()
+ const env = new Set()
+
+ const addEntriesFromDependency = (dep: any) => {
+ const module = moduleGraph.getModule(dep)
+ if (module) {
+ middlewareEntries.add(module)
+ }
+ }
+
+ info.dependencies.forEach(addEntriesFromDependency)
+ info.includeDependencies.forEach(addEntriesFromDependency)
+
+ const queue = new Set(middlewareEntries)
+ for (const module of queue) {
+ const { buildInfo } = module as any
+ if (buildInfo?.usingIndirectEval) {
+ // @ts-ignore TODO: Remove ignore when webpack 5 is stable
+ const error = new webpack.WebpackError(
+ `\`eval\` not allowed in Middleware ${name}`
+ )
+ error.module = module
+ compilation.warnings.push(error)
+ }
+
+ if (buildInfo?.nextUsedEnvVars !== undefined) {
+ for (const envName of buildInfo.nextUsedEnvVars) {
+ env.add(envName)
+ }
+ }
+
+ const connections = moduleGraph.getOutgoingConnections(module)
+ for (const connection of connections) {
+ if (connection.module) {
+ queue.add(connection.module)
+ }
+ }
+ }
+
+ envPerRoute.set(name, Array.from(env))
+ }
+ }
+ })
+
+ const handler = (parser: any) => {
+ const flagModule = () => {
+ parser.state.module.buildInfo.usingIndirectEval = true
+ }
+
+ parser.hooks.expression.for('eval').tap(PLUGIN_NAME, flagModule)
+ parser.hooks.expression.for('Function').tap(PLUGIN_NAME, flagModule)
+ parser.hooks.expression
+ .for('global.eval')
+ .tap(PLUGIN_NAME, flagModule)
+ parser.hooks.expression
+ .for('global.Function')
+ .tap(PLUGIN_NAME, flagModule)
+
+ const memberChainHandler = (_expr: any, members: string[]) => {
+ if (
+ !parser.state.module ||
+ parser.state.module.layer !== 'middleware'
+ ) {
+ return
+ }
+
+ if (members.length >= 2 && members[0] === 'env') {
+ const envName = members[1]
+ const { buildInfo } = parser.state.module
+ if (buildInfo.nextUsedEnvVars === undefined) {
+ buildInfo.nextUsedEnvVars = new Set()
+ }
+
+ buildInfo.nextUsedEnvVars.add(envName)
+ return true
+ }
+ }
+
+ parser.hooks.callMemberChain
+ .for('process')
+ .tap(PLUGIN_NAME, memberChainHandler)
+
+ parser.hooks.expressionMemberChain
+ .for('process')
+ .tap(PLUGIN_NAME, memberChainHandler)
+ }
+
+ normalModuleFactory.hooks.parser
+ .for('javascript/auto')
+ .tap(PLUGIN_NAME, handler)
+
+ normalModuleFactory.hooks.parser
+ .for('javascript/dynamic')
+ .tap(PLUGIN_NAME, handler)
+
+ normalModuleFactory.hooks.parser
+ .for('javascript/esm')
+ .tap(PLUGIN_NAME, handler)
+
+ // @ts-ignore TODO: Remove ignore when webpack 5 is stable
+ compilation.hooks.processAssets.tap(
+ {
+ name: 'NextJsMiddlewareManifest',
+ // @ts-ignore TODO: Remove ignore when webpack 5 is stable
+ stage: webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS,
+ },
+ (assets: any) => {
+ this.createAssets(compilation, assets, envPerRoute)
+ }
+ )
+ }
+ )
+ }
+}
diff --git a/packages/next/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts b/packages/next/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts
index 4c4ae8343dd88..8f13385b68a2b 100644
--- a/packages/next/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts
+++ b/packages/next/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts
@@ -1,4 +1,5 @@
-import { webpack } from 'next/dist/compiled/webpack/webpack'
+import type { Compiler, WebpackPluginInstance } from 'webpack5'
+import { clearSandboxCache } from '../../../server/web/sandbox'
import { realpathSync } from 'fs'
import path from 'path'
import isError from '../../../lib/is-error'
@@ -37,25 +38,25 @@ function deleteCache(filePath: string) {
const PLUGIN_NAME = 'NextJsRequireCacheHotReloader'
// This plugin flushes require.cache after emitting the files. Providing 'hot reloading' of server files.
-export class NextJsRequireCacheHotReloader implements webpack.Plugin {
+export class NextJsRequireCacheHotReloader implements WebpackPluginInstance {
prevAssets: any = null
previousOutputPathsWebpack5: Set = new Set()
currentOutputPathsWebpack5: Set = new Set()
- apply(compiler: webpack.Compiler) {
- // @ts-ignored Webpack has this hooks
+ apply(compiler: Compiler) {
compiler.hooks.assetEmitted.tap(
PLUGIN_NAME,
- (_file: any, { targetPath }: any) => {
+ (_file, { targetPath, content }) => {
this.currentOutputPathsWebpack5.add(targetPath)
deleteCache(targetPath)
+ clearSandboxCache(targetPath, content.toString('utf-8'))
}
)
compiler.hooks.afterEmit.tap(PLUGIN_NAME, (compilation) => {
RUNTIME_NAMES.forEach((name) => {
const runtimeChunkPath = path.join(
- compilation.outputOptions.path,
+ compilation.outputOptions.path!,
`${name}.js`
)
deleteCache(runtimeChunkPath)
@@ -70,7 +71,7 @@ export class NextJsRequireCacheHotReloader implements webpack.Plugin {
entries.forEach((page) => {
const outputPath = path.join(
- compilation.outputOptions.path,
+ compilation.outputOptions.path!,
page + '.js'
)
deleteCache(outputPath)
diff --git a/packages/next/client/index.tsx b/packages/next/client/index.tsx
index 6ad8ef37634cc..cf068ef80b7bd 100644
--- a/packages/next/client/index.tsx
+++ b/packages/next/client/index.tsx
@@ -358,6 +358,12 @@ export async function initNext(opts: { webpackHMR?: any } = {}) {
error.name = initialErr!.name
error.stack = initialErr!.stack
+ // Errors from the middleware are reported as client-side errors
+ // since the middleware is compiled using the client compiler
+ if ('middleware' in hydrateErr) {
+ throw error
+ }
+
const node = getNodeError(error)
throw node
})
diff --git a/packages/next/client/next-dev.js b/packages/next/client/next-dev.js
index 52933e52a5286..20b08adb37f2a 100644
--- a/packages/next/client/next-dev.js
+++ b/packages/next/client/next-dev.js
@@ -52,6 +52,8 @@ initNext({ webpackHMR })
.catch((err) => {
console.log(`Failed to fetch devPagesManifest`, err)
})
+ } else if (event.data.indexOf('middlewareChanges') !== -1) {
+ return window.location.reload()
} else if (event.data.indexOf('serverOnlyChanges') !== -1) {
const { pages } = JSON.parse(event.data)
diff --git a/packages/next/client/page-loader.ts b/packages/next/client/page-loader.ts
index 3fd86b6e2c7aa..c83db54764df7 100644
--- a/packages/next/client/page-loader.ts
+++ b/packages/next/client/page-loader.ts
@@ -12,6 +12,7 @@ import { removePathTrailingSlash } from './normalize-trailing-slash'
import {
createRouteLoader,
getClientBuildManifest,
+ getMiddlewareManifest,
RouteLoader,
} from './route-loader'
@@ -37,6 +38,7 @@ export default class PageLoader {
private promisedSsgManifest?: Promise
private promisedDevPagesManifest?: Promise
+ private promisedMiddlewareManifest?: Promise
public routeLoader: RouteLoader
constructor(buildId: string, assetPrefix: string) {
@@ -82,6 +84,31 @@ export default class PageLoader {
}
}
+ getMiddlewareList(): Promise {
+ if (process.env.NODE_ENV === 'production') {
+ return getMiddlewareManifest()
+ } else {
+ if ((window as any).__DEV_MIDDLEWARE_MANIFEST) {
+ return (window as any).__DEV_MIDDLEWARE_MANIFEST
+ } else {
+ if (!this.promisedMiddlewareManifest) {
+ this.promisedMiddlewareManifest = fetch(
+ `${this.assetPrefix}/_next/static/${this.buildId}/_devMiddlewareManifest.json`
+ )
+ .then((res) => res.json())
+ .then((manifest) => {
+ ;(window as any).__DEV_MIDDLEWARE_MANIFEST = manifest
+ return manifest
+ })
+ .catch((err) => {
+ console.log(`Failed to fetch _devMiddlewareManifest`, err)
+ })
+ }
+ return this.promisedMiddlewareManifest
+ }
+ }
+ }
+
/**
* @param {string} href the route href (file-system path)
* @param {string} asPath the URL as shown in browser (virtual path); used for dynamic routes
diff --git a/packages/next/client/route-loader.ts b/packages/next/client/route-loader.ts
index 177faec600b1a..2c6b6047d7bca 100644
--- a/packages/next/client/route-loader.ts
+++ b/packages/next/client/route-loader.ts
@@ -13,6 +13,8 @@ declare global {
interface Window {
__BUILD_MANIFEST?: ClientBuildManifest
__BUILD_MANIFEST_CB?: Function
+ __MIDDLEWARE_MANIFEST?: any
+ __MIDDLEWARE_MANIFEST_CB?: Function
}
}
@@ -231,6 +233,26 @@ export function getClientBuildManifest(): Promise {
)
}
+export function getMiddlewareManifest(): Promise {
+ if (self.__MIDDLEWARE_MANIFEST) {
+ return Promise.resolve(self.__MIDDLEWARE_MANIFEST)
+ }
+
+ const onMiddlewareManifest: Promise = new Promise((resolve) => {
+ const cb = self.__MIDDLEWARE_MANIFEST_CB
+ self.__MIDDLEWARE_MANIFEST_CB = () => {
+ resolve(self.__MIDDLEWARE_MANIFEST!)
+ cb && cb()
+ }
+ })
+
+ return resolvePromiseWithTimeout(
+ onMiddlewareManifest,
+ MS_MAX_IDLE_DELAY,
+ markAssetError(new Error('Failed to load client middleware manifest'))
+ )
+}
+
interface RouteFiles {
scripts: string[]
css: string[]
diff --git a/packages/next/compiled/@peculiar/webcrypto/package.json b/packages/next/compiled/@peculiar/webcrypto/package.json
new file mode 100644
index 0000000000000..f2e4fc36bec51
--- /dev/null
+++ b/packages/next/compiled/@peculiar/webcrypto/package.json
@@ -0,0 +1 @@
+{"name":"@peculiar/webcrypto","main":"webcrypto.js","author":"PeculiarVentures","license":"MIT"}
diff --git a/packages/next/compiled/@peculiar/webcrypto/webcrypto.js b/packages/next/compiled/@peculiar/webcrypto/webcrypto.js
new file mode 100644
index 0000000000000..f6a187bbec742
--- /dev/null
+++ b/packages/next/compiled/@peculiar/webcrypto/webcrypto.js
@@ -0,0 +1 @@
+module.exports=(()=>{var r={64:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.AsnConvert=void 0;const n=t(528);const s=t(317);const o=t(594);const i=t(558);class AsnConvert{static serialize(r){return i.AsnSerializer.serialize(r)}static parse(r,e){return o.AsnParser.parse(r,e)}static toString(r){const e=s.BufferSourceConverter.isBufferSource(r)?s.BufferSourceConverter.toArrayBuffer(r):AsnConvert.serialize(r);const t=n.fromBER(e);if(t.offset===-1){throw new Error(`Cannot decode ASN.1 data. ${t.result.error}`)}return t.result.toString()}}e.AsnConvert=AsnConvert},98:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.defaultConverter=e.AsnNullConverter=e.AsnGeneralizedTimeConverter=e.AsnUTCTimeConverter=e.AsnCharacterStringConverter=e.AsnGeneralStringConverter=e.AsnVisibleStringConverter=e.AsnGraphicStringConverter=e.AsnIA5StringConverter=e.AsnVideotexStringConverter=e.AsnTeletexStringConverter=e.AsnPrintableStringConverter=e.AsnNumericStringConverter=e.AsnUniversalStringConverter=e.AsnBmpStringConverter=e.AsnUtf8StringConverter=e.AsnOctetStringConverter=e.AsnBooleanConverter=e.AsnObjectIdentifierConverter=e.AsnBitStringConverter=e.AsnIntegerArrayBufferConverter=e.AsnEnumeratedConverter=e.AsnIntegerConverter=e.AsnAnyConverter=void 0;const n=t(528);const s=t(139);e.AsnAnyConverter={fromASN:r=>r instanceof n.Null?null:r.valueBeforeDecode,toASN:r=>{if(r===null){return new n.Null}const e=n.fromBER(r);if(e.result.error){throw new Error(e.result.error)}return e.result}};e.AsnIntegerConverter={fromASN:r=>r.valueBlock.valueHex.byteLength>4?r.valueBlock.toString():r.valueBlock.valueDec,toASN:r=>new n.Integer({value:r})};e.AsnEnumeratedConverter={fromASN:r=>r.valueBlock.valueDec,toASN:r=>new n.Enumerated({value:r})};e.AsnIntegerArrayBufferConverter={fromASN:r=>r.valueBlock.valueHex,toASN:r=>new n.Integer({valueHex:r})};e.AsnBitStringConverter={fromASN:r=>r.valueBlock.valueHex,toASN:r=>new n.BitString({valueHex:r})};e.AsnObjectIdentifierConverter={fromASN:r=>r.valueBlock.toString(),toASN:r=>new n.ObjectIdentifier({value:r})};e.AsnBooleanConverter={fromASN:r=>r.valueBlock.value,toASN:r=>new n.Boolean({value:r})};e.AsnOctetStringConverter={fromASN:r=>r.valueBlock.valueHex,toASN:r=>new n.OctetString({valueHex:r})};function createStringConverter(r){return{fromASN:r=>r.valueBlock.value,toASN:e=>new r({value:e})}}e.AsnUtf8StringConverter=createStringConverter(n.Utf8String);e.AsnBmpStringConverter=createStringConverter(n.BmpString);e.AsnUniversalStringConverter=createStringConverter(n.UniversalString);e.AsnNumericStringConverter=createStringConverter(n.NumericString);e.AsnPrintableStringConverter=createStringConverter(n.PrintableString);e.AsnTeletexStringConverter=createStringConverter(n.TeletexString);e.AsnVideotexStringConverter=createStringConverter(n.VideotexString);e.AsnIA5StringConverter=createStringConverter(n.IA5String);e.AsnGraphicStringConverter=createStringConverter(n.GraphicString);e.AsnVisibleStringConverter=createStringConverter(n.VisibleString);e.AsnGeneralStringConverter=createStringConverter(n.GeneralString);e.AsnCharacterStringConverter=createStringConverter(n.CharacterString);e.AsnUTCTimeConverter={fromASN:r=>r.toDate(),toASN:r=>new n.UTCTime({valueDate:r})};e.AsnGeneralizedTimeConverter={fromASN:r=>r.toDate(),toASN:r=>new n.GeneralizedTime({valueDate:r})};e.AsnNullConverter={fromASN:r=>null,toASN:r=>{return new n.Null}};function defaultConverter(r){switch(r){case s.AsnPropTypes.Any:return e.AsnAnyConverter;case s.AsnPropTypes.BitString:return e.AsnBitStringConverter;case s.AsnPropTypes.BmpString:return e.AsnBmpStringConverter;case s.AsnPropTypes.Boolean:return e.AsnBooleanConverter;case s.AsnPropTypes.CharacterString:return e.AsnCharacterStringConverter;case s.AsnPropTypes.Enumerated:return e.AsnEnumeratedConverter;case s.AsnPropTypes.GeneralString:return e.AsnGeneralStringConverter;case s.AsnPropTypes.GeneralizedTime:return e.AsnGeneralizedTimeConverter;case s.AsnPropTypes.GraphicString:return e.AsnGraphicStringConverter;case s.AsnPropTypes.IA5String:return e.AsnIA5StringConverter;case s.AsnPropTypes.Integer:return e.AsnIntegerConverter;case s.AsnPropTypes.Null:return e.AsnNullConverter;case s.AsnPropTypes.NumericString:return e.AsnNumericStringConverter;case s.AsnPropTypes.ObjectIdentifier:return e.AsnObjectIdentifierConverter;case s.AsnPropTypes.OctetString:return e.AsnOctetStringConverter;case s.AsnPropTypes.PrintableString:return e.AsnPrintableStringConverter;case s.AsnPropTypes.TeletexString:return e.AsnTeletexStringConverter;case s.AsnPropTypes.UTCTime:return e.AsnUTCTimeConverter;case s.AsnPropTypes.UniversalString:return e.AsnUniversalStringConverter;case s.AsnPropTypes.Utf8String:return e.AsnUtf8StringConverter;case s.AsnPropTypes.VideotexString:return e.AsnVideotexStringConverter;case s.AsnPropTypes.VisibleString:return e.AsnVisibleStringConverter;default:return null}}e.defaultConverter=defaultConverter},667:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.AsnProp=e.AsnType=void 0;const n=t(98);const s=t(173);const o=r=>e=>{let t;if(!s.schemaStorage.has(e)){t=s.schemaStorage.createDefault(e);s.schemaStorage.set(e,t)}else{t=s.schemaStorage.get(e)}Object.assign(t,r)};e.AsnType=o;const i=r=>(e,t)=>{let o;if(!s.schemaStorage.has(e.constructor)){o=s.schemaStorage.createDefault(e.constructor);s.schemaStorage.set(e.constructor,o)}else{o=s.schemaStorage.get(e.constructor)}const i=Object.assign({},r);if(typeof i.type==="number"&&!i.converter){const s=n.defaultConverter(r.type);if(!s){throw new Error(`Cannot get default converter for property '${t}' of ${e.constructor.name}`)}i.converter=s}o.items[t]=i};e.AsnProp=i},139:(r,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.AsnPropTypes=e.AsnTypeTypes=void 0;var t;(function(r){r[r["Sequence"]=0]="Sequence";r[r["Set"]=1]="Set";r[r["Choice"]=2]="Choice"})(t=e.AsnTypeTypes||(e.AsnTypeTypes={}));var n;(function(r){r[r["Any"]=1]="Any";r[r["Boolean"]=2]="Boolean";r[r["OctetString"]=3]="OctetString";r[r["BitString"]=4]="BitString";r[r["Integer"]=5]="Integer";r[r["Enumerated"]=6]="Enumerated";r[r["ObjectIdentifier"]=7]="ObjectIdentifier";r[r["Utf8String"]=8]="Utf8String";r[r["BmpString"]=9]="BmpString";r[r["UniversalString"]=10]="UniversalString";r[r["NumericString"]=11]="NumericString";r[r["PrintableString"]=12]="PrintableString";r[r["TeletexString"]=13]="TeletexString";r[r["VideotexString"]=14]="VideotexString";r[r["IA5String"]=15]="IA5String";r[r["GraphicString"]=16]="GraphicString";r[r["VisibleString"]=17]="VisibleString";r[r["GeneralString"]=18]="GeneralString";r[r["CharacterString"]=19]="CharacterString";r[r["UTCTime"]=20]="UTCTime";r[r["GeneralizedTime"]=21]="GeneralizedTime";r[r["DATE"]=22]="DATE";r[r["TimeOfDay"]=23]="TimeOfDay";r[r["DateTime"]=24]="DateTime";r[r["Duration"]=25]="Duration";r[r["TIME"]=26]="TIME";r[r["Null"]=27]="Null"})(n=e.AsnPropTypes||(e.AsnPropTypes={}))},473:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});const n=t(160);n.__exportStar(t(134),e)},134:(r,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.AsnSchemaValidationError=void 0;class AsnSchemaValidationError extends Error{constructor(){super(...arguments);this.schemas=[]}}e.AsnSchemaValidationError=AsnSchemaValidationError},142:(r,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.isArrayEqual=e.isTypeOfArray=e.isConvertible=void 0;function isConvertible(r){if(r&&r.prototype){if(r.prototype.toASN&&r.prototype.fromASN){return true}else{return isConvertible(r.prototype)}}else{return!!(r&&r.toASN&&r.fromASN)}}e.isConvertible=isConvertible;function isTypeOfArray(r){var e;if(r){const t=Object.getPrototypeOf(r);if(((e=t===null||t===void 0?void 0:t.prototype)===null||e===void 0?void 0:e.constructor)===Array){return true}return isTypeOfArray(t)}return false}e.isTypeOfArray=isTypeOfArray;function isArrayEqual(r,e){if(!(r&&e)){return false}if(r.byteLength!==e.byteLength){return false}const t=new Uint8Array(r);const n=new Uint8Array(e);for(let e=0;e{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.AsnSerializer=e.AsnParser=e.AsnPropTypes=e.AsnTypeTypes=e.AsnType=e.AsnProp=void 0;const n=t(160);n.__exportStar(t(98),e);n.__exportStar(t(466),e);var s=t(667);Object.defineProperty(e,"AsnProp",{enumerable:true,get:function(){return s.AsnProp}});Object.defineProperty(e,"AsnType",{enumerable:true,get:function(){return s.AsnType}});var o=t(139);Object.defineProperty(e,"AsnTypeTypes",{enumerable:true,get:function(){return o.AsnTypeTypes}});Object.defineProperty(e,"AsnPropTypes",{enumerable:true,get:function(){return o.AsnPropTypes}});var i=t(594);Object.defineProperty(e,"AsnParser",{enumerable:true,get:function(){return i.AsnParser}});var a=t(558);Object.defineProperty(e,"AsnSerializer",{enumerable:true,get:function(){return a.AsnSerializer}});n.__exportStar(t(473),e);n.__exportStar(t(995),e);n.__exportStar(t(64),e)},995:(r,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.AsnArray=void 0;class AsnArray extends Array{constructor(r=[]){if(typeof r==="number"){super(r)}else{super();for(const e of r){this.push(e)}}}}e.AsnArray=AsnArray},594:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.AsnParser=void 0;const n=t(528);const s=t(139);const o=t(98);const i=t(473);const a=t(142);const c=t(173);class AsnParser{static parse(r,e){let t;if(r instanceof ArrayBuffer){t=r}else if(typeof Buffer!=="undefined"&&Buffer.isBuffer(r)){t=new Uint8Array(r).buffer}else if(ArrayBuffer.isView(r)||r.buffer instanceof ArrayBuffer){t=r.buffer}else{throw new TypeError("Wrong type of 'data' argument")}const s=n.fromBER(t);if(s.result.error){throw new Error(s.result.error)}const o=this.fromASN(s.result,e);return o}static fromASN(r,e){var t;try{if(a.isConvertible(e)){const t=new e;return t.fromASN(r)}const u=c.schemaStorage.get(e);c.schemaStorage.cache(e);let f=u.schema;if(r.constructor===n.Constructed&&u.type!==s.AsnTypeTypes.Choice){f=new n.Constructed({idBlock:{tagClass:3,tagNumber:r.idBlock.tagNumber},value:u.schema.valueBlock.value});for(const e in u.items){delete r[e]}}const l=n.compareSchema(r,r,f);if(!l.verified){throw new i.AsnSchemaValidationError(`Data does not match to ${e.name} ASN1 schema. ${l.result.error}`)}const h=new e;if(a.isTypeOfArray(e)){if(typeof u.itemType==="number"){const t=o.defaultConverter(u.itemType);if(!t){throw new Error(`Cannot get default converter for array item of ${e.name} ASN1 schema`)}return e.from(r.valueBlock.value,r=>t.fromASN(r))}else{return e.from(r.valueBlock.value,r=>this.fromASN(r,u.itemType))}}for(const e in u.items){if(!r[e]){continue}const o=u.items[e];if(typeof o.type==="number"||a.isConvertible(o.type)){const i=(t=o.converter)!==null&&t!==void 0?t:a.isConvertible(o.type)?new o.type:null;if(!i){throw new Error("Converter is empty")}if(o.repeated){if(o.implicit){const t=o.repeated==="sequence"?n.Sequence:n.Set;const s=new t;s.valueBlock=r[e].valueBlock;const a=n.fromBER(s.toBER(false)).result.valueBlock.value;h[e]=Array.from(a,r=>i.fromASN(r))}else{h[e]=Array.from(r[e],r=>i.fromASN(r))}}else{let t=r[e];if(o.implicit){let r;if(a.isConvertible(o.type)){r=(new o.type).toSchema("")}else{const e=s.AsnPropTypes[o.type];const t=n[e];if(!t){throw new Error(`Cannot get '${e}' class from asn1js module`)}r=new t}r.valueBlock=t.valueBlock;t=n.fromBER(r.toBER(false)).result}h[e]=i.fromASN(t)}}else{if(o.repeated){h[e]=Array.from(r[e],r=>this.fromASN(r,o.type))}else{h[e]=this.fromASN(r[e],o.type)}}}return h}catch(r){if(r instanceof i.AsnSchemaValidationError){r.schemas.push(e.name)}throw r}}}e.AsnParser=AsnParser},397:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.AsnSchemaStorage=void 0;const n=t(528);const s=t(139);const o=t(142);class AsnSchemaStorage{constructor(){this.items=new WeakMap}has(r){return this.items.has(r)}get(r){var e,t,n,s;const o=this.items.get(r);if(!o){throw new Error(`Cannot get schema for '${(s=(n=(t=(e=r)===null||e===void 0?void 0:e.prototype)===null||t===void 0?void 0:t.constructor)===null||n===void 0?void 0:n.name)!==null&&s!==void 0?s:r}' target`)}return o}cache(r){const e=this.get(r);if(!e.schema){e.schema=this.create(r,true)}}createDefault(r){const e={type:s.AsnTypeTypes.Sequence,items:{}};const t=this.findParentSchema(r);if(t){Object.assign(e,t);e.items=Object.assign({},e.items,t.items)}return e}create(r,e){const t=this.items.get(r)||this.createDefault(r);const i=[];for(const r in t.items){const a=t.items[r];const c=e?r:"";let u;if(typeof a.type==="number"){const r=s.AsnPropTypes[a.type];const e=n[r];if(!e){throw new Error(`Cannot get ASN1 class by name '${r}'`)}u=new e({name:c})}else if(o.isConvertible(a.type)){const r=new a.type;u=r.toSchema(c)}else if(a.optional){const r=this.get(a.type);if(r.type===s.AsnTypeTypes.Choice){u=new n.Any({name:c})}else{u=this.create(a.type,false);u.name=c}}else{u=new n.Any({name:c})}const f=!!a.optional||a.defaultValue!==undefined;if(a.repeated){u.name="";const r=a.repeated==="set"?n.Set:n.Sequence;u=new r({name:"",value:[new n.Repeated({name:c,value:u})]})}if(a.context!==null&&a.context!==undefined){if(a.implicit){if(typeof a.type==="number"||o.isConvertible(a.type)){const r=a.repeated?n.Constructed:n.Primitive;i.push(new r({name:c,optional:f,idBlock:{tagClass:3,tagNumber:a.context}}))}else{this.cache(a.type);const r=!!a.repeated;let e=!r?this.get(a.type).schema:u;e=e.valueBlock?e.valueBlock.value:e.value;i.push(new n.Constructed({name:!r?c:"",optional:f,idBlock:{tagClass:3,tagNumber:a.context},value:e}))}}else{i.push(new n.Constructed({optional:f,idBlock:{tagClass:3,tagNumber:a.context},value:[u]}))}}else{u.optional=f;i.push(u)}}switch(t.type){case s.AsnTypeTypes.Sequence:return new n.Sequence({value:i,name:""});case s.AsnTypeTypes.Set:return new n.Set({value:i,name:""});case s.AsnTypeTypes.Choice:return new n.Choice({value:i,name:""});default:throw new Error(`Unsupported ASN1 type in use`)}}set(r,e){this.items.set(r,e);return this}findParentSchema(r){const e=r.__proto__;if(e){const r=this.items.get(e);return r||this.findParentSchema(e)}return null}}e.AsnSchemaStorage=AsnSchemaStorage},558:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.AsnSerializer=void 0;const n=t(528);const s=t(98);const o=t(139);const i=t(142);const a=t(173);class AsnSerializer{static serialize(r){if(r instanceof n.BaseBlock){return r.toBER(false)}return this.toASN(r).toBER(false)}static toASN(r){if(r&&i.isConvertible(r.constructor)){return r.toASN()}const e=r.constructor;const t=a.schemaStorage.get(e);a.schemaStorage.cache(e);let c=[];if(t.itemType){if(typeof t.itemType==="number"){const n=s.defaultConverter(t.itemType);if(!n){throw new Error(`Cannot get default converter for array item of ${e.name} ASN1 schema`)}c=r.map(r=>n.toASN(r))}else{c=r.map(r=>this.toAsnItem({type:t.itemType},"[]",e,r))}}else{for(const s in t.items){const o=t.items[s];const a=r[s];if(a===undefined||o.defaultValue===a||typeof o.defaultValue==="object"&&typeof a==="object"&&i.isArrayEqual(this.serialize(o.defaultValue),this.serialize(a))){continue}let u=AsnSerializer.toAsnItem(o,s,e,a);if(typeof o.context==="number"){if(o.implicit){if(!o.repeated&&(typeof o.type==="number"||i.isConvertible(o.type))){const r={};r.valueHex=u instanceof n.Null?u.valueBeforeDecode:u.valueBlock.toBER();c.push(new n.Primitive(Object.assign({optional:o.optional,idBlock:{tagClass:3,tagNumber:o.context}},r)))}else{c.push(new n.Constructed({optional:o.optional,idBlock:{tagClass:3,tagNumber:o.context},value:u.valueBlock.value}))}}else{c.push(new n.Constructed({optional:o.optional,idBlock:{tagClass:3,tagNumber:o.context},value:[u]}))}}else if(o.repeated){c=c.concat(u)}else{c.push(u)}}}let u;switch(t.type){case o.AsnTypeTypes.Sequence:u=new n.Sequence({value:c});break;case o.AsnTypeTypes.Set:u=new n.Set({value:c});break;case o.AsnTypeTypes.Choice:if(!c[0]){throw new Error(`Schema '${e.name}' has wrong data. Choice cannot be empty.`)}u=c[0];break}return u}static toAsnItem(r,e,t,s){let i;if(typeof r.type==="number"){const a=r.converter;if(!a){throw new Error(`Property '${e}' doesn't have converter for type ${o.AsnPropTypes[r.type]} in schema '${t.name}'`)}if(r.repeated){const e=Array.from(s,r=>a.toASN(r));const t=r.repeated==="sequence"?n.Sequence:n.Set;i=new t({value:e})}else{i=a.toASN(s)}}else{if(r.repeated){const e=Array.from(s,r=>this.toASN(r));const t=r.repeated==="sequence"?n.Sequence:n.Set;i=new t({value:e})}else{i=this.toASN(s)}}return i}}e.AsnSerializer=AsnSerializer},173:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.schemaStorage=void 0;const n=t(397);e.schemaStorage=new n.AsnSchemaStorage},799:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.BitString=void 0;const n=t(528);const s=t(317);class BitString{constructor(r,e=0){this.unusedBits=0;this.value=new ArrayBuffer(0);if(r){if(typeof r==="number"){this.fromNumber(r)}else if(s.BufferSourceConverter.isBufferSource(r)){this.unusedBits=e;this.value=s.BufferSourceConverter.toArrayBuffer(r)}else{throw TypeError("Unsupported type of 'params' argument for BitString")}}}fromASN(r){if(!(r instanceof n.BitString)){throw new TypeError("Argument 'asn' is not instance of ASN.1 BitString")}this.unusedBits=r.valueBlock.unusedBits;this.value=r.valueBlock.valueHex;return this}toASN(){return new n.BitString({unusedBits:this.unusedBits,valueHex:this.value})}toSchema(r){return new n.BitString({name:r})}toNumber(){let r="";const e=new Uint8Array(this.value);for(const t of e){r+=t.toString(2).padStart(8,"0")}r=r.split("").reverse().join("");if(this.unusedBits){r=r.slice(this.unusedBits).padStart(this.unusedBits,"0")}return parseInt(r,2)}fromNumber(r){let e=r.toString(2);const t=e.length+7>>3;this.unusedBits=(t<<3)-e.length;const n=new Uint8Array(t);e=e.padStart(t<<3,"0").split("").reverse().join("");let s=0;while(s{"use strict";Object.defineProperty(e,"__esModule",{value:true});const n=t(160);n.__exportStar(t(799),e);n.__exportStar(t(189),e)},189:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.OctetString=void 0;const n=t(528);const s=t(317);class OctetString{constructor(r){if(typeof r==="number"){this.buffer=new ArrayBuffer(r)}else{if(s.BufferSourceConverter.isBufferSource(r)){this.buffer=s.BufferSourceConverter.toArrayBuffer(r)}else if(Array.isArray(r)){this.buffer=new Uint8Array(r)}else{this.buffer=new ArrayBuffer(0)}}}get byteLength(){return this.buffer.byteLength}get byteOffset(){return 0}fromASN(r){if(!(r instanceof n.OctetString)){throw new TypeError("Argument 'asn' is not instance of ASN.1 OctetString")}this.buffer=r.valueBlock.valueHex;return this}toASN(){return new n.OctetString({valueHex:this.buffer})}toSchema(r){return new n.OctetString({name:r})}}e.OctetString=OctetString},160:(r,e,t)=>{"use strict";t.r(e);t.d(e,{__extends:()=>__extends,__assign:()=>s,__rest:()=>__rest,__decorate:()=>__decorate,__param:()=>__param,__metadata:()=>__metadata,__awaiter:()=>__awaiter,__generator:()=>__generator,__createBinding:()=>o,__exportStar:()=>__exportStar,__values:()=>__values,__read:()=>__read,__spread:()=>__spread,__spreadArrays:()=>__spreadArrays,__spreadArray:()=>__spreadArray,__await:()=>__await,__asyncGenerator:()=>__asyncGenerator,__asyncDelegator:()=>__asyncDelegator,__asyncValues:()=>__asyncValues,__makeTemplateObject:()=>__makeTemplateObject,__importStar:()=>__importStar,__importDefault:()=>__importDefault,__classPrivateFieldGet:()=>__classPrivateFieldGet,__classPrivateFieldSet:()=>__classPrivateFieldSet});var n=function(r,e){n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,e){r.__proto__=e}||function(r,e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))r[t]=e[t]};return n(r,e)};function __extends(r,e){if(typeof e!=="function"&&e!==null)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");n(r,e);function __(){this.constructor=r}r.prototype=e===null?Object.create(e):(__.prototype=e.prototype,new __)}var s=function(){s=Object.assign||function __assign(r){for(var e,t=1,n=arguments.length;t=0;a--)if(i=r[a])o=(s<3?i(o):s>3?i(e,t,o):i(e,t))||o;return s>3&&o&&Object.defineProperty(e,t,o),o}function __param(r,e){return function(t,n){e(t,n,r)}}function __metadata(r,e){if(typeof Reflect==="object"&&typeof Reflect.metadata==="function")return Reflect.metadata(r,e)}function __awaiter(r,e,t,n){function adopt(r){return r instanceof t?r:new t(function(e){e(r)})}return new(t||(t=Promise))(function(t,s){function fulfilled(r){try{step(n.next(r))}catch(r){s(r)}}function rejected(r){try{step(n["throw"](r))}catch(r){s(r)}}function step(r){r.done?t(r.value):adopt(r.value).then(fulfilled,rejected)}step((n=n.apply(r,e||[])).next())})}function __generator(r,e){var t={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},n,s,o,i;return i={next:verb(0),throw:verb(1),return:verb(2)},typeof Symbol==="function"&&(i[Symbol.iterator]=function(){return this}),i;function verb(r){return function(e){return step([r,e])}}function step(i){if(n)throw new TypeError("Generator is already executing.");while(t)try{if(n=1,s&&(o=i[0]&2?s["return"]:i[0]?s["throw"]||((o=s["return"])&&o.call(s),0):s.next)&&!(o=o.call(s,i[1])).done)return o;if(s=0,o)i=[i[0]&2,o.value];switch(i[0]){case 0:case 1:o=i;break;case 4:t.label++;return{value:i[1],done:false};case 5:t.label++;s=i[1];i=[0];continue;case 7:i=t.ops.pop();t.trys.pop();continue;default:if(!(o=t.trys,o=o.length>0&&o[o.length-1])&&(i[0]===6||i[0]===2)){t=0;continue}if(i[0]===3&&(!o||i[1]>o[0]&&i[1]=r.length)r=void 0;return{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(r,e){var t=typeof Symbol==="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),s,o=[],i;try{while((e===void 0||e-- >0)&&!(s=n.next()).done)o.push(s.value)}catch(r){i={error:r}}finally{try{if(s&&!s.done&&(t=n["return"]))t.call(n)}finally{if(i)throw i.error}}return o}function __spread(){for(var r=[],e=0;e1||resume(r,e)})}}function resume(r,e){try{step(n[r](e))}catch(r){settle(o[0][3],r)}}function step(r){r.value instanceof __await?Promise.resolve(r.value.v).then(fulfill,reject):settle(o[0][2],r)}function fulfill(r){resume("next",r)}function reject(r){resume("throw",r)}function settle(r,e){if(r(e),o.shift(),o.length)resume(o[0][0],o[0][1])}}function __asyncDelegator(r){var e,t;return e={},verb("next"),verb("throw",function(r){throw r}),verb("return"),e[Symbol.iterator]=function(){return this},e;function verb(n,s){e[n]=r[n]?function(e){return(t=!t)?{value:__await(r[n](e)),done:n==="return"}:s?s(e):e}:s}}function __asyncValues(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=r[Symbol.asyncIterator],t;return e?e.call(r):(r=typeof __values==="function"?__values(r):r[Symbol.iterator](),t={},verb("next"),verb("throw"),verb("return"),t[Symbol.asyncIterator]=function(){return this},t);function verb(e){t[e]=r[e]&&function(t){return new Promise(function(n,s){t=r[e](t),settle(n,s,t.done,t.value)})}}function settle(r,e,t,n){Promise.resolve(n).then(function(e){r({value:e,done:t})},e)}}function __makeTemplateObject(r,e){if(Object.defineProperty){Object.defineProperty(r,"raw",{value:e})}else{r.raw=e}return r}var i=Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:true,value:e})}:function(r,e){r["default"]=e};function __importStar(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)if(t!=="default"&&Object.prototype.hasOwnProperty.call(r,t))o(e,r,t);i(e,r);return e}function __importDefault(r){return r&&r.__esModule?r:{default:r}}function __classPrivateFieldGet(r,e,t,n){if(t==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof e==="function"?r!==e||!n:!e.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?n:t==="a"?n.call(r):n?n.value:e.get(r)}function __classPrivateFieldSet(r,e,t,n,s){if(n==="m")throw new TypeError("Private method is not writable");if(n==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e==="function"?r!==e||!s:!e.has(r))throw new TypeError("Cannot write private member to an object whose class did not declare it");return n==="a"?s.call(r,t):s?s.value=t:e.set(r,t),t}},895:(r,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});class JsonError extends Error{constructor(r,e){super(e?`${r}. See the inner exception for more details.`:r);this.message=r;this.innerError=e}}class TransformError extends JsonError{constructor(r,e,t){super(e,t);this.schema=r}}class ParserError extends TransformError{constructor(r,e,t){super(r,`JSON doesn't match to '${r.target.name}' schema. ${e}`,t)}}class ValidationError extends JsonError{}class SerializerError extends JsonError{constructor(r,e,t){super(`Cannot serialize by '${r}' schema. ${e}`,t);this.schemaName=r}}class KeyError extends ParserError{constructor(r,e,t={}){super(r,"Some keys doesn't match to schema");this.keys=e;this.errors=t}}(function(r){r[r["Any"]=0]="Any";r[r["Boolean"]=1]="Boolean";r[r["Number"]=2]="Number";r[r["String"]=3]="String"})(e.JsonPropTypes||(e.JsonPropTypes={}));function checkType(r,t){switch(t){case e.JsonPropTypes.Boolean:return typeof r==="boolean";case e.JsonPropTypes.Number:return typeof r==="number";case e.JsonPropTypes.String:return typeof r==="string"}return true}function throwIfTypeIsWrong(r,t){if(!checkType(r,t)){throw new TypeError(`Value must be ${e.JsonPropTypes[t]}`)}}function isConvertible(r){if(r&&r.prototype){if(r.prototype.toJSON&&r.prototype.fromJSON){return true}else{return isConvertible(r.prototype)}}else{return!!(r&&r.toJSON&&r.fromJSON)}}class JsonSchemaStorage{constructor(){this.items=new Map}has(r){return this.items.has(r)||!!this.findParentSchema(r)}get(r){const e=this.items.get(r)||this.findParentSchema(r);if(!e){throw new Error("Cannot get schema for current target")}return e}create(r){const e={names:{}};const t=this.findParentSchema(r);if(t){Object.assign(e,t);e.names={};for(const r in t.names){e.names[r]=Object.assign({},t.names[r])}}e.target=r;return e}set(r,e){this.items.set(r,e);return this}findParentSchema(r){const e=r.__proto__;if(e){const r=this.items.get(e);return r||this.findParentSchema(e)}return null}}const t="default";const n=new JsonSchemaStorage;class PatternValidation{constructor(r){this.pattern=new RegExp(r)}validate(r){const e=new RegExp(this.pattern.source,this.pattern.flags);if(typeof r!=="string"){throw new ValidationError("Incoming value must be string")}if(!e.exec(r)){throw new ValidationError(`Value doesn't match to pattern '${e.toString()}'`)}}}class InclusiveValidation{constructor(r=Number.MIN_VALUE,e=Number.MAX_VALUE){this.min=r;this.max=e}validate(r){throwIfTypeIsWrong(r,e.JsonPropTypes.Number);if(!(this.min<=r&&r<=this.max)){const r=this.min===Number.MIN_VALUE?"MIN":this.min;const e=this.max===Number.MAX_VALUE?"MAX":this.max;throw new ValidationError(`Value doesn't match to diapason [${r},${e}]`)}}}class ExclusiveValidation{constructor(r=Number.MIN_VALUE,e=Number.MAX_VALUE){this.min=r;this.max=e}validate(r){throwIfTypeIsWrong(r,e.JsonPropTypes.Number);if(!(this.minthis.maxLength){throw new ValidationError(`Value length must be less than ${this.maxLength}.`)}}}}class EnumerationValidation{constructor(r){this.enumeration=r}validate(r){throwIfTypeIsWrong(r,e.JsonPropTypes.String);if(!this.enumeration.includes(r)){throw new ValidationError(`Value must be one of ${this.enumeration.map(r=>`'${r}'`).join(", ")}`)}}}class JsonTransform{static checkValues(r,e){const t=Array.isArray(r)?r:[r];for(const n of t){for(const t of e.validations){if(t instanceof LengthValidation&&e.repeated){t.validate(r)}else{t.validate(n)}}}}static checkTypes(r,e){if(e.repeated&&!Array.isArray(r)){throw new TypeError("Value must be Array")}if(typeof e.type==="number"){const t=Array.isArray(r)?r:[r];for(const r of t){throwIfTypeIsWrong(r,e.type)}}}static getSchemaByName(r,e=t){return{...r.names[t],...r.names[e]}}}class JsonSerializer extends JsonTransform{static serialize(r,e,t,n){const s=this.toJSON(r,e);return JSON.stringify(s,t,n)}static toJSON(r,e={}){let s;let o=e.targetSchema;const i=e.schemaName||t;if(isConvertible(r)){return r.toJSON()}if(Array.isArray(r)){s=[];for(const t of r){s.push(this.toJSON(t,e))}}else if(typeof r==="object"){if(o&&!n.has(o)){throw new JsonError("Cannot get schema for `targetSchema` param")}o=o||r.constructor;if(n.has(o)){const e=n.get(o);s={};const t=this.getSchemaByName(e,i);for(const n in t){try{const a=t[n];const c=r[n];let u;if(a.optional&&c===undefined||a.defaultValue!==undefined&&c===a.defaultValue){continue}if(!a.optional&&c===undefined){throw new SerializerError(o.name,`Property '${n}' is required.`)}if(typeof a.type==="number"){if(a.converter){if(a.repeated){u=c.map(e=>a.converter.toJSON(e,r))}else{u=a.converter.toJSON(c,r)}}else{u=c}}else{if(a.repeated){u=c.map(r=>this.toJSON(r,{schemaName:i}))}else{u=this.toJSON(c,{schemaName:i})}}this.checkTypes(u,a);this.checkValues(u,a);s[a.name||n]=u}catch(r){if(r instanceof SerializerError){throw r}else{throw new SerializerError(e.target.name,`Property '${n}' is wrong. ${r.message}`,r)}}}}else{s={};for(const e in r){s[e]=this.toJSON(r[e],{schemaName:i})}}}else{s=r}return s}}class JsonParser extends JsonTransform{static parse(r,e){const t=JSON.parse(r);return this.fromJSON(t,e)}static fromJSON(r,e){const s=e.targetSchema;const o=e.schemaName||t;const i=new s;if(isConvertible(i)){return i.fromJSON(r)}const a=n.get(s);const c=this.getSchemaByName(a,o);const u={};if(e.strictProperty&&!Array.isArray(r)){JsonParser.checkStrictProperty(r,c,a)}for(const t in c){try{const n=c[t];const s=n.name||t;const f=r[s];if(f===undefined&&(n.optional||n.defaultValue!==undefined)){continue}if(!n.optional&&f===undefined){throw new ParserError(a,`Property '${s}' is required.`)}this.checkTypes(f,n);this.checkValues(f,n);if(typeof n.type==="number"){if(n.converter){if(n.repeated){i[t]=f.map(r=>n.converter.fromJSON(r,i))}else{i[t]=n.converter.fromJSON(f,i)}}else{i[t]=f}}else{const r={...e,targetSchema:n.type,schemaName:o};if(n.repeated){i[t]=f.map(e=>this.fromJSON(e,r))}else{i[t]=this.fromJSON(f,r)}}}catch(r){if(!(r instanceof ParserError)){r=new ParserError(a,`Property '${t}' is wrong. ${r.message}`,r)}if(e.strictAllKeys){u[t]=r}else{throw r}}}const f=Object.keys(u);if(f.length){throw new KeyError(a,f,u)}return i}static checkStrictProperty(r,e,t){const n=Object.keys(r);const s=Object.keys(e);const o=[];for(const r of n){if(s.indexOf(r)===-1){o.push(r)}}if(o.length){throw new KeyError(t,o)}}}function getValidations(r){const t=[];if(r.pattern){t.push(new PatternValidation(r.pattern))}if(r.type===e.JsonPropTypes.Number||r.type===e.JsonPropTypes.Any){if(r.minInclusive!==undefined||r.maxInclusive!==undefined){t.push(new InclusiveValidation(r.minInclusive,r.maxInclusive))}if(r.minExclusive!==undefined||r.maxExclusive!==undefined){t.push(new ExclusiveValidation(r.minExclusive,r.maxExclusive))}if(r.enumeration!==undefined){t.push(new EnumerationValidation(r.enumeration))}}if(r.type===e.JsonPropTypes.String||r.repeated||r.type===e.JsonPropTypes.Any){if(r.length!==undefined||r.minLength!==undefined||r.maxLength!==undefined){t.push(new LengthValidation(r.length,r.minLength,r.maxLength))}}return t}const s=(r={})=>(s,o)=>{const i=`Cannot set type for ${o} property of ${s.constructor.name} schema`;let a;if(!n.has(s.constructor)){a=n.create(s.constructor);n.set(s.constructor,a)}else{a=n.get(s.constructor);if(a.target!==s.constructor){a=n.create(s.constructor);n.set(s.constructor,a)}}const c={type:e.JsonPropTypes.Any,validations:[]};const u=Object.assign(c,r);u.validations=getValidations(u);if(typeof u.type!=="number"){if(!n.has(u.type)&&!isConvertible(u.type)){throw new Error(`${i}. Assigning type doesn't have schema.`)}}let f;if(Array.isArray(r.schema)){f=r.schema}else{f=[r.schema||t]}for(const r of f){if(!a.names[r]){a.names[r]={}}const e=a.names[r];e[o]=u}};e.JsonError=JsonError;e.JsonParser=JsonParser;e.JsonProp=s;e.JsonSerializer=JsonSerializer;e.KeyError=KeyError;e.ParserError=ParserError;e.SerializerError=SerializerError;e.TransformError=TransformError;e.ValidationError=ValidationError},25:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});var n=t(389);var s=t(417);var o=t(765);var i=t(950);var a=t(895);var c=t(317);var u=t(870);function _interopDefaultLegacy(r){return r&&typeof r==="object"&&"default"in r?r:{default:r}}function _interopNamespace(r){if(r&&r.__esModule)return r;var e=Object.create(null);if(r){Object.keys(r).forEach(function(t){if(t!=="default"){var n=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,n.get?n:{enumerable:true,get:function(){return r[t]}})}})}e["default"]=r;return Object.freeze(e)}var f=_interopNamespace(n);var l=_interopDefaultLegacy(s);var h=_interopNamespace(s);var y=_interopNamespace(o);const p={fromJSON:r=>Buffer.from(c.Convert.FromBase64Url(r)),toJSON:r=>c.Convert.ToBase64Url(r)};class CryptoKey extends f.CryptoKey{constructor(){super(...arguments);this.data=Buffer.alloc(0);this.algorithm={name:""};this.extractable=false;this.type="secret";this.usages=[];this.kty="oct";this.alg=""}}i.__decorate([a.JsonProp({name:"ext",type:a.JsonPropTypes.Boolean,optional:true})],CryptoKey.prototype,"extractable",void 0);i.__decorate([a.JsonProp({name:"key_ops",type:a.JsonPropTypes.String,repeated:true,optional:true})],CryptoKey.prototype,"usages",void 0);i.__decorate([a.JsonProp({type:a.JsonPropTypes.String})],CryptoKey.prototype,"kty",void 0);i.__decorate([a.JsonProp({type:a.JsonPropTypes.String})],CryptoKey.prototype,"alg",void 0);class SymmetricKey extends CryptoKey{constructor(){super(...arguments);this.kty="oct";this.type="secret"}}class AsymmetricKey extends CryptoKey{}class AesCryptoKey extends SymmetricKey{get alg(){switch(this.algorithm.name.toUpperCase()){case"AES-CBC":return`A${this.algorithm.length}CBC`;case"AES-CTR":return`A${this.algorithm.length}CTR`;case"AES-GCM":return`A${this.algorithm.length}GCM`;case"AES-KW":return`A${this.algorithm.length}KW`;case"AES-CMAC":return`A${this.algorithm.length}CMAC`;case"AES-ECB":return`A${this.algorithm.length}ECB`;default:throw new f.AlgorithmError("Unsupported algorithm name")}}set alg(r){}}i.__decorate([a.JsonProp({name:"k",converter:p})],AesCryptoKey.prototype,"data",void 0);const d=new WeakMap;function getCryptoKey(r){const e=d.get(r);if(!e){throw new f.OperationError("Cannot get CryptoKey from secure storage")}return e}function setCryptoKey(r){const e=f.CryptoKey.create(r.algorithm,r.type,r.extractable,r.usages);Object.freeze(e);d.set(e,r);return e}class AesCrypto{static async generateKey(r,e,t){const n=new AesCryptoKey;n.algorithm=r;n.extractable=e;n.usages=t;n.data=l["default"].randomBytes(r.length>>3);return n}static async exportKey(r,e){if(!(e instanceof AesCryptoKey)){throw new Error("key: Is not AesCryptoKey")}switch(r.toLowerCase()){case"jwk":return a.JsonSerializer.toJSON(e);case"raw":return new Uint8Array(e.data).buffer;default:throw new f.OperationError("format: Must be 'jwk' or 'raw'")}}static async importKey(r,e,t,n,s){let o;switch(r.toLowerCase()){case"jwk":o=a.JsonParser.fromJSON(e,{targetSchema:AesCryptoKey});break;case"raw":o=new AesCryptoKey;o.data=Buffer.from(e);break;default:throw new f.OperationError("format: Must be 'jwk' or 'raw'")}o.algorithm=t;o.algorithm.length=o.data.length<<3;o.extractable=n;o.usages=s;switch(o.algorithm.length){case 128:case 192:case 256:break;default:throw new f.OperationError("keyData: Is wrong key length")}return o}static async encrypt(r,e,t){switch(r.name.toUpperCase()){case"AES-CBC":return this.encryptAesCBC(r,e,Buffer.from(t));case"AES-CTR":return this.encryptAesCTR(r,e,Buffer.from(t));case"AES-GCM":return this.encryptAesGCM(r,e,Buffer.from(t));case"AES-KW":return this.encryptAesKW(r,e,Buffer.from(t));case"AES-ECB":return this.encryptAesECB(r,e,Buffer.from(t));default:throw new f.OperationError("algorithm: Is not recognized")}}static async decrypt(r,e,t){if(!(e instanceof AesCryptoKey)){throw new Error("key: Is not AesCryptoKey")}switch(r.name.toUpperCase()){case"AES-CBC":return this.decryptAesCBC(r,e,Buffer.from(t));case"AES-CTR":return this.decryptAesCTR(r,e,Buffer.from(t));case"AES-GCM":return this.decryptAesGCM(r,e,Buffer.from(t));case"AES-KW":return this.decryptAesKW(r,e,Buffer.from(t));case"AES-ECB":return this.decryptAesECB(r,e,Buffer.from(t));default:throw new f.OperationError("algorithm: Is not recognized")}}static async encryptAesCBC(r,e,t){const n=l["default"].createCipheriv(`aes-${e.algorithm.length}-cbc`,e.data,new Uint8Array(r.iv));let s=n.update(t);s=Buffer.concat([s,n.final()]);const o=new Uint8Array(s).buffer;return o}static async decryptAesCBC(r,e,t){const n=l["default"].createDecipheriv(`aes-${e.algorithm.length}-cbc`,e.data,new Uint8Array(r.iv));let s=n.update(t);s=Buffer.concat([s,n.final()]);return new Uint8Array(s).buffer}static async encryptAesCTR(r,e,t){const n=l["default"].createCipheriv(`aes-${e.algorithm.length}-ctr`,e.data,Buffer.from(r.counter));let s=n.update(t);s=Buffer.concat([s,n.final()]);const o=new Uint8Array(s).buffer;return o}static async decryptAesCTR(r,e,t){const n=l["default"].createDecipheriv(`aes-${e.algorithm.length}-ctr`,e.data,new Uint8Array(r.counter));let s=n.update(t);s=Buffer.concat([s,n.final()]);return new Uint8Array(s).buffer}static async encryptAesGCM(r,e,t){const n=l["default"].createCipheriv(`aes-${e.algorithm.length}-gcm`,e.data,Buffer.from(r.iv),{authTagLength:(r.tagLength||128)>>3});if(r.additionalData){n.setAAD(Buffer.from(r.additionalData))}let s=n.update(t);s=Buffer.concat([s,n.final(),n.getAuthTag()]);const o=new Uint8Array(s).buffer;return o}static async decryptAesGCM(r,e,t){const n=l["default"].createDecipheriv(`aes-${e.algorithm.length}-gcm`,e.data,new Uint8Array(r.iv));const s=(r.tagLength||128)>>3;const o=t.slice(0,t.length-s);const i=t.slice(t.length-s);if(r.additionalData){n.setAAD(Buffer.from(r.additionalData))}n.setAuthTag(i);let a=n.update(o);a=Buffer.concat([a,n.final()]);return new Uint8Array(a).buffer}static async encryptAesKW(r,e,t){const n=l["default"].createCipheriv(`id-aes${e.algorithm.length}-wrap`,e.data,this.AES_KW_IV);let s=n.update(t);s=Buffer.concat([s,n.final()]);return new Uint8Array(s).buffer}static async decryptAesKW(r,e,t){const n=l["default"].createDecipheriv(`id-aes${e.algorithm.length}-wrap`,e.data,this.AES_KW_IV);let s=n.update(t);s=Buffer.concat([s,n.final()]);return new Uint8Array(s).buffer}static async encryptAesECB(r,e,t){const n=l["default"].createCipheriv(`aes-${e.algorithm.length}-ecb`,e.data,new Uint8Array(0));let s=n.update(t);s=Buffer.concat([s,n.final()]);const o=new Uint8Array(s).buffer;return o}static async decryptAesECB(r,e,t){const n=l["default"].createDecipheriv(`aes-${e.algorithm.length}-ecb`,e.data,new Uint8Array(0));let s=n.update(t);s=Buffer.concat([s,n.final()]);return new Uint8Array(s).buffer}}AesCrypto.AES_KW_IV=Buffer.from("A6A6A6A6A6A6A6A6","hex");class AesCbcProvider extends f.AesCbcProvider{async onGenerateKey(r,e,t){const n=await AesCrypto.generateKey({name:this.name,length:r.length},e,t);return setCryptoKey(n)}async onEncrypt(r,e,t){return AesCrypto.encrypt(r,getCryptoKey(e),new Uint8Array(t))}async onDecrypt(r,e,t){return AesCrypto.decrypt(r,getCryptoKey(e),new Uint8Array(t))}async onExportKey(r,e){return AesCrypto.exportKey(r,getCryptoKey(e))}async onImportKey(r,e,t,n,s){const o=await AesCrypto.importKey(r,e,{name:t.name},n,s);return setCryptoKey(o)}checkCryptoKey(r,e){super.checkCryptoKey(r,e);if(!(getCryptoKey(r)instanceof AesCryptoKey)){throw new TypeError("key: Is not a AesCryptoKey")}}}const g=Buffer.from([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);const A=Buffer.from([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135]);const w=16;function bitShiftLeft(r){const e=Buffer.alloc(r.length);const t=r.length-1;for(let n=0;n>3);return n}static async exportKey(r,e){switch(r.toLowerCase()){case"jwk":return a.JsonSerializer.toJSON(e);case"raw":return new Uint8Array(e.data).buffer;default:throw new f.OperationError("format: Must be 'jwk' or 'raw'")}}static async importKey(r,e,t,n,s){let o;switch(r.toLowerCase()){case"jwk":o=a.JsonParser.fromJSON(e,{targetSchema:DesCryptoKey});break;case"raw":o=new DesCryptoKey;o.data=Buffer.from(e);break;default:throw new f.OperationError("format: Must be 'jwk' or 'raw'")}o.algorithm=t;o.extractable=n;o.usages=s;return o}static async encrypt(r,e,t){switch(r.name.toUpperCase()){case"DES-CBC":return this.encryptDesCBC(r,e,Buffer.from(t));case"DES-EDE3-CBC":return this.encryptDesEDE3CBC(r,e,Buffer.from(t));default:throw new f.OperationError("algorithm: Is not recognized")}}static async decrypt(r,e,t){if(!(e instanceof DesCryptoKey)){throw new Error("key: Is not DesCryptoKey")}switch(r.name.toUpperCase()){case"DES-CBC":return this.decryptDesCBC(r,e,Buffer.from(t));case"DES-EDE3-CBC":return this.decryptDesEDE3CBC(r,e,Buffer.from(t));default:throw new f.OperationError("algorithm: Is not recognized")}}static async encryptDesCBC(r,e,t){const n=l["default"].createCipheriv(`des-cbc`,e.data,new Uint8Array(r.iv));let s=n.update(t);s=Buffer.concat([s,n.final()]);const o=new Uint8Array(s).buffer;return o}static async decryptDesCBC(r,e,t){const n=l["default"].createDecipheriv(`des-cbc`,e.data,new Uint8Array(r.iv));let s=n.update(t);s=Buffer.concat([s,n.final()]);return new Uint8Array(s).buffer}static async encryptDesEDE3CBC(r,e,t){const n=l["default"].createCipheriv(`des-ede3-cbc`,e.data,Buffer.from(r.iv));let s=n.update(t);s=Buffer.concat([s,n.final()]);const o=new Uint8Array(s).buffer;return o}static async decryptDesEDE3CBC(r,e,t){const n=l["default"].createDecipheriv(`des-ede3-cbc`,e.data,new Uint8Array(r.iv));let s=n.update(t);s=Buffer.concat([s,n.final()]);return new Uint8Array(s).buffer}}class DesCbcProvider extends f.DesProvider{constructor(){super(...arguments);this.keySizeBits=64;this.ivSize=8;this.name="DES-CBC"}async onGenerateKey(r,e,t){const n=await DesCrypto.generateKey({name:this.name,length:this.keySizeBits},e,t);return setCryptoKey(n)}async onEncrypt(r,e,t){return DesCrypto.encrypt(r,getCryptoKey(e),new Uint8Array(t))}async onDecrypt(r,e,t){return DesCrypto.decrypt(r,getCryptoKey(e),new Uint8Array(t))}async onExportKey(r,e){return DesCrypto.exportKey(r,getCryptoKey(e))}async onImportKey(r,e,t,n,s){const o=await DesCrypto.importKey(r,e,{name:this.name,length:this.keySizeBits},n,s);if(o.data.length!==this.keySizeBits>>3){throw new f.OperationError("keyData: Wrong key size")}return setCryptoKey(o)}checkCryptoKey(r,e){super.checkCryptoKey(r,e);if(!(getCryptoKey(r)instanceof DesCryptoKey)){throw new TypeError("key: Is not a DesCryptoKey")}}}class DesEde3CbcProvider extends f.DesProvider{constructor(){super(...arguments);this.keySizeBits=192;this.ivSize=8;this.name="DES-EDE3-CBC"}async onGenerateKey(r,e,t){const n=await DesCrypto.generateKey({name:this.name,length:this.keySizeBits},e,t);return setCryptoKey(n)}async onEncrypt(r,e,t){return DesCrypto.encrypt(r,getCryptoKey(e),new Uint8Array(t))}async onDecrypt(r,e,t){return DesCrypto.decrypt(r,getCryptoKey(e),new Uint8Array(t))}async onExportKey(r,e){return DesCrypto.exportKey(r,getCryptoKey(e))}async onImportKey(r,e,t,n,s){const o=await DesCrypto.importKey(r,e,{name:this.name,length:this.keySizeBits},n,s);if(o.data.length!==this.keySizeBits>>3){throw new f.OperationError("keyData: Wrong key size")}return setCryptoKey(o)}checkCryptoKey(r,e){super.checkCryptoKey(r,e);if(!(getCryptoKey(r)instanceof DesCryptoKey)){throw new TypeError("key: Is not a DesCryptoKey")}}}function getJwkAlgorithm(r){switch(r.name.toUpperCase()){case"RSA-OAEP":{const e=/(\d+)$/.exec(r.hash.name)[1];return`RSA-OAEP${e!=="1"?`-${e}`:""}`}case"RSASSA-PKCS1-V1_5":return`RS${/(\d+)$/.exec(r.hash.name)[1]}`;case"RSA-PSS":return`PS${/(\d+)$/.exec(r.hash.name)[1]}`;case"RSA-PKCS1":return`RS1`;default:throw new f.OperationError("algorithm: Is not recognized")}}class RsaPrivateKey extends AsymmetricKey{constructor(){super(...arguments);this.type="private"}getKey(){const r=u.AsnParser.parse(this.data,f.asn1.PrivateKeyInfo);return u.AsnParser.parse(r.privateKey,f.asn1.RsaPrivateKey)}toJSON(){const r=this.getKey();const e={kty:"RSA",alg:getJwkAlgorithm(this.algorithm),key_ops:this.usages,ext:this.extractable};return Object.assign(e,a.JsonSerializer.toJSON(r))}fromJSON(r){const e=a.JsonParser.fromJSON(r,{targetSchema:f.asn1.RsaPrivateKey});const t=new f.asn1.PrivateKeyInfo;t.privateKeyAlgorithm.algorithm="1.2.840.113549.1.1.1";t.privateKeyAlgorithm.parameters=null;t.privateKey=u.AsnSerializer.serialize(e);this.data=Buffer.from(u.AsnSerializer.serialize(t))}}class RsaPublicKey extends AsymmetricKey{constructor(){super(...arguments);this.type="public"}getKey(){const r=u.AsnParser.parse(this.data,f.asn1.PublicKeyInfo);return u.AsnParser.parse(r.publicKey,f.asn1.RsaPublicKey)}toJSON(){const r=this.getKey();const e={kty:"RSA",alg:getJwkAlgorithm(this.algorithm),key_ops:this.usages,ext:this.extractable};return Object.assign(e,a.JsonSerializer.toJSON(r))}fromJSON(r){const e=a.JsonParser.fromJSON(r,{targetSchema:f.asn1.RsaPublicKey});const t=new f.asn1.PublicKeyInfo;t.publicKeyAlgorithm.algorithm="1.2.840.113549.1.1.1";t.publicKeyAlgorithm.parameters=null;t.publicKey=u.AsnSerializer.serialize(e);this.data=Buffer.from(u.AsnSerializer.serialize(t))}}class RsaCrypto{static async generateKey(r,e,t){const n=new RsaPrivateKey;n.algorithm=r;n.extractable=e;n.usages=t.filter(r=>this.privateKeyUsages.indexOf(r)!==-1);const s=new RsaPublicKey;s.algorithm=r;s.extractable=true;s.usages=t.filter(r=>this.publicKeyUsages.indexOf(r)!==-1);const o=Buffer.concat([Buffer.alloc(4-r.publicExponent.byteLength,0),Buffer.from(r.publicExponent)]).readInt32BE(0);const i=l["default"].generateKeyPairSync("rsa",{modulusLength:r.modulusLength,publicExponent:o,publicKeyEncoding:{format:"der",type:"spki"},privateKeyEncoding:{format:"der",type:"pkcs8"}});n.data=i.privateKey;s.data=i.publicKey;const a={privateKey:n,publicKey:s};return a}static async exportKey(r,e){switch(r.toLowerCase()){case"jwk":return a.JsonSerializer.toJSON(e);case"pkcs8":case"spki":return new Uint8Array(e.data).buffer;default:throw new f.OperationError("format: Must be 'jwk', 'pkcs8' or 'spki'")}}static async importKey(r,e,t,n,s){switch(r.toLowerCase()){case"jwk":{const r=e;if(r.d){const r=a.JsonParser.fromJSON(e,{targetSchema:f.asn1.RsaPrivateKey});return this.importPrivateKey(r,t,n,s)}else{const r=a.JsonParser.fromJSON(e,{targetSchema:f.asn1.RsaPublicKey});return this.importPublicKey(r,t,n,s)}}case"spki":{const r=u.AsnParser.parse(new Uint8Array(e),f.asn1.PublicKeyInfo);const o=u.AsnParser.parse(r.publicKey,f.asn1.RsaPublicKey);return this.importPublicKey(o,t,n,s)}case"pkcs8":{const r=u.AsnParser.parse(new Uint8Array(e),f.asn1.PrivateKeyInfo);const o=u.AsnParser.parse(r.privateKey,f.asn1.RsaPrivateKey);return this.importPrivateKey(o,t,n,s)}default:throw new f.OperationError("format: Must be 'jwk', 'pkcs8' or 'spki'")}}static async sign(r,e,t){switch(r.name.toUpperCase()){case"RSA-PSS":case"RSASSA-PKCS1-V1_5":return this.signRsa(r,e,t);default:throw new f.OperationError("algorithm: Is not recognized")}}static async verify(r,e,t,n){switch(r.name.toUpperCase()){case"RSA-PSS":case"RSASSA-PKCS1-V1_5":return this.verifySSA(r,e,n,t);default:throw new f.OperationError("algorithm: Is not recognized")}}static async encrypt(r,e,t){switch(r.name.toUpperCase()){case"RSA-OAEP":return this.encryptOAEP(r,e,t);default:throw new f.OperationError("algorithm: Is not recognized")}}static async decrypt(r,e,t){switch(r.name.toUpperCase()){case"RSA-OAEP":return this.decryptOAEP(r,e,t);default:throw new f.OperationError("algorithm: Is not recognized")}}static importPrivateKey(r,e,t,n){const s=new f.asn1.PrivateKeyInfo;s.privateKeyAlgorithm.algorithm="1.2.840.113549.1.1.1";s.privateKeyAlgorithm.parameters=null;s.privateKey=u.AsnSerializer.serialize(r);const o=new RsaPrivateKey;o.data=Buffer.from(u.AsnSerializer.serialize(s));o.algorithm=Object.assign({},e);o.algorithm.publicExponent=new Uint8Array(r.publicExponent);o.algorithm.modulusLength=r.modulus.byteLength<<3;o.extractable=t;o.usages=n;return o}static importPublicKey(r,e,t,n){const s=new f.asn1.PublicKeyInfo;s.publicKeyAlgorithm.algorithm="1.2.840.113549.1.1.1";s.publicKeyAlgorithm.parameters=null;s.publicKey=u.AsnSerializer.serialize(r);const o=new RsaPublicKey;o.data=Buffer.from(u.AsnSerializer.serialize(s));o.algorithm=Object.assign({},e);o.algorithm.publicExponent=new Uint8Array(r.publicExponent);o.algorithm.modulusLength=r.modulus.byteLength<<3;o.extractable=t;o.usages=n;return o}static getCryptoAlgorithm(r){switch(r.hash.name.toUpperCase()){case"SHA-1":return"RSA-SHA1";case"SHA-256":return"RSA-SHA256";case"SHA-384":return"RSA-SHA384";case"SHA-512":return"RSA-SHA512";default:throw new f.OperationError("algorithm.hash: Is not recognized")}}static signRsa(r,e,t){const n=this.getCryptoAlgorithm(e.algorithm);const s=l["default"].createSign(n);s.update(Buffer.from(t));if(!e.pem){e.pem=`-----BEGIN PRIVATE KEY-----\n${e.data.toString("base64")}\n-----END PRIVATE KEY-----`}const o={key:e.pem};if(r.name.toUpperCase()==="RSA-PSS"){o.padding=l["default"].constants.RSA_PKCS1_PSS_PADDING;o.saltLength=r.saltLength}const i=s.sign(o);return new Uint8Array(i).buffer}static verifySSA(r,e,t,n){const s=this.getCryptoAlgorithm(e.algorithm);const o=l["default"].createVerify(s);o.update(Buffer.from(t));if(!e.pem){e.pem=`-----BEGIN PUBLIC KEY-----\n${e.data.toString("base64")}\n-----END PUBLIC KEY-----`}const i={key:e.pem};if(r.name.toUpperCase()==="RSA-PSS"){i.padding=l["default"].constants.RSA_PKCS1_PSS_PADDING;i.saltLength=r.saltLength}const a=o.verify(i,n);return a}static encryptOAEP(r,e,t){const n={key:`-----BEGIN PUBLIC KEY-----\n${e.data.toString("base64")}\n-----END PUBLIC KEY-----`,padding:l["default"].constants.RSA_PKCS1_OAEP_PADDING};if(r.label);return new Uint8Array(l["default"].publicEncrypt(n,t)).buffer}static decryptOAEP(r,e,t){const n={key:`-----BEGIN PRIVATE KEY-----\n${e.data.toString("base64")}\n-----END PRIVATE KEY-----`,padding:l["default"].constants.RSA_PKCS1_OAEP_PADDING};if(r.label);return new Uint8Array(l["default"].privateDecrypt(n,t)).buffer}}RsaCrypto.publicKeyUsages=["verify","encrypt","wrapKey"];RsaCrypto.privateKeyUsages=["sign","decrypt","unwrapKey"];class RsaSsaProvider extends f.RsaSsaProvider{async onGenerateKey(r,e,t){const n=await RsaCrypto.generateKey({...r,name:this.name},e,t);return{privateKey:setCryptoKey(n.privateKey),publicKey:setCryptoKey(n.publicKey)}}async onSign(r,e,t){return RsaCrypto.sign(r,getCryptoKey(e),new Uint8Array(t))}async onVerify(r,e,t,n){return RsaCrypto.verify(r,getCryptoKey(e),new Uint8Array(t),new Uint8Array(n))}async onExportKey(r,e){return RsaCrypto.exportKey(r,getCryptoKey(e))}async onImportKey(r,e,t,n,s){const o=await RsaCrypto.importKey(r,e,{...t,name:this.name},n,s);return setCryptoKey(o)}checkCryptoKey(r,e){super.checkCryptoKey(r,e);const t=getCryptoKey(r);if(!(t instanceof RsaPrivateKey||t instanceof RsaPublicKey)){throw new TypeError("key: Is not RSA CryptoKey")}}}class RsaPssProvider extends f.RsaPssProvider{async onGenerateKey(r,e,t){const n=await RsaCrypto.generateKey({...r,name:this.name},e,t);return{privateKey:setCryptoKey(n.privateKey),publicKey:setCryptoKey(n.publicKey)}}async onSign(r,e,t){return RsaCrypto.sign(r,getCryptoKey(e),new Uint8Array(t))}async onVerify(r,e,t,n){return RsaCrypto.verify(r,getCryptoKey(e),new Uint8Array(t),new Uint8Array(n))}async onExportKey(r,e){return RsaCrypto.exportKey(r,getCryptoKey(e))}async onImportKey(r,e,t,n,s){const o=await RsaCrypto.importKey(r,e,{...t,name:this.name},n,s);return setCryptoKey(o)}checkCryptoKey(r,e){super.checkCryptoKey(r,e);const t=getCryptoKey(r);if(!(t instanceof RsaPrivateKey||t instanceof RsaPublicKey)){throw new TypeError("key: Is not RSA CryptoKey")}}}class ShaCrypto{static size(r){switch(r.name.toUpperCase()){case"SHA-1":return 160;case"SHA-256":return 256;case"SHA-384":return 384;case"SHA-512":return 512;default:throw new Error("Unrecognized name")}}static digest(r,e){const t=l["default"].createHash(r.name.replace("-","")).update(Buffer.from(e)).digest();return new Uint8Array(t).buffer}}class RsaOaepProvider extends f.RsaOaepProvider{async onGenerateKey(r,e,t){const n=await RsaCrypto.generateKey({...r,name:this.name},e,t);return{privateKey:setCryptoKey(n.privateKey),publicKey:setCryptoKey(n.publicKey)}}async onEncrypt(r,e,t){const n=getCryptoKey(e);const s=new Uint8Array(t);const o=Math.ceil(n.algorithm.modulusLength>>3);const i=ShaCrypto.size(n.algorithm.hash)>>3;const a=s.byteLength;const c=o-a-2*i-2;if(a>o-2*i-2){throw new Error("Data too large")}const u=new Uint8Array(o);const h=u.subarray(1,i+1);const y=u.subarray(i+1);y.set(s,i+c+1);const p=l["default"].createHash(n.algorithm.hash.name.replace("-","")).update(f.BufferSourceConverter.toUint8Array(r.label||new Uint8Array(0))).digest();y.set(p,0);y[i+c]=1;l["default"].randomFillSync(h);const d=this.mgf1(n.algorithm.hash,h,y.length);for(let r=0;r>3);const o=ShaCrypto.size(n.algorithm.hash)>>3;const i=t.byteLength;if(i!==s){throw new Error("Bad data")}if(!n.pem){n.pem=`-----BEGIN PRIVATE KEY-----\n${n.data.toString("base64")}\n-----END PRIVATE KEY-----`}let a=l["default"].privateDecrypt({key:n.pem,padding:l["default"].constants.RSA_NO_PADDING},Buffer.from(t));const c=a[0];const u=a.subarray(1,o+1);const h=a.subarray(o+1);if(c!==0){throw new Error("Decryption failed")}const y=this.mgf1(n.algorithm.hash,h,u.length);for(let r=0;r>3;const s=new Uint8Array(t);const o=new Uint8Array(4);const i=Math.ceil(t/n);for(let t=0;t>>24;o[1]=t>>>16&255;o[2]=t>>>8&255;o[3]=t&255;const i=s.subarray(t*n);let a=l["default"].createHash(r.name.replace("-","")).update(e).update(o).digest();if(a.length>i.length){a=a.subarray(0,i.length)}i.set(a)}return s}}class RsaEsProvider extends f.ProviderCrypto{constructor(){super(...arguments);this.name="RSAES-PKCS1-v1_5";this.usages={publicKey:["encrypt","wrapKey"],privateKey:["decrypt","unwrapKey"]}}async onGenerateKey(r,e,t){const n=await RsaCrypto.generateKey({...r,name:this.name},e,t);return{privateKey:setCryptoKey(n.privateKey),publicKey:setCryptoKey(n.publicKey)}}checkGenerateKeyParams(r){this.checkRequiredProperty(r,"publicExponent");if(!(r.publicExponent&&r.publicExponent instanceof Uint8Array)){throw new TypeError("publicExponent: Missing or not a Uint8Array")}const e=c.Convert.ToBase64(r.publicExponent);if(!(e==="Aw=="||e==="AQAB")){throw new TypeError("publicExponent: Must be [3] or [1,0,1]")}this.checkRequiredProperty(r,"modulusLength");switch(r.modulusLength){case 1024:case 2048:case 4096:break;default:throw new TypeError("modulusLength: Must be 1024, 2048, or 4096")}}async onEncrypt(r,e,t){const n=this.toCryptoOptions(e);const s=h.publicEncrypt(n,new Uint8Array(t));return new Uint8Array(s).buffer}async onDecrypt(r,e,t){const n=this.toCryptoOptions(e);const s=h.privateDecrypt(n,new Uint8Array(t));return new Uint8Array(s).buffer}async onExportKey(r,e){return RsaCrypto.exportKey(r,getCryptoKey(e))}async onImportKey(r,e,t,n,s){const o=await RsaCrypto.importKey(r,e,{...t,name:this.name},n,s);return setCryptoKey(o)}checkCryptoKey(r,e){super.checkCryptoKey(r,e);const t=getCryptoKey(r);if(!(t instanceof RsaPrivateKey||t instanceof RsaPublicKey)){throw new TypeError("key: Is not RSA CryptoKey")}}toCryptoOptions(r){const e=r.type.toUpperCase();return{key:`-----BEGIN ${e} KEY-----\n${getCryptoKey(r).data.toString("base64")}\n-----END ${e} KEY-----`,padding:h.constants.RSA_PKCS1_PADDING}}}const B={"1.2.840.10045.3.1.7":"P-256","P-256":"1.2.840.10045.3.1.7","1.3.132.0.34":"P-384","P-384":"1.3.132.0.34","1.3.132.0.35":"P-521","P-521":"1.3.132.0.35","1.3.132.0.10":"K-256","K-256":"1.3.132.0.10"};function getOidByNamedCurve$1(r){const e=B[r];if(!e){throw new f.OperationError(`Cannot convert WebCrypto named curve '${r}' to OID`)}return e}class EcPrivateKey extends AsymmetricKey{constructor(){super(...arguments);this.type="private"}getKey(){const r=u.AsnParser.parse(this.data,f.asn1.PrivateKeyInfo);return u.AsnParser.parse(r.privateKey,f.asn1.EcPrivateKey)}toJSON(){const r=this.getKey();const e={kty:"EC",crv:this.algorithm.namedCurve,key_ops:this.usages,ext:this.extractable};return Object.assign(e,a.JsonSerializer.toJSON(r))}fromJSON(r){if(!r.crv){throw new f.OperationError(`Cannot get named curve from JWK. Property 'crv' is required`)}const e=new f.asn1.PrivateKeyInfo;e.privateKeyAlgorithm.algorithm="1.2.840.10045.2.1";e.privateKeyAlgorithm.parameters=u.AsnSerializer.serialize(new f.asn1.ObjectIdentifier(getOidByNamedCurve$1(r.crv)));const t=a.JsonParser.fromJSON(r,{targetSchema:f.asn1.EcPrivateKey});e.privateKey=u.AsnSerializer.serialize(t);this.data=Buffer.from(u.AsnSerializer.serialize(e));return this}}class EcPublicKey extends AsymmetricKey{constructor(){super(...arguments);this.type="public"}getKey(){const r=u.AsnParser.parse(this.data,f.asn1.PublicKeyInfo);return new f.asn1.EcPublicKey(r.publicKey)}toJSON(){const r=this.getKey();const e={kty:"EC",crv:this.algorithm.namedCurve,key_ops:this.usages,ext:this.extractable};return Object.assign(e,a.JsonSerializer.toJSON(r))}fromJSON(r){if(!r.crv){throw new f.OperationError(`Cannot get named curve from JWK. Property 'crv' is required`)}const e=a.JsonParser.fromJSON(r,{targetSchema:f.asn1.EcPublicKey});const t=new f.asn1.PublicKeyInfo;t.publicKeyAlgorithm.algorithm="1.2.840.10045.2.1";t.publicKeyAlgorithm.parameters=u.AsnSerializer.serialize(new f.asn1.ObjectIdentifier(getOidByNamedCurve$1(r.crv)));t.publicKey=u.AsnSerializer.toASN(e).valueHex;this.data=Buffer.from(u.AsnSerializer.serialize(t));return this}}class EcCrypto{static async generateKey(r,e,t){const n=new EcPrivateKey;n.algorithm=r;n.extractable=e;n.usages=t.filter(r=>this.privateKeyUsages.indexOf(r)!==-1);const s=new EcPublicKey;s.algorithm=r;s.extractable=true;s.usages=t.filter(r=>this.publicKeyUsages.indexOf(r)!==-1);const o=l["default"].generateKeyPairSync("ec",{namedCurve:this.getOpenSSLNamedCurve(r.namedCurve),publicKeyEncoding:{format:"der",type:"spki"},privateKeyEncoding:{format:"der",type:"pkcs8"}});n.data=o.privateKey;s.data=o.publicKey;const i={privateKey:n,publicKey:s};return i}static async sign(r,e,t){const n=r.hash.name.replace("-","");const s=l["default"].createSign(n);s.update(Buffer.from(t));if(!e.pem){e.pem=`-----BEGIN PRIVATE KEY-----\n${e.data.toString("base64")}\n-----END PRIVATE KEY-----`}const o={key:e.pem};const i=s.sign(o);const a=u.AsnParser.parse(i,f.asn1.EcDsaSignature);const c=this.getPointSize(e.algorithm.namedCurve);const h=this.addPadding(c,Buffer.from(a.r));const y=this.addPadding(c,Buffer.from(a.s));const p=new Uint8Array(Buffer.concat([h,y])).buffer;return p}static async verify(r,e,t,n){const s=r.hash.name.replace("-","");const o=l["default"].createVerify(s);o.update(Buffer.from(n));if(!e.pem){e.pem=`-----BEGIN PUBLIC KEY-----\n${e.data.toString("base64")}\n-----END PUBLIC KEY-----`}const i={key:e.pem};const a=new f.asn1.EcDsaSignature;const c=this.getPointSize(e.algorithm.namedCurve);a.r=this.removePadding(t.slice(0,c));a.s=this.removePadding(t.slice(c,c+c));const h=Buffer.from(u.AsnSerializer.serialize(a));const y=o.verify(i,h);return y}static async deriveBits(r,e,t){const n=this.getOpenSSLNamedCurve(e.algorithm.namedCurve);const s=l["default"].createECDH(n);const o=u.AsnParser.parse(e.data,f.asn1.PrivateKeyInfo);const i=u.AsnParser.parse(o.privateKey,f.asn1.EcPrivateKey);s.setPrivateKey(Buffer.from(i.privateKey));const a=u.AsnParser.parse(r.public.data,f.asn1.PublicKeyInfo);const c=s.computeSecret(Buffer.from(a.publicKey));return new Uint8Array(c).buffer.slice(0,t>>3)}static async exportKey(r,e){switch(r.toLowerCase()){case"jwk":return a.JsonSerializer.toJSON(e);case"pkcs8":case"spki":return new Uint8Array(e.data).buffer;case"raw":{const r=u.AsnParser.parse(e.data,f.asn1.PublicKeyInfo);return r.publicKey}default:throw new f.OperationError("format: Must be 'jwk', 'raw', pkcs8' or 'spki'")}}static async importKey(r,e,t,n,s){switch(r.toLowerCase()){case"jwk":{const r=e;if(r.d){const r=a.JsonParser.fromJSON(e,{targetSchema:f.asn1.EcPrivateKey});return this.importPrivateKey(r,t,n,s)}else{const r=a.JsonParser.fromJSON(e,{targetSchema:f.asn1.EcPublicKey});return this.importPublicKey(r,t,n,s)}}case"raw":{const r=new f.asn1.EcPublicKey(e);return this.importPublicKey(r,t,n,s)}case"spki":{const r=u.AsnParser.parse(new Uint8Array(e),f.asn1.PublicKeyInfo);const o=new f.asn1.EcPublicKey(r.publicKey);this.assertKeyParameters(r.publicKeyAlgorithm.parameters,t.namedCurve);return this.importPublicKey(o,t,n,s)}case"pkcs8":{const r=u.AsnParser.parse(new Uint8Array(e),f.asn1.PrivateKeyInfo);const o=u.AsnParser.parse(r.privateKey,f.asn1.EcPrivateKey);this.assertKeyParameters(r.privateKeyAlgorithm.parameters,t.namedCurve);return this.importPrivateKey(o,t,n,s)}default:throw new f.OperationError("format: Must be 'jwk', 'raw', 'pkcs8' or 'spki'")}}static assertKeyParameters(r,e){if(!r){throw new f.CryptoError("Key info doesn't have required parameters")}let t="";try{t=u.AsnParser.parse(r,f.asn1.ObjectIdentifier).value}catch(r){throw new f.CryptoError("Cannot read key info parameters")}if(getOidByNamedCurve$1(e)!==t){throw new f.CryptoError("Key info parameter doesn't match to named curve")}}static async importPrivateKey(r,e,t,n){const s=new f.asn1.PrivateKeyInfo;s.privateKeyAlgorithm.algorithm="1.2.840.10045.2.1";s.privateKeyAlgorithm.parameters=u.AsnSerializer.serialize(new f.asn1.ObjectIdentifier(getOidByNamedCurve$1(e.namedCurve)));s.privateKey=u.AsnSerializer.serialize(r);const o=new EcPrivateKey;o.data=Buffer.from(u.AsnSerializer.serialize(s));o.algorithm=Object.assign({},e);o.extractable=t;o.usages=n;return o}static async importPublicKey(r,e,t,n){const s=new f.asn1.PublicKeyInfo;s.publicKeyAlgorithm.algorithm="1.2.840.10045.2.1";const o=getOidByNamedCurve$1(e.namedCurve);s.publicKeyAlgorithm.parameters=u.AsnSerializer.serialize(new f.asn1.ObjectIdentifier(o));s.publicKey=r.value;const i=new EcPublicKey;i.data=Buffer.from(u.AsnSerializer.serialize(s));i.algorithm=Object.assign({},e);i.extractable=t;i.usages=n;return i}static getOpenSSLNamedCurve(r){switch(r.toUpperCase()){case"P-256":return"prime256v1";case"K-256":return"secp256k1";case"P-384":return"secp384r1";case"P-521":return"secp521r1";default:throw new f.OperationError(`Cannot convert WebCrypto named curve to NodeJs. Unknown name '${r}'`)}}static getPointSize(r){switch(r){case"P-256":case"K-256":return 32;case"P-384":return 48;case"P-521":return 66;default:throw new Error(`Cannot get size for the named curve '${r}'`)}}static addPadding(r,e){const t=Buffer.alloc(r);t.set(Buffer.from(e),r-e.length);return t}static removePadding(r){for(let e=0;ethis.privateKeyUsages.indexOf(r)!==-1);const s=new EdPublicKey;s.algorithm=r;s.extractable=true;s.usages=t.filter(r=>this.publicKeyUsages.indexOf(r)!==-1);const o=r.namedCurve.toLowerCase();const i=l["default"].generateKeyPairSync(o,{publicKeyEncoding:{format:"der",type:"spki"},privateKeyEncoding:{format:"der",type:"pkcs8"}});n.data=i.privateKey;s.data=i.publicKey;const a={privateKey:n,publicKey:s};return a}static async sign(r,e,t){if(!e.pem){e.pem=`-----BEGIN PRIVATE KEY-----\n${e.data.toString("base64")}\n-----END PRIVATE KEY-----`}const n={key:e.pem};const s=l["default"].sign(null,Buffer.from(t),n);return f.BufferSourceConverter.toArrayBuffer(s)}static async verify(r,e,t,n){if(!e.pem){e.pem=`-----BEGIN PUBLIC KEY-----\n${e.data.toString("base64")}\n-----END PUBLIC KEY-----`}const s={key:e.pem};const o=l["default"].verify(null,Buffer.from(n),s,Buffer.from(t));return o}static async deriveBits(r,e,t){const n=l["default"].createPublicKey({key:r.public.data,format:"der",type:"spki"});const s=l["default"].createPrivateKey({key:e.data,format:"der",type:"pkcs8"});const o=l["default"].diffieHellman({publicKey:n,privateKey:s});return new Uint8Array(o).buffer.slice(0,t>>3)}static async exportKey(r,e){switch(r.toLowerCase()){case"jwk":return a.JsonSerializer.toJSON(e);case"pkcs8":case"spki":return new Uint8Array(e.data).buffer;case"raw":{const r=u.AsnParser.parse(e.data,f.asn1.PublicKeyInfo);return r.publicKey}default:throw new f.OperationError("format: Must be 'jwk', 'raw', pkcs8' or 'spki'")}}static async importKey(r,e,t,n,s){switch(r.toLowerCase()){case"jwk":{const r=e;if(r.d){const r=a.JsonParser.fromJSON(e,{targetSchema:f.asn1.CurvePrivateKey});return this.importPrivateKey(r,t,n,s)}else{if(!r.x){throw new TypeError("keyData: Cannot get required 'x' filed")}return this.importPublicKey(c.Convert.FromBase64Url(r.x),t,n,s)}}case"raw":{return this.importPublicKey(e,t,n,s)}case"spki":{const r=u.AsnParser.parse(new Uint8Array(e),f.asn1.PublicKeyInfo);return this.importPublicKey(r.publicKey,t,n,s)}case"pkcs8":{const r=u.AsnParser.parse(new Uint8Array(e),f.asn1.PrivateKeyInfo);const o=u.AsnParser.parse(r.privateKey,f.asn1.CurvePrivateKey);return this.importPrivateKey(o,t,n,s)}default:throw new f.OperationError("format: Must be 'jwk', 'raw', 'pkcs8' or 'spki'")}}static importPrivateKey(r,e,t,n){const s=new EdPrivateKey;s.fromJSON({crv:e.namedCurve,d:c.Convert.ToBase64Url(r.d)});s.algorithm=Object.assign({},e);s.extractable=t;s.usages=n;return s}static async importPublicKey(r,e,t,n){const s=new EdPublicKey;s.fromJSON({crv:e.namedCurve,x:c.Convert.ToBase64Url(r)});s.algorithm=Object.assign({},e);s.extractable=t;s.usages=n;return s}}EdCrypto.publicKeyUsages=["verify"];EdCrypto.privateKeyUsages=["sign","deriveKey","deriveBits"];class EdDsaProvider extends f.EdDsaProvider{async onGenerateKey(r,e,t){const n=await EdCrypto.generateKey({name:this.name,namedCurve:r.namedCurve.replace(/^ed/i,"Ed")},e,t);return{privateKey:setCryptoKey(n.privateKey),publicKey:setCryptoKey(n.publicKey)}}async onSign(r,e,t){return EdCrypto.sign(r,getCryptoKey(e),new Uint8Array(t))}async onVerify(r,e,t,n){return EdCrypto.verify(r,getCryptoKey(e),new Uint8Array(t),new Uint8Array(n))}async onExportKey(r,e){return EdCrypto.exportKey(r,getCryptoKey(e))}async onImportKey(r,e,t,n,s){const o=await EdCrypto.importKey(r,e,{...t,name:this.name},n,s);return setCryptoKey(o)}}class EcdhEsProvider extends f.EcdhEsProvider{async onGenerateKey(r,e,t){const n=await EdCrypto.generateKey({name:this.name,namedCurve:r.namedCurve.toUpperCase()},e,t);return{privateKey:setCryptoKey(n.privateKey),publicKey:setCryptoKey(n.publicKey)}}async onDeriveBits(r,e,t){const n=await EdCrypto.deriveBits({...r,public:getCryptoKey(r.public)},getCryptoKey(e),t);return n}async onExportKey(r,e){return EdCrypto.exportKey(r,getCryptoKey(e))}async onImportKey(r,e,t,n,s){const o=await EdCrypto.importKey(r,e,{...t,name:this.name},n,s);return setCryptoKey(o)}}class Sha1Provider extends f.ProviderCrypto{constructor(){super(...arguments);this.name="SHA-1";this.usages=[]}async onDigest(r,e){return ShaCrypto.digest(r,e)}}class Sha256Provider extends f.ProviderCrypto{constructor(){super(...arguments);this.name="SHA-256";this.usages=[]}async onDigest(r,e){return ShaCrypto.digest(r,e)}}class Sha384Provider extends f.ProviderCrypto{constructor(){super(...arguments);this.name="SHA-384";this.usages=[]}async onDigest(r,e){return ShaCrypto.digest(r,e)}}class Sha512Provider extends f.ProviderCrypto{constructor(){super(...arguments);this.name="SHA-512";this.usages=[]}async onDigest(r,e){return ShaCrypto.digest(r,e)}}class PbkdfCryptoKey extends CryptoKey{}class Pbkdf2Provider extends f.Pbkdf2Provider{async onDeriveBits(r,e,t){return new Promise((n,s)=>{const o=f.BufferSourceConverter.toArrayBuffer(r.salt);const i=r.hash.name.replace("-","");l["default"].pbkdf2(getCryptoKey(e).data,Buffer.from(o),r.iterations,t>>3,i,(r,e)=>{if(r){s(r)}else{n(new Uint8Array(e).buffer)}})})}async onImportKey(r,e,t,n,s){if(r==="raw"){const r=new PbkdfCryptoKey;r.data=Buffer.from(e);r.algorithm={name:this.name};r.extractable=false;r.usages=s;return setCryptoKey(r)}throw new f.OperationError("format: Must be 'raw'")}checkCryptoKey(r,e){super.checkCryptoKey(r,e);if(!(getCryptoKey(r)instanceof PbkdfCryptoKey)){throw new TypeError("key: Is not PBKDF CryptoKey")}}}class HmacCryptoKey extends CryptoKey{get alg(){const r=this.algorithm.hash.name.toUpperCase();return`HS${r.replace("SHA-","")}`}set alg(r){}}i.__decorate([a.JsonProp({name:"k",converter:p})],HmacCryptoKey.prototype,"data",void 0);class HmacProvider extends f.HmacProvider{async onGenerateKey(r,e,t){const n=(r.length||this.getDefaultLength(r.hash.name))>>3<<3;const s=new HmacCryptoKey;s.algorithm={...r,length:n,name:this.name};s.extractable=e;s.usages=t;s.data=l["default"].randomBytes(n>>3);return setCryptoKey(s)}async onSign(r,e,t){const n=e.algorithm.hash.name.replace("-","");const s=l["default"].createHmac(n,getCryptoKey(e).data).update(Buffer.from(t)).digest();return new Uint8Array(s).buffer}async onVerify(r,e,t,n){const s=e.algorithm.hash.name.replace("-","");const o=l["default"].createHmac(s,getCryptoKey(e).data).update(Buffer.from(n)).digest();return o.compare(Buffer.from(t))===0}async onImportKey(r,e,t,n,s){let o;switch(r.toLowerCase()){case"jwk":o=a.JsonParser.fromJSON(e,{targetSchema:HmacCryptoKey});break;case"raw":o=new HmacCryptoKey;o.data=Buffer.from(e);break;default:throw new f.OperationError("format: Must be 'jwk' or 'raw'")}o.algorithm={hash:{name:t.hash.name},name:this.name,length:o.data.length<<3};o.extractable=n;o.usages=s;return setCryptoKey(o)}async onExportKey(r,e){switch(r.toLowerCase()){case"jwk":return a.JsonSerializer.toJSON(getCryptoKey(e));case"raw":return new Uint8Array(getCryptoKey(e).data).buffer;default:throw new f.OperationError("format: Must be 'jwk' or 'raw'")}}checkCryptoKey(r,e){super.checkCryptoKey(r,e);if(!(getCryptoKey(r)instanceof HmacCryptoKey)){throw new TypeError("key: Is not HMAC CryptoKey")}}}class HkdfCryptoKey extends CryptoKey{}class HkdfProvider extends f.HkdfProvider{async onImportKey(r,e,t,n,s){if(r.toLowerCase()!=="raw"){throw new f.OperationError("Operation not supported")}const o=new HkdfCryptoKey;o.data=Buffer.from(e);o.algorithm={name:this.name};o.extractable=n;o.usages=s;return setCryptoKey(o)}async onDeriveBits(r,e,t){const s=r.hash.name.replace("-","");const o=l["default"].createHash(s).digest().length;const i=t/8;const a=n.BufferSourceConverter.toUint8Array(r.info);const c=l["default"].createHmac(s,n.BufferSourceConverter.toUint8Array(r.salt)).update(n.BufferSourceConverter.toUint8Array(getCryptoKey(e).data)).digest();const u=[Buffer.alloc(0)];const f=Math.ceil(i/o)+1;for(let r=1;r=14){this.providers.set(new EdDsaProvider);this.providers.set(new EcdhEsProvider)}}}class Crypto extends f.Crypto{constructor(){super(...arguments);this.subtle=new SubtleCrypto}getRandomValues(r){const e=Buffer.from(r.buffer);l["default"].randomFillSync(e);return r}}Object.defineProperty(e,"CryptoKey",{enumerable:true,get:function(){return n.CryptoKey}});e.Crypto=Crypto},950:(r,e,t)=>{"use strict";t.r(e);t.d(e,{__extends:()=>__extends,__assign:()=>s,__rest:()=>__rest,__decorate:()=>__decorate,__param:()=>__param,__metadata:()=>__metadata,__awaiter:()=>__awaiter,__generator:()=>__generator,__createBinding:()=>o,__exportStar:()=>__exportStar,__values:()=>__values,__read:()=>__read,__spread:()=>__spread,__spreadArrays:()=>__spreadArrays,__spreadArray:()=>__spreadArray,__await:()=>__await,__asyncGenerator:()=>__asyncGenerator,__asyncDelegator:()=>__asyncDelegator,__asyncValues:()=>__asyncValues,__makeTemplateObject:()=>__makeTemplateObject,__importStar:()=>__importStar,__importDefault:()=>__importDefault,__classPrivateFieldGet:()=>__classPrivateFieldGet,__classPrivateFieldSet:()=>__classPrivateFieldSet});var n=function(r,e){n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,e){r.__proto__=e}||function(r,e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))r[t]=e[t]};return n(r,e)};function __extends(r,e){if(typeof e!=="function"&&e!==null)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");n(r,e);function __(){this.constructor=r}r.prototype=e===null?Object.create(e):(__.prototype=e.prototype,new __)}var s=function(){s=Object.assign||function __assign(r){for(var e,t=1,n=arguments.length;t=0;a--)if(i=r[a])o=(s<3?i(o):s>3?i(e,t,o):i(e,t))||o;return s>3&&o&&Object.defineProperty(e,t,o),o}function __param(r,e){return function(t,n){e(t,n,r)}}function __metadata(r,e){if(typeof Reflect==="object"&&typeof Reflect.metadata==="function")return Reflect.metadata(r,e)}function __awaiter(r,e,t,n){function adopt(r){return r instanceof t?r:new t(function(e){e(r)})}return new(t||(t=Promise))(function(t,s){function fulfilled(r){try{step(n.next(r))}catch(r){s(r)}}function rejected(r){try{step(n["throw"](r))}catch(r){s(r)}}function step(r){r.done?t(r.value):adopt(r.value).then(fulfilled,rejected)}step((n=n.apply(r,e||[])).next())})}function __generator(r,e){var t={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},n,s,o,i;return i={next:verb(0),throw:verb(1),return:verb(2)},typeof Symbol==="function"&&(i[Symbol.iterator]=function(){return this}),i;function verb(r){return function(e){return step([r,e])}}function step(i){if(n)throw new TypeError("Generator is already executing.");while(t)try{if(n=1,s&&(o=i[0]&2?s["return"]:i[0]?s["throw"]||((o=s["return"])&&o.call(s),0):s.next)&&!(o=o.call(s,i[1])).done)return o;if(s=0,o)i=[i[0]&2,o.value];switch(i[0]){case 0:case 1:o=i;break;case 4:t.label++;return{value:i[1],done:false};case 5:t.label++;s=i[1];i=[0];continue;case 7:i=t.ops.pop();t.trys.pop();continue;default:if(!(o=t.trys,o=o.length>0&&o[o.length-1])&&(i[0]===6||i[0]===2)){t=0;continue}if(i[0]===3&&(!o||i[1]>o[0]&&i[1]=r.length)r=void 0;return{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(r,e){var t=typeof Symbol==="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),s,o=[],i;try{while((e===void 0||e-- >0)&&!(s=n.next()).done)o.push(s.value)}catch(r){i={error:r}}finally{try{if(s&&!s.done&&(t=n["return"]))t.call(n)}finally{if(i)throw i.error}}return o}function __spread(){for(var r=[],e=0;e1||resume(r,e)})}}function resume(r,e){try{step(n[r](e))}catch(r){settle(o[0][3],r)}}function step(r){r.value instanceof __await?Promise.resolve(r.value.v).then(fulfill,reject):settle(o[0][2],r)}function fulfill(r){resume("next",r)}function reject(r){resume("throw",r)}function settle(r,e){if(r(e),o.shift(),o.length)resume(o[0][0],o[0][1])}}function __asyncDelegator(r){var e,t;return e={},verb("next"),verb("throw",function(r){throw r}),verb("return"),e[Symbol.iterator]=function(){return this},e;function verb(n,s){e[n]=r[n]?function(e){return(t=!t)?{value:__await(r[n](e)),done:n==="return"}:s?s(e):e}:s}}function __asyncValues(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=r[Symbol.asyncIterator],t;return e?e.call(r):(r=typeof __values==="function"?__values(r):r[Symbol.iterator](),t={},verb("next"),verb("throw"),verb("return"),t[Symbol.asyncIterator]=function(){return this},t);function verb(e){t[e]=r[e]&&function(t){return new Promise(function(n,s){t=r[e](t),settle(n,s,t.done,t.value)})}}function settle(r,e,t,n){Promise.resolve(n).then(function(e){r({value:e,done:t})},e)}}function __makeTemplateObject(r,e){if(Object.defineProperty){Object.defineProperty(r,"raw",{value:e})}else{r.raw=e}return r}var i=Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:true,value:e})}:function(r,e){r["default"]=e};function __importStar(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)if(t!=="default"&&Object.prototype.hasOwnProperty.call(r,t))o(e,r,t);i(e,r);return e}function __importDefault(r){return r&&r.__esModule?r:{default:r}}function __classPrivateFieldGet(r,e,t,n){if(t==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof e==="function"?r!==e||!n:!e.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?n:t==="a"?n.call(r):n?n.value:e.get(r)}function __classPrivateFieldSet(r,e,t,n,s){if(n==="m")throw new TypeError("Private method is not writable");if(n==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e==="function"?r!==e||!s:!e.has(r))throw new TypeError("Cannot write private member to an object whose class did not declare it");return n==="a"?s.call(r,t):s?s.value=t:e.set(r,t),t}},528:(r,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.fromBER=fromBER;e.compareSchema=compareSchema;e.verifySchema=verifySchema;e.fromJSON=fromJSON;e.RawData=e.Repeated=e.Any=e.Choice=e.TIME=e.Duration=e.DateTime=e.TimeOfDay=e.DATE=e.GeneralizedTime=e.UTCTime=e.CharacterString=e.GeneralString=e.VisibleString=e.GraphicString=e.IA5String=e.VideotexString=e.TeletexString=e.PrintableString=e.NumericString=e.UniversalString=e.BmpString=e.RelativeObjectIdentifier=e.Utf8String=e.ObjectIdentifier=e.Enumerated=e.Integer=e.BitString=e.OctetString=e.Null=e.Set=e.Sequence=e.Boolean=e.EndOfContent=e.Constructed=e.Primitive=e.BaseBlock=e.ValueBlock=e.HexBlock=void 0;var n=t(209);function _createForOfIteratorHelper(r,t){var o;if(typeof Symbol==="undefined"||r[Symbol.iterator]==null){if(Array.isArray(r)||(o=_unsupportedIterableToArray(r))||t&&r&&typeof r.length==="number"){if(o)r=o;var i=0;var a=function F(){};return{s:a,n:function n(){if(i>=r.length)return{done:true};return{done:false,value:r[i++]}},e:function e(r){throw r},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c=true,u=false,l;return{s:function s(){o=r[Symbol.iterator]()},n:function n(){var r=o.next();c=r.done;return r},e:function e(r){u=true;l=r},f:function f(){try{if(!c&&o.return!=null)o.return()}finally{if(u)throw l}}}}function _unsupportedIterableToArray(r,e){if(!r)return;if(typeof r==="string")return _arrayLikeToArray(r,e);var t=Object.prototype.toString.call(r).slice(8,-1);if(t==="Object"&&r.constructor)t=r.constructor.name;if(t==="Map"||t==="Set")return Array.from(r);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return _arrayLikeToArray(r,e)}function _arrayLikeToArray(r,e){if(e==null||e>r.length)e=r.length;for(var t=0,n=new Array(e);t(class LocalHexBlockMixin extends r{constructor(r={}){super(r);this.isHexOnly=(0,n.getParametersValue)(r,"isHexOnly",false);if("valueHex"in r)this.valueHex=r.valueHex.slice(0);else this.valueHex=new ArrayBuffer(0)}static blockName(){return"hexBlock"}fromBER(r,e,t){if((0,n.checkBufferParams)(this,r,e,t)===false)return-1;const s=new Uint8Array(r,e,t);if(s.length===0){this.warnings.push("Zero buffer length");return e}this.valueHex=r.slice(e,e+t);this.blockLength=t;return e+t}toBER(r=false){if(this.isHexOnly!==true){this.error='Flag "isHexOnly" is not set, abort';return new ArrayBuffer(0)}if(r===true)return new ArrayBuffer(this.valueHex.byteLength);return this.valueHex.slice(0)}toJSON(){let r={};try{r=super.toJSON()}catch(r){}r.blockName=this.constructor.blockName();r.isHexOnly=this.isHexOnly;r.valueHex=(0,n.bufferToHexCodes)(this.valueHex,0,this.valueHex.byteLength);return r}});e.HexBlock=i;class LocalIdentificationBlock extends(i(LocalBaseBlock)){constructor(r={}){super();if("idBlock"in r){this.isHexOnly=(0,n.getParametersValue)(r.idBlock,"isHexOnly",false);this.valueHex=(0,n.getParametersValue)(r.idBlock,"valueHex",new ArrayBuffer(0));this.tagClass=(0,n.getParametersValue)(r.idBlock,"tagClass",-1);this.tagNumber=(0,n.getParametersValue)(r.idBlock,"tagNumber",-1);this.isConstructed=(0,n.getParametersValue)(r.idBlock,"isConstructed",false)}else{this.tagClass=-1;this.tagNumber=-1;this.isConstructed=false}}static blockName(){return"identificationBlock"}toBER(r=false){let e=0;let t;let s;switch(this.tagClass){case 1:e|=0;break;case 2:e|=64;break;case 3:e|=128;break;case 4:e|=192;break;default:this.error="Unknown tag class";return new ArrayBuffer(0)}if(this.isConstructed)e|=32;if(this.tagNumber<31&&!this.isHexOnly){t=new ArrayBuffer(1);s=new Uint8Array(t);if(!r){let r=this.tagNumber;r&=31;e|=r;s[0]=e}return t}if(this.isHexOnly===false){const o=(0,n.utilToBase)(this.tagNumber,7);const i=new Uint8Array(o);const a=o.byteLength;t=new ArrayBuffer(a+1);s=new Uint8Array(t);s[0]=e|31;if(!r){for(let r=0;r=s.length){this.error="End of input reached before message was fully decoded";return-1}if(r===e){e+=255;const r=new ArrayBuffer(e);const n=new Uint8Array(r);for(let r=0;r8){this.error="Too big integer";return-1}if(o+1>s.length){this.error="End of input reached before message was fully decoded";return-1}const i=new Uint8Array(o);for(let r=0;r127)this.longFormUsed=true;if(this.isIndefiniteForm){e=new ArrayBuffer(1);if(r===false){t=new Uint8Array(e);t[0]=128}return e}if(this.longFormUsed===true){const s=(0,n.utilToBase)(this.length,8);if(s.byteLength>127){this.error="Too big length";return new ArrayBuffer(0)}e=new ArrayBuffer(s.byteLength+1);if(r===true)return e;const o=new Uint8Array(s);t=new Uint8Array(e);t[0]=s.byteLength|128;for(let r=0;r0){const e=LocalFromBER(r,a,t);if(e.offset===-1){this.error=e.result.error;this.warnings.concat(e.result.warnings);return-1}a=e.offset;this.blockLength+=e.result.blockLength;t-=e.result.blockLength;this.value.push(e.result);if(this.isIndefiniteForm===true&&e.result.constructor.blockName()===EndOfContent.blockName())break}if(this.isIndefiniteForm===true){if(this.value[this.value.length-1].constructor.blockName()===EndOfContent.blockName())this.value.pop();else this.warnings.push("No EndOfContent block encoded")}this.valueBeforeDecode=r.slice(s,s+o);return a}toBER(r=false){let e=new ArrayBuffer(0);for(let t=0;t` ${r}`).join("\n"))}}catch(r){e.e(r)}finally{e.f()}const n=this.idBlock.tagClass===3?`[${this.idBlock.tagNumber}]`:this.constructor.blockName();return r.length?`${n} :\n${r.join("\n")}`:`${n} :`}}e.Constructed=Constructed;class LocalEndOfContentValueBlock extends ValueBlock{constructor(r={}){super(r)}fromBER(r,e,t){return e}toBER(r=false){return new ArrayBuffer(0)}static blockName(){return"EndOfContentValueBlock"}}class EndOfContent extends BaseBlock{constructor(r={}){super(r,LocalEndOfContentValueBlock);this.idBlock.tagClass=1;this.idBlock.tagNumber=0}static blockName(){return"EndOfContent"}}e.EndOfContent=EndOfContent;class LocalBooleanValueBlock extends ValueBlock{constructor(r={}){super(r);this.value=(0,n.getParametersValue)(r,"value",false);this.isHexOnly=(0,n.getParametersValue)(r,"isHexOnly",false);if("valueHex"in r)this.valueHex=r.valueHex.slice(0);else{this.valueHex=new ArrayBuffer(1);if(this.value===true){const r=new Uint8Array(this.valueHex);r[0]=255}}}fromBER(r,e,t){if((0,n.checkBufferParams)(this,r,e,t)===false)return-1;const s=new Uint8Array(r,e,t);if(t>1)this.warnings.push("Boolean value encoded in more then 1 octet");this.isHexOnly=true;this.valueHex=new ArrayBuffer(s.length);const o=new Uint8Array(this.valueHex);for(let r=0;r0)this.warnings.push("Non-zero length of value block for Null type");if(this.idBlock.error.length===0)this.blockLength+=this.idBlock.blockLength;if(this.lenBlock.error.length===0)this.blockLength+=this.lenBlock.blockLength;this.blockLength+=t;if(e+t>r.byteLength){this.error="End of input reached before message was fully decoded (inconsistent offset and length values)";return-1}return e+t}toBER(r=false){const e=new ArrayBuffer(2);if(r===true)return e;const t=new Uint8Array(e);t[0]=5;t[1]=0;return e}toString(){return`${this.constructor.blockName()}`}}e.Null=Null;class LocalOctetStringValueBlock extends(i(LocalConstructedValueBlock)){constructor(r={}){super(r);this.isConstructed=(0,n.getParametersValue)(r,"isConstructed",false)}fromBER(r,e,t){let n=0;if(this.isConstructed===true){this.isHexOnly=false;n=LocalConstructedValueBlock.prototype.fromBER.call(this,r,e,t);if(n===-1)return n;for(let r=0;r0&&this.value[r].valueBlock.unusedBits>0){this.error='Using of "unused bits" inside constructive BIT STRING allowed for least one only';return-1}this.unusedBits=this.value[r].valueBlock.unusedBits;if(this.unusedBits>7){this.error="Unused bits for BitString must be in range 0-7";return-1}}return s}if((0,n.checkBufferParams)(this,r,e,t)===false)return-1;const o=new Uint8Array(r,e,t);this.unusedBits=o[0];if(this.unusedBits>7){this.error="Unused bits for BitString must be in range 0-7";return-1}if(!this.unusedBits){const n=r.slice(e+1,e+t);try{const r=fromBER(n);if(r.offset!==-1&&r.offset===t-1){this.value=[r.result]}}catch(r){}}this.valueHex=new ArrayBuffer(o.length-1);const i=new Uint8Array(this.valueHex);for(let r=0;r=4){this.warnings.push("Too big Integer for decoding, hex only");this.isHexOnly=true;this._valueDec=0}else{this.isHexOnly=false;if(r.byteLength>0)this._valueDec=n.utilDecodeTC.call(this)}}get valueHex(){return this._valueHex}set valueDec(r){this._valueDec=r;this.isHexOnly=false;this._valueHex=(0,n.utilEncodeTC)(r)}get valueDec(){return this._valueDec}fromDER(r,e,t,n=0){const s=this.fromBER(r,e,t);if(s===-1)return s;const o=new Uint8Array(this._valueHex);if(o[0]===0&&(o[1]&128)!==0){const r=new ArrayBuffer(this._valueHex.byteLength-1);const e=new Uint8Array(r);e.set(new Uint8Array(this._valueHex,1,this._valueHex.byteLength-1));this._valueHex=r.slice(0)}else{if(n!==0){if(this._valueHex.byteLength1)n=this._valueHex.byteLength+1;const r=new ArrayBuffer(n);const e=new Uint8Array(r);e.set(o,n-this._valueHex.byteLength);this._valueHex=r.slice(0)}}}return s}toDER(r=false){const e=new Uint8Array(this._valueHex);switch(true){case(e[0]&128)!==0:{const r=new ArrayBuffer(this._valueHex.byteLength+1);const t=new Uint8Array(r);t[0]=0;t.set(e,1);this._valueHex=r.slice(0)}break;case e[0]===0&&(e[1]&128)===0:{const r=new ArrayBuffer(this._valueHex.byteLength-1);const e=new Uint8Array(r);e.set(new Uint8Array(this._valueHex,1,this._valueHex.byteLength-1));this._valueHex=r.slice(0)}break;default:}return this.toBER(r)}fromBER(r,e,t){const n=super.fromBER(r,e,t);if(n===-1)return n;this.blockLength=t;return e+t}toBER(r=false){return this.valueHex.slice(0)}static blockName(){return"IntegerValueBlock"}toJSON(){let r={};try{r=super.toJSON()}catch(r){}r.valueDec=this.valueDec;return r}toString(){function viewAdd(r,e){const t=new Uint8Array([0]);let s=new Uint8Array(r);let o=new Uint8Array(e);let i=s.slice(0);const a=i.length-1;let c=o.slice(0);const u=c.length-1;let f=0;const l=u=0;r--,h++){switch(true){case h=i.length:i=(0,n.utilConcatView)(new Uint8Array([f%10]),i);break;default:i[a-h]=f%10}}if(t[0]>0)i=(0,n.utilConcatView)(t,i);return i.slice(0)}function power2(r){if(r>=s.length){for(let e=s.length;e<=r;e++){const r=new Uint8Array([0]);let t=s[e-1].slice(0);for(let e=t.length-1;e>=0;e--){const n=new Uint8Array([(t[e]<<1)+r[0]]);r[0]=n[0]/10;t[e]=n[0]%10}if(r[0]>0)t=(0,n.utilConcatView)(r,t);s.push(t)}}return s[r]}function viewSub(r,e){let t=0;let n=new Uint8Array(r);let s=new Uint8Array(e);let o=n.slice(0);const i=o.length-1;let a=s.slice(0);const c=a.length-1;let u;let f=0;for(let r=c;r>=0;r--,f++){u=o[i-f]-a[c-f]-t;switch(true){case u<0:t=1;o[i-f]=u+10;break;default:t=0;o[i-f]=u}}if(t>0){for(let r=i-c+1;r>=0;r--,f++){u=o[i-f]-t;if(u<0){t=1;o[i-f]=u+10}else{t=0;o[i-f]=u;break}}}return o.slice()}const r=this._valueHex.byteLength*8-1;let e=new Uint8Array(this._valueHex.byteLength*8/3);let t=0;let i;const a=new Uint8Array(this._valueHex);let c="";let u=false;for(let n=this._valueHex.byteLength-1;n>=0;n--){i=a[n];for(let n=0;n<8;n++){if((i&1)===1){switch(t){case r:e=viewSub(power2(t),e);c="-";break;default:e=viewAdd(e,power2(t))}}t++;i>>=1}}for(let r=0;r0){const e=new LocalSidValueBlock;n=e.fromBER(r,n,t);if(n===-1){this.blockLength=0;this.error=e.error;return n}if(this.value.length===0)e.isFirstSid=true;this.blockLength+=e.blockLength;t-=e.blockLength;this.value.push(e)}return n}toBER(r=false){let e=new ArrayBuffer(0);for(let t=0;t0){const e=new LocalRelativeSidValueBlock;n=e.fromBER(r,n,t);if(n===-1){this.blockLength=0;this.error=e.error;return n}this.blockLength+=e.blockLength;t-=e.blockLength;this.value.push(e)}return n}toBER(r=false){let e=new ArrayBuffer(0);for(let t=0;t2)continue;const i=2-o.length;for(let r=o.length-1;r>=0;r--)t[s*2+r+i]=o[r]}this.valueBlock.value=r}toString(){return`${this.constructor.blockName()} : ${this.valueBlock.value}`}}e.BmpString=BmpString;class LocalUniversalStringValueBlock extends(i(LocalBaseBlock)){constructor(r={}){super(r);this.isHexOnly=true;this.value=""}static blockName(){return"UniversalStringValueBlock"}toJSON(){let r={};try{r=super.toJSON()}catch(r){}r.value=this.value;return r}}class UniversalString extends BaseBlock{constructor(r={}){super(r,LocalUniversalStringValueBlock);if("value"in r)this.fromString(r.value);this.idBlock.tagClass=1;this.idBlock.tagNumber=28}static blockName(){return"UniversalString"}fromBER(r,e,t){const n=this.valueBlock.fromBER(r,e,this.lenBlock.isIndefiniteForm===true?t:this.lenBlock.length);if(n===-1){this.error=this.valueBlock.error;return n}this.fromBuffer(this.valueBlock.valueHex);if(this.idBlock.error.length===0)this.blockLength+=this.idBlock.blockLength;if(this.lenBlock.error.length===0)this.blockLength+=this.lenBlock.blockLength;if(this.valueBlock.error.length===0)this.blockLength+=this.valueBlock.blockLength;return n}fromBuffer(r){const e=r.slice(0);const t=new Uint8Array(e);for(let r=0;r4)continue;const i=4-o.length;for(let r=o.length-1;r>=0;r--)t[s*4+r+i]=o[r]}this.valueBlock.value=r}toString(){return`${this.constructor.blockName()} : ${this.valueBlock.value}`}}e.UniversalString=UniversalString;class LocalSimpleStringValueBlock extends(i(LocalBaseBlock)){constructor(r={}){super(r);this.value="";this.isHexOnly=true}static blockName(){return"SimpleStringValueBlock"}toJSON(){let r={};try{r=super.toJSON()}catch(r){}r.value=this.value;return r}}class LocalSimpleStringBlock extends BaseBlock{constructor(r={}){super(r,LocalSimpleStringValueBlock);if("value"in r)this.fromString(r.value)}static blockName(){return"SIMPLESTRING"}fromBER(r,e,t){const n=this.valueBlock.fromBER(r,e,this.lenBlock.isIndefiniteForm===true?t:this.lenBlock.length);if(n===-1){this.error=this.valueBlock.error;return n}this.fromBuffer(this.valueBlock.valueHex);if(this.idBlock.error.length===0)this.blockLength+=this.idBlock.blockLength;if(this.lenBlock.error.length===0)this.blockLength+=this.lenBlock.blockLength;if(this.valueBlock.error.length===0)this.blockLength+=this.valueBlock.blockLength;return n}fromBuffer(r){this.valueBlock.value=String.fromCharCode.apply(null,new Uint8Array(r))}fromString(r){const e=r.length;this.valueBlock.valueHex=new ArrayBuffer(e);const t=new Uint8Array(this.valueBlock.valueHex);for(let n=0;n=50)this.year=1900+n;else this.year=2e3+n;this.month=parseInt(t[2],10);this.day=parseInt(t[3],10);this.hour=parseInt(t[4],10);this.minute=parseInt(t[5],10);this.second=parseInt(t[6],10)}toString(){const r=new Array(7);r[0]=(0,n.padNumber)(this.year<2e3?this.year-1900:this.year-2e3,2);r[1]=(0,n.padNumber)(this.month,2);r[2]=(0,n.padNumber)(this.day,2);r[3]=(0,n.padNumber)(this.hour,2);r[4]=(0,n.padNumber)(this.minute,2);r[5]=(0,n.padNumber)(this.second,2);r[6]="Z";return r.join("")}static blockName(){return"UTCTime"}toJSON(){let r={};try{r=super.toJSON()}catch(r){}r.year=this.year;r.month=this.month;r.day=this.day;r.hour=this.hour;r.minute=this.minute;r.second=this.second;return r}}e.UTCTime=UTCTime;class GeneralizedTime extends VisibleString{constructor(r={}){super(r);this.year=0;this.month=0;this.day=0;this.hour=0;this.minute=0;this.second=0;this.millisecond=0;if("value"in r){this.fromString(r.value);this.valueBlock.valueHex=new ArrayBuffer(r.value.length);const e=new Uint8Array(this.valueBlock.valueHex);for(let t=0;t=37&&o.idBlock.isHexOnly===false){o.error="UNIVERSAL 37 and upper tags are reserved by ASN.1 standard";return{offset:-1,result:o}}switch(o.idBlock.tagNumber){case 0:if(o.idBlock.isConstructed===true&&o.lenBlock.length>0){o.error="Type [UNIVERSAL 0] is reserved";return{offset:-1,result:o}}u=EndOfContent;break;case 1:u=Boolean;break;case 2:u=Integer;break;case 3:u=BitString;break;case 4:u=OctetString;break;case 5:u=Null;break;case 6:u=ObjectIdentifier;break;case 10:u=Enumerated;break;case 12:u=Utf8String;break;case 13:u=RelativeObjectIdentifier;break;case 14:u=TIME;break;case 15:o.error="[UNIVERSAL 15] is reserved by ASN.1 standard";return{offset:-1,result:o};case 16:u=Sequence;break;case 17:u=Set;break;case 18:u=NumericString;break;case 19:u=PrintableString;break;case 20:u=TeletexString;break;case 21:u=VideotexString;break;case 22:u=IA5String;break;case 23:u=UTCTime;break;case 24:u=GeneralizedTime;break;case 25:u=GraphicString;break;case 26:u=VisibleString;break;case 27:u=GeneralString;break;case 28:u=UniversalString;break;case 29:u=CharacterString;break;case 30:u=BmpString;break;case 31:u=DATE;break;case 32:u=TimeOfDay;break;case 33:u=DateTime;break;case 34:u=Duration;break;default:{let r;if(o.idBlock.isConstructed===true)r=new Constructed;else r=new Primitive;r.idBlock=o.idBlock;r.lenBlock=o.lenBlock;r.warnings=o.warnings;o=r}}break;case 2:case 3:case 4:default:{if(o.idBlock.isConstructed===true)u=Constructed;else u=Primitive}}o=localChangeType(o,u);c=o.fromBER(r,e,o.lenBlock.isIndefiniteForm===true?t:o.lenBlock.length);o.valueBeforeDecode=r.slice(s,s+o.blockLength);return{offset:c,result:o}}function fromBER(r){if(r.byteLength===0){const r=new BaseBlock({},Object);r.error="Input buffer has zero length";return{offset:-1,result:r}}return LocalFromBER(r,0,r.byteLength)}function compareSchema(r,e,t){if(t instanceof Choice){const n=false;for(let n=0;n0){if(t.valueBlock.value[0]instanceof Repeated)o=e.valueBlock.value.length}if(o===0){return{verified:true,result:r}}if(e.valueBlock.value.length===0&&t.valueBlock.value.length!==0){let e=true;for(let r=0;r=e.valueBlock.value.length){if(t.valueBlock.value[i].optional===false){const e={verified:false,result:r};r.error="Inconsistent length between ASN.1 data and schema";if(t.hasOwnProperty("name")){t.name=t.name.replace(/^\s+|\s+$/g,"");if(t.name!==""){delete r[t.name];e.name=t.name}}return e}}else{if(t.valueBlock.value[0]instanceof Repeated){s=compareSchema(r,e.valueBlock.value[i],t.valueBlock.value[0].value);if(s.verified===false){if(t.valueBlock.value[0].optional===true)n++;else{if(t.hasOwnProperty("name")){t.name=t.name.replace(/^\s+|\s+$/g,"");if(t.name!=="")delete r[t.name]}return s}}if("name"in t.valueBlock.value[0]&&t.valueBlock.value[0].name.length>0){let n={};if("local"in t.valueBlock.value[0]&&t.valueBlock.value[0].local===true)n=e;else n=r;if(typeof n[t.valueBlock.value[0].name]==="undefined")n[t.valueBlock.value[0].name]=[];n[t.valueBlock.value[0].name].push(e.valueBlock.value[i])}}else{s=compareSchema(r,e.valueBlock.value[i-n],t.valueBlock.value[i]);if(s.verified===false){if(t.valueBlock.value[i].optional===true)n++;else{if(t.hasOwnProperty("name")){t.name=t.name.replace(/^\s+|\s+$/g,"");if(t.name!=="")delete r[t.name]}return s}}}}}if(s.verified===false){const e={verified:false,result:r};if(t.hasOwnProperty("name")){t.name=t.name.replace(/^\s+|\s+$/g,"");if(t.name!==""){delete r[t.name];e.name=t.name}}return e}return{verified:true,result:r}}if("primitiveSchema"in t&&"valueHex"in e.valueBlock){const n=fromBER(e.valueBlock.valueHex);if(n.offset===-1){const e={verified:false,result:n.result};if(t.hasOwnProperty("name")){t.name=t.name.replace(/^\s+|\s+$/g,"");if(t.name!==""){delete r[t.name];e.name=t.name}}return e}return compareSchema(r,n.result,t.primitiveSchema)}return{verified:true,result:r}}function verifySchema(r,e){if(e instanceof Object===false){return{verified:false,result:{error:"Wrong ASN.1 schema type"}}}const t=fromBER(r);if(t.offset===-1){return{verified:false,result:t.result}}return compareSchema(t.result,t.result,e)}function fromJSON(r){}},317:function(r,e){(function(r,t){true?t(e):0})(this,function(r){"use strict";class BufferSourceConverter{static isArrayBuffer(r){return Object.prototype.toString.call(r)==="[object ArrayBuffer]"}static toArrayBuffer(r){const e=this.toUint8Array(r);if(e.byteOffset||e.length){return e.buffer.slice(e.byteOffset,e.byteOffset+e.length)}return e.buffer}static toUint8Array(r){return this.toView(r,Uint8Array)}static toView(r,e){if(typeof Buffer!=="undefined"&&Buffer.isBuffer(r)){return new e(r.buffer,r.byteOffset,r.byteLength)}if(this.isArrayBuffer(r)){return new e(r)}if(this.isArrayBufferView(r)){return new e(r.buffer,r.byteOffset,r.byteLength)}throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView)'")}static isBufferSource(r){return this.isArrayBufferView(r)||this.isArrayBuffer(r)}static isArrayBufferView(r){return ArrayBuffer.isView(r)||r&&this.isArrayBuffer(r.buffer)}}class Utf8Converter{static fromString(r){const e=unescape(encodeURIComponent(r));const t=new Uint8Array(e.length);for(let r=0;rr.byteLength).reduce((r,e)=>r+e);const t=new Uint8Array(e);let n=0;r.map(r=>new Uint8Array(r)).forEach(r=>{for(const e of r){t[n++]=e}});return t.buffer}function isEqual(r,e){if(!(r&&e)){return false}if(r.byteLength!==e.byteLength){return false}const t=new Uint8Array(r);const n=new Uint8Array(e);for(let e=0;e{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.getUTCDate=getUTCDate;e.getParametersValue=getParametersValue;e.bufferToHexCodes=bufferToHexCodes;e.checkBufferParams=checkBufferParams;e.utilFromBase=utilFromBase;e.utilToBase=utilToBase;e.utilConcatBuf=utilConcatBuf;e.utilConcatView=utilConcatView;e.utilDecodeTC=utilDecodeTC;e.utilEncodeTC=utilEncodeTC;e.isEqualBuffer=isEqualBuffer;e.padNumber=padNumber;e.toBase64=toBase64;e.fromBase64=fromBase64;e.arrayBufferToString=arrayBufferToString;e.stringToArrayBuffer=stringToArrayBuffer;e.nearestPowerOf2=nearestPowerOf2;e.clearProps=clearProps;function getUTCDate(r){return new Date(r.getTime()+r.getTimezoneOffset()*6e4)}function getParametersValue(r,e,t){if(r instanceof Object===false)return t;if(e in r)return r[e];return t}function bufferToHexCodes(r,e=0,t=r.byteLength-e,n=false){let s="";var o=true;var i=false;var a=undefined;try{for(var c=new Uint8Array(r,e,t)[Symbol.iterator](),u;!(o=(u=c.next()).done);o=true){const r=u.value;const e=r.toString(16).toUpperCase();if(e.length===1)s+="0";s+=e;if(n)s+=" "}}catch(r){i=true;a=r}finally{try{if(!o&&c.return){c.return()}}finally{if(i){throw a}}}return s.trim()}function checkBufferParams(r,e,t,n){if(e instanceof ArrayBuffer===false){r.error='Wrong parameter: inputBuffer must be "ArrayBuffer"';return false}if(e.byteLength===0){r.error="Wrong parameter: inputBuffer has zero length";return false}if(t<0){r.error="Wrong parameter: inputOffset less than zero";return false}if(n<0){r.error="Wrong parameter: inputLength less than zero";return false}if(e.byteLength-t-n<0){r.error="End of input reached before message was fully decoded (inconsistent offset and length values)";return false}return true}function utilFromBase(r,e){let t=0;if(r.length===1)return r[0];for(let n=r.length-1;n>=0;n--)t+=r[r.length-1-n]*Math.pow(2,e*n);return t}function utilToBase(r,e,t=-1){const n=t;let s=r;let o=0;let i=Math.pow(2,e);for(let t=1;t<8;t++){if(r=0;r--){const t=Math.pow(2,r*e);i[o-r-1]=Math.floor(s/t);s-=i[o-r-1]*t}return r}i*=Math.pow(2,e)}return new ArrayBuffer(0)}function utilConcatBuf(...r){let e=0;let t=0;var n=true;var s=false;var o=undefined;try{for(var i=r[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){const r=a.value;e+=r.byteLength}}catch(r){s=true;o=r}finally{try{if(!n&&i.return){i.return()}}finally{if(s){throw o}}}const c=new ArrayBuffer(e);const u=new Uint8Array(c);var f=true;var l=false;var h=undefined;try{for(var y=r[Symbol.iterator](),p;!(f=(p=y.next()).done);f=true){const r=p.value;u.set(new Uint8Array(r),t);t+=r.byteLength}}catch(r){l=true;h=r}finally{try{if(!f&&y.return){y.return()}}finally{if(l){throw h}}}return c}function utilConcatView(...r){let e=0;let t=0;var n=true;var s=false;var o=undefined;try{for(var i=r[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){const r=a.value;e+=r.length}}catch(r){s=true;o=r}finally{try{if(!n&&i.return){i.return()}}finally{if(s){throw o}}}const c=new ArrayBuffer(e);const u=new Uint8Array(c);var f=true;var l=false;var h=undefined;try{for(var y=r[Symbol.iterator](),p;!(f=(p=y.next()).done);f=true){const r=p.value;u.set(r,t);t+=r.length}}catch(r){l=true;h=r}finally{try{if(!f&&y.return){y.return()}}finally{if(l){throw h}}}return u}function utilDecodeTC(){const r=new Uint8Array(this.valueHex);if(this.valueHex.byteLength>=2){const e=r[0]===255&&r[1]&128;const t=r[0]===0&&(r[1]&128)===0;if(e||t)this.warnings.push("Needlessly long format")}const e=new ArrayBuffer(this.valueHex.byteLength);const t=new Uint8Array(e);for(let r=0;r=r.length)a=1;const t=r.charCodeAt(i++);if(i>=r.length)c=1;const n=r.charCodeAt(i++);const o=e>>2;const l=(e&3)<<4|t>>4;let h=(t&15)<<2|n>>6;let y=n&63;if(a===1){h=y=64}else{if(c===1){y=64}}if(s){if(h===64)u+=`${f.charAt(o)}${f.charAt(l)}`;else{if(y===64)u+=`${f.charAt(o)}${f.charAt(l)}${f.charAt(h)}`;else u+=`${f.charAt(o)}${f.charAt(l)}${f.charAt(h)}${f.charAt(y)}`}}else u+=`${f.charAt(o)}${f.charAt(l)}${f.charAt(h)}${f.charAt(y)}`}return u}function fromBase64(r,e=false,s=false){const o=e?n:t;function indexof(r){for(let e=0;e<64;e++){if(o.charAt(e)===r)return e}return 64}function test(r){return r===64?0:r}let i=0;let a="";while(i=r.length?0:indexof(r.charAt(i++));const n=i>=r.length?0:indexof(r.charAt(i++));const s=i>=r.length?0:indexof(r.charAt(i++));const o=test(e)<<2|test(t)>>4;const c=(test(t)&15)<<4|test(n)>>2;const u=(test(n)&3)<<6|test(s);a+=String.fromCharCode(o);if(n!==64)a+=String.fromCharCode(c);if(s!==64)a+=String.fromCharCode(u)}if(s){const r=a.length;let e=-1;for(let t=r-1;t>=0;t--){if(a.charCodeAt(t)!==0){e=t;break}}if(e!==-1)a=a.slice(0,e+1);else a=""}return a}function arrayBufferToString(r){let e="";const t=new Uint8Array(r);var n=true;var s=false;var o=undefined;try{for(var i=t[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){const r=a.value;e+=String.fromCharCode(r)}}catch(r){s=true;o=r}finally{try{if(!n&&i.return){i.return()}}finally{if(s){throw o}}}return e}function stringToArrayBuffer(r){const e=r.length;const t=new ArrayBuffer(e);const n=new Uint8Array(t);for(let t=0;t{"use strict";Object.defineProperty(e,"__esModule",{value:true});var n=t(317);var s=t(610);var o=t(870);var i=t(895);var a=t(528);function _interopNamespace(r){if(r&&r.__esModule)return r;var e=Object.create(null);if(r){Object.keys(r).forEach(function(t){if(t!=="default"){var n=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,n.get?n:{enumerable:true,get:function(){return r[t]}})}})}e["default"]=r;return Object.freeze(e)}var c=_interopNamespace(a);class CryptoError extends Error{}class AlgorithmError extends CryptoError{}class UnsupportedOperationError extends CryptoError{constructor(r){super(`Unsupported operation: ${r?`${r}`:""}`)}}class OperationError extends CryptoError{}class RequiredPropertyError extends CryptoError{constructor(r){super(`${r}: Missing required property`)}}class PemConverter{static toArrayBuffer(r){const e=r.replace(/-{5}(BEGIN|END) .*-{5}/g,"").replace("\r","").replace("\n","");return n.Convert.FromBase64(e)}static toUint8Array(r){const e=this.toArrayBuffer(r);return new Uint8Array(e)}static fromBufferSource(r,e){const t=n.Convert.ToBase64(r);let s;let o=0;const i=[];while(true){s=t.slice(o,o=o+64);if(s.length){i.push(s);if(s.length<64){break}}else{break}}const a=e.toUpperCase();return`-----BEGIN ${a}-----\n${i.join("\n")}\n-----END ${a}-----`}static isPEM(r){return/-----BEGIN .+-----[A-Za-z0-9+\/\+\=\s\n]+-----END .+-----/i.test(r)}static getTagName(r){if(!this.isPEM(r)){throw new Error("Bad parameter. Incoming data is not right PEM")}const e=/-----BEGIN (.+)-----/.exec(r);if(!e){throw new Error("Cannot get tag from PEM")}return e[1]}static hasTagName(r,e){const t=this.getTagName(r);return e.toLowerCase()===t.toLowerCase()}static isCertificate(r){return this.hasTagName(r,"certificate")}static isCertificateRequest(r){return this.hasTagName(r,"certificate request")}static isCRL(r){return this.hasTagName(r,"x509 crl")}static isPublicKey(r){return this.hasTagName(r,"public key")}}function isJWK(r){return typeof r==="object"&&"kty"in r}class ProviderCrypto{async digest(...r){this.checkDigest.apply(this,r);return this.onDigest.apply(this,r)}checkDigest(r,e){this.checkAlgorithmName(r)}async onDigest(r,e){throw new UnsupportedOperationError("digest")}async generateKey(...r){this.checkGenerateKey.apply(this,r);return this.onGenerateKey.apply(this,r)}checkGenerateKey(r,e,t,...n){this.checkAlgorithmName(r);this.checkGenerateKeyParams(r);if(!(t&&t.length)){throw new TypeError(`Usages cannot be empty when creating a key.`)}let s;if(Array.isArray(this.usages)){s=this.usages}else{s=this.usages.privateKey.concat(this.usages.publicKey)}this.checkKeyUsages(t,s)}checkGenerateKeyParams(r){}async onGenerateKey(r,e,t,...n){throw new UnsupportedOperationError("generateKey")}async sign(...r){this.checkSign.apply(this,r);return this.onSign.apply(this,r)}checkSign(r,e,t,...n){this.checkAlgorithmName(r);this.checkAlgorithmParams(r);this.checkCryptoKey(e,"sign")}async onSign(r,e,t,...n){throw new UnsupportedOperationError("sign")}async verify(...r){this.checkVerify.apply(this,r);return this.onVerify.apply(this,r)}checkVerify(r,e,t,n,...s){this.checkAlgorithmName(r);this.checkAlgorithmParams(r);this.checkCryptoKey(e,"verify")}async onVerify(r,e,t,n,...s){throw new UnsupportedOperationError("verify")}async encrypt(...r){this.checkEncrypt.apply(this,r);return this.onEncrypt.apply(this,r)}checkEncrypt(r,e,t,n={},...s){this.checkAlgorithmName(r);this.checkAlgorithmParams(r);this.checkCryptoKey(e,n.keyUsage?"encrypt":void 0)}async onEncrypt(r,e,t,...n){throw new UnsupportedOperationError("encrypt")}async decrypt(...r){this.checkDecrypt.apply(this,r);return this.onDecrypt.apply(this,r)}checkDecrypt(r,e,t,n={},...s){this.checkAlgorithmName(r);this.checkAlgorithmParams(r);this.checkCryptoKey(e,n.keyUsage?"decrypt":void 0)}async onDecrypt(r,e,t,...n){throw new UnsupportedOperationError("decrypt")}async deriveBits(...r){this.checkDeriveBits.apply(this,r);return this.onDeriveBits.apply(this,r)}checkDeriveBits(r,e,t,n={},...s){this.checkAlgorithmName(r);this.checkAlgorithmParams(r);this.checkCryptoKey(e,n.keyUsage?"deriveBits":void 0);if(t%8!==0){throw new OperationError("length: Is not multiple of 8")}}async onDeriveBits(r,e,t,...n){throw new UnsupportedOperationError("deriveBits")}async exportKey(...r){this.checkExportKey.apply(this,r);return this.onExportKey.apply(this,r)}checkExportKey(r,e,...t){this.checkKeyFormat(r);this.checkCryptoKey(e);if(!e.extractable){throw new CryptoError("key: Is not extractable")}}async onExportKey(r,e,...t){throw new UnsupportedOperationError("exportKey")}async importKey(...r){this.checkImportKey.apply(this,r);return this.onImportKey.apply(this,r)}checkImportKey(r,e,t,n,s,...o){this.checkKeyFormat(r);this.checkKeyData(r,e);this.checkAlgorithmName(t);this.checkImportParams(t);if(Array.isArray(this.usages)){this.checkKeyUsages(s,this.usages)}}async onImportKey(r,e,t,n,s,...o){throw new UnsupportedOperationError("importKey")}checkAlgorithmName(r){if(r.name.toLowerCase()!==this.name.toLowerCase()){throw new AlgorithmError("Unrecognized name")}}checkAlgorithmParams(r){}checkDerivedKeyParams(r){}checkKeyUsages(r,e){for(const t of r){if(e.indexOf(t)===-1){throw new TypeError("Cannot create a key using the specified key usages")}}}checkCryptoKey(r,e){this.checkAlgorithmName(r.algorithm);if(e&&r.usages.indexOf(e)===-1){throw new CryptoError(`key does not match that of operation`)}}checkRequiredProperty(r,e){if(!(e in r)){throw new RequiredPropertyError(e)}}checkHashAlgorithm(r,e){for(const t of e){if(t.toLowerCase()===r.name.toLowerCase()){return}}throw new OperationError(`hash: Must be one of ${e.join(", ")}`)}checkImportParams(r){}checkKeyFormat(r){switch(r){case"raw":case"pkcs8":case"spki":case"jwk":break;default:throw new TypeError("format: Is invalid value. Must be 'jwk', 'raw', 'spki', or 'pkcs8'")}}checkKeyData(r,e){if(!e){throw new TypeError("keyData: Cannot be empty on empty on key importing")}if(r==="jwk"){if(!isJWK(e)){throw new TypeError("keyData: Is not JsonWebToken")}}else if(!n.BufferSourceConverter.isBufferSource(e)){throw new TypeError("keyData: Is not ArrayBufferView or ArrayBuffer")}}prepareData(r){return n.BufferSourceConverter.toArrayBuffer(r)}}class AesProvider extends ProviderCrypto{checkGenerateKeyParams(r){this.checkRequiredProperty(r,"length");if(typeof r.length!=="number"){throw new TypeError("length: Is not of type Number")}switch(r.length){case 128:case 192:case 256:break;default:throw new TypeError("length: Must be 128, 192, or 256")}}checkDerivedKeyParams(r){this.checkGenerateKeyParams(r)}}class AesCbcProvider extends AesProvider{constructor(){super(...arguments);this.name="AES-CBC";this.usages=["encrypt","decrypt","wrapKey","unwrapKey"]}checkAlgorithmParams(r){this.checkRequiredProperty(r,"iv");if(!(r.iv instanceof ArrayBuffer||ArrayBuffer.isView(r.iv))){throw new TypeError("iv: Is not of type '(ArrayBuffer or ArrayBufferView)'")}if(r.iv.byteLength!==16){throw new TypeError("iv: Must have length 16 bytes")}}}class AesCmacProvider extends AesProvider{constructor(){super(...arguments);this.name="AES-CMAC";this.usages=["sign","verify"]}checkAlgorithmParams(r){this.checkRequiredProperty(r,"length");if(typeof r.length!=="number"){throw new TypeError("length: Is not a Number")}if(r.length<1){throw new OperationError("length: Must be more than 0")}}}class AesCtrProvider extends AesProvider{constructor(){super(...arguments);this.name="AES-CTR";this.usages=["encrypt","decrypt","wrapKey","unwrapKey"]}checkAlgorithmParams(r){this.checkRequiredProperty(r,"counter");if(!(r.counter instanceof ArrayBuffer||ArrayBuffer.isView(r.counter))){throw new TypeError("counter: Is not of type '(ArrayBuffer or ArrayBufferView)'")}if(r.counter.byteLength!==16){throw new TypeError("iv: Must have length 16 bytes")}this.checkRequiredProperty(r,"length");if(typeof r.length!=="number"){throw new TypeError("length: Is not a Number")}if(r.length<1){throw new OperationError("length: Must be more than 0")}}}class AesEcbProvider extends AesProvider{constructor(){super(...arguments);this.name="AES-ECB";this.usages=["encrypt","decrypt","wrapKey","unwrapKey"]}}class AesGcmProvider extends AesProvider{constructor(){super(...arguments);this.name="AES-GCM";this.usages=["encrypt","decrypt","wrapKey","unwrapKey"]}checkAlgorithmParams(r){this.checkRequiredProperty(r,"iv");if(!(r.iv instanceof ArrayBuffer||ArrayBuffer.isView(r.iv))){throw new TypeError("iv: Is not of type '(ArrayBuffer or ArrayBufferView)'")}if(r.iv.byteLength<1){throw new OperationError("iv: Must have length more than 0 and less than 2^64 - 1")}if(!("tagLength"in r)){r.tagLength=128}switch(r.tagLength){case 32:case 64:case 96:case 104:case 112:case 120:case 128:break;default:throw new OperationError("tagLength: Must be one of 32, 64, 96, 104, 112, 120 or 128")}}}class AesKwProvider extends AesProvider{constructor(){super(...arguments);this.name="AES-KW";this.usages=["wrapKey","unwrapKey"]}}class DesProvider extends ProviderCrypto{constructor(){super(...arguments);this.usages=["encrypt","decrypt","wrapKey","unwrapKey"]}checkAlgorithmParams(r){if(this.ivSize){this.checkRequiredProperty(r,"iv");if(!(r.iv instanceof ArrayBuffer||ArrayBuffer.isView(r.iv))){throw new TypeError("iv: Is not of type '(ArrayBuffer or ArrayBufferView)'")}if(r.iv.byteLength!==this.ivSize){throw new TypeError(`iv: Must have length ${this.ivSize} bytes`)}}}checkGenerateKeyParams(r){this.checkRequiredProperty(r,"length");if(typeof r.length!=="number"){throw new TypeError("length: Is not of type Number")}if(r.length!==this.keySizeBits){throw new OperationError(`algorith.length: Must be ${this.keySizeBits}`)}}checkDerivedKeyParams(r){this.checkGenerateKeyParams(r)}}class RsaProvider extends ProviderCrypto{constructor(){super(...arguments);this.hashAlgorithms=["SHA-1","SHA-256","SHA-384","SHA-512"]}checkGenerateKeyParams(r){this.checkRequiredProperty(r,"hash");this.checkHashAlgorithm(r.hash,this.hashAlgorithms);this.checkRequiredProperty(r,"publicExponent");if(!(r.publicExponent&&r.publicExponent instanceof Uint8Array)){throw new TypeError("publicExponent: Missing or not a Uint8Array")}const e=n.Convert.ToBase64(r.publicExponent);if(!(e==="Aw=="||e==="AQAB")){throw new TypeError("publicExponent: Must be [3] or [1,0,1]")}this.checkRequiredProperty(r,"modulusLength");switch(r.modulusLength){case 1024:case 2048:case 4096:break;default:throw new TypeError("modulusLength: Must be 1024, 2048, or 4096")}}checkImportParams(r){this.checkRequiredProperty(r,"hash");this.checkHashAlgorithm(r.hash,this.hashAlgorithms)}}class RsaSsaProvider extends RsaProvider{constructor(){super(...arguments);this.name="RSASSA-PKCS1-v1_5";this.usages={privateKey:["sign"],publicKey:["verify"]}}}class RsaPssProvider extends RsaProvider{constructor(){super(...arguments);this.name="RSA-PSS";this.usages={privateKey:["sign"],publicKey:["verify"]}}checkAlgorithmParams(r){this.checkRequiredProperty(r,"saltLength");if(typeof r.saltLength!=="number"){throw new TypeError("saltLength: Is not a Number")}if(r.saltLength<0){throw new RangeError("saltLength: Must be positive number")}}}class RsaOaepProvider extends RsaProvider{constructor(){super(...arguments);this.name="RSA-OAEP";this.usages={privateKey:["decrypt","unwrapKey"],publicKey:["encrypt","wrapKey"]}}checkAlgorithmParams(r){if(r.label&&!(r.label instanceof ArrayBuffer||ArrayBuffer.isView(r.label))){throw new TypeError("label: Is not of type '(ArrayBuffer or ArrayBufferView)'")}}}class EllipticProvider extends ProviderCrypto{checkGenerateKeyParams(r){this.checkRequiredProperty(r,"namedCurve");this.checkNamedCurve(r.namedCurve)}checkNamedCurve(r){for(const e of this.namedCurves){if(e.toLowerCase()===r.toLowerCase()){return}}throw new OperationError(`namedCurve: Must be one of ${this.namedCurves.join(", ")}`)}}class EcdsaProvider extends EllipticProvider{constructor(){super(...arguments);this.name="ECDSA";this.hashAlgorithms=["SHA-1","SHA-256","SHA-384","SHA-512"];this.usages={privateKey:["sign"],publicKey:["verify"]};this.namedCurves=["P-256","P-384","P-521","K-256"]}checkAlgorithmParams(r){this.checkRequiredProperty(r,"hash");this.checkHashAlgorithm(r.hash,this.hashAlgorithms)}}const u=["secret","private","public"];class CryptoKey{static create(r,e,t,n){const s=new this;s.algorithm=r;s.type=e;s.extractable=t;s.usages=n;return s}static isKeyType(r){return u.indexOf(r)!==-1}get[Symbol.toStringTag](){return"CryptoKey"}}class EcdhProvider extends EllipticProvider{constructor(){super(...arguments);this.name="ECDH";this.usages={privateKey:["deriveBits","deriveKey"],publicKey:[]};this.namedCurves=["P-256","P-384","P-521","K-256"]}checkAlgorithmParams(r){this.checkRequiredProperty(r,"public");if(!(r.public instanceof CryptoKey)){throw new TypeError("public: Is not a CryptoKey")}if(r.public.type!=="public"){throw new OperationError("public: Is not a public key")}if(r.public.algorithm.name!==this.name){throw new OperationError(`public: Is not ${this.name} key`)}}}class EcdhEsProvider extends EcdhProvider{constructor(){super(...arguments);this.name="ECDH-ES";this.namedCurves=["X25519","X448"]}}class EdDsaProvider extends EllipticProvider{constructor(){super(...arguments);this.name="EdDSA";this.usages={privateKey:["sign"],publicKey:["verify"]};this.namedCurves=["Ed25519","Ed448"]}}class HmacProvider extends ProviderCrypto{constructor(){super(...arguments);this.name="HMAC";this.hashAlgorithms=["SHA-1","SHA-256","SHA-384","SHA-512"];this.usages=["sign","verify"]}getDefaultLength(r){switch(r.toUpperCase()){case"SHA-1":case"SHA-256":case"SHA-384":case"SHA-512":return 512;default:throw new Error(`Unknown algorithm name '${r}'`)}}checkGenerateKeyParams(r){this.checkRequiredProperty(r,"hash");this.checkHashAlgorithm(r.hash,this.hashAlgorithms);if("length"in r){if(typeof r.length!=="number"){throw new TypeError("length: Is not a Number")}if(r.length<1){throw new RangeError("length: Number is out of range")}}}checkImportParams(r){this.checkRequiredProperty(r,"hash");this.checkHashAlgorithm(r.hash,this.hashAlgorithms)}}class Pbkdf2Provider extends ProviderCrypto{constructor(){super(...arguments);this.name="PBKDF2";this.hashAlgorithms=["SHA-1","SHA-256","SHA-384","SHA-512"];this.usages=["deriveBits","deriveKey"]}checkAlgorithmParams(r){this.checkRequiredProperty(r,"hash");this.checkHashAlgorithm(r.hash,this.hashAlgorithms);this.checkRequiredProperty(r,"salt");if(!(r.salt instanceof ArrayBuffer||ArrayBuffer.isView(r.salt))){throw new TypeError("salt: Is not of type '(ArrayBuffer or ArrayBufferView)'")}this.checkRequiredProperty(r,"iterations");if(typeof r.iterations!=="number"){throw new TypeError("iterations: Is not a Number")}if(r.iterations<1){throw new TypeError("iterations: Is less than 1")}}checkImportKey(r,e,t,n,s,...o){super.checkImportKey(r,e,t,n,s);if(n){throw new SyntaxError("extractable: Must be 'false'")}}}class HkdfProvider extends ProviderCrypto{constructor(){super(...arguments);this.name="HKDF";this.hashAlgorithms=["SHA-1","SHA-256","SHA-384","SHA-512"];this.usages=["deriveKey","deriveBits"]}checkAlgorithmParams(r){this.checkRequiredProperty(r,"hash");this.checkHashAlgorithm(r.hash,this.hashAlgorithms);this.checkRequiredProperty(r,"salt");if(!n.BufferSourceConverter.isBufferSource(r.salt)){throw new TypeError("salt: Is not of type '(ArrayBuffer or ArrayBufferView)'")}this.checkRequiredProperty(r,"info");if(!n.BufferSourceConverter.isBufferSource(r.info)){throw new TypeError("salt: Is not of type '(ArrayBuffer or ArrayBufferView)'")}}checkImportKey(r,e,t,n,s,...o){super.checkImportKey(r,e,t,n,s);if(n){throw new SyntaxError("extractable: Must be 'false'")}}}class Crypto{get[Symbol.toStringTag](){return"Crypto"}}class ProviderStorage{constructor(){this.items={}}get(r){return this.items[r.toLowerCase()]||null}set(r){this.items[r.name.toLowerCase()]=r}removeAt(r){const e=this.get(r.toLowerCase());if(e){delete this.items[r]}return e}has(r){return!!this.get(r)}get length(){return Object.keys(this.items).length}get algorithms(){const r=[];for(const e in this.items){const t=this.items[e];r.push(t.name)}return r.sort()}}class SubtleCrypto{constructor(){this.providers=new ProviderStorage}static isHashedAlgorithm(r){return r&&typeof r==="object"&&"name"in r&&"hash"in r?true:false}get[Symbol.toStringTag](){return"SubtleCrypto"}async digest(...r){this.checkRequiredArguments(r,2,"digest");const[e,t,...s]=r;const o=this.prepareAlgorithm(e);const i=n.BufferSourceConverter.toArrayBuffer(t);const a=this.getProvider(o.name);const c=await a.digest(o,i,...s);return c}async generateKey(...r){this.checkRequiredArguments(r,3,"generateKey");const[e,t,n,...s]=r;const o=this.prepareAlgorithm(e);const i=this.getProvider(o.name);const a=await i.generateKey({...o,name:i.name},t,n,...s);return a}async sign(...r){this.checkRequiredArguments(r,3,"sign");const[e,t,s,...o]=r;this.checkCryptoKey(t);const i=this.prepareAlgorithm(e);const a=n.BufferSourceConverter.toArrayBuffer(s);const c=this.getProvider(i.name);const u=await c.sign({...i,name:c.name},t,a,...o);return u}async verify(...r){this.checkRequiredArguments(r,4,"verify");const[e,t,s,o,...i]=r;this.checkCryptoKey(t);const a=this.prepareAlgorithm(e);const c=n.BufferSourceConverter.toArrayBuffer(o);const u=n.BufferSourceConverter.toArrayBuffer(s);const f=this.getProvider(a.name);const l=await f.verify({...a,name:f.name},t,u,c,...i);return l}async encrypt(...r){this.checkRequiredArguments(r,3,"encrypt");const[e,t,s,...o]=r;this.checkCryptoKey(t);const i=this.prepareAlgorithm(e);const a=n.BufferSourceConverter.toArrayBuffer(s);const c=this.getProvider(i.name);const u=await c.encrypt({...i,name:c.name},t,a,{keyUsage:true},...o);return u}async decrypt(...r){this.checkRequiredArguments(r,3,"decrypt");const[e,t,s,...o]=r;this.checkCryptoKey(t);const i=this.prepareAlgorithm(e);const a=n.BufferSourceConverter.toArrayBuffer(s);const c=this.getProvider(i.name);const u=await c.decrypt({...i,name:c.name},t,a,{keyUsage:true},...o);return u}async deriveBits(...r){this.checkRequiredArguments(r,3,"deriveBits");const[e,t,n,...s]=r;this.checkCryptoKey(t);const o=this.prepareAlgorithm(e);const i=this.getProvider(o.name);const a=await i.deriveBits({...o,name:i.name},t,n,{keyUsage:true},...s);return a}async deriveKey(...r){this.checkRequiredArguments(r,5,"deriveKey");const[e,t,n,s,o,...i]=r;const a=this.prepareAlgorithm(n);const c=this.getProvider(a.name);c.checkDerivedKeyParams(a);const u=this.prepareAlgorithm(e);const f=this.getProvider(u.name);f.checkCryptoKey(t,"deriveKey");const l=await f.deriveBits({...u,name:f.name},t,n.length||512,{keyUsage:false},...i);return this.importKey("raw",l,n,s,o,...i)}async exportKey(...r){this.checkRequiredArguments(r,2,"exportKey");const[e,t,...n]=r;this.checkCryptoKey(t);const s=this.getProvider(t.algorithm.name);const o=await s.exportKey(e,t,...n);return o}async importKey(...r){this.checkRequiredArguments(r,5,"importKey");const[e,t,s,o,i,...a]=r;const c=this.prepareAlgorithm(s);const u=this.getProvider(c.name);if(["pkcs8","spki","raw"].indexOf(e)!==-1){const r=n.BufferSourceConverter.toArrayBuffer(t);return u.importKey(e,r,{...c,name:u.name},o,i,...a)}else{if(!t.kty){throw new TypeError("keyData: Is not JSON")}}return u.importKey(e,t,{...c,name:u.name},o,i,...a)}async wrapKey(r,e,t,s,...o){let i=await this.exportKey(r,e,...o);if(r==="jwk"){const r=JSON.stringify(i);i=n.Convert.FromUtf8String(r)}const a=this.prepareAlgorithm(s);const c=n.BufferSourceConverter.toArrayBuffer(i);const u=this.getProvider(a.name);return u.encrypt({...a,name:u.name},t,c,{keyUsage:false},...o)}async unwrapKey(r,e,t,s,o,i,a,...c){const u=this.prepareAlgorithm(s);const f=n.BufferSourceConverter.toArrayBuffer(e);const l=this.getProvider(u.name);let h=await l.decrypt({...u,name:l.name},t,f,{keyUsage:false},...c);if(r==="jwk"){try{h=JSON.parse(n.Convert.ToUtf8String(h))}catch(r){const e=new TypeError("wrappedKey: Is not a JSON");e.internal=r;throw e}}return this.importKey(r,h,o,i,a,...c)}checkRequiredArguments(r,e,t){if(r.lengthn.Convert.FromBase64Url(r),toJSON:r=>n.Convert.ToBase64Url(new Uint8Array(r))};const h={fromASN:r=>{const e=r.valueBlock.valueHex;return!new Uint8Array(e)[0]?r.valueBlock.valueHex.slice(1):r.valueBlock.valueHex},toASN:r=>{const e=new Uint8Array(r)[0]>127?Buffer.concat([Buffer.from([0]),Buffer.from(r)]):Buffer.from(r);return new c.Integer({valueHex:new Uint8Array(e).buffer})}};var y=Object.freeze({__proto__:null,JsonBase64UrlArrayBufferConverter:l,AsnIntegerArrayBufferConverter:h});class RsaPrivateKey{constructor(){this.version=0;this.modulus=new ArrayBuffer(0);this.publicExponent=new ArrayBuffer(0);this.privateExponent=new ArrayBuffer(0);this.prime1=new ArrayBuffer(0);this.prime2=new ArrayBuffer(0);this.exponent1=new ArrayBuffer(0);this.exponent2=new ArrayBuffer(0);this.coefficient=new ArrayBuffer(0)}}s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:o.AsnIntegerConverter})],RsaPrivateKey.prototype,"version",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:h}),i.JsonProp({name:"n",converter:l})],RsaPrivateKey.prototype,"modulus",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:h}),i.JsonProp({name:"e",converter:l})],RsaPrivateKey.prototype,"publicExponent",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:h}),i.JsonProp({name:"d",converter:l})],RsaPrivateKey.prototype,"privateExponent",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:h}),i.JsonProp({name:"p",converter:l})],RsaPrivateKey.prototype,"prime1",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:h}),i.JsonProp({name:"q",converter:l})],RsaPrivateKey.prototype,"prime2",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:h}),i.JsonProp({name:"dp",converter:l})],RsaPrivateKey.prototype,"exponent1",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:h}),i.JsonProp({name:"dq",converter:l})],RsaPrivateKey.prototype,"exponent2",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:h}),i.JsonProp({name:"qi",converter:l})],RsaPrivateKey.prototype,"coefficient",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.Any,optional:true})],RsaPrivateKey.prototype,"otherPrimeInfos",void 0);class RsaPublicKey{constructor(){this.modulus=new ArrayBuffer(0);this.publicExponent=new ArrayBuffer(0)}}s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:h}),i.JsonProp({name:"n",converter:l})],RsaPublicKey.prototype,"modulus",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:h}),i.JsonProp({name:"e",converter:l})],RsaPublicKey.prototype,"publicExponent",void 0);let p=class EcPublicKey{constructor(r){this.value=new ArrayBuffer(0);if(r){this.value=r}}toJSON(){let r=new Uint8Array(this.value);if(r[0]!==4){throw new CryptoError("Wrong ECPoint. Current version supports only Uncompressed (0x04) point")}r=new Uint8Array(this.value.slice(1));const e=r.length/2;const t=0;const s={x:n.Convert.ToBase64Url(r.buffer.slice(t,t+e)),y:n.Convert.ToBase64Url(r.buffer.slice(t+e,t+e+e))};return s}fromJSON(r){if(!("x"in r)){throw new Error("x: Missing required property")}if(!("y"in r)){throw new Error("y: Missing required property")}const e=n.Convert.FromBase64Url(r.x);const t=n.Convert.FromBase64Url(r.y);const s=Buffer.concat([new Uint8Array([4]),new Uint8Array(e),new Uint8Array(t)]);this.value=new Uint8Array(s).buffer;return this}};s.__decorate([o.AsnProp({type:o.AsnPropTypes.OctetString})],p.prototype,"value",void 0);p=s.__decorate([o.AsnType({type:o.AsnTypeTypes.Choice})],p);class EcPrivateKey{constructor(){this.version=1;this.privateKey=new ArrayBuffer(0)}fromJSON(r){if(!("d"in r)){throw new Error("d: Missing required property")}this.privateKey=n.Convert.FromBase64Url(r.d);if("x"in r){const e=new p;e.fromJSON(r);this.publicKey=o.AsnSerializer.toASN(e).valueBlock.valueHex}return this}toJSON(){const r={};r.d=n.Convert.ToBase64Url(this.privateKey);if(this.publicKey){Object.assign(r,new p(this.publicKey).toJSON())}return r}}s.__decorate([o.AsnProp({type:o.AsnPropTypes.Integer,converter:o.AsnIntegerConverter})],EcPrivateKey.prototype,"version",void 0);s.__decorate([o.AsnProp({type:o.AsnPropTypes.OctetString})],EcPrivateKey.prototype,"privateKey",void 0);s.__decorate([o.AsnProp({context:0,type:o.AsnPropTypes.Any,optional:true})],EcPrivateKey.prototype,"parameters",void 0);s.__decorate([o.AsnProp({context:1,type:o.AsnPropTypes.BitString,optional:true})],EcPrivateKey.prototype,"publicKey",void 0);const d={fromASN:r=>{const e=new Uint8Array(r.valueBlock.valueHex);return e[0]===0?e.buffer.slice(1):e.buffer},toASN:r=>{const e=new Uint8Array(r);if(e[0]>127){const r=new Uint8Array(e.length+1);r.set(e,1);return new c.Integer({valueHex:r.buffer})}return new c.Integer({valueHex:r})}};var g=Object.freeze({__proto__:null,AsnIntegerWithoutPaddingConverter:d});class EcDsaSignature{constructor(){this.r=new ArrayBuffer(0);this.s=new ArrayBuffer(0)}static fromWebCryptoSignature(r){const e=n.BufferSourceConverter.toUint8Array(r);const t=e.byteLength/2;const s=new this;s.r=s.removePadding(e.slice(0,t));s.s=s.removePadding(e.slice(t,t*2));return s}toWebCryptoSignature(r){r=this.getPointSize();const e=this.addPadding(r,n.BufferSourceConverter.toUint8Array(this.r));const t=this.addPadding(r,n.BufferSourceConverter.toUint8Array(this.s));const s=new Uint8Array(e.byteLength+t.byteLength);s.set(e,0);s.set(t,e.length);return s.buffer}getPointSize(){const r=Math.max(this.r.byteLength,this.s.byteLength);switch(r){case 31:case 32:return 32;case 47:case 48:return 48;case 65:case 66:return 66}throw new Error("Unsupported EC point size")}addPadding(r,e){const t=new Uint8Array(r);const s=n.BufferSourceConverter.toUint8Array(e);t.set(s,r-s.length);return t}removePadding(r){const e=n.BufferSourceConverter.toUint8Array(r);for(let r=0;r{"use strict";t.r(e);t.d(e,{__extends:()=>__extends,__assign:()=>s,__rest:()=>__rest,__decorate:()=>__decorate,__param:()=>__param,__metadata:()=>__metadata,__awaiter:()=>__awaiter,__generator:()=>__generator,__createBinding:()=>o,__exportStar:()=>__exportStar,__values:()=>__values,__read:()=>__read,__spread:()=>__spread,__spreadArrays:()=>__spreadArrays,__spreadArray:()=>__spreadArray,__await:()=>__await,__asyncGenerator:()=>__asyncGenerator,__asyncDelegator:()=>__asyncDelegator,__asyncValues:()=>__asyncValues,__makeTemplateObject:()=>__makeTemplateObject,__importStar:()=>__importStar,__importDefault:()=>__importDefault,__classPrivateFieldGet:()=>__classPrivateFieldGet,__classPrivateFieldSet:()=>__classPrivateFieldSet});var n=function(r,e){n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,e){r.__proto__=e}||function(r,e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))r[t]=e[t]};return n(r,e)};function __extends(r,e){if(typeof e!=="function"&&e!==null)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");n(r,e);function __(){this.constructor=r}r.prototype=e===null?Object.create(e):(__.prototype=e.prototype,new __)}var s=function(){s=Object.assign||function __assign(r){for(var e,t=1,n=arguments.length;t=0;a--)if(i=r[a])o=(s<3?i(o):s>3?i(e,t,o):i(e,t))||o;return s>3&&o&&Object.defineProperty(e,t,o),o}function __param(r,e){return function(t,n){e(t,n,r)}}function __metadata(r,e){if(typeof Reflect==="object"&&typeof Reflect.metadata==="function")return Reflect.metadata(r,e)}function __awaiter(r,e,t,n){function adopt(r){return r instanceof t?r:new t(function(e){e(r)})}return new(t||(t=Promise))(function(t,s){function fulfilled(r){try{step(n.next(r))}catch(r){s(r)}}function rejected(r){try{step(n["throw"](r))}catch(r){s(r)}}function step(r){r.done?t(r.value):adopt(r.value).then(fulfilled,rejected)}step((n=n.apply(r,e||[])).next())})}function __generator(r,e){var t={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},n,s,o,i;return i={next:verb(0),throw:verb(1),return:verb(2)},typeof Symbol==="function"&&(i[Symbol.iterator]=function(){return this}),i;function verb(r){return function(e){return step([r,e])}}function step(i){if(n)throw new TypeError("Generator is already executing.");while(t)try{if(n=1,s&&(o=i[0]&2?s["return"]:i[0]?s["throw"]||((o=s["return"])&&o.call(s),0):s.next)&&!(o=o.call(s,i[1])).done)return o;if(s=0,o)i=[i[0]&2,o.value];switch(i[0]){case 0:case 1:o=i;break;case 4:t.label++;return{value:i[1],done:false};case 5:t.label++;s=i[1];i=[0];continue;case 7:i=t.ops.pop();t.trys.pop();continue;default:if(!(o=t.trys,o=o.length>0&&o[o.length-1])&&(i[0]===6||i[0]===2)){t=0;continue}if(i[0]===3&&(!o||i[1]>o[0]&&i[1]=r.length)r=void 0;return{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(r,e){var t=typeof Symbol==="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),s,o=[],i;try{while((e===void 0||e-- >0)&&!(s=n.next()).done)o.push(s.value)}catch(r){i={error:r}}finally{try{if(s&&!s.done&&(t=n["return"]))t.call(n)}finally{if(i)throw i.error}}return o}function __spread(){for(var r=[],e=0;e1||resume(r,e)})}}function resume(r,e){try{step(n[r](e))}catch(r){settle(o[0][3],r)}}function step(r){r.value instanceof __await?Promise.resolve(r.value.v).then(fulfill,reject):settle(o[0][2],r)}function fulfill(r){resume("next",r)}function reject(r){resume("throw",r)}function settle(r,e){if(r(e),o.shift(),o.length)resume(o[0][0],o[0][1])}}function __asyncDelegator(r){var e,t;return e={},verb("next"),verb("throw",function(r){throw r}),verb("return"),e[Symbol.iterator]=function(){return this},e;function verb(n,s){e[n]=r[n]?function(e){return(t=!t)?{value:__await(r[n](e)),done:n==="return"}:s?s(e):e}:s}}function __asyncValues(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=r[Symbol.asyncIterator],t;return e?e.call(r):(r=typeof __values==="function"?__values(r):r[Symbol.iterator](),t={},verb("next"),verb("throw"),verb("return"),t[Symbol.asyncIterator]=function(){return this},t);function verb(e){t[e]=r[e]&&function(t){return new Promise(function(n,s){t=r[e](t),settle(n,s,t.done,t.value)})}}function settle(r,e,t,n){Promise.resolve(n).then(function(e){r({value:e,done:t})},e)}}function __makeTemplateObject(r,e){if(Object.defineProperty){Object.defineProperty(r,"raw",{value:e})}else{r.raw=e}return r}var i=Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:true,value:e})}:function(r,e){r["default"]=e};function __importStar(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)if(t!=="default"&&Object.prototype.hasOwnProperty.call(r,t))o(e,r,t);i(e,r);return e}function __importDefault(r){return r&&r.__esModule?r:{default:r}}function __classPrivateFieldGet(r,e,t,n){if(t==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof e==="function"?r!==e||!n:!e.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?n:t==="a"?n.call(r):n?n.value:e.get(r)}function __classPrivateFieldSet(r,e,t,n,s){if(n==="m")throw new TypeError("Private method is not writable");if(n==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e==="function"?r!==e||!s:!e.has(r))throw new TypeError("Cannot write private member to an object whose class did not declare it");return n==="a"?s.call(r,t):s?s.value=t:e.set(r,t),t}},417:r=>{"use strict";r.exports=require("crypto")},765:r=>{"use strict";r.exports=require("process")}};var e={};function __nccwpck_require__(t){if(e[t]){return e[t].exports}var n=e[t]={exports:{}};var s=true;try{r[t].call(n.exports,n,n.exports,__nccwpck_require__);s=false}finally{if(s)delete e[t]}return n.exports}(()=>{__nccwpck_require__.d=((r,e)=>{for(var t in e){if(__nccwpck_require__.o(e,t)&&!__nccwpck_require__.o(r,t)){Object.defineProperty(r,t,{enumerable:true,get:e[t]})}}})})();(()=>{__nccwpck_require__.o=((r,e)=>Object.prototype.hasOwnProperty.call(r,e))})();(()=>{__nccwpck_require__.r=(r=>{if(typeof Symbol!=="undefined"&&Symbol.toStringTag){Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})}Object.defineProperty(r,"__esModule",{value:true})})})();__nccwpck_require__.ab=__dirname+"/";return __nccwpck_require__(25)})();
\ No newline at end of file
diff --git a/packages/next/compiled/formdata-node/LICENSE b/packages/next/compiled/formdata-node/LICENSE
new file mode 100644
index 0000000000000..e4e317838a444
--- /dev/null
+++ b/packages/next/compiled/formdata-node/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2017-present Nick K.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/next/compiled/formdata-node/index.js b/packages/next/compiled/formdata-node/index.js
new file mode 100644
index 0000000000000..a0f273795ffd3
--- /dev/null
+++ b/packages/next/compiled/formdata-node/index.js
@@ -0,0 +1 @@
+module.exports=(()=>{"use strict";var e={727:function(e,t,r){var n=this&&this.__classPrivateFieldGet||function(e,t,r,n){if(r==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof t==="function"?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return r==="m"?n:r==="a"?n.call(e):n?n.value:t.get(e)};var o=this&&this.__classPrivateFieldSet||function(e,t,r,n,o){if(n==="m")throw new TypeError("Private method is not writable");if(n==="a"&&!o)throw new TypeError("Private accessor was defined without a setter");if(typeof t==="function"?e!==t||!o:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return n==="a"?o.call(e,r):o?o.value=r:t.set(e,r),r};var i,s,a;Object.defineProperty(t,"__esModule",{value:true});t.Blob=void 0;const c=r(398);const l=r(4);const u=r(441);class Blob{constructor(e=[],t={}){i.set(this,[]);s.set(this,"");a.set(this,0);t!==null&&t!==void 0?t:t={};if(typeof e!=="object"||e===null){throw new TypeError("Failed to construct 'Blob': "+"The provided value cannot be converted to a sequence.")}if(!(0,l.isFunction)(e[Symbol.iterator])){throw new TypeError("Failed to construct 'Blob': "+"The object must have a callable @@iterator property.")}if(typeof t!=="object"&&!(0,l.isFunction)(t)){throw new TypeError("Failed to construct 'Blob': parameter 2 cannot convert to dictionary.")}const r=new TextEncoder;for(const t of e){let e;if(ArrayBuffer.isView(t)){e=new Uint8Array(t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength))}else if(t instanceof ArrayBuffer){e=new Uint8Array(t.slice(0))}else if(t instanceof Blob){e=t}else{e=r.encode(String(t))}o(this,a,n(this,a,"f")+(ArrayBuffer.isView(e)?e.byteLength:e.size),"f");n(this,i,"f").push(e)}const c=t.type===undefined?"":String(t.type);o(this,s,/^[\x20-\x7E]*$/.test(c)?c:"","f")}static[(i=new WeakMap,s=new WeakMap,a=new WeakMap,Symbol.hasInstance)](e){return Boolean(e&&typeof e==="object"&&(0,l.isFunction)(e.constructor)&&((0,l.isFunction)(e.stream)||(0,l.isFunction)(e.arrayBuffer))&&/^(Blob|File)$/.test(e[Symbol.toStringTag]))}get type(){return n(this,s,"f")}get size(){return n(this,a,"f")}slice(e,t,r){return new Blob((0,u.sliceBlob)(n(this,i,"f"),this.size,e,t),{type:r})}async text(){const e=new TextDecoder;let t="";for await(const r of(0,u.consumeBlobParts)(n(this,i,"f"))){t+=e.decode(r,{stream:true})}t+=e.decode();return t}async arrayBuffer(){const e=new Uint8Array(this.size);let t=0;for await(const r of(0,u.consumeBlobParts)(n(this,i,"f"))){e.set(r,t);t+=r.length}return e.buffer}stream(){const e=(0,u.consumeBlobParts)(n(this,i,"f"),true);return new c.ReadableStream({async pull(t){const{value:r,done:n}=await e.next();if(n){return queueMicrotask(()=>t.close())}t.enqueue(r)},async cancel(){await e.return()}})}get[Symbol.toStringTag](){return"Blob"}}t.Blob=Blob;Object.defineProperties(Blob.prototype,{type:{enumerable:true},size:{enumerable:true},slice:{enumerable:true},stream:{enumerable:true},text:{enumerable:true},arrayBuffer:{enumerable:true}})},372:function(e,t,r){var n=this&&this.__classPrivateFieldSet||function(e,t,r,n,o){if(n==="m")throw new TypeError("Private method is not writable");if(n==="a"&&!o)throw new TypeError("Private accessor was defined without a setter");if(typeof t==="function"?e!==t||!o:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return n==="a"?o.call(e,r):o?o.value=r:t.set(e,r),r};var o=this&&this.__classPrivateFieldGet||function(e,t,r,n){if(r==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof t==="function"?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return r==="m"?n:r==="a"?n.call(e):n?n.value:t.get(e)};var i,s;Object.defineProperty(t,"__esModule",{value:true});t.File=void 0;const a=r(727);class File extends a.Blob{constructor(e,t,r={}){super(e,r);i.set(this,void 0);s.set(this,0);if(arguments.length<2){throw new TypeError("Failed to construct 'File': 2 arguments required, "+`but only ${arguments.length} present.`)}n(this,i,String(t),"f");const o=r.lastModified===undefined?Date.now():Number(r.lastModified);if(!Number.isNaN(o)){n(this,s,o,"f")}}get name(){return o(this,i,"f")}get lastModified(){return o(this,s,"f")}get[(i=new WeakMap,s=new WeakMap,Symbol.toStringTag)](){return"File"}}t.File=File},923:function(e,t,r){var n=this&&this.__classPrivateFieldGet||function(e,t,r,n){if(r==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof t==="function"?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return r==="m"?n:r==="a"?n.call(e):n?n.value:t.get(e)};var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};var i,s,a;Object.defineProperty(t,"__esModule",{value:true});t.FormData=void 0;const c=r(669);const l=r(372);const u=r(188);const f=r(4);const d=r(383);const h=o(r(617));class FormData{constructor(e){i.add(this);s.set(this,new Map);if(e){(0,d.deprecateConstructorEntries)();e.forEach(({name:e,value:t,fileName:r})=>this.append(e,t,r))}}static[(s=new WeakMap,i=new WeakSet,Symbol.hasInstance)](e){return Boolean(e&&(0,f.isFunction)(e.constructor)&&e[Symbol.toStringTag]==="FormData"&&(0,f.isFunction)(e.append)&&(0,f.isFunction)(e.set)&&(0,f.isFunction)(e.get)&&(0,f.isFunction)(e.getAll)&&(0,f.isFunction)(e.has)&&(0,f.isFunction)(e.delete)&&(0,f.isFunction)(e.entries)&&(0,f.isFunction)(e.values)&&(0,f.isFunction)(e.keys)&&(0,f.isFunction)(e[Symbol.iterator])&&(0,f.isFunction)(e.forEach))}append(e,t,r){return n(this,i,"m",a).call(this,{name:e,value:t,fileName:r,append:true,argsLength:arguments.length})}set(e,t,r){return n(this,i,"m",a).call(this,{name:e,value:t,fileName:r,append:false,argsLength:arguments.length})}get(e){const t=n(this,s,"f").get(String(e));if(!t){return null}return t[0]}getAll(e){const t=n(this,s,"f").get(String(e));if(!t){return[]}return t.slice()}has(e){return n(this,s,"f").has(String(e))}delete(e){return void n(this,s,"f").delete(String(e))}*keys(){for(const e of n(this,s,"f").keys()){yield e}}*entries(){for(const e of this.keys()){const t=this.getAll(e);for(const r of t){yield[e,r]}}}*values(){for(const[,e]of this){yield e}}[(a=function _FormData_setEntry({name:e,value:t,append:r,fileName:o,argsLength:i}){const a=r?"append":"set";e=String(e);if(i<2){throw new TypeError(`Failed to execute '${a}' on 'FormData': `+`2 arguments required, but only ${i} present.`)}let c;if((0,u.isFile)(t)){o=(0,h.default)(o===undefined?t.name:o);c=new l.File([t],o,{type:t.type,lastModified:t.lastModified})}else if(o){throw new TypeError(`Failed to execute '${a}' on 'FormData': `+"parameter 2 is not of type 'Blob'.")}else{c=String(t)}const f=n(this,s,"f").get(e);if(!f){return void n(this,s,"f").set(e,[c])}if(!r){return void n(this,s,"f").set(e,[c])}f.push(c)},Symbol.iterator)](){return this.entries()}forEach(e,t){for(const[r,n]of this){e.call(t,n,r,this)}}get[Symbol.toStringTag](){return"FormData"}[c.inspect.custom](){return this[Symbol.toStringTag]}}t.FormData=FormData},441:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.sliceBlob=t.consumeBlobParts=void 0;const n=r(4);const o=65536;async function*clonePart(e){const t=e.byteOffset+e.byteLength;let r=e.byteOffset;while(r!==t){const n=Math.min(t-r,o);const i=e.buffer.slice(r,r+n);r+=i.byteLength;yield new Uint8Array(i)}}async function*consumeNodeBlob(e){let t=0;while(t!==e.size){const r=e.slice(t,Math.min(e.size,t+o));const n=await r.arrayBuffer();t+=n.byteLength;yield new Uint8Array(n)}}async function*consumeBlobParts(e,t=false){for(const r of e){if(ArrayBuffer.isView(r)){if(t){yield*clonePart(r)}else{yield r}}else if((0,n.isFunction)(r.stream)){yield*r.stream()}else{yield*consumeNodeBlob(r)}}}t.consumeBlobParts=consumeBlobParts;function*sliceBlob(e,t,r=0,n){n!==null&&n!==void 0?n:n=t;let o=r<0?Math.max(t+r,0):Math.min(r,t);let i=n<0?Math.max(t+n,0):Math.min(n,t);const s=Math.max(i-o,0);let a=0;for(const t of e){if(a>=s){break}const e=ArrayBuffer.isView(t)?t.byteLength:t.size;if(o&&e<=o){o-=e;i-=e}else{let r;if(ArrayBuffer.isView(t)){r=t.subarray(o,Math.min(e,i));a+=r.byteLength}else{r=t.slice(o,Math.min(e,i));a+=r.size}i-=e;o=0;yield r}}}t.sliceBlob=sliceBlob},383:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.deprecateConstructorEntries=void 0;const n=r(669);t.deprecateConstructorEntries=(0,n.deprecate)(()=>{},'Constructor "entries" argument is not spec-compliant '+"and will be removed in next major release.")},786:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var o=this&&this.__exportStar||function(e,t){for(var r in e)if(r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r))n(t,e,r)};Object.defineProperty(t,"__esModule",{value:true});o(r(923),t);o(r(727),t);o(r(372),t)},188:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.isFile=void 0;const n=r(372);const o=e=>e instanceof n.File;t.isFile=o},4:(e,t)=>{Object.defineProperty(t,"__esModule",{value:true});t.isFunction=void 0;const r=e=>typeof e==="function";t.isFunction=r},617:(e,t)=>{Object.defineProperty(t,"__esModule",{value:true});const r=(e="blob")=>String(e);t.default=r},398:e=>{e.exports=require("next/dist/compiled/web-streams-polyfill")},669:e=>{e.exports=require("util")}};var t={};function __nccwpck_require__(r){if(t[r]){return t[r].exports}var n=t[r]={exports:{}};var o=true;try{e[r].call(n.exports,n,n.exports,__nccwpck_require__);o=false}finally{if(o)delete t[r]}return n.exports}__nccwpck_require__.ab=__dirname+"/";return __nccwpck_require__(786)})();
\ No newline at end of file
diff --git a/packages/next/compiled/formdata-node/package.json b/packages/next/compiled/formdata-node/package.json
new file mode 100644
index 0000000000000..bf39298d63f2d
--- /dev/null
+++ b/packages/next/compiled/formdata-node/package.json
@@ -0,0 +1 @@
+{"name":"formdata-node","main":"index.js","author":"Nick K. ","license":"MIT"}
diff --git a/packages/next/compiled/ua-parser-js/package.json b/packages/next/compiled/ua-parser-js/package.json
new file mode 100644
index 0000000000000..f3504d8e69eb9
--- /dev/null
+++ b/packages/next/compiled/ua-parser-js/package.json
@@ -0,0 +1 @@
+{"name":"ua-parser-js","main":"ua-parser.js","author":"Faisal Salman (http://faisalman.com)","license":"MIT"}
diff --git a/packages/next/compiled/ua-parser-js/ua-parser.js b/packages/next/compiled/ua-parser-js/ua-parser.js
new file mode 100644
index 0000000000000..d9a06af018629
--- /dev/null
+++ b/packages/next/compiled/ua-parser-js/ua-parser.js
@@ -0,0 +1 @@
+module.exports=(()=>{var i={578:function(i,s){(function(e,o){"use strict";var r="0.7.28",a="",l="?",w="function",n="undefined",t="object",b="string",d="major",u="model",p="name",v="type",f="vendor",g="version",c="architecture",x="console",k="mobile",m="tablet",y="smarttv",S="wearable",_="embedded",h=255;var A={extend:function(i,s){var e={};for(var o in i){if(s[o]&&s[o].length%2===0){e[o]=s[o].concat(i[o])}else{e[o]=i[o]}}return e},has:function(i,s){return typeof i===b?s.toLowerCase().indexOf(i.toLowerCase())!==-1:false},lowerize:function(i){return i.toLowerCase()},major:function(i){return typeof i===b?i.replace(/[^\d\.]/g,"").split(".")[0]:o},trim:function(i,s){i=i.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");return typeof s===n?i:i.substring(0,h)}};var z={rgx:function(i,s){var e=0,r,a,l,n,b,d;while(e0){if(n.length==2){if(typeof n[1]==w){this[n[0]]=n[1].call(this,d)}else{this[n[0]]=n[1]}}else if(n.length==3){if(typeof n[1]===w&&!(n[1].exec&&n[1].test)){this[n[0]]=d?n[1].call(this,d,n[2]):o}else{this[n[0]]=d?d.replace(n[1],n[2]):o}}else if(n.length==4){this[n[0]]=d?n[3].call(this,d.replace(n[1],n[2])):o}}else{this[n]=d?d:o}}}}e+=2}},str:function(i,s){for(var e in s){if(typeof s[e]===t&&s[e].length>0){for(var r=0;rh?A.trim(i,h):i;return this};this.setUA(r);return this};M.VERSION=r;M.BROWSER={NAME:p,MAJOR:d,VERSION:g};M.CPU={ARCHITECTURE:c};M.DEVICE={MODEL:u,VENDOR:f,TYPE:v,CONSOLE:x,MOBILE:k,SMARTTV:y,TABLET:m,WEARABLE:S,EMBEDDED:_};M.ENGINE={NAME:p,VERSION:g};M.OS={NAME:p,VERSION:g};if(typeof s!==n){if("object"!==n&&i.exports){s=i.exports=M}s.UAParser=M}else{if(typeof define==="function"&&define.amd){define(function(){return M})}else if(typeof e!=="undefined"){e.UAParser=M}}var R=typeof e!=="undefined"&&(e.jQuery||e.Zepto);if(R&&!R.ua){var E=new M;R.ua=E.getResult();R.ua.get=function(){return E.getUA()};R.ua.set=function(i){E.setUA(i);var s=E.getResult();for(var e in s){R.ua[e]=s[e]}}}})(typeof window==="object"?window:this)}};var s={};function __nccwpck_require__(e){if(s[e]){return s[e].exports}var o=s[e]={exports:{}};var r=true;try{i[e].call(o.exports,o,o.exports,__nccwpck_require__);r=false}finally{if(r)delete s[e]}return o.exports}__nccwpck_require__.ab=__dirname+"/";return __nccwpck_require__(578)})();
\ No newline at end of file
diff --git a/packages/next/compiled/uuid/index.js b/packages/next/compiled/uuid/index.js
new file mode 100644
index 0000000000000..c0dd6039186cc
--- /dev/null
+++ b/packages/next/compiled/uuid/index.js
@@ -0,0 +1 @@
+module.exports=(()=>{"use strict";var e={840:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});Object.defineProperty(t,"v1",{enumerable:true,get:function(){return u.default}});Object.defineProperty(t,"v3",{enumerable:true,get:function(){return n.default}});Object.defineProperty(t,"v4",{enumerable:true,get:function(){return a.default}});Object.defineProperty(t,"v5",{enumerable:true,get:function(){return i.default}});Object.defineProperty(t,"NIL",{enumerable:true,get:function(){return f.default}});Object.defineProperty(t,"version",{enumerable:true,get:function(){return l.default}});Object.defineProperty(t,"validate",{enumerable:true,get:function(){return o.default}});Object.defineProperty(t,"stringify",{enumerable:true,get:function(){return d.default}});Object.defineProperty(t,"parse",{enumerable:true,get:function(){return _.default}});var u=_interopRequireDefault(r(628));var n=_interopRequireDefault(r(409));var a=_interopRequireDefault(r(122));var i=_interopRequireDefault(r(120));var f=_interopRequireDefault(r(332));var l=_interopRequireDefault(r(595));var o=_interopRequireDefault(r(900));var d=_interopRequireDefault(r(950));var _=_interopRequireDefault(r(746));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}},569:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var u=_interopRequireDefault(r(417));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function md5(e){if(Array.isArray(e)){e=Buffer.from(e)}else if(typeof e==="string"){e=Buffer.from(e,"utf8")}return u.default.createHash("md5").update(e).digest()}var n=md5;t.default=n},332:(e,t)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var r="00000000-0000-0000-0000-000000000000";t.default=r},746:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var u=_interopRequireDefault(r(900));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function parse(e){if(!(0,u.default)(e)){throw TypeError("Invalid UUID")}let t;const r=new Uint8Array(16);r[0]=(t=parseInt(e.slice(0,8),16))>>>24;r[1]=t>>>16&255;r[2]=t>>>8&255;r[3]=t&255;r[4]=(t=parseInt(e.slice(9,13),16))>>>8;r[5]=t&255;r[6]=(t=parseInt(e.slice(14,18),16))>>>8;r[7]=t&255;r[8]=(t=parseInt(e.slice(19,23),16))>>>8;r[9]=t&255;r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255;r[11]=t/4294967296&255;r[12]=t>>>24&255;r[13]=t>>>16&255;r[14]=t>>>8&255;r[15]=t&255;return r}var n=parse;t.default=n},814:(e,t)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var r=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;t.default=r},807:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=rng;var u=_interopRequireDefault(r(417));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const n=new Uint8Array(256);let a=n.length;function rng(){if(a>n.length-16){u.default.randomFillSync(n);a=0}return n.slice(a,a+=16)}},274:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var u=_interopRequireDefault(r(417));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function sha1(e){if(Array.isArray(e)){e=Buffer.from(e)}else if(typeof e==="string"){e=Buffer.from(e,"utf8")}return u.default.createHash("sha1").update(e).digest()}var n=sha1;t.default=n},950:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var u=_interopRequireDefault(r(900));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const n=[];for(let e=0;e<256;++e){n.push((e+256).toString(16).substr(1))}function stringify(e,t=0){const r=(n[e[t+0]]+n[e[t+1]]+n[e[t+2]]+n[e[t+3]]+"-"+n[e[t+4]]+n[e[t+5]]+"-"+n[e[t+6]]+n[e[t+7]]+"-"+n[e[t+8]]+n[e[t+9]]+"-"+n[e[t+10]]+n[e[t+11]]+n[e[t+12]]+n[e[t+13]]+n[e[t+14]]+n[e[t+15]]).toLowerCase();if(!(0,u.default)(r)){throw TypeError("Stringified UUID is invalid")}return r}var a=stringify;t.default=a},628:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var u=_interopRequireDefault(r(807));var n=_interopRequireDefault(r(950));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}let a;let i;let f=0;let l=0;function v1(e,t,r){let o=t&&r||0;const d=t||new Array(16);e=e||{};let _=e.node||a;let s=e.clockseq!==undefined?e.clockseq:i;if(_==null||s==null){const t=e.random||(e.rng||u.default)();if(_==null){_=a=[t[0]|1,t[1],t[2],t[3],t[4],t[5]]}if(s==null){s=i=(t[6]<<8|t[7])&16383}}let c=e.msecs!==undefined?e.msecs:Date.now();let p=e.nsecs!==undefined?e.nsecs:l+1;const v=c-f+(p-l)/1e4;if(v<0&&e.clockseq===undefined){s=s+1&16383}if((v<0||c>f)&&e.nsecs===undefined){p=0}if(p>=1e4){throw new Error("uuid.v1(): Can't create more than 10M uuids/sec")}f=c;l=p;i=s;c+=122192928e5;const D=((c&268435455)*1e4+p)%4294967296;d[o++]=D>>>24&255;d[o++]=D>>>16&255;d[o++]=D>>>8&255;d[o++]=D&255;const q=c/4294967296*1e4&268435455;d[o++]=q>>>8&255;d[o++]=q&255;d[o++]=q>>>24&15|16;d[o++]=q>>>16&255;d[o++]=s>>>8|128;d[o++]=s&255;for(let e=0;e<6;++e){d[o+e]=_[e]}return t||(0,n.default)(d)}var o=v1;t.default=o},409:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var u=_interopRequireDefault(r(998));var n=_interopRequireDefault(r(569));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const a=(0,u.default)("v3",48,n.default);var i=a;t.default=i},998:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=_default;t.URL=t.DNS=void 0;var u=_interopRequireDefault(r(950));var n=_interopRequireDefault(r(746));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function stringToBytes(e){e=unescape(encodeURIComponent(e));const t=[];for(let r=0;r{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var u=_interopRequireDefault(r(807));var n=_interopRequireDefault(r(950));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function v4(e,t,r){e=e||{};const a=e.random||(e.rng||u.default)();a[6]=a[6]&15|64;a[8]=a[8]&63|128;if(t){r=r||0;for(let e=0;e<16;++e){t[r+e]=a[e]}return t}return(0,n.default)(a)}var a=v4;t.default=a},120:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var u=_interopRequireDefault(r(998));var n=_interopRequireDefault(r(274));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const a=(0,u.default)("v5",80,n.default);var i=a;t.default=i},900:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var u=_interopRequireDefault(r(814));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function validate(e){return typeof e==="string"&&u.default.test(e)}var n=validate;t.default=n},595:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var u=_interopRequireDefault(r(900));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function version(e){if(!(0,u.default)(e)){throw TypeError("Invalid UUID")}return parseInt(e.substr(14,1),16)}var n=version;t.default=n},417:e=>{e.exports=require("crypto")}};var t={};function __nccwpck_require__(r){if(t[r]){return t[r].exports}var u=t[r]={exports:{}};var n=true;try{e[r](u,u.exports,__nccwpck_require__);n=false}finally{if(n)delete t[r]}return u.exports}__nccwpck_require__.ab=__dirname+"/";return __nccwpck_require__(840)})();
\ No newline at end of file
diff --git a/packages/next/compiled/uuid/package.json b/packages/next/compiled/uuid/package.json
new file mode 100644
index 0000000000000..ebe3828da8203
--- /dev/null
+++ b/packages/next/compiled/uuid/package.json
@@ -0,0 +1 @@
+{"name":"uuid","main":"index.js","license":"MIT"}
diff --git a/packages/next/compiled/web-streams-polyfill/LICENSE b/packages/next/compiled/web-streams-polyfill/LICENSE
new file mode 100644
index 0000000000000..4ca5166d16af3
--- /dev/null
+++ b/packages/next/compiled/web-streams-polyfill/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2020 Mattias Buelens
+Copyright (c) 2016 Diwank Singh Tomer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/next/compiled/web-streams-polyfill/package.json b/packages/next/compiled/web-streams-polyfill/package.json
new file mode 100644
index 0000000000000..0f60b127556f1
--- /dev/null
+++ b/packages/next/compiled/web-streams-polyfill/package.json
@@ -0,0 +1 @@
+{"name":"web-streams-polyfill","main":"ponyfill.js","author":"Mattias Buelens ","license":"MIT"}
diff --git a/packages/next/compiled/web-streams-polyfill/ponyfill.js b/packages/next/compiled/web-streams-polyfill/ponyfill.js
new file mode 100644
index 0000000000000..9e8a6e8240f36
--- /dev/null
+++ b/packages/next/compiled/web-streams-polyfill/ponyfill.js
@@ -0,0 +1 @@
+module.exports=(()=>{var e={650:function(e,r){(function(e,t){true?t(r):0})(this,function(e){"use strict";var r=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?Symbol:function(e){return"Symbol("+e+")"};function noop(){return undefined}function getGlobals(){if(typeof self!=="undefined"){return self}else if(typeof window!=="undefined"){return window}else if(typeof global!=="undefined"){return global}return undefined}var t=getGlobals();function typeIsObject(e){return typeof e==="object"&&e!==null||typeof e==="function"}var a=noop;var n=Promise;var o=Promise.prototype.then;var i=Promise.resolve.bind(n);var l=Promise.reject.bind(n);function newPromise(e){return new n(e)}function promiseResolvedWith(e){return i(e)}function promiseRejectedWith(e){return l(e)}function PerformPromiseThen(e,r,t){return o.call(e,r,t)}function uponPromise(e,r,t){PerformPromiseThen(PerformPromiseThen(e,r,t),undefined,a)}function uponFulfillment(e,r){uponPromise(e,r)}function uponRejection(e,r){uponPromise(e,undefined,r)}function transformPromiseWith(e,r,t){return PerformPromiseThen(e,r,t)}function setPromiseIsHandledToTrue(e){PerformPromiseThen(e,undefined,a)}var u=function(){var e=t&&t.queueMicrotask;if(typeof e==="function"){return e}var r=promiseResolvedWith(undefined);return function(e){return PerformPromiseThen(r,e)}}();function reflectCall(e,r,t){if(typeof e!=="function"){throw new TypeError("Argument is not a function")}return Function.prototype.apply.call(e,r,t)}function promiseCall(e,r,t){try{return promiseResolvedWith(reflectCall(e,r,t))}catch(e){return promiseRejectedWith(e)}}var s=16384;var d=function(){function SimpleQueue(){this._cursor=0;this._size=0;this._front={_elements:[],_next:undefined};this._back=this._front;this._cursor=0;this._size=0}Object.defineProperty(SimpleQueue.prototype,"length",{get:function(){return this._size},enumerable:false,configurable:true});SimpleQueue.prototype.push=function(e){var r=this._back;var t=r;if(r._elements.length===s-1){t={_elements:[],_next:undefined}}r._elements.push(e);if(t!==r){this._back=t;r._next=t}++this._size};SimpleQueue.prototype.shift=function(){var e=this._front;var r=e;var t=this._cursor;var a=t+1;var n=e._elements;var o=n[t];if(a===s){r=e._next;a=0}--this._size;this._cursor=a;if(e!==r){this._front=r}n[t]=undefined;return o};SimpleQueue.prototype.forEach=function(e){var r=this._cursor;var t=this._front;var a=t._elements;while(r!==a.length||t._next!==undefined){if(r===a.length){t=t._next;a=t._elements;r=0;if(a.length===0){break}}e(a[r]);++r}};SimpleQueue.prototype.peek=function(){var e=this._front;var r=this._cursor;return e._elements[r]};return SimpleQueue}();function ReadableStreamReaderGenericInitialize(e,r){e._ownerReadableStream=r;r._reader=e;if(r._state==="readable"){defaultReaderClosedPromiseInitialize(e)}else if(r._state==="closed"){defaultReaderClosedPromiseInitializeAsResolved(e)}else{defaultReaderClosedPromiseInitializeAsRejected(e,r._storedError)}}function ReadableStreamReaderGenericCancel(e,r){var t=e._ownerReadableStream;return ReadableStreamCancel(t,r)}function ReadableStreamReaderGenericRelease(e){if(e._ownerReadableStream._state==="readable"){defaultReaderClosedPromiseReject(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness"))}else{defaultReaderClosedPromiseResetToRejected(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness"))}e._ownerReadableStream._reader=undefined;e._ownerReadableStream=undefined}function readerLockException(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function defaultReaderClosedPromiseInitialize(e){e._closedPromise=newPromise(function(r,t){e._closedPromise_resolve=r;e._closedPromise_reject=t})}function defaultReaderClosedPromiseInitializeAsRejected(e,r){defaultReaderClosedPromiseInitialize(e);defaultReaderClosedPromiseReject(e,r)}function defaultReaderClosedPromiseInitializeAsResolved(e){defaultReaderClosedPromiseInitialize(e);defaultReaderClosedPromiseResolve(e)}function defaultReaderClosedPromiseReject(e,r){if(e._closedPromise_reject===undefined){return}setPromiseIsHandledToTrue(e._closedPromise);e._closedPromise_reject(r);e._closedPromise_resolve=undefined;e._closedPromise_reject=undefined}function defaultReaderClosedPromiseResetToRejected(e,r){defaultReaderClosedPromiseInitializeAsRejected(e,r)}function defaultReaderClosedPromiseResolve(e){if(e._closedPromise_resolve===undefined){return}e._closedPromise_resolve(undefined);e._closedPromise_resolve=undefined;e._closedPromise_reject=undefined}var f=r("[[AbortSteps]]");var c=r("[[ErrorSteps]]");var m=r("[[CancelSteps]]");var b=r("[[PullSteps]]");var p=Number.isFinite||function(e){return typeof e==="number"&&isFinite(e)};var S=Math.trunc||function(e){return e<0?Math.ceil(e):Math.floor(e)};function isDictionary(e){return typeof e==="object"||typeof e==="function"}function assertDictionary(e,r){if(e!==undefined&&!isDictionary(e)){throw new TypeError(r+" is not an object.")}}function assertFunction(e,r){if(typeof e!=="function"){throw new TypeError(r+" is not a function.")}}function isObject(e){return typeof e==="object"&&e!==null||typeof e==="function"}function assertObject(e,r){if(!isObject(e)){throw new TypeError(r+" is not an object.")}}function assertRequiredArgument(e,r,t){if(e===undefined){throw new TypeError("Parameter "+r+" is required in '"+t+"'.")}}function assertRequiredField(e,r,t){if(e===undefined){throw new TypeError(r+" is required in '"+t+"'.")}}function convertUnrestrictedDouble(e){return Number(e)}function censorNegativeZero(e){return e===0?0:e}function integerPart(e){return censorNegativeZero(S(e))}function convertUnsignedLongLongWithEnforceRange(e,r){var t=0;var a=Number.MAX_SAFE_INTEGER;var n=Number(e);n=censorNegativeZero(n);if(!p(n)){throw new TypeError(r+" is not a finite number")}n=integerPart(n);if(na){throw new TypeError(r+" is outside the accepted range of "+t+" to "+a+", inclusive")}if(!p(n)||n===0){return 0}return n}function assertReadableStream(e,r){if(!IsReadableStream(e)){throw new TypeError(r+" is not a ReadableStream.")}}function AcquireReadableStreamDefaultReader(e){return new h(e)}function ReadableStreamAddReadRequest(e,r){e._reader._readRequests.push(r)}function ReadableStreamFulfillReadRequest(e,r,t){var a=e._reader;var n=a._readRequests.shift();if(t){n._closeSteps()}else{n._chunkSteps(r)}}function ReadableStreamGetNumReadRequests(e){return e._reader._readRequests.length}function ReadableStreamHasDefaultReader(e){var r=e._reader;if(r===undefined){return false}if(!IsReadableStreamDefaultReader(r)){return false}return true}var h=function(){function ReadableStreamDefaultReader(e){assertRequiredArgument(e,1,"ReadableStreamDefaultReader");assertReadableStream(e,"First parameter");if(IsReadableStreamLocked(e)){throw new TypeError("This stream has already been locked for exclusive reading by another reader")}ReadableStreamReaderGenericInitialize(this,e);this._readRequests=new d}Object.defineProperty(ReadableStreamDefaultReader.prototype,"closed",{get:function(){if(!IsReadableStreamDefaultReader(this)){return promiseRejectedWith(defaultReaderBrandCheckException("closed"))}return this._closedPromise},enumerable:false,configurable:true});ReadableStreamDefaultReader.prototype.cancel=function(e){if(e===void 0){e=undefined}if(!IsReadableStreamDefaultReader(this)){return promiseRejectedWith(defaultReaderBrandCheckException("cancel"))}if(this._ownerReadableStream===undefined){return promiseRejectedWith(readerLockException("cancel"))}return ReadableStreamReaderGenericCancel(this,e)};ReadableStreamDefaultReader.prototype.read=function(){if(!IsReadableStreamDefaultReader(this)){return promiseRejectedWith(defaultReaderBrandCheckException("read"))}if(this._ownerReadableStream===undefined){return promiseRejectedWith(readerLockException("read from"))}var e;var r;var t=newPromise(function(t,a){e=t;r=a});var a={_chunkSteps:function(r){return e({value:r,done:false})},_closeSteps:function(){return e({value:undefined,done:true})},_errorSteps:function(e){return r(e)}};ReadableStreamDefaultReaderRead(this,a);return t};ReadableStreamDefaultReader.prototype.releaseLock=function(){if(!IsReadableStreamDefaultReader(this)){throw defaultReaderBrandCheckException("releaseLock")}if(this._ownerReadableStream===undefined){return}if(this._readRequests.length>0){throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled")}ReadableStreamReaderGenericRelease(this)};return ReadableStreamDefaultReader}();Object.defineProperties(h.prototype,{cancel:{enumerable:true},read:{enumerable:true},releaseLock:{enumerable:true},closed:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(h.prototype,r.toStringTag,{value:"ReadableStreamDefaultReader",configurable:true})}function IsReadableStreamDefaultReader(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_readRequests")){return false}return true}function ReadableStreamDefaultReaderRead(e,r){var t=e._ownerReadableStream;t._disturbed=true;if(t._state==="closed"){r._closeSteps()}else if(t._state==="errored"){r._errorSteps(t._storedError)}else{t._readableStreamController[b](r)}}function defaultReaderBrandCheckException(e){return new TypeError("ReadableStreamDefaultReader.prototype."+e+" can only be used on a ReadableStreamDefaultReader")}var R;var y;if(typeof r.asyncIterator==="symbol"){y=(R={},R[r.asyncIterator]=function(){return this},R);Object.defineProperty(y,r.asyncIterator,{enumerable:false})}var _=function(){function ReadableStreamAsyncIteratorImpl(e,r){this._ongoingPromise=undefined;this._isFinished=false;this._reader=e;this._preventCancel=r}ReadableStreamAsyncIteratorImpl.prototype.next=function(){var e=this;var r=function(){return e._nextSteps()};this._ongoingPromise=this._ongoingPromise?transformPromiseWith(this._ongoingPromise,r,r):r();return this._ongoingPromise};ReadableStreamAsyncIteratorImpl.prototype.return=function(e){var r=this;var t=function(){return r._returnSteps(e)};return this._ongoingPromise?transformPromiseWith(this._ongoingPromise,t,t):t()};ReadableStreamAsyncIteratorImpl.prototype._nextSteps=function(){var e=this;if(this._isFinished){return Promise.resolve({value:undefined,done:true})}var r=this._reader;if(r._ownerReadableStream===undefined){return promiseRejectedWith(readerLockException("iterate"))}var t;var a;var n=newPromise(function(e,r){t=e;a=r});var o={_chunkSteps:function(r){e._ongoingPromise=undefined;u(function(){return t({value:r,done:false})})},_closeSteps:function(){e._ongoingPromise=undefined;e._isFinished=true;ReadableStreamReaderGenericRelease(r);t({value:undefined,done:true})},_errorSteps:function(t){e._ongoingPromise=undefined;e._isFinished=true;ReadableStreamReaderGenericRelease(r);a(t)}};ReadableStreamDefaultReaderRead(r,o);return n};ReadableStreamAsyncIteratorImpl.prototype._returnSteps=function(e){if(this._isFinished){return Promise.resolve({value:e,done:true})}this._isFinished=true;var r=this._reader;if(r._ownerReadableStream===undefined){return promiseRejectedWith(readerLockException("finish iterating"))}if(!this._preventCancel){var t=ReadableStreamReaderGenericCancel(r,e);ReadableStreamReaderGenericRelease(r);return transformPromiseWith(t,function(){return{value:e,done:true}})}ReadableStreamReaderGenericRelease(r);return promiseResolvedWith({value:e,done:true})};return ReadableStreamAsyncIteratorImpl}();var v={next:function(){if(!IsReadableStreamAsyncIterator(this)){return promiseRejectedWith(streamAsyncIteratorBrandCheckException("next"))}return this._asyncIteratorImpl.next()},return:function(e){if(!IsReadableStreamAsyncIterator(this)){return promiseRejectedWith(streamAsyncIteratorBrandCheckException("return"))}return this._asyncIteratorImpl.return(e)}};if(y!==undefined){Object.setPrototypeOf(v,y)}function AcquireReadableStreamAsyncIterator(e,r){var t=AcquireReadableStreamDefaultReader(e);var a=new _(t,r);var n=Object.create(v);n._asyncIteratorImpl=a;return n}function IsReadableStreamAsyncIterator(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_asyncIteratorImpl")){return false}return true}function streamAsyncIteratorBrandCheckException(e){return new TypeError("ReadableStreamAsyncIterator."+e+" can only be used on a ReadableSteamAsyncIterator")}var C=Number.isNaN||function(e){return e!==e};function IsFiniteNonNegativeNumber(e){if(!IsNonNegativeNumber(e)){return false}if(e===Infinity){return false}return true}function IsNonNegativeNumber(e){if(typeof e!=="number"){return false}if(C(e)){return false}if(e<0){return false}return true}function DequeueValue(e){var r=e._queue.shift();e._queueTotalSize-=r.size;if(e._queueTotalSize<0){e._queueTotalSize=0}return r.value}function EnqueueValueWithSize(e,r,t){t=Number(t);if(!IsFiniteNonNegativeNumber(t)){throw new RangeError("Size must be a finite, non-NaN, non-negative number.")}e._queue.push({value:r,size:t});e._queueTotalSize+=t}function PeekQueueValue(e){var r=e._queue.peek();return r.value}function ResetQueue(e){e._queue=new d;e._queueTotalSize=0}function CreateArrayFromList(e){return e.slice()}function CopyDataBlockBytes(e,r,t,a,n){new Uint8Array(e).set(new Uint8Array(t,a,n),r)}function TransferArrayBuffer(e){return e}function IsDetachedBuffer(e){return false}var g=function(){function ReadableStreamBYOBRequest(){throw new TypeError("Illegal constructor")}Object.defineProperty(ReadableStreamBYOBRequest.prototype,"view",{get:function(){if(!IsReadableStreamBYOBRequest(this)){throw byobRequestBrandCheckException("view")}return this._view},enumerable:false,configurable:true});ReadableStreamBYOBRequest.prototype.respond=function(e){if(!IsReadableStreamBYOBRequest(this)){throw byobRequestBrandCheckException("respond")}assertRequiredArgument(e,1,"respond");e=convertUnsignedLongLongWithEnforceRange(e,"First parameter");if(this._associatedReadableByteStreamController===undefined){throw new TypeError("This BYOB request has been invalidated")}if(IsDetachedBuffer(this._view.buffer));ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController,e)};ReadableStreamBYOBRequest.prototype.respondWithNewView=function(e){if(!IsReadableStreamBYOBRequest(this)){throw byobRequestBrandCheckException("respondWithNewView")}assertRequiredArgument(e,1,"respondWithNewView");if(!ArrayBuffer.isView(e)){throw new TypeError("You can only respond with array buffer views")}if(e.byteLength===0){throw new TypeError("chunk must have non-zero byteLength")}if(e.buffer.byteLength===0){throw new TypeError("chunk's buffer must have non-zero byteLength")}if(this._associatedReadableByteStreamController===undefined){throw new TypeError("This BYOB request has been invalidated")}ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController,e)};return ReadableStreamBYOBRequest}();Object.defineProperties(g.prototype,{respond:{enumerable:true},respondWithNewView:{enumerable:true},view:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(g.prototype,r.toStringTag,{value:"ReadableStreamBYOBRequest",configurable:true})}var W=function(){function ReadableByteStreamController(){throw new TypeError("Illegal constructor")}Object.defineProperty(ReadableByteStreamController.prototype,"byobRequest",{get:function(){if(!IsReadableByteStreamController(this)){throw byteStreamControllerBrandCheckException("byobRequest")}if(this._byobRequest===null&&this._pendingPullIntos.length>0){var e=this._pendingPullIntos.peek();var r=new Uint8Array(e.buffer,e.byteOffset+e.bytesFilled,e.byteLength-e.bytesFilled);var t=Object.create(g.prototype);SetUpReadableStreamBYOBRequest(t,this,r);this._byobRequest=t}return this._byobRequest},enumerable:false,configurable:true});Object.defineProperty(ReadableByteStreamController.prototype,"desiredSize",{get:function(){if(!IsReadableByteStreamController(this)){throw byteStreamControllerBrandCheckException("desiredSize")}return ReadableByteStreamControllerGetDesiredSize(this)},enumerable:false,configurable:true});ReadableByteStreamController.prototype.close=function(){if(!IsReadableByteStreamController(this)){throw byteStreamControllerBrandCheckException("close")}if(this._closeRequested){throw new TypeError("The stream has already been closed; do not close it again!")}var e=this._controlledReadableByteStream._state;if(e!=="readable"){throw new TypeError("The stream (in "+e+" state) is not in the readable state and cannot be closed")}ReadableByteStreamControllerClose(this)};ReadableByteStreamController.prototype.enqueue=function(e){if(!IsReadableByteStreamController(this)){throw byteStreamControllerBrandCheckException("enqueue")}assertRequiredArgument(e,1,"enqueue");if(!ArrayBuffer.isView(e)){throw new TypeError("chunk must be an array buffer view")}if(e.byteLength===0){throw new TypeError("chunk must have non-zero byteLength")}if(e.buffer.byteLength===0){throw new TypeError("chunk's buffer must have non-zero byteLength")}if(this._closeRequested){throw new TypeError("stream is closed or draining")}var r=this._controlledReadableByteStream._state;if(r!=="readable"){throw new TypeError("The stream (in "+r+" state) is not in the readable state and cannot be enqueued to")}ReadableByteStreamControllerEnqueue(this,e)};ReadableByteStreamController.prototype.error=function(e){if(e===void 0){e=undefined}if(!IsReadableByteStreamController(this)){throw byteStreamControllerBrandCheckException("error")}ReadableByteStreamControllerError(this,e)};ReadableByteStreamController.prototype[m]=function(e){if(this._pendingPullIntos.length>0){var r=this._pendingPullIntos.peek();r.bytesFilled=0}ResetQueue(this);var t=this._cancelAlgorithm(e);ReadableByteStreamControllerClearAlgorithms(this);return t};ReadableByteStreamController.prototype[b]=function(e){var r=this._controlledReadableByteStream;if(this._queueTotalSize>0){var t=this._queue.shift();this._queueTotalSize-=t.byteLength;ReadableByteStreamControllerHandleQueueDrain(this);var a=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e._chunkSteps(a);return}var n=this._autoAllocateChunkSize;if(n!==undefined){var o=void 0;try{o=new ArrayBuffer(n)}catch(r){e._errorSteps(r);return}var i={buffer:o,byteOffset:0,byteLength:n,bytesFilled:0,elementSize:1,viewConstructor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(i)}ReadableStreamAddReadRequest(r,e);ReadableByteStreamControllerCallPullIfNeeded(this)};return ReadableByteStreamController}();Object.defineProperties(W.prototype,{close:{enumerable:true},enqueue:{enumerable:true},error:{enumerable:true},byobRequest:{enumerable:true},desiredSize:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(W.prototype,r.toStringTag,{value:"ReadableByteStreamController",configurable:true})}function IsReadableByteStreamController(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")){return false}return true}function IsReadableStreamBYOBRequest(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")){return false}return true}function ReadableByteStreamControllerCallPullIfNeeded(e){var r=ReadableByteStreamControllerShouldCallPull(e);if(!r){return}if(e._pulling){e._pullAgain=true;return}e._pulling=true;var t=e._pullAlgorithm();uponPromise(t,function(){e._pulling=false;if(e._pullAgain){e._pullAgain=false;ReadableByteStreamControllerCallPullIfNeeded(e)}},function(r){ReadableByteStreamControllerError(e,r)})}function ReadableByteStreamControllerClearPendingPullIntos(e){ReadableByteStreamControllerInvalidateBYOBRequest(e);e._pendingPullIntos=new d}function ReadableByteStreamControllerCommitPullIntoDescriptor(e,r){var t=false;if(e._state==="closed"){t=true}var a=ReadableByteStreamControllerConvertPullIntoDescriptor(r);if(r.readerType==="default"){ReadableStreamFulfillReadRequest(e,a,t)}else{ReadableStreamFulfillReadIntoRequest(e,a,t)}}function ReadableByteStreamControllerConvertPullIntoDescriptor(e){var r=e.bytesFilled;var t=e.elementSize;return new e.viewConstructor(e.buffer,e.byteOffset,r/t)}function ReadableByteStreamControllerEnqueueChunkToQueue(e,r,t,a){e._queue.push({buffer:r,byteOffset:t,byteLength:a});e._queueTotalSize+=a}function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(e,r){var t=r.elementSize;var a=r.bytesFilled-r.bytesFilled%t;var n=Math.min(e._queueTotalSize,r.byteLength-r.bytesFilled);var o=r.bytesFilled+n;var i=o-o%t;var l=n;var u=false;if(i>a){l=i-r.bytesFilled;u=true}var s=e._queue;while(l>0){var d=s.peek();var f=Math.min(l,d.byteLength);var c=r.byteOffset+r.bytesFilled;CopyDataBlockBytes(r.buffer,c,d.buffer,d.byteOffset,f);if(d.byteLength===f){s.shift()}else{d.byteOffset+=f;d.byteLength-=f}e._queueTotalSize-=f;ReadableByteStreamControllerFillHeadPullIntoDescriptor(e,f,r);l-=f}return u}function ReadableByteStreamControllerFillHeadPullIntoDescriptor(e,r,t){ReadableByteStreamControllerInvalidateBYOBRequest(e);t.bytesFilled+=r}function ReadableByteStreamControllerHandleQueueDrain(e){if(e._queueTotalSize===0&&e._closeRequested){ReadableByteStreamControllerClearAlgorithms(e);ReadableStreamClose(e._controlledReadableByteStream)}else{ReadableByteStreamControllerCallPullIfNeeded(e)}}function ReadableByteStreamControllerInvalidateBYOBRequest(e){if(e._byobRequest===null){return}e._byobRequest._associatedReadableByteStreamController=undefined;e._byobRequest._view=null;e._byobRequest=null}function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(e){while(e._pendingPullIntos.length>0){if(e._queueTotalSize===0){return}var r=e._pendingPullIntos.peek();if(ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(e,r)){ReadableByteStreamControllerShiftPendingPullInto(e);ReadableByteStreamControllerCommitPullIntoDescriptor(e._controlledReadableByteStream,r)}}}function ReadableByteStreamControllerPullInto(e,r,t){var a=e._controlledReadableByteStream;var n=1;if(r.constructor!==DataView){n=r.constructor.BYTES_PER_ELEMENT}var o=r.constructor;var i=TransferArrayBuffer(r.buffer);var l={buffer:i,byteOffset:r.byteOffset,byteLength:r.byteLength,bytesFilled:0,elementSize:n,viewConstructor:o,readerType:"byob"};if(e._pendingPullIntos.length>0){e._pendingPullIntos.push(l);ReadableStreamAddReadIntoRequest(a,t);return}if(a._state==="closed"){var u=new o(l.buffer,l.byteOffset,0);t._closeSteps(u);return}if(e._queueTotalSize>0){if(ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(e,l)){var s=ReadableByteStreamControllerConvertPullIntoDescriptor(l);ReadableByteStreamControllerHandleQueueDrain(e);t._chunkSteps(s);return}if(e._closeRequested){var d=new TypeError("Insufficient bytes to fill elements in the given buffer");ReadableByteStreamControllerError(e,d);t._errorSteps(d);return}}e._pendingPullIntos.push(l);ReadableStreamAddReadIntoRequest(a,t);ReadableByteStreamControllerCallPullIfNeeded(e)}function ReadableByteStreamControllerRespondInClosedState(e,r){r.buffer=TransferArrayBuffer(r.buffer);var t=e._controlledReadableByteStream;if(ReadableStreamHasBYOBReader(t)){while(ReadableStreamGetNumReadIntoRequests(t)>0){var a=ReadableByteStreamControllerShiftPendingPullInto(e);ReadableByteStreamControllerCommitPullIntoDescriptor(t,a)}}}function ReadableByteStreamControllerRespondInReadableState(e,r,t){if(t.bytesFilled+r>t.byteLength){throw new RangeError("bytesWritten out of range")}ReadableByteStreamControllerFillHeadPullIntoDescriptor(e,r,t);if(t.bytesFilled0){var n=t.byteOffset+t.bytesFilled;var o=t.buffer.slice(n-a,n);ReadableByteStreamControllerEnqueueChunkToQueue(e,o,0,o.byteLength)}t.buffer=TransferArrayBuffer(t.buffer);t.bytesFilled-=a;ReadableByteStreamControllerCommitPullIntoDescriptor(e._controlledReadableByteStream,t);ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(e)}function ReadableByteStreamControllerRespondInternal(e,r){var t=e._pendingPullIntos.peek();var a=e._controlledReadableByteStream._state;if(a==="closed"){if(r!==0){throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream")}ReadableByteStreamControllerRespondInClosedState(e,t)}else{ReadableByteStreamControllerRespondInReadableState(e,r,t)}ReadableByteStreamControllerCallPullIfNeeded(e)}function ReadableByteStreamControllerShiftPendingPullInto(e){var r=e._pendingPullIntos.shift();ReadableByteStreamControllerInvalidateBYOBRequest(e);return r}function ReadableByteStreamControllerShouldCallPull(e){var r=e._controlledReadableByteStream;if(r._state!=="readable"){return false}if(e._closeRequested){return false}if(!e._started){return false}if(ReadableStreamHasDefaultReader(r)&&ReadableStreamGetNumReadRequests(r)>0){return true}if(ReadableStreamHasBYOBReader(r)&&ReadableStreamGetNumReadIntoRequests(r)>0){return true}var t=ReadableByteStreamControllerGetDesiredSize(e);if(t>0){return true}return false}function ReadableByteStreamControllerClearAlgorithms(e){e._pullAlgorithm=undefined;e._cancelAlgorithm=undefined}function ReadableByteStreamControllerClose(e){var r=e._controlledReadableByteStream;if(e._closeRequested||r._state!=="readable"){return}if(e._queueTotalSize>0){e._closeRequested=true;return}if(e._pendingPullIntos.length>0){var t=e._pendingPullIntos.peek();if(t.bytesFilled>0){var a=new TypeError("Insufficient bytes to fill elements in the given buffer");ReadableByteStreamControllerError(e,a);throw a}}ReadableByteStreamControllerClearAlgorithms(e);ReadableStreamClose(r)}function ReadableByteStreamControllerEnqueue(e,r){var t=e._controlledReadableByteStream;if(e._closeRequested||t._state!=="readable"){return}var a=r.buffer;var n=r.byteOffset;var o=r.byteLength;var i=TransferArrayBuffer(a);if(ReadableStreamHasDefaultReader(t)){if(ReadableStreamGetNumReadRequests(t)===0){ReadableByteStreamControllerEnqueueChunkToQueue(e,i,n,o)}else{var l=new Uint8Array(i,n,o);ReadableStreamFulfillReadRequest(t,l,false)}}else if(ReadableStreamHasBYOBReader(t)){ReadableByteStreamControllerEnqueueChunkToQueue(e,i,n,o);ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(e)}else{ReadableByteStreamControllerEnqueueChunkToQueue(e,i,n,o)}ReadableByteStreamControllerCallPullIfNeeded(e)}function ReadableByteStreamControllerError(e,r){var t=e._controlledReadableByteStream;if(t._state!=="readable"){return}ReadableByteStreamControllerClearPendingPullIntos(e);ResetQueue(e);ReadableByteStreamControllerClearAlgorithms(e);ReadableStreamError(t,r)}function ReadableByteStreamControllerGetDesiredSize(e){var r=e._controlledReadableByteStream._state;if(r==="errored"){return null}if(r==="closed"){return 0}return e._strategyHWM-e._queueTotalSize}function ReadableByteStreamControllerRespond(e,r){r=Number(r);if(!IsFiniteNonNegativeNumber(r)){throw new RangeError("bytesWritten must be a finite")}ReadableByteStreamControllerRespondInternal(e,r)}function ReadableByteStreamControllerRespondWithNewView(e,r){var t=e._pendingPullIntos.peek();if(t.byteOffset+t.bytesFilled!==r.byteOffset){throw new RangeError("The region specified by view does not match byobRequest")}if(t.byteLength!==r.byteLength){throw new RangeError("The buffer of view has different capacity than byobRequest")}t.buffer=r.buffer;ReadableByteStreamControllerRespondInternal(e,r.byteLength)}function SetUpReadableByteStreamController(e,r,t,a,n,o,i){r._controlledReadableByteStream=e;r._pullAgain=false;r._pulling=false;r._byobRequest=null;r._queue=r._queueTotalSize=undefined;ResetQueue(r);r._closeRequested=false;r._started=false;r._strategyHWM=o;r._pullAlgorithm=a;r._cancelAlgorithm=n;r._autoAllocateChunkSize=i;r._pendingPullIntos=new d;e._readableStreamController=r;var l=t();uponPromise(promiseResolvedWith(l),function(){r._started=true;ReadableByteStreamControllerCallPullIfNeeded(r)},function(e){ReadableByteStreamControllerError(r,e)})}function SetUpReadableByteStreamControllerFromUnderlyingSource(e,r,t){var a=Object.create(W.prototype);var n=function(){return undefined};var o=function(){return promiseResolvedWith(undefined)};var i=function(){return promiseResolvedWith(undefined)};if(r.start!==undefined){n=function(){return r.start(a)}}if(r.pull!==undefined){o=function(){return r.pull(a)}}if(r.cancel!==undefined){i=function(e){return r.cancel(e)}}var l=r.autoAllocateChunkSize;if(l===0){throw new TypeError("autoAllocateChunkSize must be greater than 0")}SetUpReadableByteStreamController(e,a,n,o,i,t,l)}function SetUpReadableStreamBYOBRequest(e,r,t){e._associatedReadableByteStreamController=r;e._view=t}function byobRequestBrandCheckException(e){return new TypeError("ReadableStreamBYOBRequest.prototype."+e+" can only be used on a ReadableStreamBYOBRequest")}function byteStreamControllerBrandCheckException(e){return new TypeError("ReadableByteStreamController.prototype."+e+" can only be used on a ReadableByteStreamController")}function AcquireReadableStreamBYOBReader(e){return new w(e)}function ReadableStreamAddReadIntoRequest(e,r){e._reader._readIntoRequests.push(r)}function ReadableStreamFulfillReadIntoRequest(e,r,t){var a=e._reader;var n=a._readIntoRequests.shift();if(t){n._closeSteps(r)}else{n._chunkSteps(r)}}function ReadableStreamGetNumReadIntoRequests(e){return e._reader._readIntoRequests.length}function ReadableStreamHasBYOBReader(e){var r=e._reader;if(r===undefined){return false}if(!IsReadableStreamBYOBReader(r)){return false}return true}var w=function(){function ReadableStreamBYOBReader(e){assertRequiredArgument(e,1,"ReadableStreamBYOBReader");assertReadableStream(e,"First parameter");if(IsReadableStreamLocked(e)){throw new TypeError("This stream has already been locked for exclusive reading by another reader")}if(!IsReadableByteStreamController(e._readableStreamController)){throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte "+"source")}ReadableStreamReaderGenericInitialize(this,e);this._readIntoRequests=new d}Object.defineProperty(ReadableStreamBYOBReader.prototype,"closed",{get:function(){if(!IsReadableStreamBYOBReader(this)){return promiseRejectedWith(byobReaderBrandCheckException("closed"))}return this._closedPromise},enumerable:false,configurable:true});ReadableStreamBYOBReader.prototype.cancel=function(e){if(e===void 0){e=undefined}if(!IsReadableStreamBYOBReader(this)){return promiseRejectedWith(byobReaderBrandCheckException("cancel"))}if(this._ownerReadableStream===undefined){return promiseRejectedWith(readerLockException("cancel"))}return ReadableStreamReaderGenericCancel(this,e)};ReadableStreamBYOBReader.prototype.read=function(e){if(!IsReadableStreamBYOBReader(this)){return promiseRejectedWith(byobReaderBrandCheckException("read"))}if(!ArrayBuffer.isView(e)){return promiseRejectedWith(new TypeError("view must be an array buffer view"))}if(e.byteLength===0){return promiseRejectedWith(new TypeError("view must have non-zero byteLength"))}if(e.buffer.byteLength===0){return promiseRejectedWith(new TypeError("view's buffer must have non-zero byteLength"))}if(this._ownerReadableStream===undefined){return promiseRejectedWith(readerLockException("read from"))}var r;var t;var a=newPromise(function(e,a){r=e;t=a});var n={_chunkSteps:function(e){return r({value:e,done:false})},_closeSteps:function(e){return r({value:e,done:true})},_errorSteps:function(e){return t(e)}};ReadableStreamBYOBReaderRead(this,e,n);return a};ReadableStreamBYOBReader.prototype.releaseLock=function(){if(!IsReadableStreamBYOBReader(this)){throw byobReaderBrandCheckException("releaseLock")}if(this._ownerReadableStream===undefined){return}if(this._readIntoRequests.length>0){throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled")}ReadableStreamReaderGenericRelease(this)};return ReadableStreamBYOBReader}();Object.defineProperties(w.prototype,{cancel:{enumerable:true},read:{enumerable:true},releaseLock:{enumerable:true},closed:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(w.prototype,r.toStringTag,{value:"ReadableStreamBYOBReader",configurable:true})}function IsReadableStreamBYOBReader(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")){return false}return true}function ReadableStreamBYOBReaderRead(e,r,t){var a=e._ownerReadableStream;a._disturbed=true;if(a._state==="errored"){t._errorSteps(a._storedError)}else{ReadableByteStreamControllerPullInto(a._readableStreamController,r,t)}}function byobReaderBrandCheckException(e){return new TypeError("ReadableStreamBYOBReader.prototype."+e+" can only be used on a ReadableStreamBYOBReader")}function ExtractHighWaterMark(e,r){var t=e.highWaterMark;if(t===undefined){return r}if(C(t)||t<0){throw new RangeError("Invalid highWaterMark")}return t}function ExtractSizeAlgorithm(e){var r=e.size;if(!r){return function(){return 1}}return r}function convertQueuingStrategy(e,r){assertDictionary(e,r);var t=e===null||e===void 0?void 0:e.highWaterMark;var a=e===null||e===void 0?void 0:e.size;return{highWaterMark:t===undefined?undefined:convertUnrestrictedDouble(t),size:a===undefined?undefined:convertQueuingStrategySize(a,r+" has member 'size' that")}}function convertQueuingStrategySize(e,r){assertFunction(e,r);return function(r){return convertUnrestrictedDouble(e(r))}}function convertUnderlyingSink(e,r){assertDictionary(e,r);var t=e===null||e===void 0?void 0:e.abort;var a=e===null||e===void 0?void 0:e.close;var n=e===null||e===void 0?void 0:e.start;var o=e===null||e===void 0?void 0:e.type;var i=e===null||e===void 0?void 0:e.write;return{abort:t===undefined?undefined:convertUnderlyingSinkAbortCallback(t,e,r+" has member 'abort' that"),close:a===undefined?undefined:convertUnderlyingSinkCloseCallback(a,e,r+" has member 'close' that"),start:n===undefined?undefined:convertUnderlyingSinkStartCallback(n,e,r+" has member 'start' that"),write:i===undefined?undefined:convertUnderlyingSinkWriteCallback(i,e,r+" has member 'write' that"),type:o}}function convertUnderlyingSinkAbortCallback(e,r,t){assertFunction(e,t);return function(t){return promiseCall(e,r,[t])}}function convertUnderlyingSinkCloseCallback(e,r,t){assertFunction(e,t);return function(){return promiseCall(e,r,[])}}function convertUnderlyingSinkStartCallback(e,r,t){assertFunction(e,t);return function(t){return reflectCall(e,r,[t])}}function convertUnderlyingSinkWriteCallback(e,r,t){assertFunction(e,t);return function(t,a){return promiseCall(e,r,[t,a])}}function assertWritableStream(e,r){if(!IsWritableStream(e)){throw new TypeError(r+" is not a WritableStream.")}}var P=function(){function WritableStream(e,r){if(e===void 0){e={}}if(r===void 0){r={}}if(e===undefined){e=null}else{assertObject(e,"First parameter")}var t=convertQueuingStrategy(r,"Second parameter");var a=convertUnderlyingSink(e,"First parameter");InitializeWritableStream(this);var n=a.type;if(n!==undefined){throw new RangeError("Invalid type is specified")}var o=ExtractSizeAlgorithm(t);var i=ExtractHighWaterMark(t,1);SetUpWritableStreamDefaultControllerFromUnderlyingSink(this,a,i,o)}Object.defineProperty(WritableStream.prototype,"locked",{get:function(){if(!IsWritableStream(this)){throw streamBrandCheckException$2("locked")}return IsWritableStreamLocked(this)},enumerable:false,configurable:true});WritableStream.prototype.abort=function(e){if(e===void 0){e=undefined}if(!IsWritableStream(this)){return promiseRejectedWith(streamBrandCheckException$2("abort"))}if(IsWritableStreamLocked(this)){return promiseRejectedWith(new TypeError("Cannot abort a stream that already has a writer"))}return WritableStreamAbort(this,e)};WritableStream.prototype.close=function(){if(!IsWritableStream(this)){return promiseRejectedWith(streamBrandCheckException$2("close"))}if(IsWritableStreamLocked(this)){return promiseRejectedWith(new TypeError("Cannot close a stream that already has a writer"))}if(WritableStreamCloseQueuedOrInFlight(this)){return promiseRejectedWith(new TypeError("Cannot close an already-closing stream"))}return WritableStreamClose(this)};WritableStream.prototype.getWriter=function(){if(!IsWritableStream(this)){throw streamBrandCheckException$2("getWriter")}return AcquireWritableStreamDefaultWriter(this)};return WritableStream}();Object.defineProperties(P.prototype,{abort:{enumerable:true},close:{enumerable:true},getWriter:{enumerable:true},locked:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(P.prototype,r.toStringTag,{value:"WritableStream",configurable:true})}function AcquireWritableStreamDefaultWriter(e){return new I(e)}function CreateWritableStream(e,r,t,a,n,o){if(n===void 0){n=1}if(o===void 0){o=function(){return 1}}var i=Object.create(P.prototype);InitializeWritableStream(i);var l=Object.create(T.prototype);SetUpWritableStreamDefaultController(i,l,e,r,t,a,n,o);return i}function InitializeWritableStream(e){e._state="writable";e._storedError=undefined;e._writer=undefined;e._writableStreamController=undefined;e._writeRequests=new d;e._inFlightWriteRequest=undefined;e._closeRequest=undefined;e._inFlightCloseRequest=undefined;e._pendingAbortRequest=undefined;e._backpressure=false}function IsWritableStream(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")){return false}return true}function IsWritableStreamLocked(e){if(e._writer===undefined){return false}return true}function WritableStreamAbort(e,r){var t=e._state;if(t==="closed"||t==="errored"){return promiseResolvedWith(undefined)}if(e._pendingAbortRequest!==undefined){return e._pendingAbortRequest._promise}var a=false;if(t==="erroring"){a=true;r=undefined}var n=newPromise(function(t,n){e._pendingAbortRequest={_promise:undefined,_resolve:t,_reject:n,_reason:r,_wasAlreadyErroring:a}});e._pendingAbortRequest._promise=n;if(!a){WritableStreamStartErroring(e,r)}return n}function WritableStreamClose(e){var r=e._state;if(r==="closed"||r==="errored"){return promiseRejectedWith(new TypeError("The stream (in "+r+" state) is not in the writable state and cannot be closed"))}var t=newPromise(function(r,t){var a={_resolve:r,_reject:t};e._closeRequest=a});var a=e._writer;if(a!==undefined&&e._backpressure&&r==="writable"){defaultWriterReadyPromiseResolve(a)}WritableStreamDefaultControllerClose(e._writableStreamController);return t}function WritableStreamAddWriteRequest(e){var r=newPromise(function(r,t){var a={_resolve:r,_reject:t};e._writeRequests.push(a)});return r}function WritableStreamDealWithRejection(e,r){var t=e._state;if(t==="writable"){WritableStreamStartErroring(e,r);return}WritableStreamFinishErroring(e)}function WritableStreamStartErroring(e,r){var t=e._writableStreamController;e._state="erroring";e._storedError=r;var a=e._writer;if(a!==undefined){WritableStreamDefaultWriterEnsureReadyPromiseRejected(a,r)}if(!WritableStreamHasOperationMarkedInFlight(e)&&t._started){WritableStreamFinishErroring(e)}}function WritableStreamFinishErroring(e){e._state="errored";e._writableStreamController[c]();var r=e._storedError;e._writeRequests.forEach(function(e){e._reject(r)});e._writeRequests=new d;if(e._pendingAbortRequest===undefined){WritableStreamRejectCloseAndClosedPromiseIfNeeded(e);return}var t=e._pendingAbortRequest;e._pendingAbortRequest=undefined;if(t._wasAlreadyErroring){t._reject(r);WritableStreamRejectCloseAndClosedPromiseIfNeeded(e);return}var a=e._writableStreamController[f](t._reason);uponPromise(a,function(){t._resolve();WritableStreamRejectCloseAndClosedPromiseIfNeeded(e)},function(r){t._reject(r);WritableStreamRejectCloseAndClosedPromiseIfNeeded(e)})}function WritableStreamFinishInFlightWrite(e){e._inFlightWriteRequest._resolve(undefined);e._inFlightWriteRequest=undefined}function WritableStreamFinishInFlightWriteWithError(e,r){e._inFlightWriteRequest._reject(r);e._inFlightWriteRequest=undefined;WritableStreamDealWithRejection(e,r)}function WritableStreamFinishInFlightClose(e){e._inFlightCloseRequest._resolve(undefined);e._inFlightCloseRequest=undefined;var r=e._state;if(r==="erroring"){e._storedError=undefined;if(e._pendingAbortRequest!==undefined){e._pendingAbortRequest._resolve();e._pendingAbortRequest=undefined}}e._state="closed";var t=e._writer;if(t!==undefined){defaultWriterClosedPromiseResolve(t)}}function WritableStreamFinishInFlightCloseWithError(e,r){e._inFlightCloseRequest._reject(r);e._inFlightCloseRequest=undefined;if(e._pendingAbortRequest!==undefined){e._pendingAbortRequest._reject(r);e._pendingAbortRequest=undefined}WritableStreamDealWithRejection(e,r)}function WritableStreamCloseQueuedOrInFlight(e){if(e._closeRequest===undefined&&e._inFlightCloseRequest===undefined){return false}return true}function WritableStreamHasOperationMarkedInFlight(e){if(e._inFlightWriteRequest===undefined&&e._inFlightCloseRequest===undefined){return false}return true}function WritableStreamMarkCloseRequestInFlight(e){e._inFlightCloseRequest=e._closeRequest;e._closeRequest=undefined}function WritableStreamMarkFirstWriteRequestInFlight(e){e._inFlightWriteRequest=e._writeRequests.shift()}function WritableStreamRejectCloseAndClosedPromiseIfNeeded(e){if(e._closeRequest!==undefined){e._closeRequest._reject(e._storedError);e._closeRequest=undefined}var r=e._writer;if(r!==undefined){defaultWriterClosedPromiseReject(r,e._storedError)}}function WritableStreamUpdateBackpressure(e,r){var t=e._writer;if(t!==undefined&&r!==e._backpressure){if(r){defaultWriterReadyPromiseReset(t)}else{defaultWriterReadyPromiseResolve(t)}}e._backpressure=r}var I=function(){function WritableStreamDefaultWriter(e){assertRequiredArgument(e,1,"WritableStreamDefaultWriter");assertWritableStream(e,"First parameter");if(IsWritableStreamLocked(e)){throw new TypeError("This stream has already been locked for exclusive writing by another writer")}this._ownerWritableStream=e;e._writer=this;var r=e._state;if(r==="writable"){if(!WritableStreamCloseQueuedOrInFlight(e)&&e._backpressure){defaultWriterReadyPromiseInitialize(this)}else{defaultWriterReadyPromiseInitializeAsResolved(this)}defaultWriterClosedPromiseInitialize(this)}else if(r==="erroring"){defaultWriterReadyPromiseInitializeAsRejected(this,e._storedError);defaultWriterClosedPromiseInitialize(this)}else if(r==="closed"){defaultWriterReadyPromiseInitializeAsResolved(this);defaultWriterClosedPromiseInitializeAsResolved(this)}else{var t=e._storedError;defaultWriterReadyPromiseInitializeAsRejected(this,t);defaultWriterClosedPromiseInitializeAsRejected(this,t)}}Object.defineProperty(WritableStreamDefaultWriter.prototype,"closed",{get:function(){if(!IsWritableStreamDefaultWriter(this)){return promiseRejectedWith(defaultWriterBrandCheckException("closed"))}return this._closedPromise},enumerable:false,configurable:true});Object.defineProperty(WritableStreamDefaultWriter.prototype,"desiredSize",{get:function(){if(!IsWritableStreamDefaultWriter(this)){throw defaultWriterBrandCheckException("desiredSize")}if(this._ownerWritableStream===undefined){throw defaultWriterLockException("desiredSize")}return WritableStreamDefaultWriterGetDesiredSize(this)},enumerable:false,configurable:true});Object.defineProperty(WritableStreamDefaultWriter.prototype,"ready",{get:function(){if(!IsWritableStreamDefaultWriter(this)){return promiseRejectedWith(defaultWriterBrandCheckException("ready"))}return this._readyPromise},enumerable:false,configurable:true});WritableStreamDefaultWriter.prototype.abort=function(e){if(e===void 0){e=undefined}if(!IsWritableStreamDefaultWriter(this)){return promiseRejectedWith(defaultWriterBrandCheckException("abort"))}if(this._ownerWritableStream===undefined){return promiseRejectedWith(defaultWriterLockException("abort"))}return WritableStreamDefaultWriterAbort(this,e)};WritableStreamDefaultWriter.prototype.close=function(){if(!IsWritableStreamDefaultWriter(this)){return promiseRejectedWith(defaultWriterBrandCheckException("close"))}var e=this._ownerWritableStream;if(e===undefined){return promiseRejectedWith(defaultWriterLockException("close"))}if(WritableStreamCloseQueuedOrInFlight(e)){return promiseRejectedWith(new TypeError("Cannot close an already-closing stream"))}return WritableStreamDefaultWriterClose(this)};WritableStreamDefaultWriter.prototype.releaseLock=function(){if(!IsWritableStreamDefaultWriter(this)){throw defaultWriterBrandCheckException("releaseLock")}var e=this._ownerWritableStream;if(e===undefined){return}WritableStreamDefaultWriterRelease(this)};WritableStreamDefaultWriter.prototype.write=function(e){if(e===void 0){e=undefined}if(!IsWritableStreamDefaultWriter(this)){return promiseRejectedWith(defaultWriterBrandCheckException("write"))}if(this._ownerWritableStream===undefined){return promiseRejectedWith(defaultWriterLockException("write to"))}return WritableStreamDefaultWriterWrite(this,e)};return WritableStreamDefaultWriter}();Object.defineProperties(I.prototype,{abort:{enumerable:true},close:{enumerable:true},releaseLock:{enumerable:true},write:{enumerable:true},closed:{enumerable:true},desiredSize:{enumerable:true},ready:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(I.prototype,r.toStringTag,{value:"WritableStreamDefaultWriter",configurable:true})}function IsWritableStreamDefaultWriter(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")){return false}return true}function WritableStreamDefaultWriterAbort(e,r){var t=e._ownerWritableStream;return WritableStreamAbort(t,r)}function WritableStreamDefaultWriterClose(e){var r=e._ownerWritableStream;return WritableStreamClose(r)}function WritableStreamDefaultWriterCloseWithErrorPropagation(e){var r=e._ownerWritableStream;var t=r._state;if(WritableStreamCloseQueuedOrInFlight(r)||t==="closed"){return promiseResolvedWith(undefined)}if(t==="errored"){return promiseRejectedWith(r._storedError)}return WritableStreamDefaultWriterClose(e)}function WritableStreamDefaultWriterEnsureClosedPromiseRejected(e,r){if(e._closedPromiseState==="pending"){defaultWriterClosedPromiseReject(e,r)}else{defaultWriterClosedPromiseResetToRejected(e,r)}}function WritableStreamDefaultWriterEnsureReadyPromiseRejected(e,r){if(e._readyPromiseState==="pending"){defaultWriterReadyPromiseReject(e,r)}else{defaultWriterReadyPromiseResetToRejected(e,r)}}function WritableStreamDefaultWriterGetDesiredSize(e){var r=e._ownerWritableStream;var t=r._state;if(t==="errored"||t==="erroring"){return null}if(t==="closed"){return 0}return WritableStreamDefaultControllerGetDesiredSize(r._writableStreamController)}function WritableStreamDefaultWriterRelease(e){var r=e._ownerWritableStream;var t=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");WritableStreamDefaultWriterEnsureReadyPromiseRejected(e,t);WritableStreamDefaultWriterEnsureClosedPromiseRejected(e,t);r._writer=undefined;e._ownerWritableStream=undefined}function WritableStreamDefaultWriterWrite(e,r){var t=e._ownerWritableStream;var a=t._writableStreamController;var n=WritableStreamDefaultControllerGetChunkSize(a,r);if(t!==e._ownerWritableStream){return promiseRejectedWith(defaultWriterLockException("write to"))}var o=t._state;if(o==="errored"){return promiseRejectedWith(t._storedError)}if(WritableStreamCloseQueuedOrInFlight(t)||o==="closed"){return promiseRejectedWith(new TypeError("The stream is closing or closed and cannot be written to"))}if(o==="erroring"){return promiseRejectedWith(t._storedError)}var i=WritableStreamAddWriteRequest(t);WritableStreamDefaultControllerWrite(a,r,n);return i}var B={};var T=function(){function WritableStreamDefaultController(){throw new TypeError("Illegal constructor")}WritableStreamDefaultController.prototype.error=function(e){if(e===void 0){e=undefined}if(!IsWritableStreamDefaultController(this)){throw new TypeError("WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController")}var r=this._controlledWritableStream._state;if(r!=="writable"){return}WritableStreamDefaultControllerError(this,e)};WritableStreamDefaultController.prototype[f]=function(e){var r=this._abortAlgorithm(e);WritableStreamDefaultControllerClearAlgorithms(this);return r};WritableStreamDefaultController.prototype[c]=function(){ResetQueue(this)};return WritableStreamDefaultController}();Object.defineProperties(T.prototype,{error:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(T.prototype,r.toStringTag,{value:"WritableStreamDefaultController",configurable:true})}function IsWritableStreamDefaultController(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")){return false}return true}function SetUpWritableStreamDefaultController(e,r,t,a,n,o,i,l){r._controlledWritableStream=e;e._writableStreamController=r;r._queue=undefined;r._queueTotalSize=undefined;ResetQueue(r);r._started=false;r._strategySizeAlgorithm=l;r._strategyHWM=i;r._writeAlgorithm=a;r._closeAlgorithm=n;r._abortAlgorithm=o;var u=WritableStreamDefaultControllerGetBackpressure(r);WritableStreamUpdateBackpressure(e,u);var s=t();var d=promiseResolvedWith(s);uponPromise(d,function(){r._started=true;WritableStreamDefaultControllerAdvanceQueueIfNeeded(r)},function(t){r._started=true;WritableStreamDealWithRejection(e,t)})}function SetUpWritableStreamDefaultControllerFromUnderlyingSink(e,r,t,a){var n=Object.create(T.prototype);var o=function(){return undefined};var i=function(){return promiseResolvedWith(undefined)};var l=function(){return promiseResolvedWith(undefined)};var u=function(){return promiseResolvedWith(undefined)};if(r.start!==undefined){o=function(){return r.start(n)}}if(r.write!==undefined){i=function(e){return r.write(e,n)}}if(r.close!==undefined){l=function(){return r.close()}}if(r.abort!==undefined){u=function(e){return r.abort(e)}}SetUpWritableStreamDefaultController(e,n,o,i,l,u,t,a)}function WritableStreamDefaultControllerClearAlgorithms(e){e._writeAlgorithm=undefined;e._closeAlgorithm=undefined;e._abortAlgorithm=undefined;e._strategySizeAlgorithm=undefined}function WritableStreamDefaultControllerClose(e){EnqueueValueWithSize(e,B,0);WritableStreamDefaultControllerAdvanceQueueIfNeeded(e)}function WritableStreamDefaultControllerGetChunkSize(e,r){try{return e._strategySizeAlgorithm(r)}catch(r){WritableStreamDefaultControllerErrorIfNeeded(e,r);return 1}}function WritableStreamDefaultControllerGetDesiredSize(e){return e._strategyHWM-e._queueTotalSize}function WritableStreamDefaultControllerWrite(e,r,t){try{EnqueueValueWithSize(e,r,t)}catch(r){WritableStreamDefaultControllerErrorIfNeeded(e,r);return}var a=e._controlledWritableStream;if(!WritableStreamCloseQueuedOrInFlight(a)&&a._state==="writable"){var n=WritableStreamDefaultControllerGetBackpressure(e);WritableStreamUpdateBackpressure(a,n)}WritableStreamDefaultControllerAdvanceQueueIfNeeded(e)}function WritableStreamDefaultControllerAdvanceQueueIfNeeded(e){var r=e._controlledWritableStream;if(!e._started){return}if(r._inFlightWriteRequest!==undefined){return}var t=r._state;if(t==="erroring"){WritableStreamFinishErroring(r);return}if(e._queue.length===0){return}var a=PeekQueueValue(e);if(a===B){WritableStreamDefaultControllerProcessClose(e)}else{WritableStreamDefaultControllerProcessWrite(e,a)}}function WritableStreamDefaultControllerErrorIfNeeded(e,r){if(e._controlledWritableStream._state==="writable"){WritableStreamDefaultControllerError(e,r)}}function WritableStreamDefaultControllerProcessClose(e){var r=e._controlledWritableStream;WritableStreamMarkCloseRequestInFlight(r);DequeueValue(e);var t=e._closeAlgorithm();WritableStreamDefaultControllerClearAlgorithms(e);uponPromise(t,function(){WritableStreamFinishInFlightClose(r)},function(e){WritableStreamFinishInFlightCloseWithError(r,e)})}function WritableStreamDefaultControllerProcessWrite(e,r){var t=e._controlledWritableStream;WritableStreamMarkFirstWriteRequestInFlight(t);var a=e._writeAlgorithm(r);uponPromise(a,function(){WritableStreamFinishInFlightWrite(t);var r=t._state;DequeueValue(e);if(!WritableStreamCloseQueuedOrInFlight(t)&&r==="writable"){var a=WritableStreamDefaultControllerGetBackpressure(e);WritableStreamUpdateBackpressure(t,a)}WritableStreamDefaultControllerAdvanceQueueIfNeeded(e)},function(r){if(t._state==="writable"){WritableStreamDefaultControllerClearAlgorithms(e)}WritableStreamFinishInFlightWriteWithError(t,r)})}function WritableStreamDefaultControllerGetBackpressure(e){var r=WritableStreamDefaultControllerGetDesiredSize(e);return r<=0}function WritableStreamDefaultControllerError(e,r){var t=e._controlledWritableStream;WritableStreamDefaultControllerClearAlgorithms(e);WritableStreamStartErroring(t,r)}function streamBrandCheckException$2(e){return new TypeError("WritableStream.prototype."+e+" can only be used on a WritableStream")}function defaultWriterBrandCheckException(e){return new TypeError("WritableStreamDefaultWriter.prototype."+e+" can only be used on a WritableStreamDefaultWriter")}function defaultWriterLockException(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function defaultWriterClosedPromiseInitialize(e){e._closedPromise=newPromise(function(r,t){e._closedPromise_resolve=r;e._closedPromise_reject=t;e._closedPromiseState="pending"})}function defaultWriterClosedPromiseInitializeAsRejected(e,r){defaultWriterClosedPromiseInitialize(e);defaultWriterClosedPromiseReject(e,r)}function defaultWriterClosedPromiseInitializeAsResolved(e){defaultWriterClosedPromiseInitialize(e);defaultWriterClosedPromiseResolve(e)}function defaultWriterClosedPromiseReject(e,r){if(e._closedPromise_reject===undefined){return}setPromiseIsHandledToTrue(e._closedPromise);e._closedPromise_reject(r);e._closedPromise_resolve=undefined;e._closedPromise_reject=undefined;e._closedPromiseState="rejected"}function defaultWriterClosedPromiseResetToRejected(e,r){defaultWriterClosedPromiseInitializeAsRejected(e,r)}function defaultWriterClosedPromiseResolve(e){if(e._closedPromise_resolve===undefined){return}e._closedPromise_resolve(undefined);e._closedPromise_resolve=undefined;e._closedPromise_reject=undefined;e._closedPromiseState="resolved"}function defaultWriterReadyPromiseInitialize(e){e._readyPromise=newPromise(function(r,t){e._readyPromise_resolve=r;e._readyPromise_reject=t});e._readyPromiseState="pending"}function defaultWriterReadyPromiseInitializeAsRejected(e,r){defaultWriterReadyPromiseInitialize(e);defaultWriterReadyPromiseReject(e,r)}function defaultWriterReadyPromiseInitializeAsResolved(e){defaultWriterReadyPromiseInitialize(e);defaultWriterReadyPromiseResolve(e)}function defaultWriterReadyPromiseReject(e,r){if(e._readyPromise_reject===undefined){return}setPromiseIsHandledToTrue(e._readyPromise);e._readyPromise_reject(r);e._readyPromise_resolve=undefined;e._readyPromise_reject=undefined;e._readyPromiseState="rejected"}function defaultWriterReadyPromiseReset(e){defaultWriterReadyPromiseInitialize(e)}function defaultWriterReadyPromiseResetToRejected(e,r){defaultWriterReadyPromiseInitializeAsRejected(e,r)}function defaultWriterReadyPromiseResolve(e){if(e._readyPromise_resolve===undefined){return}e._readyPromise_resolve(undefined);e._readyPromise_resolve=undefined;e._readyPromise_reject=undefined;e._readyPromiseState="fulfilled"}function isAbortSignal(e){if(typeof e!=="object"||e===null){return false}try{return typeof e.aborted==="boolean"}catch(e){return false}}var E=typeof DOMException!=="undefined"?DOMException:undefined;function isDOMExceptionConstructor(e){if(!(typeof e==="function"||typeof e==="object")){return false}try{new e;return true}catch(e){return false}}function createDOMExceptionPolyfill(){var e=function DOMException(e,r){this.message=e||"";this.name=r||"Error";if(Error.captureStackTrace){Error.captureStackTrace(this,this.constructor)}};e.prototype=Object.create(Error.prototype);Object.defineProperty(e.prototype,"constructor",{value:e,writable:true,configurable:true});return e}var D=isDOMExceptionConstructor(E)?E:createDOMExceptionPolyfill();function ReadableStreamPipeTo(e,r,t,a,n,o){var i=AcquireReadableStreamDefaultReader(e);var l=AcquireWritableStreamDefaultWriter(r);e._disturbed=true;var u=false;var s=promiseResolvedWith(undefined);return newPromise(function(d,f){var c;if(o!==undefined){c=function(){var t=new D("Aborted","AbortError");var o=[];if(!a){o.push(function(){if(r._state==="writable"){return WritableStreamAbort(r,t)}return promiseResolvedWith(undefined)})}if(!n){o.push(function(){if(e._state==="readable"){return ReadableStreamCancel(e,t)}return promiseResolvedWith(undefined)})}shutdownWithAction(function(){return Promise.all(o.map(function(e){return e()}))},true,t)};if(o.aborted){c();return}o.addEventListener("abort",c)}function pipeLoop(){return newPromise(function(e,r){function next(t){if(t){e()}else{PerformPromiseThen(pipeStep(),next,r)}}next(false)})}function pipeStep(){if(u){return promiseResolvedWith(true)}return PerformPromiseThen(l._readyPromise,function(){return newPromise(function(e,r){ReadableStreamDefaultReaderRead(i,{_chunkSteps:function(r){s=PerformPromiseThen(WritableStreamDefaultWriterWrite(l,r),undefined,noop);e(false)},_closeSteps:function(){return e(true)},_errorSteps:r})})})}isOrBecomesErrored(e,i._closedPromise,function(e){if(!a){shutdownWithAction(function(){return WritableStreamAbort(r,e)},true,e)}else{shutdown(true,e)}});isOrBecomesErrored(r,l._closedPromise,function(r){if(!n){shutdownWithAction(function(){return ReadableStreamCancel(e,r)},true,r)}else{shutdown(true,r)}});isOrBecomesClosed(e,i._closedPromise,function(){if(!t){shutdownWithAction(function(){return WritableStreamDefaultWriterCloseWithErrorPropagation(l)})}else{shutdown()}});if(WritableStreamCloseQueuedOrInFlight(r)||r._state==="closed"){var m=new TypeError("the destination writable stream closed before all data could be piped to it");if(!n){shutdownWithAction(function(){return ReadableStreamCancel(e,m)},true,m)}else{shutdown(true,m)}}setPromiseIsHandledToTrue(pipeLoop());function waitForWritesToFinish(){var e=s;return PerformPromiseThen(s,function(){return e!==s?waitForWritesToFinish():undefined})}function isOrBecomesErrored(e,r,t){if(e._state==="errored"){t(e._storedError)}else{uponRejection(r,t)}}function isOrBecomesClosed(e,r,t){if(e._state==="closed"){t()}else{uponFulfillment(r,t)}}function shutdownWithAction(e,t,a){if(u){return}u=true;if(r._state==="writable"&&!WritableStreamCloseQueuedOrInFlight(r)){uponFulfillment(waitForWritesToFinish(),doTheRest)}else{doTheRest()}function doTheRest(){uponPromise(e(),function(){return finalize(t,a)},function(e){return finalize(true,e)})}}function shutdown(e,t){if(u){return}u=true;if(r._state==="writable"&&!WritableStreamCloseQueuedOrInFlight(r)){uponFulfillment(waitForWritesToFinish(),function(){return finalize(e,t)})}else{finalize(e,t)}}function finalize(e,r){WritableStreamDefaultWriterRelease(l);ReadableStreamReaderGenericRelease(i);if(o!==undefined){o.removeEventListener("abort",c)}if(e){f(r)}else{d(undefined)}}})}var k=function(){function ReadableStreamDefaultController(){throw new TypeError("Illegal constructor")}Object.defineProperty(ReadableStreamDefaultController.prototype,"desiredSize",{get:function(){if(!IsReadableStreamDefaultController(this)){throw defaultControllerBrandCheckException$1("desiredSize")}return ReadableStreamDefaultControllerGetDesiredSize(this)},enumerable:false,configurable:true});ReadableStreamDefaultController.prototype.close=function(){if(!IsReadableStreamDefaultController(this)){throw defaultControllerBrandCheckException$1("close")}if(!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)){throw new TypeError("The stream is not in a state that permits close")}ReadableStreamDefaultControllerClose(this)};ReadableStreamDefaultController.prototype.enqueue=function(e){if(e===void 0){e=undefined}if(!IsReadableStreamDefaultController(this)){throw defaultControllerBrandCheckException$1("enqueue")}if(!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)){throw new TypeError("The stream is not in a state that permits enqueue")}return ReadableStreamDefaultControllerEnqueue(this,e)};ReadableStreamDefaultController.prototype.error=function(e){if(e===void 0){e=undefined}if(!IsReadableStreamDefaultController(this)){throw defaultControllerBrandCheckException$1("error")}ReadableStreamDefaultControllerError(this,e)};ReadableStreamDefaultController.prototype[m]=function(e){ResetQueue(this);var r=this._cancelAlgorithm(e);ReadableStreamDefaultControllerClearAlgorithms(this);return r};ReadableStreamDefaultController.prototype[b]=function(e){var r=this._controlledReadableStream;if(this._queue.length>0){var t=DequeueValue(this);if(this._closeRequested&&this._queue.length===0){ReadableStreamDefaultControllerClearAlgorithms(this);ReadableStreamClose(r)}else{ReadableStreamDefaultControllerCallPullIfNeeded(this)}e._chunkSteps(t)}else{ReadableStreamAddReadRequest(r,e);ReadableStreamDefaultControllerCallPullIfNeeded(this)}};return ReadableStreamDefaultController}();Object.defineProperties(k.prototype,{close:{enumerable:true},enqueue:{enumerable:true},error:{enumerable:true},desiredSize:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(k.prototype,r.toStringTag,{value:"ReadableStreamDefaultController",configurable:true})}function IsReadableStreamDefaultController(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")){return false}return true}function ReadableStreamDefaultControllerCallPullIfNeeded(e){var r=ReadableStreamDefaultControllerShouldCallPull(e);if(!r){return}if(e._pulling){e._pullAgain=true;return}e._pulling=true;var t=e._pullAlgorithm();uponPromise(t,function(){e._pulling=false;if(e._pullAgain){e._pullAgain=false;ReadableStreamDefaultControllerCallPullIfNeeded(e)}},function(r){ReadableStreamDefaultControllerError(e,r)})}function ReadableStreamDefaultControllerShouldCallPull(e){var r=e._controlledReadableStream;if(!ReadableStreamDefaultControllerCanCloseOrEnqueue(e)){return false}if(!e._started){return false}if(IsReadableStreamLocked(r)&&ReadableStreamGetNumReadRequests(r)>0){return true}var t=ReadableStreamDefaultControllerGetDesiredSize(e);if(t>0){return true}return false}function ReadableStreamDefaultControllerClearAlgorithms(e){e._pullAlgorithm=undefined;e._cancelAlgorithm=undefined;e._strategySizeAlgorithm=undefined}function ReadableStreamDefaultControllerClose(e){if(!ReadableStreamDefaultControllerCanCloseOrEnqueue(e)){return}var r=e._controlledReadableStream;e._closeRequested=true;if(e._queue.length===0){ReadableStreamDefaultControllerClearAlgorithms(e);ReadableStreamClose(r)}}function ReadableStreamDefaultControllerEnqueue(e,r){if(!ReadableStreamDefaultControllerCanCloseOrEnqueue(e)){return}var t=e._controlledReadableStream;if(IsReadableStreamLocked(t)&&ReadableStreamGetNumReadRequests(t)>0){ReadableStreamFulfillReadRequest(t,r,false)}else{var a=void 0;try{a=e._strategySizeAlgorithm(r)}catch(r){ReadableStreamDefaultControllerError(e,r);throw r}try{EnqueueValueWithSize(e,r,a)}catch(r){ReadableStreamDefaultControllerError(e,r);throw r}}ReadableStreamDefaultControllerCallPullIfNeeded(e)}function ReadableStreamDefaultControllerError(e,r){var t=e._controlledReadableStream;if(t._state!=="readable"){return}ResetQueue(e);ReadableStreamDefaultControllerClearAlgorithms(e);ReadableStreamError(t,r)}function ReadableStreamDefaultControllerGetDesiredSize(e){var r=e._controlledReadableStream._state;if(r==="errored"){return null}if(r==="closed"){return 0}return e._strategyHWM-e._queueTotalSize}function ReadableStreamDefaultControllerHasBackpressure(e){if(ReadableStreamDefaultControllerShouldCallPull(e)){return false}return true}function ReadableStreamDefaultControllerCanCloseOrEnqueue(e){var r=e._controlledReadableStream._state;if(!e._closeRequested&&r==="readable"){return true}return false}function SetUpReadableStreamDefaultController(e,r,t,a,n,o,i){r._controlledReadableStream=e;r._queue=undefined;r._queueTotalSize=undefined;ResetQueue(r);r._started=false;r._closeRequested=false;r._pullAgain=false;r._pulling=false;r._strategySizeAlgorithm=i;r._strategyHWM=o;r._pullAlgorithm=a;r._cancelAlgorithm=n;e._readableStreamController=r;var l=t();uponPromise(promiseResolvedWith(l),function(){r._started=true;ReadableStreamDefaultControllerCallPullIfNeeded(r)},function(e){ReadableStreamDefaultControllerError(r,e)})}function SetUpReadableStreamDefaultControllerFromUnderlyingSource(e,r,t,a){var n=Object.create(k.prototype);var o=function(){return undefined};var i=function(){return promiseResolvedWith(undefined)};var l=function(){return promiseResolvedWith(undefined)};if(r.start!==undefined){o=function(){return r.start(n)}}if(r.pull!==undefined){i=function(){return r.pull(n)}}if(r.cancel!==undefined){l=function(e){return r.cancel(e)}}SetUpReadableStreamDefaultController(e,n,o,i,l,t,a)}function defaultControllerBrandCheckException$1(e){return new TypeError("ReadableStreamDefaultController.prototype."+e+" can only be used on a ReadableStreamDefaultController")}function ReadableStreamTee(e,r){var t=AcquireReadableStreamDefaultReader(e);var a=false;var n=false;var o=false;var i;var l;var s;var d;var f;var c=newPromise(function(e){f=e});function pullAlgorithm(){if(a){return promiseResolvedWith(undefined)}a=true;var e={_chunkSteps:function(e){u(function(){a=false;var r=e;var t=e;if(!n){ReadableStreamDefaultControllerEnqueue(s._readableStreamController,r)}if(!o){ReadableStreamDefaultControllerEnqueue(d._readableStreamController,t)}})},_closeSteps:function(){a=false;if(!n){ReadableStreamDefaultControllerClose(s._readableStreamController)}if(!o){ReadableStreamDefaultControllerClose(d._readableStreamController)}if(!n||!o){f(undefined)}},_errorSteps:function(){a=false}};ReadableStreamDefaultReaderRead(t,e);return promiseResolvedWith(undefined)}function cancel1Algorithm(r){n=true;i=r;if(o){var t=CreateArrayFromList([i,l]);var a=ReadableStreamCancel(e,t);f(a)}return c}function cancel2Algorithm(r){o=true;l=r;if(n){var t=CreateArrayFromList([i,l]);var a=ReadableStreamCancel(e,t);f(a)}return c}function startAlgorithm(){}s=CreateReadableStream(startAlgorithm,pullAlgorithm,cancel1Algorithm);d=CreateReadableStream(startAlgorithm,pullAlgorithm,cancel2Algorithm);uponRejection(t._closedPromise,function(e){ReadableStreamDefaultControllerError(s._readableStreamController,e);ReadableStreamDefaultControllerError(d._readableStreamController,e);if(!n||!o){f(undefined)}});return[s,d]}function convertUnderlyingDefaultOrByteSource(e,r){assertDictionary(e,r);var t=e;var a=t===null||t===void 0?void 0:t.autoAllocateChunkSize;var n=t===null||t===void 0?void 0:t.cancel;var o=t===null||t===void 0?void 0:t.pull;var i=t===null||t===void 0?void 0:t.start;var l=t===null||t===void 0?void 0:t.type;return{autoAllocateChunkSize:a===undefined?undefined:convertUnsignedLongLongWithEnforceRange(a,r+" has member 'autoAllocateChunkSize' that"),cancel:n===undefined?undefined:convertUnderlyingSourceCancelCallback(n,t,r+" has member 'cancel' that"),pull:o===undefined?undefined:convertUnderlyingSourcePullCallback(o,t,r+" has member 'pull' that"),start:i===undefined?undefined:convertUnderlyingSourceStartCallback(i,t,r+" has member 'start' that"),type:l===undefined?undefined:convertReadableStreamType(l,r+" has member 'type' that")}}function convertUnderlyingSourceCancelCallback(e,r,t){assertFunction(e,t);return function(t){return promiseCall(e,r,[t])}}function convertUnderlyingSourcePullCallback(e,r,t){assertFunction(e,t);return function(t){return promiseCall(e,r,[t])}}function convertUnderlyingSourceStartCallback(e,r,t){assertFunction(e,t);return function(t){return reflectCall(e,r,[t])}}function convertReadableStreamType(e,r){e=""+e;if(e!=="bytes"){throw new TypeError(r+" '"+e+"' is not a valid enumeration value for ReadableStreamType")}return e}function convertReaderOptions(e,r){assertDictionary(e,r);var t=e===null||e===void 0?void 0:e.mode;return{mode:t===undefined?undefined:convertReadableStreamReaderMode(t,r+" has member 'mode' that")}}function convertReadableStreamReaderMode(e,r){e=""+e;if(e!=="byob"){throw new TypeError(r+" '"+e+"' is not a valid enumeration value for ReadableStreamReaderMode")}return e}function convertIteratorOptions(e,r){assertDictionary(e,r);var t=e===null||e===void 0?void 0:e.preventCancel;return{preventCancel:Boolean(t)}}function convertPipeOptions(e,r){assertDictionary(e,r);var t=e===null||e===void 0?void 0:e.preventAbort;var a=e===null||e===void 0?void 0:e.preventCancel;var n=e===null||e===void 0?void 0:e.preventClose;var o=e===null||e===void 0?void 0:e.signal;if(o!==undefined){assertAbortSignal(o,r+" has member 'signal' that")}return{preventAbort:Boolean(t),preventCancel:Boolean(a),preventClose:Boolean(n),signal:o}}function assertAbortSignal(e,r){if(!isAbortSignal(e)){throw new TypeError(r+" is not an AbortSignal.")}}function convertReadableWritablePair(e,r){assertDictionary(e,r);var t=e===null||e===void 0?void 0:e.readable;assertRequiredField(t,"readable","ReadableWritablePair");assertReadableStream(t,r+" has member 'readable' that");var a=e===null||e===void 0?void 0:e.writable;assertRequiredField(a,"writable","ReadableWritablePair");assertWritableStream(a,r+" has member 'writable' that");return{readable:t,writable:a}}var A=function(){function ReadableStream(e,r){if(e===void 0){e={}}if(r===void 0){r={}}if(e===undefined){e=null}else{assertObject(e,"First parameter")}var t=convertQueuingStrategy(r,"Second parameter");var a=convertUnderlyingDefaultOrByteSource(e,"First parameter");InitializeReadableStream(this);if(a.type==="bytes"){if(t.size!==undefined){throw new RangeError("The strategy for a byte stream cannot have a size function")}var n=ExtractHighWaterMark(t,0);SetUpReadableByteStreamControllerFromUnderlyingSource(this,a,n)}else{var o=ExtractSizeAlgorithm(t);var n=ExtractHighWaterMark(t,1);SetUpReadableStreamDefaultControllerFromUnderlyingSource(this,a,n,o)}}Object.defineProperty(ReadableStream.prototype,"locked",{get:function(){if(!IsReadableStream(this)){throw streamBrandCheckException$1("locked")}return IsReadableStreamLocked(this)},enumerable:false,configurable:true});ReadableStream.prototype.cancel=function(e){if(e===void 0){e=undefined}if(!IsReadableStream(this)){return promiseRejectedWith(streamBrandCheckException$1("cancel"))}if(IsReadableStreamLocked(this)){return promiseRejectedWith(new TypeError("Cannot cancel a stream that already has a reader"))}return ReadableStreamCancel(this,e)};ReadableStream.prototype.getReader=function(e){if(e===void 0){e=undefined}if(!IsReadableStream(this)){throw streamBrandCheckException$1("getReader")}var r=convertReaderOptions(e,"First parameter");if(r.mode===undefined){return AcquireReadableStreamDefaultReader(this)}return AcquireReadableStreamBYOBReader(this)};ReadableStream.prototype.pipeThrough=function(e,r){if(r===void 0){r={}}if(!IsReadableStream(this)){throw streamBrandCheckException$1("pipeThrough")}assertRequiredArgument(e,1,"pipeThrough");var t=convertReadableWritablePair(e,"First parameter");var a=convertPipeOptions(r,"Second parameter");if(IsReadableStreamLocked(this)){throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream")}if(IsWritableStreamLocked(t.writable)){throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream")}var n=ReadableStreamPipeTo(this,t.writable,a.preventClose,a.preventAbort,a.preventCancel,a.signal);setPromiseIsHandledToTrue(n);return t.readable};ReadableStream.prototype.pipeTo=function(e,r){if(r===void 0){r={}}if(!IsReadableStream(this)){return promiseRejectedWith(streamBrandCheckException$1("pipeTo"))}if(e===undefined){return promiseRejectedWith("Parameter 1 is required in 'pipeTo'.")}if(!IsWritableStream(e)){return promiseRejectedWith(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"))}var t;try{t=convertPipeOptions(r,"Second parameter")}catch(e){return promiseRejectedWith(e)}if(IsReadableStreamLocked(this)){return promiseRejectedWith(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream"))}if(IsWritableStreamLocked(e)){return promiseRejectedWith(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream"))}return ReadableStreamPipeTo(this,e,t.preventClose,t.preventAbort,t.preventCancel,t.signal)};ReadableStream.prototype.tee=function(){if(!IsReadableStream(this)){throw streamBrandCheckException$1("tee")}var e=ReadableStreamTee(this);return CreateArrayFromList(e)};ReadableStream.prototype.values=function(e){if(e===void 0){e=undefined}if(!IsReadableStream(this)){throw streamBrandCheckException$1("values")}var r=convertIteratorOptions(e,"First parameter");return AcquireReadableStreamAsyncIterator(this,r.preventCancel)};return ReadableStream}();Object.defineProperties(A.prototype,{cancel:{enumerable:true},getReader:{enumerable:true},pipeThrough:{enumerable:true},pipeTo:{enumerable:true},tee:{enumerable:true},values:{enumerable:true},locked:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(A.prototype,r.toStringTag,{value:"ReadableStream",configurable:true})}if(typeof r.asyncIterator==="symbol"){Object.defineProperty(A.prototype,r.asyncIterator,{value:A.prototype.values,writable:true,configurable:true})}function CreateReadableStream(e,r,t,a,n){if(a===void 0){a=1}if(n===void 0){n=function(){return 1}}var o=Object.create(A.prototype);InitializeReadableStream(o);var i=Object.create(k.prototype);SetUpReadableStreamDefaultController(o,i,e,r,t,a,n);return o}function InitializeReadableStream(e){e._state="readable";e._reader=undefined;e._storedError=undefined;e._disturbed=false}function IsReadableStream(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")){return false}return true}function IsReadableStreamLocked(e){if(e._reader===undefined){return false}return true}function ReadableStreamCancel(e,r){e._disturbed=true;if(e._state==="closed"){return promiseResolvedWith(undefined)}if(e._state==="errored"){return promiseRejectedWith(e._storedError)}ReadableStreamClose(e);var t=e._readableStreamController[m](r);return transformPromiseWith(t,noop)}function ReadableStreamClose(e){e._state="closed";var r=e._reader;if(r===undefined){return}defaultReaderClosedPromiseResolve(r);if(IsReadableStreamDefaultReader(r)){r._readRequests.forEach(function(e){e._closeSteps()});r._readRequests=new d}}function ReadableStreamError(e,r){e._state="errored";e._storedError=r;var t=e._reader;if(t===undefined){return}defaultReaderClosedPromiseReject(t,r);if(IsReadableStreamDefaultReader(t)){t._readRequests.forEach(function(e){e._errorSteps(r)});t._readRequests=new d}else{t._readIntoRequests.forEach(function(e){e._errorSteps(r)});t._readIntoRequests=new d}}function streamBrandCheckException$1(e){return new TypeError("ReadableStream.prototype."+e+" can only be used on a ReadableStream")}function convertQueuingStrategyInit(e,r){assertDictionary(e,r);var t=e===null||e===void 0?void 0:e.highWaterMark;assertRequiredField(t,"highWaterMark","QueuingStrategyInit");return{highWaterMark:convertUnrestrictedDouble(t)}}var q=function size(e){return e.byteLength};var j=function(){function ByteLengthQueuingStrategy(e){assertRequiredArgument(e,1,"ByteLengthQueuingStrategy");e=convertQueuingStrategyInit(e,"First parameter");this._byteLengthQueuingStrategyHighWaterMark=e.highWaterMark}Object.defineProperty(ByteLengthQueuingStrategy.prototype,"highWaterMark",{get:function(){if(!IsByteLengthQueuingStrategy(this)){throw byteLengthBrandCheckException("highWaterMark")}return this._byteLengthQueuingStrategyHighWaterMark},enumerable:false,configurable:true});Object.defineProperty(ByteLengthQueuingStrategy.prototype,"size",{get:function(){if(!IsByteLengthQueuingStrategy(this)){throw byteLengthBrandCheckException("size")}return q},enumerable:false,configurable:true});return ByteLengthQueuingStrategy}();Object.defineProperties(j.prototype,{highWaterMark:{enumerable:true},size:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(j.prototype,r.toStringTag,{value:"ByteLengthQueuingStrategy",configurable:true})}function byteLengthBrandCheckException(e){return new TypeError("ByteLengthQueuingStrategy.prototype."+e+" can only be used on a ByteLengthQueuingStrategy")}function IsByteLengthQueuingStrategy(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_byteLengthQueuingStrategyHighWaterMark")){return false}return true}var O=function size(){return 1};var F=function(){function CountQueuingStrategy(e){assertRequiredArgument(e,1,"CountQueuingStrategy");e=convertQueuingStrategyInit(e,"First parameter");this._countQueuingStrategyHighWaterMark=e.highWaterMark}Object.defineProperty(CountQueuingStrategy.prototype,"highWaterMark",{get:function(){if(!IsCountQueuingStrategy(this)){throw countBrandCheckException("highWaterMark")}return this._countQueuingStrategyHighWaterMark},enumerable:false,configurable:true});Object.defineProperty(CountQueuingStrategy.prototype,"size",{get:function(){if(!IsCountQueuingStrategy(this)){throw countBrandCheckException("size")}return O},enumerable:false,configurable:true});return CountQueuingStrategy}();Object.defineProperties(F.prototype,{highWaterMark:{enumerable:true},size:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(F.prototype,r.toStringTag,{value:"CountQueuingStrategy",configurable:true})}function countBrandCheckException(e){return new TypeError("CountQueuingStrategy.prototype."+e+" can only be used on a CountQueuingStrategy")}function IsCountQueuingStrategy(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_countQueuingStrategyHighWaterMark")){return false}return true}function convertTransformer(e,r){assertDictionary(e,r);var t=e===null||e===void 0?void 0:e.flush;var a=e===null||e===void 0?void 0:e.readableType;var n=e===null||e===void 0?void 0:e.start;var o=e===null||e===void 0?void 0:e.transform;var i=e===null||e===void 0?void 0:e.writableType;return{flush:t===undefined?undefined:convertTransformerFlushCallback(t,e,r+" has member 'flush' that"),readableType:a,start:n===undefined?undefined:convertTransformerStartCallback(n,e,r+" has member 'start' that"),transform:o===undefined?undefined:convertTransformerTransformCallback(o,e,r+" has member 'transform' that"),writableType:i}}function convertTransformerFlushCallback(e,r,t){assertFunction(e,t);return function(t){return promiseCall(e,r,[t])}}function convertTransformerStartCallback(e,r,t){assertFunction(e,t);return function(t){return reflectCall(e,r,[t])}}function convertTransformerTransformCallback(e,r,t){assertFunction(e,t);return function(t,a){return promiseCall(e,r,[t,a])}}var z=function(){function TransformStream(e,r,t){if(e===void 0){e={}}if(r===void 0){r={}}if(t===void 0){t={}}if(e===undefined){e=null}var a=convertQueuingStrategy(r,"Second parameter");var n=convertQueuingStrategy(t,"Third parameter");var o=convertTransformer(e,"First parameter");if(o.readableType!==undefined){throw new RangeError("Invalid readableType specified")}if(o.writableType!==undefined){throw new RangeError("Invalid writableType specified")}var i=ExtractHighWaterMark(n,0);var l=ExtractSizeAlgorithm(n);var u=ExtractHighWaterMark(a,1);var s=ExtractSizeAlgorithm(a);var d;var f=newPromise(function(e){d=e});InitializeTransformStream(this,f,u,s,i,l);SetUpTransformStreamDefaultControllerFromTransformer(this,o);if(o.start!==undefined){d(o.start(this._transformStreamController))}else{d(undefined)}}Object.defineProperty(TransformStream.prototype,"readable",{get:function(){if(!IsTransformStream(this)){throw streamBrandCheckException("readable")}return this._readable},enumerable:false,configurable:true});Object.defineProperty(TransformStream.prototype,"writable",{get:function(){if(!IsTransformStream(this)){throw streamBrandCheckException("writable")}return this._writable},enumerable:false,configurable:true});return TransformStream}();Object.defineProperties(z.prototype,{readable:{enumerable:true},writable:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(z.prototype,r.toStringTag,{value:"TransformStream",configurable:true})}function InitializeTransformStream(e,r,t,a,n,o){function startAlgorithm(){return r}function writeAlgorithm(r){return TransformStreamDefaultSinkWriteAlgorithm(e,r)}function abortAlgorithm(r){return TransformStreamDefaultSinkAbortAlgorithm(e,r)}function closeAlgorithm(){return TransformStreamDefaultSinkCloseAlgorithm(e)}e._writable=CreateWritableStream(startAlgorithm,writeAlgorithm,closeAlgorithm,abortAlgorithm,t,a);function pullAlgorithm(){return TransformStreamDefaultSourcePullAlgorithm(e)}function cancelAlgorithm(r){TransformStreamErrorWritableAndUnblockWrite(e,r);return promiseResolvedWith(undefined)}e._readable=CreateReadableStream(startAlgorithm,pullAlgorithm,cancelAlgorithm,n,o);e._backpressure=undefined;e._backpressureChangePromise=undefined;e._backpressureChangePromise_resolve=undefined;TransformStreamSetBackpressure(e,true);e._transformStreamController=undefined}function IsTransformStream(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")){return false}return true}function TransformStreamError(e,r){ReadableStreamDefaultControllerError(e._readable._readableStreamController,r);TransformStreamErrorWritableAndUnblockWrite(e,r)}function TransformStreamErrorWritableAndUnblockWrite(e,r){TransformStreamDefaultControllerClearAlgorithms(e._transformStreamController);WritableStreamDefaultControllerErrorIfNeeded(e._writable._writableStreamController,r);if(e._backpressure){TransformStreamSetBackpressure(e,false)}}function TransformStreamSetBackpressure(e,r){if(e._backpressureChangePromise!==undefined){e._backpressureChangePromise_resolve()}e._backpressureChangePromise=newPromise(function(r){e._backpressureChangePromise_resolve=r});e._backpressure=r}var x=function(){function TransformStreamDefaultController(){throw new TypeError("Illegal constructor")}Object.defineProperty(TransformStreamDefaultController.prototype,"desiredSize",{get:function(){if(!IsTransformStreamDefaultController(this)){throw defaultControllerBrandCheckException("desiredSize")}var e=this._controlledTransformStream._readable._readableStreamController;return ReadableStreamDefaultControllerGetDesiredSize(e)},enumerable:false,configurable:true});TransformStreamDefaultController.prototype.enqueue=function(e){if(e===void 0){e=undefined}if(!IsTransformStreamDefaultController(this)){throw defaultControllerBrandCheckException("enqueue")}TransformStreamDefaultControllerEnqueue(this,e)};TransformStreamDefaultController.prototype.error=function(e){if(e===void 0){e=undefined}if(!IsTransformStreamDefaultController(this)){throw defaultControllerBrandCheckException("error")}TransformStreamDefaultControllerError(this,e)};TransformStreamDefaultController.prototype.terminate=function(){if(!IsTransformStreamDefaultController(this)){throw defaultControllerBrandCheckException("terminate")}TransformStreamDefaultControllerTerminate(this)};return TransformStreamDefaultController}();Object.defineProperties(x.prototype,{enqueue:{enumerable:true},error:{enumerable:true},terminate:{enumerable:true},desiredSize:{enumerable:true}});if(typeof r.toStringTag==="symbol"){Object.defineProperty(x.prototype,r.toStringTag,{value:"TransformStreamDefaultController",configurable:true})}function IsTransformStreamDefaultController(e){if(!typeIsObject(e)){return false}if(!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")){return false}return true}function SetUpTransformStreamDefaultController(e,r,t,a){r._controlledTransformStream=e;e._transformStreamController=r;r._transformAlgorithm=t;r._flushAlgorithm=a}function SetUpTransformStreamDefaultControllerFromTransformer(e,r){var t=Object.create(x.prototype);var a=function(e){try{TransformStreamDefaultControllerEnqueue(t,e);return promiseResolvedWith(undefined)}catch(e){return promiseRejectedWith(e)}};var n=function(){return promiseResolvedWith(undefined)};if(r.transform!==undefined){a=function(e){return r.transform(e,t)}}if(r.flush!==undefined){n=function(){return r.flush(t)}}SetUpTransformStreamDefaultController(e,t,a,n)}function TransformStreamDefaultControllerClearAlgorithms(e){e._transformAlgorithm=undefined;e._flushAlgorithm=undefined}function TransformStreamDefaultControllerEnqueue(e,r){var t=e._controlledTransformStream;var a=t._readable._readableStreamController;if(!ReadableStreamDefaultControllerCanCloseOrEnqueue(a)){throw new TypeError("Readable side is not in a state that permits enqueue")}try{ReadableStreamDefaultControllerEnqueue(a,r)}catch(e){TransformStreamErrorWritableAndUnblockWrite(t,e);throw t._readable._storedError}var n=ReadableStreamDefaultControllerHasBackpressure(a);if(n!==t._backpressure){TransformStreamSetBackpressure(t,true)}}function TransformStreamDefaultControllerError(e,r){TransformStreamError(e._controlledTransformStream,r)}function TransformStreamDefaultControllerPerformTransform(e,r){var t=e._transformAlgorithm(r);return transformPromiseWith(t,undefined,function(r){TransformStreamError(e._controlledTransformStream,r);throw r})}function TransformStreamDefaultControllerTerminate(e){var r=e._controlledTransformStream;var t=r._readable._readableStreamController;ReadableStreamDefaultControllerClose(t);var a=new TypeError("TransformStream terminated");TransformStreamErrorWritableAndUnblockWrite(r,a)}function TransformStreamDefaultSinkWriteAlgorithm(e,r){var t=e._transformStreamController;if(e._backpressure){var a=e._backpressureChangePromise;return transformPromiseWith(a,function(){var a=e._writable;var n=a._state;if(n==="erroring"){throw a._storedError}return TransformStreamDefaultControllerPerformTransform(t,r)})}return TransformStreamDefaultControllerPerformTransform(t,r)}function TransformStreamDefaultSinkAbortAlgorithm(e,r){TransformStreamError(e,r);return promiseResolvedWith(undefined)}function TransformStreamDefaultSinkCloseAlgorithm(e){var r=e._readable;var t=e._transformStreamController;var a=t._flushAlgorithm();TransformStreamDefaultControllerClearAlgorithms(t);return transformPromiseWith(a,function(){if(r._state==="errored"){throw r._storedError}ReadableStreamDefaultControllerClose(r._readableStreamController)},function(t){TransformStreamError(e,t);throw r._storedError})}function TransformStreamDefaultSourcePullAlgorithm(e){TransformStreamSetBackpressure(e,false);return e._backpressureChangePromise}function defaultControllerBrandCheckException(e){return new TypeError("TransformStreamDefaultController.prototype."+e+" can only be used on a TransformStreamDefaultController")}function streamBrandCheckException(e){return new TypeError("TransformStream.prototype."+e+" can only be used on a TransformStream")}e.ByteLengthQueuingStrategy=j;e.CountQueuingStrategy=F;e.ReadableByteStreamController=W;e.ReadableStream=A;e.ReadableStreamBYOBReader=w;e.ReadableStreamBYOBRequest=g;e.ReadableStreamDefaultController=k;e.ReadableStreamDefaultReader=h;e.TransformStream=z;e.TransformStreamDefaultController=x;e.WritableStream=P;e.WritableStreamDefaultController=T;e.WritableStreamDefaultWriter=I;Object.defineProperty(e,"__esModule",{value:true})})}};var r={};function __nccwpck_require__(t){if(r[t]){return r[t].exports}var a=r[t]={exports:{}};var n=true;try{e[t].call(a.exports,a,a.exports,__nccwpck_require__);n=false}finally{if(n)delete r[t]}return a.exports}__nccwpck_require__.ab=__dirname+"/";return __nccwpck_require__(650)})();
\ No newline at end of file
diff --git a/packages/next/export/index.ts b/packages/next/export/index.ts
index 41156234595fd..531662fcc2d5b 100644
--- a/packages/next/export/index.ts
+++ b/packages/next/export/index.ts
@@ -520,7 +520,7 @@ export default async function exportApp(
)
}
- const timeout = configuration?.experimental.staticPageGenerationTimeout || 0
+ const timeout = configuration?.staticPageGenerationTimeout || 0
let infoPrinted = false
let exportPage: typeof import('./worker').default
let endWorker: () => Promise
diff --git a/packages/next/lib/constants.ts b/packages/next/lib/constants.ts
index 96b0df3fd4f8d..77b438810519c 100644
--- a/packages/next/lib/constants.ts
+++ b/packages/next/lib/constants.ts
@@ -17,6 +17,9 @@ export const NEXT_PROJECT_ROOT_DIST_SERVER = join(
// Regex for API routes
export const API_ROUTE = /^\/api(?:\/|$)/
+// Regex for middleware
+export const MIDDLEWARE_ROUTE = /_middleware$/
+
// Because on Windows absolute paths in the generated code can break because of numbers, eg 1 in the path,
// we have to use a private alias
export const PAGES_DIR_ALIAS = 'private-next-pages'
diff --git a/packages/next/package.json b/packages/next/package.json
index 4c21552d1ce2b..d740d19a43df8 100644
--- a/packages/next/package.json
+++ b/packages/next/package.json
@@ -1,6 +1,6 @@
{
"name": "next",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"description": "The React Framework",
"main": "./dist/server/next.js",
"license": "MIT",
@@ -30,6 +30,8 @@
"error.d.ts",
"script.js",
"script.d.ts",
+ "server.js",
+ "server.d.ts",
"head.js",
"head.d.ts",
"image.js",
@@ -66,10 +68,10 @@
"dependencies": {
"@babel/runtime": "7.15.4",
"@hapi/accept": "5.0.2",
- "@next/env": "11.1.3-canary.87",
- "@next/polyfill-module": "11.1.3-canary.87",
- "@next/react-dev-overlay": "11.1.3-canary.87",
- "@next/react-refresh-utils": "11.1.3-canary.87",
+ "@next/env": "11.1.3-canary.89",
+ "@next/polyfill-module": "11.1.3-canary.89",
+ "@next/react-dev-overlay": "11.1.3-canary.89",
+ "@next/react-refresh-utils": "11.1.3-canary.89",
"@node-rs/helper": "1.2.1",
"assert": "2.0.0",
"browserify-zlib": "0.2.0",
@@ -150,7 +152,8 @@
"@babel/traverse": "7.15.0",
"@babel/types": "7.15.0",
"@napi-rs/cli": "1.1.0",
- "@next/polyfill-nomodule": "11.1.3-canary.87",
+ "@next/polyfill-nomodule": "11.1.3-canary.89",
+ "@peculiar/webcrypto": "1.1.7",
"@taskr/clear": "1.1.0",
"@taskr/esnext": "1.1.0",
"@taskr/watch": "1.1.0",
@@ -180,6 +183,8 @@
"@types/send": "0.14.4",
"@types/styled-jsx": "2.2.8",
"@types/text-table": "0.2.1",
+ "@types/ua-parser-js": "0.7.36",
+ "@types/uuid": "8.3.1",
"@types/webpack-sources1": "npm:@types/webpack-sources@0.1.5",
"@types/ws": "8.2.0",
"@vercel/ncc": "0.27.0",
@@ -204,6 +209,7 @@
"file-loader": "6.0.0",
"find-cache-dir": "3.3.1",
"find-up": "4.1.0",
+ "formdata-node": "4.3.0",
"fresh": "0.5.2",
"glob": "7.1.7",
"gzip-size": "5.1.1",
@@ -245,7 +251,10 @@
"taskr": "1.1.0",
"terser": "5.7.1",
"text-table": "0.2.0",
+ "ua-parser-js": "0.7.28",
"unistore": "3.4.1",
+ "uuid": "8.3.2",
+ "web-streams-polyfill": "3.0.3",
"web-vitals": "2.1.0",
"webpack-sources1": "npm:webpack-sources@1.4.3",
"webpack-sources3": "npm:webpack-sources@3.2.0",
diff --git a/packages/next/server.d.ts b/packages/next/server.d.ts
new file mode 100644
index 0000000000000..ede20d97d501b
--- /dev/null
+++ b/packages/next/server.d.ts
@@ -0,0 +1,3 @@
+export { NextFetchEvent } from 'next/dist/server/web/spec-extension/fetch-event'
+export { NextRequest } from 'next/dist/server/web/spec-extension/request'
+export { NextResponse } from 'next/dist/server/web/spec-extension/response'
diff --git a/packages/next/server.js b/packages/next/server.js
new file mode 100644
index 0000000000000..0aff92876d2c4
--- /dev/null
+++ b/packages/next/server.js
@@ -0,0 +1,2 @@
+export { NextRequest } from 'next/dist/server/web/spec-extension/request'
+export { NextResponse } from 'next/dist/server/web/spec-extension/response'
diff --git a/packages/next/server/accept-header.ts b/packages/next/server/accept-header.ts
new file mode 100644
index 0000000000000..638db99b73208
--- /dev/null
+++ b/packages/next/server/accept-header.ts
@@ -0,0 +1,137 @@
+export function acceptLanguage(header = '', preferences?: string[]) {
+ return (
+ parse(header, preferences, {
+ type: 'accept-language',
+ prefixMatch: true,
+ })[0] || ''
+ )
+}
+
+interface Selection {
+ pos: number
+ pref?: number
+ q: number
+ token: string
+}
+
+interface Options {
+ prefixMatch?: boolean
+ type: 'accept-language'
+}
+
+function parse(
+ raw: string,
+ preferences: string[] | undefined,
+ options: Options
+) {
+ const lowers = new Map()
+ const header = raw.replace(/[ \t]/g, '')
+
+ if (preferences) {
+ let pos = 0
+ for (const preference of preferences) {
+ const lower = preference.toLowerCase()
+ lowers.set(lower, { orig: preference, pos: pos++ })
+ if (options.prefixMatch) {
+ const parts = lower.split('-')
+ while ((parts.pop(), parts.length > 0)) {
+ const joined = parts.join('-')
+ if (!lowers.has(joined)) {
+ lowers.set(joined, { orig: preference, pos: pos++ })
+ }
+ }
+ }
+ }
+ }
+
+ const parts = header.split(',')
+ const selections: Selection[] = []
+ const map = new Set()
+
+ for (let i = 0; i < parts.length; ++i) {
+ const part = parts[i]
+ if (!part) {
+ continue
+ }
+
+ const params = part.split(';')
+ if (params.length > 2) {
+ throw new Error(`Invalid ${options.type} header`)
+ }
+
+ let token = params[0].toLowerCase()
+ if (!token) {
+ throw new Error(`Invalid ${options.type} header`)
+ }
+
+ const selection: Selection = { token, pos: i, q: 1 }
+ if (preferences && lowers.has(token)) {
+ selection.pref = lowers.get(token)!.pos
+ }
+
+ map.add(selection.token)
+
+ if (params.length === 2) {
+ const q = params[1]
+ const [key, value] = q.split('=')
+
+ if (!value || (key !== 'q' && key !== 'Q')) {
+ throw new Error(`Invalid ${options.type} header`)
+ }
+
+ const score = parseFloat(value)
+ if (score === 0) {
+ continue
+ }
+
+ if (Number.isFinite(score) && score <= 1 && score >= 0.001) {
+ selection.q = score
+ }
+ }
+
+ selections.push(selection)
+ }
+
+ selections.sort((a, b) => {
+ if (b.q !== a.q) {
+ return b.q - a.q
+ }
+
+ if (b.pref !== a.pref) {
+ if (a.pref === undefined) {
+ return 1
+ }
+
+ if (b.pref === undefined) {
+ return -1
+ }
+
+ return a.pref - b.pref
+ }
+
+ return a.pos - b.pos
+ })
+
+ const values = selections.map((selection) => selection.token)
+ if (!preferences || !preferences.length) {
+ return values
+ }
+
+ const preferred: string[] = []
+ for (const selection of values) {
+ if (selection === '*') {
+ for (const [preference, value] of lowers) {
+ if (!map.has(preference)) {
+ preferred.push(value.orig)
+ }
+ }
+ } else {
+ const lower = selection.toLowerCase()
+ if (lowers.has(lower)) {
+ preferred.push(lowers.get(lower)!.orig)
+ }
+ }
+ }
+
+ return preferred
+}
diff --git a/packages/next/server/config-shared.ts b/packages/next/server/config-shared.ts
index 1a7346b3f1452..094dd67ecd2f0 100644
--- a/packages/next/server/config-shared.ts
+++ b/packages/next/server/config-shared.ts
@@ -114,6 +114,7 @@ export type NextConfig = { [key: string]: any } & {
webpack5?: false
strictPostcssConfiguration?: boolean
}
+ staticPageGenerationTimeout?: number
crossOrigin?: false | 'anonymous' | 'use-credentials'
experimental?: {
swcMinify?: boolean
@@ -141,7 +142,6 @@ export type NextConfig = { [key: string]: any } & {
gzipSize?: boolean
craCompat?: boolean
esmExternals?: boolean | 'loose'
- staticPageGenerationTimeout?: number
isrMemoryCacheSize?: number
outputFileTracing?: boolean
concurrentFeatures?: boolean
@@ -198,6 +198,7 @@ export const defaultConfig: NextConfig = {
httpAgentOptions: {
keepAlive: true,
},
+ staticPageGenerationTimeout: 60,
experimental: {
swcLoader: false,
swcMinify: false,
@@ -206,7 +207,7 @@ export const defaultConfig: NextConfig = {
(Number(process.env.CIRCLE_NODE_TOTAL) ||
(os.cpus() || { length: 1 }).length) - 1
),
- sharedPool: false,
+ sharedPool: true,
plugins: false,
profiling: false,
isrFlushToDisk: true,
@@ -221,7 +222,6 @@ export const defaultConfig: NextConfig = {
gzipSize: true,
craCompat: false,
esmExternals: true,
- staticPageGenerationTimeout: 60,
// default to 50MB limit
isrMemoryCacheSize: 50 * 1024 * 1024,
outputFileTracing: false,
diff --git a/packages/next/server/dev/hot-reloader.ts b/packages/next/server/dev/hot-reloader.ts
index 6be430d9514ee..d79c0fe83f4ca 100644
--- a/packages/next/server/dev/hot-reloader.ts
+++ b/packages/next/server/dev/hot-reloader.ts
@@ -11,7 +11,7 @@ import {
} from '../../build/entries'
import { watchCompilers } from '../../build/output'
import getBaseWebpackConfig from '../../build/webpack-config'
-import { API_ROUTE } from '../../lib/constants'
+import { API_ROUTE, MIDDLEWARE_ROUTE } from '../../lib/constants'
import { recursiveDelete } from '../../lib/recursive-delete'
import { BLOCKED_PAGES } from '../../shared/lib/constants'
import { __ApiPreviewProps } from '../api-utils'
@@ -140,7 +140,7 @@ export default class HotReloader {
private pagesDir: string
private webpackHotMiddleware?: WebpackHotMiddleware
private config: NextConfigComplete
- private stats: webpack.Stats | null
+ public clientStats: webpack.Stats | null
public serverStats: webpack.Stats | null
private clientError: Error | null = null
private serverError: Error | null = null
@@ -173,7 +173,7 @@ export default class HotReloader {
this.dir = dir
this.middlewares = []
this.pagesDir = pagesDir
- this.stats = null
+ this.clientStats = null
this.serverStats = null
this.serverPrevDocumentHash = null
@@ -414,9 +414,15 @@ export default class HotReloader {
const page = pageKey.slice(
isClientKey ? 'client'.length : 'server'.length
)
- if (isClientCompilation && page.match(API_ROUTE)) {
+ const isMiddleware = page.match(MIDDLEWARE_ROUTE)
+ if (isClientCompilation && page.match(API_ROUTE) && !isMiddleware) {
return
}
+
+ if (!isClientCompilation && isMiddleware) {
+ return
+ }
+
const { bundlePath, absolutePagePath, dispose } = entries[pageKey]
const pageExists = !dispose && (await isWriteable(absolutePagePath))
if (!pageExists) {
@@ -431,21 +437,29 @@ export default class HotReloader {
absolutePagePath,
}
- if (isClientCompilation) {
- entrypoints[bundlePath] = finalizeEntrypoint(
- bundlePath,
- `next-client-pages-loader?${stringify(pageLoaderOpts)}!`,
- false
- )
+ if (isClientCompilation && isMiddleware) {
+ entrypoints[bundlePath] = finalizeEntrypoint({
+ name: bundlePath,
+ value: `next-middleware-loader?${stringify(pageLoaderOpts)}!`,
+ isServer: false,
+ })
+ } else if (isClientCompilation) {
+ entrypoints[bundlePath] = finalizeEntrypoint({
+ name: bundlePath,
+ value: `next-client-pages-loader?${stringify(pageLoaderOpts)}!`,
+ isServer: false,
+ })
} else {
let request = relative(config.context!, absolutePagePath)
- if (!isAbsolute(request) && !request.startsWith('../'))
+ if (!isAbsolute(request) && !request.startsWith('../')) {
request = `./${request}`
- entrypoints[bundlePath] = finalizeEntrypoint(
- bundlePath,
- request,
- true
- )
+ }
+
+ entrypoints[bundlePath] = finalizeEntrypoint({
+ name: bundlePath,
+ value: request,
+ isServer: true,
+ })
}
})
)
@@ -474,6 +488,7 @@ export default class HotReloader {
(stats: webpack.compilation.Compilation) => {
stats.entrypoints.forEach((entry, key) => {
if (key.startsWith('pages/')) {
+ // TODO this doesn't handle on demand loaded chunks
entry.chunks.forEach((chunk: any) => {
if (chunk.id === key) {
const prevHash = pageHashMap.get(key)
@@ -543,9 +558,17 @@ export default class HotReloader {
changedServerPages,
changedClientPages
)
+ const middlewareChanges = Array.from(changedClientPages).filter((name) =>
+ name.match(MIDDLEWARE_ROUTE)
+ )
changedClientPages.clear()
changedServerPages.clear()
+ if (middlewareChanges.length > 0) {
+ this.send({
+ event: 'middlewareChanges',
+ })
+ }
if (serverOnlyChanges.length > 0) {
this.send({
event: 'serverOnlyChanges',
@@ -560,14 +583,14 @@ export default class HotReloader {
'NextjsHotReloaderForClient',
(err: Error) => {
this.clientError = err
- this.stats = null
+ this.clientStats = null
}
)
multiCompiler.compilers[0].hooks.done.tap(
'NextjsHotReloaderForClient',
(stats) => {
this.clientError = null
- this.stats = stats
+ this.clientStats = stats
const { compilation } = stats
const chunkNames = new Set(
@@ -633,7 +656,7 @@ export default class HotReloader {
this.middlewares = [
getOverlayMiddleware({
rootDirectory: this.dir,
- stats: () => this.stats,
+ stats: () => this.clientStats,
serverStats: () => this.serverStats,
}),
]
@@ -658,8 +681,8 @@ export default class HotReloader {
if (this.clientError || this.serverError) {
return [this.clientError || this.serverError]
- } else if (this.stats?.hasErrors()) {
- const { compilation } = this.stats
+ } else if (this.clientStats?.hasErrors()) {
+ const { compilation } = this.clientStats
const failedPages = erroredPages(compilation)
// If there is an error related to the requesting page we display it instead of the first error
@@ -671,7 +694,7 @@ export default class HotReloader {
}
// If none were found we still have to show the other errors
- return this.stats.compilation.errors
+ return this.clientStats.compilation.errors
} else if (this.serverStats?.hasErrors()) {
const { compilation } = this.serverStats
const failedPages = erroredPages(compilation)
diff --git a/packages/next/server/dev/next-dev-server.ts b/packages/next/server/dev/next-dev-server.ts
index dd69e844d51e3..45d513f080732 100644
--- a/packages/next/server/dev/next-dev-server.ts
+++ b/packages/next/server/dev/next-dev-server.ts
@@ -19,6 +19,7 @@ import {
PHASE_DEVELOPMENT_SERVER,
CLIENT_STATIC_FILES_PATH,
DEV_CLIENT_PAGES_MANIFEST,
+ DEV_MIDDLEWARE_MANIFEST,
} from '../../shared/lib/constants'
import {
getRouteMatcher,
@@ -55,6 +56,9 @@ import {
} from '@next/react-dev-overlay/lib/middleware'
import * as Log from '../../build/output/log'
import isError from '../../lib/is-error'
+import { getMiddlewareRegex } from '../../shared/lib/router/utils/get-middleware-regex'
+import type { FetchEventResult } from '../web/types'
+import type { ParsedNextUrl } from '../../shared/lib/router/utils/parse-next-url'
// Load ReactDevOverlay only when needed
let ReactDevOverlayImpl: React.FunctionComponent
@@ -207,6 +211,10 @@ export default class DevServer extends Server {
return
}
+ const regexMiddleware = new RegExp(
+ `/(_middleware.(?:${this.nextConfig.pageExtensions.join('|')}))$`
+ )
+
const regexPageExtension = new RegExp(
`\\.+(?:${this.nextConfig.pageExtensions.join('|')})$`
)
@@ -231,6 +239,7 @@ export default class DevServer extends Server {
wp.watch([], [pagesDir!], 0)
wp.on('aggregated', () => {
+ const routedMiddleware = []
const routedPages = []
const knownFiles = wp.getTimeInfoEntries()
for (const [fileName, { accuracy }] of knownFiles) {
@@ -238,6 +247,16 @@ export default class DevServer extends Server {
continue
}
+ if (regexMiddleware.test(fileName)) {
+ routedMiddleware.push(
+ `/${relative(pagesDir!, fileName)}`
+ .replace(/\\+/g, '')
+ .replace(/^\/+/g, '/')
+ .replace(regexMiddleware, '/')
+ )
+ continue
+ }
+
let pageName =
'/' + relative(pagesDir!, fileName).replace(/\\+/g, '/')
pageName = pageName.replace(regexPageExtension, '')
@@ -246,6 +265,11 @@ export default class DevServer extends Server {
routedPages.push(pageName)
}
+ this.middleware = getSortedRoutes(routedMiddleware).map((page) => ({
+ match: getRouteMatcher(getMiddlewareRegex(page)),
+ page,
+ }))
+
try {
// we serve a separate manifest with all pages for the client in
// dev mode so that we can match a page after a rewrite on the client
@@ -444,6 +468,31 @@ export default class DevServer extends Server {
}
}
+ async runMiddleware(params: {
+ request: IncomingMessage
+ response: ServerResponse
+ parsedUrl: ParsedNextUrl
+ parsed: UrlWithParsedQuery
+ }): Promise {
+ try {
+ const result = await super.runMiddleware(params)
+ result?.promise.catch((error) =>
+ this.logErrorWithOriginalStack(error, 'unhandledRejection', 'client')
+ )
+ result?.waitUntil.catch((error) =>
+ this.logErrorWithOriginalStack(error, 'unhandledRejection', 'client')
+ )
+ return result
+ } catch (error) {
+ this.logErrorWithOriginalStack(error, undefined, 'client')
+ const err = isError(error) ? error : new Error(error + '')
+ ;(err as any).middleware = true
+ const { request, response, parsedUrl } = params
+ this.renderError(err, request, response, parsedUrl.pathname)
+ return null
+ }
+ }
+
async run(
req: IncomingMessage,
res: ServerResponse,
@@ -504,7 +553,8 @@ export default class DevServer extends Server {
private async logErrorWithOriginalStack(
err?: unknown,
- type?: 'unhandledRejection' | 'uncaughtException'
+ type?: 'unhandledRejection' | 'uncaughtException',
+ stats: 'server' | 'client' = 'server'
) {
let usedOriginalStack = false
@@ -514,7 +564,11 @@ export default class DevServer extends Server {
const frame = frames[0]
if (frame.lineNumber && frame?.file) {
- const compilation = this.hotReloader?.serverStats?.compilation
+ const compilation =
+ stats === 'client'
+ ? this.hotReloader?.clientStats?.compilation
+ : this.hotReloader?.serverStats?.compilation
+
const moduleId = frame.file!.replace(
/^(webpack-internal:\/\/\/|file:\/\/)/,
''
@@ -587,6 +641,18 @@ export default class DevServer extends Server {
})
}
+ protected getMiddleware(): never[] {
+ return []
+ }
+
+ protected async hasMiddleware(pathname: string): Promise {
+ return this.hasPage(getMiddlewareFilepath(pathname))
+ }
+
+ protected async ensureMiddleware(pathname: string) {
+ return this.hotReloader!.ensurePage(getMiddlewareFilepath(pathname))
+ }
+
generateRoutes() {
const { fsRoutes, ...otherRoutes } = super.generateRoutes()
@@ -625,6 +691,26 @@ export default class DevServer extends Server {
},
})
+ fsRoutes.unshift({
+ match: route(
+ `/_next/${CLIENT_STATIC_FILES_PATH}/${this.buildId}/${DEV_MIDDLEWARE_MANIFEST}`
+ ),
+ type: 'route',
+ name: `_next/${CLIENT_STATIC_FILES_PATH}/${this.buildId}/${DEV_MIDDLEWARE_MANIFEST}`,
+ fn: async (_req, res) => {
+ res.statusCode = 200
+ res.setHeader('Content-Type', 'application/json; charset=utf-8')
+ res.end(
+ JSON.stringify(
+ this.middleware?.map((middleware) => middleware.page) || []
+ )
+ )
+ return {
+ finished: true,
+ }
+ },
+ })
+
fsRoutes.push({
match: route('/:path*'),
type: 'route',
@@ -831,3 +917,9 @@ export default class DevServer extends Server {
return false
}
}
+
+function getMiddlewareFilepath(pathname: string) {
+ return pathname.endsWith('/')
+ ? `${pathname}_middleware`
+ : `${pathname}/_middleware`
+}
diff --git a/packages/next/server/dev/on-demand-entry-handler.ts b/packages/next/server/dev/on-demand-entry-handler.ts
index 2af0d7a25b197..d33e0acf47856 100644
--- a/packages/next/server/dev/on-demand-entry-handler.ts
+++ b/packages/next/server/dev/on-demand-entry-handler.ts
@@ -5,7 +5,7 @@ import { normalizePagePath, normalizePathSep } from '../normalize-page-path'
import { pageNotFoundError } from '../require'
import { findPageFile } from '../lib/find-page-file'
import getRouteFromEntrypoint from '../get-route-from-entrypoint'
-import { API_ROUTE } from '../../lib/constants'
+import { API_ROUTE, MIDDLEWARE_ROUTE } from '../../lib/constants'
import { reportTrigger } from '../../build/output'
import type ws from 'ws'
@@ -187,7 +187,8 @@ export default function onDemandEntryHandler(
page = posix.normalize(pageUrl)
const normalizedPage = normalizePathSep(page)
- const isApiRoute = normalizedPage.match(API_ROUTE)
+ const isMiddleware = normalizedPage.match(MIDDLEWARE_ROUTE)
+ const isApiRoute = normalizedPage.match(API_ROUTE) && !isMiddleware
let entriesChanged = false
const addPageEntry = (type: 'client' | 'server') => {
@@ -228,13 +229,13 @@ export default function onDemandEntryHandler(
const promise = isApiRoute
? addPageEntry('server')
- : clientOnly
+ : clientOnly || isMiddleware
? addPageEntry('client')
: Promise.all([addPageEntry('client'), addPageEntry('server')])
if (entriesChanged) {
reportTrigger(
- isApiRoute
+ isApiRoute || isMiddleware
? `${normalizedPage} (server only)`
: clientOnly
? `${normalizedPage} (client only)`
diff --git a/packages/next/server/next-server.ts b/packages/next/server/next-server.ts
index 14413b335688b..20a979edd4411 100644
--- a/packages/next/server/next-server.ts
+++ b/packages/next/server/next-server.ts
@@ -33,12 +33,14 @@ import {
SERVER_DIRECTORY,
STATIC_STATUS_PAGES,
TEMPORARY_REDIRECT_STATUS,
+ MIDDLEWARE_MANIFEST,
} from '../shared/lib/constants'
import {
getRouteMatcher,
getRouteRegex,
getSortedRoutes,
isDynamicRoute,
+ getMiddlewareRegex,
} from '../shared/lib/router/utils'
import * as envConfig from '../shared/lib/runtime-config'
import {
@@ -98,10 +100,18 @@ import ResponseCache, {
import { NextConfigComplete } from './config-shared'
import { parseNextUrl } from '../shared/lib/router/utils/parse-next-url'
import isError from '../lib/is-error'
+import { getMiddlewareInfo } from './require'
+import { parseUrl as simpleParseUrl } from '../shared/lib/router/utils/parse-url'
+import { MIDDLEWARE_ROUTE } from '../lib/constants'
+import { run } from './web/sandbox'
+import type { FetchEventResult } from './web/types'
+import type { MiddlewareManifest } from '../build/webpack/plugins/middleware-plugin'
+import type { ParsedNextUrl } from '../shared/lib/router/utils/parse-next-url'
+import type { ParsedUrl } from '../shared/lib/router/utils/parse-url'
const getCustomRouteMatcher = pathMatch(true)
-type Middleware = (
+type ExpressMiddleware = (
req: IncomingMessage,
res: ServerResponse,
next: (err?: Error) => void
@@ -112,7 +122,7 @@ export type FindComponentsResult = {
query: ParsedUrlQuery
}
-type DynamicRouteItem = {
+interface RoutingItem {
page: string
match: ReturnType
}
@@ -179,12 +189,14 @@ export default class Server {
distDir: string
concurrentFeatures?: boolean
}
- private compression?: Middleware
+ private compression?: ExpressMiddleware
private incrementalCache: IncrementalCache
private responseCache: ResponseCache
protected router: Router
protected dynamicRoutes?: DynamicRoutes
protected customRoutes: CustomRoutes
+ protected middlewareManifest?: MiddlewareManifest
+ protected middleware?: RoutingItem[]
public constructor({
dir = '.',
@@ -248,7 +260,7 @@ export default class Server {
}
if (compress && this.nextConfig.target === 'server') {
- this.compression = compression() as Middleware
+ this.compression = compression() as ExpressMiddleware
}
// Initialize next/config with the environment configuration
@@ -262,9 +274,16 @@ export default class Server {
this._isLikeServerless ? SERVERLESS_DIRECTORY : SERVER_DIRECTORY
)
const pagesManifestPath = join(this.serverBuildDir, PAGES_MANIFEST)
+ const middlewareManifestPath = join(
+ join(this.distDir, SERVER_DIRECTORY),
+ MIDDLEWARE_MANIFEST
+ )
if (!dev) {
this.pagesManifest = require(pagesManifestPath)
+ if (!this.minimalMode) {
+ this.middlewareManifest = require(middlewareManifestPath)
+ }
}
this.customRoutes = this.getCustomRoutes()
@@ -337,6 +356,8 @@ export default class Server {
if (typeof parsedUrl.query === 'string') {
parsedUrl.query = parseQs(parsedUrl.query)
}
+
+ ;(req as any).__NEXT_INIT_URL = req.url
;(req as any).__NEXT_INIT_QUERY = Object.assign({}, parsedUrl.query)
const url = parseNextUrl({
@@ -547,6 +568,109 @@ export default class Server {
return this.getPrerenderManifest().preview
}
+ protected getMiddleware() {
+ return Object.keys(this.middlewareManifest?.middleware || {}).map(
+ (page) => ({
+ match: getRouteMatcher(getMiddlewareRegex(page)),
+ page,
+ })
+ )
+ }
+
+ protected async hasMiddleware(pathname: string): Promise {
+ try {
+ return (
+ getMiddlewareInfo({
+ dev: this.renderOpts.dev,
+ distDir: this.distDir,
+ page: pathname,
+ serverless: this._isLikeServerless,
+ }).paths.length > 0
+ )
+ } catch (_) {}
+
+ return false
+ }
+
+ protected async ensureMiddleware(_pathname: string) {}
+
+ protected async runMiddleware(params: {
+ request: IncomingMessage
+ response: ServerResponse
+ parsedUrl: ParsedNextUrl
+ parsed: UrlWithParsedQuery
+ }): Promise {
+ const page: { name?: string; params?: { [key: string]: string } } = {}
+ if (await this.hasPage(params.parsedUrl.pathname)) {
+ page.name = params.parsedUrl.pathname
+ } else if (this.dynamicRoutes) {
+ for (const dynamicRoute of this.dynamicRoutes) {
+ const matchParams = dynamicRoute.match(params.parsedUrl.pathname)
+ if (matchParams) {
+ page.name = dynamicRoute.page
+ page.params = matchParams
+ break
+ }
+ }
+ }
+
+ let result: FetchEventResult | null = null
+
+ for (const middleware of this.middleware || []) {
+ if (middleware.match(params.parsedUrl.pathname)) {
+ if (!(await this.hasMiddleware(middleware.page))) {
+ console.warn(`The Edge Function for ${middleware.page} was not found`)
+ continue
+ }
+
+ await this.ensureMiddleware(middleware.page)
+
+ const middlewareInfo = getMiddlewareInfo({
+ dev: this.renderOpts.dev,
+ distDir: this.distDir,
+ page: middleware.page,
+ serverless: this._isLikeServerless,
+ })
+
+ result = await run({
+ name: middlewareInfo.name,
+ paths: middlewareInfo.paths,
+ request: {
+ headers: params.request.headers,
+ method: params.request.method || 'GET',
+ nextConfig: {
+ basePath: this.nextConfig.basePath,
+ i18n: this.nextConfig.i18n,
+ trailingSlash: this.nextConfig.trailingSlash,
+ },
+ url: (params.request as any).__NEXT_INIT_URL,
+ page: page,
+ },
+ })
+
+ if (!this.renderOpts.dev) {
+ result.promise.catch((error) => {
+ console.error(`Uncaught: middleware error after responding`, error)
+ })
+
+ result.waitUntil.catch((error) => {
+ console.error(`Uncaught: middleware waitUntil errored`, error)
+ })
+ }
+
+ if (!result.response.headers.has('x-middleware-next')) {
+ break
+ }
+ }
+ }
+
+ if (!result) {
+ this.render404(params.request, params.response, params.parsed)
+ }
+
+ return result
+ }
+
protected generateRoutes(): {
basePath: string
headers: Route[]
@@ -558,6 +682,7 @@ export default class Server {
fsRoutes: Route[]
redirects: Route[]
catchAllRoute: Route
+ catchAllMiddleware?: Route
pageChecker: PageChecker
useFileSystemPublicRoutes: boolean
dynamicRoutes: DynamicRoutes | undefined
@@ -810,6 +935,49 @@ export default class Server {
})
}
+ const proxyRequest = async (
+ req: IncomingMessage,
+ res: ServerResponse,
+ parsedUrl: ParsedUrl
+ ) => {
+ const { query } = parsedUrl
+ delete (parsedUrl as any).query
+ parsedUrl.search = stringifyQuery(req, query)
+
+ const target = formatUrl(parsedUrl)
+ const proxy = new Proxy({
+ target,
+ changeOrigin: true,
+ ignorePath: true,
+ xfwd: true,
+ proxyTimeout: 30_000, // limit proxying to 30 seconds
+ })
+
+ await new Promise((proxyResolve, proxyReject) => {
+ let finished = false
+
+ proxy.on('proxyReq', (proxyReq) => {
+ proxyReq.on('close', () => {
+ if (!finished) {
+ finished = true
+ proxyResolve(true)
+ }
+ })
+ })
+ proxy.on('error', (err) => {
+ if (!finished) {
+ finished = true
+ proxyReject(err)
+ }
+ })
+ proxy.web(req, res)
+ })
+
+ return {
+ finished: true,
+ }
+ }
+
const redirects = this.minimalMode
? []
: this.customRoutes.redirects.map((redirect) => {
@@ -876,43 +1044,9 @@ export default class Server {
// external rewrite, proxy it
if (parsedDestination.protocol) {
- const { query } = parsedDestination
- delete (parsedDestination as any).query
- parsedDestination.search = stringifyQuery(req, query)
-
- const target = formatUrl(parsedDestination)
- const proxy = new Proxy({
- target,
- changeOrigin: true,
- ignorePath: true,
- xfwd: true,
- proxyTimeout: 30_000, // limit proxying to 30 seconds
- })
-
- await new Promise((proxyResolve, proxyReject) => {
- let finished = false
-
- proxy.on('proxyReq', (proxyReq) => {
- proxyReq.on('close', () => {
- if (!finished) {
- finished = true
- proxyResolve(true)
- }
- })
- })
- proxy.on('error', (err) => {
- if (!finished) {
- finished = true
- proxyReject(err)
- }
- })
- proxy.web(req, res)
- })
-
- return {
- finished: true,
- }
+ return proxyRequest(req, res, parsedDestination)
}
+
;(req as any)._nextRewroteUrl = newUrl
;(req as any)._nextDidRewrite =
(req as any)._nextRewroteUrl !== req.url
@@ -946,6 +1080,137 @@ export default class Server {
}
}
+ let catchAllMiddleware: Route | undefined
+
+ if (!this.minimalMode) {
+ catchAllMiddleware = {
+ match: route('/:path*'),
+ type: 'route',
+ name: 'middleware catchall',
+ fn: async (req, res, _params, parsed) => {
+ const fullUrl = (req as any).__NEXT_INIT_URL
+ const parsedUrl = parseNextUrl({
+ url: fullUrl,
+ headers: req.headers,
+ nextConfig: {
+ basePath: this.nextConfig.basePath,
+ i18n: this.nextConfig.i18n,
+ trailingSlash: this.nextConfig.trailingSlash,
+ },
+ })
+
+ if (!this.middleware?.some((m) => m.match(parsedUrl.pathname))) {
+ return { finished: false }
+ }
+
+ let result: FetchEventResult | null = null
+
+ try {
+ result = await this.runMiddleware({
+ request: req,
+ response: res,
+ parsedUrl: parsedUrl,
+ parsed: parsed,
+ })
+ } catch (err) {
+ if (isError(err) && err.code === 'ENOENT') {
+ await this.render404(req, res, parsed)
+ return { finished: true }
+ }
+
+ const error = isError(err) ? err : new Error(err + '')
+ console.error(error)
+ res.statusCode = 500
+ this.renderError(error, req, res, parsed.pathname || '')
+ return { finished: true }
+ }
+
+ if (result === null) {
+ return { finished: true }
+ }
+
+ if (
+ !result.response.headers.has('x-middleware-rewrite') &&
+ !result.response.headers.has('x-middleware-next') &&
+ !result.response.headers.has('Location')
+ ) {
+ result.response.headers.set('x-middleware-refresh', '1')
+ }
+
+ result.response.headers.delete('x-middleware-next')
+
+ for (const [key, value] of result.response.headers.entries()) {
+ if (key !== 'content-encoding') {
+ res.setHeader(key, value)
+ }
+ }
+
+ const preflight =
+ req.method === 'HEAD' && req.headers['x-middleware-preflight']
+
+ if (preflight) {
+ res.writeHead(200)
+ res.end()
+ return {
+ finished: true,
+ }
+ }
+
+ res.statusCode = result.response.status
+ res.statusMessage = result.response.statusText
+
+ const location = result.response.headers.get('Location')
+ if (location) {
+ res.statusCode = result.response.status
+ if (res.statusCode === 308) {
+ res.setHeader('Refresh', `0;url=${location}`)
+ }
+
+ res.end()
+ return {
+ finished: true,
+ }
+ }
+
+ if (result.response.headers.has('x-middleware-rewrite')) {
+ const rewrite = result.response.headers.get('x-middleware-rewrite')!
+ const rewriteParsed = simpleParseUrl(rewrite)
+ if (rewriteParsed.protocol) {
+ return proxyRequest(req, res, rewriteParsed)
+ }
+
+ ;(req as any)._nextRewroteUrl = rewrite
+ ;(req as any)._nextDidRewrite =
+ (req as any)._nextRewroteUrl !== req.url
+
+ return {
+ finished: false,
+ pathname: rewriteParsed.pathname,
+ query: {
+ ...parsedUrl.query,
+ ...rewriteParsed.query,
+ },
+ }
+ }
+
+ if (result.response.headers.has('x-middleware-refresh')) {
+ res.writeHead(result.response.status)
+ for await (const chunk of result.response.body || []) {
+ res.write(chunk)
+ }
+ res.end()
+ return {
+ finished: true,
+ }
+ }
+
+ return {
+ finished: false,
+ }
+ },
+ }
+ }
+
const catchAllRoute: Route = {
match: route('/:path*'),
type: 'route',
@@ -972,6 +1237,13 @@ export default class Server {
}
const bubbleNoFallback = !!query._nextBubbleNoFallback
+ if (pathname.match(MIDDLEWARE_ROUTE)) {
+ await this.render404(req, res, parsedUrl)
+ return {
+ finished: true,
+ }
+ }
+
if (pathname === '/api' || pathname.startsWith('/api/')) {
delete query._nextBubbleNoFallback
@@ -1007,6 +1279,9 @@ export default class Server {
if (useFileSystemPublicRoutes) {
this.dynamicRoutes = this.getDynamicRoutes()
+ if (!this.minimalMode) {
+ this.middleware = this.getMiddleware()
+ }
}
return {
@@ -1019,6 +1294,7 @@ export default class Server {
},
redirects,
catchAllRoute,
+ catchAllMiddleware,
useFileSystemPublicRoutes,
dynamicRoutes: this.dynamicRoutes,
basePath: this.nextConfig.basePath,
@@ -1195,7 +1471,7 @@ export default class Server {
]
}
- protected getDynamicRoutes(): Array {
+ protected getDynamicRoutes(): Array {
const addedPages = new Set()
return getSortedRoutes(
@@ -1212,7 +1488,7 @@ export default class Server {
match: getRouteMatcher(getRouteRegex(page)),
}
})
- .filter((item): item is DynamicRouteItem => Boolean(item))
+ .filter((item): item is RoutingItem => Boolean(item))
}
private handleCompression(req: IncomingMessage, res: ServerResponse): void {
diff --git a/packages/next/server/render.tsx b/packages/next/server/render.tsx
index 4560770d818a6..74907e1a173c7 100644
--- a/packages/next/server/render.tsx
+++ b/packages/next/server/render.tsx
@@ -1197,9 +1197,13 @@ export async function renderToHTML(
return new RenderResult(chainPipers(pipers))
}
-function errorToJSON(err: Error): Error {
- const { name, message, stack } = err
- return { name, message, stack }
+function errorToJSON(err: Error) {
+ return {
+ name: err.name,
+ message: err.message,
+ stack: err.stack,
+ middleware: (err as any).middleware,
+ }
}
function serializeError(
diff --git a/packages/next/server/require.ts b/packages/next/server/require.ts
index 7e3fcd06179e1..d31f4d3d80cb5 100644
--- a/packages/next/server/require.ts
+++ b/packages/next/server/require.ts
@@ -1,14 +1,16 @@
import { promises } from 'fs'
import { join } from 'path'
import {
+ FONT_MANIFEST,
+ MIDDLEWARE_MANIFEST,
PAGES_MANIFEST,
SERVER_DIRECTORY,
SERVERLESS_DIRECTORY,
- FONT_MANIFEST,
} from '../shared/lib/constants'
import { normalizePagePath, denormalizePagePath } from './normalize-page-path'
-import { PagesManifest } from '../build/webpack/plugins/pages-manifest-plugin'
import { normalizeLocalePath } from '../shared/lib/i18n/normalize-locale-path'
+import type { PagesManifest } from '../build/webpack/plugins/pages-manifest-plugin'
+import type { MiddlewareManifest } from '../build/webpack/plugins/middleware-plugin'
export function pageNotFoundError(page: string): Error {
const err: any = new Error(`Cannot find module for page: ${page}`)
@@ -76,3 +78,38 @@ export function requireFontManifest(distDir: string, serverless: boolean) {
const fontManifest = require(join(serverBuildPath, FONT_MANIFEST))
return fontManifest
}
+
+export function getMiddlewareInfo(params: {
+ dev?: boolean
+ distDir: string
+ page: string
+ serverless: boolean
+}): { name: string; paths: string[] } {
+ const serverBuildPath = join(
+ params.distDir,
+ params.serverless && !params.dev ? SERVERLESS_DIRECTORY : SERVER_DIRECTORY
+ )
+
+ const middlewareManifest: MiddlewareManifest = require(join(
+ serverBuildPath,
+ MIDDLEWARE_MANIFEST
+ ))
+
+ let page: string
+
+ try {
+ page = denormalizePagePath(normalizePagePath(params.page))
+ } catch (err) {
+ throw pageNotFoundError(params.page)
+ }
+
+ let pageInfo = middlewareManifest.middleware[page]
+ if (!pageInfo) {
+ throw pageNotFoundError(page)
+ }
+
+ return {
+ name: pageInfo.name,
+ paths: pageInfo.files.map((file) => join(params.distDir, file)),
+ }
+}
diff --git a/packages/next/server/router.ts b/packages/next/server/router.ts
index d9306e953488f..f889ad0b0e18e 100644
--- a/packages/next/server/router.ts
+++ b/packages/next/server/router.ts
@@ -1,5 +1,6 @@
-import { IncomingMessage, ServerResponse } from 'http'
-import { UrlWithParsedQuery } from 'url'
+import type { IncomingMessage, ServerResponse } from 'http'
+import type { ParsedUrlQuery } from 'querystring'
+import type { UrlWithParsedQuery } from 'url'
import pathMatch from '../shared/lib/router/utils/path-match'
import { removePathTrailingSlash } from '../client/normalize-trailing-slash'
@@ -16,7 +17,7 @@ export type RouteMatch = (pathname: string | null | undefined) => false | Params
type RouteResult = {
finished: boolean
pathname?: string
- query?: { [k: string]: string }
+ query?: ParsedUrlQuery
}
export type Route = {
@@ -58,6 +59,7 @@ export default class Router {
fallback: Route[]
}
catchAllRoute: Route
+ catchAllMiddleware?: Route
pageChecker: PageChecker
dynamicRoutes: DynamicRoutes
useFileSystemPublicRoutes: boolean
@@ -74,6 +76,7 @@ export default class Router {
},
redirects = [],
catchAllRoute,
+ catchAllMiddleware,
dynamicRoutes = [],
pageChecker,
useFileSystemPublicRoutes,
@@ -89,6 +92,7 @@ export default class Router {
}
redirects: Route[]
catchAllRoute: Route
+ catchAllMiddleware?: Route
dynamicRoutes: DynamicRoutes | undefined
pageChecker: PageChecker
useFileSystemPublicRoutes: boolean
@@ -101,6 +105,7 @@ export default class Router {
this.redirects = redirects
this.pageChecker = pageChecker
this.catchAllRoute = catchAllRoute
+ this.catchAllMiddleware = catchAllMiddleware
this.dynamicRoutes = dynamicRoutes
this.useFileSystemPublicRoutes = useFileSystemPublicRoutes
this.locales = locales
@@ -197,6 +202,9 @@ export default class Router {
...this.headers,
...this.redirects,
...this.rewrites.beforeFiles,
+ ...(this.useFileSystemPublicRoutes && this.catchAllMiddleware
+ ? [this.catchAllMiddleware]
+ : []),
...this.fsRoutes,
// We only check the catch-all route if public page routes hasn't been
// disabled
@@ -268,7 +276,9 @@ export default class Router {
const requireBasePath = testRoute.requireBasePath !== false
const isCustomRoute = customRouteTypes.has(testRoute.type)
const isPublicFolderCatchall = testRoute.name === 'public folder catchall'
- const keepBasePath = isCustomRoute || isPublicFolderCatchall
+ const isMiddlewareCatchall = testRoute.name === 'middleware catchall'
+ const keepBasePath =
+ isCustomRoute || isPublicFolderCatchall || isMiddlewareCatchall
const keepLocale = isCustomRoute
const currentPathnameNoBasePath = replaceBasePath(
diff --git a/packages/next/server/web/adapter.ts b/packages/next/server/web/adapter.ts
new file mode 100644
index 0000000000000..e723b7eca50fe
--- /dev/null
+++ b/packages/next/server/web/adapter.ts
@@ -0,0 +1,36 @@
+import type { RequestData, FetchEventResult } from './types'
+
+import { fromNodeHeaders } from './utils'
+import { NextFetchEvent } from './spec-extension/fetch-event'
+import { NextRequest } from './spec-extension/request'
+import { NextResponse } from './spec-extension/response'
+import { waitUntilSymbol, responseSymbol } from './spec-compliant/fetch-event'
+
+export async function adapter(params: {
+ handler: (event: NextFetchEvent) => void | Promise
+ request: RequestData
+}): Promise {
+ const url = params.request.url.startsWith('/')
+ ? `https://${params.request.headers.host}${params.request.url}`
+ : params.request.url
+
+ const event = new NextFetchEvent(
+ new NextRequest(url, {
+ geo: params.request.geo,
+ headers: fromNodeHeaders(params.request.headers),
+ ip: params.request.ip,
+ method: params.request.method,
+ nextConfig: params.request.nextConfig,
+ page: params.request.page,
+ })
+ )
+
+ const handled = params.handler(event)
+ const original = await event[responseSymbol]
+
+ return {
+ promise: Promise.resolve(handled),
+ response: original || NextResponse.next(),
+ waitUntil: Promise.all(event[waitUntilSymbol]),
+ }
+}
diff --git a/packages/next/server/web/form-data.ts b/packages/next/server/web/form-data.ts
new file mode 100644
index 0000000000000..da3288b1a129f
--- /dev/null
+++ b/packages/next/server/web/form-data.ts
@@ -0,0 +1,73 @@
+import { isBlob } from './is'
+import { streamToIterator } from './utils'
+
+const carriage = '\r\n'
+const dashes = '--'
+const carriageLength = 2
+
+function escape(str: string) {
+ return str.replace(/"/g, '\\"')
+}
+
+function getFooter(boundary: string) {
+ return `${dashes}${boundary}${dashes}${carriage.repeat(2)}`
+}
+
+function getHeader(boundary: string, name: string, field: FormDataEntryValue) {
+ let header = ''
+ header += `${dashes}${boundary}${carriage}`
+ header += `Content-Disposition: form-data; name="${escape(name)}"`
+
+ if (isBlob(field)) {
+ header += `; filename="${escape(field.name)}"${carriage}`
+ header += `Content-Type: ${field.type || 'application/octet-stream'}`
+ }
+
+ return `${header}${carriage.repeat(2)}`
+}
+
+export function getBoundary() {
+ const array = new Uint8Array(32)
+ crypto.getRandomValues(array)
+
+ let str = ''
+ for (var i = 0; i < array.length; i++) {
+ str += array[i].toString(16).padStart(2, '0')
+ }
+
+ return str
+}
+
+export async function* formDataIterator(
+ form: FormData,
+ boundary: string
+): AsyncIterableIterator {
+ const encoder = new TextEncoder()
+ for (const [name, value] of form) {
+ yield encoder.encode(getHeader(boundary, name, value))
+
+ if (isBlob(value)) {
+ const stream: ReadableStream = value.stream()
+ yield* streamToIterator(stream)
+ } else {
+ yield encoder.encode(value)
+ }
+
+ yield encoder.encode(carriage)
+ }
+
+ yield encoder.encode(getFooter(boundary))
+}
+
+export function getFormDataLength(form: FormData, boundary: string) {
+ let length = 0
+
+ for (const [name, value] of form) {
+ length += Buffer.byteLength(getHeader(boundary, name, value))
+ length += isBlob(value) ? value.size : Buffer.byteLength(String(value))
+ length += carriageLength
+ }
+
+ length += Buffer.byteLength(getFooter(boundary))
+ return length
+}
diff --git a/packages/next/server/web/is.ts b/packages/next/server/web/is.ts
new file mode 100644
index 0000000000000..004b55aa07eaa
--- /dev/null
+++ b/packages/next/server/web/is.ts
@@ -0,0 +1,80 @@
+/**
+ * The ArrayBuffer object is used to represent a generic, fixed-length raw
+ * binary data buffer. It is an array of bytes, often referred to in other
+ * languages as a "byte array". You cannot directly manipulate the contents of
+ * an ArrayBuffer; instead, you create one of the typed array objects or a
+ * DataView object which represents the buffer in a specific format, and use
+ * that to read and write the contents of the buffer.
+ */
+export function isArrayBuffer(value: any): value is ArrayBuffer {
+ return ArrayBuffer.prototype.isPrototypeOf(value)
+}
+
+/**
+ * ArrayBufferView is a helper type representing any of the following JS
+ * TypedArray types which correspond to the list below. It is checked by duck
+ * typing the provided object.
+ */
+export function isArrayBufferView(value: any): value is ArrayBufferView {
+ return ArrayBuffer.isView(value)
+}
+
+/**
+ * The DataView view provides a low-level interface for reading and writing
+ * multiple number types in a binary ArrayBuffer, without having to care about
+ * the platform's endianness.
+ */
+export function isDataView(value: any): value is DataView {
+ return DataView.prototype.isPrototypeOf(value)
+}
+
+/**
+ * The URLSearchParams interface defines utility methods to work with the
+ * query string of a URL.
+ */
+export function isURLSearchParams(value: any): value is URLSearchParams {
+ return URLSearchParams.prototype.isPrototypeOf(value)
+}
+
+/**
+ * The Blob object represents a blob, which is a file-like object of immutable,
+ * raw data; they can be read as text or binary data. Blobs can represent data
+ * that isn't necessarily in a JavaScript-native format.
+ */
+export function isBlob(value: any): value is Blob {
+ return Blob.prototype.isPrototypeOf(value)
+}
+
+/**
+ * The FormData interface provides a way to easily construct a set of key/value
+ * pairs representing form fields and their values, which can then be easily
+ * sent using the XMLHttpRequest.send() method. It uses the same format a
+ * form would use if the encoding type were set to "multipart/form-data".
+ */
+export function isFormData(value: any): value is FormData {
+ return FormData.prototype.isPrototypeOf(value)
+}
+
+/**
+ * The ReadableStream interface of the Streams API represents a readable stream
+ * of byte data. Because we want to allow alternative implementations we also
+ * duck type here.
+ */
+export function isReadableStream(value: any): value is ReadableStream {
+ return (
+ value &&
+ (ReadableStream.prototype.isPrototypeOf(value) ||
+ (value.constructor.name === 'ReadableStream' && 'getReader' in value))
+ )
+}
+
+/**
+ * Checks in an object implements an Iterable interface
+ */
+export function isIterable(object: any): object is Iterable {
+ return (
+ object &&
+ Symbol.iterator in object &&
+ typeof object[Symbol.iterator] === 'function'
+ )
+}
diff --git a/packages/next/server/web/next-url.ts b/packages/next/server/web/next-url.ts
new file mode 100644
index 0000000000000..4f30e80ed05bb
--- /dev/null
+++ b/packages/next/server/web/next-url.ts
@@ -0,0 +1,234 @@
+import type { PathLocale } from '../../shared/lib/i18n/normalize-locale-path'
+import type { DomainLocale, I18NConfig } from '../config-shared'
+import { getLocaleMetadata } from '../../shared/lib/i18n/get-locale-metadata'
+import cookie from 'next/dist/compiled/cookie'
+
+/**
+ * TODO
+ *
+ * - Add comments to the URLNext API.
+ * - Move internals to be using symbols for its shape.
+ * - Make sure logging does not show any implementation details.
+ * - Include in the event payload the nextJS configuration
+ */
+
+interface Options {
+ basePath?: string
+ headers?: { [key: string]: string | string[] | undefined }
+ i18n?: I18NConfig | null
+ trailingSlash?: boolean
+}
+
+export class NextURL extends URL {
+ private _basePath: string
+ private _locale?: {
+ defaultLocale: string
+ domain?: DomainLocale
+ locale: string
+ path: PathLocale
+ redirect?: string
+ trailingSlash?: boolean
+ }
+ private _options: Options
+ private _url: URL
+
+ constructor(url: string, options: Options = {}) {
+ super(formatRelative(url))
+ this._options = options
+ this._basePath = ''
+ this._url = formatRelative(url)
+ this.analyzeUrl()
+ }
+
+ get absolute() {
+ return this._url.hostname !== 'localhost'
+ }
+
+ analyzeUrl() {
+ const { headers = {}, basePath, i18n } = this._options
+
+ if (basePath && this._url.pathname.startsWith(basePath)) {
+ this._url.pathname = this._url.pathname.replace(basePath, '') || '/'
+ this._basePath = basePath
+ } else {
+ this._basePath = ''
+ }
+
+ if (i18n) {
+ this._locale = getLocaleMetadata({
+ cookies: () => {
+ const value = headers['cookie']
+ return value
+ ? cookie.parse(Array.isArray(value) ? value.join(';') : value)
+ : {}
+ },
+ headers: headers,
+ nextConfig: {
+ basePath: basePath,
+ i18n: i18n,
+ },
+ url: {
+ hostname: this._url.hostname || null,
+ pathname: this._url.pathname,
+ },
+ })
+
+ if (this._locale?.path.detectedLocale) {
+ this._url.pathname = this._locale.path.pathname
+ }
+ }
+ }
+
+ formatPathname() {
+ const { i18n } = this._options
+ let pathname = this._url.pathname
+
+ if (this._locale?.locale && i18n?.defaultLocale !== this._locale?.locale) {
+ pathname = `/${this._locale?.locale}${pathname}`
+ }
+
+ if (this._basePath) {
+ pathname = `${this._basePath}${pathname}`
+ }
+
+ return pathname
+ }
+
+ get locale() {
+ if (!this._locale) {
+ throw new TypeError(`The URL is not configured with i18n`)
+ }
+
+ return this._locale.locale
+ }
+
+ set locale(locale: string) {
+ if (!this._locale) {
+ throw new TypeError(`The URL is not configured with i18n`)
+ }
+
+ this._locale.locale = locale
+ }
+
+ get defaultLocale() {
+ return this._locale?.defaultLocale
+ }
+
+ get domainLocale() {
+ return this._locale?.domain
+ }
+
+ get searchParams() {
+ return this._url.searchParams
+ }
+
+ get host() {
+ return this.absolute ? this._url.host : ''
+ }
+
+ set host(value: string) {
+ this._url.host = value
+ }
+
+ get hostname() {
+ return this.absolute ? this._url.hostname : ''
+ }
+
+ set hostname(value: string) {
+ this._url.hostname = value || 'localhost'
+ }
+
+ get port() {
+ return this.absolute ? this._url.port : ''
+ }
+
+ set port(value: string) {
+ this._url.port = value
+ }
+
+ get protocol() {
+ return this.absolute ? this._url.protocol : ''
+ }
+
+ set protocol(value: string) {
+ this._url.protocol = value
+ }
+
+ get href() {
+ const pathname = this.formatPathname()
+ return this.absolute
+ ? `${this.protocol}//${this.host}${pathname}${this._url.search}`
+ : `${pathname}${this._url.search}`
+ }
+
+ set href(url: string) {
+ this._url = formatRelative(url)
+ this.analyzeUrl()
+ }
+
+ get origin() {
+ return this.absolute ? this._url.origin : ''
+ }
+
+ get pathname() {
+ return this._url.pathname
+ }
+
+ set pathname(value: string) {
+ this._url.pathname = value
+ }
+
+ get hash() {
+ return this._url.hash
+ }
+
+ set hash(value: string) {
+ this._url.hash = value
+ }
+
+ get search() {
+ return this._url.search
+ }
+
+ set search(value: string) {
+ this._url.search = value
+ }
+
+ get password() {
+ return this._url.password
+ }
+
+ set password(value: string) {
+ this._url.password = value
+ }
+
+ get username() {
+ return this._url.username
+ }
+
+ set username(value: string) {
+ this._url.username = value
+ }
+
+ get basePath() {
+ return this._basePath
+ }
+
+ set basePath(value: string) {
+ this._basePath = value.startsWith('/') ? value : `/${value}`
+ }
+
+ toString() {
+ return this.href
+ }
+
+ toJSON() {
+ return this.href
+ }
+}
+
+function formatRelative(url: string) {
+ return url.startsWith('/')
+ ? new URL(url.replace(/^\/+/, '/'), new URL('https://localhost'))
+ : new URL(url)
+}
diff --git a/packages/next/server/web/sandbox/index.ts b/packages/next/server/web/sandbox/index.ts
new file mode 100644
index 0000000000000..b3849f7c301f9
--- /dev/null
+++ b/packages/next/server/web/sandbox/index.ts
@@ -0,0 +1 @@
+export * from './sandbox'
diff --git a/packages/next/server/web/sandbox/polyfills.ts b/packages/next/server/web/sandbox/polyfills.ts
new file mode 100644
index 0000000000000..2cb92fc626cdc
--- /dev/null
+++ b/packages/next/server/web/sandbox/polyfills.ts
@@ -0,0 +1,120 @@
+import { Crypto as WebCrypto } from 'next/dist/compiled/@peculiar/webcrypto'
+import { TransformStream } from 'next/dist/compiled/web-streams-polyfill'
+import { v4 as uuid } from 'next/dist/compiled/uuid'
+import crypto from 'crypto'
+
+export function atob(b64Encoded: string) {
+ return Buffer.from(b64Encoded, 'base64').toString('binary')
+}
+
+export function btoa(str: string) {
+ return Buffer.from(str, 'binary').toString('base64')
+}
+
+class TextEncoderRuntime {
+ encoder: TextEncoder
+
+ constructor() {
+ this.encoder = new TextEncoder()
+ }
+
+ get encoding() {
+ return this.encoder.encoding
+ }
+
+ public encode(input: string) {
+ return this.encoder.encode(input)
+ }
+}
+
+class TextDecoderRuntime {
+ decoder: TextDecoder
+
+ constructor() {
+ this.decoder = new TextDecoder()
+ }
+
+ get encoding() {
+ return this.decoder.encoding
+ }
+
+ get fatal() {
+ return this.decoder.fatal
+ }
+
+ get ignoreBOM() {
+ return this.decoder.ignoreBOM
+ }
+
+ public decode(input: BufferSource, options?: TextDecodeOptions) {
+ return this.decoder.decode(input, options)
+ }
+}
+
+export { TextDecoderRuntime as TextDecoder }
+export { TextEncoderRuntime as TextEncoder }
+
+export class Crypto extends WebCrypto {
+ // @ts-ignore Remove once types are updated and we deprecate node 12
+ randomUUID = crypto.randomUUID || uuid
+}
+
+export class ReadableStream {
+ constructor(opts: UnderlyingSource = {}) {
+ let closed = false
+ let pullPromise: any
+
+ let transformController: TransformStreamDefaultController
+ const { readable, writable } = new TransformStream({
+ start: (controller: TransformStreamDefaultController) => {
+ transformController = controller
+ },
+ })
+
+ const writer = writable.getWriter()
+ const controller: ReadableStreamController = {
+ get desiredSize() {
+ return writer.desiredSize
+ },
+ close: () => {
+ if (!closed) {
+ closed = true
+ writer.close()
+ }
+ },
+ enqueue: (chunk: T) => {
+ writer.write(chunk)
+ pull()
+ },
+ error: (reason: any) => {
+ transformController.error(reason)
+ },
+ }
+
+ const pull = () => {
+ if (opts.pull) {
+ if (!pullPromise) {
+ pullPromise = Promise.resolve().then(() => {
+ pullPromise = 0
+ opts.pull!(controller)
+ })
+ }
+ }
+ }
+
+ if (opts.start) {
+ opts.start(controller)
+ }
+
+ if (opts.cancel) {
+ readable.cancel = (reason: any) => {
+ opts.cancel!(reason)
+ return readable.cancel(reason)
+ }
+ }
+
+ pull()
+
+ return readable
+ }
+}
diff --git a/packages/next/server/web/sandbox/sandbox.ts b/packages/next/server/web/sandbox/sandbox.ts
new file mode 100644
index 0000000000000..51b95cb80c409
--- /dev/null
+++ b/packages/next/server/web/sandbox/sandbox.ts
@@ -0,0 +1,170 @@
+import type { RequestData, FetchEventResult } from '../types'
+import { Blob, File, FormData } from 'next/dist/compiled/formdata-node'
+import { dirname } from 'path'
+import { ReadableStream } from 'next/dist/compiled/web-streams-polyfill'
+import { readFileSync } from 'fs'
+import { TransformStream } from 'next/dist/compiled/web-streams-polyfill'
+import * as polyfills from './polyfills'
+import cookie from 'next/dist/compiled/cookie'
+import vm from 'vm'
+
+let cache:
+ | {
+ context: { [key: string]: any }
+ paths: Map
+ require: Map
+ sandbox: vm.Context
+ }
+ | undefined
+
+const WEBPACK_HASH_REGEX =
+ /__webpack_require__\.h = function\(\) \{ return "[0-9a-f]+"; \}/g
+
+/**
+ * The cache is cleared when a path is cached and the content has changed. The
+ * hack ignores changes than only change the compilation hash. Instead it is
+ * probably better to disable HMR for middleware entries.
+ */
+export function clearSandboxCache(path: string, content: Buffer | string) {
+ const prev = cache?.paths.get(path)?.replace(WEBPACK_HASH_REGEX, '')
+ if (prev === undefined) return
+ if (prev === content.toString().replace(WEBPACK_HASH_REGEX, '')) return
+ cache = undefined
+}
+
+export async function run(params: {
+ name: string
+ paths: string[]
+ request: RequestData
+}): Promise {
+ if (cache === undefined) {
+ const context: { [key: string]: any } = {
+ _ENTRIES: {},
+ atob: polyfills.atob,
+ Blob,
+ btoa: polyfills.btoa,
+ clearInterval,
+ clearTimeout,
+ console: {
+ assert: console.assert.bind(console),
+ error: console.error.bind(console),
+ info: console.info.bind(console),
+ log: console.log.bind(console),
+ time: console.time.bind(console),
+ timeEnd: console.timeEnd.bind(console),
+ timeLog: console.timeLog.bind(console),
+ warn: console.warn.bind(console),
+ },
+ Crypto: polyfills.Crypto,
+ crypto: new polyfills.Crypto(),
+ fetch,
+ File,
+ FormData,
+ process: { env: { ...process.env } },
+ ReadableStream,
+ setInterval,
+ setTimeout,
+ TextDecoder: polyfills.TextDecoder,
+ TextEncoder: polyfills.TextEncoder,
+ TransformStream,
+ URL,
+ URLSearchParams,
+ }
+
+ context.self = context
+
+ cache = {
+ context,
+ require: new Map([
+ [require.resolve('next/dist/compiled/cookie'), { exports: cookie }],
+ ]),
+ paths: new Map(),
+ sandbox: vm.createContext(context),
+ }
+
+ loadDependencies(cache.sandbox, [
+ {
+ path: require.resolve('../spec-compliant/headers'),
+ map: { Headers: 'Headers' },
+ },
+ {
+ path: require.resolve('../spec-compliant/response'),
+ map: { Response: 'Response' },
+ },
+ {
+ path: require.resolve('../spec-compliant/request'),
+ map: { Request: 'Request' },
+ },
+ ])
+ }
+
+ for (const paramPath of params.paths) {
+ if (!cache.paths.has(paramPath)) {
+ const content = readFileSync(paramPath, 'utf-8')
+ try {
+ vm.runInNewContext(content, cache.sandbox, {
+ filename: paramPath,
+ })
+ cache.paths.set(paramPath, content)
+ } catch (error) {
+ cache = undefined
+ throw error
+ }
+ }
+ }
+
+ const entryPoint = cache.context._ENTRIES[`middleware_${params.name}`]
+ return entryPoint.default({ request: params.request })
+}
+
+function loadDependencies(
+ ctx: vm.Context,
+ dependencies: { path: string; map: { [key: string]: string } }[]
+) {
+ for (const { path, map } of dependencies) {
+ const mod = sandboxRequire(path, path)
+ for (const mapKey of Object.keys(map)) {
+ ctx[map[mapKey]] = mod[mapKey]
+ }
+ }
+}
+
+function sandboxRequire(referrer: string, specifier: string) {
+ const resolved = require.resolve(specifier, {
+ paths: [dirname(referrer)],
+ })
+
+ const cached = cache?.require.get(resolved)
+ if (cached !== undefined) {
+ return cached.exports
+ }
+
+ const module = {
+ exports: {},
+ loaded: false,
+ id: resolved,
+ }
+
+ cache?.require.set(resolved, module)
+ const fn = vm.runInContext(
+ `(function(module,exports,require,__dirname,__filename) {${readFileSync(
+ resolved,
+ 'utf-8'
+ )}\n})`,
+ cache!.sandbox
+ )
+
+ try {
+ fn(
+ module,
+ module.exports,
+ sandboxRequire.bind(null, resolved),
+ dirname(resolved),
+ resolved
+ )
+ } finally {
+ cache?.require.delete(resolved)
+ }
+ module.loaded = true
+ return module.exports
+}
diff --git a/packages/next/server/web/spec-compliant/body.ts b/packages/next/server/web/spec-compliant/body.ts
new file mode 100644
index 0000000000000..c8dd2b44e62d2
--- /dev/null
+++ b/packages/next/server/web/spec-compliant/body.ts
@@ -0,0 +1,235 @@
+import { formDataIterator, getBoundary } from '../form-data'
+import { streamToIterator } from '../utils'
+import * as util from '../is'
+
+const INTERNALS = Symbol('internal body')
+
+abstract class BaseBody implements Body {
+ abstract headers: Headers
+
+ [INTERNALS]: {
+ bodyInit?: BodyInit
+ boundary?: string
+ disturbed: boolean
+ stream?: ReadableStream | null
+ }
+
+ constructor(bodyInit?: BodyInit) {
+ this[INTERNALS] = {
+ bodyInit: bodyInit,
+ disturbed: false,
+ }
+
+ if (util.isFormData(bodyInit)) {
+ this[INTERNALS].boundary = getBoundary()
+ }
+ }
+
+ get body(): ReadableStream | null {
+ const body = this[INTERNALS].bodyInit
+ if (!body) {
+ return null
+ }
+
+ const that = this
+ if (!this[INTERNALS].stream) {
+ const readable = new ReadableStream({
+ async start(controller) {
+ if (typeof body === 'string') {
+ const encoder = new TextEncoder()
+ controller.enqueue(encoder.encode(body))
+ } else if (util.isBlob(body)) {
+ const buffer = await body.arrayBuffer()
+ controller.enqueue(new Uint8Array(buffer))
+ } else if (util.isDataView(body)) {
+ controller.enqueue(body)
+ } else if (util.isArrayBuffer(body)) {
+ controller.enqueue(body)
+ } else if (util.isArrayBufferView(body)) {
+ controller.enqueue(body)
+ } else if (util.isURLSearchParams(body)) {
+ const encoder = new TextEncoder()
+ controller.enqueue(encoder.encode(body.toString()))
+ } else if (util.isFormData(body)) {
+ for await (const chunk of formDataIterator(
+ body,
+ that[INTERNALS].boundary!
+ )) {
+ controller.enqueue(chunk)
+ }
+ } else if (util.isReadableStream(body)) {
+ for await (const chunk of streamToIterator(body)) {
+ if (chunk.length) {
+ controller.enqueue(chunk)
+ }
+ }
+ } else {
+ const text = Object.prototype.toString.call(body)
+ const encoder = new TextEncoder()
+ controller.enqueue(encoder.encode(text))
+ }
+
+ controller.close()
+ },
+ })
+
+ // Spy on reading chunks to set the stream as disturbed
+ const getReader = readable.getReader.bind(readable)
+ readable.getReader = () => {
+ const reader = getReader()
+ const read = reader.read.bind(reader)
+ reader.read = () => {
+ this[INTERNALS].disturbed = true
+ return read()
+ }
+ return reader
+ }
+
+ this[INTERNALS].stream = readable
+ }
+
+ return this[INTERNALS].stream!
+ }
+
+ get bodyUsed(): boolean {
+ return this[INTERNALS].disturbed
+ }
+
+ _consume() {
+ if (this[INTERNALS].disturbed) {
+ return Promise.reject(
+ new TypeError(
+ `Body has already been used. It can only be used once. Use tee() first if you need to read it twice.`
+ )
+ )
+ }
+
+ this[INTERNALS].disturbed = true
+ const body = this.body
+ return new Promise((resolve, reject) => {
+ let buffer = new Uint8Array(0)
+ if (!body) {
+ return resolve(buffer)
+ }
+
+ const reader = body.getReader()
+ ;(function pump() {
+ reader.read().then(({ value, done }) => {
+ if (done) {
+ return resolve(buffer)
+ } else if (value) {
+ const merge = new Uint8Array(buffer.length + value.length)
+ merge.set(buffer)
+ merge.set(value, buffer.length)
+ buffer = merge
+ }
+
+ pump()
+ }, reject)
+ })()
+ })
+ }
+
+ async arrayBuffer() {
+ const buffer = await this._consume()
+ const arrayBuffer = new ArrayBuffer(buffer.length)
+ const view = new Uint8Array(arrayBuffer)
+
+ for (let i = 0; i < buffer.length; ++i) {
+ view[i] = buffer[i]
+ }
+
+ return arrayBuffer
+ }
+
+ async blob() {
+ const buffer = await this._consume()
+ return new Blob([buffer])
+ }
+
+ async formData() {
+ const bodyInit = this[INTERNALS].bodyInit
+ if (util.isURLSearchParams(bodyInit)) {
+ const form = new FormData()
+ for (const [key, value] of bodyInit) {
+ form.append(key, value)
+ }
+ return form
+ } else if (util.isFormData(bodyInit)) {
+ return bodyInit
+ } else {
+ throw new TypeError(
+ `Unrecognized Content-Type header value. FormData can only parse the following MIME types: multipart/form-data, application/x-www-form-urlencoded.`
+ )
+ }
+ }
+
+ async text() {
+ const decoder = new TextDecoder()
+ const buffer = await this._consume()
+ return decoder.decode(buffer)
+ }
+
+ async json() {
+ const text = await this.text()
+
+ try {
+ return JSON.parse(text)
+ } catch (err: any) {
+ throw new TypeError(`invalid json body reason: ${err.message}`)
+ }
+ }
+}
+
+export { BaseBody as Body }
+
+export type BodyInit =
+ | null
+ | string
+ | Blob
+ | BufferSource
+ | FormData
+ | URLSearchParams
+ | ReadableStream
+
+export function extractContentType(instance: BaseBody) {
+ const body = instance[INTERNALS].bodyInit
+ if (typeof body === 'string') {
+ return 'text/plain;charset=UTF-8'
+ } else if (util.isBlob(body)) {
+ return body.type
+ } else if (util.isDataView(body)) {
+ return null
+ } else if (util.isArrayBuffer(body)) {
+ return null
+ } else if (util.isArrayBufferView(body)) {
+ return null
+ } else if (util.isURLSearchParams(body)) {
+ return 'application/x-www-form-urlencoded;charset=UTF-8'
+ } else if (util.isFormData(body)) {
+ return `multipart/form-data;boundary=${instance[INTERNALS].boundary}`
+ } else if (util.isReadableStream(body)) {
+ return null
+ } else {
+ return 'text/plain;charset=UTF-8'
+ }
+}
+
+export function cloneBody(instance: BaseBody) {
+ if (instance.bodyUsed) {
+ throw new Error('cannot clone body after it is used')
+ }
+
+ const body = instance[INTERNALS].bodyInit
+ if (util.isReadableStream(body)) {
+ const [r1, r2] = body.tee()
+ instance[INTERNALS].bodyInit = r1
+ return r2
+ }
+
+ return body || null
+}
+
+export function getInstanceBody(instance: BaseBody) {
+ return instance[INTERNALS].bodyInit
+}
diff --git a/packages/next/server/web/spec-compliant/fetch-event.ts b/packages/next/server/web/spec-compliant/fetch-event.ts
new file mode 100644
index 0000000000000..c410d39736e9f
--- /dev/null
+++ b/packages/next/server/web/spec-compliant/fetch-event.ts
@@ -0,0 +1,28 @@
+export const responseSymbol = Symbol('response')
+export const passThroughSymbol = Symbol('passThrough')
+export const waitUntilSymbol = Symbol('waitUntil')
+
+export class FetchEvent {
+ readonly request: Request;
+ readonly [waitUntilSymbol]: Promise[] = [];
+ [responseSymbol]?: Promise;
+ [passThroughSymbol] = false
+
+ constructor(request: Request) {
+ this.request = request
+ }
+
+ respondWith(response: Response | Promise): void {
+ if (!this[responseSymbol]) {
+ this[responseSymbol] = Promise.resolve(response)
+ }
+ }
+
+ passThroughOnException(): void {
+ this[passThroughSymbol] = true
+ }
+
+ waitUntil(promise: Promise): void {
+ this[waitUntilSymbol].push(promise)
+ }
+}
diff --git a/packages/next/server/web/spec-compliant/headers.ts b/packages/next/server/web/spec-compliant/headers.ts
new file mode 100644
index 0000000000000..c685c1bab2f54
--- /dev/null
+++ b/packages/next/server/web/spec-compliant/headers.ts
@@ -0,0 +1,239 @@
+import { isIterable } from '../is'
+
+export type HeadersInit = Headers | string[][] | { [key: string]: string }
+
+const MAP = Symbol('map')
+const INTERNAL = Symbol('internal')
+const INVALID_TOKEN_REGEX = /[^^_`a-zA-Z\-0-9!#$%&'*+.|~]/
+const INVALID_HEADER_CHAR_REGEX = /[^\t\x20-\x7e\x80-\xff]/
+
+class BaseHeaders implements Headers {
+ [MAP]: { [k: string]: string[] } = {}
+
+ constructor(init?: HeadersInit) {
+ if (init instanceof BaseHeaders) {
+ const rawHeaders = init.raw()
+ for (const headerName of Object.keys(rawHeaders)) {
+ for (const value of rawHeaders[headerName]) {
+ this.append(headerName, value)
+ }
+ }
+ } else if (isIterable(init)) {
+ const pairs = []
+ for (const pair of init) {
+ if (!isIterable(pair)) {
+ throw new TypeError('Each header pair must be iterable')
+ }
+ pairs.push(Array.from(pair))
+ }
+
+ for (const pair of pairs) {
+ if (pair.length !== 2) {
+ throw new TypeError('Each header pair must be a name/value tuple')
+ }
+ this.append(pair[0], pair[1])
+ }
+ } else if (typeof init === 'object') {
+ for (const key of Object.keys(init)) {
+ this.append(key, init[key])
+ }
+ } else if (init) {
+ throw new TypeError('Provided initializer must be an object')
+ }
+ }
+
+ get(name: string) {
+ const _name = `${name}`
+ validateName(_name)
+ const key = find(this[MAP], _name)
+ if (key === undefined) {
+ return null
+ }
+
+ return this[MAP][key].join(', ')
+ }
+
+ forEach(
+ callback: (value: string, name: string, parent: BaseHeaders) => void,
+ thisArg: any = undefined
+ ): void {
+ let pairs = getHeaders(this)
+ let i = 0
+ while (i < pairs.length) {
+ const [name, value] = pairs[i]
+ callback.call(thisArg, value, name, this)
+ pairs = getHeaders(this)
+ i++
+ }
+ }
+
+ set(name: string, value: string) {
+ name = `${name}`
+ value = `${value}`
+ validateName(name)
+ validateValue(value)
+ const key = find(this[MAP], name)
+ this[MAP][key !== undefined ? key : name] = [value]
+ }
+
+ append(name: string, value: string) {
+ name = `${name}`
+ value = `${value}`
+ validateName(name)
+ validateValue(value)
+ const key = find(this[MAP], name)
+ if (key !== undefined) {
+ this[MAP][key].push(value)
+ } else {
+ this[MAP][name] = [value]
+ }
+ }
+
+ has(name: string) {
+ name = `${name}`
+ validateName(name)
+ return find(this[MAP], name) !== undefined
+ }
+
+ delete(name: string) {
+ name = `${name}`
+ validateName(name)
+ const key = find(this[MAP], name)
+ if (key !== undefined) {
+ delete this[MAP][key]
+ }
+ }
+
+ raw() {
+ return this[MAP]
+ }
+
+ keys() {
+ return createHeadersIterator(this, 'key')
+ }
+
+ values() {
+ return createHeadersIterator(this, 'value')
+ }
+
+ entries() {
+ return createHeadersIterator(this, 'key+value')
+ }
+
+ [Symbol.iterator]() {
+ return createHeadersIterator(this, 'key+value')
+ }
+}
+
+function createHeadersIterator(
+ target: BaseHeaders,
+ kind: 'key' | 'value' | 'key+value'
+) {
+ const iterator = Object.create(HeadersIteratorPrototype)
+ iterator[INTERNAL] = {
+ target,
+ kind,
+ index: 0,
+ }
+ return iterator
+}
+
+function validateName(name: string) {
+ name = `${name}`
+ if (INVALID_TOKEN_REGEX.test(name)) {
+ throw new TypeError(`${name} is not a legal HTTP header name`)
+ }
+}
+
+function validateValue(value: string) {
+ value = `${value}`
+ if (INVALID_HEADER_CHAR_REGEX.test(value)) {
+ throw new TypeError(`${value} is not a legal HTTP header value`)
+ }
+}
+
+function find(
+ map: { [k: string]: string[] },
+ name: string
+): string | undefined {
+ name = name.toLowerCase()
+ for (const key in map) {
+ if (key.toLowerCase() === name) {
+ return key
+ }
+ }
+ return undefined
+}
+
+Object.defineProperty(BaseHeaders.prototype, Symbol.toStringTag, {
+ value: 'Headers',
+ writable: false,
+ enumerable: false,
+ configurable: true,
+})
+
+Object.defineProperties(BaseHeaders.prototype, {
+ append: { enumerable: true },
+ delete: { enumerable: true },
+ entries: { enumerable: true },
+ forEach: { enumerable: true },
+ get: { enumerable: true },
+ has: { enumerable: true },
+ keys: { enumerable: true },
+ raw: { enumerable: false },
+ set: { enumerable: true },
+ values: { enumerable: true },
+})
+
+function getHeaders(
+ headers: BaseHeaders,
+ kind: 'key' | 'value' | 'key+value' = 'key+value'
+) {
+ const fn =
+ kind === 'key'
+ ? (key: string) => key.toLowerCase()
+ : kind === 'value'
+ ? (key: string) => headers[MAP][key].join(', ')
+ : (key: string) => [key.toLowerCase(), headers[MAP][key].join(', ')]
+
+ return Object.keys(headers[MAP])
+ .sort()
+ .map((key) => fn(key))
+}
+
+const HeadersIteratorPrototype = Object.setPrototypeOf(
+ {
+ next() {
+ if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
+ throw new TypeError('Value of `this` is not a HeadersIterator')
+ }
+
+ const { target, kind, index } = this[INTERNAL]
+ const values = getHeaders(target, kind)
+ const len = values.length
+ if (index >= len) {
+ return {
+ value: undefined,
+ done: true,
+ }
+ }
+
+ this[INTERNAL].index = index + 1
+
+ return {
+ value: values[index],
+ done: false,
+ }
+ },
+ },
+ Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))
+)
+
+Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
+ value: 'HeadersIterator',
+ writable: false,
+ enumerable: false,
+ configurable: true,
+})
+
+export { BaseHeaders as Headers }
diff --git a/packages/next/server/web/spec-compliant/request.ts b/packages/next/server/web/spec-compliant/request.ts
new file mode 100644
index 0000000000000..a06b5c0f3b8b7
--- /dev/null
+++ b/packages/next/server/web/spec-compliant/request.ts
@@ -0,0 +1,124 @@
+import { Body, cloneBody, extractContentType, getInstanceBody } from './body'
+import { Headers as BaseHeaders } from './headers'
+import { NextURL } from '../next-url'
+import { notImplemented } from '../utils'
+
+export const INTERNALS = Symbol('internal request')
+
+class BaseRequest extends Body implements Request {
+ [INTERNALS]: {
+ credentials: RequestCredentials
+ headers: Headers
+ method: string
+ redirect: RequestRedirect
+ url: NextURL
+ }
+
+ constructor(input: BaseRequest | string, init: RequestInit = {}) {
+ const method = init.method?.toUpperCase() ?? 'GET'
+
+ if (
+ (method === 'GET' || method === 'HEAD') &&
+ (init.body || (input instanceof BaseRequest && getInstanceBody(input)))
+ ) {
+ throw new TypeError('Request with GET/HEAD method cannot have body')
+ }
+
+ let inputBody: BodyInit | null = null
+ if (init.body) {
+ inputBody = init.body
+ } else if (input instanceof BaseRequest && getInstanceBody(input)) {
+ inputBody = cloneBody(input)
+ }
+
+ super(inputBody)
+
+ const headers = new BaseHeaders(
+ init.headers || getProp(input, 'headers') || {}
+ )
+ if (inputBody !== null) {
+ const contentType = extractContentType(this)
+ if (contentType !== null && !headers.has('Content-Type')) {
+ headers.append('Content-Type', contentType)
+ }
+ }
+
+ this[INTERNALS] = {
+ credentials:
+ init.credentials || getProp(input, 'credentials') || 'same-origin',
+ headers,
+ method,
+ redirect: init.redirect || getProp(input, 'redirect') || 'follow',
+ url: new NextURL(typeof input === 'string' ? input : input.url),
+ }
+ }
+
+ get url() {
+ return this[INTERNALS].url.toString()
+ }
+
+ get credentials() {
+ return this[INTERNALS].credentials
+ }
+
+ get method() {
+ return this[INTERNALS].method
+ }
+
+ get headers() {
+ return this[INTERNALS].headers
+ }
+
+ get redirect() {
+ return this[INTERNALS].redirect
+ }
+
+ public clone() {
+ return new BaseRequest(this)
+ }
+
+ get cache() {
+ return notImplemented('Request', 'cache')
+ }
+
+ get integrity() {
+ return notImplemented('Request', 'integrity')
+ }
+
+ get keepalive() {
+ return notImplemented('Request', 'keepalive')
+ }
+
+ get mode() {
+ return notImplemented('Request', 'mode')
+ }
+
+ get destination() {
+ return notImplemented('Request', 'destination')
+ }
+
+ get referrer() {
+ return notImplemented('Request', 'referrer')
+ }
+
+ get referrerPolicy() {
+ return notImplemented('Request', 'referrerPolicy')
+ }
+
+ get signal() {
+ return notImplemented('Request', 'signal')
+ }
+
+ get [Symbol.toStringTag]() {
+ return 'Request'
+ }
+}
+
+export { BaseRequest as Request }
+
+function getProp(
+ input: BaseRequest | string,
+ key: K
+): BaseRequest[K] | undefined {
+ return input instanceof BaseRequest ? input[key] : undefined
+}
diff --git a/packages/next/server/web/spec-compliant/response.ts b/packages/next/server/web/spec-compliant/response.ts
new file mode 100644
index 0000000000000..23be2f7318675
--- /dev/null
+++ b/packages/next/server/web/spec-compliant/response.ts
@@ -0,0 +1,113 @@
+import { Body, BodyInit, cloneBody, extractContentType } from './body'
+import { NextURL } from '../next-url'
+
+const INTERNALS = Symbol('internal response')
+const REDIRECTS = new Set([301, 302, 303, 307, 308])
+
+class BaseResponse extends Body implements Response {
+ [INTERNALS]: {
+ headers: Headers
+ status: number
+ statusText: string
+ type: 'default' | 'error'
+ url?: NextURL
+ }
+
+ constructor(body?: BodyInit | null, init?: ResponseInit) {
+ super(body)
+
+ this[INTERNALS] = {
+ headers: new Headers(init?.headers),
+ status: init?.status || 200,
+ statusText: init?.statusText || '',
+ type: 'default',
+ url: init?.url ? new NextURL(init.url) : undefined,
+ }
+
+ if (this[INTERNALS].status < 200 || this[INTERNALS].status > 599) {
+ throw new RangeError(
+ `Responses may only be constructed with status codes in the range 200 to 599, inclusive.`
+ )
+ }
+
+ if (body !== null && !this[INTERNALS].headers.has('Content-Type')) {
+ const contentType = extractContentType(this)
+ if (contentType) {
+ this[INTERNALS].headers.append('Content-Type', contentType)
+ }
+ }
+ }
+
+ static redirect(url: string, status = 302) {
+ if (!REDIRECTS.has(status)) {
+ throw new RangeError(
+ 'Failed to execute "redirect" on "response": Invalid status code'
+ )
+ }
+
+ return new Response(null, {
+ headers: { Location: url },
+ status,
+ })
+ }
+
+ static error() {
+ const response = new BaseResponse(null, { status: 0, statusText: '' })
+ response[INTERNALS].type = 'error'
+ return response
+ }
+
+ get url() {
+ return this[INTERNALS].url?.toString() || ''
+ }
+
+ get ok() {
+ return this[INTERNALS].status >= 200 && this[INTERNALS].status < 300
+ }
+
+ get status() {
+ return this[INTERNALS].status
+ }
+
+ get statusText() {
+ return this[INTERNALS].statusText
+ }
+
+ get headers() {
+ return this[INTERNALS].headers
+ }
+
+ get redirected() {
+ return (
+ this[INTERNALS].status > 299 &&
+ this[INTERNALS].status < 400 &&
+ this[INTERNALS].headers.has('Location')
+ )
+ }
+
+ get type() {
+ return this[INTERNALS].type
+ }
+
+ clone() {
+ return new BaseResponse(cloneBody(this), {
+ headers: this.headers,
+ status: this.status,
+ statusText: this.statusText,
+ url: this.url,
+ })
+ }
+
+ get [Symbol.toStringTag]() {
+ return 'Response'
+ }
+}
+
+export interface ResponseInit {
+ headers?: HeadersInit
+ status?: number
+ statusText?: string
+ url?: string
+}
+
+export { BaseResponse as Response }
diff --git a/packages/next/server/web/spec-extension/fetch-event.ts b/packages/next/server/web/spec-extension/fetch-event.ts
new file mode 100644
index 0000000000000..09613d33da539
--- /dev/null
+++ b/packages/next/server/web/spec-extension/fetch-event.ts
@@ -0,0 +1,10 @@
+import { FetchEvent } from '../spec-compliant/fetch-event'
+import { NextRequest } from './request'
+
+export class NextFetchEvent extends FetchEvent {
+ readonly request: NextRequest
+ constructor(request: NextRequest) {
+ super(request)
+ this.request = request
+ }
+}
diff --git a/packages/next/server/web/spec-extension/request.ts b/packages/next/server/web/spec-extension/request.ts
new file mode 100644
index 0000000000000..2a8e80f1b06f7
--- /dev/null
+++ b/packages/next/server/web/spec-extension/request.ts
@@ -0,0 +1,114 @@
+import type { I18NConfig } from '../../config-shared'
+import type { IResult } from 'next/dist/compiled/ua-parser-js'
+import { NextURL } from '../next-url'
+import { isBot } from '../../utils'
+import { toNodeHeaders } from '../utils'
+import cookie from 'next/dist/compiled/cookie'
+import parseua from 'next/dist/compiled/ua-parser-js'
+
+export const INTERNALS = Symbol('internal request')
+
+export class NextRequest extends Request {
+ [INTERNALS]: {
+ cookieParser(): { [key: string]: string }
+ geo: { city?: string; country?: string; region?: string }
+ ip?: string
+ page?: { name?: string; params?: { [key: string]: string } }
+ ua?: UserAgent | null
+ url: NextURL
+ }
+
+ constructor(input: Request | string, init: RequestInit = {}) {
+ super(input, init)
+
+ const cookieParser = () => {
+ const value = this.headers.get('cookie')
+ return value ? cookie.parse(value) : {}
+ }
+
+ this[INTERNALS] = {
+ cookieParser,
+ geo: init.geo || {},
+ ip: init.ip,
+ page: init.page,
+ url: new NextURL(typeof input === 'string' ? input : input.url, {
+ basePath: init.nextConfig?.basePath,
+ headers: toNodeHeaders(this.headers),
+ i18n: init.nextConfig?.i18n,
+ trailingSlash: init.nextConfig?.trailingSlash,
+ }),
+ }
+ }
+
+ public get cookies() {
+ return this[INTERNALS].cookieParser()
+ }
+
+ public get geo() {
+ return this[INTERNALS].geo
+ }
+
+ public get ip() {
+ return this[INTERNALS].ip
+ }
+
+ public get preflight() {
+ return this.headers.get('x-middleware-preflight')
+ }
+
+ public get nextUrl() {
+ return this[INTERNALS].url
+ }
+
+ public get page() {
+ return {
+ name: this[INTERNALS].page?.name,
+ params: this[INTERNALS].page?.params,
+ }
+ }
+
+ public get ua() {
+ if (typeof this[INTERNALS].ua !== 'undefined') {
+ return this[INTERNALS].ua || undefined
+ }
+
+ const uaString = this.headers.get('user-agent')
+ if (!uaString) {
+ this[INTERNALS].ua = null
+ return this[INTERNALS].ua || undefined
+ }
+
+ this[INTERNALS].ua = {
+ ...parseua(uaString),
+ isBot: isBot(uaString),
+ }
+
+ return this[INTERNALS].ua
+ }
+
+ public get url() {
+ return this[INTERNALS].url.toString()
+ }
+}
+
+interface RequestInit extends globalThis.RequestInit {
+ geo?: {
+ city?: string
+ country?: string
+ region?: string
+ }
+ ip?: string
+ nextConfig?: {
+ basePath?: string
+ i18n?: I18NConfig | null
+ trailingSlash?: boolean
+ }
+ page?: {
+ name?: string
+ params?: { [key: string]: string }
+ }
+}
+
+interface UserAgent extends IResult {
+ isBot: boolean
+}
diff --git a/packages/next/server/web/spec-extension/response.ts b/packages/next/server/web/spec-extension/response.ts
new file mode 100644
index 0000000000000..dabf3827d4ef2
--- /dev/null
+++ b/packages/next/server/web/spec-extension/response.ts
@@ -0,0 +1,106 @@
+import type { I18NConfig } from '../../config-shared'
+import type { CookieSerializeOptions } from 'next/dist/compiled/cookie'
+import { NextURL } from '../next-url'
+import { toNodeHeaders } from '../utils'
+import cookie from 'next/dist/compiled/cookie'
+
+const INTERNALS = Symbol('internal response')
+const REDIRECTS = new Set([301, 302, 303, 307, 308])
+
+export class NextResponse extends Response {
+ [INTERNALS]: {
+ cookieParser(): { [key: string]: string }
+ url?: NextURL
+ }
+
+ constructor(body?: BodyInit | null, init: ResponseInit = {}) {
+ super(body, init)
+
+ const cookieParser = () => {
+ const value = this.headers.get('cookie')
+ return value ? cookie.parse(value) : {}
+ }
+
+ this[INTERNALS] = {
+ cookieParser,
+ url: init.url
+ ? new NextURL(init.url, {
+ basePath: init.nextConfig?.basePath,
+ i18n: init.nextConfig?.i18n,
+ trailingSlash: init.nextConfig?.trailingSlash,
+ headers: toNodeHeaders(this.headers),
+ })
+ : undefined,
+ }
+ }
+
+ public get cookies() {
+ return this[INTERNALS].cookieParser()
+ }
+
+ public cookie(
+ name: string,
+ value: { [key: string]: any } | string,
+ opts: CookieSerializeOptions = {}
+ ) {
+ const val =
+ typeof value === 'object' ? 'j:' + JSON.stringify(value) : String(value)
+
+ if (opts.maxAge) {
+ opts.expires = new Date(Date.now() + opts.maxAge)
+ opts.maxAge /= 1000
+ }
+
+ if (opts.path == null) {
+ opts.path = '/'
+ }
+
+ this.headers.append('Set-Cookie', cookie.serialize(name, String(val), opts))
+ return this
+ }
+
+ public clearCookie(name: string, opts: CookieSerializeOptions = {}) {
+ return this.cookie(name, '', { expires: new Date(1), path: '/', ...opts })
+ }
+
+ static redirect(url: string | NextURL, status = 302) {
+ if (!REDIRECTS.has(status)) {
+ throw new RangeError(
+ 'Failed to execute "redirect" on "response": Invalid status code'
+ )
+ }
+
+ return new NextResponse(null, {
+ headers: { Location: typeof url === 'string' ? url : url.toString() },
+ status,
+ })
+ }
+
+ static rewrite(destination: string | NextURL) {
+ return new NextResponse(null, {
+ headers: {
+ 'x-middleware-rewrite':
+ typeof destination === 'string'
+ ? destination
+ : destination.toString(),
+ },
+ })
+ }
+
+ static next() {
+ return new NextResponse(null, {
+ headers: {
+ 'x-middleware-next': '1',
+ },
+ })
+ }
+}
+
+interface ResponseInit extends globalThis.ResponseInit {
+ nextConfig?: {
+ basePath?: string
+ i18n?: I18NConfig
+ trailingSlash?: boolean
+ }
+ url?: string
+}
diff --git a/packages/next/server/web/types.ts b/packages/next/server/web/types.ts
new file mode 100644
index 0000000000000..b6f04fe5d4f7e
--- /dev/null
+++ b/packages/next/server/web/types.ts
@@ -0,0 +1,32 @@
+import type { I18NConfig } from '../config-shared'
+
+export interface NodeHeaders {
+ [header: string]: string | string[] | undefined
+}
+
+export interface RequestData {
+ geo?: {
+ city?: string
+ country?: string
+ region?: string
+ }
+ headers: NodeHeaders
+ ip?: string
+ method: string
+ nextConfig?: {
+ basePath?: string
+ i18n?: I18NConfig | null
+ trailingSlash?: boolean
+ }
+ page?: {
+ name?: string
+ params?: { [key: string]: string }
+ }
+ url: string
+}
+
+export interface FetchEventResult {
+ promise: Promise
+ response: Response
+ waitUntil: Promise
+}
diff --git a/packages/next/server/web/utils.ts b/packages/next/server/web/utils.ts
new file mode 100644
index 0000000000000..3f2b8cb989403
--- /dev/null
+++ b/packages/next/server/web/utils.ts
@@ -0,0 +1,44 @@
+import type { NodeHeaders } from './types'
+
+export async function* streamToIterator(
+ readable: ReadableStream
+): AsyncIterableIterator {
+ const reader = readable.getReader()
+ while (true) {
+ const { value, done } = await reader.read()
+ if (done) break
+ if (value) {
+ yield value
+ }
+ }
+ reader.releaseLock()
+}
+
+export function notImplemented(name: string, method: string): any {
+ throw new Error(
+ `Failed to get the '${method}' property on '${name}': the property is not implemented`
+ )
+}
+
+export function fromNodeHeaders(object: NodeHeaders) {
+ const headers: { [k: string]: string } = {}
+ for (let headerKey in object) {
+ const headerValue = object[headerKey]
+ if (Array.isArray(headerValue)) {
+ headers[headerKey] = headerValue.join('; ')
+ } else if (headerValue) {
+ headers[headerKey] = String(headerValue)
+ }
+ }
+ return headers
+}
+
+export function toNodeHeaders(headers?: Headers): NodeHeaders {
+ const object: NodeHeaders = {}
+ if (headers) {
+ for (const [key, value] of headers.entries()) {
+ object[key] = value.includes(';') ? value.split(';') : value
+ }
+ }
+ return object
+}
diff --git a/packages/next/shared/lib/constants.ts b/packages/next/shared/lib/constants.ts
index 6a1cad60f7aad..281ce7539fa6a 100644
--- a/packages/next/shared/lib/constants.ts
+++ b/packages/next/shared/lib/constants.ts
@@ -11,6 +11,8 @@ export const ROUTES_MANIFEST = 'routes-manifest.json'
export const IMAGES_MANIFEST = 'images-manifest.json'
export const SERVER_FILES_MANIFEST = 'required-server-files.json'
export const DEV_CLIENT_PAGES_MANIFEST = '_devPagesManifest.json'
+export const MIDDLEWARE_MANIFEST = 'middleware-manifest.json'
+export const DEV_MIDDLEWARE_MANIFEST = '_devMiddlewareManifest.json'
export const REACT_LOADABLE_MANIFEST = 'react-loadable-manifest.json'
export const FONT_MANIFEST = 'font-manifest.json'
export const SERVER_DIRECTORY = 'server'
diff --git a/packages/next/shared/lib/i18n/get-locale-metadata.ts b/packages/next/shared/lib/i18n/get-locale-metadata.ts
index bf9caa43307c8..c2f1e3d99d53d 100644
--- a/packages/next/shared/lib/i18n/get-locale-metadata.ts
+++ b/packages/next/shared/lib/i18n/get-locale-metadata.ts
@@ -1,4 +1,4 @@
-import accept from '@hapi/accept'
+import { acceptLanguage } from '../../../server/accept-header'
import { denormalizePagePath } from '../../../server/denormalize-page-path'
import { detectDomainLocale } from './detect-domain-locale'
import { formatUrl } from '../router/utils/format-url'
@@ -63,7 +63,7 @@ function getAcceptPreferredLocale(
const value = headers?.['accept-language']
if (i18n.localeDetection !== false && value && !Array.isArray(value)) {
try {
- return accept.language(value, i18n.locales)
+ return acceptLanguage(value, i18n.locales)
} catch (err) {}
}
}
diff --git a/packages/next/shared/lib/router/router.ts b/packages/next/shared/lib/router/router.ts
index b45328ff617b5..10251f1b54258 100644
--- a/packages/next/shared/lib/router/router.ts
+++ b/packages/next/shared/lib/router/router.ts
@@ -35,6 +35,7 @@ import { searchParamsToUrlQuery } from './utils/querystring'
import resolveRewrites from './utils/resolve-rewrites'
import { getRouteMatcher } from './utils/route-matcher'
import { getRouteRegex } from './utils/route-regex'
+import { getMiddlewareRegex } from './utils/get-middleware-regex'
declare global {
interface Window {
@@ -59,6 +60,35 @@ interface NextHistoryState {
options: TransitionOptions
}
+interface PreflightData {
+ redirect?: string | null
+ refresh?: boolean
+ rewrite?: string | null
+}
+
+type PreflightEffect =
+ | {
+ asPath: string
+ matchedPage?: boolean
+ parsedAs: ReturnType
+ resolvedHref: string
+ type: 'rewrite'
+ }
+ | {
+ destination?: undefined
+ newAs: string
+ newUrl: string
+ type: 'redirect'
+ }
+ | {
+ destination: string
+ newAs?: undefined
+ newUrl?: undefined
+ type: 'redirect'
+ }
+ | { type: 'refresh' }
+ | { type: 'next' }
+
type HistoryState =
| null
| { __N: false }
@@ -541,6 +571,8 @@ export default class Router implements BaseRouter {
sdc: { [asPath: string]: object } = {}
// In-flight Server Data Requests, for deduping
sdr: { [asPath: string]: Promise } = {}
+ // In-flight middleware preflight requests
+ sde: { [asPath: string]: object } = {}
sub: Subscription
clc: ComponentLoadCancel
@@ -984,8 +1016,11 @@ export default class Router implements BaseRouter {
// when rewritten to
let pages: any, rewrites: any
try {
- pages = await this.pageLoader.getPageList()
- ;({ __rewrites: rewrites } = await getClientBuildManifest())
+ ;[pages, { __rewrites: rewrites }] = await Promise.all([
+ this.pageLoader.getPageList(),
+ getClientBuildManifest(),
+ this.pageLoader.getMiddlewareList(),
+ ])
} catch (err) {
// If we fail to resolve the page list or client-build manifest, we must
// do a server-side transition:
@@ -1045,8 +1080,6 @@ export default class Router implements BaseRouter {
}
}
- const route = removePathTrailingSlash(pathname)
-
if (!isLocalURL(as)) {
if (process.env.NODE_ENV !== 'production') {
throw new Error(
@@ -1061,6 +1094,32 @@ export default class Router implements BaseRouter {
resolvedAs = delLocale(delBasePath(resolvedAs), this.locale)
+ const effect = await this._preflightRequest({
+ as,
+ cache: process.env.NODE_ENV === 'production',
+ pages,
+ pathname,
+ query,
+ })
+
+ if (effect.type === 'rewrite') {
+ query = { ...query, ...effect.parsedAs.query }
+ resolvedAs = effect.asPath
+ pathname = effect.resolvedHref
+ parsed.pathname = effect.resolvedHref
+ url = formatWithValidation(parsed)
+ } else if (effect.type === 'redirect' && effect.newAs) {
+ return this.change(method, effect.newUrl, effect.newAs, options)
+ } else if (effect.type === 'redirect' && effect.destination) {
+ window.location.href = effect.destination
+ return new Promise(() => {})
+ } else if (effect.type === 'refresh') {
+ window.location.href = as
+ return new Promise(() => {})
+ }
+
+ const route = removePathTrailingSlash(pathname)
+
if (isDynamicRoute(route)) {
const parsedAs = parseRelativeUrl(resolvedAs)
const asPathname = parsedAs.pathname
@@ -1526,7 +1585,7 @@ export default class Router implements BaseRouter {
): Promise {
let parsed = parseRelativeUrl(url)
- let { pathname } = parsed
+ let { pathname, query } = parsed
if (process.env.__NEXT_I18N_SUPPORT) {
if (options.locale === false) {
@@ -1578,13 +1637,30 @@ export default class Router implements BaseRouter {
url = formatWithValidation(parsed)
}
}
- const route = removePathTrailingSlash(pathname)
// Prefetch is not supported in development mode because it would trigger on-demand-entries
if (process.env.NODE_ENV !== 'production') {
return
}
+ const effects = await this._preflightRequest({
+ as: asPath,
+ cache: true,
+ pages,
+ pathname,
+ query,
+ })
+
+ if (effects.type === 'rewrite') {
+ parsed.pathname = effects.resolvedHref
+ pathname = effects.resolvedHref
+ query = { ...query, ...effects.parsedAs.query }
+ resolvedAs = effects.asPath
+ url = formatWithValidation(parsed)
+ }
+
+ const route = removePathTrailingSlash(pathname)
+
await Promise.all([
this.pageLoader._isSsg(route).then((isSsg: boolean) => {
return isSsg
@@ -1658,6 +1734,156 @@ export default class Router implements BaseRouter {
})
}
+ async _preflightRequest(options: {
+ as: string
+ cache?: boolean
+ pages: string[]
+ pathname: string
+ query: ParsedUrlQuery
+ }): Promise {
+ const cleanedAs = delLocale(
+ hasBasePath(options.as) ? delBasePath(options.as) : options.as,
+ this.locale
+ )
+
+ const fns: string[] = await this.pageLoader.getMiddlewareList()
+ const requiresPreflight = fns.some((middleware) => {
+ return getRouteMatcher(getMiddlewareRegex(middleware))(cleanedAs)
+ })
+
+ if (!requiresPreflight) {
+ return { type: 'next' }
+ }
+
+ const preflight = await this._getPreflightData({
+ preflightHref: options.as,
+ shouldCache: options.cache,
+ })
+
+ if (preflight.rewrite?.startsWith('/')) {
+ const parsed = parseRelativeUrl(
+ normalizeLocalePath(
+ hasBasePath(preflight.rewrite)
+ ? delBasePath(preflight.rewrite)
+ : preflight.rewrite,
+ this.locales
+ ).pathname
+ )
+
+ const fsPathname = removePathTrailingSlash(parsed.pathname)
+
+ let matchedPage
+ let resolvedHref
+
+ if (options.pages.includes(fsPathname)) {
+ matchedPage = true
+ resolvedHref = fsPathname
+ } else {
+ resolvedHref = resolveDynamicRoute(fsPathname, options.pages)
+
+ if (
+ resolvedHref !== parsed.pathname &&
+ options.pages.includes(resolvedHref)
+ ) {
+ matchedPage = true
+ }
+ }
+
+ return {
+ type: 'rewrite',
+ asPath: parsed.pathname,
+ parsedAs: parsed,
+ matchedPage,
+ resolvedHref,
+ }
+ }
+
+ if (preflight.redirect) {
+ if (preflight.redirect.startsWith('/')) {
+ const cleanRedirect = removePathTrailingSlash(
+ normalizeLocalePath(
+ hasBasePath(preflight.redirect)
+ ? delBasePath(preflight.redirect)
+ : preflight.redirect,
+ this.locales
+ ).pathname
+ )
+
+ const { url: newUrl, as: newAs } = prepareUrlAs(
+ this,
+ cleanRedirect,
+ cleanRedirect
+ )
+
+ return {
+ type: 'redirect',
+ newUrl,
+ newAs,
+ }
+ }
+
+ return {
+ type: 'redirect',
+ destination: preflight.redirect,
+ }
+ }
+
+ if (preflight.refresh) {
+ return {
+ type: 'refresh',
+ }
+ }
+
+ return {
+ type: 'next',
+ }
+ }
+
+ _getPreflightData(params: {
+ preflightHref: string
+ shouldCache?: boolean
+ }): Promise {
+ const { preflightHref, shouldCache = false } = params
+ const { href: cacheKey } = new URL(preflightHref, window.location.href)
+
+ if (
+ process.env.NODE_ENV === 'production' &&
+ !this.isPreview &&
+ shouldCache &&
+ this.sde[cacheKey]
+ ) {
+ return Promise.resolve(this.sde[cacheKey])
+ }
+
+ return fetch(preflightHref, {
+ method: 'HEAD',
+ credentials: 'same-origin',
+ headers: { 'x-middleware-preflight': '1' },
+ })
+ .then((res) => {
+ if (!res.ok) {
+ throw new Error(`Failed to preflight request`)
+ }
+
+ return {
+ redirect: res.headers.get('Location'),
+ refresh: res.headers.has('x-middleware-refresh'),
+ rewrite: res.headers.get('x-middleware-rewrite'),
+ }
+ })
+ .then((data) => {
+ if (shouldCache) {
+ this.sde[cacheKey] = data
+ }
+
+ return data
+ })
+ .catch((err) => {
+ delete this.sde[cacheKey]
+ throw err
+ })
+ }
+
_getStaticData(dataHref: string): Promise {
const { href: cacheKey } = new URL(dataHref, window.location.href)
if (
diff --git a/packages/next/shared/lib/router/utils/get-middleware-regex.ts b/packages/next/shared/lib/router/utils/get-middleware-regex.ts
new file mode 100644
index 0000000000000..d41dfa6eff8af
--- /dev/null
+++ b/packages/next/shared/lib/router/utils/get-middleware-regex.ts
@@ -0,0 +1,34 @@
+import { getParametrizedRoute, RouteRegex } from './route-regex'
+
+export function getMiddlewareRegex(normalizedRoute: string): RouteRegex {
+ const result = getParametrizedRoute(normalizedRoute)
+ if ('routeKeys' in result) {
+ if (result.parameterizedRoute === '/') {
+ return {
+ groups: {},
+ namedRegex: `^/(?!_next).*$`,
+ re: new RegExp('^/(?!_next).*$'),
+ routeKeys: {},
+ }
+ }
+
+ return {
+ groups: result.groups,
+ namedRegex: `^${result.namedParameterizedRoute}(?:(/.*)?)$`,
+ re: new RegExp(`^${result.parameterizedRoute}(?:(/.*)?)$`),
+ routeKeys: result.routeKeys,
+ }
+ }
+
+ if (result.parameterizedRoute === '/') {
+ return {
+ groups: {},
+ re: new RegExp('^/.*$'),
+ }
+ }
+
+ return {
+ groups: {},
+ re: new RegExp(`^${result.parameterizedRoute}(?:(/.*)?)$`),
+ }
+}
diff --git a/packages/next/shared/lib/router/utils/index.ts b/packages/next/shared/lib/router/utils/index.ts
index 561c279631632..aa4bce09122f3 100644
--- a/packages/next/shared/lib/router/utils/index.ts
+++ b/packages/next/shared/lib/router/utils/index.ts
@@ -1,3 +1,4 @@
+export { getMiddlewareRegex } from './get-middleware-regex'
export { getRouteMatcher } from './route-matcher'
export { getRouteRegex } from './route-regex'
export { getSortedRoutes } from './sorted-routes'
diff --git a/packages/next/taskfile.js b/packages/next/taskfile.js
index 8dd7fe357c8f1..44eca1c6e5899 100644
--- a/packages/next/taskfile.js
+++ b/packages/next/taskfile.js
@@ -759,6 +759,51 @@ export async function ncc_mini_css_extract_plugin(task, opts) {
})
.target('compiled/mini-css-extract-plugin')
}
+// eslint-disable-next-line camelcase
+externals['web-streams-polyfill'] = 'next/dist/compiled/web-streams-polyfill'
+export async function ncc_web_streams_polyfill(task, opts) {
+ await task
+ .source(
+ opts.src ||
+ relative(__dirname, require.resolve('web-streams-polyfill/ponyfill'))
+ )
+ .ncc({ packageName: 'web-streams-polyfill', externals })
+ .target('compiled/web-streams-polyfill')
+}
+// eslint-disable-next-line camelcase
+externals['formdata-node'] = 'next/dist/compiled/formdata-node'
+export async function ncc_formdata_node(task, opts) {
+ await task
+ .source(opts.src || relative(__dirname, require.resolve('formdata-node')))
+ .ncc({ packageName: 'formdata-node', externals })
+ .target('compiled/formdata-node')
+}
+// eslint-disable-next-line camelcase
+externals['ua-parser-js'] = 'next/dist/compiled/ua-parser-js'
+export async function ncc_ua_parser_js(task, opts) {
+ await task
+ .source(opts.src || relative(__dirname, require.resolve('ua-parser-js')))
+ .ncc({ packageName: 'ua-parser-js', externals })
+ .target('compiled/ua-parser-js')
+}
+// eslint-disable-next-line camelcase
+externals['@peculiar/webcrypto'] = 'next/dist/compiled/@peculiar/webcrypto'
+export async function ncc_webcrypto(task, opts) {
+ await task
+ .source(
+ opts.src || relative(__dirname, require.resolve('@peculiar/webcrypto'))
+ )
+ .ncc({ packageName: '@peculiar/webcrypto', externals })
+ .target('compiled/@peculiar/webcrypto')
+}
+// eslint-disable-next-line camelcase
+externals['uuid'] = 'next/dist/compiled/uuid'
+export async function ncc_uuid(task, opts) {
+ await task
+ .source(opts.src || relative(__dirname, require.resolve('uuid')))
+ .ncc({ packageName: 'uuid', externals })
+ .target('compiled/uuid')
+}
// eslint-disable-next-line camelcase
export async function ncc_webpack_bundle5(task, opts) {
@@ -901,6 +946,11 @@ export async function ncc(task, opts) {
'ncc_webpack_sources1',
'ncc_webpack_sources3',
'ncc_ws',
+ 'ncc_ua_parser_js',
+ 'ncc_webcrypto',
+ 'ncc_uuid',
+ 'ncc_formdata_node',
+ 'ncc_web_streams_polyfill',
'ncc_mini_css_extract_plugin',
],
opts
diff --git a/packages/next/types/index.d.ts b/packages/next/types/index.d.ts
index c21d4ce21a2c9..3cfdee20b9f15 100644
--- a/packages/next/types/index.d.ts
+++ b/packages/next/types/index.d.ts
@@ -183,4 +183,27 @@ export type InferGetServerSidePropsType = T extends GetServerSideProps<
? P
: never
+declare global {
+ interface Crypto {
+ readonly subtle: SubtleCrypto
+ getRandomValues<
+ T extends
+ | Int8Array
+ | Int16Array
+ | Int32Array
+ | Uint8Array
+ | Uint16Array
+ | Uint32Array
+ | Uint8ClampedArray
+ | Float32Array
+ | Float64Array
+ | DataView
+ | null
+ >(
+ array: T
+ ): T
+ randomUUID?(): string
+ }
+}
+
export default next
diff --git a/packages/next/types/misc.d.ts b/packages/next/types/misc.d.ts
index 245c041a95d53..b47f79fe7a5bd 100644
--- a/packages/next/types/misc.d.ts
+++ b/packages/next/types/misc.d.ts
@@ -178,6 +178,26 @@ declare module 'next/dist/compiled/string-hash' {
import m from 'string-hash'
export = m
}
+declare module 'next/dist/compiled/web-streams-polyfill' {
+ import m from 'web-streams-polyfill/ponyfill'
+ export = m
+}
+declare module 'next/dist/compiled/ua-parser-js' {
+ import m from 'ua-parser-js'
+ export = m
+}
+declare module 'next/dist/compiled/formdata-node' {
+ import m from 'formdata-node'
+ export = m
+}
+declare module 'next/dist/compiled/@peculiar/webcrypto' {
+ import m from '@peculiar/webcrypto'
+ export = m
+}
+declare module 'next/dist/compiled/uuid' {
+ import m from 'uuid'
+ export = m
+}
declare module 'next/dist/compiled/strip-ansi' {
import m from 'strip-ansi'
export = m
diff --git a/packages/next/types/webpack.d.ts b/packages/next/types/webpack.d.ts
index 10a75a8c2accd..8f72e0db924dc 100644
--- a/packages/next/types/webpack.d.ts
+++ b/packages/next/types/webpack.d.ts
@@ -277,6 +277,8 @@ declare module 'webpack4' {
futureEmitAssets?: boolean
/** The filename of WebAssembly modules as relative path inside the `output.path` directory. */
webassemblyModuleFilename?: string
+ /** Library types enabled */
+ enabledLibraryTypes?: string[]
}
type LibraryTarget =
diff --git a/packages/react-dev-overlay/package.json b/packages/react-dev-overlay/package.json
index dbaff350967da..d8358fec3b9a1 100644
--- a/packages/react-dev-overlay/package.json
+++ b/packages/react-dev-overlay/package.json
@@ -1,6 +1,6 @@
{
"name": "@next/react-dev-overlay",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"description": "A development-only overlay for developing React applications.",
"repository": {
"url": "vercel/next.js",
diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json
index 49299b5d22751..db321443d1442 100644
--- a/packages/react-refresh-utils/package.json
+++ b/packages/react-refresh-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@next/react-refresh-utils",
- "version": "11.1.3-canary.87",
+ "version": "11.1.3-canary.89",
"description": "An experimental package providing utilities for React Refresh.",
"repository": {
"url": "vercel/next.js",
diff --git a/test/integration/build-output/test/index.test.js b/test/integration/build-output/test/index.test.js
index b4a23cffe96cc..527f96e36ab7a 100644
--- a/test/integration/build-output/test/index.test.js
+++ b/test/integration/build-output/test/index.test.js
@@ -11,16 +11,7 @@ const fixturesDir = join(__dirname, '..', 'fixtures')
const nextConfig = new File(join(fixturesDir, 'basic-app/next.config.js'))
describe('Build Output', () => {
- const configs = [{}]
- for (const gzipSize of [true, false]) {
- configs.push(...configs.map((c) => ({ ...c, gzipSize })))
- }
- for (const sharedPool of [true]) {
- configs.push(...configs.map((c) => ({ ...c, sharedPool })))
- }
- for (const workerThreads of [true]) {
- configs.push(...configs.map((c) => ({ ...c, workerThreads })))
- }
+ const configs = [{}, { gzipSize: false }]
for (const experimental of configs) {
describe(`Basic Application Output (experimental: ${JSON.stringify(
@@ -55,9 +46,9 @@ describe('Build Output', () => {
expect(stdout).toMatch(/\/ (.* )?\d{1,} B/)
expect(stdout).toMatch(/\+ First Load JS shared by all [ 0-9.]* kB/)
- expect(stdout).toMatch(/ chunks\/main\.[0-9a-z]{6}\.js [ 0-9.]* kB/)
+ expect(stdout).toMatch(/ chunks\/main-[0-9a-z]{16}\.js [ 0-9.]* kB/)
expect(stdout).toMatch(
- / chunks\/framework\.[0-9a-z]{6}\.js [ 0-9. ]* kB/
+ / chunks\/framework-[0-9a-z]{16}\.js [ 0-9. ]* kB/
)
expect(stdout).not.toContain(' /_document')
@@ -106,10 +97,10 @@ describe('Build Output', () => {
const err404FirstLoad = parsePageFirstLoad('/404')
const sharedByAll = parseSharedSize('shared by all')
- const _appSize = parseSharedSize('_app\\..*?\\.js')
- const webpackSize = parseSharedSize('webpack\\..*?\\.js')
- const mainSize = parseSharedSize('main\\..*?\\.js')
- const frameworkSize = parseSharedSize('framework\\..*?\\.js')
+ const _appSize = parseSharedSize('_app-.*?\\.js')
+ const webpackSize = parseSharedSize('webpack-.*?\\.js')
+ const mainSize = parseSharedSize('main-.*?\\.js')
+ const frameworkSize = parseSharedSize('framework-.*?\\.js')
for (const size of [
indexSize,
@@ -215,9 +206,9 @@ describe('Build Output', () => {
expect(stdout).toMatch(/\/ (.* )?\d{1,} B/)
expect(stdout).toMatch(/\/_app (.* )?\d{1,} B/)
expect(stdout).toMatch(/\+ First Load JS shared by all \s*[0-9.]+ kB/)
- expect(stdout).toMatch(/ chunks\/main\.[0-9a-z]{6}\.js \s*[0-9.]+ kB/)
+ expect(stdout).toMatch(/ chunks\/main-[0-9a-z]{16}\.js \s*[0-9.]+ kB/)
expect(stdout).toMatch(
- / chunks\/framework\.[0-9a-z]{6}\.js \s*[0-9.]+ kB/
+ / chunks\/framework-[0-9a-z]{16}\.js \s*[0-9.]+ kB/
)
expect(stdout).not.toContain(' /_document')
@@ -245,9 +236,9 @@ describe('Build Output', () => {
expect(stdout).toMatch(/\/amp (.* )?AMP/)
expect(stdout).toMatch(/\/hybrid (.* )?[0-9.]+ B/)
expect(stdout).toMatch(/\+ First Load JS shared by all \s*[0-9.]+ kB/)
- expect(stdout).toMatch(/ chunks\/main\.[0-9a-z]{6}\.js \s*[0-9.]+ kB/)
+ expect(stdout).toMatch(/ chunks\/main-[0-9a-z]{16}\.js \s*[0-9.]+ kB/)
expect(stdout).toMatch(
- / chunks\/framework\.[0-9a-z]{6}\.js \s*[0-9.]+ kB/
+ / chunks\/framework-[0-9a-z]{16}\.js \s*[0-9.]+ kB/
)
expect(stdout).not.toContain(' /_document')
@@ -273,8 +264,8 @@ describe('Build Output', () => {
expect(stdout).toMatch(/\/ (.* )?\d{1,} B/)
expect(stdout).toMatch(/λ \/404 (.* )?\d{1,} B/)
expect(stdout).toMatch(/\+ First Load JS shared by all [ 0-9.]* kB/)
- expect(stdout).toMatch(/ chunks\/main\.[0-9a-z]{6}\.js [ 0-9.]* kB/)
- expect(stdout).toMatch(/ chunks\/framework\.[0-9a-z]{6}\.js [ 0-9. ]* kB/)
+ expect(stdout).toMatch(/ chunks\/main-[0-9a-z]{16}\.js [ 0-9.]* kB/)
+ expect(stdout).toMatch(/ chunks\/framework-[0-9a-z]{16}\.js [ 0-9. ]* kB/)
expect(stdout).not.toContain(' /_document')
expect(stdout).not.toContain(' /_app')
diff --git a/test/integration/client-navigation/pages/nav/hash-changes-with-state.js b/test/integration/client-navigation/pages/nav/hash-changes-with-state.js
index 91552e1b29d72..67f774d44c525 100644
--- a/test/integration/client-navigation/pages/nav/hash-changes-with-state.js
+++ b/test/integration/client-navigation/pages/nav/hash-changes-with-state.js
@@ -14,7 +14,7 @@ export default class SelfReload extends Component {
handleAClick = () => {
Router.push(
'/nav/hash-changes-with-state',
- '/nav/hash-changes-with-state#',
+ '/nav/hash-changes-with-state#hello' + Math.random(),
{
historyCount: (window.history.state.options.historyCount || 0) + 1,
shallowHistoryCount: window.history.state.options.shallowHistoryCount,
@@ -25,7 +25,7 @@ export default class SelfReload extends Component {
handleAShallowClick = () => {
Router.push(
'/nav/hash-changes-with-state#',
- '/nav/hash-changes-with-state#',
+ '/nav/hash-changes-with-state#hello' + Math.random(),
{
shallow: true,
historyCount: window.history.state.options.historyCount,
diff --git a/test/integration/client-navigation/test/index.test.js b/test/integration/client-navigation/test/index.test.js
index 404e13072be73..353ad5c667bf8 100644
--- a/test/integration/client-navigation/test/index.test.js
+++ b/test/integration/client-navigation/test/index.test.js
@@ -733,7 +733,8 @@ describe('Client Navigation', () => {
const counter = await browser.elementByCss('p').text()
- expect(counter).toBe('COUNT: 2')
+ // getInitialProps should not be called with only hash changes
+ expect(counter).toBe('COUNT: 0')
await browser.close()
})
diff --git a/test/integration/custom-routes/test/index.test.js b/test/integration/custom-routes/test/index.test.js
index e05fa7aa219ef..d02c8cfb78eba 100644
--- a/test/integration/custom-routes/test/index.test.js
+++ b/test/integration/custom-routes/test/index.test.js
@@ -1968,6 +1968,56 @@ const runTests = (isDev = false) => {
},
},
],
+ staticRoutes: [
+ {
+ namedRegex: '^/auto\\-export/another(?:/)?$',
+ page: '/auto-export/another',
+ regex: '^/auto\\-export/another(?:/)?$',
+ routeKeys: {},
+ },
+ {
+ namedRegex: '^/docs/v2/more/now\\-for\\-github(?:/)?$',
+ page: '/docs/v2/more/now-for-github',
+ regex: '^/docs/v2/more/now\\-for\\-github(?:/)?$',
+ routeKeys: {},
+ },
+ {
+ namedRegex: '^/hello(?:/)?$',
+ page: '/hello',
+ regex: '^/hello(?:/)?$',
+ routeKeys: {},
+ },
+ {
+ namedRegex: '^/hello\\-again(?:/)?$',
+ page: '/hello-again',
+ regex: '^/hello\\-again(?:/)?$',
+ routeKeys: {},
+ },
+ {
+ namedRegex: '^/multi\\-rewrites(?:/)?$',
+ page: '/multi-rewrites',
+ regex: '^/multi\\-rewrites(?:/)?$',
+ routeKeys: {},
+ },
+ {
+ namedRegex: '^/nav(?:/)?$',
+ page: '/nav',
+ regex: '^/nav(?:/)?$',
+ routeKeys: {},
+ },
+ {
+ namedRegex: '^/redirect\\-override(?:/)?$',
+ page: '/redirect-override',
+ regex: '^/redirect\\-override(?:/)?$',
+ routeKeys: {},
+ },
+ {
+ namedRegex: '^/with\\-params(?:/)?$',
+ page: '/with-params',
+ regex: '^/with\\-params(?:/)?$',
+ routeKeys: {},
+ },
+ ],
})
})
diff --git a/test/integration/dynamic-routing/test/index.test.js b/test/integration/dynamic-routing/test/index.test.js
index 118ae4166c100..79a25b7181759 100644
--- a/test/integration/dynamic-routing/test/index.test.js
+++ b/test/integration/dynamic-routing/test/index.test.js
@@ -1087,6 +1087,20 @@ function runTests(dev) {
basePath: '',
headers: [],
rewrites: [],
+ staticRoutes: [
+ {
+ namedRegex: '^/(?:/)?$',
+ page: '/',
+ regex: '^/(?:/)?$',
+ routeKeys: {},
+ },
+ {
+ namedRegex: '^/another(?:/)?$',
+ page: '/another',
+ regex: '^/another(?:/)?$',
+ routeKeys: {},
+ },
+ ],
redirects: expect.arrayContaining([]),
dataRoutes: [
{
diff --git a/test/integration/middleware-base-path/next.config.js b/test/integration/middleware-base-path/next.config.js
new file mode 100644
index 0000000000000..959fceae7487a
--- /dev/null
+++ b/test/integration/middleware-base-path/next.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ basePath: '/root',
+}
diff --git a/test/integration/middleware-base-path/pages/_middleware.js b/test/integration/middleware-base-path/pages/_middleware.js
new file mode 100644
index 0000000000000..3b229fa441eb0
--- /dev/null
+++ b/test/integration/middleware-base-path/pages/_middleware.js
@@ -0,0 +1,14 @@
+import { NextResponse } from 'next/server'
+
+export function middleware(event) {
+ const url = event.request.nextUrl
+ if (url.pathname === '/redirect-with-basepath' && !url.basePath) {
+ url.basePath = '/root'
+ event.respondWith(NextResponse.redirect(url))
+ }
+
+ if (url.pathname === '/redirect-with-basepath') {
+ url.pathname = '/about'
+ event.respondWith(NextResponse.rewrite(url))
+ }
+}
diff --git a/test/integration/middleware-base-path/pages/about.js b/test/integration/middleware-base-path/pages/about.js
new file mode 100644
index 0000000000000..9924acf0375b7
--- /dev/null
+++ b/test/integration/middleware-base-path/pages/about.js
@@ -0,0 +1,7 @@
+export default function About() {
+ return (
+
+
About Page
+
+ )
+}
diff --git a/test/integration/middleware-base-path/pages/index.js b/test/integration/middleware-base-path/pages/index.js
new file mode 100644
index 0000000000000..9d255950aa94f
--- /dev/null
+++ b/test/integration/middleware-base-path/pages/index.js
@@ -0,0 +1,32 @@
+import Link from 'next/link'
+
+export default function Main({ message }) {
+ return (
+
+ )
+}
+
+export const getServerSideProps = ({ query }) => ({
+ props: { message: query.message || 'World' },
+})
diff --git a/test/integration/middleware-base-path/test/index.test.js b/test/integration/middleware-base-path/test/index.test.js
new file mode 100644
index 0000000000000..f76bf60a7421a
--- /dev/null
+++ b/test/integration/middleware-base-path/test/index.test.js
@@ -0,0 +1,41 @@
+/* eslint-env jest */
+
+jest.setTimeout(1000 * 60 * 2)
+
+import { fetchViaHTTP, findPort, killApp, launchApp } from 'next-test-utils'
+import { join } from 'path'
+import cheerio from 'cheerio'
+import webdriver from 'next-webdriver'
+
+const context = {}
+context.appDir = join(__dirname, '../')
+
+describe('Middleware base tests', () => {
+ beforeAll(async () => {
+ context.appPort = await findPort()
+ context.app = await launchApp(context.appDir, context.appPort)
+ })
+ afterAll(() => killApp(context.app))
+ runTests()
+})
+
+function runTests() {
+ it('should execute from absolute paths', async () => {
+ const browser = await webdriver(context.appPort, '/redirect-with-basepath')
+ try {
+ expect(await browser.eval(`window.location.pathname`)).toBe(
+ '/root/redirect-with-basepath'
+ )
+ } finally {
+ await browser.close()
+ }
+
+ const res = await fetchViaHTTP(
+ context.appPort,
+ '/root/redirect-with-basepath'
+ )
+ const html = await res.text()
+ const $ = cheerio.load(html)
+ expect($('.title').text()).toBe('About Page')
+ })
+}
diff --git a/test/integration/middleware-core/next.config.js b/test/integration/middleware-core/next.config.js
new file mode 100644
index 0000000000000..f548199a3b10a
--- /dev/null
+++ b/test/integration/middleware-core/next.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ i18n: {
+ locales: ['en', 'fr', 'nl'],
+ defaultLocale: 'en',
+ },
+}
diff --git a/test/integration/middleware-core/pages/interface/[id]/index.js b/test/integration/middleware-core/pages/interface/[id]/index.js
new file mode 100644
index 0000000000000..11f4614a671e7
--- /dev/null
+++ b/test/integration/middleware-core/pages/interface/[id]/index.js
@@ -0,0 +1,3 @@
+export default function Index() {
+ return Dynamic route
+}
diff --git a/test/integration/middleware-core/pages/interface/_middleware.js b/test/integration/middleware-core/pages/interface/_middleware.js
new file mode 100644
index 0000000000000..428f94281052a
--- /dev/null
+++ b/test/integration/middleware-core/pages/interface/_middleware.js
@@ -0,0 +1,14 @@
+export function middleware(event) {
+ event.respondWith(
+ new Response(null, {
+ headers: {
+ 'req-url-basepath': event.request.nextUrl.basePath,
+ 'req-url-pathname': event.request.nextUrl.pathname,
+ 'req-url-params': JSON.stringify(event.request.page.params),
+ 'req-url-page': event.request.page.name,
+ 'req-url-query': event.request.nextUrl.searchParams.get('foo'),
+ 'req-url-locale': event.request.nextUrl.locale,
+ },
+ })
+ )
+}
diff --git a/test/integration/middleware-core/pages/interface/static.js b/test/integration/middleware-core/pages/interface/static.js
new file mode 100644
index 0000000000000..d683fec42acc0
--- /dev/null
+++ b/test/integration/middleware-core/pages/interface/static.js
@@ -0,0 +1,3 @@
+export default function Index() {
+ return Static route
+}
diff --git a/test/integration/middleware-core/pages/redirects/_middleware.js b/test/integration/middleware-core/pages/redirects/_middleware.js
new file mode 100644
index 0000000000000..92dd9cf397093
--- /dev/null
+++ b/test/integration/middleware-core/pages/redirects/_middleware.js
@@ -0,0 +1,65 @@
+export function middleware(event) {
+ event.respondWith(handleRequest(event))
+}
+
+async function handleRequest(event) {
+ const url = event.request.nextUrl
+
+ if (url.searchParams.get('foo') === 'bar') {
+ url.pathname = '/redirects/new-home'
+ url.searchParams.delete('foo')
+ return Response.redirect(url)
+ }
+
+ if (url.pathname === '/redirects/old-home') {
+ url.pathname = '/redirects/new-home'
+ return Response.redirect(url)
+ }
+
+ // Chained redirects
+ if (url.pathname === '/redirects/redirect-me-alot') {
+ url.pathname = '/redirects/redirect-me-alot-2'
+ return Response.redirect(url)
+ }
+
+ if (url.pathname === '/redirects/redirect-me-alot-2') {
+ url.pathname = '/redirects/redirect-me-alot-3'
+ return Response.redirect(url)
+ }
+
+ if (url.pathname === '/redirects/redirect-me-alot-3') {
+ url.pathname = '/redirects/redirect-me-alot-4'
+ return Response.redirect(url)
+ }
+
+ if (url.pathname === '/redirects/redirect-me-alot-4') {
+ url.pathname = '/redirects/redirect-me-alot-5'
+ return Response.redirect(url)
+ }
+
+ if (url.pathname === '/redirects/redirect-me-alot-5') {
+ url.pathname = '/redirects/redirect-me-alot-6'
+ return Response.redirect(url)
+ }
+
+ if (url.pathname === '/redirects/redirect-me-alot-6') {
+ url.pathname = '/redirects/redirect-me-alot-7'
+ return Response.redirect(url)
+ }
+
+ if (url.pathname === '/redirects/redirect-me-alot-7') {
+ url.pathname = '/redirects/new-home'
+ return Response.redirect(url)
+ }
+
+ // Infinite loop
+ if (url.pathname === '/redirects/infinite-loop') {
+ url.pathname = '/redirects/infinite-loop-1'
+ return Response.redirect(url)
+ }
+
+ if (url.pathname === '/redirects/infinite-loop-1') {
+ url.pathname = '/redirects/infinite-loop'
+ return Response.redirect(url.pathname)
+ }
+}
diff --git a/test/integration/middleware-core/pages/redirects/header.js b/test/integration/middleware-core/pages/redirects/header.js
new file mode 100644
index 0000000000000..1f3d53eca6084
--- /dev/null
+++ b/test/integration/middleware-core/pages/redirects/header.js
@@ -0,0 +1,3 @@
+export default function Account() {
+ return Welcome to a header page
+}
diff --git a/test/integration/middleware-core/pages/redirects/index.js b/test/integration/middleware-core/pages/redirects/index.js
new file mode 100644
index 0000000000000..735e73d232bc3
--- /dev/null
+++ b/test/integration/middleware-core/pages/redirects/index.js
@@ -0,0 +1,33 @@
+import Link from 'next/link'
+
+export default function Home() {
+ return (
+
+ )
+}
diff --git a/test/integration/middleware-core/pages/redirects/new-home.js b/test/integration/middleware-core/pages/redirects/new-home.js
new file mode 100644
index 0000000000000..6442464c92e2e
--- /dev/null
+++ b/test/integration/middleware-core/pages/redirects/new-home.js
@@ -0,0 +1,3 @@
+export default function Account() {
+ return Welcome to a new page
+}
diff --git a/test/integration/middleware-core/pages/redirects/old-home.js b/test/integration/middleware-core/pages/redirects/old-home.js
new file mode 100644
index 0000000000000..7b2079db1b3de
--- /dev/null
+++ b/test/integration/middleware-core/pages/redirects/old-home.js
@@ -0,0 +1,3 @@
+export default function Account() {
+ return Welcome to a old page
+}
diff --git a/test/integration/middleware-core/pages/responses/_middleware.js b/test/integration/middleware-core/pages/responses/_middleware.js
new file mode 100644
index 0000000000000..1c7535bf6cb85
--- /dev/null
+++ b/test/integration/middleware-core/pages/responses/_middleware.js
@@ -0,0 +1,100 @@
+import { createElement } from 'react'
+import { renderToString } from 'react-dom/server.browser'
+import { NextResponse } from 'next/server'
+
+export async function middleware(event) {
+ // eslint-disable-next-line no-undef
+ const { readable, writable } = new TransformStream()
+ const url = event.request.nextUrl
+ const writer = writable.getWriter()
+ const encoder = new TextEncoder()
+ const next = NextResponse.next()
+
+ // Sends a header
+ if (url.pathname === '/responses/header') {
+ next.headers.set('x-first-header', 'valid')
+ event.respondWith(next)
+ }
+
+ // Header based on query param
+ if (url.searchParams.get('nested-header') === 'true') {
+ next.headers.set('x-nested-header', 'valid')
+ event.respondWith(next)
+ }
+
+ // Streams a basic response
+ if (url.pathname === '/responses/stream-a-response') {
+ event.respondWith(new Response(readable))
+ writer.write(encoder.encode('this is a streamed '))
+ writer.write(encoder.encode('response'))
+ writer.close()
+ return
+ }
+
+ if (url.pathname === '/responses/bad-status') {
+ event.respondWith(
+ new Response('Auth required', {
+ headers: { 'WWW-Authenticate': 'Basic realm="Secure Area"' },
+ status: 401,
+ })
+ )
+ }
+
+ if (url.pathname === '/responses/stream-long') {
+ event.respondWith(new Response(readable))
+ writer.write(encoder.encode('this is a streamed '.repeat(10)))
+ await sleep(2000)
+ writer.write(encoder.encode('after 2 seconds '.repeat(10)))
+ await sleep(2000)
+ writer.write(encoder.encode('after 4 seconds '.repeat(10)))
+ await sleep(2000)
+ writer.close()
+ return
+ }
+
+ // Sends response
+ if (url.pathname === '/responses/send-response') {
+ return event.respondWith(new Response(JSON.stringify({ message: 'hi!' })))
+ }
+
+ // Render React component
+ if (url.pathname === '/responses/react') {
+ return event.respondWith(
+ new Response(
+ renderToString(
+ createElement(
+ 'h1',
+ {},
+ 'SSR with React! Hello, ' + url.searchParams.get('name')
+ )
+ )
+ )
+ )
+ }
+
+ // Stream React component
+ if (url.pathname === '/responses/react-stream') {
+ event.respondWith(new Response(readable))
+ writer.write(
+ encoder.encode(renderToString(createElement('h1', {}, 'I am a stream')))
+ )
+ await sleep(500)
+ writer.write(
+ encoder.encode(
+ renderToString(createElement('p', {}, 'I am another stream'))
+ )
+ )
+ writer.close()
+ return
+ }
+
+ event.respondWith(next)
+}
+
+function sleep(time) {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ resolve()
+ }, time)
+ })
+}
diff --git a/test/integration/middleware-core/pages/responses/index.js b/test/integration/middleware-core/pages/responses/index.js
new file mode 100644
index 0000000000000..416ee0b5568c9
--- /dev/null
+++ b/test/integration/middleware-core/pages/responses/index.js
@@ -0,0 +1,68 @@
+import Link from 'next/link'
+
+export default function Home({ message }) {
+ return (
+
+ )
+}
+
+export const getServerSideProps = ({ query }) => ({
+ props: { message: query.message || 'World' },
+})
diff --git a/test/integration/middleware-core/pages/rewrites/_middleware.js b/test/integration/middleware-core/pages/rewrites/_middleware.js
new file mode 100644
index 0000000000000..4c1b04285f82f
--- /dev/null
+++ b/test/integration/middleware-core/pages/rewrites/_middleware.js
@@ -0,0 +1,31 @@
+import { NextResponse } from 'next/server'
+
+export function middleware(event) {
+ const url = event.request.nextUrl
+
+ if (url.pathname === '/rewrites/rewrite-to-ab-test') {
+ let bucket = event.request.cookies.bucket
+ if (!bucket) {
+ bucket = Math.random() >= 0.5 ? 'a' : 'b'
+ const response = NextResponse.rewrite(`/rewrites/${bucket}`)
+ response.cookie('bucket', bucket)
+ return event.respondWith(response)
+ }
+
+ return event.respondWith(NextResponse.rewrite(`/rewrites/${bucket}`))
+ }
+
+ if (url.pathname === '/rewrites/rewrite-me-to-about') {
+ return event.respondWith(NextResponse.rewrite('/rewrites/about'))
+ }
+
+ if (url.pathname === '/rewrites/rewrite-me-to-vercel') {
+ return event.respondWith(NextResponse.rewrite('https://vercel.com'))
+ }
+
+ if (url.pathname === '/rewrites/rewrite-me-without-hard-navigation') {
+ url.pathname = '/rewrites/about'
+ url.searchParams.set('middleware', 'foo')
+ event.respondWith(NextResponse.rewrite(url))
+ }
+}
diff --git a/test/integration/middleware-core/pages/rewrites/a.js b/test/integration/middleware-core/pages/rewrites/a.js
new file mode 100644
index 0000000000000..4ea5eaf19e4fc
--- /dev/null
+++ b/test/integration/middleware-core/pages/rewrites/a.js
@@ -0,0 +1,3 @@
+export default function Home() {
+ return Welcome Page A
+}
diff --git a/test/integration/middleware-core/pages/rewrites/about.js b/test/integration/middleware-core/pages/rewrites/about.js
new file mode 100644
index 0000000000000..4eff796b31d59
--- /dev/null
+++ b/test/integration/middleware-core/pages/rewrites/about.js
@@ -0,0 +1,16 @@
+export default function Main({ message, middleware }) {
+ return (
+
+
About Page
+
{message}
+
{middleware}
+
+ )
+}
+
+export const getServerSideProps = ({ query }) => ({
+ props: {
+ middleware: query.middleware || '',
+ message: query.message || '',
+ },
+})
diff --git a/test/integration/middleware-core/pages/rewrites/b.js b/test/integration/middleware-core/pages/rewrites/b.js
new file mode 100644
index 0000000000000..32505e9eaea1d
--- /dev/null
+++ b/test/integration/middleware-core/pages/rewrites/b.js
@@ -0,0 +1,3 @@
+export default function Home() {
+ return Welcome Page B
+}
diff --git a/test/integration/middleware-core/pages/rewrites/index.js b/test/integration/middleware-core/pages/rewrites/index.js
new file mode 100644
index 0000000000000..0f347114ed0ed
--- /dev/null
+++ b/test/integration/middleware-core/pages/rewrites/index.js
@@ -0,0 +1,29 @@
+import Link from 'next/link'
+
+export default function Home() {
+ return (
+
+ )
+}
diff --git a/test/integration/middleware-core/test/index.test.js b/test/integration/middleware-core/test/index.test.js
new file mode 100644
index 0000000000000..142200934b656
--- /dev/null
+++ b/test/integration/middleware-core/test/index.test.js
@@ -0,0 +1,344 @@
+/* eslint-env jest */
+
+import { join } from 'path'
+import cheerio from 'cheerio'
+import webdriver from 'next-webdriver'
+import {
+ fetchViaHTTP,
+ findPort,
+ killApp,
+ launchApp,
+ nextBuild,
+ nextStart,
+} from 'next-test-utils'
+
+jest.setTimeout(1000 * 60 * 2)
+const context = {}
+context.appDir = join(__dirname, '../')
+
+describe('Middleware base tests', () => {
+ describe('dev mode', () => {
+ beforeAll(async () => {
+ context.appPort = await findPort()
+ context.app = await launchApp(context.appDir, context.appPort)
+ })
+ afterAll(() => killApp(context.app))
+ rewriteTests()
+ rewriteTests('/fr')
+ redirectTests()
+ redirectTests('/fr')
+ responseTests()
+ responseTests('/fr')
+ interfaceTests()
+ interfaceTests('/fr')
+ })
+ describe('production mode', () => {
+ beforeAll(async () => {
+ await nextBuild(context.appDir)
+ context.appPort = await findPort()
+ context.app = await nextStart(context.appDir, context.appPort)
+ })
+ afterAll(() => killApp(context.app))
+ rewriteTests()
+ rewriteTests('/fr')
+ redirectTests()
+ redirectTests('/fr')
+ responseTests()
+ responseTests('/fr')
+ interfaceTests()
+ interfaceTests('/fr')
+ })
+})
+
+function rewriteTests(locale = '') {
+ it(`${locale} should add a cookie and rewrite to a/b test`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/rewrites/rewrite-to-ab-test`
+ )
+ const html = await res.text()
+ const $ = cheerio.load(html)
+ const bucket = getCookieFromResponse(res, 'bucket')
+ const expectedText = bucket === 'a' ? 'Welcome Page A' : 'Welcome Page B'
+ const browser = await webdriver(
+ context.appPort,
+ `${locale}/rewrites/rewrite-to-ab-test`
+ )
+ try {
+ expect(await browser.eval(`window.location.pathname`)).toBe(
+ `${locale}/rewrites/rewrite-to-ab-test`
+ )
+ } finally {
+ await browser.close()
+ }
+ // -1 is returned if bucket was not found in func getCookieFromResponse
+ expect(bucket).not.toBe(-1)
+ expect($('.title').text()).toBe(expectedText)
+ })
+
+ it(`${locale} should rewrite to about page`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/rewrites/rewrite-me-to-about`
+ )
+ const html = await res.text()
+ const $ = cheerio.load(html)
+ const browser = await webdriver(
+ context.appPort,
+ `${locale}/rewrites/rewrite-me-to-about`
+ )
+ try {
+ expect(await browser.eval(`window.location.pathname`)).toBe(
+ `${locale}/rewrites/rewrite-me-to-about`
+ )
+ } finally {
+ await browser.close()
+ }
+ expect($('.title').text()).toBe('About Page')
+ })
+
+ it(`${locale} should rewrite to Vercel`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/rewrites/rewrite-me-to-vercel`
+ )
+ const html = await res.text()
+ const $ = cheerio.load(html)
+ // const browser = await webdriver(context.appPort, '/rewrite-me-to-vercel')
+ // TODO: running this to chech the window.location.pathname hangs for some reason;
+ expect($('head > title').text()).toBe(
+ 'Develop. Preview. Ship. For the best frontend teams – Vercel'
+ )
+ })
+
+ it(`${locale} should rewrite without hard navigation`, async () => {
+ const browser = await webdriver(context.appPort, '/rewrites/')
+ await browser.eval('window.__SAME_PAGE = true')
+ await browser.elementByCss('#link-with-rewritten-url').click()
+ await browser.waitForElementByCss('.refreshed')
+ expect(await browser.eval('window.__SAME_PAGE')).toBe(true)
+ const element = await browser.elementByCss('.middleware')
+ expect(await element.text()).toEqual('foo')
+ })
+}
+
+function redirectTests(locale = '') {
+ it(`${locale} should redirect`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/redirects/old-home`
+ )
+ const html = await res.text()
+ const $ = cheerio.load(html)
+ const browser = await webdriver(
+ context.appPort,
+ `${locale}/redirects/old-home`
+ )
+ try {
+ expect(await browser.eval(`window.location.pathname`)).toBe(
+ `${locale}/redirects/new-home`
+ )
+ } finally {
+ await browser.close()
+ }
+ expect($('.title').text()).toBe('Welcome to a new page')
+ })
+
+ it(`${locale} should redirect cleanly with the original url param`, async () => {
+ const browser = await webdriver(
+ context.appPort,
+ `${locale}/redirects/blank-page?foo=bar`
+ )
+ try {
+ expect(
+ await browser.eval(
+ `window.location.href.replace(window.location.origin, '')`
+ )
+ ).toBe(`${locale}/redirects/new-home`)
+ } finally {
+ await browser.close()
+ }
+ })
+
+ it(`${locale} should redirect multiple times`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/redirects/redirect-me-alot`
+ )
+ const browser = await webdriver(
+ context.appPort,
+ `${locale}/redirects/redirect-me-alot`
+ )
+ try {
+ expect(await browser.eval(`window.location.pathname`)).toBe(
+ `${locale}/redirects/new-home`
+ )
+ } finally {
+ await browser.close()
+ }
+ const html = await res.text()
+ const $ = cheerio.load(html)
+ expect($('.title').text()).toBe('Welcome to a new page')
+ })
+
+ it(`${locale} should redirect (infinite-loop)`, async () => {
+ await expect(
+ fetchViaHTTP(context.appPort, `${locale}/redirects/infinite-loop`)
+ ).rejects.toThrow()
+ })
+}
+
+function responseTests(locale = '') {
+ it(`${locale} should stream a response`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/responses/stream-a-response`
+ )
+ const html = await res.text()
+ expect(html).toBe('this is a streamed response')
+ })
+
+ it(`${locale} should respond with a body`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/responses/send-response`
+ )
+ const html = await res.text()
+ expect(html).toBe('{"message":"hi!"}')
+ })
+
+ it(`${locale} should respond with a 401 status code`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/responses/bad-status`
+ )
+ const html = await res.text()
+ expect(res.status).toBe(401)
+ expect(html).toBe('Auth required')
+ })
+
+ it(`${locale} should render a React component`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/responses/react?name=jack`
+ )
+ const html = await res.text()
+ expect(html).toBe('SSR with React! Hello, jack ')
+ })
+
+ it(`${locale} should stream a React component`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/responses/react-stream`
+ )
+ const html = await res.text()
+ expect(html).toBe(
+ 'I am a stream I am another stream
'
+ )
+ })
+
+ it(`${locale} should stream a long response`, async () => {
+ const res = await fetchViaHTTP(context.appPort, '/responses/stream-long')
+ const html = await res.text()
+ expect(html).toBe(
+ 'this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds '
+ )
+ })
+
+ it(`${locale} should render the right content via SSR`, async () => {
+ const res = await fetchViaHTTP(context.appPort, '/responses/')
+ const html = await res.text()
+ const $ = cheerio.load(html)
+ expect($('.title').text()).toBe('Hello World')
+ })
+
+ it(`${locale} should respond with a header`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/responses/header`
+ )
+ expect(res.headers.get('x-first-header')).toBe('valid')
+ })
+
+ it(`${locale} should respond with 2 nested headers`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/responses/header?nested-header=true`
+ )
+ expect(res.headers.get('x-first-header')).toBe('valid')
+ expect(res.headers.get('x-nested-header')).toBe('valid')
+ })
+}
+
+function interfaceTests(locale = '') {
+ it(`${locale} should validate request url parameters from a static route`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/interface/static`
+ )
+ //expect(res.headers.get('req-url-basepath')).toBe('')
+ expect(res.headers.get('req-url-pathname')).toBe('/interface/static')
+ expect(res.headers.get('req-url-params')).not.toBe('{}')
+ expect(res.headers.get('req-url-query')).not.toBe('bar')
+ if (locale !== '') {
+ expect(res.headers.get('req-url-locale')).toBe(locale.slice(1))
+ }
+ })
+
+ it(`${locale} should validate request url parameters from a dynamic route with param 1`, async () => {
+ const res = await fetchViaHTTP(context.appPort, `${locale}/interface/1`)
+ //expect(res.headers.get('req-url-basepath')).toBe('')
+ expect(res.headers.get('req-url-pathname')).toBe('/interface/1')
+ expect(res.headers.get('req-url-params')).toBe('{"id":"1"}')
+ expect(res.headers.get('req-url-page')).toBe('/interface/[id]')
+ expect(res.headers.get('req-url-query')).not.toBe('bar')
+
+ if (locale !== '') {
+ expect(res.headers.get('req-url-locale')).toBe(locale.slice(1))
+ }
+ })
+
+ it(`${locale} should validate request url parameters from a dynamic route with param abc123`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/interface/abc123`
+ )
+ //expect(res.headers.get('req-url-basepath')).toBe('')
+ expect(res.headers.get('req-url-pathname')).toBe('/interface/abc123')
+ expect(res.headers.get('req-url-params')).toBe('{"id":"abc123"}')
+ expect(res.headers.get('req-url-page')).toBe('/interface/[id]')
+ expect(res.headers.get('req-url-query')).not.toBe('bar')
+
+ if (locale !== '') {
+ expect(res.headers.get('req-url-locale')).toBe(locale.slice(1))
+ }
+ })
+
+ it(`${locale} should validate request url parameters from a dynamic route with param abc123 and query foo = bar`, async () => {
+ const res = await fetchViaHTTP(
+ context.appPort,
+ `${locale}/interface/abc123?foo=bar`
+ )
+ //expect(res.headers.get('req-url-basepath')).toBe('')
+ expect(res.headers.get('req-url-pathname')).toBe('/interface/abc123')
+ expect(res.headers.get('req-url-params')).toBe('{"id":"abc123"}')
+ expect(res.headers.get('req-url-page')).toBe('/interface/[id]')
+ expect(res.headers.get('req-url-query')).toBe('bar')
+ if (locale !== '') {
+ expect(res.headers.get('req-url-locale')).toBe(locale.slice(1))
+ }
+ })
+}
+
+function getCookieFromResponse(res, cookieName) {
+ // node-fetch bundles the cookies as string in the Response
+ const cookieArray = res.headers.raw()['set-cookie']
+ for (const cookie of cookieArray) {
+ let individualCookieParams = cookie.split(';')
+ let individualCookie = individualCookieParams[0].split('=')
+ if (individualCookie[0] === cookieName) {
+ return individualCookie[1]
+ }
+ }
+ return -1
+}
diff --git a/test/unit/accept-headers.test.ts b/test/unit/accept-headers.test.ts
new file mode 100644
index 0000000000000..4b95f3de48e05
--- /dev/null
+++ b/test/unit/accept-headers.test.ts
@@ -0,0 +1,77 @@
+import { acceptLanguage } from 'next/dist/server/accept-header'
+
+describe('acceptLanguage', () => {
+ it('parses the header', () => {
+ const language = acceptLanguage('da, en-GB, en')
+ expect(language).toEqual('da')
+ })
+
+ it('respects weights', () => {
+ const language = acceptLanguage('en;q=0.6, en-GB;q=0.8')
+ expect(language).toEqual('en-gb')
+ })
+
+ it('returns empty string with header is empty', () => {
+ const language = acceptLanguage('')
+ expect(language).toEqual('')
+ })
+
+ it('returns empty string if header is missing', () => {
+ const language = acceptLanguage()
+ expect(language).toEqual('')
+ })
+
+ it('ignores an empty preferences array', () => {
+ const language = acceptLanguage('da, en-GB, en', [])
+ expect(language).toEqual('da')
+ })
+
+ it('returns empty string if none of the preferences match', () => {
+ const language = acceptLanguage('da, en-GB, en', ['es'])
+ expect(language).toEqual('')
+ })
+
+ it('returns first preference if header has * and is unmatched', () => {
+ const language = acceptLanguage('da, en-GB, *', ['en-US'])
+ expect(language).toEqual('en-US')
+ })
+
+ it('returns first found preference that header includes', () => {
+ const language = acceptLanguage('da, en-GB, en', ['en-US', 'en-GB'])
+ expect(language).toEqual('en-US')
+ })
+
+ it('returns preference with highest order when equal weigths', () => {
+ expect(acceptLanguage('da, en, en-GB', ['en', 'en-GB'])).toEqual('en')
+ expect(acceptLanguage('da, en, en-GB', ['en-GB', 'en'])).toEqual('en-GB')
+ expect(acceptLanguage('en, en-GB, en-US')).toEqual('en')
+ })
+
+ it('return language with heighest weight', () => {
+ const language = acceptLanguage('da;q=0.5, en;q=1', ['da', 'en'])
+ expect(language).toEqual('en')
+ })
+
+ it('ignores preference case when matching', () => {
+ const language = acceptLanguage('da, en-GB, en-us', ['en-gb', 'en-us']) // en-GB vs en-gb
+ expect(language).toEqual('en-gb')
+ })
+
+ it('returns language using range match', () => {
+ expect(acceptLanguage('da', ['da-DK'])).toEqual('da-DK')
+ expect(acceptLanguage('en-US, en', ['en-GB', 'en-US'])).toEqual('en-GB')
+ expect(acceptLanguage('da, en', ['da-DK', 'en-GB'])).toEqual('da-DK')
+ expect(acceptLanguage('en, da', ['da-DK', 'en-GB'])).toEqual('da-DK')
+ expect(acceptLanguage('en, da', ['en', 'en-GB'])).toEqual('en')
+ expect(acceptLanguage('da, en-GB', ['da-DK', 'en-GB'])).toEqual('da-DK')
+ expect(acceptLanguage('en, en-GB', ['en-US', 'en-GB', 'da-DK'])).toEqual(
+ 'en-US'
+ )
+ })
+
+ it('explicit preference overrides range match', () => {
+ expect(acceptLanguage('da, en-GB', ['da-DK', 'en-GB', 'da'])).toEqual(
+ 'en-GB'
+ )
+ })
+})
diff --git a/test/unit/web-runtime/body.test.ts b/test/unit/web-runtime/body.test.ts
new file mode 100644
index 0000000000000..fad6e2c9bd4d0
--- /dev/null
+++ b/test/unit/web-runtime/body.test.ts
@@ -0,0 +1,212 @@
+/* eslint-env jest */
+
+import { Blob, File, FormData } from 'next/dist/compiled/formdata-node'
+import { Body } from 'next/dist/server/web/spec-compliant/body'
+import { Crypto } from 'next/dist/server/web/sandbox/polyfills'
+import { Headers } from 'next/dist/server/web/spec-compliant/headers'
+import { streamToIterator } from 'next/dist/server/web/utils'
+import * as streams from 'web-streams-polyfill/ponyfill'
+
+class Implementation extends Body {
+ headers: Headers
+ constructor(init: BodyInit) {
+ super(init)
+ this.headers = new Headers()
+ }
+}
+
+beforeAll(() => {
+ global['Blob'] = Blob
+ global['crypto'] = new Crypto()
+ global['File'] = File
+ global['FormData'] = FormData
+ global['Headers'] = Headers
+ global['ReadableStream'] = streams.ReadableStream
+ global['TransformStream'] = streams.TransformStream
+})
+
+afterAll(() => {
+ delete global['Blob']
+ delete global['crypto']
+ delete global['File']
+ delete global['Headers']
+ delete global['FormData']
+ delete global['ReadableStream']
+ delete global['TransformStream']
+})
+
+it('flags the body as used after reading it', async () => {
+ const { readable, writable } = new TransformStream()
+ const encoder = new TextEncoder()
+ const writer = writable.getWriter()
+ writer.write(encoder.encode(''))
+ writer.close()
+
+ const body = new Implementation(readable)
+ expect(body.bodyUsed).toEqual(false)
+
+ const reader = body.body.getReader()
+ expect(body.bodyUsed).toEqual(false)
+
+ while (true) {
+ const { done } = await reader.read()
+ if (done) break
+ }
+
+ reader.releaseLock()
+ expect(body.bodyUsed).toEqual(true)
+})
+
+it('throws when the body was directly consumed', async () => {
+ global['crypto'].getRandomValues = (array: number[]) => array
+ const object = { hello: 'world' }
+ const blob = new Blob([JSON.stringify(object, null, 2)], {
+ type: 'application/json',
+ })
+
+ const formData = new FormData()
+ formData.append('name', 'John')
+ formData.append('lastname', 'Doe')
+ formData.append('metadata', blob)
+
+ const body = new Implementation(formData)
+
+ // Read the body through the stream
+ for await (const item of streamToIterator(body.body)) {
+ expect(item).toBeTruthy()
+ }
+
+ // It allows to access again the already read stream
+ const reader = body.body.getReader()
+ const { done } = await reader.read()
+ expect(done).toBeTruthy()
+
+ const error = await body.text().catch((err) => err)
+ expect(error).toBeInstanceOf(TypeError)
+ expect(error.message).toEqual(
+ 'Body has already been used. It can only be used once. Use tee() first if you need to read it twice.'
+ )
+})
+
+it('throws when the body was indirectly consumed', async () => {
+ global['crypto'].getRandomValues = (array: number[]) => array
+ const object = { hello: 'world' }
+ const blob = new Blob([JSON.stringify(object, null, 2)], {
+ type: 'application/json',
+ })
+
+ const formData = new FormData()
+ formData.append('name', 'John')
+ formData.append('lastname', 'Doe')
+ formData.append('metadata', blob)
+
+ const body = new Implementation(formData)
+ const text = await body.text()
+ expect(text).toBeTruthy()
+
+ const error = await body.text().catch((err) => err)
+ expect(error).toBeInstanceOf(TypeError)
+ expect(error.message).toEqual(
+ 'Body has already been used. It can only be used once. Use tee() first if you need to read it twice.'
+ )
+})
+
+it('allows to read a FormData body as text', async () => {
+ global['crypto'].getRandomValues = (array: number[]) => array
+ const object = { hello: 'world' }
+ const blob = new Blob([JSON.stringify(object, null, 2)], {
+ type: 'application/json',
+ })
+
+ const formData = new FormData()
+ formData.append('name', 'John')
+ formData.append('lastname', 'Doe')
+ formData.append('metadata', blob)
+
+ const body = new Implementation(formData)
+ const text = await body.text()
+ expect(text).toMatchInlineSnapshot(`
+"--0000000000000000000000000000000000000000000000000000000000000000
+Content-Disposition: form-data; name=\\"name\\"
+
+John
+--0000000000000000000000000000000000000000000000000000000000000000
+Content-Disposition: form-data; name=\\"lastname\\"
+
+Doe
+--0000000000000000000000000000000000000000000000000000000000000000
+Content-Disposition: form-data; name=\\"metadata\\"; filename=\\"blob\\"
+Content-Type: application/json
+
+{
+ \\"hello\\": \\"world\\"
+}
+--0000000000000000000000000000000000000000000000000000000000000000--
+
+"
+`)
+})
+
+it('allows to read a null body as ArrayBuffer', async () => {
+ const body = new Implementation(null)
+ const value = await body.arrayBuffer()
+ expect(new Uint8Array(value)).toHaveLength(0)
+})
+
+it('allows to read a text body as ArrayBuffer', async () => {
+ const body = new Implementation('Hello world')
+ const enc = new TextEncoder()
+ const dec = new TextDecoder()
+
+ const value = await body.arrayBuffer()
+ const decoded = dec.decode(value)
+ expect(decoded).toEqual('Hello world')
+ expect(value).toEqual(enc.encode('Hello world').buffer)
+})
+
+it('allows to read a chunked body as ArrayBuffer', async () => {
+ const { readable, writable } = new TransformStream()
+ const encoder = new TextEncoder()
+ const writer = writable.getWriter()
+ writer.write(encoder.encode('Hello '))
+ writer.write(encoder.encode('world!'))
+ writer.close()
+
+ const body = new Implementation(readable)
+ const value = await body.arrayBuffer()
+ const decoder = new TextDecoder()
+ const decoded = decoder.decode(value)
+ expect(decoded).toEqual('Hello world!')
+ expect(value).toEqual(encoder.encode('Hello world!').buffer)
+})
+
+it('allows to read a URLSearchParams body as FormData', async () => {
+ const params = new URLSearchParams('q=URLUtils.searchParams&topic=api')
+ const body = new Implementation(params)
+ const formData = await body.formData()
+ expect(formData.get('topic')).toEqual('api')
+})
+
+it('allows to read a Blob body as Blob', async () => {
+ const object = { hello: 'world' }
+ const str = JSON.stringify(object, null, 2)
+ const body = new Implementation(new Blob([str]))
+ const blob = await body.blob()
+ const txt = await blob.text()
+ expect(txt).toEqual(str)
+})
+
+it('allows to read a text body as JSON', async () => {
+ const body = new Implementation(JSON.stringify({ message: 'hi', value: 10 }))
+ const value = await body.json()
+ expect(value).toEqual({ message: 'hi', value: 10 })
+})
+
+it('throws when reading a text body as JSON but it is invalid', async () => {
+ const body = new Implementation('{ hi: "there", ')
+ const error = await body.json().catch((err) => err)
+ expect(error).toBeInstanceOf(TypeError)
+ expect(error.message).toEqual(
+ 'invalid json body reason: Unexpected token h in JSON at position 2'
+ )
+})
diff --git a/test/unit/web-runtime/request.test.ts b/test/unit/web-runtime/request.test.ts
new file mode 100644
index 0000000000000..5b549ce573c2c
--- /dev/null
+++ b/test/unit/web-runtime/request.test.ts
@@ -0,0 +1,37 @@
+/* eslint-env jest */
+
+import { Blob, File, FormData } from 'next/dist/compiled/formdata-node'
+import { Crypto } from 'next/dist/server/web/sandbox/polyfills'
+import { Headers } from 'next/dist/server/web/spec-compliant/headers'
+import { Request } from 'next/dist/server/web/spec-compliant/request'
+import * as streams from 'web-streams-polyfill/ponyfill'
+
+beforeAll(() => {
+ global['Blob'] = Blob
+ global['crypto'] = new Crypto()
+ global['File'] = File
+ global['FormData'] = FormData
+ global['Headers'] = Headers
+ global['ReadableStream'] = streams.ReadableStream
+ global['TransformStream'] = streams.TransformStream
+})
+
+afterAll(() => {
+ delete global['Blob']
+ delete global['crypto']
+ delete global['File']
+ delete global['Headers']
+ delete global['FormData']
+ delete global['ReadableStream']
+ delete global['TransformStream']
+})
+
+it('parses and reconstructs the URL alone', async () => {
+ const url = 'https://vercel.com/foo/bar?one=value'
+ const req = new Request(url)
+ expect(req.url).toEqual(url)
+})
+
+it('throws when the URL is malformed', async () => {
+ expect(() => new Request('meeeh')).toThrowError('Invalid URL')
+})
diff --git a/test/unit/web-runtime/response.test.ts b/test/unit/web-runtime/response.test.ts
new file mode 100644
index 0000000000000..797c6fb1b3075
--- /dev/null
+++ b/test/unit/web-runtime/response.test.ts
@@ -0,0 +1,42 @@
+/* eslint-env jest */
+
+import { Blob, File, FormData } from 'next/dist/compiled/formdata-node'
+import { Response } from 'next/dist/server/web/spec-compliant/response'
+import { Crypto } from 'next/dist/server/web/sandbox/polyfills'
+import { Headers } from 'next/dist/server/web/spec-compliant/headers'
+import * as streams from 'web-streams-polyfill/ponyfill'
+
+beforeAll(() => {
+ global['Blob'] = Blob
+ global['crypto'] = new Crypto()
+ global['File'] = File
+ global['FormData'] = FormData
+ global['Headers'] = Headers
+ global['ReadableStream'] = streams.ReadableStream
+ global['TransformStream'] = streams.TransformStream
+})
+
+afterAll(() => {
+ delete global['Blob']
+ delete global['crypto']
+ delete global['File']
+ delete global['Headers']
+ delete global['FormData']
+ delete global['ReadableStream']
+ delete global['TransformStream']
+})
+
+it('clones responses', async () => {
+ const { readable, writable } = new TransformStream()
+ const encoder = new TextEncoder()
+ const writer = writable.getWriter()
+ writer.write(encoder.encode('Hello '))
+ writer.write(encoder.encode('world!'))
+ writer.close()
+
+ const res1 = new Response(readable)
+ const res2 = res1.clone()
+
+ expect(await res1.text()).toEqual('Hello world!')
+ expect(await res2.text()).toEqual('Hello world!')
+})
diff --git a/test/unit/web-runtime/utils.test.ts b/test/unit/web-runtime/utils.test.ts
new file mode 100644
index 0000000000000..fce8f5483c000
--- /dev/null
+++ b/test/unit/web-runtime/utils.test.ts
@@ -0,0 +1,121 @@
+/* eslint-env jest */
+import { NextURL } from 'next/dist/server/web/next-url'
+
+it('has the right shape', () => {
+ const parsed = new NextURL('/about?param1=value1')
+ expect(parsed).toBeInstanceOf(URL)
+})
+
+it('allows to format relative urls', async () => {
+ const parsed = new NextURL('/about?param1=value1')
+ expect(parsed.basePath).toEqual('')
+ expect(parsed.hostname).toEqual('')
+ expect(parsed.host).toEqual('')
+ expect(parsed.href).toEqual('/about?param1=value1')
+
+ parsed.pathname = '/hihi'
+ expect(parsed.href).toEqual('/hihi?param1=value1')
+})
+
+it('allows to change the host of a relative url', () => {
+ const parsed = new NextURL('/about?param1=value1')
+ expect(parsed.hostname).toEqual('')
+ expect(parsed.host).toEqual('')
+ expect(parsed.href).toEqual('/about?param1=value1')
+
+ parsed.hostname = 'foo.com'
+ expect(parsed.hostname).toEqual('foo.com')
+ expect(parsed.host).toEqual('foo.com')
+ expect(parsed.href).toEqual('https://foo.com/about?param1=value1')
+ expect(parsed.toString()).toEqual('https://foo.com/about?param1=value1')
+})
+
+it('allows to change the hostname of a relative url', () => {
+ const url = new NextURL('/example')
+ url.hostname = 'foo.com'
+ expect(url.toString()).toEqual('https://foo.com/example')
+})
+
+it('allows to remove the hostname of an absolute url', () => {
+ const url = new NextURL('https://foo.com/example')
+ url.hostname = ''
+ expect(url.toString()).toEqual('/example')
+})
+
+it('allows to change the whole href of an absolute url', () => {
+ const url = new NextURL('https://localhost.com/foo')
+ expect(url.hostname).toEqual('localhost.com')
+ expect(url.protocol).toEqual('https:')
+ expect(url.host).toEqual('localhost.com')
+
+ url.href = '/foo'
+ expect(url.hostname).toEqual('')
+ expect(url.protocol).toEqual('')
+ expect(url.host).toEqual('')
+})
+
+it('allows to update search params', () => {
+ const url = new NextURL('/example')
+ url.searchParams.set('foo', 'bar')
+ expect(url.search).toEqual('?foo=bar')
+ expect(url.toString()).toEqual('/example?foo=bar')
+})
+
+it('parses and formats the basePath', () => {
+ const url = new NextURL('/root/example', {
+ basePath: '/root',
+ })
+
+ expect(url.basePath).toEqual('/root')
+ expect(url.pathname).toEqual('/example')
+ expect(url.toString()).toEqual('/root/example')
+
+ const url2 = new NextURL('https://foo.com/root/bar', {
+ basePath: '/root',
+ })
+
+ expect(url2.basePath).toEqual('/root')
+ expect(url2.pathname).toEqual('/bar')
+ expect(url2.toString()).toEqual('https://foo.com/root/bar')
+
+ url2.basePath = '/test'
+ expect(url2.basePath).toEqual('/test')
+ expect(url2.pathname).toEqual('/bar')
+ expect(url2.toString()).toEqual('https://foo.com/test/bar')
+
+ const url3 = new NextURL('https://foo.com/example', {
+ basePath: '/root',
+ })
+
+ expect(url3.basePath).toEqual('')
+
+ url3.href = '/root/example'
+ expect(url.basePath).toEqual('/root')
+ expect(url.pathname).toEqual('/example')
+ expect(url.toString()).toEqual('/root/example')
+})
+
+it('parses and formats the default locale', () => {
+ const url = new NextURL('/es/bar', {
+ basePath: '/root',
+ i18n: {
+ defaultLocale: 'en',
+ locales: ['en', 'es', 'fr'],
+ },
+ })
+
+ expect(url.locale).toEqual('es')
+ expect(url.toString()).toEqual('/es/bar')
+
+ url.basePath = '/root'
+ expect(url.locale).toEqual('es')
+ expect(url.toString()).toEqual('/root/es/bar')
+
+ url.locale = 'en'
+ expect(url.locale).toEqual('en')
+ expect(url.toString()).toEqual('/root/bar')
+
+ url.locale = 'fr'
+ expect(url.locale).toEqual('fr')
+ expect(url.toString()).toEqual('/root/fr/bar')
+})
diff --git a/yarn.lock b/yarn.lock
index f2be64e0a0488..51c1d51f8a470 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3899,6 +3899,34 @@
dependencies:
"@octokit/openapi-types" "^8.2.1"
+"@peculiar/asn1-schema@^2.0.32", "@peculiar/asn1-schema@^2.0.38":
+ version "2.0.38"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.0.38.tgz#98b6f12daad275ecd6774dfe31fb62f362900412"
+ integrity sha512-zZ64UpCTm9me15nuCpPgJghSdbEm8atcDQPCyK+bKXjZAQ1735NCZXCSCfbckbQ4MH36Rm9403n/qMq77LFDzQ==
+ dependencies:
+ "@types/asn1js" "^2.0.2"
+ asn1js "^2.1.1"
+ pvtsutils "^1.2.0"
+ tslib "^2.3.0"
+
+"@peculiar/json-schema@^1.1.12":
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339"
+ integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==
+ dependencies:
+ tslib "^2.0.0"
+
+"@peculiar/webcrypto@1.1.7":
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.1.7.tgz#ff02008612e67ab7cc2a92fce04a7f0e2a04b71c"
+ integrity sha512-aCNLYdHZkvGH+T8/YBOY33jrVGVuLIa3bpizeHXqwN+P4ZtixhA+kxEEWM1amZwUY2nY/iuj+5jdZn/zB7EPPQ==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.0.32"
+ "@peculiar/json-schema" "^1.1.12"
+ pvtsutils "^1.1.6"
+ tslib "^2.2.0"
+ webcrypto-core "^1.2.0"
+
"@polka/url@^1.0.0-next.9":
version "1.0.0-next.11"
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.11.tgz#aeb16f50649a91af79dbe36574b66d0f9e4d9f71"
@@ -4299,6 +4327,11 @@
resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.1.tgz#78b5433344e2f92e8b306c06a5622c50c245bf6b"
integrity sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==
+"@types/asn1js@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@types/asn1js/-/asn1js-2.0.2.tgz#bb1992291381b5f06e22a829f2ae009267cdf8c5"
+ integrity sha512-t4YHCgtD+ERvH0FyxvNlYwJ2ezhqw7t+Ygh4urQ7dJER8i185JPv6oIM3ey5YQmGN6Zp9EMbpohkjZi9t3UxwA==
+
"@types/async-retry@1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@types/async-retry/-/async-retry-1.2.1.tgz#fa9ac165907a8ee78f4924f4e393b656c65b5bb4"
@@ -4828,10 +4861,20 @@
version "0.2.1"
resolved "https://registry.yarnpkg.com/@types/text-table/-/text-table-0.2.1.tgz#39c4d4a058a82f677392dfd09976e83d9b4c9264"
+"@types/ua-parser-js@0.7.36":
+ version "0.7.36"
+ resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz#9bd0b47f26b5a3151be21ba4ce9f5fa457c5f190"
+ integrity sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==
+
"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
+"@types/uuid@8.3.1":
+ version "8.3.1"
+ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.1.tgz#1a32969cf8f0364b3d8c8af9cc3555b7805df14f"
+ integrity sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==
+
"@types/validate-npm-package-name@3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#0bc835adc7d6f41cf96a59b591fe8699468f6fab"
@@ -5870,6 +5913,13 @@ asn1@~0.2.3:
dependencies:
safer-buffer "~2.1.0"
+asn1js@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-2.1.1.tgz#bb3896191ebb5fb1caeda73436a6c6e20a2eedff"
+ integrity sha512-t9u0dU0rJN4ML+uxgN6VM2Z4H5jWIYm0w8LsZLzMJaQsgL3IJNbxHgmbWDvJAwspyHpDFuzUaUFh4c05UB4+6g==
+ dependencies:
+ pvutils latest
+
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
@@ -9674,6 +9724,14 @@ format@^0.2.0:
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
+formdata-node@4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.3.0.tgz#77be2add9092cbd1e1f4d35bc3293a89be117a04"
+ integrity sha512-TwqhWUZd2jB5l0kUhhcy1XYNsXq46NH6k60zmiu7xsxMztul+cCMuPSAQrSDV62zznhBKJdA9O+zeWj5i5Pbfg==
+ dependencies:
+ node-domexception "1.0.0"
+ web-streams-polyfill "4.0.0-beta.1"
+
formidable@^1.2.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659"
@@ -13855,6 +13913,11 @@ node-dir@^0.1.17:
dependencies:
minimatch "^3.0.2"
+node-domexception@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
+ integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
+
node-emoji@^1.8.1:
version "1.10.0"
resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da"
@@ -16154,6 +16217,18 @@ putasset@^5.0.3:
try-to-catch "^3.0.0"
yargs-parser "^18.1.1"
+pvtsutils@^1.1.6, pvtsutils@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.2.0.tgz#619e4767093d23cd600482600c16f4c36d3025bb"
+ integrity sha512-IDefMJEQl7HX0FP2hIKJFnAR11klP1js2ixCrOaMhe3kXFK6RQ2ABUCuwWaaD4ib0hSbh2fGTICvWJJhDfNecA==
+ dependencies:
+ tslib "^2.2.0"
+
+pvutils@latest:
+ version "1.0.17"
+ resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.0.17.tgz#ade3c74dfe7178944fe44806626bd2e249d996bf"
+ integrity sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==
+
q@^1.1.2, q@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
@@ -18818,6 +18893,11 @@ tslib@2.0.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e"
integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==
+tslib@^2.0.0, tslib@^2.3.0, tslib@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
+ integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+
tslib@^2.0.1, tslib@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
@@ -18949,6 +19029,11 @@ typescript@^4.1.3:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7"
integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==
+ua-parser-js@0.7.28:
+ version "0.7.28"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31"
+ integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==
+
uglify-js@^3.1.4:
version "3.7.3"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.3.tgz#f918fce9182f466d5140f24bb0ff35c2d32dcc6a"
@@ -19428,6 +19513,11 @@ utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+uuid@8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
uuid@^3.3.2:
version "3.3.3"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866"
@@ -19637,11 +19727,32 @@ web-streams-polyfill@2.1.1:
resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-2.1.1.tgz#2c82b6193849ccb9efaa267772c28260ef68d6d2"
integrity sha512-dlNpL2aab3g8CKfGz6rl8FNmGaRWLLn2g/DtSc9IjB30mEdE6XxzPfPSig5BwGSzI+oLxHyETrQGKjrVVhbLCg==
+web-streams-polyfill@3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.0.3.tgz#f49e487eedeca47a207c1aee41ee5578f884b42f"
+ integrity sha512-d2H/t0eqRNM4w2WvmTdoeIvzAUSpK7JmATB8Nr2lb7nQ9BTIJVjbQ/TRFVEh2gUH1HwclPdoPtfMoFfetXaZnA==
+
+web-streams-polyfill@4.0.0-beta.1:
+ version "4.0.0-beta.1"
+ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz#3b19b9817374b7cee06d374ba7eeb3aeb80e8c95"
+ integrity sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ==
+
web-vitals@2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.0.tgz#ebf5428875ab5bfc1056c2e80cd177001287de7b"
integrity sha512-npEyJP8jHf3J71t1tRTEtz9FeKp8H2udWJUUq5ykfPhhstr//TUxiYhIEzLNwk4zv2ybAilMn7v7N6Mxmuitmg==
+webcrypto-core@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.2.1.tgz#33f451a4c4faf159e74589436c80ca33998abad6"
+ integrity sha512-5+h1/e/A4eegCRTg+oQ9ehTJRTMwFhZazJ2RH1FP0VC3q1/0xl7x6SzzTwPxd/VTGc7kjuSEJGnfNgoLe5jNRQ==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.0.38"
+ "@peculiar/json-schema" "^1.1.12"
+ asn1js "^2.1.1"
+ pvtsutils "^1.2.0"
+ tslib "^2.3.1"
+
webidl-conversions@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"