@prosopo/server 2.10.44 → 2.10.45

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @prosopo/server@2.10.44 build:cjs
2
+ > @prosopo/server@2.10.45 build:cjs
3
3
  > NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
4
4
 
5
5
  ViteCommonJSConfig: .
@@ -41,4 +41,4 @@ dist/cjs/config.cjs 0.82 kB │ gzip: 0.41 kB
41
41
  dist/cjs/_virtual/_rolldown/runtime.cjs 1.00 kB │ gzip: 0.50 kB
42
42
  dist/cjs/server.cjs 5.73 kB │ gzip: 1.78 kB
43
43
 
44
- ✓ built in 69ms
44
+ ✓ built in 58ms
@@ -1,8 +1,8 @@
1
1
 
2
- > @prosopo/server@2.10.44 build:tsc
2
+ > @prosopo/server@2.10.45 build:tsc
3
3
  > tsc --build --verbose
4
4
 
5
- 11:10:10 AM - Projects in this build:
5
+ 1:57:17 PM - Projects in this build:
6
6
  * ../../dev/config/tsconfig.json
7
7
  * ../locale/tsconfig.json
8
8
  * ../util/tsconfig.json
@@ -15,27 +15,27 @@
15
15
  * ../load-balancer/tsconfig.json
16
16
  * tsconfig.json
17
17
 
18
- 11:10:10 AM - 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'
18
+ 1:57:17 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'
19
19
 
20
- 11:10:10 AM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
20
+ 1:57:17 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
21
21
 
22
- 11:10:10 AM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
22
+ 1:57:17 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
23
23
 
24
- 11:10:10 AM - 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
+ 1:57:17 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'
25
25
 
26
- 11:10:10 AM - 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
+ 1:57:17 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'
27
27
 
28
- 11:10:10 AM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
28
+ 1:57:17 PM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
29
29
 
30
- 11:10:10 AM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/index.ts' is older than output '../logger/tsconfig.tsbuildinfo'
30
+ 1:57:17 PM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/logger.ts' is older than output '../logger/tsconfig.tsbuildinfo'
31
31
 
32
- 11:10:10 AM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/tests/utils/batches.unit.test.ts' is older than output '../common/tsconfig.tsbuildinfo'
32
+ 1:57:17 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/index.ts' is older than output '../common/tsconfig.tsbuildinfo'
33
33
 
34
- 11:10:11 AM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/index.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
34
+ 1:57:18 PM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/index.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
35
35
 
36
- 11:10:11 AM - Project '../load-balancer/tsconfig.json' is up to date because newest input '../load-balancer/src/tests/providers.unit.test.ts' is older than output '../load-balancer/tsconfig.tsbuildinfo'
36
+ 1:57:18 PM - Project '../load-balancer/tsconfig.json' is up to date because newest input '../load-balancer/src/index.ts' is older than output '../load-balancer/tsconfig.tsbuildinfo'
37
37
 
38
- 11:10:11 AM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
38
+ 1:57:18 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
39
39
 
40
- 11:10:11 AM - Building project '/home/runner/work/captcha/captcha/packages/server/tsconfig.json'...
40
+ 1:57:18 PM - Building project '/home/runner/work/captcha/captcha/packages/server/tsconfig.json'...
41
41
 
@@ -1,9 +1,9 @@
1
1
 
2
- > @prosopo/server@2.10.44 build
2
+ > @prosopo/server@2.10.45 build
3
3
  > npm run build:cross-env -- --mode ${NODE_ENV:-development}
4
4
 
5
5
 
6
- > @prosopo/server@2.10.44 build:cross-env
6
+ > @prosopo/server@2.10.45 build:cross-env
7
7
  > vite build --config vite.esm.config.ts --mode production
8
8
 
9
9
  ViteEsmConfig: .
@@ -45,4 +45,4 @@ dist/index.js 0.43 kB │ gzip: 0.23 kB
45
45
  dist/config.js 0.78 kB │ gzip: 0.40 kB
46
46
  dist/server.js 5.39 kB │ gzip: 1.68 kB
47
47
 
48
- ✓ built in 60ms
48
+ ✓ built in 79ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @prosopo/server
2
2
 
3
+ ## 2.10.45
4
+ ### Patch Changes
5
+
6
+ - 858dbaa: test(server): cover config env resolution and server edge paths
7
+ - Updated dependencies [9fec7bd]
8
+ - Updated dependencies [2aabe73]
9
+ - Updated dependencies [bcef918]
10
+ - @prosopo/common@3.1.49
11
+ - @prosopo/types@5.0.1
12
+ - @prosopo/api@4.0.1
13
+ - @prosopo/logger@2.0.5
14
+ - @prosopo/keyring@2.9.64
15
+ - @prosopo/load-balancer@2.10.18
16
+
3
17
  ## 2.10.44
4
18
  ### Patch Changes
5
19
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/config.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
+ import { getServerConfig, getServerUrl } from "../config.js";
3
+ const ENV_KEYS = [
4
+ "PROSOPO_SERVER_URL",
5
+ "PROSOPO_SERVER_PORT",
6
+ "PROSOPO_DEFAULT_ENVIRONMENT",
7
+ "PROSOPO_DAPP_NAME",
8
+ "PROSOPO_SITE_KEY",
9
+ "PROSOPO_SITE_PRIVATE_KEY",
10
+ ];
11
+ const saved = new Map();
12
+ beforeEach(() => {
13
+ for (const key of ENV_KEYS) {
14
+ saved.set(key, process.env[key]);
15
+ delete process.env[key];
16
+ }
17
+ });
18
+ afterEach(() => {
19
+ for (const key of ENV_KEYS) {
20
+ const value = saved.get(key);
21
+ if (undefined === value) {
22
+ delete process.env[key];
23
+ }
24
+ else {
25
+ process.env[key] = value;
26
+ }
27
+ }
28
+ });
29
+ describe("getServerUrl", () => {
30
+ it("falls back to localhost when no server url is configured", () => {
31
+ expect(getServerUrl()).toBe("https://localhost:9228");
32
+ });
33
+ it("returns a url that already carries a port unchanged", () => {
34
+ process.env.PROSOPO_SERVER_URL = "https://provider.test:8080";
35
+ expect(getServerUrl()).toBe("https://provider.test:8080");
36
+ });
37
+ it("appends the configured port to a portless url", () => {
38
+ process.env.PROSOPO_SERVER_URL = "https://provider.test";
39
+ process.env.PROSOPO_SERVER_PORT = "1234";
40
+ expect(getServerUrl()).toBe("https://provider.test:1234");
41
+ });
42
+ it("appends the default port when only the url is set", () => {
43
+ process.env.PROSOPO_SERVER_URL = "https://provider.test";
44
+ expect(getServerUrl()).toBe("https://provider.test:9228");
45
+ });
46
+ it("treats an empty server url as absent", () => {
47
+ process.env.PROSOPO_SERVER_URL = "";
48
+ expect(getServerUrl()).toBe("https://localhost:9228");
49
+ });
50
+ it("appends the default port when the port is an empty string", () => {
51
+ process.env.PROSOPO_SERVER_URL = "https://provider.test";
52
+ process.env.PROSOPO_SERVER_PORT = "";
53
+ expect(getServerUrl()).toBe("https://provider.test:9228");
54
+ });
55
+ });
56
+ describe("getServerConfig", () => {
57
+ it("builds a config from the environment", () => {
58
+ process.env.PROSOPO_DEFAULT_ENVIRONMENT = "development";
59
+ process.env.PROSOPO_DAPP_NAME = "my-dapp";
60
+ process.env.PROSOPO_SITE_KEY = "site-key";
61
+ process.env.PROSOPO_SITE_PRIVATE_KEY = "site-secret";
62
+ process.env.PROSOPO_SERVER_URL = "https://provider.test:8080";
63
+ const config = getServerConfig();
64
+ expect(config.defaultEnvironment).toBe("development");
65
+ expect(config.dappName).toBe("my-dapp");
66
+ expect(config.serverUrl).toBe("https://provider.test:8080");
67
+ expect(config.account).toMatchObject({
68
+ address: "site-key",
69
+ secret: "site-secret",
70
+ password: "",
71
+ });
72
+ });
73
+ it("defaults the dapp name when none is configured", () => {
74
+ expect(getServerConfig().dappName).toBe("client-example-server");
75
+ });
76
+ it("defaults the account fields to empty strings", () => {
77
+ expect(getServerConfig().account).toMatchObject({
78
+ address: "",
79
+ secret: "",
80
+ });
81
+ });
82
+ it("rejects an unknown default environment", () => {
83
+ process.env.PROSOPO_DEFAULT_ENVIRONMENT = "not-an-environment";
84
+ expect(() => getServerConfig()).toThrow();
85
+ });
86
+ });
87
+ //# sourceMappingURL=config.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.unit.test.js","sourceRoot":"","sources":["../../src/tests/config.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=serverEdges.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverEdges.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/serverEdges.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,130 @@
1
+ import { ProviderApi } from "@prosopo/api";
2
+ import * as loadBalancerModule from "@prosopo/load-balancer";
3
+ import { ApiParams, encodeProcaptchaOutput, } from "@prosopo/types";
4
+ import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
5
+ import { PublicProsopoServer } from "../index.js";
6
+ import { ProsopoServer } from "../server.js";
7
+ const PROVIDER_URL = "https://pronode1.example";
8
+ const DAPP = "5C1cs9CfxYQfNi3ARtprMDzR7BFRWFVSoDaLb1JytkiXwq5m";
9
+ const USER = "5CFHA8d3S1XXkZuBwGqiuA6SECTzfoucq397YL34FuPAH89G";
10
+ const buildConfig = (cachedMs) => ({
11
+ userAccountAddress: undefined,
12
+ web2: true,
13
+ solutionThreshold: 80,
14
+ dappName: "test",
15
+ serverUrl: undefined,
16
+ logLevel: "info",
17
+ defaultEnvironment: "development",
18
+ networks: {
19
+ development: {
20
+ endpoint: "wss://ignored",
21
+ dappContract: { address: DAPP },
22
+ procaptchaContract: { address: DAPP },
23
+ proxyContract: { address: DAPP },
24
+ },
25
+ },
26
+ account: { address: DAPP },
27
+ timeouts: {
28
+ image: {
29
+ challengeTimeout: 10_000,
30
+ solutionTimeout: 10_000,
31
+ verifiedTimeout: 10_000,
32
+ cachedTimeout: cachedMs,
33
+ },
34
+ pow: {
35
+ verifiedTimeout: 10_000,
36
+ solutionTimeout: 10_000,
37
+ cachedTimeout: cachedMs,
38
+ },
39
+ puzzle: {
40
+ verifiedTimeout: 10_000,
41
+ solutionTimeout: 10_000,
42
+ cachedTimeout: cachedMs,
43
+ },
44
+ contract: { maxVerifiedTime: 10_000 },
45
+ },
46
+ });
47
+ const buildLegacyToken = (timestamp, withChallenge) => {
48
+ const base = {
49
+ [ApiParams.providerUrl]: PROVIDER_URL,
50
+ [ApiParams.dapp]: DAPP,
51
+ [ApiParams.user]: USER,
52
+ [ApiParams.timestamp]: String(timestamp),
53
+ [ApiParams.signature]: {
54
+ [ApiParams.provider]: { [ApiParams.challenge]: "psig" },
55
+ [ApiParams.user]: { [ApiParams.timestamp]: "usig" },
56
+ },
57
+ };
58
+ if (withChallenge) {
59
+ base[ApiParams.challenge] = "challenge-string";
60
+ }
61
+ return encodeProcaptchaOutput(base);
62
+ };
63
+ const stubProviderList = () => [
64
+ { address: DAPP, url: PROVIDER_URL, datasetId: "0xdatasetId", weight: 1 },
65
+ ];
66
+ const stubPair = (sign = () => new Uint8Array([1, 2, 3, 4])) => ({ address: DAPP, sign });
67
+ let spies;
68
+ beforeEach(() => {
69
+ spies = {
70
+ puzzle: vi
71
+ .spyOn(ProviderApi.prototype, "submitPuzzleCaptchaVerify")
72
+ .mockResolvedValue({ status: "ok", verified: true }),
73
+ pow: vi
74
+ .spyOn(ProviderApi.prototype, "submitPowCaptchaVerify")
75
+ .mockResolvedValue({ status: "ok", verified: true }),
76
+ image: vi
77
+ .spyOn(ProviderApi.prototype, "verifyDappUser")
78
+ .mockResolvedValue({ status: "ok", verified: true }),
79
+ };
80
+ vi.spyOn(loadBalancerModule, "loadBalancer").mockResolvedValue(stubProviderList());
81
+ });
82
+ afterEach(() => {
83
+ vi.restoreAllMocks();
84
+ });
85
+ describe("ProsopoServer.verifyProvider — signer failures", () => {
86
+ it("throws when the signer cannot produce a signature", async () => {
87
+ const server = new ProsopoServer(buildConfig(60_000), stubPair(() => undefined));
88
+ await expect(server.isVerified(buildLegacyToken(Date.now(), true))).rejects.toThrow();
89
+ expect(spies.pow).not.toHaveBeenCalled();
90
+ });
91
+ });
92
+ describe("ProsopoServer.verifyProvider — legacy token recency", () => {
93
+ it("rejects a stale legacy PoW token without calling the provider", async () => {
94
+ const server = new ProsopoServer(buildConfig(1), stubPair());
95
+ const result = await server.isVerified(buildLegacyToken(Date.now() - 60_000, true));
96
+ expect(result.verified).toBe(false);
97
+ expect(spies.pow).not.toHaveBeenCalled();
98
+ });
99
+ it("verifies a fresh legacy PoW token via the pow endpoint", async () => {
100
+ const server = new ProsopoServer(buildConfig(60_000), stubPair());
101
+ const result = await server.isVerified(buildLegacyToken(Date.now(), true));
102
+ expect(result.verified).toBe(true);
103
+ expect(spies.pow).toHaveBeenCalledTimes(1);
104
+ });
105
+ it("rejects a stale legacy image token without calling the provider", async () => {
106
+ const server = new ProsopoServer(buildConfig(1), stubPair());
107
+ const result = await server.isVerified(buildLegacyToken(Date.now() - 60_000, false));
108
+ expect(result.verified).toBe(false);
109
+ expect(spies.image).not.toHaveBeenCalled();
110
+ });
111
+ it("verifies a fresh legacy image token via verifyDappUser", async () => {
112
+ const server = new ProsopoServer(buildConfig(60_000), stubPair());
113
+ const result = await server.isVerified(buildLegacyToken(Date.now(), false));
114
+ expect(result.verified).toBe(true);
115
+ expect(spies.image).toHaveBeenCalledTimes(1);
116
+ });
117
+ });
118
+ describe("PublicProsopoServer", () => {
119
+ const ALICE = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
120
+ it("builds a server from a config alone, deriving the pair from the site key", async () => {
121
+ const config = buildConfig(60_000);
122
+ config.account.address = ALICE;
123
+ const server = await PublicProsopoServer(config);
124
+ expect(server).toBeInstanceOf(ProsopoServer);
125
+ });
126
+ it("rejects a site key that is not a valid address", async () => {
127
+ await expect(PublicProsopoServer(buildConfig(60_000))).rejects.toThrow();
128
+ });
129
+ });
130
+ //# sourceMappingURL=serverEdges.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverEdges.unit.test.js","sourceRoot":"","sources":["../../src/tests/serverEdges.unit.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/server",
3
- "version": "2.10.44",
3
+ "version": "2.10.45",
4
4
  "description": "NodeJS package for server side communication with the prosopo captcha client",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -38,18 +38,18 @@
38
38
  "homepage": "https://github.com/prosopo/captcha#readme",
39
39
  "sideEffects": false,
40
40
  "dependencies": {
41
- "@prosopo/api": "4.0.0",
42
- "@prosopo/common": "3.1.48",
43
- "@prosopo/logger": "2.0.4",
44
- "@prosopo/keyring": "2.9.63",
45
- "@prosopo/load-balancer": "2.10.17",
46
- "@prosopo/types": "5.0.0",
41
+ "@prosopo/api": "4.0.1",
42
+ "@prosopo/common": "3.1.49",
43
+ "@prosopo/logger": "2.0.5",
44
+ "@prosopo/keyring": "2.9.64",
45
+ "@prosopo/load-balancer": "2.10.18",
46
+ "@prosopo/types": "5.0.1",
47
47
  "@prosopo/util": "3.3.5",
48
48
  "i18next": "24.1.0"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@polkadot/util": "13.5.7",
52
- "@prosopo/config": "3.3.6",
52
+ "@prosopo/config": "3.3.7",
53
53
  "@types/node": "22.10.2",
54
54
  "@vitest/coverage-v8": "4.1.10",
55
55
  "concurrently": "9.0.1",