@prosopo/procaptcha-common 2.10.28 → 2.11.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.
- package/.turbo/turbo-build$colon$cjs.log +3 -3
- package/.turbo/turbo-build$colon$tsc.log +18 -18
- package/.turbo/turbo-build.log +5 -5
- package/CHANGELOG.md +73 -0
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/providers.cjs +8 -4
- package/dist/index.js +2 -1
- package/dist/providers.d.ts +7 -2
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +8 -4
- package/dist/providers.js.map +1 -1
- package/dist/tests/providers.test.js +29 -35
- package/dist/tests/providers.test.js.map +1 -1
- package/package.json +5 -5
- package/src/providers.ts +19 -6
- package/src/tests/providers.test.ts +38 -48
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-common@2.
|
|
2
|
+
> @prosopo/procaptcha-common@2.11.0 build:cjs
|
|
3
3
|
> NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
|
|
4
4
|
|
|
5
5
|
ViteCommonJSConfig: .
|
|
@@ -47,12 +47,12 @@ rendering chunks...
|
|
|
47
47
|
[2mdist/cjs/[22m[36melements/window.cjs [39m[1m[2m0.59 kB[22m[1m[22m
|
|
48
48
|
[2mdist/cjs/[22m[36melements/form.cjs [39m[1m[2m0.72 kB[22m[1m[22m
|
|
49
49
|
[2mdist/cjs/[22m[36mproviders.cjs [39m[1m[2m0.98 kB[22m[1m[22m
|
|
50
|
-
[2mdist/cjs/[22m[36mindex.cjs [39m[1m[2m1.45 kB[22m[1m[22m
|
|
51
50
|
[2mdist/cjs/[22m[36mextensionLoader.cjs [39m[1m[2m1.48 kB[22m[1m[22m
|
|
51
|
+
[2mdist/cjs/[22m[36mindex.cjs [39m[1m[2m1.49 kB[22m[1m[22m
|
|
52
52
|
[2mdist/cjs/[22m[36mreactComponents/TestModeBanner.cjs [39m[1m[2m1.61 kB[22m[1m[22m
|
|
53
53
|
[2mdist/cjs/[22m[36mreactComponents/Honeypot.cjs [39m[1m[2m2.19 kB[22m[1m[22m
|
|
54
54
|
[2mdist/cjs/[22m[36mreactComponents/Reload.cjs [39m[1m[2m3.19 kB[22m[1m[22m
|
|
55
55
|
[2mdist/cjs/[22m[36mstate/builder.cjs [39m[1m[2m3.26 kB[22m[1m[22m
|
|
56
56
|
[2mdist/cjs/[22m[36mcallbacks/defaultCallbacks.cjs [39m[1m[2m4.07 kB[22m[1m[22m
|
|
57
57
|
[2mdist/cjs/[22m[36mreactComponents/Checkbox.cjs [39m[1m[2m4.45 kB[22m[1m[22m
|
|
58
|
-
[32m✓ built in
|
|
58
|
+
[32m✓ built in 156ms[39m
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-common@2.
|
|
2
|
+
> @prosopo/procaptcha-common@2.11.0 build:tsc
|
|
3
3
|
> tsc --build --verbose
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
7:02:31 PM - Projects in this build:
|
|
6
6
|
* ../../dev/config/tsconfig.json
|
|
7
7
|
* ../locale/tsconfig.json
|
|
8
8
|
* ../util/tsconfig.json
|
|
@@ -18,35 +18,35 @@
|
|
|
18
18
|
* ../account/tsconfig.json
|
|
19
19
|
* tsconfig.json
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
7:02:31 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'
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
7:02:31 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
7:02:31 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/version.ts' is older than output '../util/tsconfig.tsbuildinfo'
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
7:02:31 PM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/index.ts' is older than output '../logger/tsconfig.tsbuildinfo'
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
7:02:31 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'
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
7:02:31 PM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/procaptcha/api.ts' is older than output '../types/tsconfig.tsbuildinfo'
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
7:02:31 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/index.ts' is older than output '../common/tsconfig.tsbuildinfo'
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
7:02:31 PM - Project '../load-balancer/tsconfig.json' is up to date because newest input '../load-balancer/src/balancer.ts' is older than output '../load-balancer/tsconfig.tsbuildinfo'
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
7:02:31 PM - Project '../widget-skeleton/tsconfig.json' is up to date because newest input '../widget-skeleton/src/constants.ts' is older than output '../widget-skeleton/tsconfig.tsbuildinfo'
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
7:02:31 PM - Project '../fingerprintjs/tsconfig.json' is up to date because newest input '../fingerprintjs/src/utils/browser.ts' is older than output '../fingerprintjs/tsconfig.tsbuildinfo'
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
7:02:32 PM - Project '../fingerprint/tsconfig.json' is up to date because newest input '../fingerprint/src/index.ts' is older than output '../fingerprint/tsconfig.tsbuildinfo'
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
7:02:32 PM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/pair/decode.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
7:02:32 PM - Project '../account/tsconfig.json' is out of date because output file '../account/tsconfig.tsbuildinfo' does not exist
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
7:02:32 PM - Building project '/home/runner/work/captcha/captcha/packages/account/tsconfig.json'...
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
7:02:36 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
7:02:36 PM - Building project '/home/runner/work/captcha/captcha/packages/procaptcha-common/tsconfig.json'...
|
|
52
52
|
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/procaptcha-common@2.
|
|
2
|
+
> @prosopo/procaptcha-common@2.11.0 build
|
|
3
3
|
> npm run build:cross-env -- --mode ${NODE_ENV:-development}
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @prosopo/procaptcha-common@2.
|
|
6
|
+
> @prosopo/procaptcha-common@2.11.0 build:cross-env
|
|
7
7
|
> vite build --config vite.esm.config.ts --mode production
|
|
8
8
|
|
|
9
9
|
ViteEsmConfig: .
|
|
@@ -49,12 +49,12 @@ rendering chunks...
|
|
|
49
49
|
[2mdist/[22m[36mextensionLoader.js [39m[1m[2m0.21 kB[22m[1m[22m
|
|
50
50
|
[2mdist/[22m[36melements/window.js [39m[1m[2m0.46 kB[22m[1m[22m
|
|
51
51
|
[2mdist/[22m[36melements/form.js [39m[1m[2m0.58 kB[22m[1m[22m
|
|
52
|
-
[2mdist/[22m[36mproviders.js [39m[1m[2m0.
|
|
53
|
-
[2mdist/[22m[36mindex.js [39m[1m[
|
|
52
|
+
[2mdist/[22m[36mproviders.js [39m[1m[2m0.82 kB[22m[1m[22m
|
|
53
|
+
[2mdist/[22m[36mindex.js [39m[1m[2m1.01 kB[22m[1m[22m
|
|
54
54
|
[2mdist/[22m[36mreactComponents/TestModeBanner.js [39m[1m[2m1.46 kB[22m[1m[22m
|
|
55
55
|
[2mdist/[22m[36mreactComponents/Honeypot.js [39m[1m[2m2.06 kB[22m[1m[22m
|
|
56
56
|
[2mdist/[22m[36mreactComponents/Reload.js [39m[1m[2m3.01 kB[22m[1m[22m
|
|
57
57
|
[2mdist/[22m[36mstate/builder.js [39m[1m[2m3.14 kB[22m[1m[22m
|
|
58
58
|
[2mdist/[22m[36mcallbacks/defaultCallbacks.js [39m[1m[2m3.91 kB[22m[1m[22m
|
|
59
59
|
[2mdist/[22m[36mreactComponents/Checkbox.js [39m[1m[2m4.23 kB[22m[1m[22m
|
|
60
|
-
[32m✓ built in
|
|
60
|
+
[32m✓ built in 257ms[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,78 @@
|
|
|
1
1
|
# @prosopo/procaptcha-common
|
|
2
2
|
|
|
3
|
+
## 2.11.0
|
|
4
|
+
### Minor Changes
|
|
5
|
+
|
|
6
|
+
- 12cd0a6: Replace client-side weighted-random provider selection with static DNS endpoints.
|
|
7
|
+
|
|
8
|
+
- Removed the `providerSelectEntropy` field from `DetectorResult`, `Session`, the
|
|
9
|
+
Mongoose `SessionRecordSchema` (including its standalone index), and every
|
|
10
|
+
call-site that threaded it through frictionless / image / pow / puzzle flows.
|
|
11
|
+
- Removed `FrictionlessManager.hostVerified` and its decision-machine call site
|
|
12
|
+
— there's nothing to verify when the DNS layer picks the host.
|
|
13
|
+
- `getRandomActiveProvider(env)` now returns the per-environment static DNS
|
|
14
|
+
endpoint (`pronode.prosopo.io` family) instead of fetching the provider list
|
|
15
|
+
and weighted-selecting. The entropy parameter is gone.
|
|
16
|
+
- `getProcaptchaRandomActiveProvider` is now a thin re-export so widget packages
|
|
17
|
+
keep importing from `procaptcha-common`.
|
|
18
|
+
- `FrontendProvider.datasetId` is dropped; `CaptchaRequestBody.datasetId` is
|
|
19
|
+
optional. The server falls back to its own most-recently-uploaded dataset
|
|
20
|
+
(`env.datasetId`, populated from `db.getMostRecentDatasetId()` at startup) —
|
|
21
|
+
clients can't pin a dataset under DNS routing because they don't know which
|
|
22
|
+
pronode they'll hit.
|
|
23
|
+
- Removed dead `setProviderLoader` / `prefetchProviders` / `selectWeightedProvider`
|
|
24
|
+
plumbing from `@prosopo/load-balancer`. The server's cacheFile-based loader
|
|
25
|
+
setup in `startProviderApi` goes with them.
|
|
26
|
+
- `getRandomActiveProvider` now hits `/healthz` on the global hostname once per
|
|
27
|
+
page load, reads the responding pronode's identity from the JSON body, and
|
|
28
|
+
pins subsequent captcha calls to that pronode (`https://pronodeN.prosopo.io`)
|
|
29
|
+
so session creation and submission land on the same backend. Falls back to
|
|
30
|
+
the dual-stack global hostname when `/healthz` is unreachable.
|
|
31
|
+
- `/healthz` now returns `{ ok: true, host: <pronode-identity> }` instead of
|
|
32
|
+
`"OK"` to support the above pinning.
|
|
33
|
+
- CORS preflight is now cached for 24h (`maxAge: 86400`) — previously the
|
|
34
|
+
browser refired an OPTIONS preflight before every captcha call because
|
|
35
|
+
the custom `Prosopo-Site-Key` / `Prosopo-User` headers make the request
|
|
36
|
+
non-simple and the default `maxAge` is 5s.
|
|
37
|
+
- 12cd0a6: Add ipv4-only / ipv6-only provider DNS routing via `data-ipv4` / `data-ipv6`.
|
|
38
|
+
|
|
39
|
+
Dapps that need to pin captcha traffic to a single IP stack can now do so:
|
|
40
|
+
|
|
41
|
+
```html
|
|
42
|
+
<div class="procaptcha" data-sitekey="..." data-ipv4="true"></div>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
What happens under the hood:
|
|
46
|
+
|
|
47
|
+
- The widget reads `data-ipv4` / `data-ipv6` (or the matching `ipv4` / `ipv6`
|
|
48
|
+
booleans on `ProcaptchaRenderOptions` / explicit `render(...)`) and threads
|
|
49
|
+
them through `ProcaptchaConfigSchema`.
|
|
50
|
+
- `pickIpMode(config)` resolves them into an `IpMode` (`"ipv4"` / `"ipv6"` /
|
|
51
|
+
`undefined`); `ipv4` wins if both are set.
|
|
52
|
+
- The frictionless / image / pow / puzzle managers pass the `IpMode` into
|
|
53
|
+
`getProcaptchaRandomActiveProvider`, which calls `/healthz` on the matching
|
|
54
|
+
single-stack global hostname (`ipv4.pronode.prosopo.io` or
|
|
55
|
+
`ipv6.pronode.prosopo.io`) and pins subsequent captcha calls to
|
|
56
|
+
`ipv4.pronodeN.prosopo.io` / `ipv6.pronodeN.prosopo.io`. The dual-stack
|
|
57
|
+
cache and the single-stack caches are kept separate.
|
|
58
|
+
- `convertHostedProvider` now accepts an optional `IpMode` and, when set,
|
|
59
|
+
selects the matching `ipv4` / `ipv6` sub-object from the provider-list JSON.
|
|
60
|
+
Top-level `ipv4` / `ipv6` keys are skipped by default so existing dual-stack
|
|
61
|
+
callers keep working.
|
|
62
|
+
- New helpers in `@prosopo/load-balancer`: `IpMode`, `stripIpModeLabel`,
|
|
63
|
+
`getProviderHostname`.
|
|
64
|
+
|
|
65
|
+
Coordinated with the matching `captcha-private` change that publishes the
|
|
66
|
+
`ipv4` / `ipv6` sub-objects to S3.
|
|
67
|
+
|
|
68
|
+
### Patch Changes
|
|
69
|
+
|
|
70
|
+
- Updated dependencies [12cd0a6]
|
|
71
|
+
- Updated dependencies [12cd0a6]
|
|
72
|
+
- @prosopo/load-balancer@2.10.0
|
|
73
|
+
- @prosopo/types@4.8.0
|
|
74
|
+
- @prosopo/account@2.8.47
|
|
75
|
+
|
|
3
76
|
## 2.10.28
|
|
4
77
|
### Patch Changes
|
|
5
78
|
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -11,6 +11,7 @@ const Checkbox = require("./reactComponents/Checkbox.cjs");
|
|
|
11
11
|
const Honeypot = require("./reactComponents/Honeypot.cjs");
|
|
12
12
|
const TestModeBanner = require("./reactComponents/TestModeBanner.cjs");
|
|
13
13
|
exports.getProcaptchaRandomActiveProvider = providers.getProcaptchaRandomActiveProvider;
|
|
14
|
+
exports.pickIpMode = providers.pickIpMode;
|
|
14
15
|
exports.providerRetry = providers.providerRetry;
|
|
15
16
|
exports.buildUpdateState = builder.buildUpdateState;
|
|
16
17
|
exports.useProcaptcha = builder.useProcaptcha;
|
package/dist/cjs/providers.cjs
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const loadBalancer = require("@prosopo/load-balancer");
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
return
|
|
4
|
+
const pickIpMode = (flags) => {
|
|
5
|
+
if (flags?.ipv4) return "ipv4";
|
|
6
|
+
if (flags?.ipv6) return "ipv6";
|
|
7
|
+
return void 0;
|
|
8
|
+
};
|
|
9
|
+
const getProcaptchaRandomActiveProvider = async (defaultEnvironment, ipMode) => {
|
|
10
|
+
return loadBalancer.getRandomActiveProvider(defaultEnvironment, ipMode);
|
|
8
11
|
};
|
|
9
12
|
const providerRetry = async (currentFn, retryFn, stateReset, attemptCount, retryMax) => {
|
|
10
13
|
try {
|
|
@@ -23,4 +26,5 @@ const providerRetry = async (currentFn, retryFn, stateReset, attemptCount, retry
|
|
|
23
26
|
}
|
|
24
27
|
};
|
|
25
28
|
exports.getProcaptchaRandomActiveProvider = getProcaptchaRandomActiveProvider;
|
|
29
|
+
exports.pickIpMode = pickIpMode;
|
|
26
30
|
exports.providerRetry = providerRetry;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getProcaptchaRandomActiveProvider, providerRetry } from "./providers.js";
|
|
1
|
+
import { getProcaptchaRandomActiveProvider, pickIpMode, providerRetry } from "./providers.js";
|
|
2
2
|
import { buildUpdateState, useProcaptcha } from "./state/builder.js";
|
|
3
3
|
import { getDefaultCallbacks, setUserCallbacks } from "./callbacks/defaultCallbacks.js";
|
|
4
4
|
import { getDefaultEvents } from "./callbacks/defaultEvents.js";
|
|
@@ -20,6 +20,7 @@ export {
|
|
|
20
20
|
getProcaptchaRandomActiveProvider,
|
|
21
21
|
getWindowCallback,
|
|
22
22
|
isSecureBrowserContext,
|
|
23
|
+
pickIpMode,
|
|
23
24
|
providerRetry,
|
|
24
25
|
setUserCallbacks,
|
|
25
26
|
useProcaptcha
|
package/dist/providers.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
1
|
+
import { type IpMode } from "@prosopo/load-balancer";
|
|
2
|
+
import type { EnvironmentTypes, RandomProvider } from "@prosopo/types";
|
|
3
|
+
export declare const pickIpMode: (flags: {
|
|
4
|
+
ipv4?: boolean;
|
|
5
|
+
ipv6?: boolean;
|
|
6
|
+
} | undefined) => IpMode | undefined;
|
|
7
|
+
export declare const getProcaptchaRandomActiveProvider: (defaultEnvironment: EnvironmentTypes, ipMode?: IpMode) => Promise<RandomProvider>;
|
|
3
8
|
export declare const providerRetry: (currentFn: () => Promise<void>, retryFn: () => Promise<void>, stateReset: () => void, attemptCount: number, retryMax: number) => Promise<void>;
|
|
4
9
|
//# sourceMappingURL=providers.d.ts.map
|
package/dist/providers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,MAAM,EAA2B,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKvE,eAAO,MAAM,UAAU,UACf;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,KACnD,MAAM,GAAG,SAIX,CAAC;AAKF,eAAO,MAAM,iCAAiC,uBACzB,gBAAgB,WAC3B,MAAM,KACb,OAAO,CAAC,cAAc,CAExB,CAAC;AAEF,eAAO,MAAM,aAAa,cACd,MAAM,OAAO,CAAC,IAAI,CAAC,WACrB,MAAM,OAAO,CAAC,IAAI,CAAC,cAChB,MAAM,IAAI,gBACR,MAAM,YACV,MAAM,kBAkBhB,CAAC"}
|
package/dist/providers.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { getRandomActiveProvider } from "@prosopo/load-balancer";
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
return
|
|
2
|
+
const pickIpMode = (flags) => {
|
|
3
|
+
if (flags?.ipv4) return "ipv4";
|
|
4
|
+
if (flags?.ipv6) return "ipv6";
|
|
5
|
+
return void 0;
|
|
6
|
+
};
|
|
7
|
+
const getProcaptchaRandomActiveProvider = async (defaultEnvironment, ipMode) => {
|
|
8
|
+
return getRandomActiveProvider(defaultEnvironment, ipMode);
|
|
6
9
|
};
|
|
7
10
|
const providerRetry = async (currentFn, retryFn, stateReset, attemptCount, retryMax) => {
|
|
8
11
|
try {
|
|
@@ -22,5 +25,6 @@ const providerRetry = async (currentFn, retryFn, stateReset, attemptCount, retry
|
|
|
22
25
|
};
|
|
23
26
|
export {
|
|
24
27
|
getProcaptchaRandomActiveProvider,
|
|
28
|
+
pickIpMode,
|
|
25
29
|
providerRetry
|
|
26
30
|
};
|
package/dist/providers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAcA,OAAO,
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAcA,OAAO,EAAe,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAM9E,MAAM,CAAC,MAAM,UAAU,GAAG,CACzB,KAAqD,EAChC,EAAE;IACvB,IAAI,KAAK,EAAE,IAAI;QAAE,OAAO,MAAM,CAAC;IAC/B,IAAI,KAAK,EAAE,IAAI;QAAE,OAAO,MAAM,CAAC;IAC/B,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,iCAAiC,GAAG,KAAK,EACrD,kBAAoC,EACpC,MAAe,EACW,EAAE;IAC5B,OAAO,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EACjC,SAA8B,EAC9B,OAA4B,EAC5B,UAAsB,EACtB,YAAoB,EACpB,QAAgB,EACf,EAAE;IACH,IAAI,CAAC;QACJ,MAAM,SAAS,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,CAAC,KAAK,CACZ,gBAAgB,YAAY,OAAO,QAAQ,qBAAqB,CAChE,CAAC;YACF,OAAO,UAAU,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEnB,UAAU,EAAE,CAAC;QAEb,MAAM,OAAO,EAAE,CAAC;IACjB,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -1,45 +1,39 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getProcaptchaRandomActiveProvider, providerRetry, } from "../providers.js";
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { getProcaptchaRandomActiveProvider, pickIpMode, providerRetry, } from "../providers.js";
|
|
3
3
|
vi.mock("@prosopo/load-balancer", () => ({
|
|
4
|
-
getRandomActiveProvider: vi.fn()
|
|
4
|
+
getRandomActiveProvider: vi.fn(async (env) => ({
|
|
5
|
+
providerAccount: "dns-routed",
|
|
6
|
+
provider: {
|
|
7
|
+
url: env === "production"
|
|
8
|
+
? "https://pronode.prosopo.io"
|
|
9
|
+
: "http://localhost:9229",
|
|
10
|
+
},
|
|
11
|
+
})),
|
|
5
12
|
}));
|
|
6
13
|
describe("providers", () => {
|
|
7
14
|
describe("getProcaptchaRandomActiveProvider", () => {
|
|
8
|
-
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
originalGetRandomValues = global.window.crypto.getRandomValues.bind(global.window.crypto);
|
|
11
|
-
});
|
|
12
|
-
afterEach(() => {
|
|
13
|
-
global.window.crypto.getRandomValues = originalGetRandomValues;
|
|
14
|
-
});
|
|
15
|
-
it("should generate random values and call getRandomActiveProvider", async () => {
|
|
16
|
-
const mockRandomValues = new Uint8Array([
|
|
17
|
-
10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
|
|
18
|
-
]);
|
|
19
|
-
const mockGetRandomValues = vi.fn(() => mockRandomValues);
|
|
20
|
-
global.window.crypto.getRandomValues = mockGetRandomValues;
|
|
15
|
+
it("delegates to the load-balancer static-DNS resolver", async () => {
|
|
21
16
|
const { getRandomActiveProvider } = await import("@prosopo/load-balancer");
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const result = await getProcaptchaRandomActiveProvider("development");
|
|
26
|
-
expect(mockGetRandomValues).toHaveBeenCalledWith(expect.any(Uint8Array));
|
|
27
|
-
expect(getRandomActiveProvider).toHaveBeenCalledWith("development", 550);
|
|
28
|
-
expect(result).toEqual({ providerUrl: "https://test-provider.com" });
|
|
17
|
+
const result = await getProcaptchaRandomActiveProvider("production");
|
|
18
|
+
expect(getRandomActiveProvider).toHaveBeenCalledWith("production", undefined);
|
|
19
|
+
expect(result.provider.url).toBe("https://pronode.prosopo.io");
|
|
29
20
|
});
|
|
30
|
-
it("
|
|
31
|
-
let callCount = 0;
|
|
32
|
-
const mockGetRandomValues = vi.fn((arr) => {
|
|
33
|
-
callCount++;
|
|
34
|
-
arr.fill(callCount);
|
|
35
|
-
return arr;
|
|
36
|
-
});
|
|
37
|
-
global.window.crypto.getRandomValues = mockGetRandomValues;
|
|
21
|
+
it("forwards the ipMode parameter to the load-balancer resolver", async () => {
|
|
38
22
|
const { getRandomActiveProvider } = await import("@prosopo/load-balancer");
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
23
|
+
await getProcaptchaRandomActiveProvider("production", "ipv4");
|
|
24
|
+
expect(getRandomActiveProvider).toHaveBeenCalledWith("production", "ipv4");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("pickIpMode", () => {
|
|
28
|
+
it("picks ipv4 when both flags are set", () => {
|
|
29
|
+
expect(pickIpMode({ ipv4: true, ipv6: true })).toBe("ipv4");
|
|
30
|
+
});
|
|
31
|
+
it("returns undefined when neither flag is set", () => {
|
|
32
|
+
expect(pickIpMode({})).toBeUndefined();
|
|
33
|
+
expect(pickIpMode(undefined)).toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
it("returns ipv6 when only ipv6 is set", () => {
|
|
36
|
+
expect(pickIpMode({ ipv6: true })).toBe("ipv6");
|
|
43
37
|
});
|
|
44
38
|
});
|
|
45
39
|
describe("providerRetry", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.test.js","sourceRoot":"","sources":["../../src/tests/providers.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"providers.test.js","sourceRoot":"","sources":["../../src/tests/providers.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EACN,iCAAiC,EACjC,UAAU,EACV,aAAa,GACb,MAAM,iBAAiB,CAAC;AAEzB,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,uBAAuB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC;QACtD,eAAe,EAAE,YAAY;QAC7B,QAAQ,EAAE;YACT,GAAG,EACF,GAAG,KAAK,YAAY;gBACnB,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,uBAAuB;SAC3B;KACD,CAAC,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IAC1B,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAC/C,wBAAwB,CACxB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,iCAAiC,CAAC,YAAY,CAAC,CAAC;YAErE,MAAM,CAAC,uBAAuB,CAAC,CAAC,oBAAoB,CACnD,YAAY,EACZ,SAAS,CACT,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAC/C,wBAAwB,CACxB,CAAC;YAEF,MAAM,iCAAiC,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAE9D,MAAM,CAAC,uBAAuB,CAAC,CAAC,oBAAoB,CACnD,YAAY,EACZ,MAAM,CACN,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACrD,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAE3B,MAAM,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE1D,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACvC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAE3B,MAAM,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE1D,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,eAAe,GAAG,EAAE;iBACxB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;iBACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAE/B,MAAM,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE1D,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACvC,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC3C,wCAAwC,CACxC,CAAC;YAEF,eAAe,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,eAAe,GAAG,EAAE;iBACxB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;iBACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAE/B,MAAM,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE1D,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAEvC,eAAe,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YACrE,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,eAAe,GAAG,EAAE;iBACxB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;iBACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAE/B,MAAM,MAAM,CACX,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CACnD,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAElC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAEzC,eAAe,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/procaptcha-common",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.11.0",
|
|
4
4
|
"author": "PROSOPO LIMITED <info@prosopo.io>",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -34,15 +34,15 @@
|
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@emotion/react": "11.11.1",
|
|
36
36
|
"@emotion/styled": "11.11.0",
|
|
37
|
-
"@prosopo/account": "2.8.
|
|
38
|
-
"@prosopo/load-balancer": "2.
|
|
39
|
-
"@prosopo/types": "4.
|
|
37
|
+
"@prosopo/account": "2.8.47",
|
|
38
|
+
"@prosopo/load-balancer": "2.10.0",
|
|
39
|
+
"@prosopo/types": "4.8.0",
|
|
40
40
|
"@prosopo/widget-skeleton": "2.8.3",
|
|
41
41
|
"react": "18.3.1",
|
|
42
42
|
"react-dom": "18.3.1"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@prosopo/config": "3.3.
|
|
45
|
+
"@prosopo/config": "3.3.3",
|
|
46
46
|
"@types/jsdom": "21.1.7",
|
|
47
47
|
"@types/node": "22.10.2",
|
|
48
48
|
"@types/react": "18.3.1",
|
package/src/providers.ts
CHANGED
|
@@ -12,15 +12,28 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
-
import { getRandomActiveProvider } from "@prosopo/load-balancer";
|
|
16
|
-
import type { EnvironmentTypes } from "@prosopo/types";
|
|
15
|
+
import { type IpMode, getRandomActiveProvider } from "@prosopo/load-balancer";
|
|
16
|
+
import type { EnvironmentTypes, RandomProvider } from "@prosopo/types";
|
|
17
17
|
|
|
18
|
+
// Translate the user-facing ipv4/ipv6 booleans (set via ProcaptchaRenderOptions
|
|
19
|
+
// or data-ipv4/data-ipv6) into the load-balancer's IpMode selector. ipv4 wins
|
|
20
|
+
// if both are set; neither set leaves DNS in dual-stack mode (undefined).
|
|
21
|
+
export const pickIpMode = (
|
|
22
|
+
flags: { ipv4?: boolean; ipv6?: boolean } | undefined,
|
|
23
|
+
): IpMode | undefined => {
|
|
24
|
+
if (flags?.ipv4) return "ipv4";
|
|
25
|
+
if (flags?.ipv6) return "ipv6";
|
|
26
|
+
return undefined;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// Thin wrapper over the load-balancer's static-DNS endpoint resolver. Kept as
|
|
30
|
+
// a separate export so widget packages (procaptcha, procaptcha-pow, …) import
|
|
31
|
+
// from procaptcha-common rather than reaching into load-balancer directly.
|
|
18
32
|
export const getProcaptchaRandomActiveProvider = async (
|
|
19
33
|
defaultEnvironment: EnvironmentTypes,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return await getRandomActiveProvider(defaultEnvironment, randomNumber);
|
|
34
|
+
ipMode?: IpMode,
|
|
35
|
+
): Promise<RandomProvider> => {
|
|
36
|
+
return getRandomActiveProvider(defaultEnvironment, ipMode);
|
|
24
37
|
};
|
|
25
38
|
|
|
26
39
|
export const providerRetry = async (
|
|
@@ -12,77 +12,67 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import { describe, expect, it, vi } from "vitest";
|
|
16
16
|
import {
|
|
17
17
|
getProcaptchaRandomActiveProvider,
|
|
18
|
+
pickIpMode,
|
|
18
19
|
providerRetry,
|
|
19
20
|
} from "../providers.js";
|
|
20
21
|
|
|
21
|
-
// Mock the load-balancer module
|
|
22
22
|
vi.mock("@prosopo/load-balancer", () => ({
|
|
23
|
-
getRandomActiveProvider: vi.fn()
|
|
23
|
+
getRandomActiveProvider: vi.fn(async (env: string) => ({
|
|
24
|
+
providerAccount: "dns-routed",
|
|
25
|
+
provider: {
|
|
26
|
+
url:
|
|
27
|
+
env === "production"
|
|
28
|
+
? "https://pronode.prosopo.io"
|
|
29
|
+
: "http://localhost:9229",
|
|
30
|
+
},
|
|
31
|
+
})),
|
|
24
32
|
}));
|
|
25
33
|
|
|
26
34
|
describe("providers", () => {
|
|
27
35
|
describe("getProcaptchaRandomActiveProvider", () => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
beforeEach(() => {
|
|
32
|
-
originalGetRandomValues = global.window.crypto.getRandomValues.bind(
|
|
33
|
-
global.window.crypto,
|
|
36
|
+
it("delegates to the load-balancer static-DNS resolver", async () => {
|
|
37
|
+
const { getRandomActiveProvider } = await import(
|
|
38
|
+
"@prosopo/load-balancer"
|
|
34
39
|
);
|
|
35
|
-
});
|
|
36
40
|
|
|
37
|
-
|
|
38
|
-
global.window.crypto.getRandomValues = originalGetRandomValues;
|
|
39
|
-
});
|
|
41
|
+
const result = await getProcaptchaRandomActiveProvider("production");
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
// biome-ignore lint/suspicious/noExplicitAny: Mock crypto API
|
|
48
|
-
global.window.crypto.getRandomValues = mockGetRandomValues as any;
|
|
43
|
+
expect(getRandomActiveProvider).toHaveBeenCalledWith(
|
|
44
|
+
"production",
|
|
45
|
+
undefined,
|
|
46
|
+
);
|
|
47
|
+
expect(result.provider.url).toBe("https://pronode.prosopo.io");
|
|
48
|
+
});
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
it("forwards the ipMode parameter to the load-balancer resolver", async () => {
|
|
51
51
|
const { getRandomActiveProvider } = await import(
|
|
52
52
|
"@prosopo/load-balancer"
|
|
53
53
|
);
|
|
54
|
-
vi.mocked(getRandomActiveProvider).mockResolvedValue({
|
|
55
|
-
providerUrl: "https://test-provider.com",
|
|
56
|
-
// biome-ignore lint/suspicious/noExplicitAny: Mock return type
|
|
57
|
-
} as any);
|
|
58
54
|
|
|
59
|
-
|
|
55
|
+
await getProcaptchaRandomActiveProvider("production", "ipv4");
|
|
60
56
|
|
|
61
|
-
expect(
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
expect(getRandomActiveProvider).toHaveBeenCalledWith(
|
|
58
|
+
"production",
|
|
59
|
+
"ipv4",
|
|
60
|
+
);
|
|
64
61
|
});
|
|
62
|
+
});
|
|
65
63
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
arr.fill(callCount);
|
|
71
|
-
return arr;
|
|
72
|
-
});
|
|
73
|
-
// biome-ignore lint/suspicious/noExplicitAny: Mock crypto API
|
|
74
|
-
global.window.crypto.getRandomValues = mockGetRandomValues as any;
|
|
75
|
-
|
|
76
|
-
const { getRandomActiveProvider } = await import(
|
|
77
|
-
"@prosopo/load-balancer"
|
|
78
|
-
);
|
|
79
|
-
// biome-ignore lint/suspicious/noExplicitAny: Mock return type
|
|
80
|
-
vi.mocked(getRandomActiveProvider).mockResolvedValue({} as any);
|
|
64
|
+
describe("pickIpMode", () => {
|
|
65
|
+
it("picks ipv4 when both flags are set", () => {
|
|
66
|
+
expect(pickIpMode({ ipv4: true, ipv6: true })).toBe("ipv4");
|
|
67
|
+
});
|
|
81
68
|
|
|
82
|
-
|
|
83
|
-
|
|
69
|
+
it("returns undefined when neither flag is set", () => {
|
|
70
|
+
expect(pickIpMode({})).toBeUndefined();
|
|
71
|
+
expect(pickIpMode(undefined)).toBeUndefined();
|
|
72
|
+
});
|
|
84
73
|
|
|
85
|
-
|
|
74
|
+
it("returns ipv6 when only ipv6 is set", () => {
|
|
75
|
+
expect(pickIpMode({ ipv6: true })).toBe("ipv6");
|
|
86
76
|
});
|
|
87
77
|
});
|
|
88
78
|
|