@prosopo/load-balancer 2.10.50 → 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +7 -6
  2. package/.turbo/turbo-build$colon$tsc.log +11 -11
  3. package/.turbo/turbo-build.log +9 -8
  4. package/CHANGELOG.md +60 -0
  5. package/README.md +34 -0
  6. package/dist/balancer.d.ts +1 -0
  7. package/dist/balancer.d.ts.map +1 -1
  8. package/dist/balancer.js +44 -1
  9. package/dist/balancer.js.map +1 -1
  10. package/dist/cjs/balancer.cjs +44 -0
  11. package/dist/cjs/index.cjs +3 -0
  12. package/dist/cjs/providerUrlOverride.cjs +33 -0
  13. package/dist/cjs/providers.cjs +5 -0
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +3 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/providerUrlOverride.d.ts +2 -0
  19. package/dist/providerUrlOverride.d.ts.map +1 -0
  20. package/dist/providerUrlOverride.js +33 -0
  21. package/dist/providerUrlOverride.js.map +1 -0
  22. package/dist/providers.d.ts.map +1 -1
  23. package/dist/providers.js +6 -1
  24. package/dist/providers.js.map +1 -1
  25. package/dist/tests/providerUrlOverride.unit.test.d.ts +2 -0
  26. package/dist/tests/providerUrlOverride.unit.test.d.ts.map +1 -0
  27. package/dist/tests/providerUrlOverride.unit.test.js +144 -0
  28. package/dist/tests/providerUrlOverride.unit.test.js.map +1 -0
  29. package/dist/tests/providers.unit.test.js +2 -0
  30. package/dist/tests/providers.unit.test.js.map +1 -1
  31. package/package.json +3 -3
  32. package/src/balancer.ts +73 -0
  33. package/src/index.ts +1 -0
  34. package/src/providerUrlOverride.ts +44 -0
  35. package/src/providers.ts +13 -0
  36. package/src/tests/providerUrlOverride.unit.test.ts +182 -0
  37. package/src/tests/providers.unit.test.ts +6 -0
  38. package/tsconfig.tsbuildinfo +1 -1
@@ -1,5 +1,5 @@
1
1
 
2
- > @prosopo/load-balancer@2.10.50 build:cjs
2
+ > @prosopo/load-balancer@2.11.1 build:cjs
3
3
  > NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
4
4
 
5
5
  ViteCommonJSConfig: .
@@ -27,13 +27,14 @@ ViteCommonJSConfig: .
27
27
  vite v8.1.5 building ssr environment for production...
28
28
  Bundle build started
29
29
  
30
- ✓ 6 modules transformed.
30
+ ✓ 7 modules transformed.
31
31
  rendering chunks...
32
32
  computing gzip size...
33
33
  dist/cjs/retry.cjs 1.13 kB │ gzip: 0.56 kB
34
- dist/cjs/index.cjs 1.39 kB │ gzip: 0.39 kB
34
+ dist/cjs/providerUrlOverride.cjs 1.42 kB │ gzip: 0.78 kB
35
+ dist/cjs/index.cjs 1.63 kB │ gzip: 0.41 kB
35
36
  dist/cjs/developmentProviderUrl.cjs 1.81 kB │ gzip: 0.88 kB
36
- dist/cjs/balancer.cjs 2.56 kB │ gzip: 1.17 kB
37
- dist/cjs/providers.cjs 5.92 kB │ gzip: 2.04 kB
37
+ dist/cjs/balancer.cjs 4.36 kB │ gzip: 1.90 kB
38
+ dist/cjs/providers.cjs 6.12 kB │ gzip: 2.10 kB
38
39
 
39
- ✓ built in 51ms
40
+ ✓ built in 78ms
@@ -1,8 +1,8 @@
1
1
 
2
- > @prosopo/load-balancer@2.10.50 build:tsc
2
+ > @prosopo/load-balancer@2.11.1 build:tsc
3
3
  > tsc --build --verbose
4
4
 
5
- 3:28:37 PM - Projects in this build:
5
+ 3:36:58 PM - Projects in this build:
6
6
  * ../../dev/config/tsconfig.json
7
7
  * ../util/tsconfig.json
8
8
  * ../locale/tsconfig.json
@@ -12,21 +12,21 @@
12
12
  * ../common/tsconfig.json
13
13
  * tsconfig.json
14
14
 
15
- 3:28:37 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/webpack/webpack.config.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
15
+ 3:36:59 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/webpack/webpack.config.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
16
16
 
17
- 3:28:37 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
17
+ 3:36:59 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
18
18
 
19
- 3:28:37 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
19
+ 3:36:59 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
20
20
 
21
- 3:28:37 PM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/logger.ts' is older than output '../logger/tsconfig.tsbuildinfo'
21
+ 3:36:59 PM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/index.ts' is older than output '../logger/tsconfig.tsbuildinfo'
22
22
 
23
- 3:28:37 PM - Project '../util-crypto/tsconfig.json' is up to date because newest input '../util-crypto/src/types.ts' is older than output '../util-crypto/tsconfig.tsbuildinfo'
23
+ 3:36:59 PM - Project '../util-crypto/tsconfig.json' is up to date because newest input '../util-crypto/src/types.ts' is older than output '../util-crypto/tsconfig.tsbuildinfo'
24
24
 
25
- 3:28:37 PM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/types.test-d.ts' is older than output '../types/tsconfig.tsbuildinfo'
25
+ 3:36:59 PM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/types.test-d.ts' is older than output '../types/tsconfig.tsbuildinfo'
26
26
 
27
- 3:28:37 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/index.ts' is older than output '../common/tsconfig.tsbuildinfo'
27
+ 3:36:59 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/index.ts' is older than output '../common/tsconfig.tsbuildinfo'
28
28
 
29
- 3:28:37 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
29
+ 3:36:59 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
30
30
 
31
- 3:28:37 PM - Building project '/home/runner/work/captcha/captcha/packages/load-balancer/tsconfig.json'...
31
+ 3:36:59 PM - Building project '/home/runner/work/captcha/captcha/packages/load-balancer/tsconfig.json'...
32
32
 
@@ -1,9 +1,9 @@
1
1
 
2
- > @prosopo/load-balancer@2.10.50 build
2
+ > @prosopo/load-balancer@2.11.1 build
3
3
  > npm run build:cross-env -- --mode ${NODE_ENV:-development}
4
4
 
5
5
 
6
- > @prosopo/load-balancer@2.10.50 build:cross-env
6
+ > @prosopo/load-balancer@2.11.1 build:cross-env
7
7
  > vite build --config vite.esm.config.ts --mode production
8
8
 
9
9
  ViteEsmConfig: .
@@ -18,7 +18,6 @@ ViteEsmConfig: .
18
18
  ]
19
19
  }
20
20
  {
21
- The plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the resolve.tsconfigPaths option. You can remove the plugin and set resolve.tsconfigPaths: true in your Vite config instead.
22
21
  externals: [
23
22
  '@prosopo/common',
24
23
  '@prosopo/locale',
@@ -28,17 +27,19 @@ ViteEsmConfig: .
28
27
  '@prosopo/util-crypto'
29
28
  ]
30
29
  }
30
+ The plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the resolve.tsconfigPaths option. You can remove the plugin and set resolve.tsconfigPaths: true in your Vite config instead.
31
31
  vite v8.1.5 building ssr environment for production...
32
32
  Bundle build started
33
33
  
34
- ✓ 6 modules transformed.
34
+ ✓ 7 modules transformed.
35
35
  rendering chunks...
36
36
  computing gzip size...
37
37
  dist/_virtual/_rolldown/runtime.js 0.04 kB │ gzip: 0.06 kB
38
- dist/index.js 0.86 kB │ gzip: 0.30 kB
38
+ dist/index.js 1.00 kB │ gzip: 0.32 kB
39
39
  dist/retry.js 1.09 kB │ gzip: 0.55 kB
40
+ dist/providerUrlOverride.js 1.39 kB │ gzip: 0.77 kB
40
41
  dist/developmentProviderUrl.js 1.70 kB │ gzip: 0.87 kB
41
- dist/balancer.js 2.38 kB │ gzip: 1.15 kB
42
- dist/providers.js 5.64 kB │ gzip: 2.01 kB
42
+ dist/balancer.js 4.11 kB │ gzip: 1.86 kB
43
+ dist/providers.js 5.85 kB │ gzip: 2.07 kB
43
44
 
44
- ✓ built in 108ms
45
+ ✓ built in 70ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,65 @@
1
1
  # @prosopo/load-balancer
2
2
 
3
+ ## 2.11.1
4
+ ### Patch Changes
5
+
6
+ - Updated dependencies [fda0eba]
7
+ - Updated dependencies [1728cd0]
8
+ - Updated dependencies [20542d8]
9
+ - Updated dependencies [eebe6ee]
10
+ - @prosopo/types@5.10.2
11
+
12
+ ## 2.11.0
13
+ ### Minor Changes
14
+
15
+ - f13bea8: Let a deployment supply its own provider list with `PROSOPO_PROVIDER_LIST`.
16
+
17
+ There was no supported way to point the widget at providers you run. The only lever was
18
+ `PROSOPO_PROVIDER_URL_DEVELOPMENT`, which is read solely when the environment is `development`, and the widget takes
19
+ that environment from `NODE_ENV` at build time. So redirecting a bundle meant building it as a development bundle:
20
+ unminified, ~1.9 MB across chunks instead of ~1.4 MB, with rate limiting implications if anyone copied the same setting
21
+ onto their provider. Building with `NODE_ENV=production` silently ignored the variable and sent the widget back to
22
+ Prosopo's fleet, with nothing in the output to say so.
23
+
24
+ `PROSOPO_PROVIDER_LIST` is environment-independent, so `production` stays correct everywhere. It short-circuits both
25
+ halves of discovery — the `/healthz` call that picks a node, and the list `@prosopo/server` matches a token against —
26
+ so a self-hosted deployment makes no request to Prosopo at all.
27
+
28
+ Two forms, because one node and several have different needs:
29
+
30
+ ```bash
31
+ PROSOPO_PROVIDER_LIST=https://captcha1.example.com,https://captcha2.example.com
32
+ PROSOPO_PROVIDER_LIST='{"one":{"address":"5Abc...","url":"https://captcha1.example.com","datasetId":"","weight":3}}'
33
+ ```
34
+
35
+ The JSON form is the exact shape `provider-list.prosopo.io` serves, parsed by the same `convertHostedProvider`, so
36
+ weights and the `ipv4` / `ipv6` sub-lists behave identically. The bare-URL form fills in placeholder `address` and
37
+ `datasetId`, neither of which is load-bearing on this path — the DNS-routed production path already passes a constant
38
+ for `address`, and clients stopped sending `datasetId`.
39
+
40
+ Because it returns a list rather than one URL, a multi-provider override gets weighted selection and real failover:
41
+ `getRandomProviderFromList` can now exclude a node that just errored and pick a different one, which with a single
42
+ development URL degraded to retrying the same node.
43
+
44
+ Details worth knowing:
45
+
46
+ - Trailing slashes are stripped. A token embeds the provider URL it was minted against and the verifier matches by
47
+ exact string, so `https://host/` and `https://host` must not disagree.
48
+ - A malformed value is ignored and normal discovery resumes rather than throwing, so a deployment-time typo cannot
49
+ take every captcha on a page down with it.
50
+ - The env read lives in its own module holding nothing else. Parsing needs `convertHostedProvider` from `balancer.ts`,
51
+ and `balancer.ts` needs the read — putting both in one file would create an import cycle, which this package has
52
+ already lost a release to when a cycle between chunks broke the widget at load.
53
+ - `PROSOPO_PROVIDER_URL_DEVELOPMENT` is untouched and still works for local development.
54
+
55
+ Verified by building a production bundle with the override set: `defaultEnvironment` stays `production`, the bundle is
56
+ minified, and the override is baked in.
57
+
58
+ ### Patch Changes
59
+
60
+ - Updated dependencies [4c9b84b]
61
+ - @prosopo/types@5.10.1
62
+
3
63
  ## 2.10.50
4
64
  ### Patch Changes
5
65
 
package/README.md CHANGED
@@ -47,3 +47,37 @@ In this example:
47
47
  - Total weight = 4
48
48
  - Provider 1 receives ~25% of traffic
49
49
  - Provider 2 receives ~75% of traffic
50
+
51
+ ## Overriding the provider list
52
+
53
+ By default the list is fetched from `provider-list.prosopo.io` for `staging` and `production`, and hardcoded to a local
54
+ provider for `development`. `PROSOPO_PROVIDER_LIST` replaces all of that with providers you name, in every environment.
55
+
56
+ This is what a [self-hosted](https://docs.prosopo.io/en/self-hosting/) deployment uses. It short-circuits both halves of
57
+ discovery — the `/healthz` call the widget makes to pick a node, and the list a verifier matches a token against — so
58
+ nothing reaches Prosopo.
59
+
60
+ Two forms are accepted. One or more comma-separated URLs:
61
+
62
+ ```bash
63
+ PROSOPO_PROVIDER_LIST=https://captcha1.example.com,https://captcha2.example.com
64
+ ```
65
+
66
+ ...or the same JSON shape documented above, when you want to set weights or the `ipv4` / `ipv6` sub-lists:
67
+
68
+ ```bash
69
+ PROSOPO_PROVIDER_LIST='{"one":{"address":"5Abc...","url":"https://captcha1.example.com","datasetId":"","weight":3}}'
70
+ ```
71
+
72
+ Notes:
73
+
74
+ - Trailing slashes are stripped. A token embeds the provider URL it was minted against and `@prosopo/server` finds the
75
+ issuer by exact string match, so `https://host/` and `https://host` must not be able to disagree.
76
+ - A malformed value is ignored and normal discovery resumes, rather than throwing. A deployment-time typo should not
77
+ take down every captcha on the page — check your logs if an override seems to have no effect.
78
+ - The bare-URL form ignores `ipMode`. The `ipv4.` / `ipv6.` labels are a property of Prosopo's own DNS and prefixing
79
+ them onto another host would resolve to nothing. Use the JSON form's sub-lists if you run single-stack sub-zones.
80
+ - Frontend builds bake the value in at bundle time; Node reads it at runtime.
81
+
82
+ `PROSOPO_PROVIDER_URL_DEVELOPMENT` still exists and still only applies when the environment is `development`. Prefer
83
+ `PROSOPO_PROVIDER_LIST`, which works in a production build.
@@ -10,6 +10,7 @@ type hostedProviders = Record<string, unknown>;
10
10
  export declare const convertHostedProvider: (provider: hostedProviders, ipMode?: IpMode) => HardcodedProvider[];
11
11
  export declare const stripIpModeLabel: (hostname: string) => string;
12
12
  export declare const getProviderHostname: (provider: HardcodedProvider) => string;
13
+ export declare const getProviderListOverride: (raw?: string | undefined, ipMode?: IpMode) => HardcodedProvider[];
13
14
  export declare const getLoadBalancerUrl: (environment: EnvironmentTypes) => string;
14
15
  export declare const loadBalancer: (environment: EnvironmentTypes, ipMode?: IpMode) => Promise<HardcodedProvider[]>;
15
16
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"balancer.d.ts","sourceRoot":"","sources":["../src/balancer.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CACf;AAkCD,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAQrC,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAK/C,eAAO,MAAM,qBAAqB,aACvB,eAAe,WAChB,MAAM,KACb,iBAAiB,EAUnB,CAAC;AAKF,eAAO,MAAM,gBAAgB,aAAc,MAAM,KAAG,MACjB,CAAC;AAEpC,eAAO,MAAM,mBAAmB,aAAc,iBAAiB,KAAG,MACjB,CAAC;AAElD,eAAO,MAAM,kBAAkB,gBAAiB,gBAAgB,KAAG,MAUlE,CAAC;AAEF,eAAO,MAAM,YAAY,gBACX,gBAAgB,WACpB,MAAM,KACb,OAAO,CAAC,iBAAiB,EAAE,CAyB7B,CAAC"}
1
+ {"version":3,"file":"balancer.d.ts","sourceRoot":"","sources":["../src/balancer.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CACf;AAkCD,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAQrC,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAK/C,eAAO,MAAM,qBAAqB,aACvB,eAAe,WAChB,MAAM,KACb,iBAAiB,EAUnB,CAAC;AAKF,eAAO,MAAM,gBAAgB,aAAc,MAAM,KAAG,MACjB,CAAC;AAEpC,eAAO,MAAM,mBAAmB,aAAc,iBAAiB,KAAG,MACjB,CAAC;AA0ClD,eAAO,MAAM,uBAAuB,SAC9B,MAAM,GAAG,SAAS,WACd,MAAM,KACb,iBAAiB,EAiBnB,CAAC;AAEF,eAAO,MAAM,kBAAkB,gBAAiB,gBAAgB,KAAG,MAUlE,CAAC;AAEF,eAAO,MAAM,YAAY,gBACX,gBAAgB,WACpB,MAAM,KACb,OAAO,CAAC,iBAAiB,EAAE,CAmC7B,CAAC"}
package/dist/balancer.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { getDevelopmentProviderUrl } from "./developmentProviderUrl.js";
2
+ import { readProviderListOverride } from "./providerUrlOverride.js";
2
3
  import { ProsopoEnvError } from "@prosopo/common";
3
4
  //#region src/balancer.ts
4
5
  /**
@@ -25,12 +26,54 @@ var convertHostedProvider = (provider, ipMode) => {
25
26
  };
26
27
  var stripIpModeLabel = (hostname) => hostname.replace(/^ipv[46]\./, "");
27
28
  var getProviderHostname = (provider) => stripIpModeLabel(new URL(provider.url).hostname);
29
+ var SELF_HOSTED_ADDRESS = "self-hosted";
30
+ var SELF_HOSTED_DATASET_ID = "";
31
+ var stripTrailingSlash = (url) => url.replace(/\/$/, "");
32
+ var providersFromUrlList = (raw) => raw.split(",").map((url) => stripTrailingSlash(url.trim())).filter((url) => url.length > 0).map((url) => ({
33
+ address: SELF_HOSTED_ADDRESS,
34
+ url,
35
+ datasetId: SELF_HOSTED_DATASET_ID,
36
+ weight: 1
37
+ }));
38
+ /**
39
+ * Parses `PROSOPO_PROVIDER_LIST` into providers, or returns empty when unset.
40
+ *
41
+ * Two accepted forms:
42
+ *
43
+ * - The same JSON the hosted provider list serves, so weights and the
44
+ * `ipv4` / `ipv6` sub-lists behave identically. See the README.
45
+ * - One or more bare URLs, comma-separated, for a deployment that has
46
+ * nothing to say about weights or addresses.
47
+ *
48
+ * Trailing slashes are stripped throughout: a token embeds the provider URL
49
+ * it was minted against and `@prosopo/server` finds the issuer by exact
50
+ * string match, so `https://host/` and `https://host` must not disagree.
51
+ *
52
+ * A malformed override returns empty rather than throwing, falling back to
53
+ * normal discovery. Throwing would take every captcha on the page down over
54
+ * what is a deployment-time typo.
55
+ */
56
+ var getProviderListOverride = (raw = readProviderListOverride(), ipMode) => {
57
+ const trimmed = raw?.trim();
58
+ if (!trimmed) return [];
59
+ if (!trimmed.startsWith("{")) return providersFromUrlList(trimmed);
60
+ try {
61
+ return convertHostedProvider(JSON.parse(trimmed), ipMode).map((provider) => ({
62
+ ...provider,
63
+ url: stripTrailingSlash(provider.url)
64
+ }));
65
+ } catch {
66
+ return [];
67
+ }
68
+ };
28
69
  var getLoadBalancerUrl = (environment) => {
29
70
  if (environment === "production") return "https://provider-list.prosopo.io/";
30
71
  if (environment === "staging") return "https://provider-list.prosopo.io/staging.json";
31
72
  throw new ProsopoEnvError("CONFIG.UNKNOWN_ENVIRONMENT", { context: { environment } });
32
73
  };
33
74
  var loadBalancer = async (environment, ipMode) => {
75
+ const override = getProviderListOverride(void 0, ipMode);
76
+ if (override.length > 0) return override;
34
77
  if (environment === "development") return [{
35
78
  address: "5EjTA28bKSbFPPyMbUjNtArxyqjwq38r1BapVmLZShaqEedV",
36
79
  url: getDevelopmentProviderUrl(),
@@ -43,4 +86,4 @@ var loadBalancer = async (environment, ipMode) => {
43
86
  }).then((res) => res.json()), ipMode);
44
87
  };
45
88
  //#endregion
46
- export { convertHostedProvider, getLoadBalancerUrl, getProviderHostname, loadBalancer, stripIpModeLabel };
89
+ export { convertHostedProvider, getLoadBalancerUrl, getProviderHostname, getProviderListOverride, loadBalancer, stripIpModeLabel };
@@ -1 +1 @@
1
- {"version":3,"file":"balancer.js","sourceRoot":"","sources":["../src/balancer.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAexE,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAqB,EAAE;IACpE,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,IACC,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACxB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,EAC/D,CAAC;QAIF,MAAM,IAAI,KAAK,CACd,kDAAkD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CACzE,CAAC;IACH,CAAC;IAED,OAAO;QACN,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,SAAS,EAAE,KAAK,CAAC,SAAS;QAE1B,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;KACjE,CAAC;AACH,CAAC,CAAC;AAQF,MAAM,YAAY,GAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAI7D,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA4B,EAAE,CACrE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAE7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACpC,QAAyB,EACzB,MAAe,EACO,EAAE;IACxB,MAAM,MAAM,GACX,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAE,QAAQ,CAAC,MAAM,CAAqB;QACvC,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACtC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAa,CAAC,CAAC;SACxD,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAU,EAAE,CAC5D,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAA2B,EAAU,EAAE,CAC1E,gBAAgB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAA6B,EAAU,EAAE;IAC3E,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;QAClC,OAAO,mCAAmC,CAAC;IAC5C,CAAC;IACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,+CAA+C,CAAC;IACxD,CAAC;IACD,MAAM,IAAI,eAAe,CAAC,4BAA4B,EAAE;QACvD,OAAO,EAAE,EAAE,WAAW,EAAE;KACxB,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAChC,WAA6B,EAC7B,MAAe,EACgB,EAAE;IACjC,IAAI,WAAW,KAAK,aAAa,EAAE,CAAC;QACnC,OAAO;YACN;gBACC,OAAO,EAAE,kDAAkD;gBAC3D,GAAG,EAAE,yBAAyB,EAAE;gBAChC,SAAS,EACR,oEAAoE;gBACrE,MAAM,EAAE,CAAC;aACT;SACD,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAoB,MAAM,KAAK,CAC7C,kBAAkB,CAAC,WAAW,CAAC,EAC/B;QACC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,MAAM;KACZ,CACD,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAK5B,OAAO,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC,CAAC"}
1
+ {"version":3,"file":"balancer.js","sourceRoot":"","sources":["../src/balancer.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  const require_developmentProviderUrl = require("./developmentProviderUrl.cjs");
2
+ const require_providerUrlOverride = require("./providerUrlOverride.cjs");
2
3
  let _prosopo_common = require("@prosopo/common");
3
4
  //#region src/balancer.ts
4
5
  /**
@@ -25,12 +26,54 @@ var convertHostedProvider = (provider, ipMode) => {
25
26
  };
26
27
  var stripIpModeLabel = (hostname) => hostname.replace(/^ipv[46]\./, "");
27
28
  var getProviderHostname = (provider) => stripIpModeLabel(new URL(provider.url).hostname);
29
+ var SELF_HOSTED_ADDRESS = "self-hosted";
30
+ var SELF_HOSTED_DATASET_ID = "";
31
+ var stripTrailingSlash = (url) => url.replace(/\/$/, "");
32
+ var providersFromUrlList = (raw) => raw.split(",").map((url) => stripTrailingSlash(url.trim())).filter((url) => url.length > 0).map((url) => ({
33
+ address: SELF_HOSTED_ADDRESS,
34
+ url,
35
+ datasetId: SELF_HOSTED_DATASET_ID,
36
+ weight: 1
37
+ }));
38
+ /**
39
+ * Parses `PROSOPO_PROVIDER_LIST` into providers, or returns empty when unset.
40
+ *
41
+ * Two accepted forms:
42
+ *
43
+ * - The same JSON the hosted provider list serves, so weights and the
44
+ * `ipv4` / `ipv6` sub-lists behave identically. See the README.
45
+ * - One or more bare URLs, comma-separated, for a deployment that has
46
+ * nothing to say about weights or addresses.
47
+ *
48
+ * Trailing slashes are stripped throughout: a token embeds the provider URL
49
+ * it was minted against and `@prosopo/server` finds the issuer by exact
50
+ * string match, so `https://host/` and `https://host` must not disagree.
51
+ *
52
+ * A malformed override returns empty rather than throwing, falling back to
53
+ * normal discovery. Throwing would take every captcha on the page down over
54
+ * what is a deployment-time typo.
55
+ */
56
+ var getProviderListOverride = (raw = require_providerUrlOverride.readProviderListOverride(), ipMode) => {
57
+ const trimmed = raw?.trim();
58
+ if (!trimmed) return [];
59
+ if (!trimmed.startsWith("{")) return providersFromUrlList(trimmed);
60
+ try {
61
+ return convertHostedProvider(JSON.parse(trimmed), ipMode).map((provider) => ({
62
+ ...provider,
63
+ url: stripTrailingSlash(provider.url)
64
+ }));
65
+ } catch {
66
+ return [];
67
+ }
68
+ };
28
69
  var getLoadBalancerUrl = (environment) => {
29
70
  if (environment === "production") return "https://provider-list.prosopo.io/";
30
71
  if (environment === "staging") return "https://provider-list.prosopo.io/staging.json";
31
72
  throw new _prosopo_common.ProsopoEnvError("CONFIG.UNKNOWN_ENVIRONMENT", { context: { environment } });
32
73
  };
33
74
  var loadBalancer = async (environment, ipMode) => {
75
+ const override = getProviderListOverride(void 0, ipMode);
76
+ if (override.length > 0) return override;
34
77
  if (environment === "development") return [{
35
78
  address: "5EjTA28bKSbFPPyMbUjNtArxyqjwq38r1BapVmLZShaqEedV",
36
79
  url: require_developmentProviderUrl.getDevelopmentProviderUrl(),
@@ -46,5 +89,6 @@ var loadBalancer = async (environment, ipMode) => {
46
89
  exports.convertHostedProvider = convertHostedProvider;
47
90
  exports.getLoadBalancerUrl = getLoadBalancerUrl;
48
91
  exports.getProviderHostname = getProviderHostname;
92
+ exports.getProviderListOverride = getProviderListOverride;
49
93
  exports.loadBalancer = loadBalancer;
50
94
  exports.stripIpModeLabel = stripIpModeLabel;
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_developmentProviderUrl = require("./developmentProviderUrl.cjs");
3
+ const require_providerUrlOverride = require("./providerUrlOverride.cjs");
3
4
  const require_balancer = require("./balancer.cjs");
4
5
  const require_providers = require("./providers.cjs");
5
6
  exports.DEFAULT_DEVELOPMENT_PROVIDER_URL = require_developmentProviderUrl.DEFAULT_DEVELOPMENT_PROVIDER_URL;
@@ -11,9 +12,11 @@ exports.convertHostedProvider = require_balancer.convertHostedProvider;
11
12
  exports.getDevelopmentProviderUrl = require_developmentProviderUrl.getDevelopmentProviderUrl;
12
13
  exports.getLoadBalancerUrl = require_balancer.getLoadBalancerUrl;
13
14
  exports.getProviderHostname = require_balancer.getProviderHostname;
15
+ exports.getProviderListOverride = require_balancer.getProviderListOverride;
14
16
  exports.getProviders = require_providers.getProviders;
15
17
  exports.getRandomActiveProvider = require_providers.getRandomActiveProvider;
16
18
  exports.getRandomProviderFromList = require_providers.getRandomProviderFromList;
17
19
  exports.loadBalancer = require_balancer.loadBalancer;
18
20
  exports.readDevelopmentProviderUrlOverride = require_developmentProviderUrl.readDevelopmentProviderUrlOverride;
21
+ exports.readProviderListOverride = require_providerUrlOverride.readProviderListOverride;
19
22
  exports.stripIpModeLabel = require_balancer.stripIpModeLabel;
@@ -0,0 +1,33 @@
1
+ //#region src/providerUrlOverride.ts
2
+ /**
3
+ * Supplies the provider list directly instead of fetching Prosopo's.
4
+ *
5
+ * A self-hosted deployment has its own providers and no hosted list to
6
+ * discover them from. Setting this replaces both halves of discovery — the
7
+ * endpoint the widget calls and the list a verifier matches a token against —
8
+ * with whatever it names. See `getProviderListOverride` in `balancer.ts` for
9
+ * the accepted forms.
10
+ *
11
+ * Distinct from `PROSOPO_PROVIDER_URL_DEVELOPMENT`, which only applies when
12
+ * the environment is `development`. That coupling forced self-hosters to ship
13
+ * a development build of the widget purely to redirect it; this override is
14
+ * environment-independent, so `production` stays correct everywhere.
15
+ *
16
+ * Kept in its own module, holding nothing but the read, so that parsing can
17
+ * live next to `convertHostedProvider` in `balancer.ts` without the two
18
+ * modules importing each other. A cycle here would be bundled into the widget
19
+ * and this package has already lost a release to one.
20
+ *
21
+ * Written as a static `process.env.X` access for the same reason as the
22
+ * development override: frontend bundlers substitute that exact expression
23
+ * for a literal, which a computed lookup would not match.
24
+ */
25
+ var readProviderListOverride = () => {
26
+ try {
27
+ return process.env.PROSOPO_PROVIDER_LIST;
28
+ } catch {
29
+ return;
30
+ }
31
+ };
32
+ //#endregion
33
+ exports.readProviderListOverride = readProviderListOverride;
@@ -47,6 +47,11 @@ var resolveBaseUrl = (env) => {
47
47
  return endpoints[env] ?? endpoints.development;
48
48
  };
49
49
  var resolvePinnedUrl = async (env, ipMode) => {
50
+ const override = require_balancer.getProviderListOverride(void 0, ipMode);
51
+ if (override.length > 0) {
52
+ const chosen = pickWeightedProvider(override, Math.random);
53
+ if (chosen) return chosen.url;
54
+ }
50
55
  const base = applyIpModeToUrl(resolveBaseUrl(env), ipMode);
51
56
  if (env === "development") return base;
52
57
  const key = cacheKey(env, ipMode);
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./providers.js";
2
2
  export * from "./balancer.js";
3
3
  export * from "./developmentProviderUrl.js";
4
+ export * from "./providerUrlOverride.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import "./_virtual/_rolldown/runtime.js";
2
2
  import { DEFAULT_DEVELOPMENT_PROVIDER_URL, getDevelopmentProviderUrl, readDevelopmentProviderUrlOverride } from "./developmentProviderUrl.js";
3
- import { convertHostedProvider, getLoadBalancerUrl, getProviderHostname, loadBalancer, stripIpModeLabel } from "./balancer.js";
3
+ import { readProviderListOverride } from "./providerUrlOverride.js";
4
+ import { convertHostedProvider, getLoadBalancerUrl, getProviderHostname, getProviderListOverride, loadBalancer, stripIpModeLabel } from "./balancer.js";
4
5
  import { _resetHealthzRetryPolicy, _resetPinCache, _resetProviderListCache, _setHealthzRetryPolicy, getProviders, getRandomActiveProvider, getRandomProviderFromList } from "./providers.js";
5
- export { DEFAULT_DEVELOPMENT_PROVIDER_URL, _resetHealthzRetryPolicy, _resetPinCache, _resetProviderListCache, _setHealthzRetryPolicy, convertHostedProvider, getDevelopmentProviderUrl, getLoadBalancerUrl, getProviderHostname, getProviders, getRandomActiveProvider, getRandomProviderFromList, loadBalancer, readDevelopmentProviderUrlOverride, stripIpModeLabel };
6
+ export { DEFAULT_DEVELOPMENT_PROVIDER_URL, _resetHealthzRetryPolicy, _resetPinCache, _resetProviderListCache, _setHealthzRetryPolicy, convertHostedProvider, getDevelopmentProviderUrl, getLoadBalancerUrl, getProviderHostname, getProviderListOverride, getProviders, getRandomActiveProvider, getRandomProviderFromList, loadBalancer, readDevelopmentProviderUrlOverride, readProviderListOverride, stripIpModeLabel };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const readProviderListOverride: () => string | undefined;
2
+ //# sourceMappingURL=providerUrlOverride.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerUrlOverride.d.ts","sourceRoot":"","sources":["../src/providerUrlOverride.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,wBAAwB,QAAO,MAAM,GAAG,SAMpD,CAAC"}
@@ -0,0 +1,33 @@
1
+ //#region src/providerUrlOverride.ts
2
+ /**
3
+ * Supplies the provider list directly instead of fetching Prosopo's.
4
+ *
5
+ * A self-hosted deployment has its own providers and no hosted list to
6
+ * discover them from. Setting this replaces both halves of discovery — the
7
+ * endpoint the widget calls and the list a verifier matches a token against —
8
+ * with whatever it names. See `getProviderListOverride` in `balancer.ts` for
9
+ * the accepted forms.
10
+ *
11
+ * Distinct from `PROSOPO_PROVIDER_URL_DEVELOPMENT`, which only applies when
12
+ * the environment is `development`. That coupling forced self-hosters to ship
13
+ * a development build of the widget purely to redirect it; this override is
14
+ * environment-independent, so `production` stays correct everywhere.
15
+ *
16
+ * Kept in its own module, holding nothing but the read, so that parsing can
17
+ * live next to `convertHostedProvider` in `balancer.ts` without the two
18
+ * modules importing each other. A cycle here would be bundled into the widget
19
+ * and this package has already lost a release to one.
20
+ *
21
+ * Written as a static `process.env.X` access for the same reason as the
22
+ * development override: frontend bundlers substitute that exact expression
23
+ * for a literal, which a computed lookup would not match.
24
+ */
25
+ var readProviderListOverride = () => {
26
+ try {
27
+ return process.env.PROSOPO_PROVIDER_LIST;
28
+ } catch {
29
+ return;
30
+ }
31
+ };
32
+ //#endregion
33
+ export { readProviderListOverride };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerUrlOverride.js","sourceRoot":"","sources":["../src/providerUrlOverride.ts"],"names":[],"mappings":"AAqCA,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAuB,EAAE;IAChE,IAAI,CAAC;QACJ,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,MAAM,EAEX,MAAM,eAAe,CAAC;AA0IvB,eAAO,MAAM,YAAY,QACnB,gBAAgB,KACnB,OAAO,CAAC,iBAAiB,EAAE,CAY7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAC9B,gBAAgB,WACZ,MAAM,KACb,OAAO,CAAC,cAAc,CAMxB,CAAC;AAoCF,eAAO,MAAM,yBAAyB,QAChC,gBAAgB,WACZ,MAAM,eACF,MAAM,WACX,MAAM,MAAM,KAClB,OAAO,CAAC,cAAc,CAyBxB,CAAC;AAIF,eAAO,MAAM,cAAc,YAE1B,CAAC;AAIF,eAAO,MAAM,uBAAuB,YAEnC,CAAC;AAKF,eAAO,MAAM,sBAAsB,SAAU;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,SAKA,CAAC;AAKF,eAAO,MAAM,wBAAwB,YAIpC,CAAC"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,MAAM,EAGX,MAAM,eAAe,CAAC;AAsJvB,eAAO,MAAM,YAAY,QACnB,gBAAgB,KACnB,OAAO,CAAC,iBAAiB,EAAE,CAY7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAC9B,gBAAgB,WACZ,MAAM,KACb,OAAO,CAAC,cAAc,CAMxB,CAAC;AAoCF,eAAO,MAAM,yBAAyB,QAChC,gBAAgB,WACZ,MAAM,eACF,MAAM,WACX,MAAM,MAAM,KAClB,OAAO,CAAC,cAAc,CAyBxB,CAAC;AAIF,eAAO,MAAM,cAAc,YAE1B,CAAC;AAIF,eAAO,MAAM,uBAAuB,YAEnC,CAAC;AAKF,eAAO,MAAM,sBAAsB,SAAU;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,SAKA,CAAC;AAKF,eAAO,MAAM,wBAAwB,YAIpC,CAAC"}
package/dist/providers.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { getDevelopmentProviderUrl } from "./developmentProviderUrl.js";
2
- import { loadBalancer } from "./balancer.js";
2
+ import { getProviderListOverride, loadBalancer } from "./balancer.js";
3
3
  import { retryWithBackoff } from "./retry.js";
4
4
  //#region src/providers.ts
5
5
  var dnsEndpoints = () => ({
@@ -47,6 +47,11 @@ var resolveBaseUrl = (env) => {
47
47
  return endpoints[env] ?? endpoints.development;
48
48
  };
49
49
  var resolvePinnedUrl = async (env, ipMode) => {
50
+ const override = getProviderListOverride(void 0, ipMode);
51
+ if (override.length > 0) {
52
+ const chosen = pickWeightedProvider(override, Math.random);
53
+ if (chosen) return chosen.url;
54
+ }
50
55
  const base = applyIpModeToUrl(resolveBaseUrl(env), ipMode);
51
56
  if (env === "development") return base;
52
57
  const key = cacheKey(env, ipMode);
@@ -1 +1 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=providerUrlOverride.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerUrlOverride.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/providerUrlOverride.unit.test.ts"],"names":[],"mappings":""}