From 072ac43b9f69807b8514eb11f8214637561a2573 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 4 Apr 2024 16:24:55 -0300 Subject: fix some API differences including whatwg-url params --- packages/web-util/src/context/activity.ts | 5 +-- packages/web-util/src/context/bank-api.ts | 47 +++++++++++--------- packages/web-util/src/context/merchant-api.ts | 64 ++++++++++++++++----------- packages/web-util/src/utils/http-impl.sw.ts | 5 +-- 4 files changed, 70 insertions(+), 51 deletions(-) (limited to 'packages/web-util/src') diff --git a/packages/web-util/src/context/activity.ts b/packages/web-util/src/context/activity.ts index c38f133a1..9a16f6673 100644 --- a/packages/web-util/src/context/activity.ts +++ b/packages/web-util/src/context/activity.ts @@ -55,10 +55,9 @@ export interface APIClient { } export interface MerchantLib { - management: TalerMerchantManagementHttpClient; + instance: TalerMerchantManagementHttpClient; authenticate: TalerAuthenticationHttpClient; - instance: (instanceId: string) => TalerMerchantInstanceHttpClient; - impersonate: (instanceId: string) => TalerAuthenticationHttpClient; + subInstanceApi: (instanceId: string) => MerchantLib; } export interface BankLib { diff --git a/packages/web-util/src/context/bank-api.ts b/packages/web-util/src/context/bank-api.ts index a5e5654ac..d2938f150 100644 --- a/packages/web-util/src/context/bank-api.ts +++ b/packages/web-util/src/context/bank-api.ts @@ -25,7 +25,7 @@ import { TalerCoreBankCacheEviction, TalerCoreBankHttpClient, TalerCorebankApi, - TalerError + TalerError, } from "@gnu-taler/taler-util"; import { ComponentChildren, @@ -56,7 +56,8 @@ export type BankContextType = { // @ts-expect-error default value to undefined, should it be another thing? const BankContext = createContext(undefined); -export const useBankCoreApiContext = (): BankContextType => useContext(BankContext); +export const useBankCoreApiContext = (): BankContextType => + useContext(BankContext); enum VersionHint { NONE, @@ -65,7 +66,7 @@ enum VersionHint { type Evictors = { conversion?: CacheEvictor; bank?: CacheEvictor; -} +}; type ConfigResult = | undefined @@ -81,13 +82,15 @@ export const BankApiProvider = ({ }: { baseUrl: URL; children: ComponentChildren; - evictors?: Evictors, + evictors?: Evictors; frameOnError: FunctionComponent<{ children: ComponentChildren }>; }): VNode => { - const [checked, setChecked] = useState>(); + const [checked, setChecked] = + useState>(); const { i18n } = useTranslationContext(); - const { getRemoteConfig, VERSION, lib, cancelRequest, onActivity } = buildBankApiClient(baseUrl, evictors); + const { getRemoteConfig, VERSION, lib, cancelRequest, onActivity } = + buildBankApiClient(baseUrl, evictors); useEffect(() => { getRemoteConfig() @@ -110,7 +113,9 @@ export const BankApiProvider = ({ }, []); if (checked === undefined) { - return h(frameOnError, { children: h("div", {}, "checking compatibility with server...") }); + return h(frameOnError, { + children: h("div", {}, "checking compatibility with server..."), + }); } if (checked.type === "error") { return h(frameOnError, { @@ -141,7 +146,9 @@ export const BankApiProvider = ({ }); }; -function buildBankApiClient(url: URL, evictors: Evictors, +function buildBankApiClient( + url: URL, + evictors: Evictors, ): APIClient { const httpFetch = new BrowserFetchHttpLib({ enableThrottling: true, @@ -154,11 +161,7 @@ function buildBankApiClient(url: URL, evictors: Evictors, }, }); - const bank = new TalerCoreBankHttpClient( - url.href, - httpLib, - evictors.bank, - ); + const bank = new TalerCoreBankHttpClient(url.href, httpLib, evictors.bank); const conversion = new TalerBankConversionHttpClient( bank.getConversionInfoAPI().href, httpLib, @@ -170,32 +173,36 @@ function buildBankApiClient(url: URL, evictors: Evictors, httpLib, ); - async function getRemoteConfig() { - const resp = await bank.getConfig() - return resp.body + async function getRemoteConfig(): Promise { + const resp = await bank.getConfig(); + if (resp.type === "fail") { + throw TalerError.fromUncheckedDetail(resp.detail); + } + return resp.body; } return { getRemoteConfig, VERSION: bank.PROTOCOL_VERSION, lib: { - bank, conversion, auth + bank, + conversion, + auth, }, onActivity: tracker.subscribe, cancelRequest: httpLib.cancelRequest, }; } - export const BankApiProviderTesting = ({ children, value, }: { - value: BankContextType + value: BankContextType; children: ComponentChildren; }): VNode => { return h(BankContext.Provider, { value, children, }); -} +}; diff --git a/packages/web-util/src/context/merchant-api.ts b/packages/web-util/src/context/merchant-api.ts index 9e2869b62..26d9c9e85 100644 --- a/packages/web-util/src/context/merchant-api.ts +++ b/packages/web-util/src/context/merchant-api.ts @@ -23,7 +23,6 @@ import { TalerError, TalerMerchantApi, TalerMerchantInstanceCacheEviction, - TalerMerchantInstanceHttpClient, TalerMerchantManagementCacheEviction, TalerMerchantManagementHttpClient, } from "@gnu-taler/taler-util"; @@ -35,14 +34,13 @@ import { h, } from "preact"; import { useContext, useEffect, useState } from "preact/hooks"; +import { BrowserFetchHttpLib } from "../index.browser.js"; import { APIClient, ActiviyTracker, MerchantLib, Subscriber, } from "./activity.js"; -import { useTranslationContext } from "./translation.js"; -import { BrowserFetchHttpLib, ErrorLoading } from "../index.browser.js"; /** * @@ -56,6 +54,7 @@ export type MerchantContextType = { hints: VersionHint[]; onActivity: Subscriber; cancelRequest: (eventId: string) => void; + changeBackend: (url: URL) => void; }; // FIXME: below @@ -94,14 +93,17 @@ export const MerchantApiProvider = ({ baseUrl: URL; evictors?: Evictors; children: ComponentChildren; - frameOnError: FunctionComponent<{ state: ConfigResultFail | undefined }>; + frameOnError: FunctionComponent<{ + state: ConfigResultFail | undefined; + }>; }): VNode => { const [checked, setChecked] = useState>(); - const { i18n } = useTranslationContext(); + + const [merchantEndpoint, changeMerchantEndpoint] = useState(baseUrl); const { getRemoteConfig, VERSION, lib, cancelRequest, onActivity } = - buildMerchantApiClient(baseUrl, evictors); + buildMerchantApiClient(merchantEndpoint, evictors); useEffect(() => { getRemoteConfig() @@ -128,11 +130,12 @@ export const MerchantApiProvider = ({ } const value: MerchantContextType = { - url: baseUrl, + url: merchantEndpoint, config: checked.config, onActivity: onActivity, lib, cancelRequest, + changeBackend: changeMerchantEndpoint, hints: checked.hints, }; return h(MerchantContext.Provider, { @@ -157,40 +160,51 @@ function buildMerchantApiClient( }, }); - const management = new TalerMerchantManagementHttpClient( + const instance = new TalerMerchantManagementHttpClient( url.href, httpLib, evictors.management, ); - const instance = (instanceId: string) => - new TalerMerchantInstanceHttpClient( - management.getSubInstanceAPI(instanceId).href, - httpLib, - evictors.instance ? evictors.instance(instanceId) : undefined, - ); const authenticate = new TalerAuthenticationHttpClient( - management.getAuthenticationAPI().href, + instance.getAuthenticationAPI().href, httpLib, ); - const impersonate = (instanceId: string) => - new TalerAuthenticationHttpClient( - instance(instanceId).getAuthenticationAPI().href, - httpLib, - ); + + // const instance = (instanceId: string): TalerMerchantInstanceHttpClient => { + // return new TalerMerchantInstanceHttpClient( + // management.getSubInstanceAPI(instanceId).href, + // httpLib, + // evictors.instance ? evictors.instance(instanceId) : undefined, + // ); + // } + // const impersonate = (instanceId: string): TalerAuthenticationHttpClient => { + // return new TalerAuthenticationHttpClient( + // instance(instanceId).getAuthenticationAPI().href, + // httpLib, + // ); + // } + const rootUrl = url; + function getSubInstanceAPI(instanceId: string): MerchantLib { + const newURL = new URL(`instance/${instanceId}/`, rootUrl); + const api = buildMerchantApiClient(newURL, evictors); + return api.lib; + } async function getRemoteConfig(): Promise { - const resp = await management.getConfig(); + const resp = await instance.getConfig(); + if (resp.type === "fail") { + throw TalerError.fromUncheckedDetail(resp.detail) + } return resp.body; } return { getRemoteConfig, - VERSION: management.PROTOCOL_VERSION, + VERSION: instance.PROTOCOL_VERSION, lib: { - management, - authenticate, - impersonate, instance, + authenticate, + subInstanceApi: getSubInstanceAPI, }, onActivity: tracker.subscribe, cancelRequest: httpLib.cancelRequest, diff --git a/packages/web-util/src/utils/http-impl.sw.ts b/packages/web-util/src/utils/http-impl.sw.ts index 4d7f3a8a1..3c4b8b587 100644 --- a/packages/web-util/src/utils/http-impl.sw.ts +++ b/packages/web-util/src/utils/http-impl.sw.ts @@ -18,11 +18,10 @@ * Imports. */ import { + Duration, RequestThrottler, - TalerErrorCode, TalerError, - Duration, - CancellationToken, + TalerErrorCode } from "@gnu-taler/taler-util"; import { -- cgit v1.2.3