@muze-nl/metro-oidc 0.4.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +20 -12
- package/dist/browser.js.map +2 -2
- package/dist/browser.min.js +1 -1
- package/dist/browser.min.js.map +3 -3
- package/package.json +2 -2
package/dist/browser.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../node_modules/@muze-nl/metro/src/metro.mjs", "../node_modules/@muze-nl/metro/src/mw/json.mjs", "../node_modules/@muze-nl/metro/src/mw/thrower.mjs", "../node_modules/@muze-nl/metro/src/everything.mjs", "../node_modules/@muze-nl/assert/src/assert.mjs", "../node_modules/@muze-nl/metro-oauth2/src/tokenstore.mjs", "../node_modules/@muze-nl/metro-oauth2/src/oauth2.mjs", "../node_modules/@muze-nl/metro-oauth2/src/keysstore.mjs", "../node_modules/dpop/build/index.js", "../node_modules/@muze-nl/metro-oauth2/src/oauth2.dpop.mjs", "../src/oidc.util.mjs", "../src/oidc.discovery.mjs", "../src/oidc.register.mjs", "../src/oidc.store.mjs", "../src/oidcmw.mjs", "../src/browser.mjs"],
|
|
4
|
-
"sourcesContent": ["/**\n * base URL used to link to more information about an error message\n */\nconst metroURL = 'https://metro.muze.nl/details/'\n\n/**\n * Symbols:\n * - isProxy: used to test if an object is a metro Proxy to another object\n * - source: used to return the actual source (target) of a metro Proxy\n */\nif (!Symbol.metroProxy) {\n\tSymbol.metroProxy = Symbol('isProxy')\n}\nif (!Symbol.metroSource) {\n\tSymbol.metroSource = Symbol('source')\n}\n\n/**\n * Metro HTTP Client with middleware support\n * @method get\n * @method post\n * @method put\n * @method delete\n * @method patch\n * @method head\n * @method options\n * @method query\n * @method fetch\n */\nexport class Client\n{\n\tclientOptions = {\n\t\turl: typeof window != 'undefined' ? window.location : 'https://localhost',\n\t\tverbs: ['get','post','put','delete','patch','head','options','query']\n\t}\n\n\tstatic tracers = {}\n\n\t/**\n\t * @typedef {Object} ClientOptions\n\t * @property {Array} middlewares - list of middleware functions\n\t * @property {string|URL} url - default url of the client\n\t * @property {[string]} verbs - a list of verb methods to expose, e.g. ['get','post']\n\t * \n\t * Constructs a new metro client. Can have any number of params.\n\t * @params {ClientOptions|URL|Function|Client}\n\t * @returns {Client} - A metro client object with given or default verb methods\n\t */\n\tconstructor(...options)\n\t{\n\t\tfor (let option of options) {\n\t\t\tif (typeof option == 'string' || option instanceof String) {\n\t\t\t\tthis.clientOptions.url = ''+option\n\t\t\t} else if (option instanceof Function) {\n\t\t\t\tthis.#addMiddlewares([option])\n\t\t\t} else if (option && typeof option == 'object') {\n\t\t\t\tfor (let param in option) {\n\t\t\t\t\tif (param == 'middlewares') {\n\t\t\t\t\t\tthis.#addMiddlewares(option[param])\n\t\t\t\t\t} else if (typeof option[param] == 'function') {\n\t\t\t\t\t\tthis.clientOptions[param] = option[param](this.clientOptions[param], this.clientOptions)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.clientOptions[param] = option[param]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const verb of this.clientOptions.verbs) {\n\t\t\tthis[verb] = async function(...options) {\n\t\t\t\treturn this.fetch(request(\n\t\t\t\t\tthis.clientOptions,\n\t\t\t\t\t...options,\n\t\t\t\t\t{method: verb.toUpperCase()}\n\t\t\t\t))\n\t\t\t}\n\t\t}\n\t}\n\n\t#addMiddlewares(middlewares)\n\t{\n\t\tif (typeof middlewares == 'function') {\n\t\t\tmiddlewares = [ middlewares ]\n\t\t}\n\t\tlet index = middlewares.findIndex(m => typeof m != 'function')\n\t\tif (index>=0) {\n\t\t\tthrow metroError('metro.client: middlewares must be a function or an array of functions '\n\t\t\t\t+metroURL+'client/invalid-middlewares/', middlewares[index])\n\t\t}\n\t\tif (!Array.isArray(this.clientOptions.middlewares)) {\n\t\t\tthis.clientOptions.middlewares = []\n\t\t}\n\t\tthis.clientOptions.middlewares = this.clientOptions.middlewares.concat(middlewares)\n\t}\n\n\t/**\n\t * Mimics the standard browser fetch method, but uses any middleware installed through\n\t * the constructor.\n\t * @param {Request|string|Object} - Required. The URL or Request object, accepts all types that are accepted by metro.request\n\t * @param {Object} - Optional. Any object that is accepted by metro.request\n\t * @return {Promise<Response|*>} - The metro.response to this request, or any other result as changed by any included middleware.\n\t */\n\tfetch(req, options)\n\t{\n\t\treq = request(req, options)\n\t\tif (!req.url) {\n\t\t\tthrow metroError('metro.client.'+req.method.toLowerCase()+': Missing url parameter '+metroURL+'client/fetch-missing-url/', req)\n\t\t}\n\t\tif (!options) {\n\t\t\toptions = {}\n\t\t}\n\t\tif (!(typeof options === 'object') \n\t\t\t|| options instanceof String) \n\t\t{\n\t\t\tthrow metroError('metro.client.fetch: Invalid options parameter '+metroURL+'client/fetch-invalid-options/', options)\n\t\t}\n\n\t\tconst metrofetch = async function browserFetch(req)\n\t\t{\n\t\t\tif (req[Symbol.metroProxy]) {\n\t\t\t\treq = req[Symbol.metroSource]\n\t\t\t}\n\t\t\tconst res = await fetch(req)\n\t\t\treturn response(res)\n\t\t}\n\t\t\n\t\tlet middlewares = [metrofetch].concat(this.clientOptions?.middlewares?.slice() || [])\n\t\toptions = Object.assign({}, this.clientOptions, options)\n\t\t//@TODO: do this once in constructor?\n\t\tlet next\n\t\tfor (let middleware of middlewares) {\n\t\t\tnext = (function(next, middleware) {\n\t\t\t\treturn async function(req) {\n\t\t\t\t\tlet res\n\t\t\t\t\tlet tracers = Object.values(Client.tracers)\n\t\t\t\t\tfor(let tracer of tracers) {\n\t\t\t\t\t\tif (tracer.request) {\n\t\t\t\t\t\t\ttracer.request.call(tracer, req, middleware)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tres = await middleware(req, next)\n\t\t\t\t\tfor(let tracer of tracers) {\n\t\t\t\t\t\tif (tracer.response) {\n\t\t\t\t\t\t\ttracer.response.call(tracer, res, middleware)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn res\n\t\t\t\t}\t\t\t\t\t\t\t\t\n\t\t\t})(next, middleware)\n\t\t}\n\t\treturn next(req)\n\t}\n\n\twith(...options) {\n\t\treturn new Client(deepClone(this.clientOptions), ...options)\n\t}\n}\n\n/**\n * Returns a new metro Client object.\n * @param {...ClientOptions|string|URL}\n * @return Client\n */\nexport function client(...options)\n{\n\treturn new Client(...deepClone(options))\n}\n\nfunction appendHeaders(r, headers)\n{\n\tif (!Array.isArray(headers)) {\n\t\theaders = [headers]\n\t}\n\theaders.forEach((header) => {\n\t\tif (typeof header == 'function') {\n\t\t\tlet result = header(r.headers, r)\n\t\t\tif (result) {\n\t\t\t\tif (!Array.isArray(result)) {\n\t\t\t\t\tresult = [result]\n\t\t\t\t}\n\t\t\t\theaders = headers.concat(result)\n\t\t\t}\n\t\t}\n\t})\n\theaders.forEach((header) => {\n\t\tObject.entries(header).forEach(([name,value]) => {\t\t\t\n\t\t\tr.headers.append(name, value)\n\t\t})\n\t})\n}\n\nfunction getRequestParams(req, current)\n{\n\tlet params = current || {}\n\tif (!params.url && current.url) {\n\t\tparams.url = current.url\n\t}\n\t// function to fetch all relevant properties of a Request\n\tfor(let prop of ['method','headers','body','mode','credentials','cache','redirect',\n\t\t'referrer','referrerPolicy','integrity','keepalive','signal',\n\t\t'priority','url']) {\n\t\tlet value = req[prop]\n\t\tif (typeof value=='undefined' || value == null) {\n\t\t\tcontinue\n\t\t}\n\t\tif (value?.[Symbol.metroProxy]) {\n\t\t\tvalue = value[Symbol.metroSource]\n\t\t}\n\t\tif (typeof value == 'function') {\n\t\t\tparams[prop] = value(params[prop], params)\n\t\t} else {\n\t\t\tif (prop == 'url') {\n\t\t\t\tparams.url = url(params.url, value)\n\t\t\t} else if (prop == 'headers') {\n\t\t\t\tparams.headers = new Headers(current.headers)\n\t\t\t\tif (!(value instanceof Headers)) {\n\t\t\t\t\tvalue = new Headers(req.headers)\n\t\t\t\t}\n\t\t\t\tfor (let [key, val] of value.entries()) {\n\t\t\t\t\tparams.headers.set(key, val)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams[prop] = value\n\t\t\t}\n\t\t}\n\t}\n\tif (req instanceof Request && req.data) {\n\t\t// Request.body is always transformed into ReadableStreem\n\t\t// metro.request.data is the original body passed to Request()\n\t\tparams.body = req.data\n\t}\n\treturn params\n}\n\n/**\n * @typedef {Request} MetroRequest\n * @property {Symbol(source)} - returns the target Request of this Proxy\n * @property {Symbol(isProxy)} - returns true\n * @method with - returns a new MetroRequest, with the given options added\n * @param {<RequestOptions|Request|string|URL|URLSearchParams|FormData|ReadableStream|\n * Blob|ArrayBuffer|DataView|TypedArray>} ...options - request options, handled in order\n * \n * Returns a new metro Request object\n * @param {<RequestOptions|Request|string|URL|URLSearchParams|FormData|ReadableStream|\n * Blob|ArrayBuffer|DataView|TypedArray>} ...options - request options, handled in order\n * @return {MetroRequest} - a new metro Request object\n */\nexport function request(...options)\n{\n\t// the standard Request constructor is a minefield\n\t// so first gather all the options together into a single\n\t// javascript object, then set it in one go\n\tlet requestParams = {\n\t\turl: typeof window != 'undefined' ? window.location : 'https://localhost/',\n\t\tduplex: 'half' // required when setting body to ReadableStream, just set it here by default already\n\t}\n\tfor (let option of options) {\n\t\tif (typeof option == 'string'\n\t\t\t|| option instanceof URL\n\t\t\t|| option instanceof URLSearchParams\n\t\t) {\n\t\t\trequestParams.url = url(requestParams.url, option)\n\t\t} else if (option && (\n\t\t\toption instanceof FormData\n\t\t\t|| option instanceof ReadableStream\n\t\t\t|| option instanceof Blob\n\t\t\t|| option instanceof ArrayBuffer\n\t\t\t|| option instanceof DataView\n\t\t)) {\n\t\t\trequestParams.body = option\n\t\t} else if (option && typeof option == 'object') {\n\t\t\tObject.assign(requestParams, getRequestParams(option, requestParams))\n\t\t}\n\t}\n\tlet r = new Request(requestParams.url, requestParams)\n\tlet data = requestParams.body\n\tif (data) {\n\t\tif (typeof data == 'object'\n\t\t\t&& !(data instanceof String)\n\t\t\t&& !(data instanceof ReadableStream)\n\t\t\t&& !(data instanceof Blob)\n\t\t\t&& !(data instanceof ArrayBuffer)\n\t\t\t&& !(data instanceof DataView)\n\t\t\t&& !(data instanceof FormData)\n\t\t\t&& !(data instanceof URLSearchParams)\n\t\t\t&& (typeof TypedArray=='undefined' || !(data instanceof TypedArray))\n\t\t) {\n\t\t\t// if we are here, body is set with an object of a type\n\t\t\t// not natively understood by Request, coerce it to a string\n\t\t\t// using toString({headers}) instead of just toString()\n\t\t\tif (typeof data.toString == 'function') {\n\t\t\t\trequestParams.body = data.toString({headers:r.headers})\n\t\t\t\tr = new Request(requestParams.url, requestParams)\n\t\t\t}\n\t\t}\n\t}\n\tObject.freeze(r)\n\treturn new Proxy(r, {\n\t\tget(target, prop, receiver) {\n\t\t\tswitch(prop) {\n\t\t\t\tcase Symbol.metroSource:\n\t\t\t\t\treturn target\n\t\t\t\tbreak\n\t\t\t\tcase Symbol.metroProxy:\n\t\t\t\t\treturn true\n\t\t\t\tbreak\n\t\t\t\tcase 'with':\n\t\t\t\t\treturn function(...options) {\n\t\t\t\t\t\tif (data) { // data is kept in a seperate value, if it set earlier\n\t\t\t\t\t\t\toptions.unshift({ body: data }) // unshifted so it can be overridden by options\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn request(target, ...options)\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t\tcase 'data':\n\t\t\t\t\treturn data\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (target[prop] instanceof Function) {\n\t\t\t\tif (prop === 'clone') {\n\t\t\t\t\t// TODO: set req.data as the body of the clone\n\t\t\t\t}\n\t\t\t\treturn target[prop].bind(target)\n\t\t\t}\n\t\t\treturn target[prop]\n\t\t}\n\t})\n}\n\nfunction getResponseParams(res, current)\n{\n\t// function to fetch all relevant properties of a Response\n\tlet params = current || {}\n\tif (!params.url && current.url) {\n\t\tparams.url = current.url\n\t}\n\tfor(let prop of ['status','statusText','headers','body','url','type','redirected']) {\n\t\tlet value = res[prop]\n\t\tif (typeof value == 'undefined' || value == null) {\n\t\t\tcontinue\n\t\t}\n\t\tif (value?.[Symbol.metroProxy]) {\n\t\t\tvalue = value[Symbol.metroSource]\n\t\t}\n\t\tif (typeof value == 'function') {\n\t\t\tparams[prop] = value(params[prop], params)\n\t\t} else {\n\t\t\tif (prop == 'url') {\n\t\t\t\tparams.url = new URL(value, params.url || 'https://localhost/')\n\t\t\t} else {\n\t\t\t\tparams[prop] = value\n\t\t\t}\n\t\t}\n\t}\n\tif (res instanceof Response && res.data) {\n\t\t// Response.body is always transformed into ReadableStreem FIXME: check this\n\t\t// metro.response.data is the original body passed to Response()\n\t\tparams.body = res.data\n\t}\n\treturn params\n}\n\n/**\n * @typedef {Response} MetroResponse\n * @property {Symbol(source)} - returns the target Response of this Proxy\n * @property {Symbol(isProxy)} - returns true\n * @method with - returns a new MetroResponse, with the given options added\n * @param {<ResponseOptions|Response|string|URLSearchParams|FormData|ReadableStream|\n * Blob|ArrayBuffer|DataView|TypedArray>} ...options - respomse options, handled in order\n * \n * Returns a new metro Response object\n * @param {<ResponseOptions|Response|string|URLSearchParams|FormData|ReadableStream|\n * Blob|ArrayBuffer|DataView|TypedArray>} ...options - request options, handled in order\n * @return {MetroResponse} - a new metro Response object\n */\nexport function response(...options)\n{\n\tlet responseParams = {}\n\tfor (let option of options) {\n\t\tif (typeof option == 'string') {\n\t\t\tresponseParams.body = option\n\t\t} else if (option instanceof Response) {\n\t\t\tObject.assign(responseParams, getResponseParams(option, responseParams))\n\t\t} else if (option && typeof option == 'object') {\n\t\t\tif (option instanceof FormData\n\t\t\t\t|| option instanceof Blob\n\t\t\t\t|| option instanceof ArrayBuffer\n\t\t\t\t|| option instanceof DataView\n\t\t\t\t|| option instanceof ReadableStream\n\t\t\t\t|| option instanceof URLSearchParams\n\t\t\t\t|| option instanceof String\n\t\t\t\t|| (typeof TypedArray != 'undefined' && option instanceof TypedArray)\n\t\t\t) {\n\t\t\t\tresponseParams.body = option\n\t\t\t} else {\n\t\t\t\tObject.assign(responseParams, getResponseParams(option, responseParams))\n\t\t\t}\n\t\t}\n\t}\n\tlet data = undefined\n\tif (responseParams.body) {\n\t\tdata = responseParams.body\n\t}\n\t// if response status is 'null body status', don't set a body\n\t// that is response.status in [101, 204, 205, 304 ] \n\t// see: https://fetch.spec.whatwg.org/#statuses\n\tif ([101, 204, 205, 304 ].includes(responseParams.status)) {\n\t\tresponseParams.body = null\n\t}\n\tlet r = new Response(responseParams.body, responseParams)\t\n\tObject.freeze(r)\n\treturn new Proxy(r, {\n\t\tget(target, prop, receiver) {\n\t\t\tswitch(prop) {\n\t\t\t\tcase Symbol.metroProxy:\n\t\t\t\t\treturn true\n\t\t\t\tbreak\n\t\t\t\tcase Symbol.metroSource:\n\t\t\t\t\treturn target\n\t\t\t\tbreak\n\t\t\t\tcase 'with':\n\t\t\t\t\treturn function(...options) {\n\t\t\t\t\t\treturn response(target, ...options)\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t\tcase 'data':\n\t\t\t\t\t// body is turned into ReadableStream\n\t\t\t\t\t// data is the original body param\n\t\t\t\t\treturn data\n\t\t\t\tbreak\n\t\t\t\tcase 'ok':\n\t\t\t\t\treturn (target.status>=200) && (target.status<400)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (typeof target[prop] == 'function') {\n\t\t\t\treturn target[prop].bind(target)\n\t\t\t}\n\t\t\treturn target[prop]\n\t\t}\n\t})\n}\n\nfunction appendSearchParams(url, params) {\n\tif (typeof params == 'function') {\n\t\t params(url.searchParams, url)\n\t} else {\n\t\tparams = new URLSearchParams(params)\n\t\tparams.forEach((value,key) => {\n\t\t\turl.searchParams.append(key, value)\n\t\t})\n\t}\n}\n\n/**\n * @typedef {URL} MetroURL\n * @property {Symbol(source)} - returns the target Request of this Proxy\n * @property {Symbol(isProxy)} - returns true\n * @method with - returns a new MetroRequest, with the given options added\n * @param {<URL|URLSearchParams|string|Object|Function>} ...options - url options, handled in order\n * \n * Returns a new metro URL object\n * @param {<URL|URLSearchParams|string|Object|Function>} ...options - url options, handled in order\n * @return {MetroURL} - a new metro URL object\n */\nexport function url(...options)\n{\n\tlet validParams = ['hash','host','hostname','href',\n\t\t\t'password','pathname','port','protocol','username','search','searchParams']\n\tlet u = new URL('https://localhost/')\n\tfor (let option of options) {\n\t\tif (typeof option == 'string' || option instanceof String) {\n\t\t\t// option is a relative or absolute url\n\t\t\tu = new URL(option, u)\n\t\t} else if (option instanceof URL \n\t\t\t|| (typeof Location != 'undefined' \n\t\t\t\t&& option instanceof Location)\n\t\t) {\n\t\t\tu = new URL(option)\n\t\t} else if (option instanceof URLSearchParams) {\n\t\t\tappendSearchParams(u, option)\n\t\t} else if (option && typeof option == 'object') {\n\t\t\tfor (let param in option) {\n\t\t\t\tswitch(param) {\n\t\t\t\t\tcase 'search':\n\t\t\t\t\t\tif (typeof option.search == 'function') {\n\t\t\t\t\t\t\toption.search(u.search, u)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tu.search = new URLSearchParams(option.search)\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t\tcase 'searchParams':\n\t\t\t\t\t\tappendSearchParams(u, option.searchParams)\n\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (!validParams.includes(param)) {\n\t\t\t\t\t\t\tthrow metroError('metro.url: unknown url parameter '+metroURL+'url/unknown-param-name/', param)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof option[param] == 'function') {\n\t\t\t\t\t\t\toption[param](u[param], u)\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof option[param] == 'string' || option[param] instanceof String \n\t\t\t\t\t\t\t|| typeof option[param] == 'number' || option[param] instanceof Number\n\t\t\t\t\t\t\t|| typeof option[param] == 'boolean' || option[param] instanceof Boolean\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tu[param] = ''+option[param]\n\t\t\t\t\t\t} else if (typeof option[param] == 'object' && option[param].toString) {\n\t\t\t\t\t\t\tu[param] = option[param].toString()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow metroError('metro.url: unsupported value for '+param+' '+metroURL+'url/unsupported-param-value/', options[param])\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow metroError('metro.url: unsupported option value '+metroURL+'url/unsupported-option-value/', option)\n\t\t}\n\t}\n\tObject.freeze(u)\n\treturn new Proxy(u, {\n\t\tget(target, prop, receiver) {\n\t\t\tlet result\n\t\t\tswitch(prop) {\n\t\t\t\tcase Symbol.metroProxy:\n\t\t\t\t\treturn true\n\t\t\t\tbreak\n\t\t\t\tcase Symbol.metroSource:\n\t\t\t\t\treturn target\n\t\t\t\tbreak\n\t\t\t\tcase 'with':\n\t\t\t\t\treturn function(...options) {\n\t\t\t\t\t\treturn url(target, ...options)\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t\tcase 'filename':\n\t\t\t\t\treturn target.pathname.split('/').pop()\n\t\t\t\tbreak\n\t\t\t\tcase 'folderpath':\n\t\t\t\t\treturn target.pathname.substring(0,target.pathname.lastIndexOf('\\\\')+1)\n\t\t\t\tbreak\n\t\t\t\tcase 'authority':\n\t\t\t\t\tresult = target.username ?? ''\n\t\t\t\t\tresult += target.password ? ':'+target.password : ''\n\t\t\t\t\tresult += result ? '@' : ''\n\t\t\t\t\tresult += target.hostname\n\t\t\t\t\tresult += target.port ? ':'+target.port : ''\n\t\t\t\t\tresult += '/'\n\t\t\t\t\tresult = target.protocol + '//' + result\n\t\t\t\t\treturn result\n\t\t\t\tbreak;\n\t\t\t\tcase 'origin':\n\t\t\t\t\tresult = target.protocol + '//' + target.hostname\n\t\t\t\t\tresult += target.port ? ':' + target.port : ''\n\t\t\t\t\tresult += '/'\n\t\t\t\t\treturn result\n\t\t\t\tbreak\n\t\t\t\tcase 'fragment':\n\t\t\t\t\treturn target.hash.substring(1)\n\t\t\t\tbreak\n\t\t\t\tcase 'scheme':\n\t\t\t\t\tif (target.protocol) {\n\t\t\t\t\t\treturn target.protocol.substring(0, target.protocol.length-1)\n\t\t\t\t\t}\n\t\t\t\t\treturn ''\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (target[prop] instanceof Function) {\n\t\t\t\treturn target[prop].bind(target)\n\t\t\t}\n\t\t\treturn target[prop]\n\t\t}\n\t})\n}\n\n/**\n * @typedef {FormData} MetroFormData\n * @property {Symbol(source)} - returns the target Request of this Proxy\n * @property {Symbol(isProxy)} - returns true\n * @method with - returns a new MetroRequest, with the given options added\n * @param {<FormData|Object>} ...options - url options, handled in order\n * \n * Returns a new metro FormData object\n * @param {<FormData|Object>} ...options - formdata options, handled in order\n * @return {MetroURL} - a new metro FormData object\n */\nexport function formdata(...options)\n{\n\tvar params = new FormData()\n\tfor (let option of options) {\n\t\tif (option instanceof HTMLFormElement) {\n\t\t\toption = new FormData(option)\n\t\t}\n\t\tif (option instanceof FormData) {\n\t\t\tfor (let entry of option.entries()) {\n\t\t\t\tparams.append(entry[0],entry[1])\n\t\t\t}\n\t\t} else if (option && typeof option == 'object') {\n\t\t\tfor (let entry of Object.entries(option)) {\n\t\t\t\tif (Array.isArray(entry[1])) {\n\t\t\t\t\tfor (let value of entry[1]) {\n\t\t\t\t\t\tparams.append(entry[0], value)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tparams.append(entry[0],entry[1])\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new metroError('metro.formdata: unknown option type '+metroURL+'formdata/unknown-option-value/', option)\n\t\t}\n\t}\n\tObject.freeze(params)\n\treturn new Proxy(params, {\n\t\tget: (target,prop,receiver) => {\n\t\t\tswitch(prop) {\n\t\t\t\tcase Symbol.metroProxy:\n\t\t\t\t\treturn true\n\t\t\t\tbreak\n\t\t\t\tcase Symbol.metroSource:\n\t\t\t\t\treturn target\n\t\t\t\tbreak\n\t\t\t\t//TODO: add toString() that can check\n\t\t\t\t//headers param: toString({headers:request.headers})\n\t\t\t\t//for the content-type\n\t\t\t\tcase 'with':\n\t\t\t\t\treturn function(...options) {\n\t\t\t\t\t\treturn formdata(target, ...options)\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (target[prop] instanceof Function) {\n\t\t\t\treturn target[prop].bind(target)\n\t\t\t}\n\t\t\treturn target[prop]\n\t\t}\n\t})\n}\n\nconst metroConsole = {\n\terror: (message, ...details) => {\n\t\tconsole.error('\u24C2\uFE0F ',message, ...details)\n\t},\n\tinfo: (message, ...details) => {\n\t\tconsole.info('\u24C2\uFE0F ',message, ...details)\n\t},\n\tgroup: (name) => {\n\t\tconsole.group('\u24C2\uFE0F '+name)\n\t},\n\tgroupEnd: (name) => {\n\t\tconsole.groupEnd('\u24C2\uFE0F '+name)\n\t}\n}\n\n\n/**\n * Custom Metro Error function that outputs to the console then throws an error\n */\nexport function metroError(message, ...details) {\n\tmetroConsole.error(message, ...details)\n\treturn new Error(message, ...details)\n}\n\n/**\n * Set of debugging tools to trace the request - response flow\n * Tracer are run on all metro fetch calls\n */\nexport const trace = {\n\t/**\n\t * Adds a named tracer function\n\t * @param {string} name - the name of the tracer\n\t * @param {Function} tracer - the tracer function to call\n\t */\n\tadd(name, tracer) {\n\t\tClient.tracers[name] = tracer\n\t},\n\t/**\n\t * Removes a named tracer function\n\t * @param {string} name\n\t */\n\tdelete(name) {\n\t\tdelete Client.tracers[name]\n\t},\n\t/**\n\t * Removes all tracer functions\n\t */\n\tclear() {\n\t\tClient.tracers = {}\n\t},\n\t/**\n\t * Returns a set of request and response tracer functions that use the\n\t * console.group feature to shows nested request/response pairs, with\n\t * most commonly needed information for debugging\n\t */\n\tgroup() {\n\t\tlet group = 0;\n\t\treturn {\n\t\t\trequest: (req, middleware) => {\n\t\t\t\tgroup++\n\t\t\t\tmetroConsole.group(group)\n\t\t\t\tmetroConsole.info(req?.url, req, middleware)\n\t\t\t},\n\t\t\tresponse: (res, middleware) => {\n\t\t\t\tmetroConsole.info(res?.body ? res.body[Symbol.metroSource]: null, res, middleware)\n\t\t\t\tmetroConsole.groupEnd(group)\n\t\t\t\tgroup--\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function deepClone(object) {\n\tif (Array.isArray(object)) {\n\t\treturn object.slice().map(deepClone)\n\t}\n\tif (object && typeof object==='object') {\n\t\tif (object.__proto__.constructor==Object || !object.__proto__) { // plain objects\n\t\t\tlet result = Object.assign({}, object)\n\t\t\tObject.keys(result).forEach(key => {\n\t\t\t\tresult[key] = deepClone(object[key])\n\t\t\t})\n\t\t\treturn result\n\t\t} else {\n\t\t\treturn object // don't clone custom classes or functions\n\t\t}\n\t}\n\treturn object\n}", "import * as metro from '../metro.mjs'\n\nexport default function jsonmw(options) {\n\toptions = Object.assign({\n\t\tmimetype: 'application/json',\n\t\treviver: null,\n\t\treplacer: null,\n\t\tspace: ''\n\t}, options)\n\n\treturn async function json(req, next) {\n\t\tif (!isJSON(req.headers.get('Accept'))) {\n\t\t\treq = req.with({\n\t\t\t\theaders: {\n\t 'Accept': options.mimetype\n\t }\n\t })\n\t\t}\n\t\tif (['POST','PUT','PATCH','QUERY'].includes(req.method)) {\n\t\t\tif (req.data && typeof req.data=='object' && !(req.data instanceof ReadableStream)) {\n\t\t\t\tif (!isJSON(req.headers.get('content-type'))) {\n\t\t\t\t\treq = req.with({\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Content-Type':options.mimetype,\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\treq = req.with({\n\t\t\t\t\tbody: JSON.stringify(req.data, options.replacer, options.space)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tlet res = await next(req)\n\t\tif (isJSON(res.headers.get('content-type'))) {\n\t\t\tlet tempRes = res.clone()\n\t\t\tlet body = await tempRes.text()\n\t\t\ttry {\n\t\t\t\tlet json = JSON.parse(body, options.reviver)\n\t\t\t\treturn res.with({\n\t\t\t\t\tbody: json\n\t\t\t\t})\n\t\t\t} catch(e) {\n\t\t\t\t// ignore parse errors\n\t\t\t}\n\t\t} \n\t\treturn res\n\t}\n}\n\nconst jsonRE = /^application\\/([a-zA-Z0-9\\-_]+\\+)?json\\b/\nfunction isJSON(contentType) {\n\treturn jsonRE.exec(contentType)\n}", "import * as metro from '../metro.mjs'\n\nexport default function throwermw(options) {\n\n\treturn async function thrower(req, next) {\n\t\tlet res = await next(req)\n\t\tif (!res.ok) {\n\t\t\tif (options && typeof options[res.status] == 'function') {\n\t\t\t\tres = options[res.status].apply(res, req)\n\t\t\t} else {\n\t\t\t\tthrow new Error(res.status+': '+res.statusText, {\n\t\t\t\t\tcause: res\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\treturn res\n\t}\n\n}", "import * as m from './metro.mjs'\nimport jsonmw from './mw/json.mjs'\nimport thrower from './mw/thrower.mjs'\n\nconst metro = Object.assign({}, m, {\n\tmw: {\n\t\tjsonmw,\n\t\tthrower\n\t}\n})\n\nif (!globalThis.metro) {\n\tglobalThis.metro = metro\n}\n\nexport default metro", "/*\nTODO: add assertExplain global flag, so that if assert() fails, you can call explain() with\n the same pattern and it will return text explanation of why it failed, each assertion function must \n then check assertExplain, and return a text explanation of what fails or succeeds\n top level can then filter to show only the failures\n (so that not(x) can show the succeeds message of x)\n*/\n\n/**\n * assertEnabled (Boolean) used to toggle whether the assert()\n * method should test assertions or not.\n */\nglobalThis.assertEnabled = false\n\n/**\n * Enables assertion testing with assert()\n */\nexport function enable() {\n\tglobalThis.assertEnabled = true\n}\n\n/**\n * Disables assertion testing with assert()\n */\nexport function disable() {\n\tglobalThis.assertEnabled = false\n}\n\n/**\n * This function will check the source for the assertions in test, if\n * assertion checking is enabled globally.\n * If it is, and any assertion fails, it will throw an assertError\n * with a list of problems and other details.\n */\nexport function assert(source, test) {\n\tif (globalThis.assertEnabled) {\n\t\tlet problems = fails(source,test)\n\t\tif (problems) {\n\t\t\tconsole.error('\uD83C\uDD70\uFE0F Assertions failed because of:', problems, 'in this source:', source)\n\t\t\tthrow new Error('Assertions failed', {\n\t\t\t\tcause: { problems, source } \n\t\t\t})\n\t\t}\n\t}\n}\n\n/**\n * Tests a given value against a pattern, only if the value is not null or undefined\n */\nexport function Optional(pattern) {\n\treturn function _Optional(data, root, path) {\n\t\tif (typeof data != 'undefined' && data!=null && typeof pattern != 'undefined' ) {\n\t\t\treturn fails(data, pattern, root, path)\n\t\t}\n\t}\n}\n\n/**\n * Tests a given value against a pattern, always.\n */\nexport function Required(pattern) {\n\treturn function _Required(data, root, path) {\n\t\tif (data==null || typeof data == 'undefined') {\n\t\t\treturn error('data is required', data, pattern || 'any value', path)\n\t\t} else if (typeof pattern != 'undefined') {\n\t\t\treturn fails(data, pattern, root, path)\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n}\n\n/**\n * Tests a given value against a pattern, only if the value is not null or undefined\n * If null or undefined, it does print a warning to the console.\n */\nexport function Recommended(pattern) {\n\treturn function _Recommended(data, root, path) {\n\t\tif (data==null || typeof data == 'undefined') {\n\t\t\twarn('data does not contain recommended value', data, pattern, path)\n\t\t\treturn false\n\t\t} else {\n\t\t\treturn fails(data, pattern, root, path)\n\t\t}\n\t}\n}\n\n/**\n * Tests a given value against a set of patterns, untill one succeeds\n * Returns an error if none succeed\n */\nexport function oneOf(...patterns) { \n\treturn function _oneOf(data, root, path) {\n\t\tfor(let pattern of patterns) {\n\t\t\tif (!fails(data, pattern, root, path)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn error('data does not match oneOf patterns', data, patterns, path)\n\t}\n}\n\n/**\n * Tests a given array of values against a set of patterns\n * If any value does not match one of the patterns, it will return an error\n * If not given an array to test, it will return an error\n */\nexport function anyOf(...patterns) {\n\treturn function _anyOf(data, root, path) {\n\t\tif (!Array.isArray(data)) {\n\t\t\treturn error('data is not an array',data,'anyOf',path)\n\t\t}\n\t\tfor (let value of data) {\n\t\t\tif (oneOf(...patterns)(value)) {\n\t\t\t\treturn error('data does not match anyOf patterns',value,patterns,path)\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n}\n\nexport function allOf(...patterns) {\n\treturn function _allOf(data, root, path) {\n\t\tlet problems = []\n\t\tfor (let pattern of patterns) {\n\t\t\tproblems = problems.concat(fails(data, pattern, root, path))\n\t\t}\n\t\tproblems = problems.filter(Boolean)\n\t\tif (problems.length) {\n\t\t\treturn error('data does not match all given patterns', data, patterns, path, problems)\n\t\t}\n\t}\n}\n\n/**\n * Tests a given value to see if it is a valid (and absolute) URL, by\n * parsing it with the URL() constructor, and then testing the href\n * value to be equal to the initial value.\n */\nexport function validURL(data, root, path) {\n\ttry {\n\t\tif (data instanceof URL) {\n\t\t\tdata = data.href\n\t\t}\n\t\tlet url = new URL(data)\n\t\tif (url.href!=data) {\n\t\t\tif (!(url.href+'/'==data || url.href==data+'/')) {\n\t\t\t\t// new URL() always adds a / as path\n\t\t\t\treturn error('data is not a valid url',data,'validURL',path)\n\t\t\t}\n\t\t}\n\t} catch(e) {\n\t\treturn error('data is not a valid url',data,'validURL',path)\n\t}\n}\n\n/**\n * Tests a given value to see if it looks like a valid email address, by\n * testing it against a regular expression. So there are no guarantees that\n * it is an actual working email address, just that it looks like one.\n */\nexport function validEmail(data, root, path) {\n\tif (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(data)) {\n\t\treturn error('data is not a valid email',data,'validEmail',path)\n\t}\n}\n\n/**\n * Tests a given value to see if it is an object which is an instance of the given\n * constructor\n */\nexport function instanceOf(constructor) {\n\treturn function _instanceOf(data, root, path) {\n\t\tif (!(data instanceof constructor)) {\n\t\t\treturn error('data is not an instanceof pattern',data,constructor,path)\n\t\t}\n\t}\n}\n\n/**\n * Runs the given test pattern on a value, if the test succeeds, it fails\n * the not() test.\n */\nexport function not(pattern) {\n\treturn function _not(data, root, path) {\n\t\tif (!fails(data, pattern, root, path)) {\n\t\t\treturn error('data matches pattern, when required not to', data, pattern, path)\n\t\t}\n\t}\n}\n\n/**\n * returns an array of problems if the data fails to satisfy \n * the assertions in the given pattern, false otherwise\n * @param {any} data The data to match\n * @param {any} pattern The pattern to match\n * @param {any} root Root object for assertions, set to data by default\n * @return {Array|false} Array with problems if the pattern fails, false otherwise\n */\nexport function fails(data, pattern, root, path='') {\n\tif (!root) {\n\t\troot = data\n\t}\n\tlet problems = []\n\tif (pattern === Boolean) {\n\t\tif (typeof data != 'boolean' && !(data instanceof Boolean)) {\n\t\t\tproblems.push(error('data is not a boolean', data, pattern, path))\n\t\t}\t\t\n\t} else if (pattern === Number) {\n\t\tif (typeof data != 'number' && !(data instanceof Number)) {\n\t\t\tproblems.push(error('data is not a number', data, pattern, path))\n\t\t}\n\t} else if (pattern === String) {\n\t\tif (typeof data != 'string' && !(data instanceof String)) {\n\t\t\tproblems.push(error('data is not a string', data, pattern, path))\n\t\t}\n\t\tif (data == \"\") {\n\t\t\tproblems.push(error('data is an empty string, which is not allowed', data, pattern, path))\n\t\t}\n\t} else if (pattern instanceof RegExp) {\n \tif (Array.isArray(data)) {\n\t\t\tlet index = data.findIndex((element,index) => fails(element,pattern,root,path+'['+index+']'))\n if (index>-1) {\n \tproblems.push(error('data['+index+'] does not match pattern', data[index], pattern, path+'['+index+']'))\n }\n } else if (typeof data == 'undefined') {\n \tproblems.push(error('data is undefined, should match pattern', data, pattern, path))\n \t} else if (!pattern.test(data)) {\n \tproblems.push(error('data does not match pattern', data, pattern, path))\n }\n } else if (pattern instanceof Function) {\n let problem = pattern(data, root, path)\n if (problem) {\n \tif (Array.isArray(problem)) {\n \t\tproblems = problems.concat(problem)\n \t} else {\n\t \tproblems.push(problem)\n\t }\n }\n } else if (Array.isArray(pattern)) {\n\t\tif (!Array.isArray(data)) {\n\t\t\tproblems.push(error('data is not an array',data,[],path))\n\t\t}\n\t\tfor (let p of pattern) {\n\t\t\tfor (let index of data.keys()) {\n\t\t\t\tlet problem = fails(data[index], p, root, path+'['+index+']')\n\t\t\t\tif (Array.isArray(problem)) {\n\t\t\t\t\tproblems = problems.concat(problem)\n\t\t\t\t} else if (problem) {\n\t\t\t\t\tproblems.push(problem)\n\t\t\t\t}\n\t\t\t}\n \t}\n } else if (pattern && typeof pattern == 'object') {\n if (Array.isArray(data)) {\n let index = data.findIndex((element,index) => fails(element,pattern,root,path+'['+index+']'))\n if (index>-1) {\n \tproblems.push(error('data['+index+'] does not match pattern', data[index], pattern, path+'['+index+']'))\n }\n } else if (!data || typeof data != 'object') {\n \tproblems.push(error('data is not an object, pattern is', data, pattern, path))\n } else {\n \tif (data instanceof URLSearchParams) {\n \t\tdata = Object.fromEntries(data)\n \t}\n \tif (pattern instanceof Function) {\n \t\tlet result = fails(data, pattern, root, path)\n\t if (result) {\n\t \tproblems = problems.concat(result)\n\t }\n \t} else {\n\t\t for (const [patternKey, subpattern] of Object.entries(pattern)) {\n\t\t let result = fails(data[patternKey], subpattern, root, path+'.'+patternKey)\n\t\t if (result) {\n\t\t \tproblems = problems.concat(result)\n\t\t }\n\t\t }\n\t\t }\n\t }\n } else {\n \tif (pattern!=data) {\n \t\tproblems.push(error('data and pattern are not equal', data, pattern, path))\n \t}\n }\n if (problems.length) {\n \treturn problems\n }\n return false\n}\n\n/**\n * Returns an object with message, found and expected properties\n */ \nexport function error(message, found, expected, path, problems) {\n\tlet result = {\n\t\tpath,\n\t\tmessage,\n\t\tfound,\n\t\texpected\n\t}\n\tif (problems) {\n\t\tresult.problems = problems\n\t}\n\treturn result\n}\n\nexport function warn(message, data, pattern, path) {\n\tconsole.warn('\uD83C\uDD70\uFE0F Assert: '+path, message, pattern, data)\n}", "export function tokenStore(site) {\n\tlet localState, localTokens\n\tif (typeof localStorage !== 'undefined') {\n\t\tlocalState = {\n\t\t\tget: () => localStorage.getItem('metro/state:'+site),\n\t\t\tset: (value) => localStorage.setItem('metro/state:'+site, value),\n\t\t\thas: () => localStorage.getItem('metro/state:'+site)!==null\n\t\t}\n\t\tlocalTokens = {\n\t\t\tget: (name) => JSON.parse(localStorage.getItem(site+':'+name)),\n\t\t\tset: (name, value) => localStorage.setItem(site+':'+name, JSON.stringify(value)),\n\t\t\thas: (name) => localStorage.getItem(site+':'+name)!==null\n\t\t}\n\t} else {\n\t\tlet stateMap = new Map()\n\t\tlocalState = {\n\t\t\tget: () => stateMap.get('metro/state:'+site),\n\t\t\tset: (value) => stateMap.set('metro/state:'+site, value),\n\t\t\thas: () => stateMap.has('metro/state:'+site)\n\t\t}\n\t\tlocalTokens = new Map()\n\t}\n\treturn {\n\t\tstate: localState,\n\t\ttokens: localTokens\n\t}\n}", "import * as metro from '@muze-nl/metro/src/metro.mjs'\nimport { assert, Required, validURL } from '@muze-nl/assert'\nimport {tokenStore} from './tokenstore.mjs'\n\n/**\n * oauth2mw returns a middleware for @muze-nl/metro that\n * implements oauth2 authentication in the metro client.\n * it supports the authorization_code, refresh_token and\n * client_credentials grant_type.\n * Since implicit flow is deemed insecure, it is not supported\n * This library follows the OAuth2.1 RFC - https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-11)\n * Referenced as Oauth2.1 RFC from here on\n * by default it will use PKCE and generate a random code_verifier,\n * to skip this, set options.oauth2_configuration.code_verifier to false\n */\nexport default function oauth2mw(options)\n{\n\tconst defaultOptions = {\n\t\tclient: metro.client(),\n\t\tforce_authorization: false,\n\t\tsite: 'default',\n\t\toauth2_configuration: {\n\t\t\tauthorization_endpoint: '/authorize',\n\t\t\ttoken_endpoint: '/token',\n\t\t\tredirect_uri: globalThis.document?.location.href,\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tcode_verifier: generateCodeVerifier(64)\n\t\t},\n\t\tauthorize_callback: async url => {\n\t\t\tif (window.location.href != url.href) {\n\t\t\t\twindow.location.replace(url.href)\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\t}\n\n\tassert(options, {})\t\n\n\tconst oauth2 = Object.assign({}, defaultOptions.oauth2_configuration, options?.oauth2_configuration)\n\toptions = Object.assign({}, defaultOptions, options)\n\toptions.oauth2_configuration = oauth2\n\n\tconst store = tokenStore(options.site)\n\tif (!options.tokens) {\n\t\toptions.tokens = store.tokens\n\t}\n\tif (!options.state) {\n\t\toptions.state = store.state\n\t}\n\n\tassert(options, {\n\t\toauth2_configuration: {\n\t\t\tclient_id: Required(/.+/),\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tauthorization_endpoint: Required(validURL),\n\t\t\ttoken_endpoint: Required(validURL),\n\t\t\tredirect_uri: Required(validURL)\n\t\t}\n\t})\n\n\t// FIXME: for oidc, we need to send the id_token instead of access token...\n\tfor (let option in oauth2) {\n\t\tswitch(option) {\n\t\t\tcase 'access_token':\n\t\t\tcase 'authorization_code':\n\t\t\tcase 'refresh_token':\n\t\t\t\toptions.tokens.set(option, oauth2[option])\n\t\t\tbreak\n\t\t}\n\t}\n\n\t/**\n\t * This is the middleware function. It will intercept a request, and if needed\n\t * go through the OAuth2 authorization flow first.\n\t */\n\treturn async function(req, next) {\n\t\tif (options.force_authorization) {\n\t\t\treturn oauth2authorized(req, next)\n\t\t}\n\t\tlet res\n\t\ttry {\n\t\t\tres = await next(req)\n\t\t\tif (res.ok) {\n\t\t\t\treturn res\n\t\t\t}\n\t\t} catch(err) {\n\t\t\tswitch(res.status) { \n\t\t\t\tcase 400: // Oauth2.1 RFC 3.2.4\n\t\t\t\tcase 401: // in case of incorrect authentication method\n\t\t\t\t\t//FIXME: check payload of response as well? yes - may be able to recover\n\t\t\t\t\treturn oauth2authorized(req, next)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tthrow err\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tswitch(res.status) { \n\t\t\t\tcase 400: // Oauth2.1 RFC 3.2.4\n\t\t\t\tcase 401: // in case of incorrect authentication method\n\t\t\t\t\t//FIXME: check payload of response as well? yes - may be able to recover\n\t\t\t\t\treturn oauth2authorized(req, next)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\treturn res\n\t}\n\n\t/**\n\t * Implements the OAuth2 authorization flow for a request\n\t */\n\tasync function oauth2authorized(req, next)\n\t{\n\t\tgetTokensFromLocation()\n\t\tlet accessToken = options.tokens.get('access_token')\n\t\tif (!accessToken) {\n\t\t\ttry {\n\t\t\t\tlet token = await fetchAccessToken()\n\t\t\t\tif (!token) {\n\t\t\t\t\treturn metro.response('false')\n\t\t\t\t}\n\t\t\t} catch(e){\n\t\t\t\t//FIXME: handle some errors here\n\t\t\t\tthrow(e)\n\t\t\t}\n\t\t\treturn oauth2authorized(req, next)\n\t\t} else if (isExpired(accessToken)) {\n\t\t\ttry {\n\t\t\t\tlet token = await fetchRefreshToken()\n\t\t\t\tif (!token) {\n\t\t\t\t\treturn metro.response('false')\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t\t//FIXME: handle some errors here\n\t\t\t\tthrow(e)\n\t\t\t}\n\t\t\treturn oauth2authorized(req, next)\n\t\t} else {\n\t\t\treq = metro.request(req, {\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: accessToken.type+' '+accessToken.value\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn next(req)\n\t\t}\n\t}\n\n\t/**\n\t * Fetches and stores the authorization_code from a redirected URI\n\t * Then removes the authorization_code from the browser URL\n\t * OAuth2 RFC 4.1.2\n\t */\n\tfunction getTokensFromLocation()\n\t{\n\t\tif (typeof window !== 'undefined' && window?.location) {\n\t\t\tlet url = metro.url(window.location)\n\t\t\tlet code, state, params\n\t\t\tif (url.searchParams.has('code')) {\n\t\t\t\tparams = url.searchParams\n\t\t\t\turl = url.with({ search:'' })\n\t\t\t\thistory.pushState({},'',url.href)\n\t\t\t} else if (url.hash) {\n\t\t\t\tlet query = url.hash.substr(1)\n\t\t\t\tparams = new URLSearchParams('?'+query)\n\t\t\t\turl = url.with({ hash:'' })\n\t\t\t\thistory.pushState({},'',url.href)\n\t\t\t}\n\t\t\tif (params) {\n\t\t\t\tcode = params.get('code')\n\t\t\t\tstate = params.get('state')\n\t\t\t\tlet storedState = options.state.get('metro/state')\n\t\t\t\tif (!state || state!==storedState) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (code) {\n\t\t\t\t\toptions.tokens.set('authorization_code', code)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the access_token. If the authorization_code hasn't been retrieved yet,\n\t * it will first try to get that, using the options.callbacks.authorize function.\n\t * If a refresh_token is also returned, it will store that in the options.tokens storage.\n\t */\n\tasync function fetchAccessToken()\n\t{\n\t\tif (oauth2.grant_type === 'authorization_code' && !options.tokens.has('authorization_code')) {\n\t\t\tlet authReqURL = await getAuthorizationCodeURL()\n\t\t\tif (!options.authorize_callback || typeof options.authorize_callback !== 'function') {\n\t\t\t\tthrow metro.metroError('oauth2mw: oauth2 with grant_type:authorization_code requires a callback function in client options.authorize_callback')\n\t\t\t}\n\t\t\tlet token = await options.authorize_callback(authReqURL)\n\t\t\tif (token) {\n\t\t\t\toptions.tokens.set('authorization_code', token)\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\tlet tokenReq = getAccessTokenRequest()\n\t\tlet response = await options.client.post(tokenReq) //OAuth2.1 RFC 3.2\n\t\tif (!response.ok) {\n\t\t\tlet msg = await response.text()\n\t\t\tthrow metro.metroError('OAuth2mw: fetch access_token: '+response.status+': '+response.statusText, {cause: tokenReq} )\n\t\t}\n\t\tlet data = await response.json()\n\t\t// OAuth2.1 RFC 3.2.3\n\t\toptions.tokens.set('access_token', {\n\t\t\tvalue: data.access_token,\n\t\t\texpires: getExpires(data.expires_in),\n\t\t\ttype: data.token_type,\n\t\t\tscope: data.scope\n\t\t})\n\t\tif (data.refresh_token) {\n\t\t\tlet token = {\n\t\t\t\tvalue: data.refresh_token\n\t\t\t}\n\t\t\toptions.tokens.set('refresh_token', token)\n\t\t}\n\t\treturn data\n\t}\n\n\t/**\n\t * Fetches a new access_token using a stored refresh_token\n\t * If a new refresh_token is also returned, it will update the stored refresh_token\n\t * OAuth2.1 RFC 4.3\n\t */\n\tasync function fetchRefreshToken()\n\t{\n\t\tlet refreshTokenReq = getAccessTokenRequest('refresh_token')\n\t\tlet response = await options.client.post(refreshTokenReq)\n\t\tif (!response.ok) {\n\t\t\tthrow metro.metroError('OAuth2mw: refresh access_token: '+response.status+': '+response.statusText, {cause: refreshTokenReq} )\n\t\t}\n\t\tlet data = await response.json()\n\t\toptions.tokens.set('access_token', {\n\t\t\tvalue: data.access_token,\n\t\t\texpires: getExpires(data.expires_in),\n\t\t\ttype: data.token_type,\n\t\t\tscope: data.scope\n\t\t})\n\t\tif (data.refresh_token) {\n\t\t\tlet token = {\n\t\t\t\tvalue: data.refresh_token\n\t\t\t}\n\t\t\toptions.tokens.set('refresh_token', token)\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t\treturn data\n\t}\n\n\t/**\n\t * Returns the URL to use to get a authorization_code\n\t */\n\tasync function getAuthorizationCodeURL()\n\t{\n\t\tif (!oauth2.authorization_endpoint) {\n\t\t\tthrow metro.metroError('oauth2mw: Missing options.oauth2_configuration.authorization_endpoint')\n\t\t}\n\t\tlet url = metro.url(oauth2.authorization_endpoint, {hash: ''}) // OAuth2.1 RFC 3.1\n\t\tassert(oauth2, {\n\t\t\tclient_id: /.+/,\n\t\t\tredirect_uri: /.+/,\n\t\t\tscope: /.*/\n\t\t})\n\t\tlet search = {\n\t\t\tresponse_type: 'code', // implicit flow uses 'token' here, but is not considered safe, so not supported\n\t\t\tclient_id: oauth2.client_id,\n\t\t\tredirect_uri: oauth2.redirect_uri,\n\t\t\tstate: oauth2.state || createState(40) // OAuth2.1 RFC says optional, but its a good idea to always add/check it\n\t\t}\n\t\tif (oauth2.response_type) {\n\t\t\tsearch.response_type = oauth2.response_type\n\t\t}\n\t\tif (oauth2.response_mode) {\n\t\t\tsearch.response_mode = oauth2.response_mode\n\t\t}\n\t\toptions.state.set(search.state)\n\t\tif (oauth2.client_secret) {\n\t\t\tsearch.client_secret = oauth2.client_secret\n\t\t}\n\t\tif (oauth2.code_verifier) { //PKCE\n\t\t\tsearch.code_challenge = await generateCodeChallenge(oauth2.code_verifier)\n\t\t\tsearch.code_challenge_method = 'S256'\n\t\t}\n\t\tif (oauth2.scope) {\n\t\t\tsearch.scope = oauth2.scope\n\t\t}\n\t\tif (oauth2.prompt) {\n\t\t\tsearch.prompt = oauth2.prompt\n\t\t}\n\t\treturn metro.url(url, { search })\n\t}\n\n\n\t/**\n\t * Returns a token endpoint request with all the correct parameters, given the\n\t * grant_type. This can then be used in a metro.post.\n\t */\n\tfunction getAccessTokenRequest(grant_type=null)\n\t{\n\t\tassert(oauth2, {\n\t\t\tclient_id: /.+/,\n\t\t\tredirect_uri: /.+/\n\t\t})\n\t\tif (!oauth2.token_endpoint) {\n\t\t\tthrow metro.metroError('oauth2mw: Missing options.endpoints.token url')\n\t\t}\n\t\tlet url = metro.url(oauth2.token_endpoint, {hash: ''}) // OAuth2.1 RFC 3.2\n\t\tlet params = {\n\t\t\tgrant_type: grant_type || oauth2.grant_type,\n\t\t\tclient_id: oauth2.client_id\n\t\t}\n\t\tif (oauth2.code_verifier) { //PKCE\n\t\t\tparams.code_verifier = oauth2.code_verifier\n\t\t}\n\t\tif (oauth2.client_secret) {\n\t\t\tparams.client_secret = oauth2.client_secret\n\t\t}\n\t\tif (oauth2.scope) {\n\t\t\tparams.scope = oauth2.scope\n\t\t}\n\t\tswitch(oauth2.grant_type) {\n\t\t\tcase 'authorization_code':\n\t\t\t\tparams.redirect_uri = oauth2.redirect_uri\n\t\t\t\tparams.code = options.tokens.get('authorization_code')\n\t\t\tbreak\n\t\t\tcase 'client_credentials':\n\t\t\t\t// nothing to add\n\t\t\tbreak\n\t\t\tcase 'refresh_token':\n\t\t\t\tparams.refresh_token = oauth2.refresh_token\n\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tthrow new Error('Unknown grant_type: '.oauth2.grant_type)\n\t\t\tbreak\n\t\t}\n\t\treturn metro.request(url, {method: 'POST', body: new URLSearchParams(params) })\n\t}\n\n}\n\n/**\n * Returns true if the access token is expired. False otherwise.\n */\nexport function isExpired(token)\n{\n\tif (!token) {\n\t\treturn true\n\t}\n\tlet expires = new Date(token.expires)\n\tlet now = new Date();\n\treturn now.getTime() > expires.getTime();\n}\n\n/**\n * Returns a new Date based on a duration, which can either be a date\n * or a number of seconds from now.\n */\nexport function getExpires(duration)\n{\n\tif (duration instanceof Date) {\n\t\treturn new Date(duration.getTime()); // return a copy\n\t}\n\tif (typeof duration === 'number') {\n\t\tlet date = new Date();\n\t\tdate.setSeconds(date.getSeconds() + duration);\n\t\treturn date;\n\t}\n\tthrow new TypeError('Unknown expires type '+duration);\n}\n\n\n/**\n * returns a PKCE code_verifier, as a uint8array\n * pass it to base64url_encode() to get a string\n */\nexport function\tgenerateCodeVerifier(size=64)\n{\n\tconst code_verifier = new Uint8Array(size)\n\tglobalThis.crypto.getRandomValues(code_verifier)\n\treturn base64url_encode(code_verifier)\n}\n\n/**\n * Returns a PKCE code_challenge derived from a code_verifier\n * Note that this is an async function, so you can't just call\n * it in the defaultOptions part of oauth2mw, or it will become async as well\n * and that is not supported using metro.client().with() (yet)\n */\nexport async function generateCodeChallenge(code_verifier)\n{\n\tconst encoder = new TextEncoder()\n\tconst data = encoder.encode(code_verifier)\n\tconst challenge = await globalThis.crypto.subtle.digest('SHA-256', data)\n\treturn base64url_encode(challenge)\n}\n\n/**\n * Base64url encoding, which handles UTF-8 input strings correctly.\n */\nexport function base64url_encode(buffer)\n{\n\tconst byteString = Array.from(new Uint8Array(buffer), b => String.fromCharCode(b)).join('')\n return btoa(byteString)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * Creates a random state to use in the authorization code URL\n */\nexport function createState(length)\n{\n\tconst validChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n\tlet randomState = ''\n\tlet counter = 0\n while (counter < length) {\n randomState += validChars.charAt(Math.floor(Math.random() * validChars.length))\n counter++\n }\n\treturn randomState\n}\n\n/**\n * Returns true if a parameter 'code' is in the document.location searchParams or\n * in the hash, if parsed as searchParams\n */\nexport function isRedirected() {\n\tlet url = new URL(document.location.href)\n\tif (!url.searchParams.has('code')) {\n\t\tif (url.hash) {\n\t\t\tlet query = url.hash.substr(1)\n\t\t\tparams = new URLSearchParams('?'+query)\n\t\t\tif (params.has('code')) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\treturn true\n}\n\n/**\n * Returns true if there is a valid accessToken or refreshToken in the\n * tokens store.\n * @param (tokensStore.tokens|issuer) tokens - if tokens is a string, it \n * \tis assumed to be the oidc issuer, and tokens are fetched using the default\n * tokenStore. If you use a different tokenStore, pass the tokens section of it here\n */\nexport function isAuthorized(tokens) {\n\tif (typeof tokens == 'string') {//issuer\n\t\ttokens = tokenStore(tokens).tokens\n\t}\n\tlet accessToken = tokens.get('access_token')\n\tif (accessToken && !isExpired(accessToken)) {\n\t\treturn true\n\t}\n\tlet refreshToken = tokens.get('refresh_token')\n\tif (refreshToken) { // assumes refresh token is still valid\n\t\treturn true\n\t}\n\treturn false\n}", "export default function keysStore() {\n\treturn new Promise((resolve, reject) => {\n\t\tconst request = globalThis.indexedDB.open('metro', 1)\n\n\t\trequest.onupgradeneeded = () => request.result.createObjectStore('keyPairs', { keyPath: 'domain'})\n\n\t\trequest.onerror = (event) => {\n\t\t\treject(event)\n\t\t}\n\n\t\trequest.onsuccess = (event) => {\n\t\t\tconst db = event.target.result\n\t\t\tresolve({\n\t\t\t\tset: function(value, key) {\n\t\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t\tconst tx = db.transaction('keyPairs', 'readwrite', {durability: 'strict'})\n\t\t\t\t\t\tconst objectStore = tx.objectStore('keyPairs')\n\t\t\t\t\t\ttx.oncomplete = () => {\n\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttx.onerror = reject\n\t\t\t\t\t\tobjectStore.put(value, key)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tget: function(key) {\n\t\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t\tconst tx = db.transaction('keyPairs', 'readonly')\n\t\t\t\t\t\tconst objectStore = tx.objectStore('keyPairs')\n\t\t\t\t\t\tconst request = objectStore.get(key)\n\t\t\t\t\t\trequest.onsuccess = () => {\n\t\t\t\t\t\t\tresolve(request.result)\n\t\t\t\t\t\t}\n\t\t\t\t\t\trequest.onerror = reject\n\t\t\t\t\t\ttx.onerror = reject\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tclear: function() {\n\t\t\t\t\treturn new Promise((resolve,reject) => {\n\t\t\t\t\t\tconst tx = db.transaction('keyPairs', 'readwrite')\n\t\t\t\t\t\tconst objectStore = tx.objectStore('keyPairs')\n\t\t\t\t\t\tconst request = objectStore.clear()\n\t\t\t\t\t\trequest.onsuccess = () => {\n\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t}\n\t\t\t\t\t\trequest.onerror = reject\n\t\t\t\t\t\ttx.onerror = reject\t\t\t\t\t\t\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t})\n}", "const encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nfunction buf(input) {\n if (typeof input === 'string') {\n return encoder.encode(input);\n }\n return decoder.decode(input);\n}\nfunction checkRsaKeyAlgorithm(algorithm) {\n if (typeof algorithm.modulusLength !== 'number' || algorithm.modulusLength < 2048) {\n throw new OperationProcessingError(`${algorithm.name} modulusLength must be at least 2048 bits`);\n }\n}\nfunction subtleAlgorithm(key) {\n switch (key.algorithm.name) {\n case 'ECDSA':\n return { name: key.algorithm.name, hash: 'SHA-256' };\n case 'RSA-PSS':\n checkRsaKeyAlgorithm(key.algorithm);\n return {\n name: key.algorithm.name,\n saltLength: 256 >> 3,\n };\n case 'RSASSA-PKCS1-v1_5':\n checkRsaKeyAlgorithm(key.algorithm);\n return { name: key.algorithm.name };\n case 'Ed25519':\n return { name: key.algorithm.name };\n }\n throw new UnsupportedOperationError();\n}\nasync function jwt(header, claimsSet, key) {\n if (key.usages.includes('sign') === false) {\n throw new TypeError('private CryptoKey instances used for signing assertions must include \"sign\" in their \"usages\"');\n }\n const input = `${b64u(buf(JSON.stringify(header)))}.${b64u(buf(JSON.stringify(claimsSet)))}`;\n const signature = b64u(await crypto.subtle.sign(subtleAlgorithm(key), key, buf(input)));\n return `${input}.${signature}`;\n}\nconst CHUNK_SIZE = 0x8000;\nfunction encodeBase64Url(input) {\n if (input instanceof ArrayBuffer) {\n input = new Uint8Array(input);\n }\n const arr = [];\n for (let i = 0; i < input.byteLength; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join('')).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\nfunction b64u(input) {\n return encodeBase64Url(input);\n}\nfunction randomBytes() {\n return b64u(crypto.getRandomValues(new Uint8Array(32)));\n}\nclass UnsupportedOperationError extends Error {\n constructor(message) {\n super(message ?? 'operation not supported');\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nclass OperationProcessingError extends Error {\n constructor(message) {\n super(message);\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nfunction psAlg(key) {\n switch (key.algorithm.hash.name) {\n case 'SHA-256':\n return 'PS256';\n default:\n throw new UnsupportedOperationError('unsupported RsaHashedKeyAlgorithm hash name');\n }\n}\nfunction rsAlg(key) {\n switch (key.algorithm.hash.name) {\n case 'SHA-256':\n return 'RS256';\n default:\n throw new UnsupportedOperationError('unsupported RsaHashedKeyAlgorithm hash name');\n }\n}\nfunction esAlg(key) {\n switch (key.algorithm.namedCurve) {\n case 'P-256':\n return 'ES256';\n default:\n throw new UnsupportedOperationError('unsupported EcKeyAlgorithm namedCurve');\n }\n}\nfunction determineJWSAlgorithm(key) {\n switch (key.algorithm.name) {\n case 'RSA-PSS':\n return psAlg(key);\n case 'RSASSA-PKCS1-v1_5':\n return rsAlg(key);\n case 'ECDSA':\n return esAlg(key);\n case 'Ed25519':\n return 'EdDSA';\n default:\n throw new UnsupportedOperationError('unsupported CryptoKey algorithm name');\n }\n}\nfunction isCryptoKey(key) {\n return key instanceof CryptoKey;\n}\nfunction isPrivateKey(key) {\n return isCryptoKey(key) && key.type === 'private';\n}\nfunction isPublicKey(key) {\n return isCryptoKey(key) && key.type === 'public';\n}\nfunction epochTime() {\n return Math.floor(Date.now() / 1000);\n}\nexport default async function DPoP(keypair, htu, htm, nonce, accessToken, additional) {\n const privateKey = keypair?.privateKey;\n const publicKey = keypair?.publicKey;\n if (!isPrivateKey(privateKey)) {\n throw new TypeError('\"keypair.privateKey\" must be a private CryptoKey');\n }\n if (!isPublicKey(publicKey)) {\n throw new TypeError('\"keypair.publicKey\" must be a public CryptoKey');\n }\n if (publicKey.extractable !== true) {\n throw new TypeError('\"keypair.publicKey.extractable\" must be true');\n }\n if (typeof htu !== 'string') {\n throw new TypeError('\"htu\" must be a string');\n }\n if (typeof htm !== 'string') {\n throw new TypeError('\"htm\" must be a string');\n }\n if (nonce !== undefined && typeof nonce !== 'string') {\n throw new TypeError('\"nonce\" must be a string or undefined');\n }\n if (accessToken !== undefined && typeof accessToken !== 'string') {\n throw new TypeError('\"accessToken\" must be a string or undefined');\n }\n if (additional !== undefined &&\n (typeof additional !== 'object' || additional === null || Array.isArray(additional))) {\n throw new TypeError('\"additional\" must be an object');\n }\n return jwt({\n alg: determineJWSAlgorithm(privateKey),\n typ: 'dpop+jwt',\n jwk: await publicJwk(publicKey),\n }, {\n ...additional,\n iat: epochTime(),\n jti: randomBytes(),\n htm,\n nonce,\n htu,\n ath: accessToken ? b64u(await crypto.subtle.digest('SHA-256', buf(accessToken))) : undefined,\n }, privateKey);\n}\nasync function publicJwk(key) {\n const { kty, e, n, x, y, crv } = await crypto.subtle.exportKey('jwk', key);\n return { kty, crv, e, n, x, y };\n}\nexport async function generateKeyPair(alg, options) {\n let algorithm;\n if (typeof alg !== 'string' || alg.length === 0) {\n throw new TypeError('\"alg\" must be a non-empty string');\n }\n switch (alg) {\n case 'PS256':\n algorithm = {\n name: 'RSA-PSS',\n hash: 'SHA-256',\n modulusLength: options?.modulusLength ?? 2048,\n publicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n };\n break;\n case 'RS256':\n algorithm = {\n name: 'RSASSA-PKCS1-v1_5',\n hash: 'SHA-256',\n modulusLength: options?.modulusLength ?? 2048,\n publicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n };\n break;\n case 'ES256':\n algorithm = { name: 'ECDSA', namedCurve: 'P-256' };\n break;\n case 'EdDSA':\n algorithm = { name: 'Ed25519' };\n break;\n default:\n throw new UnsupportedOperationError();\n }\n return (crypto.subtle.generateKey(algorithm, options?.extractable ?? false, ['sign', 'verify']));\n}\n", "import metro from '@muze-nl/metro'\nimport DPoP, {generateKeyPair} from 'dpop'\nimport { assert, Required, Optional, validURL } from '@muze-nl/assert'\nimport keysStore from './keysstore.mjs'\n\nexport default function dpopmw(options) {\n\n\tassert(options, {\n\t\tsite: Required(validURL),\n\t\tauthorization_endpoint: Required(validURL),\n\t\ttoken_endpoint: Required(validURL),\n\t\tdpop_signing_alg_values_supported: Optional([]) // this property is unfortunately rarely supported\n\t})\n\n\treturn async (req, next) => {\n\t\tconst keys = await keysStore()\n\t\tlet keyInfo = await keys.get(options.site)\n\t\tif (!keyInfo) {\n \t\t\t// FIXME fetch from dpop_signing_alg_values_supported\n \t\t\t// which is unfortunately not available usually\n \t\t\tlet keyPair = await generateKeyPair('ES256') // note: don't make them extractable! That potentially allows hackers to steal the privateKey\n\t\t\tkeyInfo = { domain: options.site, keyPair }\n\t\t\tawait keys.set(keyInfo)\n\t\t}\n\t\tconst url = metro.url(req.url)\n\n\t\tif (req.url.startsWith(options.authorization_endpoint)) {\n\t\t\tlet params = req.body\n\t\t\tif (params instanceof URLSearchParams || params instanceof FormData) {\n\t\t\t\tparams.set('dpop_jkt', keyInfo.keyPair.publicKey)\n\t\t\t} else {\n\t\t\t\tparams.dpop_jkt = keyInfo.keyPair.publicKey\n\t\t\t}\n\n\t\t} else if (req.url.startsWith(options.token_endpoint)) {\n\t\t\tconst dpopHeader = await DPoP(keyInfo.keyPair, req.url, req.method)\n\t\t\treq = req.with({\n\t\t\t\theaders: {\n\t\t\t\t\t'DPoP': dpopHeader\n\t\t\t\t}\n\t\t\t})\n\n\t\t} else if (req.headers.has('Authorization')) { //FIXME: not all requests use the dpop bound access token, so check which key to use, or if to add dpop at all\n\t\t\t// note: don't use options.site here, nonce can differ\n\t\t\tconst nonce = localStorage.getItem(url.host+':nonce') || undefined // null is not acceptible for DpOp()\n\t\t\tconst accessToken = req.headers.get('Authorization').split(' ')[1]\n\t\t\tconst dpopHeader = await DPoP(keyInfo.keyPair, req.url, req.method, nonce, accessToken)\n\t\t\treq = req.with({\n\t\t\t\theaders: {\n\t\t\t\t\t'Authorization': 'DPoP '+accessToken,\n\t\t\t\t\t'DPoP': dpopHeader\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tlet response = await next(req)\n\t\tif (response.headers.get('DPoP-Nonce')) {\n\t\t\t// note: don't use options.site here, nonce can differ\n\t\t\tlocalStorage.setItem(url.host+':nonce', response.headers.get('DPoP-Nonce'))\n\t\t}\n\t\treturn response\n\t}\n\t\n}", "import { error } from '@muze-nl/assert'\n\nexport const MustHave = (...options) => \n\t(value, root) => {\n\t\tif (options.filter(o => root.hasOwnKey(o)).length > 0) {\n\t\t\treturn false\n\t\t}\n\t\treturn error('root data must have all of', root, options)\n\t}\n\nexport const MustInclude = (...options) =>\n\t(value) => {\n\t\tif (Array.isArray(value) && options.filter(o => !value.includes(o)).length == 0) {\n\t\t\treturn false\n\t\t} else {\n\t\t\treturn error('data must be an array which includes',value,options)\n\t\t}\n\t}\n\n//TODO: add link to spec\nexport const validJWK = [\n\t'HS256','HS384','HS512','RS256','RS384','RS512','ES256','ES384','ES512'\n]\n\n//TODO: add link to spec\n// FIXME: enter correct values\nexport const validJWA = [\n\t'HS256','HS384','HS512','RS256','RS384','RS512','ES256','ES384','ES512'\n]\n\n//TODO: add link to spec\nexport const validAuthMethods = [\n\t'client_secret_post', 'client_secret_basic','client_secret_jwt','private_key_jwt'\n]\n", "/**\n * This module adheres to OpenID Connect Discovery 1.0 incorporating errata set 2 - december 15, 2023\n * https://openid.net/specs/openid-connect-discovery-1_0.html\n */\nimport metro from '@muze-nl/metro'\nimport jsonmw from '@muze-nl/metro/src/mw/json.mjs'\nimport throwermw from '@muze-nl/metro/src/mw/thrower.mjs'\nimport { validJWA, MustInclude, validAuthMethods } from './oidc.util.mjs'\nimport { assert, fails, Required, Recommended, Optional, oneOf, anyOf, allOf, validURL, instanceOf, not, error } from '@muze-nl/assert'\n\n/**\n * Given options.issuer will get the .well-known/openid-configuration information\n * parse it, assert if follows the specification and return it as a javascript object\n * @param options.issuer Required: URL with the root of the oidc issuer\n * @param options.client Optional: metro client to use in the request\n * @returns object with openid-configuration\n * @throws Error when a network error occurs while fetching openid-configuration\n * @throws assertError when either the options or the openid-configuration fail assertions (and assertion testing is enabled)\n */\nexport default async function oidcDiscovery(options={}) {\n\tassert(options, {\n\t\tclient: Optional(instanceOf(metro.client().constructor)),\n\t\tissuer: Required(validURL)\n\t})\n\n\tconst defaultOptions = {\n\t\tclient: metro.client().with(throwermw()).with(jsonmw()),\n\t\trequireDynamicRegistration: false\n\t}\n\n\toptions = Object.assign({},defaultOptions,options)\n\n\tconst TestSucceeded = false\n\tfunction MustUseHTTPS(url) {\n\t\treturn TestSucceeded // FIXME todo\n\t}\n\n\t// https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata\n\t// @TODO: this is a first approximation of the specced requirements, needs to implement\n\t// all MUST/MUST NOT etc. notes in the specification.\n\tconst openid_provider_metadata = {\n\t\tissuer: Required(allOf(options.issuer, MustUseHTTPS)),\n\t\tauthorization_endpoint: Required(validURL),\n\t\ttoken_endpoint: Required(validURL),\n\t\tuserinfo_endpoint: Recommended(validURL), // todo: test for https protocol\n\t\tjwks_uri: Required(validURL),\n\t\tregistration_endpoint: options.requireDynamicRegistration \n\t\t\t? Required(validURL) \n\t\t\t: Recommended(validURL),\n\t\tscopes_supported: Recommended(MustInclude('openid')),\n\t\tresponse_types_supported: options.requireDynamicRegistration\n\t\t\t? Required(MustInclude('code','id_token','id_token token')) \n\t\t\t: Required([]),\n\t\tresponse_modes_supported: Optional([]),\n\t\tgrant_types_supported: options.requireDynamicRegistration\n\t\t\t? Optional(MustInclude('authorization_code')) // implicit is required according to the spec, but not used in web apps\n\t\t\t: Optional([]),\n\t\tacr_values_supported: Optional([]),\n\t\tsubject_types_supported: Required([]),\n\t\tid_token_signing_alg_values_supported: Required(MustInclude('RS256')),\n\t\tid_token_encryption_alg_values_supported: Optional([]),\n\t\tid_token_encryption_enc_values_supported: Optional([]),\n\t\tuserinfo_signing_alg_values_supported: Optional([]),\n\t\tuserinfo_encryption_alg_values_supported: Optional([]),\n\t\tuserinfo_encryption_enc_values_supported: Optional([]),\n\t\trequest_object_signing_alg_values_supported: Optional(MustInclude('RS256')), // not testing for 'none'\n\t\trequest_object_encryption_alg_values_supported: Optional([]),\n\t\trequest_object_encryption_enc_values_supported: Optional([]),\n\t\ttoken_endpoint_auth_methods_supported: Optional(anyOf(...validAuthMethods)),\n\t\ttoken_endpoint_auth_signing_alg_values_supported: Optional(MustInclude('RS256'), not(MustInclude('none'))),\n\t\tdisplay_values_supported: Optional(anyOf('page','popup','touch','wap')),\n\t\tclaim_types_supported: Optional(anyOf('normal','aggregated','distributed')),\n\t\tclaims_supported: Recommended([]),\n\t\tservice_documentation: Optional(validURL),\n\t\tclaims_locales_supported: Optional([]),\n\t\tui_locales_supported: Optional([]),\n\t\tclaims_parameter_supported: Optional(Boolean),\n\t\trequest_parameter_supported: Optional(Boolean),\n\t\trequest_uri_parameter_supported: Optional(Boolean),\n\t\top_policy_uri: Optional(validURL),\n\t\top_tos_uri: Optional(validURL)\t\n\t}\n\n\t// fetch openid configuration from wellknown and return the json\n\tconst configURL = metro.url(options.issuer, '.well-known/openid-configuration')\n\n\tconst response = await options.client.get(\n\t\t// https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest\n\t\t// note: this allows path components in the options.issuer url\n\t\tconfigURL\n\t)\n\tconst openid_config = response.data\n\tassert(openid_config, openid_provider_metadata)\n\n\t// https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationValidation\n\tassert(openid_config.issuer, options.issuer)\n\treturn openid_config\n}", "/**\n * This module adheres to OpenID Connect Dynamic Client Registration 1.0 \n * incorporating errata set 2 - december 15, 2023\n * https://openid.net/specs/openid-connect-registration-1_0.html\n */\nimport metro from '@muze-nl/metro'\nimport jsonmw from '@muze-nl/metro/src/mw/json.mjs'\nimport throwermw from '@muze-nl/metro/src/mw/thrower.mjs'\nimport { validJWA, validAuthMethods, MustHave } from './oidc.util.mjs'\nimport { assert, Required, Optional, oneOf, anyOf, validURL, validEmail, not, instanceOf } from '@muze-nl/assert'\n\nexport default async function register(options)\n{\n\n // https://openid.net/specs/openid-connect-registration-1_0.html#ClientMetadata\n\tconst openid_client_metadata = {\n\t\tredirect_uris: Required([validURL]),\n\t\tresponse_types: Optional([]),\n\t\tgrant_types: Optional(anyOf('authorization_code','refresh_token')), //TODO: match response_types with grant_types\n\t\tapplication_type: Optional(oneOf('native','web')),\n\t\tcontacts: Optional([validEmail]),\n\t\tclient_name: Optional(String),\n\t\tlogo_uri: Optional(validURL),\n\t\tclient_uri: Optional(validURL),\n\t\tpolicy_uri: Optional(validURL),\n\t\ttos_uri: Optional(validURL),\n\t\tjwks_uri: Optional(validURL, not(MustHave('jwks'))),\n\t\tjwks: Optional(validURL, not(MustHave('jwks_uri'))),\n\t\tsector_identifier_uri: Optional(validURL),\n\t\tsubject_type: Optional(String),\n\t\tid_token_signed_response_alg: Optional(oneOf(...validJWA)),\n\t\tid_token_encrypted_response_alg: Optional(oneOf(...validJWA)),\n\t\tid_token_encrypted_response_enc: Optional(oneOf(...validJWA), MustHave('id_token_encrypted_response_alg')),\n\t\tuserinfo_signed_response_alg: Optional(oneOf(...validJWA)),\n\t\tuserinfo_encrypted_response_alg: Optional(oneOf(...validJWA)),\n\t\tuserinfo_encrypted_response_enc: Optional(oneOf(...validJWA), MustHave('userinfo_encrypted_response_alg')),\n\t\trequest_object_signing_alg: Optional(oneOf(...validJWA)),\n\t\trequest_object_encryption_alg: Optional(oneOf(...validJWA)),\n\t\trequest_object_encryption_enc: Optional(oneOf(...validJWA)),\n\t\ttoken_endpoint_auth_method: Optional(oneOf(...validAuthMethods)),\n\t\ttoken_endpoint_auth_signing_alg: Optional(oneOf(...validJWA)),\n\t\tdefault_max_age: Optional(Number),\n\t\trequire_auth_time: Optional(Boolean),\n\t\tdefault_acr_values: Optional([String]),\n\t\tinitiate_login_uri: Optional([validURL]),\n\t\trequest_uris: Optional([validURL])\n\t}\n\n\tassert(options, {\n\t\tclient: Optional(instanceOf(metro.client().constructor)),\n\t\tregistration_endpoint: validURL, \n\t\tclient_info: openid_client_metadata\n\t})\n\n\tconst defaultOptions = {\n\t\tclient: metro.client().with(throwermw()).with(jsonmw())\n\t}\n\n\toptions = Object.assign({}, defaultOptions, options)\n\n\n\tlet response = await options.client\n\t\t.post(options.registration_endpoint, {\n\t\t\tbody: options.client_info\n\t\t})\n\tlet info = response.data\n\tif (!info.client_id || !info.client_secret) {\n\t\tthrow metro.metroError('metro.oidc: Error: dynamic registration of client failed, no client_id or client_secret returned', response)\n\t}\n\toptions.client_info = Object.assign(options.client_info, info)\n\treturn options.client_info\n}", "export default function oidcStore(site) {\n\tlet store\n\tif (typeof localStorage !== 'undefined') {\n\t\tstore = {\n\t\t\tget: (name) => JSON.parse(localStorage.getItem('metro/oidc:'+site+':'+name)),\n\t\t\tset: (name, value) => localStorage.setItem('metro/oidc:'+site+':'+name, JSON.stringify(value)),\n\t\t\thas: (name) => localStorage.getItem('metro/oidc:'+site+':'+name)!==null\n\t\t}\n\t} else {\n\t\tlet storeMap = new Map()\n\t\tstore = {\n\t\t\tget: (name) => JSON.parse(storeMap.get('metro/oidc:'+site+':'+name)||null),\n\t\t\tset: (name, value) => storeMap.set('metro/oidc:'+site+':'+name, JSON.stringify(value)),\n\t\t\thas: (name) => storeMap.has('metro/oidc:'+site+':'+name)\n\t\t}\n\t}\n\treturn store\n}", "import * as metro from '@muze-nl/metro/src/metro.mjs'\nimport oauth2mw, * as oauth2 from '@muze-nl/metro-oauth2/src/oauth2.mjs'\nimport dpopmw from '@muze-nl/metro-oauth2/src/oauth2.dpop.mjs'\nimport { assert, Required, Optional, validURL, instanceOf } from '@muze-nl/assert'\nimport discover from './oidc.discovery.mjs'\nimport register from './oidc.register.mjs'\nimport oidcStore from './oidc.store.mjs'\n\nexport default function oidcmw(options={}) {\n\n\tconst defaultOptions = {\n\t\tclient: metro.client(),\n\t\tforce_authorization: false,\n\t\tuse_dpop: true,\n\t\tauthorize_callback: async url => {\n\t\t\tif (window.location.href != url.href) {\n\t\t\t\twindow.location.replace(url.href)\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\t}\n\n\toptions = Object.assign({}, defaultOptions, options)\n\n\tassert(options, {\n\t\tclient: Required(instanceOf(metro.client().constructor)), // required because it is set in defaultOptions\n\t\tclient_info: Required(),\n\t\tissuer: Required(validURL),\n\t\toauth2: Optional({}),\n\t\topenid_configuration: Optional()\n\t})\n\n\tif (!options.store) {\n\t\toptions.store = oidcStore(options.issuer)\n\t}\n\tif (!options.openid_configuration && options.store.has('openid_configuration')) {\n\t\toptions.openid_configuration = options.store.get('openid_configuration')\n\t}\n\tif (!options.client_info.client_id && options.store.has('client_info')) {\n\t\toptions.client_info = options.store.get('client_info')\n\t}\n\n\treturn async (req, next) => {\n\t\tlet res\n\t\tif (!options.force_authorization) {\n\t\t\ttry {\n\t\t\t\tres = await next(req)\n\t\t\t} catch(err) {\n\t\t\t\tif (res.status!=401 && res.status!=403) {\n\t\t\t\t\tthrow err\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res.ok || (res.status!=401 && res.status!=403)) {\n\t\t\t\treturn res\n\t\t\t}\n\t\t}\n\t\tif (!options.openid_configuration) {\n\t\t\toptions.openid_configuration = await discover({\n\t\t\t\tissuer: options.issuer\n\t\t\t})\n\t\t\toptions.store.set('openid_configuration', options.openid_configuration)\n\t\t}\n\n\t\tif (!options.client_info?.client_id) {\n\t\t\tassert(options.client_info?.client_name, Required())\n\t\t\tif (!options.openid_configuration.registration_endpoint) {\n\t\t\t\tthrow metro.metroError('metro.oidcmw: Error: issuer '+options.issuer+' does not support dynamic client registration, but you haven\\'t specified a client_id')\n\t\t\t}\n\t\t\toptions.client_info = await register({\n\t\t\t\tregistration_endpoint: options.openid_configuration.registration_endpoint,\n\t\t\t\tclient_info: options.client_info\n\t\t\t})\n\t\t\toptions.store.set('client_info', options.client_info)\n\t\t}\n\n\t\t// now initialize an oauth2 client stack, using options.client as default\n\t\t// with forceAuthentication: true\n\t\tconst scope = options.scope || 'openid'\n\n\t\tconst oauth2Options = Object.assign(\n\t\t\t{\n\t\t\t\tsite: options.issuer,\n\t\t\t\tclient: options.client,\n\t\t\t\tforce_authorization: true,\n\t\t\t\tauthorize_callback: options.authorize_callback,\n\t\t\t\toauth2_configuration: {\n\t\t\t\t\tclient_id: options.client_info.client_id,\n\t\t\t\t\tclient_secret: options.client_info.client_secret,\n\t\t\t\t\tgrant_type: 'authorization_code',\n\t\t\t\t\tresponse_type: 'code',\n\t\t\t\t\tresponse_mode: 'query',\n\t\t\t\t\tauthorization_endpoint: options.openid_configuration.authorization_endpoint,\n\t\t\t\t\ttoken_endpoint: options.openid_configuration.token_endpoint,\n\t\t\t\t\tscope, //FIXME: should only use scopes supported by server\n\t\t\t\t\tredirect_uri: options.client_info.redirect_uris[0]\n\t\t\t\t}\n\t\t\t}\n\t\t\t//...\n\t\t)\n\t\t\n\t\tconst storeIdToken = async (req, next) => {\n\t\t\tconst res = await next(req)\n\t\t\tconst contentType = res.headers.get('content-type')\n\t\t\tif (contentType?.startsWith('application/json')) {\n\t\t\t\t//FIXME: check that this is actually the token endpoint\n\t\t\t\tlet id_token = res.data?.id_token\n\t\t\t\tif (!id_token) {\n\t\t\t\t\tconst res2 = res.clone() // otherwise res.body can't be read again\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet data = await res2.json()\n\t\t\t\t\t\tif (data && data.id_token) {\n\t\t\t\t\t\t\tid_token = data.id_token\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t// ignore errors\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (id_token) {\n\t\t\t\t\toptions.store.set('id_token', id_token)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn res\n\t\t}\n\n\t\tlet oauth2client = options.client.with(options.issuer).with(storeIdToken)\n\n\t\tif (options.use_dpop) {\n\t\t\tconst dpopOptions = {\n\t\t\t\tsite: options.issuer,\n\t\t\t\tauthorization_endpoint: options.openid_configuration.authorization_endpoint,\n\t\t\t\ttoken_endpoint: options.openid_configuration.token_endpoint,\n\t\t\t\tdpop_signing_alg_values_supported: options.openid_configuration.dpop_signing_alg_values_supported\n\t\t\t}\n\t\t\toauth2client = oauth2client.with(dpopmw(dpopOptions)) // add DPoP headers in requests with Authorization headers\n\t\t\toauth2Options.client = oauth2client // make sure oath2 token request use dpop\n\t\t}\n\n\t\toauth2client = oauth2client.with(oauth2mw(oauth2Options))\n\n\t\tres = await oauth2client.fetch(req)\n\n\t\treturn res\n\t}\n\n}\n\nexport function isRedirected() {\n\treturn oauth2.isRedirected()\n}\n\nexport function idToken(options) {\n\tif (!options.store) {\n\t\tif (!options.issuer) {\n\t\t\tthrow metro.metroError('Must supply options.issuer or options.store to get the id_token')\n\t\t}\n\t\toptions.store = oidcStore(options.issuer)\n\t}\n\treturn options.store.get('id_token')\n}\n", "import metro from '@muze-nl/metro'\nimport oauth2 from '@muze-nl/metro-oauth2'\nimport oidcDiscover from './oidc.discovery.mjs'\nimport oidcRegister from './oidc.register.mjs'\nimport oidcmw, {isRedirected, idToken} from './oidcmw.mjs'\n\nconst oidc = {\n\toidcmw,\n\tdiscover: oidcDiscover,\n\tregister: oidcRegister,\n\tisRedirected,\n\tidToken\n}\n\nif (!globalThis.metro.oidc) {\n\tglobalThis.metro.oidc = oidc\n}\n\nexport default oidc"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * base URL used to link to more information about an error message\n */\nconst metroURL = 'https://metro.muze.nl/details/'\n\n/**\n * Symbols:\n * - isProxy: used to test if an object is a metro Proxy to another object\n * - source: used to return the actual source (target) of a metro Proxy\n */\nif (!Symbol.metroProxy) {\n\tSymbol.metroProxy = Symbol('isProxy')\n}\nif (!Symbol.metroSource) {\n\tSymbol.metroSource = Symbol('source')\n}\n\n/**\n * Metro HTTP Client with middleware support\n * @method get\n * @method post\n * @method put\n * @method delete\n * @method patch\n * @method head\n * @method options\n * @method query\n * @method fetch\n */\nexport class Client\n{\n\tclientOptions = {\n\t\turl: typeof window != 'undefined' ? window.location : 'https://localhost',\n\t\tverbs: ['get','post','put','delete','patch','head','options','query']\n\t}\n\n\tstatic tracers = {}\n\n\t/**\n\t * @typedef {Object} ClientOptions\n\t * @property {Array} middlewares - list of middleware functions\n\t * @property {string|URL} url - default url of the client\n\t * @property {[string]} verbs - a list of verb methods to expose, e.g. ['get','post']\n\t * \n\t * Constructs a new metro client. Can have any number of params.\n\t * @params {ClientOptions|URL|Function|Client}\n\t * @returns {Client} - A metro client object with given or default verb methods\n\t */\n\tconstructor(...options)\n\t{\n\t\tfor (let option of options) {\n\t\t\tif (typeof option == 'string' || option instanceof String) {\n\t\t\t\tthis.clientOptions.url = ''+option\n\t\t\t} else if (option instanceof Function) {\n\t\t\t\tthis.#addMiddlewares([option])\n\t\t\t} else if (option && typeof option == 'object') {\n\t\t\t\tfor (let param in option) {\n\t\t\t\t\tif (param == 'middlewares') {\n\t\t\t\t\t\tthis.#addMiddlewares(option[param])\n\t\t\t\t\t} else if (typeof option[param] == 'function') {\n\t\t\t\t\t\tthis.clientOptions[param] = option[param](this.clientOptions[param], this.clientOptions)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.clientOptions[param] = option[param]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const verb of this.clientOptions.verbs) {\n\t\t\tthis[verb] = async function(...options) {\n\t\t\t\treturn this.fetch(request(\n\t\t\t\t\tthis.clientOptions,\n\t\t\t\t\t...options,\n\t\t\t\t\t{method: verb.toUpperCase()}\n\t\t\t\t))\n\t\t\t}\n\t\t}\n\t}\n\n\t#addMiddlewares(middlewares)\n\t{\n\t\tif (typeof middlewares == 'function') {\n\t\t\tmiddlewares = [ middlewares ]\n\t\t}\n\t\tlet index = middlewares.findIndex(m => typeof m != 'function')\n\t\tif (index>=0) {\n\t\t\tthrow metroError('metro.client: middlewares must be a function or an array of functions '\n\t\t\t\t+metroURL+'client/invalid-middlewares/', middlewares[index])\n\t\t}\n\t\tif (!Array.isArray(this.clientOptions.middlewares)) {\n\t\t\tthis.clientOptions.middlewares = []\n\t\t}\n\t\tthis.clientOptions.middlewares = this.clientOptions.middlewares.concat(middlewares)\n\t}\n\n\t/**\n\t * Mimics the standard browser fetch method, but uses any middleware installed through\n\t * the constructor.\n\t * @param {Request|string|Object} - Required. The URL or Request object, accepts all types that are accepted by metro.request\n\t * @param {Object} - Optional. Any object that is accepted by metro.request\n\t * @return {Promise<Response|*>} - The metro.response to this request, or any other result as changed by any included middleware.\n\t */\n\tfetch(req, options)\n\t{\n\t\treq = request(req, options)\n\t\tif (!req.url) {\n\t\t\tthrow metroError('metro.client.'+req.method.toLowerCase()+': Missing url parameter '+metroURL+'client/fetch-missing-url/', req)\n\t\t}\n\t\tif (!options) {\n\t\t\toptions = {}\n\t\t}\n\t\tif (!(typeof options === 'object') \n\t\t\t|| options instanceof String) \n\t\t{\n\t\t\tthrow metroError('metro.client.fetch: Invalid options parameter '+metroURL+'client/fetch-invalid-options/', options)\n\t\t}\n\n\t\tconst metrofetch = async function browserFetch(req)\n\t\t{\n\t\t\tif (req[Symbol.metroProxy]) {\n\t\t\t\treq = req[Symbol.metroSource]\n\t\t\t}\n\t\t\tconst res = await fetch(req)\n\t\t\treturn response(res)\n\t\t}\n\t\t\n\t\tlet middlewares = [metrofetch].concat(this.clientOptions?.middlewares?.slice() || [])\n\t\toptions = Object.assign({}, this.clientOptions, options)\n\t\t//@TODO: do this once in constructor?\n\t\tlet next\n\t\tfor (let middleware of middlewares) {\n\t\t\tnext = (function(next, middleware) {\n\t\t\t\treturn async function(req) {\n\t\t\t\t\tlet res\n\t\t\t\t\tlet tracers = Object.values(Client.tracers)\n\t\t\t\t\tfor(let tracer of tracers) {\n\t\t\t\t\t\tif (tracer.request) {\n\t\t\t\t\t\t\ttracer.request.call(tracer, req, middleware)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tres = await middleware(req, next)\n\t\t\t\t\tfor(let tracer of tracers) {\n\t\t\t\t\t\tif (tracer.response) {\n\t\t\t\t\t\t\ttracer.response.call(tracer, res, middleware)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn res\n\t\t\t\t}\t\t\t\t\t\t\t\t\n\t\t\t})(next, middleware)\n\t\t}\n\t\treturn next(req)\n\t}\n\n\twith(...options) {\n\t\treturn new Client(deepClone(this.clientOptions), ...options)\n\t}\n}\n\n/**\n * Returns a new metro Client object.\n * @param {...ClientOptions|string|URL}\n * @return Client\n */\nexport function client(...options)\n{\n\treturn new Client(...deepClone(options))\n}\n\nfunction appendHeaders(r, headers)\n{\n\tif (!Array.isArray(headers)) {\n\t\theaders = [headers]\n\t}\n\theaders.forEach((header) => {\n\t\tif (typeof header == 'function') {\n\t\t\tlet result = header(r.headers, r)\n\t\t\tif (result) {\n\t\t\t\tif (!Array.isArray(result)) {\n\t\t\t\t\tresult = [result]\n\t\t\t\t}\n\t\t\t\theaders = headers.concat(result)\n\t\t\t}\n\t\t}\n\t})\n\theaders.forEach((header) => {\n\t\tObject.entries(header).forEach(([name,value]) => {\t\t\t\n\t\t\tr.headers.append(name, value)\n\t\t})\n\t})\n}\n\nfunction getRequestParams(req, current)\n{\n\tlet params = current || {}\n\tif (!params.url && current.url) {\n\t\tparams.url = current.url\n\t}\n\t// function to fetch all relevant properties of a Request\n\tfor(let prop of ['method','headers','body','mode','credentials','cache','redirect',\n\t\t'referrer','referrerPolicy','integrity','keepalive','signal',\n\t\t'priority','url']) {\n\t\tlet value = req[prop]\n\t\tif (typeof value=='undefined' || value == null) {\n\t\t\tcontinue\n\t\t}\n\t\tif (value?.[Symbol.metroProxy]) {\n\t\t\tvalue = value[Symbol.metroSource]\n\t\t}\n\t\tif (typeof value == 'function') {\n\t\t\tparams[prop] = value(params[prop], params)\n\t\t} else {\n\t\t\tif (prop == 'url') {\n\t\t\t\tparams.url = url(params.url, value)\n\t\t\t} else if (prop == 'headers') {\n\t\t\t\tparams.headers = new Headers(current.headers)\n\t\t\t\tif (!(value instanceof Headers)) {\n\t\t\t\t\tvalue = new Headers(req.headers)\n\t\t\t\t}\n\t\t\t\tfor (let [key, val] of value.entries()) {\n\t\t\t\t\tparams.headers.set(key, val)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams[prop] = value\n\t\t\t}\n\t\t}\n\t}\n\tif (req instanceof Request && req.data) {\n\t\t// Request.body is always transformed into ReadableStreem\n\t\t// metro.request.data is the original body passed to Request()\n\t\tparams.body = req.data\n\t}\n\treturn params\n}\n\n/**\n * @typedef {Request} MetroRequest\n * @property {Symbol(source)} - returns the target Request of this Proxy\n * @property {Symbol(isProxy)} - returns true\n * @method with - returns a new MetroRequest, with the given options added\n * @param {<RequestOptions|Request|string|URL|URLSearchParams|FormData|ReadableStream|\n * Blob|ArrayBuffer|DataView|TypedArray>} ...options - request options, handled in order\n * \n * Returns a new metro Request object\n * @param {<RequestOptions|Request|string|URL|URLSearchParams|FormData|ReadableStream|\n * Blob|ArrayBuffer|DataView|TypedArray>} ...options - request options, handled in order\n * @return {MetroRequest} - a new metro Request object\n */\nexport function request(...options)\n{\n\t// the standard Request constructor is a minefield\n\t// so first gather all the options together into a single\n\t// javascript object, then set it in one go\n\tlet requestParams = {\n\t\turl: typeof window != 'undefined' ? window.location : 'https://localhost/',\n\t\tduplex: 'half' // required when setting body to ReadableStream, just set it here by default already\n\t}\n\tfor (let option of options) {\n\t\tif (typeof option == 'string'\n\t\t\t|| option instanceof URL\n\t\t\t|| option instanceof URLSearchParams\n\t\t) {\n\t\t\trequestParams.url = url(requestParams.url, option)\n\t\t} else if (option && (\n\t\t\toption instanceof FormData\n\t\t\t|| option instanceof ReadableStream\n\t\t\t|| option instanceof Blob\n\t\t\t|| option instanceof ArrayBuffer\n\t\t\t|| option instanceof DataView\n\t\t)) {\n\t\t\trequestParams.body = option\n\t\t} else if (option && typeof option == 'object') {\n\t\t\tObject.assign(requestParams, getRequestParams(option, requestParams))\n\t\t}\n\t}\n\tlet r = new Request(requestParams.url, requestParams)\n\tlet data = requestParams.body\n\tif (data) {\n\t\tif (typeof data == 'object'\n\t\t\t&& !(data instanceof String)\n\t\t\t&& !(data instanceof ReadableStream)\n\t\t\t&& !(data instanceof Blob)\n\t\t\t&& !(data instanceof ArrayBuffer)\n\t\t\t&& !(data instanceof DataView)\n\t\t\t&& !(data instanceof FormData)\n\t\t\t&& !(data instanceof URLSearchParams)\n\t\t\t&& (typeof TypedArray=='undefined' || !(data instanceof TypedArray))\n\t\t) {\n\t\t\t// if we are here, body is set with an object of a type\n\t\t\t// not natively understood by Request, coerce it to a string\n\t\t\t// using toString({headers}) instead of just toString()\n\t\t\tif (typeof data.toString == 'function') {\n\t\t\t\trequestParams.body = data.toString({headers:r.headers})\n\t\t\t\tr = new Request(requestParams.url, requestParams)\n\t\t\t}\n\t\t}\n\t}\n\tObject.freeze(r)\n\treturn new Proxy(r, {\n\t\tget(target, prop, receiver) {\n\t\t\tswitch(prop) {\n\t\t\t\tcase Symbol.metroSource:\n\t\t\t\t\treturn target\n\t\t\t\tbreak\n\t\t\t\tcase Symbol.metroProxy:\n\t\t\t\t\treturn true\n\t\t\t\tbreak\n\t\t\t\tcase 'with':\n\t\t\t\t\treturn function(...options) {\n\t\t\t\t\t\tif (data) { // data is kept in a seperate value, if it set earlier\n\t\t\t\t\t\t\toptions.unshift({ body: data }) // unshifted so it can be overridden by options\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn request(target, ...options)\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t\tcase 'data':\n\t\t\t\t\treturn data\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (target[prop] instanceof Function) {\n\t\t\t\tif (prop === 'clone') {\n\t\t\t\t\t// TODO: set req.data as the body of the clone\n\t\t\t\t}\n\t\t\t\treturn target[prop].bind(target)\n\t\t\t}\n\t\t\treturn target[prop]\n\t\t}\n\t})\n}\n\nfunction getResponseParams(res, current)\n{\n\t// function to fetch all relevant properties of a Response\n\tlet params = current || {}\n\tif (!params.url && current.url) {\n\t\tparams.url = current.url\n\t}\n\tfor(let prop of ['status','statusText','headers','body','url','type','redirected']) {\n\t\tlet value = res[prop]\n\t\tif (typeof value == 'undefined' || value == null) {\n\t\t\tcontinue\n\t\t}\n\t\tif (value?.[Symbol.metroProxy]) {\n\t\t\tvalue = value[Symbol.metroSource]\n\t\t}\n\t\tif (typeof value == 'function') {\n\t\t\tparams[prop] = value(params[prop], params)\n\t\t} else {\n\t\t\tif (prop == 'url') {\n\t\t\t\tparams.url = new URL(value, params.url || 'https://localhost/')\n\t\t\t} else {\n\t\t\t\tparams[prop] = value\n\t\t\t}\n\t\t}\n\t}\n\tif (res instanceof Response && res.data) {\n\t\t// Response.body is always transformed into ReadableStreem FIXME: check this\n\t\t// metro.response.data is the original body passed to Response()\n\t\tparams.body = res.data\n\t}\n\treturn params\n}\n\n/**\n * @typedef {Response} MetroResponse\n * @property {Symbol(source)} - returns the target Response of this Proxy\n * @property {Symbol(isProxy)} - returns true\n * @method with - returns a new MetroResponse, with the given options added\n * @param {<ResponseOptions|Response|string|URLSearchParams|FormData|ReadableStream|\n * Blob|ArrayBuffer|DataView|TypedArray>} ...options - respomse options, handled in order\n * \n * Returns a new metro Response object\n * @param {<ResponseOptions|Response|string|URLSearchParams|FormData|ReadableStream|\n * Blob|ArrayBuffer|DataView|TypedArray>} ...options - request options, handled in order\n * @return {MetroResponse} - a new metro Response object\n */\nexport function response(...options)\n{\n\tlet responseParams = {}\n\tfor (let option of options) {\n\t\tif (typeof option == 'string') {\n\t\t\tresponseParams.body = option\n\t\t} else if (option instanceof Response) {\n\t\t\tObject.assign(responseParams, getResponseParams(option, responseParams))\n\t\t} else if (option && typeof option == 'object') {\n\t\t\tif (option instanceof FormData\n\t\t\t\t|| option instanceof Blob\n\t\t\t\t|| option instanceof ArrayBuffer\n\t\t\t\t|| option instanceof DataView\n\t\t\t\t|| option instanceof ReadableStream\n\t\t\t\t|| option instanceof URLSearchParams\n\t\t\t\t|| option instanceof String\n\t\t\t\t|| (typeof TypedArray != 'undefined' && option instanceof TypedArray)\n\t\t\t) {\n\t\t\t\tresponseParams.body = option\n\t\t\t} else {\n\t\t\t\tObject.assign(responseParams, getResponseParams(option, responseParams))\n\t\t\t}\n\t\t}\n\t}\n\tlet data = undefined\n\tif (responseParams.body) {\n\t\tdata = responseParams.body\n\t}\n\t// if response status is 'null body status', don't set a body\n\t// that is response.status in [101, 204, 205, 304 ] \n\t// see: https://fetch.spec.whatwg.org/#statuses\n\tif ([101, 204, 205, 304 ].includes(responseParams.status)) {\n\t\tresponseParams.body = null\n\t}\n\tlet r = new Response(responseParams.body, responseParams)\t\n\tObject.freeze(r)\n\treturn new Proxy(r, {\n\t\tget(target, prop, receiver) {\n\t\t\tswitch(prop) {\n\t\t\t\tcase Symbol.metroProxy:\n\t\t\t\t\treturn true\n\t\t\t\tbreak\n\t\t\t\tcase Symbol.metroSource:\n\t\t\t\t\treturn target\n\t\t\t\tbreak\n\t\t\t\tcase 'with':\n\t\t\t\t\treturn function(...options) {\n\t\t\t\t\t\treturn response(target, ...options)\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t\tcase 'data':\n\t\t\t\t\t// body is turned into ReadableStream\n\t\t\t\t\t// data is the original body param\n\t\t\t\t\treturn data\n\t\t\t\tbreak\n\t\t\t\tcase 'ok':\n\t\t\t\t\treturn (target.status>=200) && (target.status<400)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (typeof target[prop] == 'function') {\n\t\t\t\treturn target[prop].bind(target)\n\t\t\t}\n\t\t\treturn target[prop]\n\t\t}\n\t})\n}\n\nfunction appendSearchParams(url, params) {\n\tif (typeof params == 'function') {\n\t\t params(url.searchParams, url)\n\t} else {\n\t\tparams = new URLSearchParams(params)\n\t\tparams.forEach((value,key) => {\n\t\t\turl.searchParams.append(key, value)\n\t\t})\n\t}\n}\n\n/**\n * @typedef {URL} MetroURL\n * @property {Symbol(source)} - returns the target Request of this Proxy\n * @property {Symbol(isProxy)} - returns true\n * @method with - returns a new MetroRequest, with the given options added\n * @param {<URL|URLSearchParams|string|Object|Function>} ...options - url options, handled in order\n * \n * Returns a new metro URL object\n * @param {<URL|URLSearchParams|string|Object|Function>} ...options - url options, handled in order\n * @return {MetroURL} - a new metro URL object\n */\nexport function url(...options)\n{\n\tlet validParams = ['hash','host','hostname','href',\n\t\t\t'password','pathname','port','protocol','username','search','searchParams']\n\tlet u = new URL('https://localhost/')\n\tfor (let option of options) {\n\t\tif (typeof option == 'string' || option instanceof String) {\n\t\t\t// option is a relative or absolute url\n\t\t\tu = new URL(option, u)\n\t\t} else if (option instanceof URL \n\t\t\t|| (typeof Location != 'undefined' \n\t\t\t\t&& option instanceof Location)\n\t\t) {\n\t\t\tu = new URL(option)\n\t\t} else if (option instanceof URLSearchParams) {\n\t\t\tappendSearchParams(u, option)\n\t\t} else if (option && typeof option == 'object') {\n\t\t\tfor (let param in option) {\n\t\t\t\tswitch(param) {\n\t\t\t\t\tcase 'search':\n\t\t\t\t\t\tif (typeof option.search == 'function') {\n\t\t\t\t\t\t\toption.search(u.search, u)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tu.search = new URLSearchParams(option.search)\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t\tcase 'searchParams':\n\t\t\t\t\t\tappendSearchParams(u, option.searchParams)\n\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (!validParams.includes(param)) {\n\t\t\t\t\t\t\tthrow metroError('metro.url: unknown url parameter '+metroURL+'url/unknown-param-name/', param)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof option[param] == 'function') {\n\t\t\t\t\t\t\toption[param](u[param], u)\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof option[param] == 'string' || option[param] instanceof String \n\t\t\t\t\t\t\t|| typeof option[param] == 'number' || option[param] instanceof Number\n\t\t\t\t\t\t\t|| typeof option[param] == 'boolean' || option[param] instanceof Boolean\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tu[param] = ''+option[param]\n\t\t\t\t\t\t} else if (typeof option[param] == 'object' && option[param].toString) {\n\t\t\t\t\t\t\tu[param] = option[param].toString()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow metroError('metro.url: unsupported value for '+param+' '+metroURL+'url/unsupported-param-value/', options[param])\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow metroError('metro.url: unsupported option value '+metroURL+'url/unsupported-option-value/', option)\n\t\t}\n\t}\n\tObject.freeze(u)\n\treturn new Proxy(u, {\n\t\tget(target, prop, receiver) {\n\t\t\tlet result\n\t\t\tswitch(prop) {\n\t\t\t\tcase Symbol.metroProxy:\n\t\t\t\t\treturn true\n\t\t\t\tbreak\n\t\t\t\tcase Symbol.metroSource:\n\t\t\t\t\treturn target\n\t\t\t\tbreak\n\t\t\t\tcase 'with':\n\t\t\t\t\treturn function(...options) {\n\t\t\t\t\t\treturn url(target, ...options)\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t\tcase 'filename':\n\t\t\t\t\treturn target.pathname.split('/').pop()\n\t\t\t\tbreak\n\t\t\t\tcase 'folderpath':\n\t\t\t\t\treturn target.pathname.substring(0,target.pathname.lastIndexOf('\\\\')+1)\n\t\t\t\tbreak\n\t\t\t\tcase 'authority':\n\t\t\t\t\tresult = target.username ?? ''\n\t\t\t\t\tresult += target.password ? ':'+target.password : ''\n\t\t\t\t\tresult += result ? '@' : ''\n\t\t\t\t\tresult += target.hostname\n\t\t\t\t\tresult += target.port ? ':'+target.port : ''\n\t\t\t\t\tresult += '/'\n\t\t\t\t\tresult = target.protocol + '//' + result\n\t\t\t\t\treturn result\n\t\t\t\tbreak;\n\t\t\t\tcase 'origin':\n\t\t\t\t\tresult = target.protocol + '//' + target.hostname\n\t\t\t\t\tresult += target.port ? ':' + target.port : ''\n\t\t\t\t\tresult += '/'\n\t\t\t\t\treturn result\n\t\t\t\tbreak\n\t\t\t\tcase 'fragment':\n\t\t\t\t\treturn target.hash.substring(1)\n\t\t\t\tbreak\n\t\t\t\tcase 'scheme':\n\t\t\t\t\tif (target.protocol) {\n\t\t\t\t\t\treturn target.protocol.substring(0, target.protocol.length-1)\n\t\t\t\t\t}\n\t\t\t\t\treturn ''\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (target[prop] instanceof Function) {\n\t\t\t\treturn target[prop].bind(target)\n\t\t\t}\n\t\t\treturn target[prop]\n\t\t}\n\t})\n}\n\n/**\n * @typedef {FormData} MetroFormData\n * @property {Symbol(source)} - returns the target Request of this Proxy\n * @property {Symbol(isProxy)} - returns true\n * @method with - returns a new MetroRequest, with the given options added\n * @param {<FormData|Object>} ...options - url options, handled in order\n * \n * Returns a new metro FormData object\n * @param {<FormData|Object>} ...options - formdata options, handled in order\n * @return {MetroURL} - a new metro FormData object\n */\nexport function formdata(...options)\n{\n\tvar params = new FormData()\n\tfor (let option of options) {\n\t\tif (option instanceof HTMLFormElement) {\n\t\t\toption = new FormData(option)\n\t\t}\n\t\tif (option instanceof FormData) {\n\t\t\tfor (let entry of option.entries()) {\n\t\t\t\tparams.append(entry[0],entry[1])\n\t\t\t}\n\t\t} else if (option && typeof option == 'object') {\n\t\t\tfor (let entry of Object.entries(option)) {\n\t\t\t\tif (Array.isArray(entry[1])) {\n\t\t\t\t\tfor (let value of entry[1]) {\n\t\t\t\t\t\tparams.append(entry[0], value)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tparams.append(entry[0],entry[1])\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new metroError('metro.formdata: unknown option type '+metroURL+'formdata/unknown-option-value/', option)\n\t\t}\n\t}\n\tObject.freeze(params)\n\treturn new Proxy(params, {\n\t\tget: (target,prop,receiver) => {\n\t\t\tswitch(prop) {\n\t\t\t\tcase Symbol.metroProxy:\n\t\t\t\t\treturn true\n\t\t\t\tbreak\n\t\t\t\tcase Symbol.metroSource:\n\t\t\t\t\treturn target\n\t\t\t\tbreak\n\t\t\t\t//TODO: add toString() that can check\n\t\t\t\t//headers param: toString({headers:request.headers})\n\t\t\t\t//for the content-type\n\t\t\t\tcase 'with':\n\t\t\t\t\treturn function(...options) {\n\t\t\t\t\t\treturn formdata(target, ...options)\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (target[prop] instanceof Function) {\n\t\t\t\treturn target[prop].bind(target)\n\t\t\t}\n\t\t\treturn target[prop]\n\t\t}\n\t})\n}\n\nconst metroConsole = {\n\terror: (message, ...details) => {\n\t\tconsole.error('\u24C2\uFE0F ',message, ...details)\n\t},\n\tinfo: (message, ...details) => {\n\t\tconsole.info('\u24C2\uFE0F ',message, ...details)\n\t},\n\tgroup: (name) => {\n\t\tconsole.group('\u24C2\uFE0F '+name)\n\t},\n\tgroupEnd: (name) => {\n\t\tconsole.groupEnd('\u24C2\uFE0F '+name)\n\t}\n}\n\n\n/**\n * Custom Metro Error function that outputs to the console then throws an error\n */\nexport function metroError(message, ...details) {\n\tmetroConsole.error(message, ...details)\n\treturn new Error(message, ...details)\n}\n\n/**\n * Set of debugging tools to trace the request - response flow\n * Tracer are run on all metro fetch calls\n */\nexport const trace = {\n\t/**\n\t * Adds a named tracer function\n\t * @param {string} name - the name of the tracer\n\t * @param {Function} tracer - the tracer function to call\n\t */\n\tadd(name, tracer) {\n\t\tClient.tracers[name] = tracer\n\t},\n\t/**\n\t * Removes a named tracer function\n\t * @param {string} name\n\t */\n\tdelete(name) {\n\t\tdelete Client.tracers[name]\n\t},\n\t/**\n\t * Removes all tracer functions\n\t */\n\tclear() {\n\t\tClient.tracers = {}\n\t},\n\t/**\n\t * Returns a set of request and response tracer functions that use the\n\t * console.group feature to shows nested request/response pairs, with\n\t * most commonly needed information for debugging\n\t */\n\tgroup() {\n\t\tlet group = 0;\n\t\treturn {\n\t\t\trequest: (req, middleware) => {\n\t\t\t\tgroup++\n\t\t\t\tmetroConsole.group(group)\n\t\t\t\tmetroConsole.info(req?.url, req, middleware)\n\t\t\t},\n\t\t\tresponse: (res, middleware) => {\n\t\t\t\tmetroConsole.info(res?.body ? res.body[Symbol.metroSource]: null, res, middleware)\n\t\t\t\tmetroConsole.groupEnd(group)\n\t\t\t\tgroup--\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function deepClone(object) {\n\tif (Array.isArray(object)) {\n\t\treturn object.slice().map(deepClone)\n\t}\n\tif (object && typeof object==='object') {\n\t\tif (object.__proto__.constructor==Object || !object.__proto__) { // plain objects\n\t\t\tlet result = Object.assign({}, object)\n\t\t\tObject.keys(result).forEach(key => {\n\t\t\t\tresult[key] = deepClone(object[key])\n\t\t\t})\n\t\t\treturn result\n\t\t} else {\n\t\t\treturn object // don't clone custom classes or functions\n\t\t}\n\t}\n\treturn object\n}", "import * as metro from '../metro.mjs'\n\nexport default function jsonmw(options) {\n\toptions = Object.assign({\n\t\tmimetype: 'application/json',\n\t\treviver: null,\n\t\treplacer: null,\n\t\tspace: ''\n\t}, options)\n\n\treturn async function json(req, next) {\n\t\tif (!isJSON(req.headers.get('Accept'))) {\n\t\t\treq = req.with({\n\t\t\t\theaders: {\n\t 'Accept': options.mimetype\n\t }\n\t })\n\t\t}\n\t\tif (['POST','PUT','PATCH','QUERY'].includes(req.method)) {\n\t\t\tif (req.data && typeof req.data=='object' && !(req.data instanceof ReadableStream)) {\n\t\t\t\tif (!isJSON(req.headers.get('content-type'))) {\n\t\t\t\t\treq = req.with({\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Content-Type':options.mimetype,\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\treq = req.with({\n\t\t\t\t\tbody: JSON.stringify(req.data, options.replacer, options.space)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tlet res = await next(req)\n\t\tif (isJSON(res.headers.get('content-type'))) {\n\t\t\tlet tempRes = res.clone()\n\t\t\tlet body = await tempRes.text()\n\t\t\ttry {\n\t\t\t\tlet json = JSON.parse(body, options.reviver)\n\t\t\t\treturn res.with({\n\t\t\t\t\tbody: json\n\t\t\t\t})\n\t\t\t} catch(e) {\n\t\t\t\t// ignore parse errors\n\t\t\t}\n\t\t} \n\t\treturn res\n\t}\n}\n\nconst jsonRE = /^application\\/([a-zA-Z0-9\\-_]+\\+)?json\\b/\nfunction isJSON(contentType) {\n\treturn jsonRE.exec(contentType)\n}", "import * as metro from '../metro.mjs'\n\nexport default function throwermw(options) {\n\n\treturn async function thrower(req, next) {\n\t\tlet res = await next(req)\n\t\tif (!res.ok) {\n\t\t\tif (options && typeof options[res.status] == 'function') {\n\t\t\t\tres = options[res.status].apply(res, req)\n\t\t\t} else {\n\t\t\t\tthrow new Error(res.status+': '+res.statusText, {\n\t\t\t\t\tcause: res\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\treturn res\n\t}\n\n}", "import * as m from './metro.mjs'\nimport jsonmw from './mw/json.mjs'\nimport thrower from './mw/thrower.mjs'\n\nconst metro = Object.assign({}, m, {\n\tmw: {\n\t\tjsonmw,\n\t\tthrower\n\t}\n})\n\nif (!globalThis.metro) {\n\tglobalThis.metro = metro\n}\n\nexport default metro", "/*\nTODO: add assertExplain global flag, so that if assert() fails, you can call explain() with\n the same pattern and it will return text explanation of why it failed, each assertion function must \n then check assertExplain, and return a text explanation of what fails or succeeds\n top level can then filter to show only the failures\n (so that not(x) can show the succeeds message of x)\n*/\n\n/**\n * assertEnabled (Boolean) used to toggle whether the assert()\n * method should test assertions or not.\n */\nglobalThis.assertEnabled = false\n\n/**\n * Enables assertion testing with assert()\n */\nexport function enable() {\n\tglobalThis.assertEnabled = true\n}\n\n/**\n * Disables assertion testing with assert()\n */\nexport function disable() {\n\tglobalThis.assertEnabled = false\n}\n\n/**\n * This function will check the source for the assertions in test, if\n * assertion checking is enabled globally.\n * If it is, and any assertion fails, it will throw an assertError\n * with a list of problems and other details.\n */\nexport function assert(source, test) {\n\tif (globalThis.assertEnabled) {\n\t\tlet problems = fails(source,test)\n\t\tif (problems) {\n\t\t\tconsole.error('\uD83C\uDD70\uFE0F Assertions failed because of:', problems, 'in this source:', source)\n\t\t\tthrow new Error('Assertions failed', {\n\t\t\t\tcause: { problems, source } \n\t\t\t})\n\t\t}\n\t}\n}\n\n/**\n * Tests a given value against a pattern, only if the value is not null or undefined\n */\nexport function Optional(pattern) {\n\treturn function _Optional(data, root, path) {\n\t\tif (typeof data != 'undefined' && data!=null && typeof pattern != 'undefined' ) {\n\t\t\treturn fails(data, pattern, root, path)\n\t\t}\n\t}\n}\n\n/**\n * Tests a given value against a pattern, always.\n */\nexport function Required(pattern) {\n\treturn function _Required(data, root, path) {\n\t\tif (data==null || typeof data == 'undefined') {\n\t\t\treturn error('data is required', data, pattern || 'any value', path)\n\t\t} else if (typeof pattern != 'undefined') {\n\t\t\treturn fails(data, pattern, root, path)\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n}\n\n/**\n * Tests a given value against a pattern, only if the value is not null or undefined\n * If null or undefined, it does print a warning to the console.\n */\nexport function Recommended(pattern) {\n\treturn function _Recommended(data, root, path) {\n\t\tif (data==null || typeof data == 'undefined') {\n\t\t\twarn('data does not contain recommended value', data, pattern, path)\n\t\t\treturn false\n\t\t} else {\n\t\t\treturn fails(data, pattern, root, path)\n\t\t}\n\t}\n}\n\n/**\n * Tests a given value against a set of patterns, untill one succeeds\n * Returns an error if none succeed\n */\nexport function oneOf(...patterns) { \n\treturn function _oneOf(data, root, path) {\n\t\tfor(let pattern of patterns) {\n\t\t\tif (!fails(data, pattern, root, path)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn error('data does not match oneOf patterns', data, patterns, path)\n\t}\n}\n\n/**\n * Tests a given array of values against a set of patterns\n * If any value does not match one of the patterns, it will return an error\n * If not given an array to test, it will return an error\n */\nexport function anyOf(...patterns) {\n\treturn function _anyOf(data, root, path) {\n\t\tif (!Array.isArray(data)) {\n\t\t\treturn error('data is not an array',data,'anyOf',path)\n\t\t}\n\t\tfor (let value of data) {\n\t\t\tif (oneOf(...patterns)(value)) {\n\t\t\t\treturn error('data does not match anyOf patterns',value,patterns,path)\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n}\n\nexport function allOf(...patterns) {\n\treturn function _allOf(data, root, path) {\n\t\tlet problems = []\n\t\tfor (let pattern of patterns) {\n\t\t\tproblems = problems.concat(fails(data, pattern, root, path))\n\t\t}\n\t\tproblems = problems.filter(Boolean)\n\t\tif (problems.length) {\n\t\t\treturn error('data does not match all given patterns', data, patterns, path, problems)\n\t\t}\n\t}\n}\n\n/**\n * Tests a given value to see if it is a valid (and absolute) URL, by\n * parsing it with the URL() constructor, and then testing the href\n * value to be equal to the initial value.\n */\nexport function validURL(data, root, path) {\n\ttry {\n\t\tif (data instanceof URL) {\n\t\t\tdata = data.href\n\t\t}\n\t\tlet url = new URL(data)\n\t\tif (url.href!=data) {\n\t\t\tif (!(url.href+'/'==data || url.href==data+'/')) {\n\t\t\t\t// new URL() always adds a / as path\n\t\t\t\treturn error('data is not a valid url',data,'validURL',path)\n\t\t\t}\n\t\t}\n\t} catch(e) {\n\t\treturn error('data is not a valid url',data,'validURL',path)\n\t}\n}\n\n/**\n * Tests a given value to see if it looks like a valid email address, by\n * testing it against a regular expression. So there are no guarantees that\n * it is an actual working email address, just that it looks like one.\n */\nexport function validEmail(data, root, path) {\n\tif (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(data)) {\n\t\treturn error('data is not a valid email',data,'validEmail',path)\n\t}\n}\n\n/**\n * Tests a given value to see if it is an object which is an instance of the given\n * constructor\n */\nexport function instanceOf(constructor) {\n\treturn function _instanceOf(data, root, path) {\n\t\tif (!(data instanceof constructor)) {\n\t\t\treturn error('data is not an instanceof pattern',data,constructor,path)\n\t\t}\n\t}\n}\n\n/**\n * Runs the given test pattern on a value, if the test succeeds, it fails\n * the not() test.\n */\nexport function not(pattern) {\n\treturn function _not(data, root, path) {\n\t\tif (!fails(data, pattern, root, path)) {\n\t\t\treturn error('data matches pattern, when required not to', data, pattern, path)\n\t\t}\n\t}\n}\n\n/**\n * returns an array of problems if the data fails to satisfy \n * the assertions in the given pattern, false otherwise\n * @param {any} data The data to match\n * @param {any} pattern The pattern to match\n * @param {any} root Root object for assertions, set to data by default\n * @return {Array|false} Array with problems if the pattern fails, false otherwise\n */\nexport function fails(data, pattern, root, path='') {\n\tif (!root) {\n\t\troot = data\n\t}\n\tlet problems = []\n\tif (pattern === Boolean) {\n\t\tif (typeof data != 'boolean' && !(data instanceof Boolean)) {\n\t\t\tproblems.push(error('data is not a boolean', data, pattern, path))\n\t\t}\t\t\n\t} else if (pattern === Number) {\n\t\tif (typeof data != 'number' && !(data instanceof Number)) {\n\t\t\tproblems.push(error('data is not a number', data, pattern, path))\n\t\t}\n\t} else if (pattern === String) {\n\t\tif (typeof data != 'string' && !(data instanceof String)) {\n\t\t\tproblems.push(error('data is not a string', data, pattern, path))\n\t\t}\n\t\tif (data == \"\") {\n\t\t\tproblems.push(error('data is an empty string, which is not allowed', data, pattern, path))\n\t\t}\n\t} else if (pattern instanceof RegExp) {\n \tif (Array.isArray(data)) {\n\t\t\tlet index = data.findIndex((element,index) => fails(element,pattern,root,path+'['+index+']'))\n if (index>-1) {\n \tproblems.push(error('data['+index+'] does not match pattern', data[index], pattern, path+'['+index+']'))\n }\n } else if (typeof data == 'undefined') {\n \tproblems.push(error('data is undefined, should match pattern', data, pattern, path))\n \t} else if (!pattern.test(data)) {\n \tproblems.push(error('data does not match pattern', data, pattern, path))\n }\n } else if (pattern instanceof Function) {\n let problem = pattern(data, root, path)\n if (problem) {\n \tif (Array.isArray(problem)) {\n \t\tproblems = problems.concat(problem)\n \t} else {\n\t \tproblems.push(problem)\n\t }\n }\n } else if (Array.isArray(pattern)) {\n\t\tif (!Array.isArray(data)) {\n\t\t\tproblems.push(error('data is not an array',data,[],path))\n\t\t}\n\t\tfor (let p of pattern) {\n\t\t\tfor (let index of data.keys()) {\n\t\t\t\tlet problem = fails(data[index], p, root, path+'['+index+']')\n\t\t\t\tif (Array.isArray(problem)) {\n\t\t\t\t\tproblems = problems.concat(problem)\n\t\t\t\t} else if (problem) {\n\t\t\t\t\tproblems.push(problem)\n\t\t\t\t}\n\t\t\t}\n \t}\n } else if (pattern && typeof pattern == 'object') {\n if (Array.isArray(data)) {\n let index = data.findIndex((element,index) => fails(element,pattern,root,path+'['+index+']'))\n if (index>-1) {\n \tproblems.push(error('data['+index+'] does not match pattern', data[index], pattern, path+'['+index+']'))\n }\n } else if (!data || typeof data != 'object') {\n \tproblems.push(error('data is not an object, pattern is', data, pattern, path))\n } else {\n \tif (data instanceof URLSearchParams) {\n \t\tdata = Object.fromEntries(data)\n \t}\n \tif (pattern instanceof Function) {\n \t\tlet result = fails(data, pattern, root, path)\n\t if (result) {\n\t \tproblems = problems.concat(result)\n\t }\n \t} else {\n\t\t for (const [patternKey, subpattern] of Object.entries(pattern)) {\n\t\t let result = fails(data[patternKey], subpattern, root, path+'.'+patternKey)\n\t\t if (result) {\n\t\t \tproblems = problems.concat(result)\n\t\t }\n\t\t }\n\t\t }\n\t }\n } else {\n \tif (pattern!=data) {\n \t\tproblems.push(error('data and pattern are not equal', data, pattern, path))\n \t}\n }\n if (problems.length) {\n \treturn problems\n }\n return false\n}\n\n/**\n * Returns an object with message, found and expected properties\n */ \nexport function error(message, found, expected, path, problems) {\n\tlet result = {\n\t\tpath,\n\t\tmessage,\n\t\tfound,\n\t\texpected\n\t}\n\tif (problems) {\n\t\tresult.problems = problems\n\t}\n\treturn result\n}\n\nexport function warn(message, data, pattern, path) {\n\tconsole.warn('\uD83C\uDD70\uFE0F Assert: '+path, message, pattern, data)\n}", "export function tokenStore(site) {\n\tlet localState, localTokens\n\tif (typeof localStorage !== 'undefined') {\n\t\tlocalState = {\n\t\t\tget: () => localStorage.getItem('metro/state:'+site),\n\t\t\tset: (value) => localStorage.setItem('metro/state:'+site, value),\n\t\t\thas: () => localStorage.getItem('metro/state:'+site)!==null,\n\t\t\tdelete: () => localStorage.remoteItem('metro/state:'+site)\n\t\t}\n\t\tlocalTokens = {\n\t\t\tget: (name) => JSON.parse(localStorage.getItem(site+':'+name)),\n\t\t\tset: (name, value) => localStorage.setItem(site+':'+name, JSON.stringify(value)),\n\t\t\thas: (name) => localStorage.getItem(site+':'+name)!==null,\n\t\t\tdelete: (name) => localStorage.removeItem(site+':'+name)\n\t\t}\n\t} else {\n\t\tlet stateMap = new Map()\n\t\tlocalState = {\n\t\t\tget: () => stateMap.get('metro/state:'+site),\n\t\t\tset: (value) => stateMap.set('metro/state:'+site, value),\n\t\t\thas: () => stateMap.has('metro/state:'+site),\n\t\t\tdelete: () => stateMap.delete('metro/state:'+site)\n\t\t}\n\t\tlocalTokens = new Map()\n\t}\n\treturn {\n\t\tstate: localState,\n\t\ttokens: localTokens\n\t}\n}", "import * as metro from '@muze-nl/metro/src/metro.mjs'\nimport { assert, Required, validURL } from '@muze-nl/assert'\nimport {tokenStore} from './tokenstore.mjs'\n\n/**\n * oauth2mw returns a middleware for @muze-nl/metro that\n * implements oauth2 authentication in the metro client.\n * it supports the authorization_code, refresh_token and\n * client_credentials grant_type.\n * Since implicit flow is deemed insecure, it is not supported\n * This library follows the OAuth2.1 RFC - https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-11)\n * Referenced as Oauth2.1 RFC from here on\n * by default it will use PKCE and generate a random code_verifier,\n * to skip this, set options.oauth2_configuration.code_verifier to false\n */\nexport default function oauth2mw(options)\n{\n\tconst defaultOptions = {\n\t\tclient: metro.client(),\n\t\tforce_authorization: false,\n\t\tsite: 'default',\n\t\toauth2_configuration: {\n\t\t\tauthorization_endpoint: '/authorize',\n\t\t\ttoken_endpoint: '/token',\n\t\t\tredirect_uri: globalThis.document?.location.href,\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tcode_verifier: generateCodeVerifier(64)\n\t\t},\n\t\tauthorize_callback: async url => {\n\t\t\tif (window.location.href != url.href) {\n\t\t\t\twindow.location.replace(url.href)\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\t}\n\n\tassert(options, {})\t\n\n\tconst oauth2 = Object.assign({}, defaultOptions.oauth2_configuration, options?.oauth2_configuration)\n\toptions = Object.assign({}, defaultOptions, options)\n\toptions.oauth2_configuration = oauth2\n\n\tconst store = tokenStore(options.site)\n\tif (!options.tokens) {\n\t\toptions.tokens = store.tokens\n\t}\n\tif (!options.state) {\n\t\toptions.state = store.state\n\t}\n\n\tassert(options, {\n\t\toauth2_configuration: {\n\t\t\tclient_id: Required(/.+/),\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tauthorization_endpoint: Required(validURL),\n\t\t\ttoken_endpoint: Required(validURL),\n\t\t\tredirect_uri: Required(validURL)\n\t\t}\n\t})\n\n\t// FIXME: for oidc, we need to send the id_token instead of access token...\n\tfor (let option in oauth2) {\n\t\tswitch(option) {\n\t\t\tcase 'access_token':\n\t\t\tcase 'authorization_code':\n\t\t\tcase 'refresh_token':\n\t\t\t\toptions.tokens.set(option, oauth2[option])\n\t\t\tbreak\n\t\t}\n\t}\n\n\t/**\n\t * This is the middleware function. It will intercept a request, and if needed\n\t * go through the OAuth2 authorization flow first.\n\t */\n\treturn async function(req, next) {\n\t\tif (options.force_authorization) {\n\t\t\treturn oauth2authorized(req, next)\n\t\t}\n\t\tlet res\n\t\ttry {\n\t\t\tres = await next(req)\n\t\t\tif (res.ok) {\n\t\t\t\treturn res\n\t\t\t}\n\t\t} catch(err) {\n\t\t\tswitch(res.status) { \n\t\t\t\tcase 400: // Oauth2.1 RFC 3.2.4\n\t\t\t\tcase 401: // in case of incorrect authentication method\n\t\t\t\t\t//FIXME: check payload of response as well? yes - may be able to recover\n\t\t\t\t\treturn oauth2authorized(req, next)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tthrow err\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tswitch(res.status) { \n\t\t\t\tcase 400: // Oauth2.1 RFC 3.2.4\n\t\t\t\tcase 401: // in case of incorrect authentication method\n\t\t\t\t\t//FIXME: check payload of response as well? yes - may be able to recover\n\t\t\t\t\treturn oauth2authorized(req, next)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\treturn res\n\t}\n\n\t/**\n\t * Implements the OAuth2 authorization flow for a request\n\t */\n\tasync function oauth2authorized(req, next)\n\t{\n\t\tgetTokensFromLocation()\n\t\tconst accessToken = options.tokens.get('access_token')\n\t\tconst refreshToken = options.tokens.get('refresh_token')\n\t\tconst tokenIsExpired = isExpired(accessToken)\n\t\tif (!accessToken || (tokenIsExpired && !refreshToken)) {\n\t\t\ttry {\n\t\t\t\tlet token = await fetchAccessToken()\n\t\t\t\tif (!token) {\n\t\t\t\t\treturn metro.response('false')\n\t\t\t\t}\n\t\t\t} catch(e){\n\t\t\t\t//FIXME: handle some errors here\n\t\t\t\tthrow(e)\n\t\t\t}\n\t\t\treturn oauth2authorized(req, next)\n\t\t} else if (tokenIsExpired && refreshToken) {\n\t\t\ttry {\n\t\t\t\tlet token = await refreshAccessToken()\n\t\t\t\tif (!token) {\n\t\t\t\t\treturn metro.response('false')\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t\t//FIXME: handle some errors here\n\t\t\t\tthrow(e)\n\t\t\t}\n\t\t\treturn oauth2authorized(req, next)\n\t\t} else {\n\t\t\treq = metro.request(req, {\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: accessToken.type+' '+accessToken.value\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn next(req)\n\t\t}\n\t}\n\n\t/**\n\t * Fetches and stores the authorization_code from a redirected URI\n\t * Then removes the authorization_code from the browser URL\n\t * OAuth2 RFC 4.1.2\n\t */\n\tfunction getTokensFromLocation()\n\t{\n\t\tif (typeof window !== 'undefined' && window?.location) {\n\t\t\tlet url = metro.url(window.location)\n\t\t\tlet code, state, params\n\t\t\tif (url.searchParams.has('code')) {\n\t\t\t\tparams = url.searchParams\n\t\t\t\turl = url.with({ search:'' })\n\t\t\t\thistory.pushState({},'',url.href)\n\t\t\t} else if (url.hash) {\n\t\t\t\tlet query = url.hash.substr(1)\n\t\t\t\tparams = new URLSearchParams('?'+query)\n\t\t\t\turl = url.with({ hash:'' })\n\t\t\t\thistory.pushState({},'',url.href)\n\t\t\t}\n\t\t\tif (params) {\n\t\t\t\tcode = params.get('code')\n\t\t\t\tstate = params.get('state')\n\t\t\t\tlet storedState = options.state.get('metro/state')\n\t\t\t\tif (!state || state!==storedState) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (code) {\n\t\t\t\t\toptions.tokens.set('authorization_code', code)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the access_token. If the authorization_code hasn't been retrieved yet,\n\t * it will first try to get that, using the options.callbacks.authorize function.\n\t * If a refresh_token is also returned, it will store that in the options.tokens storage.\n\t */\n\tasync function fetchAccessToken()\n\t{\n\t\tif (oauth2.grant_type === 'authorization_code' && !options.tokens.has('authorization_code')) {\n\t\t\tlet authReqURL = await getAuthorizationCodeURL()\n\t\t\tif (!options.authorize_callback || typeof options.authorize_callback !== 'function') {\n\t\t\t\tthrow metro.metroError('oauth2mw: oauth2 with grant_type:authorization_code requires a callback function in client options.authorize_callback')\n\t\t\t}\n\t\t\tlet token = await options.authorize_callback(authReqURL)\n\t\t\tif (token) {\n\t\t\t\toptions.tokens.set('authorization_code', token)\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\tlet tokenReq = getAccessTokenRequest()\n\t\tlet response = await options.client.post(tokenReq) //OAuth2.1 RFC 3.2\n\t\tif (!response.ok) {\n\t\t\tlet msg = await response.text()\n\t\t\tthrow metro.metroError('OAuth2mw: fetch access_token: '+response.status+': '+response.statusText, {cause: tokenReq} )\n\t\t}\n\t\tlet data = await response.json()\n\t\t// OAuth2.1 RFC 3.2.3\n\t\toptions.tokens.set('access_token', {\n\t\t\tvalue: data.access_token,\n\t\t\texpires: getExpires(data.expires_in),\n\t\t\ttype: data.token_type,\n\t\t\tscope: data.scope\n\t\t})\n\t\tif (data.refresh_token) {\n\t\t\tlet token = {\n\t\t\t\tvalue: data.refresh_token\n\t\t\t}\n\t\t\toptions.tokens.set('refresh_token', token)\n\t\t}\n\t\toptions.tokens.delete('authorization_code') // no longer valid\n\t\treturn data\n\t}\n\n\t/**\n\t * Fetches a new access_token using a stored refresh_token\n\t * If a new refresh_token is also returned, it will update the stored refresh_token\n\t * OAuth2.1 RFC 4.3\n\t */\n\tasync function refreshAccessToken()\n\t{\n\t\tlet refreshTokenReq = getAccessTokenRequest('refresh_token')\n\t\tlet response = await options.client.post(refreshTokenReq)\n\t\tif (!response.ok) {\n\t\t\tthrow metro.metroError('OAuth2mw: refresh access_token: '+response.status+': '+response.statusText, {cause: refreshTokenReq} )\n\t\t}\n\t\tlet data = await response.json()\n\t\toptions.tokens.set('access_token', {\n\t\t\tvalue: data.access_token,\n\t\t\texpires: getExpires(data.expires_in),\n\t\t\ttype: data.token_type,\n\t\t\tscope: data.scope\n\t\t})\n\t\tif (data.refresh_token) {\n\t\t\tlet token = {\n\t\t\t\tvalue: data.refresh_token\n\t\t\t}\n\t\t\toptions.tokens.set('refresh_token', token)\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t\treturn data\n\t}\n\n\t/**\n\t * Returns the URL to use to get a authorization_code\n\t */\n\tasync function getAuthorizationCodeURL()\n\t{\n\t\tif (!oauth2.authorization_endpoint) {\n\t\t\tthrow metro.metroError('oauth2mw: Missing options.oauth2_configuration.authorization_endpoint')\n\t\t}\n\t\tlet url = metro.url(oauth2.authorization_endpoint, {hash: ''}) // OAuth2.1 RFC 3.1\n\t\tassert(oauth2, {\n\t\t\tclient_id: /.+/,\n\t\t\tredirect_uri: /.+/,\n\t\t\tscope: /.*/\n\t\t})\n\t\tlet search = {\n\t\t\tresponse_type: 'code', // implicit flow uses 'token' here, but is not considered safe, so not supported\n\t\t\tclient_id: oauth2.client_id,\n\t\t\tredirect_uri: oauth2.redirect_uri,\n\t\t\tstate: oauth2.state || createState(40) // OAuth2.1 RFC says optional, but its a good idea to always add/check it\n\t\t}\n\t\tif (oauth2.response_type) {\n\t\t\tsearch.response_type = oauth2.response_type\n\t\t}\n\t\tif (oauth2.response_mode) {\n\t\t\tsearch.response_mode = oauth2.response_mode\n\t\t}\n\t\toptions.state.set(search.state)\n\t\tif (oauth2.client_secret) {\n\t\t\tsearch.client_secret = oauth2.client_secret\n\t\t}\n\t\tif (oauth2.code_verifier) { //PKCE\n\t\t\toptions.tokens.set('code_verifier', oauth2.code_verifier)\n\t\t\tsearch.code_challenge = await generateCodeChallenge(oauth2.code_verifier)\n\t\t\tsearch.code_challenge_method = 'S256'\n\t\t}\n\t\tif (oauth2.scope) {\n\t\t\tsearch.scope = oauth2.scope\n\t\t}\n\t\tif (oauth2.prompt) {\n\t\t\tsearch.prompt = oauth2.prompt\n\t\t}\n\t\treturn metro.url(url, { search })\n\t}\n\n\n\t/**\n\t * Returns a token endpoint request with all the correct parameters, given the\n\t * grant_type. This can then be used in a metro.post.\n\t */\n\tfunction getAccessTokenRequest(grant_type=null)\n\t{\n\t\tassert(oauth2, {\n\t\t\tclient_id: /.+/,\n\t\t\tredirect_uri: /.+/\n\t\t})\n\t\tif (!oauth2.token_endpoint) {\n\t\t\tthrow metro.metroError('oauth2mw: Missing options.endpoints.token url')\n\t\t}\n\t\tlet url = metro.url(oauth2.token_endpoint, {hash: ''}) // OAuth2.1 RFC 3.2\n\t\tlet params = {\n\t\t\tgrant_type: grant_type || oauth2.grant_type,\n\t\t\tclient_id: oauth2.client_id\n\t\t}\n\t\tif (oauth2.client_secret) {\n\t\t\tparams.client_secret = oauth2.client_secret\n\t\t}\n\t\tif (oauth2.scope) {\n\t\t\tparams.scope = oauth2.scope\n\t\t}\n\t\tswitch(params.grant_type) {\n\t\t\tcase 'authorization_code':\n\t\t\t\tparams.redirect_uri = oauth2.redirect_uri\n\t\t\t\tparams.code = options.tokens.get('authorization_code')\n\t\t\t\tconst code_verifier = options.tokens.get('code_verifier') //PKCE\n\t\t\t\t// use previously stored code_verifier, not the current random generated one\n\t\t\t\t// previously stored code_verifier is linked to the code_challenge already sent\n\t\t\t\tif (code_verifier) {\n\t\t\t\t\tparams.code_verifier = code_verifier\n\t\t\t\t}\n\t\t\tbreak\n\t\t\tcase 'client_credentials':\n\t\t\t\t// nothing to add\n\t\t\tbreak\n\t\t\tcase 'refresh_token':\n\t\t\t\tparams.refresh_token = oauth2.refresh_token\n\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tthrow new Error('Unknown grant_type: '.oauth2.grant_type)\n\t\t\tbreak\n\t\t}\n\t\treturn metro.request(url, {method: 'POST', body: new URLSearchParams(params) })\n\t}\n\n}\n\n/**\n * Returns true if the access token is expired. False otherwise.\n */\nexport function isExpired(token)\n{\n\tif (!token) {\n\t\treturn true\n\t}\n\tlet expires = new Date(token.expires)\n\tlet now = new Date();\n\treturn now.getTime() > expires.getTime();\n}\n\n/**\n * Returns a new Date based on a duration, which can either be a date\n * or a number of seconds from now.\n */\nexport function getExpires(duration)\n{\n\tif (duration instanceof Date) {\n\t\treturn new Date(duration.getTime()); // return a copy\n\t}\n\tif (typeof duration === 'number') {\n\t\tlet date = new Date();\n\t\tdate.setSeconds(date.getSeconds() + duration);\n\t\treturn date;\n\t}\n\tthrow new TypeError('Unknown expires type '+duration);\n}\n\n\n/**\n * returns a PKCE code_verifier, as a uint8array\n * pass it to base64url_encode() to get a string\n */\nexport function\tgenerateCodeVerifier(size=64)\n{\n\tconst code_verifier = new Uint8Array(size)\n\tglobalThis.crypto.getRandomValues(code_verifier)\n\treturn base64url_encode(code_verifier)\n}\n\n/**\n * Returns a PKCE code_challenge derived from a code_verifier\n * Note that this is an async function, so you can't just call\n * it in the defaultOptions part of oauth2mw, or it will become async as well\n * and that is not supported using metro.client().with() (yet)\n */\nexport async function generateCodeChallenge(code_verifier)\n{\n\tconst encoder = new TextEncoder()\n\tconst data = encoder.encode(code_verifier)\n\tconst challenge = await globalThis.crypto.subtle.digest('SHA-256', data)\n\treturn base64url_encode(challenge)\n}\n\n/**\n * Base64url encoding, which handles UTF-8 input strings correctly.\n */\nexport function base64url_encode(buffer)\n{\n\tconst byteString = Array.from(new Uint8Array(buffer), b => String.fromCharCode(b)).join('')\n return btoa(byteString)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * Creates a random state to use in the authorization code URL\n */\nexport function createState(length)\n{\n\tconst validChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n\tlet randomState = ''\n\tlet counter = 0\n while (counter < length) {\n randomState += validChars.charAt(Math.floor(Math.random() * validChars.length))\n counter++\n }\n\treturn randomState\n}\n\n/**\n * Returns true if a parameter 'code' is in the document.location searchParams or\n * in the hash, if parsed as searchParams\n */\nexport function isRedirected() {\n\tlet url = new URL(document.location.href)\n\tif (!url.searchParams.has('code')) {\n\t\tif (url.hash) {\n\t\t\tlet query = url.hash.substr(1)\n\t\t\tparams = new URLSearchParams('?'+query)\n\t\t\tif (params.has('code')) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\treturn true\n}\n\n/**\n * Returns true if there is a valid accessToken or refreshToken in the\n * tokens store.\n * @param (tokensStore.tokens|issuer) tokens - if tokens is a string, it \n * \tis assumed to be the oidc issuer, and tokens are fetched using the default\n * tokenStore. If you use a different tokenStore, pass the tokens section of it here\n */\nexport function isAuthorized(tokens) {\n\tif (typeof tokens == 'string') {//issuer\n\t\ttokens = tokenStore(tokens).tokens\n\t}\n\tlet accessToken = tokens.get('access_token')\n\tif (accessToken && !isExpired(accessToken)) {\n\t\treturn true\n\t}\n\tlet refreshToken = tokens.get('refresh_token')\n\tif (refreshToken) { // assumes refresh token is still valid\n\t\treturn true\n\t}\n\treturn false\n}", "export default function keysStore() {\n\treturn new Promise((resolve, reject) => {\n\t\tconst request = globalThis.indexedDB.open('metro', 1)\n\n\t\trequest.onupgradeneeded = () => request.result.createObjectStore('keyPairs', { keyPath: 'domain'})\n\n\t\trequest.onerror = (event) => {\n\t\t\treject(event)\n\t\t}\n\n\t\trequest.onsuccess = (event) => {\n\t\t\tconst db = event.target.result\n\t\t\tresolve({\n\t\t\t\tset: function(value, key) {\n\t\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t\tconst tx = db.transaction('keyPairs', 'readwrite', {durability: 'strict'})\n\t\t\t\t\t\tconst objectStore = tx.objectStore('keyPairs')\n\t\t\t\t\t\ttx.oncomplete = () => {\n\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttx.onerror = reject\n\t\t\t\t\t\tobjectStore.put(value, key)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tget: function(key) {\n\t\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t\tconst tx = db.transaction('keyPairs', 'readonly')\n\t\t\t\t\t\tconst objectStore = tx.objectStore('keyPairs')\n\t\t\t\t\t\tconst request = objectStore.get(key)\n\t\t\t\t\t\trequest.onsuccess = () => {\n\t\t\t\t\t\t\tresolve(request.result)\n\t\t\t\t\t\t}\n\t\t\t\t\t\trequest.onerror = reject\n\t\t\t\t\t\ttx.onerror = reject\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tclear: function() {\n\t\t\t\t\treturn new Promise((resolve,reject) => {\n\t\t\t\t\t\tconst tx = db.transaction('keyPairs', 'readwrite')\n\t\t\t\t\t\tconst objectStore = tx.objectStore('keyPairs')\n\t\t\t\t\t\tconst request = objectStore.clear()\n\t\t\t\t\t\trequest.onsuccess = () => {\n\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t}\n\t\t\t\t\t\trequest.onerror = reject\n\t\t\t\t\t\ttx.onerror = reject\t\t\t\t\t\t\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t})\n}", "const encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nfunction buf(input) {\n if (typeof input === 'string') {\n return encoder.encode(input);\n }\n return decoder.decode(input);\n}\nfunction checkRsaKeyAlgorithm(algorithm) {\n if (typeof algorithm.modulusLength !== 'number' || algorithm.modulusLength < 2048) {\n throw new OperationProcessingError(`${algorithm.name} modulusLength must be at least 2048 bits`);\n }\n}\nfunction subtleAlgorithm(key) {\n switch (key.algorithm.name) {\n case 'ECDSA':\n return { name: key.algorithm.name, hash: 'SHA-256' };\n case 'RSA-PSS':\n checkRsaKeyAlgorithm(key.algorithm);\n return {\n name: key.algorithm.name,\n saltLength: 256 >> 3,\n };\n case 'RSASSA-PKCS1-v1_5':\n checkRsaKeyAlgorithm(key.algorithm);\n return { name: key.algorithm.name };\n case 'Ed25519':\n return { name: key.algorithm.name };\n }\n throw new UnsupportedOperationError();\n}\nasync function jwt(header, claimsSet, key) {\n if (key.usages.includes('sign') === false) {\n throw new TypeError('private CryptoKey instances used for signing assertions must include \"sign\" in their \"usages\"');\n }\n const input = `${b64u(buf(JSON.stringify(header)))}.${b64u(buf(JSON.stringify(claimsSet)))}`;\n const signature = b64u(await crypto.subtle.sign(subtleAlgorithm(key), key, buf(input)));\n return `${input}.${signature}`;\n}\nconst CHUNK_SIZE = 0x8000;\nfunction encodeBase64Url(input) {\n if (input instanceof ArrayBuffer) {\n input = new Uint8Array(input);\n }\n const arr = [];\n for (let i = 0; i < input.byteLength; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join('')).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\nfunction b64u(input) {\n return encodeBase64Url(input);\n}\nfunction randomBytes() {\n return b64u(crypto.getRandomValues(new Uint8Array(32)));\n}\nclass UnsupportedOperationError extends Error {\n constructor(message) {\n super(message ?? 'operation not supported');\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nclass OperationProcessingError extends Error {\n constructor(message) {\n super(message);\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nfunction psAlg(key) {\n switch (key.algorithm.hash.name) {\n case 'SHA-256':\n return 'PS256';\n default:\n throw new UnsupportedOperationError('unsupported RsaHashedKeyAlgorithm hash name');\n }\n}\nfunction rsAlg(key) {\n switch (key.algorithm.hash.name) {\n case 'SHA-256':\n return 'RS256';\n default:\n throw new UnsupportedOperationError('unsupported RsaHashedKeyAlgorithm hash name');\n }\n}\nfunction esAlg(key) {\n switch (key.algorithm.namedCurve) {\n case 'P-256':\n return 'ES256';\n default:\n throw new UnsupportedOperationError('unsupported EcKeyAlgorithm namedCurve');\n }\n}\nfunction determineJWSAlgorithm(key) {\n switch (key.algorithm.name) {\n case 'RSA-PSS':\n return psAlg(key);\n case 'RSASSA-PKCS1-v1_5':\n return rsAlg(key);\n case 'ECDSA':\n return esAlg(key);\n case 'Ed25519':\n return 'EdDSA';\n default:\n throw new UnsupportedOperationError('unsupported CryptoKey algorithm name');\n }\n}\nfunction isCryptoKey(key) {\n return key instanceof CryptoKey;\n}\nfunction isPrivateKey(key) {\n return isCryptoKey(key) && key.type === 'private';\n}\nfunction isPublicKey(key) {\n return isCryptoKey(key) && key.type === 'public';\n}\nfunction epochTime() {\n return Math.floor(Date.now() / 1000);\n}\nexport default async function DPoP(keypair, htu, htm, nonce, accessToken, additional) {\n const privateKey = keypair?.privateKey;\n const publicKey = keypair?.publicKey;\n if (!isPrivateKey(privateKey)) {\n throw new TypeError('\"keypair.privateKey\" must be a private CryptoKey');\n }\n if (!isPublicKey(publicKey)) {\n throw new TypeError('\"keypair.publicKey\" must be a public CryptoKey');\n }\n if (publicKey.extractable !== true) {\n throw new TypeError('\"keypair.publicKey.extractable\" must be true');\n }\n if (typeof htu !== 'string') {\n throw new TypeError('\"htu\" must be a string');\n }\n if (typeof htm !== 'string') {\n throw new TypeError('\"htm\" must be a string');\n }\n if (nonce !== undefined && typeof nonce !== 'string') {\n throw new TypeError('\"nonce\" must be a string or undefined');\n }\n if (accessToken !== undefined && typeof accessToken !== 'string') {\n throw new TypeError('\"accessToken\" must be a string or undefined');\n }\n if (additional !== undefined &&\n (typeof additional !== 'object' || additional === null || Array.isArray(additional))) {\n throw new TypeError('\"additional\" must be an object');\n }\n return jwt({\n alg: determineJWSAlgorithm(privateKey),\n typ: 'dpop+jwt',\n jwk: await publicJwk(publicKey),\n }, {\n ...additional,\n iat: epochTime(),\n jti: randomBytes(),\n htm,\n nonce,\n htu,\n ath: accessToken ? b64u(await crypto.subtle.digest('SHA-256', buf(accessToken))) : undefined,\n }, privateKey);\n}\nasync function publicJwk(key) {\n const { kty, e, n, x, y, crv } = await crypto.subtle.exportKey('jwk', key);\n return { kty, crv, e, n, x, y };\n}\nexport async function generateKeyPair(alg, options) {\n let algorithm;\n if (typeof alg !== 'string' || alg.length === 0) {\n throw new TypeError('\"alg\" must be a non-empty string');\n }\n switch (alg) {\n case 'PS256':\n algorithm = {\n name: 'RSA-PSS',\n hash: 'SHA-256',\n modulusLength: options?.modulusLength ?? 2048,\n publicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n };\n break;\n case 'RS256':\n algorithm = {\n name: 'RSASSA-PKCS1-v1_5',\n hash: 'SHA-256',\n modulusLength: options?.modulusLength ?? 2048,\n publicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n };\n break;\n case 'ES256':\n algorithm = { name: 'ECDSA', namedCurve: 'P-256' };\n break;\n case 'EdDSA':\n algorithm = { name: 'Ed25519' };\n break;\n default:\n throw new UnsupportedOperationError();\n }\n return (crypto.subtle.generateKey(algorithm, options?.extractable ?? false, ['sign', 'verify']));\n}\n", "import metro from '@muze-nl/metro'\nimport DPoP, {generateKeyPair} from 'dpop'\nimport { assert, Required, Optional, validURL } from '@muze-nl/assert'\nimport keysStore from './keysstore.mjs'\n\nexport default function dpopmw(options) {\n\n\tassert(options, {\n\t\tsite: Required(validURL),\n\t\tauthorization_endpoint: Required(validURL),\n\t\ttoken_endpoint: Required(validURL),\n\t\tdpop_signing_alg_values_supported: Optional([]) // this property is unfortunately rarely supported\n\t})\n\n\treturn async (req, next) => {\n\t\tconst keys = await keysStore()\n\t\tlet keyInfo = await keys.get(options.site)\n\t\tif (!keyInfo) {\n \t\t\t// FIXME fetch from dpop_signing_alg_values_supported\n \t\t\t// which is unfortunately not available usually\n \t\t\tlet keyPair = await generateKeyPair('ES256') // note: don't make them extractable! That potentially allows hackers to steal the privateKey\n\t\t\tkeyInfo = { domain: options.site, keyPair }\n\t\t\tawait keys.set(keyInfo)\n\t\t}\n\t\tconst url = metro.url(req.url)\n\n\t\tif (req.url.startsWith(options.authorization_endpoint)) {\n\t\t\tlet params = req.body\n\t\t\tif (params instanceof URLSearchParams || params instanceof FormData) {\n\t\t\t\tparams.set('dpop_jkt', keyInfo.keyPair.publicKey)\n\t\t\t} else {\n\t\t\t\tparams.dpop_jkt = keyInfo.keyPair.publicKey\n\t\t\t}\n\n\t\t} else if (req.url.startsWith(options.token_endpoint)) {\n\t\t\tconst dpopHeader = await DPoP(keyInfo.keyPair, req.url, req.method)\n\t\t\treq = req.with({\n\t\t\t\theaders: {\n\t\t\t\t\t'DPoP': dpopHeader\n\t\t\t\t}\n\t\t\t})\n\n\t\t} else if (req.headers.has('Authorization')) { //FIXME: not all requests use the dpop bound access token, so check which key to use, or if to add dpop at all\n\t\t\t// note: don't use options.site here, nonce can differ\n\t\t\tconst nonce = localStorage.getItem(url.host+':nonce') || undefined // null is not acceptible for DpOp()\n\t\t\tconst accessToken = req.headers.get('Authorization').split(' ')[1]\n\t\t\tconst dpopHeader = await DPoP(keyInfo.keyPair, req.url, req.method, nonce, accessToken)\n\t\t\treq = req.with({\n\t\t\t\theaders: {\n\t\t\t\t\t'Authorization': 'DPoP '+accessToken,\n\t\t\t\t\t'DPoP': dpopHeader\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tlet response = await next(req)\n\t\tif (response.headers.get('DPoP-Nonce')) {\n\t\t\t// note: don't use options.site here, nonce can differ\n\t\t\tlocalStorage.setItem(url.host+':nonce', response.headers.get('DPoP-Nonce'))\n\t\t}\n\t\treturn response\n\t}\n\t\n}", "import { error } from '@muze-nl/assert'\n\nexport const MustHave = (...options) => \n\t(value, root) => {\n\t\tif (options.filter(o => root.hasOwnKey(o)).length > 0) {\n\t\t\treturn false\n\t\t}\n\t\treturn error('root data must have all of', root, options)\n\t}\n\nexport const MustInclude = (...options) =>\n\t(value) => {\n\t\tif (Array.isArray(value) && options.filter(o => !value.includes(o)).length == 0) {\n\t\t\treturn false\n\t\t} else {\n\t\t\treturn error('data must be an array which includes',value,options)\n\t\t}\n\t}\n\n//TODO: add link to spec\nexport const validJWK = [\n\t'HS256','HS384','HS512','RS256','RS384','RS512','ES256','ES384','ES512'\n]\n\n//TODO: add link to spec\n// FIXME: enter correct values\nexport const validJWA = [\n\t'HS256','HS384','HS512','RS256','RS384','RS512','ES256','ES384','ES512'\n]\n\n//TODO: add link to spec\nexport const validAuthMethods = [\n\t'client_secret_post', 'client_secret_basic','client_secret_jwt','private_key_jwt'\n]\n", "/**\n * This module adheres to OpenID Connect Discovery 1.0 incorporating errata set 2 - december 15, 2023\n * https://openid.net/specs/openid-connect-discovery-1_0.html\n */\nimport metro from '@muze-nl/metro'\nimport jsonmw from '@muze-nl/metro/src/mw/json.mjs'\nimport throwermw from '@muze-nl/metro/src/mw/thrower.mjs'\nimport { validJWA, MustInclude, validAuthMethods } from './oidc.util.mjs'\nimport { assert, fails, Required, Recommended, Optional, oneOf, anyOf, allOf, validURL, instanceOf, not, error } from '@muze-nl/assert'\n\n/**\n * Given options.issuer will get the .well-known/openid-configuration information\n * parse it, assert if follows the specification and return it as a javascript object\n * @param options.issuer Required: URL with the root of the oidc issuer\n * @param options.client Optional: metro client to use in the request\n * @returns object with openid-configuration\n * @throws Error when a network error occurs while fetching openid-configuration\n * @throws assertError when either the options or the openid-configuration fail assertions (and assertion testing is enabled)\n */\nexport default async function oidcDiscovery(options={}) {\n\tassert(options, {\n\t\tclient: Optional(instanceOf(metro.client().constructor)),\n\t\tissuer: Required(validURL)\n\t})\n\n\tconst defaultOptions = {\n\t\tclient: metro.client().with(throwermw()).with(jsonmw()),\n\t\trequireDynamicRegistration: false\n\t}\n\n\toptions = Object.assign({},defaultOptions,options)\n\n\tconst TestSucceeded = false\n\tfunction MustUseHTTPS(url) {\n\t\treturn TestSucceeded // FIXME todo\n\t}\n\n\t// https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata\n\t// @TODO: this is a first approximation of the specced requirements, needs to implement\n\t// all MUST/MUST NOT etc. notes in the specification.\n\tconst openid_provider_metadata = {\n\t\tissuer: Required(allOf(options.issuer, MustUseHTTPS)),\n\t\tauthorization_endpoint: Required(validURL),\n\t\ttoken_endpoint: Required(validURL),\n\t\tuserinfo_endpoint: Recommended(validURL), // todo: test for https protocol\n\t\tjwks_uri: Required(validURL),\n\t\tregistration_endpoint: options.requireDynamicRegistration \n\t\t\t? Required(validURL) \n\t\t\t: Recommended(validURL),\n\t\tscopes_supported: Recommended(MustInclude('openid')),\n\t\tresponse_types_supported: options.requireDynamicRegistration\n\t\t\t? Required(MustInclude('code','id_token','id_token token')) \n\t\t\t: Required([]),\n\t\tresponse_modes_supported: Optional([]),\n\t\tgrant_types_supported: options.requireDynamicRegistration\n\t\t\t? Optional(MustInclude('authorization_code')) // implicit is required according to the spec, but not used in web apps\n\t\t\t: Optional([]),\n\t\tacr_values_supported: Optional([]),\n\t\tsubject_types_supported: Required([]),\n\t\tid_token_signing_alg_values_supported: Required(MustInclude('RS256')),\n\t\tid_token_encryption_alg_values_supported: Optional([]),\n\t\tid_token_encryption_enc_values_supported: Optional([]),\n\t\tuserinfo_signing_alg_values_supported: Optional([]),\n\t\tuserinfo_encryption_alg_values_supported: Optional([]),\n\t\tuserinfo_encryption_enc_values_supported: Optional([]),\n\t\trequest_object_signing_alg_values_supported: Optional(MustInclude('RS256')), // not testing for 'none'\n\t\trequest_object_encryption_alg_values_supported: Optional([]),\n\t\trequest_object_encryption_enc_values_supported: Optional([]),\n\t\ttoken_endpoint_auth_methods_supported: Optional(anyOf(...validAuthMethods)),\n\t\ttoken_endpoint_auth_signing_alg_values_supported: Optional(MustInclude('RS256'), not(MustInclude('none'))),\n\t\tdisplay_values_supported: Optional(anyOf('page','popup','touch','wap')),\n\t\tclaim_types_supported: Optional(anyOf('normal','aggregated','distributed')),\n\t\tclaims_supported: Recommended([]),\n\t\tservice_documentation: Optional(validURL),\n\t\tclaims_locales_supported: Optional([]),\n\t\tui_locales_supported: Optional([]),\n\t\tclaims_parameter_supported: Optional(Boolean),\n\t\trequest_parameter_supported: Optional(Boolean),\n\t\trequest_uri_parameter_supported: Optional(Boolean),\n\t\top_policy_uri: Optional(validURL),\n\t\top_tos_uri: Optional(validURL)\t\n\t}\n\n\t// fetch openid configuration from wellknown and return the json\n\tconst configURL = metro.url(options.issuer, '.well-known/openid-configuration')\n\n\tconst response = await options.client.get(\n\t\t// https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest\n\t\t// note: this allows path components in the options.issuer url\n\t\tconfigURL\n\t)\n\tconst openid_config = response.data\n\tassert(openid_config, openid_provider_metadata)\n\n\t// https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationValidation\n\tassert(openid_config.issuer, options.issuer)\n\treturn openid_config\n}", "/**\n * This module adheres to OpenID Connect Dynamic Client Registration 1.0 \n * incorporating errata set 2 - december 15, 2023\n * https://openid.net/specs/openid-connect-registration-1_0.html\n */\nimport metro from '@muze-nl/metro'\nimport jsonmw from '@muze-nl/metro/src/mw/json.mjs'\nimport throwermw from '@muze-nl/metro/src/mw/thrower.mjs'\nimport { validJWA, validAuthMethods, MustHave } from './oidc.util.mjs'\nimport { assert, Required, Optional, oneOf, anyOf, validURL, validEmail, not, instanceOf } from '@muze-nl/assert'\n\nexport default async function register(options)\n{\n\n // https://openid.net/specs/openid-connect-registration-1_0.html#ClientMetadata\n\tconst openid_client_metadata = {\n\t\tredirect_uris: Required([validURL]),\n\t\tresponse_types: Optional([]),\n\t\tgrant_types: Optional(anyOf('authorization_code','refresh_token')), //TODO: match response_types with grant_types\n\t\tapplication_type: Optional(oneOf('native','web')),\n\t\tcontacts: Optional([validEmail]),\n\t\tclient_name: Optional(String),\n\t\tlogo_uri: Optional(validURL),\n\t\tclient_uri: Optional(validURL),\n\t\tpolicy_uri: Optional(validURL),\n\t\ttos_uri: Optional(validURL),\n\t\tjwks_uri: Optional(validURL, not(MustHave('jwks'))),\n\t\tjwks: Optional(validURL, not(MustHave('jwks_uri'))),\n\t\tsector_identifier_uri: Optional(validURL),\n\t\tsubject_type: Optional(String),\n\t\tid_token_signed_response_alg: Optional(oneOf(...validJWA)),\n\t\tid_token_encrypted_response_alg: Optional(oneOf(...validJWA)),\n\t\tid_token_encrypted_response_enc: Optional(oneOf(...validJWA), MustHave('id_token_encrypted_response_alg')),\n\t\tuserinfo_signed_response_alg: Optional(oneOf(...validJWA)),\n\t\tuserinfo_encrypted_response_alg: Optional(oneOf(...validJWA)),\n\t\tuserinfo_encrypted_response_enc: Optional(oneOf(...validJWA), MustHave('userinfo_encrypted_response_alg')),\n\t\trequest_object_signing_alg: Optional(oneOf(...validJWA)),\n\t\trequest_object_encryption_alg: Optional(oneOf(...validJWA)),\n\t\trequest_object_encryption_enc: Optional(oneOf(...validJWA)),\n\t\ttoken_endpoint_auth_method: Optional(oneOf(...validAuthMethods)),\n\t\ttoken_endpoint_auth_signing_alg: Optional(oneOf(...validJWA)),\n\t\tdefault_max_age: Optional(Number),\n\t\trequire_auth_time: Optional(Boolean),\n\t\tdefault_acr_values: Optional([String]),\n\t\tinitiate_login_uri: Optional([validURL]),\n\t\trequest_uris: Optional([validURL])\n\t}\n\n\tassert(options, {\n\t\tclient: Optional(instanceOf(metro.client().constructor)),\n\t\tregistration_endpoint: validURL, \n\t\tclient_info: openid_client_metadata\n\t})\n\n\tconst defaultOptions = {\n\t\tclient: metro.client().with(throwermw()).with(jsonmw())\n\t}\n\n\toptions = Object.assign({}, defaultOptions, options)\n\n\n\tlet response = await options.client\n\t\t.post(options.registration_endpoint, {\n\t\t\tbody: options.client_info\n\t\t})\n\tlet info = response.data\n\tif (!info.client_id || !info.client_secret) {\n\t\tthrow metro.metroError('metro.oidc: Error: dynamic registration of client failed, no client_id or client_secret returned', response)\n\t}\n\toptions.client_info = Object.assign(options.client_info, info)\n\treturn options.client_info\n}", "export default function oidcStore(site) {\n\tlet store\n\tif (typeof localStorage !== 'undefined') {\n\t\tstore = {\n\t\t\tget: (name) => JSON.parse(localStorage.getItem('metro/oidc:'+site+':'+name)),\n\t\t\tset: (name, value) => localStorage.setItem('metro/oidc:'+site+':'+name, JSON.stringify(value)),\n\t\t\thas: (name) => localStorage.getItem('metro/oidc:'+site+':'+name)!==null\n\t\t}\n\t} else {\n\t\tlet storeMap = new Map()\n\t\tstore = {\n\t\t\tget: (name) => JSON.parse(storeMap.get('metro/oidc:'+site+':'+name)||null),\n\t\t\tset: (name, value) => storeMap.set('metro/oidc:'+site+':'+name, JSON.stringify(value)),\n\t\t\thas: (name) => storeMap.has('metro/oidc:'+site+':'+name)\n\t\t}\n\t}\n\treturn store\n}", "import * as metro from '@muze-nl/metro/src/metro.mjs'\nimport oauth2mw, * as oauth2 from '@muze-nl/metro-oauth2/src/oauth2.mjs'\nimport dpopmw from '@muze-nl/metro-oauth2/src/oauth2.dpop.mjs'\nimport { assert, Required, Optional, validURL, instanceOf } from '@muze-nl/assert'\nimport discover from './oidc.discovery.mjs'\nimport register from './oidc.register.mjs'\nimport oidcStore from './oidc.store.mjs'\n\nexport default function oidcmw(options={}) {\n\n\tconst defaultOptions = {\n\t\tclient: metro.client(),\n\t\tforce_authorization: false,\n\t\tuse_dpop: true,\n\t\tauthorize_callback: async url => {\n\t\t\tif (window.location.href != url.href) {\n\t\t\t\twindow.location.replace(url.href)\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\t}\n\n\toptions = Object.assign({}, defaultOptions, options)\n\n\tassert(options, {\n\t\tclient: Required(instanceOf(metro.client().constructor)), // required because it is set in defaultOptions\n\t\tclient_info: Required(),\n\t\tissuer: Required(validURL),\n\t\toauth2: Optional({}),\n\t\topenid_configuration: Optional()\n\t})\n\n\tif (!options.store) {\n\t\toptions.store = oidcStore(options.issuer)\n\t}\n\tif (!options.openid_configuration && options.store.has('openid_configuration')) {\n\t\toptions.openid_configuration = options.store.get('openid_configuration')\n\t}\n\tif (!options.client_info.client_id && options.store.has('client_info')) {\n\t\toptions.client_info = options.store.get('client_info')\n\t}\n\n\treturn async (req, next) => {\n\t\tlet res\n\t\tif (!options.force_authorization) {\n\t\t\ttry {\n\t\t\t\tres = await next(req)\n\t\t\t} catch(err) {\n\t\t\t\tif (res.status!=401 && res.status!=403) {\n\t\t\t\t\tthrow err\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res.ok || (res.status!=401 && res.status!=403)) {\n\t\t\t\treturn res\n\t\t\t}\n\t\t}\n\t\tif (!options.openid_configuration) {\n\t\t\toptions.openid_configuration = await discover({\n\t\t\t\tissuer: options.issuer\n\t\t\t})\n\t\t\toptions.store.set('openid_configuration', options.openid_configuration)\n\t\t}\n\n\t\tif (!options.client_info?.client_id) {\n\t\t\tassert(options.client_info?.client_name, Required())\n\t\t\tif (!options.openid_configuration.registration_endpoint) {\n\t\t\t\tthrow metro.metroError('metro.oidcmw: Error: issuer '+options.issuer+' does not support dynamic client registration, but you haven\\'t specified a client_id')\n\t\t\t}\n\t\t\toptions.client_info = await register({\n\t\t\t\tregistration_endpoint: options.openid_configuration.registration_endpoint,\n\t\t\t\tclient_info: options.client_info\n\t\t\t})\n\t\t\toptions.store.set('client_info', options.client_info)\n\t\t}\n\n\t\t// now initialize an oauth2 client stack, using options.client as default\n\t\t// with forceAuthentication: true\n\t\tconst scope = options.scope || 'openid'\n\n\t\tconst oauth2Options = Object.assign(\n\t\t\t{\n\t\t\t\tsite: options.issuer,\n\t\t\t\tclient: options.client,\n\t\t\t\tforce_authorization: true,\n\t\t\t\tauthorize_callback: options.authorize_callback,\n\t\t\t\toauth2_configuration: {\n\t\t\t\t\tclient_id: options.client_info.client_id,\n\t\t\t\t\tclient_secret: options.client_info.client_secret,\n\t\t\t\t\tgrant_type: 'authorization_code',\n\t\t\t\t\tresponse_type: 'code',\n\t\t\t\t\tresponse_mode: 'query',\n\t\t\t\t\tauthorization_endpoint: options.openid_configuration.authorization_endpoint,\n\t\t\t\t\ttoken_endpoint: options.openid_configuration.token_endpoint,\n\t\t\t\t\tscope, //FIXME: should only use scopes supported by server\n\t\t\t\t\tredirect_uri: options.client_info.redirect_uris[0]\n\t\t\t\t}\n\t\t\t}\n\t\t\t//...\n\t\t)\n\t\t\n\t\tconst storeIdToken = async (req, next) => {\n\t\t\tconst res = await next(req)\n\t\t\tconst contentType = res.headers.get('content-type')\n\t\t\tif (contentType?.startsWith('application/json')) {\n\t\t\t\t//FIXME: check that this is actually the token endpoint\n\t\t\t\tlet id_token = res.data?.id_token\n\t\t\t\tif (!id_token) {\n\t\t\t\t\tconst res2 = res.clone() // otherwise res.body can't be read again\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet data = await res2.json()\n\t\t\t\t\t\tif (data && data.id_token) {\n\t\t\t\t\t\t\tid_token = data.id_token\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t// ignore errors\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (id_token) {\n\t\t\t\t\toptions.store.set('id_token', id_token)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn res\n\t\t}\n\n\t\tlet oauth2client = options.client.with(options.issuer).with(storeIdToken)\n\n\t\tif (options.use_dpop) {\n\t\t\tconst dpopOptions = {\n\t\t\t\tsite: options.issuer,\n\t\t\t\tauthorization_endpoint: options.openid_configuration.authorization_endpoint,\n\t\t\t\ttoken_endpoint: options.openid_configuration.token_endpoint,\n\t\t\t\tdpop_signing_alg_values_supported: options.openid_configuration.dpop_signing_alg_values_supported\n\t\t\t}\n\t\t\toauth2client = oauth2client.with(dpopmw(dpopOptions)) // add DPoP headers in requests with Authorization headers\n\t\t\toauth2Options.client = oauth2client // make sure oath2 token request use dpop\n\t\t}\n\n\t\toauth2client = oauth2client.with(oauth2mw(oauth2Options))\n\n\t\tres = await oauth2client.fetch(req)\n\n\t\treturn res\n\t}\n\n}\n\nexport function isRedirected() {\n\treturn oauth2.isRedirected()\n}\n\nexport function idToken(options) {\n\tif (!options.store) {\n\t\tif (!options.issuer) {\n\t\t\tthrow metro.metroError('Must supply options.issuer or options.store to get the id_token')\n\t\t}\n\t\toptions.store = oidcStore(options.issuer)\n\t}\n\treturn options.store.get('id_token')\n}\n", "import metro from '@muze-nl/metro'\nimport oauth2 from '@muze-nl/metro-oauth2'\nimport oidcDiscover from './oidc.discovery.mjs'\nimport oidcRegister from './oidc.register.mjs'\nimport oidcmw, {isRedirected, idToken} from './oidcmw.mjs'\n\nconst oidc = {\n\toidcmw,\n\tdiscover: oidcDiscover,\n\tregister: oidcRegister,\n\tisRedirected,\n\tidToken\n}\n\nif (!globalThis.metro.oidc) {\n\tglobalThis.metro.oidc = oidc\n}\n\nexport default oidc"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["options", "req", "next", "middleware", "params", "options", "url", "json", "url", "index", "url", "params", "response", "encoder", "request", "resolve", "reject", "url", "params", "response", "url", "response", "response", "url", "req", "next", "res", "res2", "isRedirected", "isRedirected"]
|
|
7
7
|
}
|