@muze-nl/metro-oidc 0.1.2 → 0.1.3

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.
@@ -1169,8 +1169,8 @@
1169
1169
  has: () => localStorage.getItem("metro/state:" + site) !== null
1170
1170
  };
1171
1171
  localTokens = {
1172
- get: (name) => localStorage.getItem(site + ":" + name),
1173
- set: (name, value) => localStorage.setItem(site + ":" + name, value),
1172
+ get: (name) => JSON.parse(localStorage.getItem(site + ":" + name)),
1173
+ set: (name, value) => localStorage.setItem(site + ":" + name, JSON.stringify(value)),
1174
1174
  has: (name) => localStorage.getItem(site + ":" + name) !== null
1175
1175
  };
1176
1176
  } else {
@@ -1499,6 +1499,20 @@
1499
1499
  return randomState;
1500
1500
  }
1501
1501
  };
1502
+ function isRedirected() {
1503
+ let url2 = new URL(document.location.href);
1504
+ if (!url2.searchParams.has("code")) {
1505
+ if (url2.hash) {
1506
+ let query = url2.hash.substr(1);
1507
+ params = new URLSearchParams("?" + query);
1508
+ if (params.has("code")) {
1509
+ return true;
1510
+ }
1511
+ }
1512
+ return false;
1513
+ }
1514
+ return true;
1515
+ }
1502
1516
 
1503
1517
  // src/oidc.store.mjs
1504
1518
  function oidcStore(site) {
@@ -1600,12 +1614,16 @@
1600
1614
  return res;
1601
1615
  };
1602
1616
  }
1617
+ function isRedirected2() {
1618
+ return isRedirected();
1619
+ }
1603
1620
 
1604
1621
  // src/browser.mjs
1605
1622
  var oidc = {
1606
1623
  discover: oidcDiscovery,
1607
1624
  register,
1608
- oidcmw
1625
+ oidcmw,
1626
+ isRedirected: isRedirected2
1609
1627
  };
1610
1628
  globalThis.oidc = oidc;
1611
1629
  })();
@@ -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", "../src/oidc.util.mjs", "../src/oidc.discovery.mjs", "../src/oidc.register.mjs", "../node_modules/@muze-nl/metro-oauth2/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", "../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 */\nclass Client\n{\n\t#options = {\n\t\turl: typeof window != 'undefined' ? window.location : 'https://localhost'\n\t}\n\t#verbs = ['get','post','put','delete','patch','head','options','query']\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.#options.url = ''+option\n\t\t\t} else if (option instanceof Client) {\n\t\t\t\tObject.assign(this.#options, option.#options)\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.#options[param] = option[param](this.#options[param], this.#options)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#options[param] = option[param]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.#options.verbs) {\n\t\t\tthis.#verbs = this.#options.verbs\n\t\t\tdelete this.#options.verbs\n\t\t}\n\n\t\tfor (const verb of this.#verbs) {\n\t\t\tthis[verb] = async function(...options) {\n\t\t\t\treturn this.fetch(request(\n\t\t\t\t\tthis.#options,\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\tObject.freeze(this)\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-value/', middlewares[index])\n\t\t}\n\t\tif (!Array.isArray(this.#options.middlewares)) {\n\t\t\tthis.#options.middlewares = []\n\t\t}\n\t\tthis.#options.middlewares = this.#options.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/missing-url-param/', 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|| Array.isArray(options)\n\t\t\t|| options instanceof String) \n\t\t{\n\t\t\tthrow metroError('metro.client.fetch: Options is not an object')\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\t// even though a Proxy is supposed to be 'invisible'\n\t\t\t\t// fetch() doesn't work with the proxy (in Firefox), \n\t\t\t\t// you need the actual Request object here\n\t\t\t\t// and the actual body if you use e.g. FormData\n\t\t\t\tif (req.body && req.body[Symbol.metroSource]) {\n\t\t\t\t\tlet body = req.body[Symbol.metroSource]\n\t\t\t\t\treq = new Request(req[Symbol.metroSource], { body })\n\t\t\t\t} else {\n\t\t\t\t\treq = req[Symbol.metroSource]\n\t\t\t\t}\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.#options?.middlewares?.slice() || [])\n\t\toptions = Object.assign({}, this.#options, 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(this, ...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(...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 bodyProxy(body, r)\n{\n\tlet source = r.body\n\tif (!source) {\n\t\t//Firefox does not allow access to Request.body (undefined)\n\t\t//Chrome and Nodejs do, so mimic the correct (documented)\n\t\t//result here\n\t\tif (body === null) {\n\t\t\tsource = new ReadableStream()\n\t\t} else if (body instanceof ReadableStream) {\n\t\t\tsource = body\n\t\t} else if (body instanceof Blob) {\n\t\t\tsource = body.stream()\n\t\t} else {\n\t\t\tsource = new ReadableStream({\n\t\t\t\tstart(controller) {\n\t\t\t\t\tlet chunk\n\t\t\t\t\tswitch(typeof body) {\n\t\t\t\t\t\tcase 'object':\n\t\t\t\t\t\t\tif (typeof body.toString == 'function') {\n\t\t\t\t\t\t\t\t// also catches URLSearchParams\n\t\t\t\t\t\t\t\tchunk = body.toString()\n\t\t\t\t\t\t\t} else if (body instanceof FormData) {\n\t\t\t\t\t\t\t\tchunk = new URLSearchParams(body).toString()\n\t\t\t\t\t\t\t} else if (body instanceof ArrayBuffer\n\t\t\t\t\t\t\t\t|| ArrayBuffer.isView(body)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// catchs TypedArrays - e.g. Uint16Array\n\t\t\t\t\t\t\t\tchunk = body\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthrow metroError('Cannot convert body to ReadableStream', body)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'string':\n\t\t\t\t\t\tcase 'number':\n\t\t\t\t\t\tcase 'boolean':\n\t\t\t\t\t\t\tchunk = body\n\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow metroError('Cannot convert body to ReadableStream', body)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcontroller.enqueue(chunk)\n\t\t\t\t\tcontroller.close()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\treturn new Proxy(source, {\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 body\n\t\t\t\tbreak\n\t\t\t\tcase 'toString':\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\treturn ''+body\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (body && typeof body == 'object') {\n\t\t\t\tif (prop in body) {\n\t\t\t\t\tif (typeof body[prop] == 'function') {\n\t\t\t\t\t\treturn function(...args) {\n\t\t\t\t\t\t\treturn body[prop].apply(body, args)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn body[prop]\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (prop in target && prop != 'toString') {\n\t\t\t\t// skipped toString, since it has no usable output\n\t\t\t\t// and body may have its own toString\n\t\t\t\tif (typeof target[prop] == 'function') {\n\t\t\t\t\treturn function(...args) {\n\t\t\t\t\t\treturn target[prop].apply(target, args)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn target[prop]\n\t\t\t}\n\t\t},\n\t\thas(target, prop) {\n\t\t\tif (body && typeof body == 'object') {\n\t\t\t\treturn prop in body\n\t\t\t} else {\n\t\t\t\treturn prop in target\n\t\t\t}\n\t\t},\n\t\townKeys(target) {\n\t\t\tif (body && typeof body == 'object') {\n\t\t\t\treturn Reflect.ownKeys(body)\n\t\t\t} else {\n\t\t\t\treturn Reflect.ownKeys(target)\n\t\t\t}\n\t\t},\n\t\tgetOwnPropertyDescriptor(target, prop) {\n\t\t\tif (body && typeof body == 'object') {\n\t\t\t\treturn Object.getOwnPropertyDescriptor(body,prop)\n\t\t\t} else {\n\t\t\t\treturn Object.getOwnPropertyDescriptor(target,prop)\n\t\t\t}\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\tif (typeof req[prop] == 'function') {\n\t\t\treq[prop](params[prop], params)\n\t\t} else if (typeof req[prop] != 'undefined') {\n\t\t\tif (prop == 'url') {\n\t\t\t\tparams.url = url(params.url, req.url)\n\t\t\t} else if (prop == 'headers') {\n\t\t\t\tparams.headers = new Headers(current.headers)\n\t\t\t\tif (!(req.headers instanceof Headers)) {\n\t\t\t\t\treq.headers = new Headers(req.headers)\n\t\t\t\t}\n\t\t\t\tfor (let [key, value] of req.headers.entries()) {\n\t\t\t\t\tparams.headers.set(key, value)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams[prop] = req[prop]\n\t\t\t}\n\t\t}\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 body = requestParams.body\n\tif (body) {\n\t\tif (typeof body == 'object'\n\t\t\t&& !(body instanceof String)\n\t\t\t&& !(body instanceof ReadableStream)\n\t\t\t&& !(body instanceof Blob)\n\t\t\t&& !(body instanceof ArrayBuffer)\n\t\t\t&& !(body instanceof DataView)\n\t\t\t&& !(body instanceof FormData)\n\t\t\t&& !(body instanceof URLSearchParams)\n\t\t\t&& (typeof TypedArray=='undefined' || !(body instanceof TypedArray))\n\t\t) {\n\t\t\trequestParams.body = JSON.stringify(body)\n\t\t}\n\t}\n\tlet r = new Request(requestParams.url, requestParams)\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 (body) { // body is kept in a seperate value, if it set earlier\n\t\t\t\t\t\t\toptions.unshift({ body }) // 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 'body':\n\t\t\t\t\t// Request.body is always a ReadableStream\n\t\t\t\t\t// which is a horrible API, if you want to\n\t\t\t\t\t// allow middleware to alter the body\n\t\t\t\t\t// so we keep the original body, wrap a Proxy\n\t\t\t\t\t// around it to keep the ReadableStream api\n\t\t\t\t\t// accessible, but allow access to the original\n\t\t\t\t\t// body value as well\n\t\t\t\t\tif (!body) {\n\t\t\t\t\t\tbody = target.body\n\t\t\t\t\t}\n\t\t\t\t\tif (body) {\n\t\t\t\t\t\tif (body[Symbol.metroProxy]) {\n\t\t\t\t\t\t\treturn body\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn bodyProxy(body, target)\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\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\tif (typeof res[prop] == 'function') {\n\t\t\tres[prop](params[prop], params)\n\t\t} else if (typeof res[prop] != 'undefined') {\n\t\t\tif (prop == 'url') {\n\t\t\t\tparams.url = new URL(res.url, params.url || 'https://localhost/')\n\t\t\t} else {\n\t\t\t\tparams[prop] = res[prop]\n\t\t\t}\n\t\t}\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 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 'body':\n\t\t\t\t\tif (responseParams.body) {\n\t\t\t\t\t\tif (responseParams.body[Symbol.metroProxy]) {\n\t\t\t\t\t\t\treturn responseParams.body\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn bodyProxy(responseParams.body, target)\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn bodyProxy('',target)\n\t\t\t\t\t}\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\tcase 'headers':\n\t\t\t\t\treturn target.headers\n\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tif (prop in responseParams && prop != 'toString') {\n\t\t\t\t\t\treturn responseParams[prop]\n\t\t\t\t\t}\n\t\t\t\t\tif (prop in target && prop != 'toString') {\n\t\t\t\t\t\t// skipped toString, since it has no usable output\n\t\t\t\t\t\t// and body may have its own toString\n\t\t\t\t\t\tif (typeof target[prop] == 'function') {\n\t\t\t\t\t\t\treturn function(...args) {\n\t\t\t\t\t\t\t\treturn target[prop].apply(target, args)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn target[prop]\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn undefined\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\tif (param=='search') {\n\t\t\t\t\tif (typeof option.search == 'function') {\n\t\t\t\t\t\toption.search(u.search, u)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tu.search = new URLSearchParams(option.search)\n\t\t\t\t\t}\n\t\t\t\t} else if (param=='searchParams') {\n\t\t\t\t\tappendSearchParams(u, option.searchParams)\n\t\t\t\t} else {\n\t\t\t\t\tif (!validParams.includes(param)) {\n\t\t\t\t\t\tthrow metroError('metro.url: unknown url parameter '+metroURL+'url/unknown-param-name/', param)\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof option[param] == 'function') {\n\t\t\t\t\t\toption[param](u[param], u)\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof option[param] == 'string' || option[param] instanceof String \n\t\t\t\t\t\t|| typeof option[param] == 'number' || option[param] instanceof Number\n\t\t\t\t\t\t|| typeof option[param] == 'boolean' || option[param] instanceof Boolean\n\t\t\t\t\t) {\n\t\t\t\t\t\tu[param] = ''+option[param]\n\t\t\t\t\t} else if (typeof option[param] == 'object' && option[param].toString) {\n\t\t\t\t\t\tu[param] = option[param].toString()\n\t\t\t\t\t} else {\n\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}\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\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}\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 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, only FormData or Object supported',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\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", "import * as metro from '../metro.mjs'\n\nexport default function jsonmw(options) {\n\toptions = Object.assign({\n\t\treviver: null,\n\t\treplacer: null,\n\t\tspace: ''\n\t}, options)\n\n\treturn async (req, next) => {\n\t\tif (['POST','PUT','PATCH','QUERY'].includes(req.method)) {\n\t\t\treq = req.with({\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type':'application/json',\n\t 'Accept':'application/json'\n\t\t\t\t}\n\t\t\t})\n\t\t\tif (req.body && typeof req.body[Symbol.metroSource] == 'object') {\n\t\t\t\treq = req.with({\n\t\t\t\t\tbody: JSON.stringify(req.body[Symbol.metroSource], options.replacer, options.space)\n\t\t\t\t})\n\t\t\t}\n\t\t} else {\n\t\t\treq = req.with({\n\t\t\t\theaders: {\n\t\t\t 'Accept':'application/json'\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tlet res = await next(req)\n\t\tlet body = await res.text()\n\t\tlet json = JSON.parse(body, options.reviver)\n\t\treturn res.with({\n\t\t\tbody: json\n\t\t})\n\t}\n}", "import * as metro from '../metro.mjs'\n\nexport default function thrower(options) {\n\n\treturn async (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\nwindow.metro = metro\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\tconsole.warn('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 [wKey, wVal] of Object.entries(pattern)) {\n\t\t let result = fails(data[wKey], wVal, root, path+'.'+wKey)\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\tmessage,\n\t\tfound,\n\t\texpected,\n\t\tpath\n\t}\n\tif (problems) {\n\t\tresult.problems = problems\n\t}\n\treturn result\n}\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.body[Symbol.metroSource]\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.body\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}", "/**\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 const assert = (source, test) => {\n\tif (globalThis.assertEnabled) {\n\t\tlet problems = fails(source,test)\n\t\tif (problems) {\n\t\t\tthrow new assertError('Assertions failed', problems, source)\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 const Optional = (pattern) => \n\t(data) => (data==null || typeof data == 'undefined') ? false : fails(data, pattern)\n\n/**\n * Tests a given value against a pattern, always.\n */\nexport const Required = (pattern) =>\n\t(data) => fails(data, pattern)\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 const Recommended = (pattern) =>\n\t(data) => (data==null || typeof data == 'undefined') ? (() => {\n\t\tconsole.warning('data does not contain recommended value', data, pattern)\n\t\treturn false\n\t})() : fails(data, pattern)\n\n/**\n * Tests a given value against a set of patterns, untill one succeeds\n * Returns an error if none succeed\n */\nexport const oneOf = (...patterns) => \n\t(data) => {\n\t\tfor(let pattern of patterns) {\n\t\t\tif (!fails(data, pattern)) {\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)\n\t}\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 const anyOf = (...patterns) =>\n\t(data) => {\n\t\tif (!Array.isArray(data)) {\n\t\t\treturn error('data is not an array',data,'anyOf')\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)\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\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) {\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\treturn error('data is not a valid url',data,'validURL')\n\t\t}\n\t} catch(e) {\n\t\treturn error('data is not a valid url',data,'validURL')\n\t}\n\treturn false\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) {\n\tif (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(data)) {\n\t\treturn false // data matches email regex\n\t}\n\treturn error('data is not a valid email',data,'validEmail')\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 const instanceOf = (constructor) =>\n\t(data) => !(data instanceof constructor) \n\t\t? error('data is not an instanceof pattern',data,constructor)\n\t\t: false\n\n/**\n * Runs the given test pattern on a value, if the test succeeds, it fails\n * the not() test.\n */\nexport const not = (pattern) =>\n\t(data) => fails(data, pattern) \n\t\t? false \n\t\t: error('data matches pattern, when required not to', data, pattern)\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) {\n\tif (!root) {\n\t\troot = data\n\t}\n\tlet problems = []\n\tif (pattern === Boolean) {\n\t\tif (typeof data != 'boolean') {\n\t\t\tproblems.push(error('data is not a boolean', data, pattern))\n\t\t}\t\t\n\t} else if (pattern === Number) {\n\t\tif (typeof data != 'number') {\n\t\t\tproblems.push(error('data is not a number', data, pattern))\n\t\t}\n\t} else if (pattern instanceof RegExp) {\n \tif (Array.isArray(data)) {\n\t\t\tlet index = data.findIndex(element => fails(element,pattern,root))\n if (index>-1) {\n \tproblems.push(error('data['+index+'] does not match pattern', data[index], pattern))\n }\n \t} else if (!pattern.test(data)) {\n \tproblems.push(error('data does not match pattern', data, pattern))\n }\n } else if (pattern instanceof Function) {\n if (pattern(data, root)) {\n \tproblems.push(error('data does not match function', data, pattern))\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,[]))\n\t\t}\n\t\tfor (p of pattern) {\n\t\t\tlet problem = fails(data, p, root)\n\t\t\tif (Array.isArray(problem)) {\n\t\t\t\tproblems.concat(problem)\n\t\t\t} else if (problem) {\n\t\t\t\tproblems.push(problem)\n\t\t\t}\n \t}\n } else if (pattern && typeof pattern == 'object') {\n if (Array.isArray(data)) {\n let index = data.findIndex(element => fails(element,pattern,root))\n if (index>-1) {\n \tproblems.push(error('data['+index+'] does not match pattern', data[index], pattern))\n }\n } else if (!data || typeof data != 'object') {\n \tproblems.push(error('data is not an object, pattern is', data, pattern))\n } else {\n \tif (data instanceof URLSearchParams) {\n \t\tdata = Object.fromEntries(data)\n \t}\n\t let p = problems[problems.length-1]\n\t for (const [wKey, wVal] of Object.entries(pattern)) {\n\t let result = fails(data[wKey], wVal, root)\n\t if (result) {\n\t \tif (!p || typeof p == 'string') {\n\t \t\tp = {}\n\t \t\tproblems.push(error(p, data[wKey], wVal))\n\t \t}\n\t \tp[wKey] = result.problems\n\t }\n\t }\n\t }\n } else {\n \tif (pattern!=data) {\n \t\tproblems.push(error('data and pattern are not equal', data, pattern))\n \t}\n }\n if (problems.length) {\n \treturn problems\n }\n return false\n}\n\n\n/**\n * Class used in assert() to add problems found and details to the error object\n */\nclass assertError extends Error {\n\tconstructor(message, problems, ...details) {\n\t\tsuper(message)\n\t\tthis.problems = problems\n\t\tthis.details = details\n\t}\n}\n\n/**\n * Returns an object with message, found and expected properties\n */ \nexport function error(message, found, expected) {\n\treturn {\n\t\tmessage,\n\t\tfound,\n\t\texpected\n\t}\n}\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) => localStorage.getItem(site+':'+name),\n\t\t\tset: (name, value) => localStorage.setItem(site+':'+name, 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 metro from '@muze-nl/metro'\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 */\nexport default function mwOAuth2(options)\n{\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: security.generateCodeVerifier(64)\n\t\t},\n\t\tcallbacks: {\n\t\t\tauthorize: async url => {\n\t\t\t\tif (window.location.href != url.href) {\n\t\t\t\t\twindow.location.replace(url.href)\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t}\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\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\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\tif (!options.tokens.has('access_token')) {\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\tconsole.log('caught',e)\n\t\t\t\tthrow(e)\n\t\t\t}\n\t\t\treturn oauth2authorized(req, next)\n\t\t} else if (isExpired(req)) {\n\t\t\tlet token = await fetchRefreshToken()\n\t\t\tif (!token) {\n\t\t\t\treturn metro.response('false')\n\t\t\t}\n\t\t\treturn oauth2authorized(req, next)\n\t\t} else {\n\t\t\tlet accessToken = options.tokens.get('access_token')\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 = getAuthorizationCodeURL()\n\t\t\tif (!options.callbacks.authorize || typeof options.callbacks.authorize !== 'function') {\n\t\t\t\tthrow metro.metroError('oauth2mw: oauth2 with grant_type:authorization_code requires a callback function in client options.options.callbacks.authorize')\n\t\t\t}\n\t\t\t//FIXME: authorize can do a redirect, so allow for that\n\t\t\tlet token = await options.callbacks.authorize(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\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\tfunction 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\tclient_secret: oauth2.client_secret,\n\t\t\tredirect_uri: oauth2.redirect_uri,\n\t\t\tstate: oauth2.state || security.createState(40) // OAuth2.1 RFC says optional, but its a good idea to always add/check it\n\t\t}\n\t\toptions.state.set(search.state)\n\t\tif (oauth2.code_verifier) { //PKCE\n\t\t\tdelete search.client_secret\n\t\t\tsearch.code_challenge = security.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\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} else {\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\t/**\n\t * Returns true if the access token in a request is expired. False otherwise.\n\t */\n\tfunction isExpired(req)\n\t{\n\t\tif (req.oauth2 && req.options.tokens && req.options.tokens.has('access_token')) {\n\t\t\tlet now = new Date();\n\t\t\tlet token = req.options.tokens.get('access_token')\n\t\t\treturn now.getTime() > token.expires.getTime();\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns a new Date based on a duration, which can either be a date\n\t * or a number of seconds from now.\n\t */\n\tfunction getExpires(duration)\n\t{\n\t\tif (duration instanceof Date) {\n\t\t\treturn new Date(duration.getTime()); // return a copy\n\t\t}\n\t\tif (typeof duration === 'number') {\n\t\t\tlet date = new Date();\n\t\t\tdate.setSeconds(date.getSeconds() + duration);\n\t\t\treturn date;\n\t\t}\n\t\tthrow new TypeError('Unknown expires type '+duration);\n\t}\n\n\n}\n\nexport const security = {\t\n\t/**\n\t * returns a PKCE code_verifier, as a hex encoded string\n\t */\n\tgenerateCodeVerifier: function(size=64)\n\t{\n\t\tconst code_verifier = new Uint8Array(size)\n\t\tglobalThis.crypto.getRandomValues(code_verifier)\n\t\treturn code_verifier.toString('hex')\n\t},\n\n\t/**\n\t * Returns a PKCE code_challenge derived from a code_verifier\n\t */\n\tgenerateCodeChallenge: async function(code_verifier)\n\t{\n\t\tconst b64encoded = security.base64url_encode(code_verifier)\n\t\tconst encoder = new TextEncoder()\n\t\tconst data = encoder.encode(b64encoded)\n\t\treturn await globalThis.crypto.subtle.digest('SHA-256', data)\n\t},\n\n\t/**\n\t * Base64url encoding, which handles UTF-8 input strings correctly.\n\t */\n\tbase64url_encode: function(buffer)\n\t{\n\t\tconst byteString = Array.from(new Uint8Array(buffer), b => String.fromCharCode(b)).join('')\n\t return btoa(byteString)\n\t .replace(/\\+/g, '-')\n\t .replace(/\\//g, '_')\n\t .replace(/=+$/, '');\n\t},\n\n\t/**\n\t * Creates and stores a random state to use in the authorization code URL\n\t */\n\tcreateState: function(length)\n\t{\n\t\tconst validChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n\t\tlet randomState = ''\n\t\tlet counter = 0\n\t while (counter < length) {\n\t randomState += validChars.charAt(Math.floor(Math.random() * validChars.length))\n\t counter++\n\t }\n\t\treturn randomState\n\t}\n}\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}", "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 metro from '@muze-nl/metro'\nimport oauth2mw from '@muze-nl/metro-oauth2'\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}\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 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\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\tcode_verifier: false, //disable pkce\n\t\t\t\t\tgrant_type: 'authorization_code',\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: options.openid_configuration.scope || 'openid',\n\t\t\t\t\tredirect_uri: options.client_info.redirect_uris[0] //FIXME: find the best match?\n\t\t\t\t}\n\t\t\t}\n\t\t\t//...\n\t\t)\n\t\tconst oauth2client = options.client.with(options.issuer)\n\t\t// optional: add oauth2dpop mw\n\t\t.with(oauth2mw(oauth2Options))\n\n\t\tres = await oauth2client.fetch(req)\n\t\t// ...\n\n\t\treturn res\n\t}\n\n}\n", "import oidcDiscover from './oidc.discovery.mjs'\nimport oidcRegister from './oidc.register.mjs'\nimport oidcmw from './oidcmw.mjs'\n\nexport const oidc = {\n\tdiscover: oidcDiscover,\n\tregister: oidcRegister,\n\toidcmw\n}\n\nglobalThis.oidc = oidc"],
5
- "mappings": "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",
6
- "names": ["options", "req", "next", "middleware", "params", "options", "url", "url", "index", "p", "url", "response", "response", "assert", "fails", "Required", "fails", "validURL", "url", "error", "fails", "error", "p", "url", "assert", "Required", "validURL", "params", "response"]
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 */\nclass Client\n{\n\t#options = {\n\t\turl: typeof window != 'undefined' ? window.location : 'https://localhost'\n\t}\n\t#verbs = ['get','post','put','delete','patch','head','options','query']\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.#options.url = ''+option\n\t\t\t} else if (option instanceof Client) {\n\t\t\t\tObject.assign(this.#options, option.#options)\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.#options[param] = option[param](this.#options[param], this.#options)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#options[param] = option[param]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.#options.verbs) {\n\t\t\tthis.#verbs = this.#options.verbs\n\t\t\tdelete this.#options.verbs\n\t\t}\n\n\t\tfor (const verb of this.#verbs) {\n\t\t\tthis[verb] = async function(...options) {\n\t\t\t\treturn this.fetch(request(\n\t\t\t\t\tthis.#options,\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\tObject.freeze(this)\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-value/', middlewares[index])\n\t\t}\n\t\tif (!Array.isArray(this.#options.middlewares)) {\n\t\t\tthis.#options.middlewares = []\n\t\t}\n\t\tthis.#options.middlewares = this.#options.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/missing-url-param/', 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|| Array.isArray(options)\n\t\t\t|| options instanceof String) \n\t\t{\n\t\t\tthrow metroError('metro.client.fetch: Options is not an object')\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\t// even though a Proxy is supposed to be 'invisible'\n\t\t\t\t// fetch() doesn't work with the proxy (in Firefox), \n\t\t\t\t// you need the actual Request object here\n\t\t\t\t// and the actual body if you use e.g. FormData\n\t\t\t\tif (req.body && req.body[Symbol.metroSource]) {\n\t\t\t\t\tlet body = req.body[Symbol.metroSource]\n\t\t\t\t\treq = new Request(req[Symbol.metroSource], { body })\n\t\t\t\t} else {\n\t\t\t\t\treq = req[Symbol.metroSource]\n\t\t\t\t}\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.#options?.middlewares?.slice() || [])\n\t\toptions = Object.assign({}, this.#options, 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(this, ...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(...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 bodyProxy(body, r)\n{\n\tlet source = r.body\n\tif (!source) {\n\t\t//Firefox does not allow access to Request.body (undefined)\n\t\t//Chrome and Nodejs do, so mimic the correct (documented)\n\t\t//result here\n\t\tif (body === null) {\n\t\t\tsource = new ReadableStream()\n\t\t} else if (body instanceof ReadableStream) {\n\t\t\tsource = body\n\t\t} else if (body instanceof Blob) {\n\t\t\tsource = body.stream()\n\t\t} else {\n\t\t\tsource = new ReadableStream({\n\t\t\t\tstart(controller) {\n\t\t\t\t\tlet chunk\n\t\t\t\t\tswitch(typeof body) {\n\t\t\t\t\t\tcase 'object':\n\t\t\t\t\t\t\tif (typeof body.toString == 'function') {\n\t\t\t\t\t\t\t\t// also catches URLSearchParams\n\t\t\t\t\t\t\t\tchunk = body.toString()\n\t\t\t\t\t\t\t} else if (body instanceof FormData) {\n\t\t\t\t\t\t\t\tchunk = new URLSearchParams(body).toString()\n\t\t\t\t\t\t\t} else if (body instanceof ArrayBuffer\n\t\t\t\t\t\t\t\t|| ArrayBuffer.isView(body)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// catchs TypedArrays - e.g. Uint16Array\n\t\t\t\t\t\t\t\tchunk = body\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthrow metroError('Cannot convert body to ReadableStream', body)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'string':\n\t\t\t\t\t\tcase 'number':\n\t\t\t\t\t\tcase 'boolean':\n\t\t\t\t\t\t\tchunk = body\n\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow metroError('Cannot convert body to ReadableStream', body)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcontroller.enqueue(chunk)\n\t\t\t\t\tcontroller.close()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\treturn new Proxy(source, {\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 body\n\t\t\t\tbreak\n\t\t\t\tcase 'toString':\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\treturn ''+body\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (body && typeof body == 'object') {\n\t\t\t\tif (prop in body) {\n\t\t\t\t\tif (typeof body[prop] == 'function') {\n\t\t\t\t\t\treturn function(...args) {\n\t\t\t\t\t\t\treturn body[prop].apply(body, args)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn body[prop]\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (prop in target && prop != 'toString') {\n\t\t\t\t// skipped toString, since it has no usable output\n\t\t\t\t// and body may have its own toString\n\t\t\t\tif (typeof target[prop] == 'function') {\n\t\t\t\t\treturn function(...args) {\n\t\t\t\t\t\treturn target[prop].apply(target, args)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn target[prop]\n\t\t\t}\n\t\t},\n\t\thas(target, prop) {\n\t\t\tif (body && typeof body == 'object') {\n\t\t\t\treturn prop in body\n\t\t\t} else {\n\t\t\t\treturn prop in target\n\t\t\t}\n\t\t},\n\t\townKeys(target) {\n\t\t\tif (body && typeof body == 'object') {\n\t\t\t\treturn Reflect.ownKeys(body)\n\t\t\t} else {\n\t\t\t\treturn Reflect.ownKeys(target)\n\t\t\t}\n\t\t},\n\t\tgetOwnPropertyDescriptor(target, prop) {\n\t\t\tif (body && typeof body == 'object') {\n\t\t\t\treturn Object.getOwnPropertyDescriptor(body,prop)\n\t\t\t} else {\n\t\t\t\treturn Object.getOwnPropertyDescriptor(target,prop)\n\t\t\t}\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\tif (typeof req[prop] == 'function') {\n\t\t\treq[prop](params[prop], params)\n\t\t} else if (typeof req[prop] != 'undefined') {\n\t\t\tif (prop == 'url') {\n\t\t\t\tparams.url = url(params.url, req.url)\n\t\t\t} else if (prop == 'headers') {\n\t\t\t\tparams.headers = new Headers(current.headers)\n\t\t\t\tif (!(req.headers instanceof Headers)) {\n\t\t\t\t\treq.headers = new Headers(req.headers)\n\t\t\t\t}\n\t\t\t\tfor (let [key, value] of req.headers.entries()) {\n\t\t\t\t\tparams.headers.set(key, value)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams[prop] = req[prop]\n\t\t\t}\n\t\t}\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 body = requestParams.body\n\tif (body) {\n\t\tif (typeof body == 'object'\n\t\t\t&& !(body instanceof String)\n\t\t\t&& !(body instanceof ReadableStream)\n\t\t\t&& !(body instanceof Blob)\n\t\t\t&& !(body instanceof ArrayBuffer)\n\t\t\t&& !(body instanceof DataView)\n\t\t\t&& !(body instanceof FormData)\n\t\t\t&& !(body instanceof URLSearchParams)\n\t\t\t&& (typeof TypedArray=='undefined' || !(body instanceof TypedArray))\n\t\t) {\n\t\t\trequestParams.body = JSON.stringify(body)\n\t\t}\n\t}\n\tlet r = new Request(requestParams.url, requestParams)\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 (body) { // body is kept in a seperate value, if it set earlier\n\t\t\t\t\t\t\toptions.unshift({ body }) // 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 'body':\n\t\t\t\t\t// Request.body is always a ReadableStream\n\t\t\t\t\t// which is a horrible API, if you want to\n\t\t\t\t\t// allow middleware to alter the body\n\t\t\t\t\t// so we keep the original body, wrap a Proxy\n\t\t\t\t\t// around it to keep the ReadableStream api\n\t\t\t\t\t// accessible, but allow access to the original\n\t\t\t\t\t// body value as well\n\t\t\t\t\tif (!body) {\n\t\t\t\t\t\tbody = target.body\n\t\t\t\t\t}\n\t\t\t\t\tif (body) {\n\t\t\t\t\t\tif (body[Symbol.metroProxy]) {\n\t\t\t\t\t\t\treturn body\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn bodyProxy(body, target)\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\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\tif (typeof res[prop] == 'function') {\n\t\t\tres[prop](params[prop], params)\n\t\t} else if (typeof res[prop] != 'undefined') {\n\t\t\tif (prop == 'url') {\n\t\t\t\tparams.url = new URL(res.url, params.url || 'https://localhost/')\n\t\t\t} else {\n\t\t\t\tparams[prop] = res[prop]\n\t\t\t}\n\t\t}\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 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 'body':\n\t\t\t\t\tif (responseParams.body) {\n\t\t\t\t\t\tif (responseParams.body[Symbol.metroProxy]) {\n\t\t\t\t\t\t\treturn responseParams.body\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn bodyProxy(responseParams.body, target)\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn bodyProxy('',target)\n\t\t\t\t\t}\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\tcase 'headers':\n\t\t\t\t\treturn target.headers\n\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tif (prop in responseParams && prop != 'toString') {\n\t\t\t\t\t\treturn responseParams[prop]\n\t\t\t\t\t}\n\t\t\t\t\tif (prop in target && prop != 'toString') {\n\t\t\t\t\t\t// skipped toString, since it has no usable output\n\t\t\t\t\t\t// and body may have its own toString\n\t\t\t\t\t\tif (typeof target[prop] == 'function') {\n\t\t\t\t\t\t\treturn function(...args) {\n\t\t\t\t\t\t\t\treturn target[prop].apply(target, args)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn target[prop]\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn undefined\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\tif (param=='search') {\n\t\t\t\t\tif (typeof option.search == 'function') {\n\t\t\t\t\t\toption.search(u.search, u)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tu.search = new URLSearchParams(option.search)\n\t\t\t\t\t}\n\t\t\t\t} else if (param=='searchParams') {\n\t\t\t\t\tappendSearchParams(u, option.searchParams)\n\t\t\t\t} else {\n\t\t\t\t\tif (!validParams.includes(param)) {\n\t\t\t\t\t\tthrow metroError('metro.url: unknown url parameter '+metroURL+'url/unknown-param-name/', param)\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof option[param] == 'function') {\n\t\t\t\t\t\toption[param](u[param], u)\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof option[param] == 'string' || option[param] instanceof String \n\t\t\t\t\t\t|| typeof option[param] == 'number' || option[param] instanceof Number\n\t\t\t\t\t\t|| typeof option[param] == 'boolean' || option[param] instanceof Boolean\n\t\t\t\t\t) {\n\t\t\t\t\t\tu[param] = ''+option[param]\n\t\t\t\t\t} else if (typeof option[param] == 'object' && option[param].toString) {\n\t\t\t\t\t\tu[param] = option[param].toString()\n\t\t\t\t\t} else {\n\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}\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\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}\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 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, only FormData or Object supported',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\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", "import * as metro from '../metro.mjs'\n\nexport default function jsonmw(options) {\n\toptions = Object.assign({\n\t\treviver: null,\n\t\treplacer: null,\n\t\tspace: ''\n\t}, options)\n\n\treturn async (req, next) => {\n\t\tif (['POST','PUT','PATCH','QUERY'].includes(req.method)) {\n\t\t\treq = req.with({\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type':'application/json',\n\t 'Accept':'application/json'\n\t\t\t\t}\n\t\t\t})\n\t\t\tif (req.body && typeof req.body[Symbol.metroSource] == 'object') {\n\t\t\t\treq = req.with({\n\t\t\t\t\tbody: JSON.stringify(req.body[Symbol.metroSource], options.replacer, options.space)\n\t\t\t\t})\n\t\t\t}\n\t\t} else {\n\t\t\treq = req.with({\n\t\t\t\theaders: {\n\t\t\t 'Accept':'application/json'\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tlet res = await next(req)\n\t\tlet body = await res.text()\n\t\tlet json = JSON.parse(body, options.reviver)\n\t\treturn res.with({\n\t\t\tbody: json\n\t\t})\n\t}\n}", "import * as metro from '../metro.mjs'\n\nexport default function thrower(options) {\n\n\treturn async (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\nwindow.metro = metro\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\tconsole.warn('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 [wKey, wVal] of Object.entries(pattern)) {\n\t\t let result = fails(data[wKey], wVal, root, path+'.'+wKey)\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\tmessage,\n\t\tfound,\n\t\texpected,\n\t\tpath\n\t}\n\tif (problems) {\n\t\tresult.problems = problems\n\t}\n\treturn result\n}\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.body[Symbol.metroSource]\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.body\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}", "/**\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 const assert = (source, test) => {\n\tif (globalThis.assertEnabled) {\n\t\tlet problems = fails(source,test)\n\t\tif (problems) {\n\t\t\tthrow new assertError('Assertions failed', problems, source)\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 const Optional = (pattern) => \n\t(data) => (data==null || typeof data == 'undefined') ? false : fails(data, pattern)\n\n/**\n * Tests a given value against a pattern, always.\n */\nexport const Required = (pattern) =>\n\t(data) => fails(data, pattern)\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 const Recommended = (pattern) =>\n\t(data) => (data==null || typeof data == 'undefined') ? (() => {\n\t\tconsole.warning('data does not contain recommended value', data, pattern)\n\t\treturn false\n\t})() : fails(data, pattern)\n\n/**\n * Tests a given value against a set of patterns, untill one succeeds\n * Returns an error if none succeed\n */\nexport const oneOf = (...patterns) => \n\t(data) => {\n\t\tfor(let pattern of patterns) {\n\t\t\tif (!fails(data, pattern)) {\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)\n\t}\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 const anyOf = (...patterns) =>\n\t(data) => {\n\t\tif (!Array.isArray(data)) {\n\t\t\treturn error('data is not an array',data,'anyOf')\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)\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\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) {\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\treturn error('data is not a valid url',data,'validURL')\n\t\t}\n\t} catch(e) {\n\t\treturn error('data is not a valid url',data,'validURL')\n\t}\n\treturn false\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) {\n\tif (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(data)) {\n\t\treturn false // data matches email regex\n\t}\n\treturn error('data is not a valid email',data,'validEmail')\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 const instanceOf = (constructor) =>\n\t(data) => !(data instanceof constructor) \n\t\t? error('data is not an instanceof pattern',data,constructor)\n\t\t: false\n\n/**\n * Runs the given test pattern on a value, if the test succeeds, it fails\n * the not() test.\n */\nexport const not = (pattern) =>\n\t(data) => fails(data, pattern) \n\t\t? false \n\t\t: error('data matches pattern, when required not to', data, pattern)\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) {\n\tif (!root) {\n\t\troot = data\n\t}\n\tlet problems = []\n\tif (pattern === Boolean) {\n\t\tif (typeof data != 'boolean') {\n\t\t\tproblems.push(error('data is not a boolean', data, pattern))\n\t\t}\t\t\n\t} else if (pattern === Number) {\n\t\tif (typeof data != 'number') {\n\t\t\tproblems.push(error('data is not a number', data, pattern))\n\t\t}\n\t} else if (pattern instanceof RegExp) {\n \tif (Array.isArray(data)) {\n\t\t\tlet index = data.findIndex(element => fails(element,pattern,root))\n if (index>-1) {\n \tproblems.push(error('data['+index+'] does not match pattern', data[index], pattern))\n }\n \t} else if (!pattern.test(data)) {\n \tproblems.push(error('data does not match pattern', data, pattern))\n }\n } else if (pattern instanceof Function) {\n if (pattern(data, root)) {\n \tproblems.push(error('data does not match function', data, pattern))\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,[]))\n\t\t}\n\t\tfor (p of pattern) {\n\t\t\tlet problem = fails(data, p, root)\n\t\t\tif (Array.isArray(problem)) {\n\t\t\t\tproblems.concat(problem)\n\t\t\t} else if (problem) {\n\t\t\t\tproblems.push(problem)\n\t\t\t}\n \t}\n } else if (pattern && typeof pattern == 'object') {\n if (Array.isArray(data)) {\n let index = data.findIndex(element => fails(element,pattern,root))\n if (index>-1) {\n \tproblems.push(error('data['+index+'] does not match pattern', data[index], pattern))\n }\n } else if (!data || typeof data != 'object') {\n \tproblems.push(error('data is not an object, pattern is', data, pattern))\n } else {\n \tif (data instanceof URLSearchParams) {\n \t\tdata = Object.fromEntries(data)\n \t}\n\t let p = problems[problems.length-1]\n\t for (const [wKey, wVal] of Object.entries(pattern)) {\n\t let result = fails(data[wKey], wVal, root)\n\t if (result) {\n\t \tif (!p || typeof p == 'string') {\n\t \t\tp = {}\n\t \t\tproblems.push(error(p, data[wKey], wVal))\n\t \t}\n\t \tp[wKey] = result.problems\n\t }\n\t }\n\t }\n } else {\n \tif (pattern!=data) {\n \t\tproblems.push(error('data and pattern are not equal', data, pattern))\n \t}\n }\n if (problems.length) {\n \treturn problems\n }\n return false\n}\n\n\n/**\n * Class used in assert() to add problems found and details to the error object\n */\nclass assertError extends Error {\n\tconstructor(message, problems, ...details) {\n\t\tsuper(message)\n\t\tthis.problems = problems\n\t\tthis.details = details\n\t}\n}\n\n/**\n * Returns an object with message, found and expected properties\n */ \nexport function error(message, found, expected) {\n\treturn {\n\t\tmessage,\n\t\tfound,\n\t\texpected\n\t}\n}\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 metro from '@muze-nl/metro'\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 */\nexport default function mwOAuth2(options)\n{\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: security.generateCodeVerifier(64)\n\t\t},\n\t\tcallbacks: {\n\t\t\tauthorize: async url => {\n\t\t\t\tif (window.location.href != url.href) {\n\t\t\t\t\twindow.location.replace(url.href)\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t}\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\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\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\tif (!options.tokens.has('access_token')) {\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\tconsole.log('caught',e)\n\t\t\t\tthrow(e)\n\t\t\t}\n\t\t\treturn oauth2authorized(req, next)\n\t\t} else if (isExpired(req)) {\n\t\t\tlet token = await fetchRefreshToken()\n\t\t\tif (!token) {\n\t\t\t\treturn metro.response('false')\n\t\t\t}\n\t\t\treturn oauth2authorized(req, next)\n\t\t} else {\n\t\t\tlet accessToken = options.tokens.get('access_token')\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 = getAuthorizationCodeURL()\n\t\t\tif (!options.callbacks.authorize || typeof options.callbacks.authorize !== 'function') {\n\t\t\t\tthrow metro.metroError('oauth2mw: oauth2 with grant_type:authorization_code requires a callback function in client options.options.callbacks.authorize')\n\t\t\t}\n\t\t\t//FIXME: authorize can do a redirect, so allow for that\n\t\t\tlet token = await options.callbacks.authorize(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\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\tfunction 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\tclient_secret: oauth2.client_secret,\n\t\t\tredirect_uri: oauth2.redirect_uri,\n\t\t\tstate: oauth2.state || security.createState(40) // OAuth2.1 RFC says optional, but its a good idea to always add/check it\n\t\t}\n\t\toptions.state.set(search.state)\n\t\tif (oauth2.code_verifier) { //PKCE\n\t\t\tdelete search.client_secret\n\t\t\tsearch.code_challenge = security.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\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} else {\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\t/**\n\t * Returns true if the access token in a request is expired. False otherwise.\n\t */\n\tfunction isExpired(req)\n\t{\n\t\tif (req.oauth2 && req.options.tokens && req.options.tokens.has('access_token')) {\n\t\t\tlet now = new Date();\n\t\t\tlet token = req.options.tokens.get('access_token')\n\t\t\treturn now.getTime() > token.expires.getTime();\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns a new Date based on a duration, which can either be a date\n\t * or a number of seconds from now.\n\t */\n\tfunction getExpires(duration)\n\t{\n\t\tif (duration instanceof Date) {\n\t\t\treturn new Date(duration.getTime()); // return a copy\n\t\t}\n\t\tif (typeof duration === 'number') {\n\t\t\tlet date = new Date();\n\t\t\tdate.setSeconds(date.getSeconds() + duration);\n\t\t\treturn date;\n\t\t}\n\t\tthrow new TypeError('Unknown expires type '+duration);\n\t}\n\n\n}\n\nexport const security = {\t\n\t/**\n\t * returns a PKCE code_verifier, as a hex encoded string\n\t */\n\tgenerateCodeVerifier: function(size=64)\n\t{\n\t\tconst code_verifier = new Uint8Array(size)\n\t\tglobalThis.crypto.getRandomValues(code_verifier)\n\t\treturn code_verifier.toString('hex')\n\t},\n\n\t/**\n\t * Returns a PKCE code_challenge derived from a code_verifier\n\t */\n\tgenerateCodeChallenge: async function(code_verifier)\n\t{\n\t\tconst b64encoded = security.base64url_encode(code_verifier)\n\t\tconst encoder = new TextEncoder()\n\t\tconst data = encoder.encode(b64encoded)\n\t\treturn await globalThis.crypto.subtle.digest('SHA-256', data)\n\t},\n\n\t/**\n\t * Base64url encoding, which handles UTF-8 input strings correctly.\n\t */\n\tbase64url_encode: function(buffer)\n\t{\n\t\tconst byteString = Array.from(new Uint8Array(buffer), b => String.fromCharCode(b)).join('')\n\t return btoa(byteString)\n\t .replace(/\\+/g, '-')\n\t .replace(/\\//g, '_')\n\t .replace(/=+$/, '');\n\t},\n\n\t/**\n\t * Creates and stores a random state to use in the authorization code URL\n\t */\n\tcreateState: function(length)\n\t{\n\t\tconst validChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n\t\tlet randomState = ''\n\t\tlet counter = 0\n\t while (counter < length) {\n\t randomState += validChars.charAt(Math.floor(Math.random() * validChars.length))\n\t counter++\n\t }\n\t\treturn randomState\n\t}\n}\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}", "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 metro from '@muze-nl/metro'\nimport oauth2mw, { isRedirected as oauth2isRedirected } from '@muze-nl/metro-oauth2'\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}\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 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\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\tcode_verifier: false, //disable pkce\n\t\t\t\t\tgrant_type: 'authorization_code',\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: options.openid_configuration.scope || 'openid',\n\t\t\t\t\tredirect_uri: options.client_info.redirect_uris[0] //FIXME: find the best match?\n\t\t\t\t}\n\t\t\t}\n\t\t\t//...\n\t\t)\n\t\tconst oauth2client = options.client.with(options.issuer)\n\t\t// optional: add oauth2dpop mw\n\t\t.with(oauth2mw(oauth2Options))\n\n\t\tres = await oauth2client.fetch(req)\n\t\t// ...\n\n\t\treturn res\n\t}\n\n}\n\nexport function isRedirected() {\n\treturn oauth2isRedirected()\n}", "import oidcDiscover from './oidc.discovery.mjs'\nimport oidcRegister from './oidc.register.mjs'\nimport oidcmw, {isRedirected} from './oidcmw.mjs'\n\nexport const oidc = {\n\tdiscover: oidcDiscover,\n\tregister: oidcRegister,\n\toidcmw,\n\tisRedirected\n}\n\nglobalThis.oidc = oidc"],
5
+ "mappings": "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",
6
+ "names": ["options", "req", "next", "middleware", "params", "options", "url", "url", "index", "p", "url", "response", "response", "assert", "fails", "Required", "fails", "validURL", "url", "error", "fails", "error", "p", "url", "assert", "Required", "validURL", "params", "response", "isRedirected", "isRedirected"]
7
7
  }