taler-typescript-core

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

commit 1516e6ea13de77263243e21c65a0c92b9211708e
parent a109981752e5fe9e9862cf3d21169c350e264a78
Author: Florian Dold <florian@dold.me>
Date:   Tue, 25 Feb 2025 13:17:26 +0100

factor out Headers into interface to avoid class import issues

Diffstat:
Mpackages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx | 4+++-
Mpackages/taler-util/src/http-common.ts | 10++++++++--
Mpackages/taler-util/src/http-impl.node.ts | 4++--
Mpackages/taler-util/src/http-impl.qtart.ts | 4++--
Mpackages/web-util/src/utils/http-impl.browser.ts | 27+++++++++++++++------------
Mpackages/web-util/src/utils/http-impl.sw.ts | 14+++++---------
6 files changed, 35 insertions(+), 28 deletions(-)

diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx @@ -42,6 +42,7 @@ import { useSessionContext } from "../../../../context/session.js"; import { Notification } from "../../../../utils/types.js"; import { CreatePage } from "./CreatePage.js"; import { BasicOrTokenAuth } from "@gnu-taler/taler-util"; +import type { HttpRequestLibrary, HeadersImpl } from "@gnu-taler/taler-util/http"; export type Entity = TalerMerchantApi.AccountAddDetails; interface Props { @@ -104,9 +105,10 @@ export async function testRevenueAPI( | OperationFail<HttpStatusCode.BadRequest> | TalerError > { + const httpLib: HttpRequestLibrary = new BrowserFetchHttpLib(); const api = new TalerRevenueHttpClient( revenueAPI.href, - new BrowserFetchHttpLib(), + httpLib, ); const auth: BasicOrTokenAuth | undefined = creds === undefined diff --git a/packages/taler-util/src/http-common.ts b/packages/taler-util/src/http-common.ts @@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL3.0-or-later */ -import type { CancellationToken } from "./CancellationToken.js"; +import { CancellationToken } from "@gnu-taler/taler-util"; import { Codec } from "./codec.js"; import { j2s } from "./helpers.js"; import { @@ -76,7 +76,13 @@ export interface HttpRequestOptions { /** * Headers, roughly modeled after the fetch API's headers object. */ -export class Headers { +export interface Headers { + get(name: string): string | null; + set(name: string, value: string): void; + toJSON(): any; +} + +export class HeadersImpl { private headerMap = new Map<string, string>(); get(name: string): string | null { diff --git a/packages/taler-util/src/http-impl.node.ts b/packages/taler-util/src/http-impl.node.ts @@ -28,7 +28,7 @@ import { TalerError } from "./errors.js"; import { HttpLibArgs, encodeBody, getDefaultHeaders } from "./http-common.js"; import { DEFAULT_REQUEST_TIMEOUT_MS, - Headers, + HeadersImpl, HttpRequestLibrary, HttpRequestOptions, HttpResponse, @@ -210,7 +210,7 @@ export class HttpLibImpl implements HttpRequestLibrary { chunks.push(d); }); res.on("end", () => { - const headers: Headers = new Headers(); + const headers: HeadersImpl = new HeadersImpl(); for (const [k, v] of Object.entries(res.headers)) { if (!v) { continue; diff --git a/packages/taler-util/src/http-impl.qtart.ts b/packages/taler-util/src/http-impl.qtart.ts @@ -23,7 +23,7 @@ import { j2s, Logger, openPromise } from "@gnu-taler/taler-util"; import { TalerError } from "./errors.js"; import { encodeBody, getDefaultHeaders, HttpLibArgs } from "./http-common.js"; import { - Headers, + HeadersImpl, HttpRequestLibrary, HttpRequestOptions, HttpResponse, @@ -186,7 +186,7 @@ export class HttpLibImpl implements HttpRequestLibrary { cancelCancelledHandler(); } - const headers: Headers = new Headers(); + const headers: HeadersImpl = new HeadersImpl(); if (res.headers) { for (const headerStr of res.headers) { diff --git a/packages/web-util/src/utils/http-impl.browser.ts b/packages/web-util/src/utils/http-impl.browser.ts @@ -18,22 +18,22 @@ * Imports. */ import { + Duration, Logger, RequestThrottler, - TalerErrorCode, TalerError, - Duration, + TalerErrorCode, } from "@gnu-taler/taler-util"; import { + DEFAULT_REQUEST_TIMEOUT_MS, + HeadersImpl, + HttpLibArgs, HttpRequestLibrary, HttpRequestOptions, HttpResponse, - Headers, - getDefaultHeaders, encodeBody, - DEFAULT_REQUEST_TIMEOUT_MS, - HttpLibArgs, + getDefaultHeaders, } from "@gnu-taler/taler-util/http"; const logger = new Logger("browserHttpLib"); @@ -41,7 +41,7 @@ const logger = new Logger("browserHttpLib"); /** * An implementation of the [[HttpRequestLibrary]] using the * browser's XMLHttpRequest. - * + * * @deprecated use BrowserFetchHttpLib */ export class BrowserHttpLibDepreacted implements HttpRequestLibrary { @@ -88,7 +88,9 @@ export class BrowserHttpLibDepreacted implements HttpRequestLibrary { } let myBody: ArrayBuffer | undefined = - requestMethod === "POST" || requestMethod === "PUT" || requestMethod === "PATCH" + requestMethod === "POST" || + requestMethod === "PUT" || + requestMethod === "PATCH" ? encodeBody(requestBody) : undefined; @@ -96,8 +98,8 @@ export class BrowserHttpLibDepreacted implements HttpRequestLibrary { if (requestHeader) { Object.entries(requestHeader).forEach(([key, value]) => { if (value === undefined) return; - requestHeadersMap[key] = value - }) + requestHeadersMap[key] = value; + }); } return new Promise<HttpResponse>((resolve, reject) => { @@ -129,7 +131,8 @@ export class BrowserHttpLibDepreacted implements HttpRequestLibrary { { requestUrl, requestMethod, - timeoutMs: requestTimeout.d_ms === "forever" ? 0 : requestTimeout.d_ms + timeoutMs: + requestTimeout.d_ms === "forever" ? 0 : requestTimeout.d_ms, }, `request to ${requestUrl} timed out`, ), @@ -199,7 +202,7 @@ export class BrowserHttpLibDepreacted implements HttpRequestLibrary { const arr = headers.trim().split(/[\r\n]+/); // Create a map of header names to values - const headerMap: Headers = new Headers(); + const headerMap: HeadersImpl = new HeadersImpl(); arr.forEach(function (line) { const parts = line.split(": "); const headerName = parts.shift(); diff --git a/packages/web-util/src/utils/http-impl.sw.ts b/packages/web-util/src/utils/http-impl.sw.ts @@ -26,11 +26,10 @@ import { import { DEFAULT_REQUEST_TIMEOUT_MS, - Headers, + HeadersImpl, HttpLibArgs, HttpRequestLibrary, HttpRequestOptions, - HttpResponse, encodeBody, getDefaultHeaders, } from "@gnu-taler/taler-util/http"; @@ -49,10 +48,7 @@ export class BrowserFetchHttpLib implements HttpRequestLibrary { this.requireTls = args?.requireTls ?? false; } - async fetch( - requestUrl: string, - options?: HttpRequestOptions, - ): Promise<HttpResponse> { + async fetch(requestUrl: string, options?: HttpRequestOptions) { const requestMethod = options?.method ?? "GET"; const requestBody = options?.body; const requestHeader = options?.headers; @@ -105,9 +101,9 @@ export class BrowserFetchHttpLib implements HttpRequestLibrary { * auto generated */ if (requestBody instanceof FormData) { - delete requestHeadersMap["Content-Type"] + delete requestHeadersMap["Content-Type"]; } else if (requestBody instanceof URLSearchParams) { - requestHeadersMap["Content-Type"] = "application/x-www-form-urlencoded" + requestHeadersMap["Content-Type"] = "application/x-www-form-urlencoded"; } const controller = new AbortController(); @@ -136,7 +132,7 @@ export class BrowserFetchHttpLib implements HttpRequestLibrary { clearTimeout(timeoutId); } - const headerMap = new Headers(); + const headerMap = new HeadersImpl(); response.headers.forEach((value, key) => { headerMap.set(key, value); });