@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.
- package/.turbo/turbo-build$colon$cjs.log +7 -6
- package/.turbo/turbo-build$colon$tsc.log +11 -11
- package/.turbo/turbo-build.log +9 -8
- package/CHANGELOG.md +60 -0
- package/README.md +34 -0
- package/dist/balancer.d.ts +1 -0
- package/dist/balancer.d.ts.map +1 -1
- package/dist/balancer.js +44 -1
- package/dist/balancer.js.map +1 -1
- package/dist/cjs/balancer.cjs +44 -0
- package/dist/cjs/index.cjs +3 -0
- package/dist/cjs/providerUrlOverride.cjs +33 -0
- package/dist/cjs/providers.cjs +5 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/providerUrlOverride.d.ts +2 -0
- package/dist/providerUrlOverride.d.ts.map +1 -0
- package/dist/providerUrlOverride.js +33 -0
- package/dist/providerUrlOverride.js.map +1 -0
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +6 -1
- package/dist/providers.js.map +1 -1
- package/dist/tests/providerUrlOverride.unit.test.d.ts +2 -0
- package/dist/tests/providerUrlOverride.unit.test.d.ts.map +1 -0
- package/dist/tests/providerUrlOverride.unit.test.js +144 -0
- package/dist/tests/providerUrlOverride.unit.test.js.map +1 -0
- package/dist/tests/providers.unit.test.js +2 -0
- package/dist/tests/providers.unit.test.js.map +1 -1
- package/package.json +3 -3
- package/src/balancer.ts +73 -0
- package/src/index.ts +1 -0
- package/src/providerUrlOverride.ts +44 -0
- package/src/providers.ts +13 -0
- package/src/tests/providerUrlOverride.unit.test.ts +182 -0
- package/src/tests/providers.unit.test.ts +6 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/load-balancer@2.
|
|
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
|
[36mvite v8.1.5 [32mbuilding ssr environment for production...[36m[39m
|
|
28
28
|
Bundle build started
|
|
29
29
|
[2K
|
|
30
|
-
✓
|
|
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/
|
|
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
|
|
37
|
-
dist/cjs/providers.cjs
|
|
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
|
-
[32m✓ built in
|
|
40
|
+
[32m✓ built in 78ms[39m
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/load-balancer@2.
|
|
2
|
+
> @prosopo/load-balancer@2.11.1 build:tsc
|
|
3
3
|
> tsc --build --verbose
|
|
4
4
|
|
|
5
|
-
3:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
29
|
+
3:36:59 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
|
|
30
30
|
|
|
31
|
-
3:
|
|
31
|
+
3:36:59 PM - Building project '/home/runner/work/captcha/captcha/packages/load-balancer/tsconfig.json'...
|
|
32
32
|
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/load-balancer@2.
|
|
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.
|
|
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
|
-
[33mThe plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the [1mresolve.tsconfigPaths[22m option. You can remove the plugin and set [1mresolve.tsconfigPaths: true[22m in your Vite config instead.[39m
|
|
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
|
+
[33mThe plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the [1mresolve.tsconfigPaths[22m option. You can remove the plugin and set [1mresolve.tsconfigPaths: true[22m in your Vite config instead.[39m
|
|
31
31
|
[36mvite v8.1.5 [32mbuilding ssr environment for production...[36m[39m
|
|
32
32
|
Bundle build started
|
|
33
33
|
[2K
|
|
34
|
-
✓
|
|
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
|
|
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
|
|
42
|
-
dist/providers.js 5.
|
|
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
|
-
[32m✓ built in
|
|
45
|
+
[32m✓ built in 70ms[39m
|
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.
|
package/dist/balancer.d.ts
CHANGED
|
@@ -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 {};
|
package/dist/balancer.d.ts.map
CHANGED
|
@@ -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;
|
|
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 };
|
package/dist/balancer.js.map
CHANGED
|
@@ -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;
|
|
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;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAepE,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;AAOlD,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAC1C,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAE3E,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAAuB,EAAE,CACjE,GAAG;KACD,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;KAC5C,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;KAC/B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACd,OAAO,EAAE,mBAAmB;IAC5B,GAAG;IACH,SAAS,EAAE,sBAAsB;IACjC,MAAM,EAAE,CAAC;CACT,CAAC,CAAC,CAAC;AAoBN,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACtC,MAA0B,wBAAwB,EAAE,EACpD,MAAe,EACO,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAGxB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAEnE,IAAI,CAAC;QACJ,OAAO,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAC5D,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACd,GAAG,QAAQ;YACX,GAAG,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC;SACrC,CAAC,CACF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC,CAAC;AAEF,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;IAQjC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEzC,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"}
|
package/dist/cjs/balancer.cjs
CHANGED
|
@@ -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;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -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;
|
package/dist/cjs/providers.cjs
CHANGED
|
@@ -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
package/dist/index.d.ts.map
CHANGED
|
@@ -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 {
|
|
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 @@
|
|
|
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"}
|
package/dist/providers.d.ts.map
CHANGED
|
@@ -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,
|
|
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);
|
package/dist/providers.js.map
CHANGED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"providerUrlOverride.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/providerUrlOverride.unit.test.ts"],"names":[],"mappings":""}
|