@prosopo/api 3.5.19 → 3.5.21
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 +14 -14
- package/.turbo/turbo-build$colon$tsc.log +9 -9
- package/.turbo/turbo-build.log +16 -13
- package/CHANGELOG.md +14 -0
- package/dist/_virtual/_rolldown/runtime.js +3 -0
- package/dist/api/HttpClientBase.js +68 -81
- package/dist/api/HttpError.js +11 -11
- package/dist/api/ProviderApi.js +304 -430
- package/dist/api/apiClient.js +9 -9
- package/dist/api/index.js +3 -9
- package/dist/cjs/api/HttpClientBase.cjs +69 -81
- package/dist/cjs/api/HttpError.cjs +11 -11
- package/dist/cjs/api/ProviderApi.cjs +305 -430
- package/dist/cjs/api/apiClient.cjs +10 -10
- package/dist/cjs/api/index.cjs +9 -11
- package/dist/cjs/index.cjs +9 -11
- package/dist/index.js +4 -10
- package/dist/tests/api.test-d.d.ts +2 -0
- package/dist/tests/api.test-d.d.ts.map +1 -0
- package/dist/tests/api.test-d.js +66 -0
- package/dist/tests/api.test-d.js.map +1 -0
- package/dist/tests/apiHarness.d.ts +25 -0
- package/dist/tests/apiHarness.d.ts.map +1 -0
- package/dist/tests/apiHarness.js +87 -0
- package/dist/tests/apiHarness.js.map +1 -0
- package/dist/tests/httpClientBase.unit.test.d.ts +2 -0
- package/dist/tests/httpClientBase.unit.test.d.ts.map +1 -0
- package/dist/tests/httpClientBase.unit.test.js +257 -0
- package/dist/tests/httpClientBase.unit.test.js.map +1 -0
- package/dist/tests/providerApi.unit.test.d.ts +2 -0
- package/dist/tests/providerApi.unit.test.d.ts.map +1 -0
- package/dist/tests/providerApi.unit.test.js +536 -0
- package/dist/tests/providerApi.unit.test.js.map +1 -0
- package/package.json +10 -7
- package/vite.test.config.ts +19 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
const require_HttpClientBase = require("./HttpClientBase.cjs");
|
|
2
|
+
//#region src/api/apiClient.ts
|
|
3
|
+
var ApiClient = class extends require_HttpClientBase.HttpClientBase {
|
|
4
|
+
constructor(baseUrl, account) {
|
|
5
|
+
const baseUrlWithProtocol = !baseUrl.startsWith("http") ? `https://${baseUrl}` : baseUrl;
|
|
6
|
+
super(baseUrlWithProtocol);
|
|
7
|
+
this.account = account;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
11
|
exports.ApiClient = ApiClient;
|
package/dist/cjs/api/index.cjs
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.
|
|
8
|
-
exports.
|
|
9
|
-
exports.
|
|
10
|
-
exports.VERIFY_FORWARDED_HEADER = ProviderApi.VERIFY_FORWARDED_HEADER;
|
|
11
|
-
exports.ApiClient = apiClient.ApiClient;
|
|
1
|
+
const require_HttpError = require("./HttpError.cjs");
|
|
2
|
+
const require_HttpClientBase = require("./HttpClientBase.cjs");
|
|
3
|
+
const require_apiClient = require("./apiClient.cjs");
|
|
4
|
+
const require_ProviderApi = require("./ProviderApi.cjs");
|
|
5
|
+
exports.ApiClient = require_apiClient.ApiClient;
|
|
6
|
+
exports.HttpClientBase = require_HttpClientBase.HttpClientBase;
|
|
7
|
+
exports.HttpError = require_HttpError.HttpError;
|
|
8
|
+
exports.ProviderApi = require_ProviderApi.default;
|
|
9
|
+
exports.VERIFY_FORWARDED_HEADER = require_ProviderApi.VERIFY_FORWARDED_HEADER;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
require("./api/
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
exports.
|
|
9
|
-
exports.
|
|
10
|
-
exports.
|
|
11
|
-
exports.
|
|
12
|
-
exports.HttpClientBase = HttpClientBase.HttpClientBase;
|
|
2
|
+
const require_HttpError = require("./api/HttpError.cjs");
|
|
3
|
+
const require_HttpClientBase = require("./api/HttpClientBase.cjs");
|
|
4
|
+
const require_apiClient = require("./api/apiClient.cjs");
|
|
5
|
+
const require_ProviderApi = require("./api/ProviderApi.cjs");
|
|
6
|
+
exports.ApiClient = require_apiClient.ApiClient;
|
|
7
|
+
exports.HttpClientBase = require_HttpClientBase.HttpClientBase;
|
|
8
|
+
exports.HttpError = require_HttpError.HttpError;
|
|
9
|
+
exports.ProviderApi = require_ProviderApi.default;
|
|
10
|
+
exports.VERIFY_FORWARDED_HEADER = require_ProviderApi.VERIFY_FORWARDED_HEADER;
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
import "./
|
|
1
|
+
import "./_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { HttpError } from "./api/HttpError.js";
|
|
3
|
-
import { default as default2, VERIFY_FORWARDED_HEADER } from "./api/ProviderApi.js";
|
|
4
|
-
import { ApiClient } from "./api/apiClient.js";
|
|
5
3
|
import { HttpClientBase } from "./api/HttpClientBase.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
HttpError,
|
|
10
|
-
default2 as ProviderApi,
|
|
11
|
-
VERIFY_FORWARDED_HEADER
|
|
12
|
-
};
|
|
4
|
+
import { ApiClient } from "./api/apiClient.js";
|
|
5
|
+
import ProviderApi, { VERIFY_FORWARDED_HEADER } from "./api/ProviderApi.js";
|
|
6
|
+
export { ApiClient, HttpClientBase, HttpError, ProviderApi, VERIFY_FORWARDED_HEADER };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test-d.d.ts","sourceRoot":"","sources":["../../src/tests/api.test-d.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { assertType, describe, expectTypeOf, test } from "vitest";
|
|
2
|
+
import HttpClientBase from "../api/HttpClientBase.js";
|
|
3
|
+
import ProviderApi, { VERIFY_FORWARDED_HEADER } from "../api/ProviderApi.js";
|
|
4
|
+
import { ApiClient } from "../api/apiClient.js";
|
|
5
|
+
describe("the package entrypoint", () => {
|
|
6
|
+
test("exports exactly the client surface", () => {
|
|
7
|
+
expectTypeOf().toEqualTypeOf();
|
|
8
|
+
expectTypeOf().toEqualTypeOf();
|
|
9
|
+
expectTypeOf().toEqualTypeOf();
|
|
10
|
+
expectTypeOf().toEqualTypeOf();
|
|
11
|
+
expectTypeOf().toExtend();
|
|
12
|
+
});
|
|
13
|
+
test("the forwarded marker is a string constant callers can set as a header", () => {
|
|
14
|
+
expectTypeOf(VERIFY_FORWARDED_HEADER).toExtend();
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
describe("HttpClientBase's types", () => {
|
|
18
|
+
test("takes a base URL and an optional prefix", () => {
|
|
19
|
+
expectTypeOf().toEqualTypeOf();
|
|
20
|
+
});
|
|
21
|
+
test("the transport methods are not part of the public surface", () => {
|
|
22
|
+
expectTypeOf(new HttpClientBase("url").fetch).toBeCallableWith("/path");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe("HttpError's types", () => {
|
|
26
|
+
test("carries the status, text and URL", () => {
|
|
27
|
+
expectTypeOf().toEqualTypeOf();
|
|
28
|
+
expectTypeOf().toEqualTypeOf();
|
|
29
|
+
expectTypeOf().toEqualTypeOf();
|
|
30
|
+
expectTypeOf().toEqualTypeOf();
|
|
31
|
+
expectTypeOf().toExtend();
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe("ApiClient's types", () => {
|
|
35
|
+
test("needs both a URL and the account it speaks for", () => {
|
|
36
|
+
expectTypeOf().toEqualTypeOf();
|
|
37
|
+
assertType(new ApiClient("https://provider.prosopo.io"));
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe("ProviderApi's types", () => {
|
|
41
|
+
test("implements the shared provider interface", () => {
|
|
42
|
+
expectTypeOf().toExtend();
|
|
43
|
+
expectTypeOf().toExtend();
|
|
44
|
+
});
|
|
45
|
+
test("the challenge fetchers take optional session and simd arguments", () => {
|
|
46
|
+
expectTypeOf().toEqualTypeOf();
|
|
47
|
+
expectTypeOf().toEqualTypeOf();
|
|
48
|
+
});
|
|
49
|
+
test("challenge responses all extend the shared ApiResponse", () => {
|
|
50
|
+
expectTypeOf().toExtend();
|
|
51
|
+
expectTypeOf().toExtend();
|
|
52
|
+
});
|
|
53
|
+
test("the image challenge returns the captcha body", () => {
|
|
54
|
+
expectTypeOf().toEqualTypeOf();
|
|
55
|
+
});
|
|
56
|
+
test("verification calls resolve to a verification response", () => {
|
|
57
|
+
expectTypeOf().toEqualTypeOf();
|
|
58
|
+
expectTypeOf().toEqualTypeOf();
|
|
59
|
+
expectTypeOf().toEqualTypeOf();
|
|
60
|
+
});
|
|
61
|
+
test("the in-flight dedupe map is private, not part of the contract", () => {
|
|
62
|
+
const client = new ProviderApi("url", "account");
|
|
63
|
+
client.inFlightChallenges;
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=api.test-d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test-d.js","sourceRoot":"","sources":["../../src/tests/api.test-d.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAClE,OAAO,cAAc,MAAM,0BAA0B,CAAC;AAEtD,OAAO,WAAW,EAAE,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC/C,YAAY,EAAiC,CAAC,aAAa,EAExD,CAAC;QACJ,YAAY,EAA+B,CAAC,aAAa,EAEtD,CAAC;QACJ,YAAY,EAA+B,CAAC,aAAa,EAEtD,CAAC;QACJ,YAAY,EAAoC,CAAC,aAAa,EAE3D,CAAC;QACJ,YAAY,EAET,CAAC,QAAQ,EAAU,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAClF,YAAY,CAAC,uBAAuB,CAAC,CAAC,QAAQ,EAAU,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACpD,YAAY,EAAgD,CAAC,aAAa,EAEvE,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAGrE,YAAY,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC7C,YAAY,EAA2C,CAAC,aAAa,EAElE,CAAC;QACJ,YAAY,EAAuB,CAAC,aAAa,EAAU,CAAC;QAC5D,YAAY,EAA2B,CAAC,aAAa,EAAU,CAAC;QAChE,YAAY,EAAoB,CAAC,aAAa,EAAU,CAAC;QACzD,YAAY,EAAa,CAAC,QAAQ,EAAS,CAAC;IAC7C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC3D,YAAY,EAA2C,CAAC,aAAa,EAElE,CAAC;QAGJ,UAAU,CAAY,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACpC,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACrD,YAAY,EAAe,CAAC,QAAQ,EAAwB,CAAC;QAC7D,YAAY,EAAe,CAAC,QAAQ,EAAa,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;QAC5E,YAAY,EAET,CAAC,aAAa,EAEd,CAAC;QACJ,YAAY,EAET,CAAC,aAAa,EAAkC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAClE,YAAY,EAAyB,CAAC,QAAQ,EAAe,CAAC;QAC9D,YAAY,EAAkC,CAAC,QAAQ,EAAe,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACzD,YAAY,EAET,CAAC,aAAa,EAAgC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAClE,YAAY,EAET,CAAC,aAAa,EAAiC,CAAC;QACnD,YAAY,EAET,CAAC,aAAa,EAAiC,CAAC;QACnD,YAAY,EAA4C,CAAC,aAAa,EAEnE,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;QAC1E,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAEjD,MAAM,CAAC,kBAAkB,CAAC;IAC3B,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type PoWChallengeId } from "@prosopo/types";
|
|
2
|
+
export interface RecordedRequest {
|
|
3
|
+
url: string;
|
|
4
|
+
init: RequestInit | undefined;
|
|
5
|
+
body: unknown;
|
|
6
|
+
headers: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export interface FetchStub {
|
|
9
|
+
requests: RecordedRequest[];
|
|
10
|
+
last: () => RecordedRequest;
|
|
11
|
+
respond: (body: unknown, init?: ResponseInit) => void;
|
|
12
|
+
respondOnce: (body: unknown, init?: ResponseInit) => void;
|
|
13
|
+
fail: (error: Error) => void;
|
|
14
|
+
defer: () => {
|
|
15
|
+
resolve: (body: unknown) => void;
|
|
16
|
+
reject: (e: Error) => void;
|
|
17
|
+
};
|
|
18
|
+
restore: () => void;
|
|
19
|
+
}
|
|
20
|
+
export declare const stubFetch: (defaultBody?: unknown) => FetchStub;
|
|
21
|
+
export declare const BASE_URL = "https://provider.prosopo.io";
|
|
22
|
+
export declare const SITE_KEY = "5site000000000000000000000000000000000000000000000000";
|
|
23
|
+
export declare const USER = "5user000000000000000000000000000000000000000000000000";
|
|
24
|
+
export declare const CHALLENGE: PoWChallengeId;
|
|
25
|
+
//# sourceMappingURL=apiHarness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiHarness.d.ts","sourceRoot":"","sources":["../../src/tests/apiHarness.ts"],"names":[],"mappings":"AAcA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGpE,MAAM,WAAW,eAAe;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IAEzB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAE5B,IAAI,EAAE,MAAM,eAAe,CAAC;IAE5B,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IAEtD,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IAE1D,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAE7B,KAAK,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;KAAE,CAAC;IAC9E,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB;AAwBD,eAAO,MAAM,SAAS,iBACR,OAAO,KAClB,SAsEF,CAAC;AAEF,eAAO,MAAM,QAAQ,gCAAgC,CAAC;AACtD,eAAO,MAAM,QAAQ,0DAA0D,CAAC;AAChF,eAAO,MAAM,IAAI,0DAA0D,CAAC;AAG5E,eAAO,MAAM,SAAS,EAAE,cAAsG,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { POW_SEPARATOR } from "@prosopo/types";
|
|
2
|
+
import { vi } from "vitest";
|
|
3
|
+
const headersOf = (init) => {
|
|
4
|
+
const headers = init?.headers;
|
|
5
|
+
if (!headers)
|
|
6
|
+
return {};
|
|
7
|
+
if (headers instanceof Headers)
|
|
8
|
+
return Object.fromEntries(headers.entries());
|
|
9
|
+
if (Array.isArray(headers))
|
|
10
|
+
return Object.fromEntries(headers);
|
|
11
|
+
return { ...headers };
|
|
12
|
+
};
|
|
13
|
+
const parseBody = (init) => {
|
|
14
|
+
const body = init?.body;
|
|
15
|
+
if (typeof body !== "string")
|
|
16
|
+
return undefined;
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(body);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return body;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export const stubFetch = (defaultBody = { status: "ok" }) => {
|
|
25
|
+
const requests = [];
|
|
26
|
+
const queue = [];
|
|
27
|
+
let fallback = () => Promise.resolve(new Response(JSON.stringify(defaultBody), {
|
|
28
|
+
status: 200,
|
|
29
|
+
headers: { "content-type": "application/json" },
|
|
30
|
+
}));
|
|
31
|
+
const original = globalThis.fetch;
|
|
32
|
+
const impl = (input, init) => {
|
|
33
|
+
requests.push({
|
|
34
|
+
url: String(input),
|
|
35
|
+
init,
|
|
36
|
+
body: parseBody(init),
|
|
37
|
+
headers: headersOf(init),
|
|
38
|
+
});
|
|
39
|
+
const next = queue.shift();
|
|
40
|
+
return (next ?? fallback)();
|
|
41
|
+
};
|
|
42
|
+
globalThis.fetch = vi.fn(impl);
|
|
43
|
+
const responseOf = (body, init) => {
|
|
44
|
+
return () => Promise.resolve(new Response(typeof body === "string" ? body : JSON.stringify(body), {
|
|
45
|
+
status: 200,
|
|
46
|
+
headers: { "content-type": "application/json" },
|
|
47
|
+
...init,
|
|
48
|
+
}));
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
requests,
|
|
52
|
+
last: () => {
|
|
53
|
+
const request = requests[requests.length - 1];
|
|
54
|
+
if (!request)
|
|
55
|
+
throw new Error("no request was made");
|
|
56
|
+
return request;
|
|
57
|
+
},
|
|
58
|
+
respond: (body, init) => {
|
|
59
|
+
fallback = responseOf(body, init);
|
|
60
|
+
},
|
|
61
|
+
respondOnce: (body, init) => {
|
|
62
|
+
queue.push(responseOf(body, init));
|
|
63
|
+
},
|
|
64
|
+
fail: (error) => {
|
|
65
|
+
fallback = () => Promise.reject(error);
|
|
66
|
+
},
|
|
67
|
+
defer: () => {
|
|
68
|
+
let settle = () => undefined;
|
|
69
|
+
const gate = new Promise((resolve) => {
|
|
70
|
+
settle = resolve;
|
|
71
|
+
});
|
|
72
|
+
queue.push(() => gate.then((outcome) => outcome()));
|
|
73
|
+
return {
|
|
74
|
+
resolve: (body) => settle(responseOf(body)),
|
|
75
|
+
reject: (e) => settle(() => Promise.reject(e)),
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
restore: () => {
|
|
79
|
+
globalThis.fetch = original;
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
export const BASE_URL = "https://provider.prosopo.io";
|
|
84
|
+
export const SITE_KEY = "5site000000000000000000000000000000000000000000000000";
|
|
85
|
+
export const USER = "5user000000000000000000000000000000000000000000000000";
|
|
86
|
+
export const CHALLENGE = `1753900000000${POW_SEPARATOR}${USER}${POW_SEPARATOR}${SITE_KEY}${POW_SEPARATOR}salt`;
|
|
87
|
+
//# sourceMappingURL=apiHarness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiHarness.js","sourceRoot":"","sources":["../../src/tests/apiHarness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpClientBase.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/httpClientBase.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
|
+
import HttpClientBase from "../api/HttpClientBase.js";
|
|
3
|
+
import { HttpError } from "../api/HttpError.js";
|
|
4
|
+
import { ApiClient } from "../api/apiClient.js";
|
|
5
|
+
import { BASE_URL, stubFetch } from "./apiHarness.js";
|
|
6
|
+
class TestClient extends HttpClientBase {
|
|
7
|
+
get(input, init) {
|
|
8
|
+
return this.fetch(input, init);
|
|
9
|
+
}
|
|
10
|
+
send(input, body, init) {
|
|
11
|
+
return this.post(input, body, init);
|
|
12
|
+
}
|
|
13
|
+
sendWithHeaders(input, body, init) {
|
|
14
|
+
return this.postWithHeaders(input, body, init);
|
|
15
|
+
}
|
|
16
|
+
url() {
|
|
17
|
+
return this.baseURL;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
let fetchStub;
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
fetchStub = stubFetch();
|
|
23
|
+
vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
fetchStub.restore();
|
|
27
|
+
vi.restoreAllMocks();
|
|
28
|
+
});
|
|
29
|
+
const client = (prefix) => prefix === undefined
|
|
30
|
+
? new TestClient(BASE_URL)
|
|
31
|
+
: new TestClient(BASE_URL, prefix);
|
|
32
|
+
const json = (body, status = 200) => ({
|
|
33
|
+
status,
|
|
34
|
+
headers: { "content-type": "application/json" },
|
|
35
|
+
statusText: status === 200 ? "OK" : "Error",
|
|
36
|
+
});
|
|
37
|
+
describe("the base URL", () => {
|
|
38
|
+
test("defaults to no prefix", () => {
|
|
39
|
+
expect(client().url()).toBe(BASE_URL);
|
|
40
|
+
});
|
|
41
|
+
test("appends the prefix, so paths stay relative to it", async () => {
|
|
42
|
+
const withPrefix = client("/v1");
|
|
43
|
+
expect(withPrefix.url()).toBe(`${BASE_URL}/v1`);
|
|
44
|
+
await withPrefix.get("/status");
|
|
45
|
+
expect(fetchStub.last().url).toBe(`${BASE_URL}/v1/status`);
|
|
46
|
+
});
|
|
47
|
+
test("an empty path still hits the base URL", async () => {
|
|
48
|
+
await client().get("");
|
|
49
|
+
expect(fetchStub.last().url).toBe(BASE_URL);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("fetch", () => {
|
|
53
|
+
test("returns the parsed JSON body", async () => {
|
|
54
|
+
fetchStub.respond({ registered: true });
|
|
55
|
+
await expect(client().get("/status")).resolves.toEqual({
|
|
56
|
+
registered: true,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
test("passes the caller's init straight through", async () => {
|
|
60
|
+
await client().get("/status", { headers: { "X-Test": "1" } });
|
|
61
|
+
expect(fetchStub.last().headers).toEqual({ "X-Test": "1" });
|
|
62
|
+
});
|
|
63
|
+
test("throws an HttpError for a non-JSON failure", async () => {
|
|
64
|
+
fetchStub.respond("gateway down", {
|
|
65
|
+
status: 502,
|
|
66
|
+
statusText: "Bad Gateway",
|
|
67
|
+
headers: { "content-type": "text/plain" },
|
|
68
|
+
});
|
|
69
|
+
await expect(client().get("/status")).rejects.toBeInstanceOf(HttpError);
|
|
70
|
+
});
|
|
71
|
+
test("a JSON error body is handed back instead of thrown, so callers can read the error", async () => {
|
|
72
|
+
fetchStub.respond({ error: { message: "rate limited" } }, json({}, 429));
|
|
73
|
+
await expect(client().get("/status")).resolves.toEqual({
|
|
74
|
+
error: { message: "rate limited" },
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
test("a 400 is handed back even without a JSON content type", async () => {
|
|
78
|
+
fetchStub.respond('{"error":"bad request"}', {
|
|
79
|
+
status: 400,
|
|
80
|
+
headers: { "content-type": "text/plain" },
|
|
81
|
+
});
|
|
82
|
+
await expect(client().get("/status")).resolves.toEqual({
|
|
83
|
+
error: "bad request",
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
test("a response with no content type at all is treated as a failure", async () => {
|
|
87
|
+
fetchStub.respond("", { status: 500, headers: {} });
|
|
88
|
+
await expect(client().get("/status")).rejects.toBeInstanceOf(HttpError);
|
|
89
|
+
});
|
|
90
|
+
test("rejects with the network error when fetch itself fails", async () => {
|
|
91
|
+
const boom = new Error("network down");
|
|
92
|
+
fetchStub.fail(boom);
|
|
93
|
+
await expect(client().get("/status")).rejects.toBe(boom);
|
|
94
|
+
});
|
|
95
|
+
test("rejects when the body is not valid JSON", async () => {
|
|
96
|
+
fetchStub.respond("<html>not json</html>", json({}));
|
|
97
|
+
await expect(client().get("/status")).rejects.toBeInstanceOf(Error);
|
|
98
|
+
});
|
|
99
|
+
test("an empty 200 body is a parse failure, not a silent undefined", async () => {
|
|
100
|
+
fetchStub.respond("", json({}));
|
|
101
|
+
await expect(client().get("/status")).rejects.toBeInstanceOf(Error);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe("post", () => {
|
|
105
|
+
test("sends the body as JSON with the right method", async () => {
|
|
106
|
+
await client().send("/solve", { nonce: 1 });
|
|
107
|
+
const request = fetchStub.last();
|
|
108
|
+
expect(request.init?.method).toBe("POST");
|
|
109
|
+
expect(request.body).toEqual({ nonce: 1 });
|
|
110
|
+
expect(request.headers["Content-Type"]).toBe("application/json");
|
|
111
|
+
});
|
|
112
|
+
test("caller headers are merged on top of the content type", async () => {
|
|
113
|
+
await client().send("/solve", {}, { headers: { "Prosopo-Site-Key": "key" } });
|
|
114
|
+
expect(fetchStub.last().headers).toEqual({
|
|
115
|
+
"Content-Type": "application/json",
|
|
116
|
+
"Prosopo-Site-Key": "key",
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
test("a caller may override the content type", async () => {
|
|
120
|
+
await client().send("/solve", {}, { headers: { "Content-Type": "text/*" } });
|
|
121
|
+
expect(fetchStub.last().headers["Content-Type"]).toBe("text/*");
|
|
122
|
+
});
|
|
123
|
+
test("headers survive an init that also carries other options", async () => {
|
|
124
|
+
await client().send("/solve", {}, { keepalive: true, headers: { "X-A": "1" } });
|
|
125
|
+
const request = fetchStub.last();
|
|
126
|
+
expect(request.init?.keepalive).toBe(true);
|
|
127
|
+
expect(request.headers["Content-Type"]).toBe("application/json");
|
|
128
|
+
expect(request.headers["X-A"]).toBe("1");
|
|
129
|
+
});
|
|
130
|
+
test("an undefined body still produces a request", async () => {
|
|
131
|
+
await client().send("/solve", undefined);
|
|
132
|
+
expect(fetchStub.last().init?.body).toBeUndefined();
|
|
133
|
+
});
|
|
134
|
+
test("a zero-length array body is sent, not dropped", async () => {
|
|
135
|
+
await client().send("/events", []);
|
|
136
|
+
expect(fetchStub.last().init?.body).toBe("[]");
|
|
137
|
+
});
|
|
138
|
+
test("returns the parsed response", async () => {
|
|
139
|
+
fetchStub.respond({ verified: true });
|
|
140
|
+
await expect(client().send("/solve", {})).resolves.toEqual({
|
|
141
|
+
verified: true,
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
test("throws an HttpError for a non-JSON failure", async () => {
|
|
145
|
+
fetchStub.respond("nope", { status: 503, headers: {} });
|
|
146
|
+
await expect(client().send("/solve", {})).rejects.toBeInstanceOf(HttpError);
|
|
147
|
+
});
|
|
148
|
+
test("hands back a 400 JSON body", async () => {
|
|
149
|
+
fetchStub.respond({ error: "bad" }, json({}, 400));
|
|
150
|
+
await expect(client().send("/solve", {})).resolves.toEqual({
|
|
151
|
+
error: "bad",
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
test("rejects with the network error", async () => {
|
|
155
|
+
const boom = new Error("offline");
|
|
156
|
+
fetchStub.fail(boom);
|
|
157
|
+
await expect(client().send("/solve", {})).rejects.toBe(boom);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe("postWithHeaders", () => {
|
|
161
|
+
test("returns the body and the response headers together", async () => {
|
|
162
|
+
fetchStub.respond({ captchaType: "pow" }, {
|
|
163
|
+
status: 200,
|
|
164
|
+
headers: {
|
|
165
|
+
"content-type": "application/json",
|
|
166
|
+
"x-prosopo-meta": "encoded",
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
const { data, headers } = await client().sendWithHeaders("/frictionless", {});
|
|
170
|
+
expect(data).toEqual({ captchaType: "pow" });
|
|
171
|
+
expect(headers.get("x-prosopo-meta")).toBe("encoded");
|
|
172
|
+
});
|
|
173
|
+
test("sends JSON with the merged headers", async () => {
|
|
174
|
+
await client().sendWithHeaders("/frictionless", { token: "t" }, {
|
|
175
|
+
headers: { "Prosopo-User": "user" },
|
|
176
|
+
});
|
|
177
|
+
const request = fetchStub.last();
|
|
178
|
+
expect(request.init?.method).toBe("POST");
|
|
179
|
+
expect(request.body).toEqual({ token: "t" });
|
|
180
|
+
expect(request.headers).toEqual({
|
|
181
|
+
"Content-Type": "application/json",
|
|
182
|
+
"Prosopo-User": "user",
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
test("a missing meta header is absent rather than an error", async () => {
|
|
186
|
+
const { headers } = await client().sendWithHeaders("/frictionless", {});
|
|
187
|
+
expect(headers.get("x-prosopo-meta")).toBeNull();
|
|
188
|
+
});
|
|
189
|
+
test("throws an HttpError for a non-JSON failure", async () => {
|
|
190
|
+
fetchStub.respond("nope", { status: 500, headers: {} });
|
|
191
|
+
await expect(client().sendWithHeaders("/frictionless", {})).rejects.toBeInstanceOf(HttpError);
|
|
192
|
+
});
|
|
193
|
+
test("hands back a 400 JSON body with its headers", async () => {
|
|
194
|
+
fetchStub.respond({ error: "bad" }, json({}, 400));
|
|
195
|
+
const { data } = await client().sendWithHeaders("/frictionless", {});
|
|
196
|
+
expect(data).toEqual({ error: "bad" });
|
|
197
|
+
});
|
|
198
|
+
test("rejects when the body cannot be parsed", async () => {
|
|
199
|
+
fetchStub.respond("not json", json({}));
|
|
200
|
+
await expect(client().sendWithHeaders("/frictionless", {})).rejects.toBeInstanceOf(Error);
|
|
201
|
+
});
|
|
202
|
+
test("rejects with the network error", async () => {
|
|
203
|
+
const boom = new Error("offline");
|
|
204
|
+
fetchStub.fail(boom);
|
|
205
|
+
await expect(client().sendWithHeaders("/frictionless", {})).rejects.toBe(boom);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe("HttpError", () => {
|
|
209
|
+
test("carries the status, text and URL a caller needs to triage", () => {
|
|
210
|
+
const error = new HttpError(429, "Too Many Requests", `${BASE_URL}/pow`);
|
|
211
|
+
expect(error.status).toBe(429);
|
|
212
|
+
expect(error.statusText).toBe("Too Many Requests");
|
|
213
|
+
expect(error.url).toBe(`${BASE_URL}/pow`);
|
|
214
|
+
expect(error.name).toBe("HttpError");
|
|
215
|
+
expect(error).toBeInstanceOf(Error);
|
|
216
|
+
expect(error.message).toBe(`HTTP error! status: 429 (Too Many Requests) for URL: ${BASE_URL}/pow`);
|
|
217
|
+
});
|
|
218
|
+
test("is distinguishable from any other error at a catch site", () => {
|
|
219
|
+
expect(new HttpError(500, "", "")).toBeInstanceOf(HttpError);
|
|
220
|
+
expect(new Error("plain")).not.toBeInstanceOf(HttpError);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe("ApiClient", () => {
|
|
224
|
+
test("keeps an explicit protocol", () => {
|
|
225
|
+
const api = new ApiClient("http://localhost:9229", "account");
|
|
226
|
+
expect(new TestClient("http://localhost:9229").url()).toBe("http://localhost:9229");
|
|
227
|
+
expect(api).toBeInstanceOf(HttpClientBase);
|
|
228
|
+
});
|
|
229
|
+
test("assumes HTTPS when the URL has no protocol", async () => {
|
|
230
|
+
class Probe extends ApiClient {
|
|
231
|
+
go() {
|
|
232
|
+
return this.fetch("/status");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
await new Probe("provider.prosopo.io", "account").go();
|
|
236
|
+
expect(fetchStub.last().url).toBe("https://provider.prosopo.io/status");
|
|
237
|
+
});
|
|
238
|
+
test("does not upgrade an https URL twice", async () => {
|
|
239
|
+
class Probe extends ApiClient {
|
|
240
|
+
go() {
|
|
241
|
+
return this.fetch("/status");
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
await new Probe("https://provider.prosopo.io", "account").go();
|
|
245
|
+
expect(fetchStub.last().url).toBe("https://provider.prosopo.io/status");
|
|
246
|
+
});
|
|
247
|
+
test("an empty base URL becomes a relative https URL, not a crash", async () => {
|
|
248
|
+
class Probe extends ApiClient {
|
|
249
|
+
go() {
|
|
250
|
+
return this.fetch("/status");
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
await new Probe("", "account").go();
|
|
254
|
+
expect(fetchStub.last().url).toBe("https:///status");
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
//# sourceMappingURL=httpClientBase.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpClientBase.unit.test.js","sourceRoot":"","sources":["../../src/tests/httpClientBase.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerApi.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/providerApi.unit.test.ts"],"names":[],"mappings":""}
|