taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 177cf3a085657ba597ca3ed026d8a68c5688ba71
parent 66ecbf769699444811bb899c7b932d302ce462f7
Author: Florian Dold <florian@dold.me>
Date:   Sun, 27 Apr 2025 15:41:58 +0200

-formatting

Diffstat:
Mpackages/taler-util/src/http-client/exchange.ts | 218++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
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); } }