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

+ Dog + Cat +
+) + +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 ( +
    +

    Hello {message}

    + +
    + ) +} + +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 ( +
    +

    Home Page

    + + Redirect me to a new version of a page + +
    + + Redirect me with URL params intact + +
    + + Redirect me to Google (with no body response) + +
    + + Redirect me to Google (with no stream response) + +
    + + Redirect me alot (chained requests) + +
    + + Redirect me alot (infinite loop) + +
    +
    + ) +} 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 ( +
    +

    Hello {message}

    + + Stream a response + +
    + + Stream a long response + + + Test streaming after response ends + +
    + + Attempt to add a header after stream ends + +
    + + Redirect to Google and attempt to stream after + +
    + + Respond with a header + +
    + + Respond with 2 headers (nested middleware effect) + +
    + + Respond with body, end, set a header + +
    + + Respond with body, end, send another body + +
    + + Respond with body + +
    + + Redirect and then send a body + +
    + + Send React component as a body + +
    + + Stream React component + +
    + + 404 + +
    +
    + ) +} + +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 ( +
    +

    Home Page

    +
    + + A/B test homepage + +
    + + Rewrite me to about + +
    + + Rewrite me to Vercel + +
    + + Redirect me to Vercel (but with double reroutes) + + + ) +} 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"