@prosopo/api 2.1.4 → 2.1.6

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.
@@ -0,0 +1,10 @@
1
+ export declare class HttpClientBase {
2
+ protected readonly baseURL: string;
3
+ constructor(baseURL: string, prefix?: string);
4
+ protected fetch<T>(input: RequestInfo, init?: RequestInit): Promise<T>;
5
+ protected post<T, U>(input: RequestInfo, body: U, init?: RequestInit): Promise<T>;
6
+ protected responseHandler<T>(response: Response): Promise<T>;
7
+ protected errorHandler(error: Error): Promise<never>;
8
+ }
9
+ export default HttpClientBase;
10
+ //# sourceMappingURL=HttpClientBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClientBase.d.ts","sourceRoot":"","sources":["../../src/api/HttpClientBase.ts"],"names":[],"mappings":"AAeA,qBAAa,cAAc;IAC1B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAK;cAIxB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;cAiB5D,IAAI,CAAC,CAAC,EAAE,CAAC,EACxB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,CAAC,EACP,IAAI,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,CAAC,CAAC;cA0BG,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IASlE,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;CAQpD;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { HttpError } from "./HttpError.js";
2
+ export class HttpClientBase {
3
+ constructor(baseURL, prefix = "") {
4
+ this.baseURL = baseURL + prefix;
5
+ }
6
+ async fetch(input, init) {
7
+ try {
8
+ const response = await fetch(this.baseURL + input, init);
9
+ if (!response.ok &&
10
+ response.status !== 400 &&
11
+ !response.headers.get("content-type")?.includes("application/json")) {
12
+ throw new HttpError(response.status, response.statusText, response.url);
13
+ }
14
+ return this.responseHandler(response);
15
+ }
16
+ catch (error) {
17
+ return this.errorHandler(error);
18
+ }
19
+ }
20
+ async post(input, body, init) {
21
+ const headers = {
22
+ "Content-Type": "application/json",
23
+ ...(init?.headers || {}),
24
+ };
25
+ try {
26
+ const response = await fetch(this.baseURL + input, {
27
+ method: "POST",
28
+ body: JSON.stringify(body),
29
+ headers,
30
+ ...init,
31
+ });
32
+ if (!response.ok &&
33
+ response.status !== 400 &&
34
+ !response.headers.get("content-type")?.includes("application/json")) {
35
+ throw new HttpError(response.status, response.statusText, response.url);
36
+ }
37
+ return this.responseHandler(response);
38
+ }
39
+ catch (error) {
40
+ return this.errorHandler(error);
41
+ }
42
+ }
43
+ async responseHandler(response) {
44
+ try {
45
+ return await response.json();
46
+ }
47
+ catch (error) {
48
+ console.error("Error parsing JSON:", error);
49
+ throw error;
50
+ }
51
+ }
52
+ errorHandler(error) {
53
+ if (error instanceof HttpError) {
54
+ console.error("HTTP error:", error);
55
+ }
56
+ else {
57
+ console.error("API request error:", error);
58
+ }
59
+ return Promise.reject(error);
60
+ }
61
+ }
62
+ export default HttpClientBase;
63
+ //# sourceMappingURL=HttpClientBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClientBase.js","sourceRoot":"","sources":["../../src/api/HttpClientBase.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,OAAO,cAAc;IAG1B,YAAY,OAAe,EAAE,MAAM,GAAG,EAAE;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACjC,CAAC;IAES,KAAK,CAAC,KAAK,CAAI,KAAkB,EAAE,IAAkB;QAC9D,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;YACzD,IACC,CAAC,QAAQ,CAAC,EAAE;gBAEZ,QAAQ,CAAC,MAAM,KAAK,GAAG;gBACvB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClE,CAAC;gBACF,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;YACzE,CAAC;YACD,OAAO,IAAI,CAAC,eAAe,CAAI,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAc,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC;IAES,KAAK,CAAC,IAAI,CACnB,KAAkB,EAClB,IAAO,EACP,IAAkB;QAElB,MAAM,OAAO,GAAG;YACf,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;SACxB,CAAC;QACF,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE;gBAClD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,OAAO;gBACP,GAAG,IAAI;aACP,CAAC,CAAC;YACH,IACC,CAAC,QAAQ,CAAC,EAAE;gBAEZ,QAAQ,CAAC,MAAM,KAAK,GAAG;gBACvB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClE,CAAC;gBACF,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;YACzE,CAAC;YACD,OAAO,IAAI,CAAC,eAAe,CAAI,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAc,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC;IAES,KAAK,CAAC,eAAe,CAAI,QAAkB;QACpD,IAAI,CAAC;YACJ,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAES,YAAY,CAAC,KAAY;QAClC,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACD;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare class HttpError extends Error {
2
+ status: number;
3
+ statusText: string;
4
+ url: string;
5
+ constructor(status: number, statusText: string, url: string);
6
+ }
7
+ //# sourceMappingURL=HttpError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpError.d.ts","sourceRoot":"","sources":["../../src/api/HttpError.ts"],"names":[],"mappings":"AAaA,qBAAa,SAAU,SAAQ,KAAK;IAE3B,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,MAAM;IAClB,GAAG,EAAE,MAAM;gBAFX,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM;CAKnB"}
@@ -0,0 +1,10 @@
1
+ export class HttpError extends Error {
2
+ constructor(status, statusText, url) {
3
+ super(`HTTP error! status: ${status} (${statusText}) for URL: ${url}`);
4
+ this.status = status;
5
+ this.statusText = statusText;
6
+ this.url = url;
7
+ this.name = "HttpError";
8
+ }
9
+ }
10
+ //# sourceMappingURL=HttpError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpError.js","sourceRoot":"","sources":["../../src/api/HttpError.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,SAAU,SAAQ,KAAK;IACnC,YACQ,MAAc,EACd,UAAkB,EAClB,GAAW;QAElB,KAAK,CAAC,uBAAuB,MAAM,KAAK,UAAU,cAAc,GAAG,EAAE,CAAC,CAAC;QAJhE,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAQ;QAClB,QAAG,GAAH,GAAG,CAAQ;QAGlB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IACzB,CAAC;CACD"}
@@ -0,0 +1,18 @@
1
+ import { type CaptchaResponseBody, type CaptchaSolution, type CaptchaSolutionResponse, type GetFrictionlessCaptchaResponse, type GetPowCaptchaResponse, type ImageVerificationResponse, type PowCaptchaSolutionResponse, type ProcaptchaToken, type Provider, type ProviderApiInterface, type ProviderRegistered, type RandomProvider, type StoredEvents, type UpdateProviderClientsResponse, type VerificationResponse } from "@prosopo/types";
2
+ import HttpClientBase from "./HttpClientBase.js";
3
+ export default class ProviderApi extends HttpClientBase implements ProviderApiInterface {
4
+ private account;
5
+ constructor(providerUrl: string, account: string);
6
+ getCaptchaChallenge(userAccount: string, randomProvider: RandomProvider): Promise<CaptchaResponseBody>;
7
+ submitCaptchaSolution(captchas: CaptchaSolution[], requestHash: string, userAccount: string, timestamp: string, providerRequestHashSignature: string, userTimestampSignature: string): Promise<CaptchaSolutionResponse>;
8
+ verifyDappUser(token: ProcaptchaToken, signature: string, maxVerifiedTime?: number): Promise<ImageVerificationResponse>;
9
+ getPowCaptchaChallenge(user: string, dapp: string, sessionId?: string): Promise<GetPowCaptchaResponse>;
10
+ submitPowCaptchaSolution(challenge: GetPowCaptchaResponse, userAccount: string, dappAccount: string, nonce: number, userTimestampSignature: string, timeout?: number): Promise<PowCaptchaSolutionResponse>;
11
+ getFrictionlessCaptcha(token: string, dapp: string): Promise<GetFrictionlessCaptchaResponse>;
12
+ submitUserEvents(events: StoredEvents, string: string): Promise<UpdateProviderClientsResponse>;
13
+ getProviderStatus(): Promise<ProviderRegistered>;
14
+ getProviderDetails(): Promise<Provider>;
15
+ updateProviderClients(): Promise<UpdateProviderClientsResponse>;
16
+ submitPowCaptchaVerify(token: string, signatureHex: string, recencyLimit: number): Promise<VerificationResponse>;
17
+ }
18
+ //# sourceMappingURL=ProviderApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderApi.d.ts","sourceRoot":"","sources":["../../src/api/ProviderApi.ts"],"names":[],"mappings":"AAaA,OAAO,EAGN,KAAK,mBAAmB,EACxB,KAAK,eAAe,EAEpB,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EAEnC,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EAEnB,KAAK,YAAY,EAGjB,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EAEzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,WACpB,SAAQ,cACR,YAAW,oBAAoB;IAE/B,OAAO,CAAC,OAAO,CAAS;gBAEZ,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAQzC,mBAAmB,CACzB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,GAC5B,OAAO,CAAC,mBAAmB,CAAC;IASxB,qBAAqB,CAC3B,QAAQ,EAAE,eAAe,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,4BAA4B,EAAE,MAAM,EACpC,sBAAsB,EAAE,MAAM,GAC5B,OAAO,CAAC,uBAAuB,CAAC;IAmB5B,cAAc,CACpB,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,yBAAyB,CAAC;IAY9B,sBAAsB,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,CAAC;IAS1B,wBAAwB,CAC9B,SAAS,EAAE,qBAAqB,EAChC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,sBAAsB,EAAE,MAAM,EAC9B,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,0BAA0B,CAAC;IAoB/B,sBAAsB,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,8BAA8B,CAAC;IAQnC,gBAAgB,CACtB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,6BAA6B,CAAC;IAIlC,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAIhD,kBAAkB,IAAI,OAAO,CAAC,QAAQ,CAAC;IAIvC,qBAAqB,IAAI,OAAO,CAAC,6BAA6B,CAAC;IAI/D,sBAAsB,CAC5B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,CAAC;CAQhC"}
@@ -0,0 +1,99 @@
1
+ import { ApiParams, ApiPaths, SubmitPowCaptchaSolutionBody, } from "@prosopo/types";
2
+ import HttpClientBase from "./HttpClientBase.js";
3
+ export default class ProviderApi extends HttpClientBase {
4
+ constructor(providerUrl, account) {
5
+ const providerUrlWithProtocol = !providerUrl.startsWith("http")
6
+ ? `https://${providerUrl}`
7
+ : providerUrl;
8
+ super(providerUrlWithProtocol);
9
+ this.account = account;
10
+ }
11
+ getCaptchaChallenge(userAccount, randomProvider) {
12
+ const { provider } = randomProvider;
13
+ const dappAccount = this.account;
14
+ const url = `${ApiPaths.GetImageCaptchaChallenge}/${provider.datasetId}/${userAccount}/${dappAccount}`;
15
+ return this.fetch(url);
16
+ }
17
+ submitCaptchaSolution(captchas, requestHash, userAccount, timestamp, providerRequestHashSignature, userTimestampSignature) {
18
+ const body = {
19
+ [ApiParams.user]: userAccount,
20
+ [ApiParams.dapp]: this.account,
21
+ [ApiParams.captchas]: captchas,
22
+ [ApiParams.requestHash]: requestHash,
23
+ [ApiParams.timestamp]: timestamp,
24
+ [ApiParams.signature]: {
25
+ [ApiParams.user]: {
26
+ [ApiParams.timestamp]: userTimestampSignature,
27
+ },
28
+ [ApiParams.provider]: {
29
+ [ApiParams.requestHash]: providerRequestHashSignature,
30
+ },
31
+ },
32
+ };
33
+ return this.post(ApiPaths.SubmitImageCaptchaSolution, body);
34
+ }
35
+ verifyDappUser(token, signature, maxVerifiedTime) {
36
+ const payload = {
37
+ [ApiParams.token]: token,
38
+ [ApiParams.dappSignature]: signature,
39
+ };
40
+ if (maxVerifiedTime) {
41
+ payload[ApiParams.maxVerifiedTime] = maxVerifiedTime;
42
+ }
43
+ return this.post(ApiPaths.VerifyImageCaptchaSolutionDapp, payload);
44
+ }
45
+ getPowCaptchaChallenge(user, dapp, sessionId) {
46
+ const body = {
47
+ [ApiParams.user]: user.toString(),
48
+ [ApiParams.dapp]: dapp.toString(),
49
+ ...(sessionId && { [ApiParams.sessionId]: sessionId }),
50
+ };
51
+ return this.post(ApiPaths.GetPowCaptchaChallenge, body);
52
+ }
53
+ submitPowCaptchaSolution(challenge, userAccount, dappAccount, nonce, userTimestampSignature, timeout) {
54
+ const body = SubmitPowCaptchaSolutionBody.parse({
55
+ [ApiParams.challenge]: challenge.challenge,
56
+ [ApiParams.difficulty]: challenge.difficulty,
57
+ [ApiParams.timestamp]: challenge.timestamp,
58
+ [ApiParams.user]: userAccount.toString(),
59
+ [ApiParams.dapp]: dappAccount.toString(),
60
+ [ApiParams.nonce]: nonce,
61
+ [ApiParams.verifiedTimeout]: timeout,
62
+ [ApiParams.signature]: {
63
+ [ApiParams.provider]: challenge[ApiParams.signature][ApiParams.provider],
64
+ [ApiParams.user]: {
65
+ [ApiParams.timestamp]: userTimestampSignature,
66
+ },
67
+ },
68
+ });
69
+ return this.post(ApiPaths.SubmitPowCaptchaSolution, body);
70
+ }
71
+ getFrictionlessCaptcha(token, dapp) {
72
+ const body = {
73
+ [ApiParams.token]: token,
74
+ [ApiParams.dapp]: dapp,
75
+ };
76
+ return this.post(ApiPaths.GetFrictionlessCaptchaChallenge, body);
77
+ }
78
+ submitUserEvents(events, string) {
79
+ return this.post(ApiPaths.SubmitUserEvents, { events, string });
80
+ }
81
+ getProviderStatus() {
82
+ return this.fetch(ApiPaths.GetProviderStatus);
83
+ }
84
+ getProviderDetails() {
85
+ return this.fetch(ApiPaths.GetProviderDetails);
86
+ }
87
+ updateProviderClients() {
88
+ return this.post(ApiPaths.UpdateProviderClients, {});
89
+ }
90
+ submitPowCaptchaVerify(token, signatureHex, recencyLimit) {
91
+ const body = {
92
+ [ApiParams.token]: token,
93
+ [ApiParams.dappSignature]: signatureHex,
94
+ [ApiParams.verifiedTimeout]: recencyLimit,
95
+ };
96
+ return this.post(ApiPaths.VerifyPowCaptchaSolution, body);
97
+ }
98
+ }
99
+ //# sourceMappingURL=ProviderApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderApi.js","sourceRoot":"","sources":["../../src/api/ProviderApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./HttpClientBase.js";
2
+ export { default as ProviderApi } from "./ProviderApi.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAaA,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./HttpClientBase.js";
2
+ export { default as ProviderApi } from "./ProviderApi.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAaA,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const HttpError = require("./HttpError.cjs");
4
+ class HttpClientBase {
5
+ constructor(baseURL, prefix = "") {
6
+ this.baseURL = baseURL + prefix;
7
+ }
8
+ async fetch(input, init) {
9
+ try {
10
+ const response = await fetch(this.baseURL + input, init);
11
+ if (!response.ok && // Only throw an error if the response is not JSON and not a 400 error
12
+ response.status !== 400 && !response.headers.get("content-type")?.includes("application/json")) {
13
+ throw new HttpError.HttpError(response.status, response.statusText, response.url);
14
+ }
15
+ return this.responseHandler(response);
16
+ } catch (error) {
17
+ return this.errorHandler(error);
18
+ }
19
+ }
20
+ async post(input, body, init) {
21
+ const headers = {
22
+ "Content-Type": "application/json",
23
+ ...init?.headers || {}
24
+ };
25
+ try {
26
+ const response = await fetch(this.baseURL + input, {
27
+ method: "POST",
28
+ body: JSON.stringify(body),
29
+ headers,
30
+ ...init
31
+ });
32
+ if (!response.ok && // Only throw an error if the response is not JSON and not a 400 error
33
+ response.status !== 400 && !response.headers.get("content-type")?.includes("application/json")) {
34
+ throw new HttpError.HttpError(response.status, response.statusText, response.url);
35
+ }
36
+ return this.responseHandler(response);
37
+ } catch (error) {
38
+ return this.errorHandler(error);
39
+ }
40
+ }
41
+ async responseHandler(response) {
42
+ try {
43
+ return await response.json();
44
+ } catch (error) {
45
+ console.error("Error parsing JSON:", error);
46
+ throw error;
47
+ }
48
+ }
49
+ errorHandler(error) {
50
+ if (error instanceof HttpError.HttpError) {
51
+ console.error("HTTP error:", error);
52
+ } else {
53
+ console.error("API request error:", error);
54
+ }
55
+ return Promise.reject(error);
56
+ }
57
+ }
58
+ exports.HttpClientBase = HttpClientBase;
59
+ exports.default = HttpClientBase;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ class HttpError extends Error {
4
+ constructor(status, statusText, url) {
5
+ super(`HTTP error! status: ${status} (${statusText}) for URL: ${url}`);
6
+ this.status = status;
7
+ this.statusText = statusText;
8
+ this.url = url;
9
+ this.name = "HttpError";
10
+ }
11
+ }
12
+ exports.HttpError = HttpError;
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ const types = require("@prosopo/types");
3
+ const HttpClientBase = require("./HttpClientBase.cjs");
4
+ class ProviderApi extends HttpClientBase.HttpClientBase {
5
+ constructor(providerUrl, account) {
6
+ const providerUrlWithProtocol = !providerUrl.startsWith("http") ? `https://${providerUrl}` : providerUrl;
7
+ super(providerUrlWithProtocol);
8
+ this.account = account;
9
+ }
10
+ getCaptchaChallenge(userAccount, randomProvider) {
11
+ const { provider } = randomProvider;
12
+ const dappAccount = this.account;
13
+ const url = `${types.ApiPaths.GetImageCaptchaChallenge}/${provider.datasetId}/${userAccount}/${dappAccount}`;
14
+ return this.fetch(url);
15
+ }
16
+ submitCaptchaSolution(captchas, requestHash, userAccount, timestamp, providerRequestHashSignature, userTimestampSignature) {
17
+ const body = {
18
+ [types.ApiParams.user]: userAccount,
19
+ [types.ApiParams.dapp]: this.account,
20
+ [types.ApiParams.captchas]: captchas,
21
+ [types.ApiParams.requestHash]: requestHash,
22
+ [types.ApiParams.timestamp]: timestamp,
23
+ [types.ApiParams.signature]: {
24
+ [types.ApiParams.user]: {
25
+ [types.ApiParams.timestamp]: userTimestampSignature
26
+ },
27
+ [types.ApiParams.provider]: {
28
+ [types.ApiParams.requestHash]: providerRequestHashSignature
29
+ }
30
+ }
31
+ };
32
+ return this.post(types.ApiPaths.SubmitImageCaptchaSolution, body);
33
+ }
34
+ verifyDappUser(token, signature, maxVerifiedTime) {
35
+ const payload = {
36
+ [types.ApiParams.token]: token,
37
+ [types.ApiParams.dappSignature]: signature
38
+ };
39
+ if (maxVerifiedTime) {
40
+ payload[types.ApiParams.maxVerifiedTime] = maxVerifiedTime;
41
+ }
42
+ return this.post(types.ApiPaths.VerifyImageCaptchaSolutionDapp, payload);
43
+ }
44
+ getPowCaptchaChallenge(user, dapp, sessionId) {
45
+ const body = {
46
+ [types.ApiParams.user]: user.toString(),
47
+ [types.ApiParams.dapp]: dapp.toString(),
48
+ ...sessionId && { [types.ApiParams.sessionId]: sessionId }
49
+ };
50
+ return this.post(types.ApiPaths.GetPowCaptchaChallenge, body);
51
+ }
52
+ submitPowCaptchaSolution(challenge, userAccount, dappAccount, nonce, userTimestampSignature, timeout) {
53
+ const body = types.SubmitPowCaptchaSolutionBody.parse({
54
+ [types.ApiParams.challenge]: challenge.challenge,
55
+ [types.ApiParams.difficulty]: challenge.difficulty,
56
+ [types.ApiParams.timestamp]: challenge.timestamp,
57
+ [types.ApiParams.user]: userAccount.toString(),
58
+ [types.ApiParams.dapp]: dappAccount.toString(),
59
+ [types.ApiParams.nonce]: nonce,
60
+ [types.ApiParams.verifiedTimeout]: timeout,
61
+ [types.ApiParams.signature]: {
62
+ [types.ApiParams.provider]: challenge[types.ApiParams.signature][types.ApiParams.provider],
63
+ [types.ApiParams.user]: {
64
+ [types.ApiParams.timestamp]: userTimestampSignature
65
+ }
66
+ }
67
+ });
68
+ return this.post(types.ApiPaths.SubmitPowCaptchaSolution, body);
69
+ }
70
+ getFrictionlessCaptcha(token, dapp) {
71
+ const body = {
72
+ [types.ApiParams.token]: token,
73
+ [types.ApiParams.dapp]: dapp
74
+ };
75
+ return this.post(types.ApiPaths.GetFrictionlessCaptchaChallenge, body);
76
+ }
77
+ submitUserEvents(events, string) {
78
+ return this.post(types.ApiPaths.SubmitUserEvents, { events, string });
79
+ }
80
+ getProviderStatus() {
81
+ return this.fetch(types.ApiPaths.GetProviderStatus);
82
+ }
83
+ getProviderDetails() {
84
+ return this.fetch(types.ApiPaths.GetProviderDetails);
85
+ }
86
+ updateProviderClients() {
87
+ return this.post(types.ApiPaths.UpdateProviderClients, {});
88
+ }
89
+ submitPowCaptchaVerify(token, signatureHex, recencyLimit) {
90
+ const body = {
91
+ [types.ApiParams.token]: token,
92
+ [types.ApiParams.dappSignature]: signatureHex,
93
+ [types.ApiParams.verifiedTimeout]: recencyLimit
94
+ };
95
+ return this.post(types.ApiPaths.VerifyPowCaptchaSolution, body);
96
+ }
97
+ }
98
+ module.exports = ProviderApi;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const HttpClientBase = require("./HttpClientBase.cjs");
4
+ const ProviderApi = require("./ProviderApi.cjs");
5
+ exports.HttpClientBase = HttpClientBase.HttpClientBase;
6
+ exports.ProviderApi = ProviderApi;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ require("./api/index.cjs");
4
+ const ProviderApi = require("./api/ProviderApi.cjs");
5
+ const HttpClientBase = require("./api/HttpClientBase.cjs");
6
+ exports.ProviderApi = ProviderApi;
7
+ exports.HttpClientBase = HttpClientBase.HttpClientBase;
@@ -0,0 +1,2 @@
1
+ export * from "./api/index.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/api",
3
- "version": "2.1.4",
3
+ "version": "2.1.6",
4
4
  "description": "Wrapper for the provider API",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -31,14 +31,14 @@
31
31
  },
32
32
  "homepage": "https://github.com/prosopo/captcha#readme",
33
33
  "dependencies": {
34
- "@prosopo/types": "2.1.4"
34
+ "@prosopo/types": "2.1.6"
35
35
  },
36
36
  "devDependencies": {
37
- "@prosopo/config": "2.1.4",
37
+ "@prosopo/config": "2.1.6",
38
38
  "@vitest/coverage-v8": "2.1.1",
39
39
  "concurrently": "9.0.1",
40
40
  "npm-run-all": "4.1.5",
41
- "rimraf": "6.0.1",
41
+ "del-cli": "6.0.0",
42
42
  "tslib": "2.7.0",
43
43
  "tsx": "4.19.1",
44
44
  "typescript": "5.6.2",