commit 177cf3a085657ba597ca3ed026d8a68c5688ba71
parent 66ecbf769699444811bb899c7b932d302ce462f7
Author: Florian Dold <florian@dold.me>
Date: Sun, 27 Apr 2025 15:41:58 +0200
-formatting
Diffstat:
1 file changed, 122 insertions(+), 96 deletions(-)
diff --git a/packages/taler-util/src/http-client/exchange.ts b/packages/taler-util/src/http-client/exchange.ts
@@ -125,23 +125,24 @@ export class TalerExchangeHttpClient {
private cacheEvictor: CacheEvictor<TalerExchangeCacheEviction>;
private preventCompression: boolean;
private cancelationToken: CancellationToken;
- private longPollQueue: LongpollQueue
+ private longPollQueue: LongpollQueue;
constructor(
readonly baseUrl: string,
params: {
- httpClient?: HttpRequestLibrary,
- cacheEvictor?: CacheEvictor<TalerExchangeCacheEviction>,
- preventCompression?: boolean,
- cancelationToken?: CancellationToken,
- longPollQueue?: LongpollQueue
- }
+ httpClient?: HttpRequestLibrary;
+ cacheEvictor?: CacheEvictor<TalerExchangeCacheEviction>;
+ preventCompression?: boolean;
+ cancelationToken?: CancellationToken;
+ longPollQueue?: LongpollQueue;
+ },
) {
this.httpLib = params.httpClient ?? createPlatformHttpLib();
this.cacheEvictor = params.cacheEvictor ?? nullEvictor;
this.preventCompression = !!params.preventCompression;
- this.cancelationToken = params.cancelationToken ?? CancellationToken.CONTINUE;
- this.longPollQueue = params.longPollQueue ?? new LongpollQueue()
+ this.cancelationToken =
+ params.cancelationToken ?? CancellationToken.CONTINUE;
+ this.longPollQueue = params.longPollQueue ?? new LongpollQueue();
}
isCompatible(version: string): boolean {
@@ -149,21 +150,32 @@ export class TalerExchangeHttpClient {
return compare?.compatible ?? false;
}
- private async fetch(url_or_path: URL | string, opts: HttpRequestOptions = {}, longpoll: boolean = false): Promise<HttpResponse> {
- const url = typeof url_or_path == 'string' ? new URL(url_or_path, this.baseUrl) : url_or_path;
+ private async fetch(
+ url_or_path: URL | string,
+ opts: HttpRequestOptions = {},
+ longpoll: boolean = false,
+ ): Promise<HttpResponse> {
+ const url =
+ typeof url_or_path == "string"
+ ? new URL(url_or_path, this.baseUrl)
+ : url_or_path;
if (longpoll || url.searchParams.has("timeout_ms")) {
- return this.longPollQueue.run(url, this.cancelationToken, async (timeoutMs) => {
- url.searchParams.set("timeout_ms", String(timeoutMs))
- return this.httpLib.fetch(url.href, {
- cancellationToken: this.cancelationToken,
- ...opts
- })
- })
+ return this.longPollQueue.run(
+ url,
+ this.cancelationToken,
+ async (timeoutMs) => {
+ url.searchParams.set("timeout_ms", String(timeoutMs));
+ return this.httpLib.fetch(url.href, {
+ cancellationToken: this.cancelationToken,
+ ...opts,
+ });
+ },
+ );
} else {
return this.httpLib.fetch(url.href, {
cancellationToken: this.cancelationToken,
- ...opts
- })
+ ...opts,
+ });
}
}
@@ -188,7 +200,7 @@ export class TalerExchangeHttpClient {
| OperationOk<Uint8Array<ArrayBuffer>>
| OperationFail<HttpStatusCode.NotFound>
> {
- const resp = await this.fetch('seed');
+ const resp = await this.fetch("seed");
switch (resp.status) {
case HttpStatusCode.Ok:
const buffer = await resp.bytes();
@@ -208,7 +220,7 @@ export class TalerExchangeHttpClient {
| OperationFail<HttpStatusCode.NotFound>
| OperationOk<ExchangeVersionResponse>
> {
- const resp = await this.fetch('config');
+ const resp = await this.fetch("config");
switch (resp.status) {
case HttpStatusCode.Ok: {
const minBody = await readSuccessResponseJsonOrThrow(
@@ -256,7 +268,7 @@ export class TalerExchangeHttpClient {
* PARTIALLY IMPLEMENTED!!
*/
async getKeys() {
- const resp = await this.fetch('keys');
+ const resp = await this.fetch("keys");
switch (resp.status) {
case HttpStatusCode.Ok:
return opSuccessFromHttp(resp, codecForExchangeKeysResponse());
@@ -573,9 +585,9 @@ export class TalerExchangeHttpClient {
*/
async getPurseStatusAtMerge(
pursePub: string,
- longpoll: boolean = false
+ longpoll: boolean = false,
): Promise<
- OperationOk<ExchangePurseStatus>
+ | OperationOk<ExchangePurseStatus>
| OperationFail<HttpStatusCode.NotFound>
| OperationFail<HttpStatusCode.Gone>
> {
@@ -597,9 +609,9 @@ export class TalerExchangeHttpClient {
*/
async getPurseStatusAtDeposit(
pursePub: string,
- longpoll: boolean = false
+ longpoll: boolean = false,
): Promise<
- OperationOk<ExchangePurseStatus>
+ | OperationOk<ExchangePurseStatus>
| OperationFail<HttpStatusCode.NotFound>
| OperationFail<HttpStatusCode.Gone>
> {
@@ -621,7 +633,7 @@ export class TalerExchangeHttpClient {
*/
async createPurseFromDeposit(
pursePub: string,
- body: any // FIXME
+ body: any, // FIXME
): Promise<
| OperationOk<void>
| OperationFail<HttpStatusCode.Forbidden>
@@ -631,21 +643,22 @@ export class TalerExchangeHttpClient {
> {
const resp = await this.fetch(`purses/${pursePub}/create`, {
method: "POST",
- body
+ body,
});
switch (resp.status) {
case HttpStatusCode.Ok:
// FIXME: parse PurseCreateSuccessResponse
return opSuccessFromHttp(resp, codecForAny());
case HttpStatusCode.Conflict:
- return opKnownAlternativeFailure(resp, resp.status, codecForPurseConflict())
+ return opKnownAlternativeFailure(
+ resp,
+ resp.status,
+ codecForPurseConflict(),
+ );
case HttpStatusCode.Forbidden:
case HttpStatusCode.NotFound:
case HttpStatusCode.TooEarly:
- return opKnownHttpFailure(
- resp.status,
- resp
- );
+ return opKnownHttpFailure(resp.status, resp);
default:
return opUnknownHttpFailure(resp);
}
@@ -657,9 +670,9 @@ export class TalerExchangeHttpClient {
*/
async deletePurse(
pursePub: string,
- purseSig: string
+ purseSig: string,
): Promise<
- OperationOk<void>
+ | OperationOk<void>
| OperationFail<HttpStatusCode.Forbidden>
| OperationFail<HttpStatusCode.NotFound>
| OperationFail<HttpStatusCode.Conflict>
@@ -668,7 +681,7 @@ export class TalerExchangeHttpClient {
method: "DELETE",
headers: {
"taler-purse-signature": purseSig,
- }
+ },
});
switch (resp.status) {
case HttpStatusCode.NoContent:
@@ -689,24 +702,24 @@ export class TalerExchangeHttpClient {
*/
async postPurseMerge(
pursePub: string,
- body: ExchangePurseMergeRequest
+ body: ExchangePurseMergeRequest,
): Promise<
- OperationOk<ExchangeMergeSuccessResponse>
+ | OperationOk<ExchangeMergeSuccessResponse>
| OperationAlternative<
- HttpStatusCode.UnavailableForLegalReasons,
- LegitimizationNeededResponse
- >
+ HttpStatusCode.UnavailableForLegalReasons,
+ LegitimizationNeededResponse
+ >
| OperationAlternative<
- HttpStatusCode.Conflict,
- ExchangeMergeConflictResponse
- >
+ HttpStatusCode.Conflict,
+ ExchangeMergeConflictResponse
+ >
| OperationFail<HttpStatusCode.Forbidden>
| OperationFail<HttpStatusCode.NotFound>
| OperationFail<HttpStatusCode.Gone>
> {
const resp = await this.fetch(`purses/${pursePub}/merge`, {
method: "POST",
- body
+ body,
});
switch (resp.status) {
case HttpStatusCode.Ok:
@@ -738,24 +751,21 @@ export class TalerExchangeHttpClient {
*/
async createPurseFromReserve(
pursePub: string,
- body: ExchangeReservePurseRequest
+ body: ExchangeReservePurseRequest,
): Promise<
| OperationOk<void>
| OperationFail<HttpStatusCode.PaymentRequired>
| OperationFail<HttpStatusCode.Forbidden>
| OperationFail<HttpStatusCode.NotFound>
+ | OperationAlternative<HttpStatusCode.Conflict, PurseConflictPartial>
| OperationAlternative<
- HttpStatusCode.Conflict,
- PurseConflictPartial
- >
- | OperationAlternative<
- HttpStatusCode.UnavailableForLegalReasons,
- LegitimizationNeededResponse
- >
+ HttpStatusCode.UnavailableForLegalReasons,
+ LegitimizationNeededResponse
+ >
> {
const resp = await this.fetch(`reserves/${pursePub}/purse`, {
method: "POST",
- body
+ body,
});
switch (resp.status) {
case HttpStatusCode.Ok:
@@ -787,9 +797,9 @@ export class TalerExchangeHttpClient {
*
*/
async getContract(
- pursePub: string
+ pursePub: string,
): Promise<
- OperationOk<ExchangeGetContractResponse>
+ | OperationOk<ExchangeGetContractResponse>
| OperationFail<HttpStatusCode.NotFound>
> {
const resp = await this.fetch(`contracts/${pursePub}`);
@@ -797,10 +807,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.Ok:
return opSuccessFromHttp(resp, codecForExchangeGetContractResponse());
case HttpStatusCode.NotFound:
- return opKnownHttpFailure(
- resp.status,
- resp
- );
+ return opKnownHttpFailure(resp.status, resp);
default:
return opUnknownHttpFailure(resp);
}
@@ -814,7 +821,7 @@ export class TalerExchangeHttpClient {
pursePub: string,
body: ExchangePurseDeposits,
): Promise<
- OperationOk<void>
+ | OperationOk<void>
| OperationAlternative<HttpStatusCode.Conflict, PurseConflict>
| OperationFail<HttpStatusCode.Forbidden>
| OperationFail<HttpStatusCode.NotFound>
@@ -829,14 +836,15 @@ export class TalerExchangeHttpClient {
// FIXME: parse PurseDepositSuccessResponse
return opSuccessFromHttp(resp, codecForAny());
case HttpStatusCode.Conflict:
- return opKnownAlternativeFailure(resp, resp.status, codecForPurseConflict());
+ return opKnownAlternativeFailure(
+ resp,
+ resp.status,
+ codecForPurseConflict(),
+ );
case HttpStatusCode.Forbidden:
case HttpStatusCode.NotFound:
case HttpStatusCode.Gone:
- return opKnownHttpFailure(
- resp.status,
- resp
- );
+ return opKnownHttpFailure(resp.status, resp);
default:
return opUnknownHttpFailure(resp);
}
@@ -915,18 +923,29 @@ export class TalerExchangeHttpClient {
url.searchParams.set("await_auth", params.awaitAuth ? "YES" : "NO");
}
- const signature = typeof signingKey === 'string' ? signingKey : encodeCrock(signKycAuth(signingKey));
-
- const resp = await this.fetch(url, {
- headers: {
- "Account-Owner-Signature": signature,
- }
- }, longpoll);
+ const signature =
+ typeof signingKey === "string"
+ ? signingKey
+ : encodeCrock(signKycAuth(signingKey));
+
+ const resp = await this.fetch(
+ url,
+ {
+ headers: {
+ "Account-Owner-Signature": signature,
+ },
+ },
+ longpoll,
+ );
switch (resp.status) {
case HttpStatusCode.Ok:
case HttpStatusCode.Accepted:
- return opKnownAlternativeFailure(resp, resp.status, codecForAccountKycStatus());
+ return opKnownAlternativeFailure(
+ resp,
+ resp.status,
+ codecForAccountKycStatus(),
+ );
case HttpStatusCode.NoContent:
return opEmptySuccess(resp);
case HttpStatusCode.Forbidden:
@@ -945,14 +964,18 @@ export class TalerExchangeHttpClient {
async checkKycInfo(
token: AccessToken,
known: KycRequirementInformationId[],
- longpoll: boolean = false
+ longpoll: boolean = false,
) {
- const resp = await this.fetch(`kyc-info/${token}`, {
- method: "GET",
- headers: {
- "If-None-Match": known.length ? known.join(",") : undefined,
+ const resp = await this.fetch(
+ `kyc-info/${token}`,
+ {
+ method: "GET",
+ headers: {
+ "If-None-Match": known.length ? known.join(",") : undefined,
+ },
},
- }, longpoll);
+ longpoll,
+ );
switch (resp.status) {
case HttpStatusCode.Ok:
return opSuccessFromHttp(resp, codecForKycProcessClientInformation());
@@ -995,7 +1018,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.PayloadTooLarge:
return opKnownHttpFailure(resp.status, resp);
default:
- return opUnknownHttpFailure(resp)
+ return opUnknownHttpFailure(resp);
}
}
@@ -1009,7 +1032,7 @@ export class TalerExchangeHttpClient {
) {
const resp = await this.fetch(`kyc-start/${requirement}`, {
method: "POST",
- body
+ body,
});
switch (resp.status) {
case HttpStatusCode.Ok:
@@ -1019,7 +1042,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.PayloadTooLarge:
return opKnownHttpFailure(resp.status, resp);
default:
- return opUnknownHttpFailure(resp)
+ return opUnknownHttpFailure(resp);
}
}
@@ -1032,10 +1055,13 @@ export class TalerExchangeHttpClient {
state: string,
code: string,
) {
- const resp = await this.fetch(`kyc-proof/${provider}?state=${state}&code=${code}`, {
- method: "GET",
- redirect: "manual",
- });
+ const resp = await this.fetch(
+ `kyc-proof/${provider}?state=${state}&code=${code}`,
+ {
+ method: "GET",
+ redirect: "manual",
+ },
+ );
switch (resp.status) {
case HttpStatusCode.SeeOther:
@@ -1043,7 +1069,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.NotFound:
return opKnownHttpFailure(resp.status, resp);
default:
- return opUnknownHttpFailure(resp)
+ return opUnknownHttpFailure(resp);
}
}
@@ -1073,7 +1099,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.Forbidden:
return opKnownHttpFailure(resp.status, resp);
default:
- return opUnknownHttpFailure(resp)
+ return opUnknownHttpFailure(resp);
}
}
@@ -1114,7 +1140,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.Forbidden:
return opKnownHttpFailure(resp.status, resp);
default:
- return opUnknownHttpFailure(resp)
+ return opUnknownHttpFailure(resp);
}
}
@@ -1164,7 +1190,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.Conflict:
return opKnownHttpFailure(resp.status, resp);
default:
- return opUnknownHttpFailure(resp)
+ return opUnknownHttpFailure(resp);
}
}
@@ -1198,7 +1224,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.Conflict:
return opKnownHttpFailure(resp.status, resp);
default:
- return opUnknownHttpFailure(resp)
+ return opUnknownHttpFailure(resp);
}
}
@@ -1237,7 +1263,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.Conflict:
return opKnownHttpFailure(resp.status, resp);
default:
- return opUnknownHttpFailure(resp)
+ return opUnknownHttpFailure(resp);
}
}
@@ -1275,7 +1301,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.Conflict:
return opKnownHttpFailure(resp.status, resp);
default:
- return opUnknownHttpFailure(resp)
+ return opUnknownHttpFailure(resp);
}
}
@@ -1313,7 +1339,7 @@ export class TalerExchangeHttpClient {
case HttpStatusCode.Conflict:
return opKnownHttpFailure(resp.status, resp);
default:
- return opUnknownHttpFailure(resp)
+ return opUnknownHttpFailure(resp);
}
}