diff options
Diffstat (limited to 'packages/web-util/src/context')
-rw-r--r-- | packages/web-util/src/context/activity.ts | 5 | ||||
-rw-r--r-- | packages/web-util/src/context/bank-api.ts | 47 | ||||
-rw-r--r-- | packages/web-util/src/context/merchant-api.ts | 64 |
3 files changed, 68 insertions, 48 deletions
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<T, C> { } 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<BankContextType>(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<TalerBankConversionCacheEviction>; bank?: CacheEvictor<TalerCoreBankCacheEviction>; -} +}; type ConfigResult<T> = | 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<ConfigResult<TalerCorebankApi.Config>>(); + const [checked, setChecked] = + useState<ConfigResult<TalerCorebankApi.Config>>(); 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<BankLib, TalerCorebankApi.Config> { 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<TalerCorebankApi.Config> { + 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<ObservabilityEvent>; 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<TalerMerchantApi.VersionResponse> | undefined }>; + frameOnError: FunctionComponent<{ + state: ConfigResultFail<TalerMerchantApi.VersionResponse> | undefined; + }>; }): VNode => { const [checked, setChecked] = useState<ConfigResult<TalerMerchantApi.VersionResponse>>(); - 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<TalerMerchantApi.VersionResponse> { - 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, |