@auth0/auth0-spa-js 2.6.0 → 2.8.0

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.
Files changed (36) hide show
  1. package/README.md +4 -3
  2. package/dist/auth0-spa-js.development.js +147 -47
  3. package/dist/auth0-spa-js.development.js.map +1 -1
  4. package/dist/auth0-spa-js.production.esm.js +1 -1
  5. package/dist/auth0-spa-js.production.esm.js.map +1 -1
  6. package/dist/auth0-spa-js.production.js +1 -1
  7. package/dist/auth0-spa-js.production.js.map +1 -1
  8. package/dist/auth0-spa-js.worker.development.js +1 -1
  9. package/dist/auth0-spa-js.worker.development.js.map +1 -1
  10. package/dist/auth0-spa-js.worker.production.js +1 -1
  11. package/dist/auth0-spa-js.worker.production.js.map +1 -1
  12. package/dist/lib/auth0-spa-js.cjs.js +157 -47
  13. package/dist/lib/auth0-spa-js.cjs.js.map +1 -1
  14. package/dist/typings/Auth0Client.d.ts +2 -1
  15. package/dist/typings/Auth0Client.utils.d.ts +15 -3
  16. package/dist/typings/cache/cache-manager.d.ts +1 -0
  17. package/dist/typings/constants.d.ts +1 -0
  18. package/dist/typings/errors.d.ts +8 -0
  19. package/dist/typings/fetcher.d.ts +5 -3
  20. package/dist/typings/global.d.ts +9 -1
  21. package/dist/typings/scope.d.ts +25 -0
  22. package/dist/typings/utils.d.ts +6 -0
  23. package/dist/typings/version.d.ts +1 -1
  24. package/package.json +1 -1
  25. package/src/Auth0Client.ts +87 -53
  26. package/src/Auth0Client.utils.ts +28 -5
  27. package/src/api.ts +5 -6
  28. package/src/cache/cache-manager.ts +14 -0
  29. package/src/constants.ts +2 -0
  30. package/src/errors.ts +15 -0
  31. package/src/fetcher.ts +51 -16
  32. package/src/global.ts +11 -1
  33. package/src/scope.ts +57 -0
  34. package/src/utils.ts +36 -0
  35. package/src/version.ts +1 -1
  36. package/src/worker/token.worker.ts +1 -1
package/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  ![Auth0 SDK for Single Page Applications using Authorization Code Grant Flow with PKCE.](https://cdn.auth0.com/website/sdks/banners/spa-js-banner.png)
2
2
 
3
- ![Release](https://img.shields.io/npm/v/@auth0/auth0-spa-js)
3
+ [![npm version](https://img.shields.io/npm/v/@auth0/auth0-spa-js?style=flat-square&logo=npm&logoColor=CB3837)](https://www.npmjs.com/package/@auth0/auth0-spa-js)
4
4
  [![Codecov](https://img.shields.io/codecov/c/github/auth0/auth0-spa-js)](https://codecov.io/gh/auth0/auth0-spa-js)
5
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/auth0/auth0-spa-js)
5
6
  ![Downloads](https://img.shields.io/npm/dw/@auth0/auth0-spa-js)
6
7
  [![License](https://img.shields.io/:license-mit-blue.svg?style=flat)](https://opensource.org/licenses/MIT)
7
8
  ![CircleCI](https://img.shields.io/circleci/build/github/auth0/auth0-spa-js)
@@ -29,7 +30,7 @@ npm install @auth0/auth0-spa-js
29
30
  From the CDN:
30
31
 
31
32
  ```html
32
- <script src="https://cdn.auth0.com/js/auth0-spa-js/2.6/auth0-spa-js.production.js"></script>
33
+ <script src="https://cdn.auth0.com/js/auth0-spa-js/2.8/auth0-spa-js.production.js"></script>
33
34
  ```
34
35
 
35
36
  ### Configure Auth0
@@ -156,4 +157,4 @@ Please do not report security vulnerabilities on the public GitHub issue tracker
156
157
  </p>
157
158
  <p align="center">
158
159
  This project is licensed under the MIT license. See the <a href="https://github.com/auth0/auth0-spa-js/blob/main/LICENSE"> LICENSE</a> file for more info.
159
- </p>
160
+ </p>
@@ -540,7 +540,7 @@
540
540
  exports.default = SuperTokensLock;
541
541
  }));
542
542
  var Lock = unwrapExports(browserTabsLock);
543
- var version = "2.6.0";
543
+ var version = "2.8.0";
544
544
  const DEFAULT_AUTHORIZE_TIMEOUT_IN_SECONDS = 60;
545
545
  const DEFAULT_POPUP_CONFIG_OPTIONS = {
546
546
  timeoutInSeconds: DEFAULT_AUTHORIZE_TIMEOUT_IN_SECONDS
@@ -558,6 +558,7 @@
558
558
  version: version
559
559
  };
560
560
  const DEFAULT_NOW_PROVIDER = () => Date.now();
561
+ const DEFAULT_AUDIENCE = "default";
561
562
  class GenericError extends Error {
562
563
  constructor(error, error_description) {
563
564
  super(error_description);
@@ -621,6 +622,14 @@
621
622
  Object.setPrototypeOf(this, MissingRefreshTokenError.prototype);
622
623
  }
623
624
  }
625
+ class MissingScopesError extends GenericError {
626
+ constructor(audience, scope) {
627
+ super("missing_scopes", `Missing requested scopes after refresh (audience: '${valueOrEmptyString(audience, [ "default" ])}', missing scope: '${valueOrEmptyString(scope)}')`);
628
+ this.audience = audience;
629
+ this.scope = scope;
630
+ Object.setPrototypeOf(this, MissingScopesError.prototype);
631
+ }
632
+ }
624
633
  class UseDpopNonceError extends GenericError {
625
634
  constructor(newDpopNonce) {
626
635
  super("use_dpop_nonce", "Server rejected DPoP proof: wrong nonce");
@@ -725,6 +734,23 @@
725
734
  const stripUndefined = params => Object.keys(params).filter((k => typeof params[k] !== "undefined")).reduce(((acc, key) => Object.assign(Object.assign({}, acc), {
726
735
  [key]: params[key]
727
736
  })), {});
737
+ const ALLOWED_AUTH0CLIENT_PROPERTIES = [ {
738
+ key: "name",
739
+ type: [ "string" ]
740
+ }, {
741
+ key: "version",
742
+ type: [ "string", "number" ]
743
+ }, {
744
+ key: "env",
745
+ type: [ "object" ]
746
+ } ];
747
+ const stripAuth0Client = auth0Client => Object.keys(auth0Client).reduce(((acc, key) => {
748
+ const allowedProperty = ALLOWED_AUTH0CLIENT_PROPERTIES.find((p => p.key === key));
749
+ if (allowedProperty && allowedProperty.type.includes(typeof auth0Client[key])) {
750
+ acc[key] = auth0Client[key];
751
+ }
752
+ return acc;
753
+ }), {});
728
754
  const createQueryParams = _a => {
729
755
  var {clientId: client_id} = _a, params = __rest(_a, [ "clientId" ]);
730
756
  return new URLSearchParams(stripUndefined(Object.assign({
@@ -1207,17 +1233,42 @@
1207
1233
  });
1208
1234
  const body = useFormData ? createQueryParams(allParams) : JSON.stringify(allParams);
1209
1235
  const isDpopSupported = isGrantTypeSupported(options.grant_type);
1210
- return await getJSON(`${baseUrl}/oauth/token`, timeout, audience || "default", scope, {
1236
+ return await getJSON(`${baseUrl}/oauth/token`, timeout, audience || DEFAULT_AUDIENCE, scope, {
1211
1237
  method: "POST",
1212
1238
  body: body,
1213
1239
  headers: {
1214
1240
  "Content-Type": useFormData ? "application/x-www-form-urlencoded" : "application/json",
1215
- "Auth0-Client": btoa(JSON.stringify(auth0Client || DEFAULT_AUTH0_CLIENT))
1241
+ "Auth0-Client": btoa(JSON.stringify(stripAuth0Client(auth0Client || DEFAULT_AUTH0_CLIENT)))
1216
1242
  }
1217
1243
  }, worker, useFormData, useMrrt, isDpopSupported ? dpop : undefined);
1218
1244
  }
1219
1245
  const dedupe = arr => Array.from(new Set(arr));
1220
1246
  const getUniqueScopes = (...scopes) => dedupe(scopes.filter(Boolean).join(" ").trim().split(/\s+/)).join(" ");
1247
+ const injectDefaultScopes = (authScopes, openIdScope, ...extraScopes) => {
1248
+ if (typeof authScopes !== "object") {
1249
+ return {
1250
+ [DEFAULT_AUDIENCE]: getUniqueScopes(openIdScope, authScopes, ...extraScopes)
1251
+ };
1252
+ }
1253
+ let requestedScopes = {
1254
+ [DEFAULT_AUDIENCE]: getUniqueScopes(openIdScope, ...extraScopes)
1255
+ };
1256
+ Object.keys(authScopes).forEach((key => {
1257
+ const audienceScopes = authScopes[key];
1258
+ requestedScopes[key] = getUniqueScopes(openIdScope, audienceScopes, ...extraScopes);
1259
+ }));
1260
+ return requestedScopes;
1261
+ };
1262
+ const scopesToRequest = (authScopes, methodScopes, audience) => {
1263
+ let scope;
1264
+ if (audience) {
1265
+ scope = authScopes[audience];
1266
+ }
1267
+ if (!scope) {
1268
+ scope = authScopes[DEFAULT_AUDIENCE];
1269
+ }
1270
+ return getUniqueScopes(scope, methodScopes);
1271
+ };
1221
1272
  const CACHE_KEY_PREFIX = "@@auth0spajs@@";
1222
1273
  const CACHE_KEY_ID_TOKEN_SUFFIX = "@@user@@";
1223
1274
  class CacheKey {
@@ -1386,6 +1437,14 @@
1386
1437
  await this.cache.set(cacheKey.toKey(), wrappedEntry);
1387
1438
  await ((_a = this.keyManifest) === null || _a === void 0 ? void 0 : _a.add(cacheKey.toKey()));
1388
1439
  }
1440
+ async remove(client_id, audience, scope) {
1441
+ const cacheKey = new CacheKey({
1442
+ clientId: client_id,
1443
+ scope: scope,
1444
+ audience: audience
1445
+ });
1446
+ await this.cache.remove(cacheKey.toKey());
1447
+ }
1389
1448
  async clear(clientId) {
1390
1449
  var _a;
1391
1450
  const keys = await this.getCacheKeys();
@@ -1801,7 +1860,7 @@
1801
1860
  return new Worker(url, options);
1802
1861
  };
1803
1862
  }
1804
- var WorkerFactory = createBase64WorkerFactory("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24oKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBjbGFzcyBHZW5lcmljRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgICAgICAgY29uc3RydWN0b3IoZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHN1cGVyKGVycm9yX2Rlc2NyaXB0aW9uKTsKICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yOwogICAgICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gZXJyb3JfZGVzY3JpcHRpb247CiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBHZW5lcmljRXJyb3IucHJvdG90eXBlKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZyb21QYXlsb2FkKHtlcnJvcjogZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uOiBlcnJvcl9kZXNjcmlwdGlvbn0pIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljRXJyb3IoZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBNaXNzaW5nUmVmcmVzaFRva2VuRXJyb3IgZXh0ZW5kcyBHZW5lcmljRXJyb3IgewogICAgICAgIGNvbnN0cnVjdG9yKGF1ZGllbmNlLCBzY29wZSkgewogICAgICAgICAgICBzdXBlcigibWlzc2luZ19yZWZyZXNoX3Rva2VuIiwgYE1pc3NpbmcgUmVmcmVzaCBUb2tlbiAoYXVkaWVuY2U6ICcke3ZhbHVlT3JFbXB0eVN0cmluZyhhdWRpZW5jZSwgWyAiZGVmYXVsdCIgXSl9Jywgc2NvcGU6ICcke3ZhbHVlT3JFbXB0eVN0cmluZyhzY29wZSl9JylgKTsKICAgICAgICAgICAgdGhpcy5hdWRpZW5jZSA9IGF1ZGllbmNlOwogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNaXNzaW5nUmVmcmVzaFRva2VuRXJyb3IucHJvdG90eXBlKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB2YWx1ZU9yRW1wdHlTdHJpbmcodmFsdWUsIGV4Y2x1ZGUgPSBbXSkgewogICAgICAgIHJldHVybiB2YWx1ZSAmJiAhZXhjbHVkZS5pbmNsdWRlcyh2YWx1ZSkgPyB2YWx1ZSA6ICIiOwogICAgfQogICAgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHsKICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTsKICAgICAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAiZnVuY3Rpb24iKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07CiAgICAgICAgfQogICAgICAgIHJldHVybiB0OwogICAgfQogICAgdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gImZ1bmN0aW9uIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7CiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7CiAgICAgICAgcmV0dXJuIGUubmFtZSA9ICJTdXBwcmVzc2VkRXJyb3IiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7CiAgICB9OwogICAgY29uc3Qgc3RyaXBVbmRlZmluZWQgPSBwYXJhbXMgPT4gT2JqZWN0LmtleXMocGFyYW1zKS5maWx0ZXIoKGsgPT4gdHlwZW9mIHBhcmFtc1trXSAhPT0gInVuZGVmaW5lZCIpKS5yZWR1Y2UoKChhY2MsIGtleSkgPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2MpLCB7CiAgICAgICAgW2tleV06IHBhcmFtc1trZXldCiAgICB9KSksIHt9KTsKICAgIGNvbnN0IGNyZWF0ZVF1ZXJ5UGFyYW1zID0gX2EgPT4gewogICAgICAgIHZhciB7Y2xpZW50SWQ6IGNsaWVudF9pZH0gPSBfYSwgcGFyYW1zID0gX19yZXN0KF9hLCBbICJjbGllbnRJZCIgXSk7CiAgICAgICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoc3RyaXBVbmRlZmluZWQoT2JqZWN0LmFzc2lnbih7CiAgICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50X2lkCiAgICAgICAgfSwgcGFyYW1zKSkpLnRvU3RyaW5nKCk7CiAgICB9OwogICAgY29uc3QgZnJvbUVudHJpZXMgPSBpdGVyYWJsZSA9PiBbIC4uLml0ZXJhYmxlIF0ucmVkdWNlKCgob2JqLCBba2V5LCB2YWxdKSA9PiB7CiAgICAgICAgb2JqW2tleV0gPSB2YWw7CiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pLCB7fSk7CiAgICBsZXQgcmVmcmVzaFRva2VucyA9IHt9OwogICAgY29uc3QgY2FjaGVLZXkgPSAoYXVkaWVuY2UsIHNjb3BlKSA9PiBgJHthdWRpZW5jZX18JHtzY29wZX1gOwogICAgY29uc3QgY2FjaGVLZXlDb250YWluc0F1ZGllbmNlID0gKGF1ZGllbmNlLCBjYWNoZUtleSkgPT4gY2FjaGVLZXkuc3RhcnRzV2l0aChgJHthdWRpZW5jZX18YCk7CiAgICBjb25zdCBnZXRSZWZyZXNoVG9rZW4gPSAoYXVkaWVuY2UsIHNjb3BlKSA9PiByZWZyZXNoVG9rZW5zW2NhY2hlS2V5KGF1ZGllbmNlLCBzY29wZSldOwogICAgY29uc3Qgc2V0UmVmcmVzaFRva2VuID0gKHJlZnJlc2hUb2tlbiwgYXVkaWVuY2UsIHNjb3BlKSA9PiByZWZyZXNoVG9rZW5zW2NhY2hlS2V5KGF1ZGllbmNlLCBzY29wZSldID0gcmVmcmVzaFRva2VuOwogICAgY29uc3QgZGVsZXRlUmVmcmVzaFRva2VuID0gKGF1ZGllbmNlLCBzY29wZSkgPT4gZGVsZXRlIHJlZnJlc2hUb2tlbnNbY2FjaGVLZXkoYXVkaWVuY2UsIHNjb3BlKV07CiAgICBjb25zdCB3YWl0ID0gdGltZSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWUpKSk7CiAgICBjb25zdCBmb3JtRGF0YVRvT2JqZWN0ID0gZm9ybURhdGEgPT4gewogICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhmb3JtRGF0YSk7CiAgICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSB7fTsKICAgICAgICBxdWVyeVBhcmFtcy5mb3JFYWNoKCgodmFsLCBrZXkpID0+IHsKICAgICAgICAgICAgcGFyc2VkUXVlcnlba2V5XSA9IHZhbDsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHBhcnNlZFF1ZXJ5OwogICAgfTsKICAgIGNvbnN0IHVwZGF0ZVJlZnJlc2hUb2tlbnMgPSAob2xkUmVmcmVzaFRva2VuLCBuZXdSZWZyZXNoVG9rZW4pID0+IHsKICAgICAgICBPYmplY3QuZW50cmllcyhyZWZyZXNoVG9rZW5zKS5mb3JFYWNoKCgoW2tleSwgdG9rZW5dKSA9PiB7CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gb2xkUmVmcmVzaFRva2VuKSB7CiAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW5zW2tleV0gPSBuZXdSZWZyZXNoVG9rZW47CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9OwogICAgY29uc3QgY2hlY2tEb3duc2NvcGluZyA9IChzY29wZSwgYXVkaWVuY2UpID0+IHsKICAgICAgICBjb25zdCBmaW5kQ29pbmNpZGVuY2UgPSBPYmplY3Qua2V5cyhyZWZyZXNoVG9rZW5zKS5maW5kKChrZXkgPT4gewogICAgICAgICAgICBpZiAoa2V5ICE9PSAibGF0ZXN0X3JlZnJlc2hfdG9rZW4iKSB7CiAgICAgICAgICAgICAgICBjb25zdCBpc1NhbWVBdWRpZW5jZSA9IGNhY2hlS2V5Q29udGFpbnNBdWRpZW5jZShhdWRpZW5jZSwga2V5KTsKICAgICAgICAgICAgICAgIGNvbnN0IHNjb3Blc0tleSA9IGtleS5zcGxpdCgifCIpWzFdLnNwbGl0KCIgIik7CiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZWRTY29wZXMgPSBzY29wZS5zcGxpdCgiICIpOwogICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVzQXJlSW5jbHVkZWQgPSByZXF1ZXN0ZWRTY29wZXMuZXZlcnkoKGtleSA9PiBzY29wZXNLZXkuaW5jbHVkZXMoa2V5KSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIGlzU2FtZUF1ZGllbmNlICYmIHNjb3Blc0FyZUluY2x1ZGVkOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBmaW5kQ29pbmNpZGVuY2UgPyB0cnVlIDogZmFsc2U7CiAgICB9OwogICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBhc3luYyAoe2RhdGE6IHt0aW1lb3V0OiB0aW1lb3V0LCBhdXRoOiBhdXRoLCBmZXRjaFVybDogZmV0Y2hVcmwsIGZldGNoT3B0aW9uczogZmV0Y2hPcHRpb25zLCB1c2VGb3JtRGF0YTogdXNlRm9ybURhdGEsIHVzZU1ycnQ6IHVzZU1ycnR9LCBwb3J0czogW3BvcnRdfSkgPT4gewogICAgICAgIGxldCBoZWFkZXJzID0ge307CiAgICAgICAgbGV0IGpzb247CiAgICAgICAgbGV0IHJlZnJlc2hUb2tlbjsKICAgICAgICBjb25zdCB7YXVkaWVuY2U6IGF1ZGllbmNlLCBzY29wZTogc2NvcGV9ID0gYXV0aCB8fCB7fTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBib2R5ID0gdXNlRm9ybURhdGEgPyBmb3JtRGF0YVRvT2JqZWN0KGZldGNoT3B0aW9ucy5ib2R5KSA6IEpTT04ucGFyc2UoZmV0Y2hPcHRpb25zLmJvZHkpOwogICAgICAgICAgICBpZiAoIWJvZHkucmVmcmVzaF90b2tlbiAmJiBib2R5LmdyYW50X3R5cGUgPT09ICJyZWZyZXNoX3Rva2VuIikgewogICAgICAgICAgICAgICAgcmVmcmVzaFRva2VuID0gZ2V0UmVmcmVzaFRva2VuKGF1ZGllbmNlLCBzY29wZSk7CiAgICAgICAgICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbiAmJiB1c2VNcnJ0KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0UmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2Vuc1sibGF0ZXN0X3JlZnJlc2hfdG9rZW4iXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0Rvd25zY29waW5nID0gY2hlY2tEb3duc2NvcGluZyhzY29wZSwgYXVkaWVuY2UpOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXRlc3RSZWZyZXNoVG9rZW4gJiYgIWlzRG93bnNjb3BpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFRva2VuID0gbGF0ZXN0UmVmcmVzaFRva2VuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZWZyZXNoVG9rZW5FcnJvcihhdWRpZW5jZSwgc2NvcGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmJvZHkgPSB1c2VGb3JtRGF0YSA/IGNyZWF0ZVF1ZXJ5UGFyYW1zKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYm9keSksIHsKICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4KICAgICAgICAgICAgICAgIH0pKSA6IEpTT04uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYm9keSksIHsKICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgYWJvcnRDb250cm9sbGVyOwogICAgICAgICAgICBpZiAodHlwZW9mIEFib3J0Q29udHJvbGxlciA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcjsKICAgICAgICAgICAgICAgIGZldGNoT3B0aW9ucy5zaWduYWwgPSBhYm9ydENvbnRyb2xsZXIuc2lnbmFsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCByZXNwb25zZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5yYWNlKFsgd2FpdCh0aW1lb3V0KSwgZmV0Y2goZmV0Y2hVcmwsIE9iamVjdC5hc3NpZ24oe30sIGZldGNoT3B0aW9ucykpIF0pOwogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIGFib3J0Q29udHJvbGxlci5hYm9ydCgpOwogICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICJUaW1lb3V0IHdoZW4gZXhlY3V0aW5nICdmZXRjaCciCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBoZWFkZXJzID0gZnJvbUVudHJpZXMocmVzcG9uc2UuaGVhZGVycyk7CiAgICAgICAgICAgIGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgIGlmIChqc29uLnJlZnJlc2hfdG9rZW4pIHsKICAgICAgICAgICAgICAgIGlmICh1c2VNcnJ0ICYmIGF1ZGllbmNlICE9PSAiZGVmYXVsdCIpIHsKICAgICAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW5zWyJsYXRlc3RfcmVmcmVzaF90b2tlbiJdID0ganNvbi5yZWZyZXNoX3Rva2VuOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlZnJlc2hUb2tlbnMocmVmcmVzaFRva2VuLCBqc29uLnJlZnJlc2hfdG9rZW4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0UmVmcmVzaFRva2VuKGpzb24ucmVmcmVzaF90b2tlbiwgYXVkaWVuY2UsIHNjb3BlKTsKICAgICAgICAgICAgICAgIGRlbGV0ZSBqc29uLnJlZnJlc2hfdG9rZW47CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGVSZWZyZXNoVG9rZW4oYXVkaWVuY2UsIHNjb3BlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIG9rOiByZXNwb25zZS5vaywKICAgICAgICAgICAgICAgIGpzb246IGpzb24sCiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzCiAgICAgICAgICAgIH0pOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgb2s6IGZhbHNlLAogICAgICAgICAgICAgICAganNvbjogewogICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci5lcnJvciwKICAgICAgICAgICAgICAgICAgICBlcnJvcl9kZXNjcmlwdGlvbjogZXJyb3IubWVzc2FnZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKICAgIHsKICAgICAgICBhZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgbWVzc2FnZUhhbmRsZXIpOwogICAgfQp9KSgpOwoK", null, false);
1863
+ var WorkerFactory = createBase64WorkerFactory("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24oKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBjbGFzcyBHZW5lcmljRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgICAgICAgY29uc3RydWN0b3IoZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHN1cGVyKGVycm9yX2Rlc2NyaXB0aW9uKTsKICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yOwogICAgICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gZXJyb3JfZGVzY3JpcHRpb247CiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBHZW5lcmljRXJyb3IucHJvdG90eXBlKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZyb21QYXlsb2FkKHtlcnJvcjogZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uOiBlcnJvcl9kZXNjcmlwdGlvbn0pIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljRXJyb3IoZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBNaXNzaW5nUmVmcmVzaFRva2VuRXJyb3IgZXh0ZW5kcyBHZW5lcmljRXJyb3IgewogICAgICAgIGNvbnN0cnVjdG9yKGF1ZGllbmNlLCBzY29wZSkgewogICAgICAgICAgICBzdXBlcigibWlzc2luZ19yZWZyZXNoX3Rva2VuIiwgYE1pc3NpbmcgUmVmcmVzaCBUb2tlbiAoYXVkaWVuY2U6ICcke3ZhbHVlT3JFbXB0eVN0cmluZyhhdWRpZW5jZSwgWyAiZGVmYXVsdCIgXSl9Jywgc2NvcGU6ICcke3ZhbHVlT3JFbXB0eVN0cmluZyhzY29wZSl9JylgKTsKICAgICAgICAgICAgdGhpcy5hdWRpZW5jZSA9IGF1ZGllbmNlOwogICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNaXNzaW5nUmVmcmVzaFRva2VuRXJyb3IucHJvdG90eXBlKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB2YWx1ZU9yRW1wdHlTdHJpbmcodmFsdWUsIGV4Y2x1ZGUgPSBbXSkgewogICAgICAgIHJldHVybiB2YWx1ZSAmJiAhZXhjbHVkZS5pbmNsdWRlcyh2YWx1ZSkgPyB2YWx1ZSA6ICIiOwogICAgfQogICAgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHsKICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTsKICAgICAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAiZnVuY3Rpb24iKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07CiAgICAgICAgfQogICAgICAgIHJldHVybiB0OwogICAgfQogICAgdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gImZ1bmN0aW9uIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7CiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7CiAgICAgICAgcmV0dXJuIGUubmFtZSA9ICJTdXBwcmVzc2VkRXJyb3IiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7CiAgICB9OwogICAgY29uc3Qgc3RyaXBVbmRlZmluZWQgPSBwYXJhbXMgPT4gT2JqZWN0LmtleXMocGFyYW1zKS5maWx0ZXIoKGsgPT4gdHlwZW9mIHBhcmFtc1trXSAhPT0gInVuZGVmaW5lZCIpKS5yZWR1Y2UoKChhY2MsIGtleSkgPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2MpLCB7CiAgICAgICAgW2tleV06IHBhcmFtc1trZXldCiAgICB9KSksIHt9KTsKICAgIGNvbnN0IGNyZWF0ZVF1ZXJ5UGFyYW1zID0gX2EgPT4gewogICAgICAgIHZhciB7Y2xpZW50SWQ6IGNsaWVudF9pZH0gPSBfYSwgcGFyYW1zID0gX19yZXN0KF9hLCBbICJjbGllbnRJZCIgXSk7CiAgICAgICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoc3RyaXBVbmRlZmluZWQoT2JqZWN0LmFzc2lnbih7CiAgICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50X2lkCiAgICAgICAgfSwgcGFyYW1zKSkpLnRvU3RyaW5nKCk7CiAgICB9OwogICAgY29uc3QgZnJvbUVudHJpZXMgPSBpdGVyYWJsZSA9PiBbIC4uLml0ZXJhYmxlIF0ucmVkdWNlKCgob2JqLCBba2V5LCB2YWxdKSA9PiB7CiAgICAgICAgb2JqW2tleV0gPSB2YWw7CiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0pLCB7fSk7CiAgICBsZXQgcmVmcmVzaFRva2VucyA9IHt9OwogICAgY29uc3QgY2FjaGVLZXkgPSAoYXVkaWVuY2UsIHNjb3BlKSA9PiBgJHthdWRpZW5jZX18JHtzY29wZX1gOwogICAgY29uc3QgY2FjaGVLZXlDb250YWluc0F1ZGllbmNlID0gKGF1ZGllbmNlLCBjYWNoZUtleSkgPT4gY2FjaGVLZXkuc3RhcnRzV2l0aChgJHthdWRpZW5jZX18YCk7CiAgICBjb25zdCBnZXRSZWZyZXNoVG9rZW4gPSAoYXVkaWVuY2UsIHNjb3BlKSA9PiByZWZyZXNoVG9rZW5zW2NhY2hlS2V5KGF1ZGllbmNlLCBzY29wZSldOwogICAgY29uc3Qgc2V0UmVmcmVzaFRva2VuID0gKHJlZnJlc2hUb2tlbiwgYXVkaWVuY2UsIHNjb3BlKSA9PiByZWZyZXNoVG9rZW5zW2NhY2hlS2V5KGF1ZGllbmNlLCBzY29wZSldID0gcmVmcmVzaFRva2VuOwogICAgY29uc3QgZGVsZXRlUmVmcmVzaFRva2VuID0gKGF1ZGllbmNlLCBzY29wZSkgPT4gZGVsZXRlIHJlZnJlc2hUb2tlbnNbY2FjaGVLZXkoYXVkaWVuY2UsIHNjb3BlKV07CiAgICBjb25zdCB3YWl0ID0gdGltZSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWUpKSk7CiAgICBjb25zdCBmb3JtRGF0YVRvT2JqZWN0ID0gZm9ybURhdGEgPT4gewogICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhmb3JtRGF0YSk7CiAgICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSB7fTsKICAgICAgICBxdWVyeVBhcmFtcy5mb3JFYWNoKCgodmFsLCBrZXkpID0+IHsKICAgICAgICAgICAgcGFyc2VkUXVlcnlba2V5XSA9IHZhbDsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHBhcnNlZFF1ZXJ5OwogICAgfTsKICAgIGNvbnN0IHVwZGF0ZVJlZnJlc2hUb2tlbnMgPSAob2xkUmVmcmVzaFRva2VuLCBuZXdSZWZyZXNoVG9rZW4pID0+IHsKICAgICAgICBPYmplY3QuZW50cmllcyhyZWZyZXNoVG9rZW5zKS5mb3JFYWNoKCgoW2tleSwgdG9rZW5dKSA9PiB7CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gb2xkUmVmcmVzaFRva2VuKSB7CiAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW5zW2tleV0gPSBuZXdSZWZyZXNoVG9rZW47CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9OwogICAgY29uc3QgY2hlY2tEb3duc2NvcGluZyA9IChzY29wZSwgYXVkaWVuY2UpID0+IHsKICAgICAgICBjb25zdCBmaW5kQ29pbmNpZGVuY2UgPSBPYmplY3Qua2V5cyhyZWZyZXNoVG9rZW5zKS5maW5kKChrZXkgPT4gewogICAgICAgICAgICBpZiAoa2V5ICE9PSAibGF0ZXN0X3JlZnJlc2hfdG9rZW4iKSB7CiAgICAgICAgICAgICAgICBjb25zdCBpc1NhbWVBdWRpZW5jZSA9IGNhY2hlS2V5Q29udGFpbnNBdWRpZW5jZShhdWRpZW5jZSwga2V5KTsKICAgICAgICAgICAgICAgIGNvbnN0IHNjb3Blc0tleSA9IGtleS5zcGxpdCgifCIpWzFdLnNwbGl0KCIgIik7CiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZWRTY29wZXMgPSBzY29wZS5zcGxpdCgiICIpOwogICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVzQXJlSW5jbHVkZWQgPSByZXF1ZXN0ZWRTY29wZXMuZXZlcnkoKGtleSA9PiBzY29wZXNLZXkuaW5jbHVkZXMoa2V5KSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIGlzU2FtZUF1ZGllbmNlICYmIHNjb3Blc0FyZUluY2x1ZGVkOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBmaW5kQ29pbmNpZGVuY2UgPyB0cnVlIDogZmFsc2U7CiAgICB9OwogICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBhc3luYyAoe2RhdGE6IHt0aW1lb3V0OiB0aW1lb3V0LCBhdXRoOiBhdXRoLCBmZXRjaFVybDogZmV0Y2hVcmwsIGZldGNoT3B0aW9uczogZmV0Y2hPcHRpb25zLCB1c2VGb3JtRGF0YTogdXNlRm9ybURhdGEsIHVzZU1ycnQ6IHVzZU1ycnR9LCBwb3J0czogW3BvcnRdfSkgPT4gewogICAgICAgIGxldCBoZWFkZXJzID0ge307CiAgICAgICAgbGV0IGpzb247CiAgICAgICAgbGV0IHJlZnJlc2hUb2tlbjsKICAgICAgICBjb25zdCB7YXVkaWVuY2U6IGF1ZGllbmNlLCBzY29wZTogc2NvcGV9ID0gYXV0aCB8fCB7fTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBib2R5ID0gdXNlRm9ybURhdGEgPyBmb3JtRGF0YVRvT2JqZWN0KGZldGNoT3B0aW9ucy5ib2R5KSA6IEpTT04ucGFyc2UoZmV0Y2hPcHRpb25zLmJvZHkpOwogICAgICAgICAgICBpZiAoIWJvZHkucmVmcmVzaF90b2tlbiAmJiBib2R5LmdyYW50X3R5cGUgPT09ICJyZWZyZXNoX3Rva2VuIikgewogICAgICAgICAgICAgICAgcmVmcmVzaFRva2VuID0gZ2V0UmVmcmVzaFRva2VuKGF1ZGllbmNlLCBzY29wZSk7CiAgICAgICAgICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbiAmJiB1c2VNcnJ0KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0UmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2Vuc1sibGF0ZXN0X3JlZnJlc2hfdG9rZW4iXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0Rvd25zY29waW5nID0gY2hlY2tEb3duc2NvcGluZyhzY29wZSwgYXVkaWVuY2UpOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXRlc3RSZWZyZXNoVG9rZW4gJiYgIWlzRG93bnNjb3BpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFRva2VuID0gbGF0ZXN0UmVmcmVzaFRva2VuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZWZyZXNoVG9rZW5FcnJvcihhdWRpZW5jZSwgc2NvcGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmJvZHkgPSB1c2VGb3JtRGF0YSA/IGNyZWF0ZVF1ZXJ5UGFyYW1zKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYm9keSksIHsKICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4KICAgICAgICAgICAgICAgIH0pKSA6IEpTT04uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYm9keSksIHsKICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgYWJvcnRDb250cm9sbGVyOwogICAgICAgICAgICBpZiAodHlwZW9mIEFib3J0Q29udHJvbGxlciA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcjsKICAgICAgICAgICAgICAgIGZldGNoT3B0aW9ucy5zaWduYWwgPSBhYm9ydENvbnRyb2xsZXIuc2lnbmFsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCByZXNwb25zZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5yYWNlKFsgd2FpdCh0aW1lb3V0KSwgZmV0Y2goZmV0Y2hVcmwsIE9iamVjdC5hc3NpZ24oe30sIGZldGNoT3B0aW9ucykpIF0pOwogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIGFib3J0Q29udHJvbGxlci5hYm9ydCgpOwogICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICJUaW1lb3V0IHdoZW4gZXhlY3V0aW5nICdmZXRjaCciCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBoZWFkZXJzID0gZnJvbUVudHJpZXMocmVzcG9uc2UuaGVhZGVycyk7CiAgICAgICAgICAgIGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgIGlmIChqc29uLnJlZnJlc2hfdG9rZW4pIHsKICAgICAgICAgICAgICAgIGlmICh1c2VNcnJ0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFRva2Vuc1sibGF0ZXN0X3JlZnJlc2hfdG9rZW4iXSA9IGpzb24ucmVmcmVzaF90b2tlbjsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZWZyZXNoVG9rZW5zKHJlZnJlc2hUb2tlbiwganNvbi5yZWZyZXNoX3Rva2VuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNldFJlZnJlc2hUb2tlbihqc29uLnJlZnJlc2hfdG9rZW4sIGF1ZGllbmNlLCBzY29wZSk7CiAgICAgICAgICAgICAgICBkZWxldGUganNvbi5yZWZyZXNoX3Rva2VuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlUmVmcmVzaFRva2VuKGF1ZGllbmNlLCBzY29wZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBvazogcmVzcG9uc2Uub2ssCiAgICAgICAgICAgICAgICBqc29uOiBqc29uLAogICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycwogICAgICAgICAgICB9KTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIG9rOiBmYWxzZSwKICAgICAgICAgICAgICAgIGpzb246IHsKICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IuZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH07CiAgICB7CiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIG1lc3NhZ2VIYW5kbGVyKTsKICAgIH0KfSkoKTsKCg==", null, false);
1805
1864
  const singlePromiseMap = {};
1806
1865
  const singlePromise = (cb, key) => {
1807
1866
  let promise = singlePromiseMap[key];
@@ -1860,6 +1919,7 @@
1860
1919
  }
1861
1920
  }
1862
1921
  const GET_TOKEN_SILENTLY_LOCK_KEY = "auth0.lock.getTokenSilently";
1922
+ const buildGetTokenSilentlyLockKey = (clientId, audience) => `${GET_TOKEN_SILENTLY_LOCK_KEY}.${clientId}.${audience}`;
1863
1923
  const buildOrganizationHintCookieName = clientId => `auth0.${clientId}.organization_hint`;
1864
1924
  const OLD_IS_AUTHENTICATED_COOKIE_NAME = "auth0.is.authenticated";
1865
1925
  const buildIsAuthenticatedCookieName = clientId => `auth0.${clientId}.is.authenticated`;
@@ -1871,7 +1931,7 @@
1871
1931
  const getAuthorizeParams = (clientOptions, scope, authorizationParams, state, nonce, code_challenge, redirect_uri, response_mode, thumbprint) => Object.assign(Object.assign(Object.assign({
1872
1932
  client_id: clientOptions.clientId
1873
1933
  }, clientOptions.authorizationParams), authorizationParams), {
1874
- scope: getUniqueScopes(scope, authorizationParams.scope),
1934
+ scope: scopesToRequest(scope, authorizationParams.scope, authorizationParams.audience),
1875
1935
  response_type: "code",
1876
1936
  response_mode: response_mode || "query",
1877
1937
  state: state,
@@ -1893,6 +1953,12 @@
1893
1953
  const scopesToInclude = (scopeToInclude === null || scopeToInclude === void 0 ? void 0 : scopeToInclude.split(" ")) || [];
1894
1954
  return scopesToInclude.every((key => scopeGroup.includes(key)));
1895
1955
  };
1956
+ const getMissingScopes = (requestedScope, respondedScope) => {
1957
+ const requestedScopes = (requestedScope === null || requestedScope === void 0 ? void 0 : requestedScope.split(" ")) || [];
1958
+ const respondedScopes = (respondedScope === null || respondedScope === void 0 ? void 0 : respondedScope.split(" ")) || [];
1959
+ const missingScopes = requestedScopes.filter((scope => respondedScopes.indexOf(scope) == -1));
1960
+ return missingScopes.join(",");
1961
+ };
1896
1962
  const getScopeToRequest = (useMrrt, authorizationParams, cachedAudience, cachedScope) => {
1897
1963
  var _a;
1898
1964
  if (useMrrt && cachedAudience && cachedScope) {
@@ -2018,6 +2084,11 @@
2018
2084
  await Promise.all([ this.storage.clearNonces(), this.storage.clearKeyPairs() ]);
2019
2085
  }
2020
2086
  }
2087
+ var TokenType;
2088
+ (function(TokenType) {
2089
+ TokenType["Bearer"] = "Bearer";
2090
+ TokenType["DPoP"] = "DPoP";
2091
+ })(TokenType || (TokenType = {}));
2021
2092
  class Fetcher {
2022
2093
  constructor(config, hooks) {
2023
2094
  this.hooks = hooks;
@@ -2042,15 +2113,25 @@
2042
2113
  getAccessToken(authParams) {
2043
2114
  return this.config.getAccessToken ? this.config.getAccessToken(authParams) : this.hooks.getAccessToken(authParams);
2044
2115
  }
2116
+ extractUrl(info) {
2117
+ if (typeof info === "string") {
2118
+ return info;
2119
+ }
2120
+ if (info instanceof URL) {
2121
+ return info.href;
2122
+ }
2123
+ return info.url;
2124
+ }
2045
2125
  buildBaseRequest(info, init) {
2046
- const request = new Request(info, init);
2047
2126
  if (!this.config.baseUrl) {
2048
- return request;
2127
+ return new Request(info, init);
2049
2128
  }
2050
- return new Request(this.buildUrl(this.config.baseUrl, request.url), request);
2129
+ const finalUrl = this.buildUrl(this.config.baseUrl, this.extractUrl(info));
2130
+ const finalInfo = info instanceof Request ? new Request(finalUrl, info) : finalUrl;
2131
+ return new Request(finalInfo, init);
2051
2132
  }
2052
- setAuthorizationHeader(request, accessToken) {
2053
- request.headers.set("authorization", `${this.config.dpopNonceId ? "DPoP" : "Bearer"} ${accessToken}`);
2133
+ setAuthorizationHeader(request, accessToken, tokenType = TokenType.Bearer) {
2134
+ request.headers.set("authorization", `${tokenType} ${accessToken}`);
2054
2135
  }
2055
2136
  async setDpopProofHeader(request, accessToken) {
2056
2137
  if (!this.config.dpopNonceId) {
@@ -2066,9 +2147,20 @@
2066
2147
  request.headers.set("dpop", dpopProof);
2067
2148
  }
2068
2149
  async prepareRequest(request, authParams) {
2069
- const accessToken = await this.getAccessToken(authParams);
2070
- this.setAuthorizationHeader(request, accessToken);
2071
- await this.setDpopProofHeader(request, accessToken);
2150
+ const accessTokenResponse = await this.getAccessToken(authParams);
2151
+ let tokenType;
2152
+ let accessToken;
2153
+ if (typeof accessTokenResponse === "string") {
2154
+ tokenType = this.config.dpopNonceId ? TokenType.DPoP : TokenType.Bearer;
2155
+ accessToken = accessTokenResponse;
2156
+ } else {
2157
+ tokenType = accessTokenResponse.token_type;
2158
+ accessToken = accessTokenResponse.access_token;
2159
+ }
2160
+ this.setAuthorizationHeader(request, accessToken, tokenType);
2161
+ if (tokenType === TokenType.DPoP) {
2162
+ await this.setDpopProofHeader(request, accessToken);
2163
+ }
2072
2164
  }
2073
2165
  getHeader(headers, name) {
2074
2166
  if (Array.isArray(headers)) {
@@ -2084,7 +2176,7 @@
2084
2176
  return false;
2085
2177
  }
2086
2178
  const wwwAuthHeader = this.getHeader(response.headers, "www-authenticate");
2087
- return wwwAuthHeader.includes("use_dpop_nonce");
2179
+ return wwwAuthHeader.includes("invalid_dpop_nonce") || wwwAuthHeader.includes("use_dpop_nonce");
2088
2180
  }
2089
2181
  async handleResponse(response, callbacks) {
2090
2182
  const newDpopNonce = this.getHeader(response.headers, DPOP_NONCE_HEADER);
@@ -2175,6 +2267,7 @@
2175
2267
  class Auth0Client {
2176
2268
  constructor(options) {
2177
2269
  this.userCache = (new InMemoryCache).enclosedCache;
2270
+ this.activeLockKeys = new Set;
2178
2271
  this.defaultOptions = {
2179
2272
  authorizationParams: {
2180
2273
  scope: DEFAULT_SCOPE
@@ -2183,7 +2276,11 @@
2183
2276
  useFormData: true
2184
2277
  };
2185
2278
  this._releaseLockOnPageHide = async () => {
2186
- await lock.releaseLock(GET_TOKEN_SILENTLY_LOCK_KEY);
2279
+ const lockKeysToRelease = Array.from(this.activeLockKeys);
2280
+ for (const lockKey of lockKeysToRelease) {
2281
+ await lock.releaseLock(lockKey);
2282
+ }
2283
+ this.activeLockKeys.clear();
2187
2284
  window.removeEventListener("pagehide", this._releaseLockOnPageHide);
2188
2285
  };
2189
2286
  this.options = Object.assign(Object.assign(Object.assign({}, this.defaultOptions), options), {
@@ -2210,7 +2307,7 @@
2210
2307
  this.isAuthenticatedCookieName = buildIsAuthenticatedCookieName(this.options.clientId);
2211
2308
  this.sessionCheckExpiryDays = options.sessionCheckExpiryDays || DEFAULT_SESSION_CHECK_EXPIRY_DAYS;
2212
2309
  const transactionStorage = options.useCookiesForTransactions ? this.cookieStorage : SessionStorage;
2213
- this.scope = getUniqueScopes("openid", this.options.authorizationParams.scope, this.options.useRefreshTokens ? "offline_access" : "");
2310
+ this.scope = injectDefaultScopes(this.options.authorizationParams.scope, "openid", this.options.useRefreshTokens ? "offline_access" : "");
2214
2311
  this.transactionManager = new TransactionManager(transactionStorage, this.options.clientId, this.options.cookieDomain);
2215
2312
  this.nowProvider = this.options.nowProvider || DEFAULT_NOW_PROVIDER;
2216
2313
  this.cacheManager = new CacheManager(cache, !cache.allKeys ? new CacheKeyManifest(cache, this.options.clientId) : undefined, this.nowProvider);
@@ -2225,7 +2322,8 @@
2225
2322
  authorizationParams: {
2226
2323
  scope: "create:me:connected_accounts",
2227
2324
  audience: myAccountApiIdentifier
2228
- }
2325
+ },
2326
+ detailedResponse: true
2229
2327
  })
2230
2328
  }));
2231
2329
  this.myAccountApi = new MyAccountApiClient(myAccountFetcher, myAccountApiIdentifier);
@@ -2283,7 +2381,7 @@
2283
2381
  nonce: nonce,
2284
2382
  code_verifier: code_verifier,
2285
2383
  scope: params.scope,
2286
- audience: params.audience || "default",
2384
+ audience: params.audience || DEFAULT_AUDIENCE,
2287
2385
  redirect_uri: params.redirect_uri,
2288
2386
  state: state,
2289
2387
  url: url
@@ -2433,12 +2531,12 @@
2433
2531
  } catch (_) {}
2434
2532
  }
2435
2533
  async getTokenSilently(options = {}) {
2436
- var _a;
2534
+ var _a, _b;
2437
2535
  const localOptions = Object.assign(Object.assign({
2438
2536
  cacheMode: "on"
2439
2537
  }, options), {
2440
2538
  authorizationParams: Object.assign(Object.assign(Object.assign({}, this.options.authorizationParams), options.authorizationParams), {
2441
- scope: getUniqueScopes(this.scope, (_a = options.authorizationParams) === null || _a === void 0 ? void 0 : _a.scope)
2539
+ scope: scopesToRequest(this.scope, (_a = options.authorizationParams) === null || _a === void 0 ? void 0 : _a.scope, ((_b = options.authorizationParams) === null || _b === void 0 ? void 0 : _b.audience) || this.options.authorizationParams.audience)
2442
2540
  })
2443
2541
  });
2444
2542
  const result = await singlePromise((() => this._getTokenSilently(localOptions)), `${this.options.clientId}::${localOptions.authorizationParams.audience}::${localOptions.authorizationParams.scope}`);
@@ -2449,7 +2547,7 @@
2449
2547
  if (cacheMode !== "off") {
2450
2548
  const entry = await this._getEntryFromCache({
2451
2549
  scope: getTokenOptions.authorizationParams.scope,
2452
- audience: getTokenOptions.authorizationParams.audience || "default",
2550
+ audience: getTokenOptions.authorizationParams.audience || DEFAULT_AUDIENCE,
2453
2551
  clientId: this.options.clientId,
2454
2552
  cacheMode: cacheMode
2455
2553
  });
@@ -2460,13 +2558,17 @@
2460
2558
  if (cacheMode === "cache-only") {
2461
2559
  return;
2462
2560
  }
2463
- if (await retryPromise((() => lock.acquireLock(GET_TOKEN_SILENTLY_LOCK_KEY, 5e3)), 10)) {
2464
- try {
2561
+ const lockKey = buildGetTokenSilentlyLockKey(this.options.clientId, getTokenOptions.authorizationParams.audience || "default");
2562
+ if (await retryPromise((() => lock.acquireLock(lockKey, 5e3)), 10)) {
2563
+ this.activeLockKeys.add(lockKey);
2564
+ if (this.activeLockKeys.size === 1) {
2465
2565
  window.addEventListener("pagehide", this._releaseLockOnPageHide);
2566
+ }
2567
+ try {
2466
2568
  if (cacheMode !== "off") {
2467
2569
  const entry = await this._getEntryFromCache({
2468
2570
  scope: getTokenOptions.authorizationParams.scope,
2469
- audience: getTokenOptions.authorizationParams.audience || "default",
2571
+ audience: getTokenOptions.authorizationParams.audience || DEFAULT_AUDIENCE,
2470
2572
  clientId: this.options.clientId
2471
2573
  });
2472
2574
  if (entry) {
@@ -2485,25 +2587,28 @@
2485
2587
  expires_in: expires_in
2486
2588
  });
2487
2589
  } finally {
2488
- await lock.releaseLock(GET_TOKEN_SILENTLY_LOCK_KEY);
2489
- window.removeEventListener("pagehide", this._releaseLockOnPageHide);
2590
+ await lock.releaseLock(lockKey);
2591
+ this.activeLockKeys.delete(lockKey);
2592
+ if (this.activeLockKeys.size === 0) {
2593
+ window.removeEventListener("pagehide", this._releaseLockOnPageHide);
2594
+ }
2490
2595
  }
2491
2596
  } else {
2492
2597
  throw new TimeoutError;
2493
2598
  }
2494
2599
  }
2495
2600
  async getTokenWithPopup(options = {}, config = {}) {
2496
- var _a;
2601
+ var _a, _b;
2497
2602
  const localOptions = Object.assign(Object.assign({}, options), {
2498
2603
  authorizationParams: Object.assign(Object.assign(Object.assign({}, this.options.authorizationParams), options.authorizationParams), {
2499
- scope: getUniqueScopes(this.scope, (_a = options.authorizationParams) === null || _a === void 0 ? void 0 : _a.scope)
2604
+ scope: scopesToRequest(this.scope, (_a = options.authorizationParams) === null || _a === void 0 ? void 0 : _a.scope, ((_b = options.authorizationParams) === null || _b === void 0 ? void 0 : _b.audience) || this.options.authorizationParams.audience)
2500
2605
  })
2501
2606
  });
2502
2607
  config = Object.assign(Object.assign({}, DEFAULT_POPUP_CONFIG_OPTIONS), config);
2503
2608
  await this.loginWithPopup(localOptions, config);
2504
2609
  const cache = await this.cacheManager.get(new CacheKey({
2505
2610
  scope: localOptions.authorizationParams.scope,
2506
- audience: localOptions.authorizationParams.audience || "default",
2611
+ audience: localOptions.authorizationParams.audience || DEFAULT_AUDIENCE,
2507
2612
  clientId: this.options.clientId
2508
2613
  }), undefined, this.options.useMrrt);
2509
2614
  return cache.access_token;
@@ -2601,14 +2706,14 @@
2601
2706
  async _getTokenUsingRefreshToken(options) {
2602
2707
  const cache = await this.cacheManager.get(new CacheKey({
2603
2708
  scope: options.authorizationParams.scope,
2604
- audience: options.authorizationParams.audience || "default",
2709
+ audience: options.authorizationParams.audience || DEFAULT_AUDIENCE,
2605
2710
  clientId: this.options.clientId
2606
2711
  }), undefined, this.options.useMrrt);
2607
2712
  if ((!cache || !cache.refresh_token) && !this.worker) {
2608
2713
  if (this.options.useRefreshTokensFallback) {
2609
2714
  return await this._getTokenFromIFrame(options);
2610
2715
  }
2611
- throw new MissingRefreshTokenError(options.authorizationParams.audience || "default", options.authorizationParams.scope);
2716
+ throw new MissingRefreshTokenError(options.authorizationParams.audience || DEFAULT_AUDIENCE, options.authorizationParams.scope);
2612
2717
  }
2613
2718
  const redirect_uri = options.authorizationParams.redirect_uri || this.options.authorizationParams.redirect_uri || window.location.origin;
2614
2719
  const timeout = typeof options.timeoutInSeconds === "number" ? options.timeoutInSeconds * 1e3 : null;
@@ -2634,14 +2739,16 @@
2634
2739
  if (this.options.useRefreshTokensFallback) {
2635
2740
  return await this._getTokenFromIFrame(options);
2636
2741
  }
2637
- throw new MissingRefreshTokenError(options.authorizationParams.audience || "default", options.authorizationParams.scope);
2742
+ await this.cacheManager.remove(this.options.clientId, options.authorizationParams.audience, options.authorizationParams.scope);
2743
+ const missingScopes = getMissingScopes(scopesToRequest, tokenResult.scope);
2744
+ throw new MissingScopesError(options.authorizationParams.audience || "default", missingScopes);
2638
2745
  }
2639
2746
  }
2640
2747
  }
2641
2748
  return Object.assign(Object.assign({}, tokenResult), {
2642
2749
  scope: options.authorizationParams.scope,
2643
2750
  oauthTokenScope: tokenResult.scope,
2644
- audience: options.authorizationParams.audience || "default"
2751
+ audience: options.authorizationParams.audience || DEFAULT_AUDIENCE
2645
2752
  });
2646
2753
  } catch (e) {
2647
2754
  if ((e.message.indexOf(MISSING_REFRESH_TOKEN_ERROR_MESSAGE) > -1 || e.message && e.message.indexOf(INVALID_REFRESH_TOKEN_ERROR_MESSAGE) > -1) && this.options.useRefreshTokensFallback) {
@@ -2660,11 +2767,12 @@
2660
2767
  await this.cacheManager.set(entryWithoutIdToken);
2661
2768
  }
2662
2769
  async _getIdTokenFromCache() {
2663
- const audience = this.options.authorizationParams.audience || "default";
2770
+ const audience = this.options.authorizationParams.audience || DEFAULT_AUDIENCE;
2771
+ const scope = this.scope[audience];
2664
2772
  const cache = await this.cacheManager.getIdToken(new CacheKey({
2665
2773
  clientId: this.options.clientId,
2666
2774
  audience: audience,
2667
- scope: this.scope
2775
+ scope: scope
2668
2776
  }));
2669
2777
  const currentCache = this.userCache.get(CACHE_KEY_ID_TOKEN_SUFFIX);
2670
2778
  if (cache && cache.id_token === (currentCache === null || currentCache === void 0 ? void 0 : currentCache.id_token)) {
@@ -2710,7 +2818,7 @@
2710
2818
  await this._saveEntryInCache(Object.assign(Object.assign(Object.assign(Object.assign({}, authResult), {
2711
2819
  decodedToken: decodedToken,
2712
2820
  scope: options.scope,
2713
- audience: options.audience || "default"
2821
+ audience: options.audience || DEFAULT_AUDIENCE
2714
2822
  }), authResult.scope ? {
2715
2823
  oauthTokenScope: authResult.scope
2716
2824
  } : null), {
@@ -2730,7 +2838,7 @@
2730
2838
  grant_type: "urn:ietf:params:oauth:grant-type:token-exchange",
2731
2839
  subject_token: options.subject_token,
2732
2840
  subject_token_type: options.subject_token_type,
2733
- scope: getUniqueScopes(options.scope, this.scope),
2841
+ scope: scopesToRequest(this.scope, options.scope, options.audience || this.options.authorizationParams.audience),
2734
2842
  audience: options.audience || this.options.authorizationParams.audience
2735
2843
  });
2736
2844
  }
@@ -2752,9 +2860,6 @@
2752
2860
  return this.dpop.generateProof(params);
2753
2861
  }
2754
2862
  createFetcher(config = {}) {
2755
- if (this.options.useDpop && !config.dpopNonceId) {
2756
- throw new TypeError("When `useDpop` is enabled, `dpopNonceId` must be set when calling `createFetcher()`.");
2757
- }
2758
2863
  return new Fetcher(config, {
2759
2864
  isDpopEnabled: () => !!this.options.useDpop,
2760
2865
  getAccessToken: authParams => {
@@ -2763,7 +2868,8 @@
2763
2868
  authorizationParams: {
2764
2869
  scope: (_a = authParams === null || authParams === void 0 ? void 0 : authParams.scope) === null || _a === void 0 ? void 0 : _a.join(" "),
2765
2870
  audience: authParams === null || authParams === void 0 ? void 0 : authParams.audience
2766
- }
2871
+ },
2872
+ detailedResponse: true
2767
2873
  });
2768
2874
  },
2769
2875
  getDpopNonce: () => this.getDpopNonce(config.dpopNonceId),
@@ -2772,12 +2878,6 @@
2772
2878
  });
2773
2879
  }
2774
2880
  async connectAccountWithRedirect(options) {
2775
- if (!this.options.useDpop) {
2776
- throw new Error("`useDpop` option must be enabled before using connectAccountWithRedirect.");
2777
- }
2778
- if (!this.options.useMrrt) {
2779
- throw new Error("`useMrrt` option must be enabled before using connectAccountWithRedirect.");
2780
- }
2781
2881
  const {openUrl: openUrl, appState: appState, connection: connection, authorization_params: authorization_params, redirectUri: redirectUri = this.options.authorizationParams.redirect_uri || window.location.origin} = options;
2782
2882
  if (!connection) {
2783
2883
  throw new Error("connection is required");