diff --git a/packages/taler-util/src/index.ts b/packages/taler-util/src/index.ts index 2e1c68765..3e49cea10 100644 --- a/packages/taler-util/src/index.ts +++ b/packages/taler-util/src/index.ts @@ -19,3 +19,4 @@ export * from "./transactionsTypes.js"; export * from "./walletTypes.js"; export * from "./i18n.js"; export * from "./logging.js"; +export * from "./url.js"; diff --git a/packages/taler-util/src/url.ts b/packages/taler-util/src/url.ts index b50b4b466..a52d80362 100644 --- a/packages/taler-util/src/url.ts +++ b/packages/taler-util/src/url.ts @@ -56,6 +56,21 @@ export interface URLCtor { new (url: string, base?: string | URL): URL; } +// globalThis polyfill, see https://mathiasbynens.be/notes/globalthis +(function () { + if (typeof globalThis === "object") return; + Object.defineProperty(Object.prototype, "__magic__", { + get: function () { + return this; + }, + configurable: true, // This makes it possible to `delete` the getter later. + }); + // @ts-ignore: polyfill magic + __magic__.globalThis = __magic__; // lolwat + // @ts-ignore: polyfill magic + delete Object.prototype.__magic__; +})(); + // @ts-ignore const _URL = globalThis.URL; if (!_URL) { diff --git a/packages/taler-wallet-cli/src/integrationtests/libeufin.ts b/packages/taler-wallet-cli/src/integrationtests/libeufin.ts index 4b14cc02e..eb501f57c 100644 --- a/packages/taler-wallet-cli/src/integrationtests/libeufin.ts +++ b/packages/taler-wallet-cli/src/integrationtests/libeufin.ts @@ -18,7 +18,7 @@ * Imports. */ import axios from "axios"; -import { URL } from "@gnu-taler/taler-wallet-core"; +import { URL } from "@gnu-taler/taler-util"; import { getRandomIban, getRandomString } from "./helpers"; import { GlobalTestState, diff --git a/packages/taler-wallet-cli/src/integrationtests/sync.ts b/packages/taler-wallet-cli/src/integrationtests/sync.ts index 695f9a47e..73d3c9ddf 100644 --- a/packages/taler-wallet-cli/src/integrationtests/sync.ts +++ b/packages/taler-wallet-cli/src/integrationtests/sync.ts @@ -18,7 +18,7 @@ * Imports. */ import axios from "axios"; -import { URL } from "@gnu-taler/taler-wallet-core"; +import { URL } from "@gnu-taler/taler-util"; import * as fs from "fs"; import * as util from "util"; import { diff --git a/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts b/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts index 4f3446f79..a5cdd8da4 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts @@ -27,8 +27,8 @@ import { BankApi, BankAccessApi, } from "./harness"; -import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; -import { ExchangesListRespose, TalerErrorCode } from "@gnu-taler/taler-util"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { ExchangesListRespose, URL, TalerErrorCode } from "@gnu-taler/taler-util"; import { FaultInjectedExchangeService, FaultInjectionResponseContext, diff --git a/packages/taler-wallet-cli/src/integrationtests/test-merchant-instances-delete.ts b/packages/taler-wallet-cli/src/integrationtests/test-merchant-instances-delete.ts index 09353715f..8b89b0768 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-merchant-instances-delete.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-merchant-instances-delete.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { URL } from "@gnu-taler/taler-wallet-core"; +import { URL } from "@gnu-taler/taler-util"; import axios from "axios"; import { ExchangeService, diff --git a/packages/taler-wallet-cli/src/integrationtests/test-merchant-instances.ts b/packages/taler-wallet-cli/src/integrationtests/test-merchant-instances.ts index 539203b95..73d4a0224 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-merchant-instances.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-merchant-instances.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { URL } from "@gnu-taler/taler-wallet-core"; +import { URL } from "@gnu-taler/taler-util"; import axios from "axios"; import { ExchangeService, diff --git a/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts b/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts index 04888ecc1..d91787637 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts @@ -23,9 +23,10 @@ import { PreparePayResultType, codecForMerchantOrderStatusUnpaid, ConfirmPayResultType, + URL } from "@gnu-taler/taler-util"; import axios from "axios"; -import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; /** * Run test for basic, bank-integrated withdrawal. diff --git a/packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts b/packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts index 4d4310993..53a6b1670 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts @@ -30,9 +30,9 @@ import { withdrawViaBank, SimpleTestEnvironment, } from "./helpers"; -import { durationFromSpec, PreparePayResultType } from "@gnu-taler/taler-util"; +import { URL, durationFromSpec, PreparePayResultType } from "@gnu-taler/taler-util"; import axios from "axios"; -import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; async function testRefundApiWithFulfillmentUrl( t: GlobalTestState, diff --git a/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts b/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts index 29e0fd0a6..709ad1061 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts @@ -22,8 +22,8 @@ /** * Imports. */ -import { PreparePayResultType, TalerErrorCode } from "@gnu-taler/taler-util"; -import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { URL, PreparePayResultType, TalerErrorCode } from "@gnu-taler/taler-util"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { FaultInjectionRequestContext, FaultInjectionResponseContext, diff --git a/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts b/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts index 3155898a5..1fb0b3c9c 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts @@ -26,10 +26,11 @@ import { PreparePayResultType, codecForMerchantOrderStatusUnpaid, ConfirmPayResultType, + URL, } from "@gnu-taler/taler-util"; import axios from "axios"; import { FaultInjectionRequestContext } from "./faultInjection"; -import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; /** * Run test for the wallets repurchase detection mechanism diff --git a/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts index 102c3c598..ce0502b2b 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts @@ -33,8 +33,9 @@ import { PreparePayResultType, TalerErrorCode, TalerErrorDetails, + URL, } from "@gnu-taler/taler-util"; -import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; /** * Run test for a payment where the merchant has a transient diff --git a/packages/taler-wallet-core/src/headless/NodeHttpLib.ts b/packages/taler-wallet-core/src/headless/NodeHttpLib.ts index 1dd207345..1186ea4d6 100644 --- a/packages/taler-wallet-core/src/headless/NodeHttpLib.ts +++ b/packages/taler-wallet-core/src/headless/NodeHttpLib.ts @@ -28,10 +28,9 @@ import { import { RequestThrottler } from "../util/RequestThrottler.js"; import Axios, { AxiosResponse } from "axios"; import { OperationFailedError, makeErrorDetails } from "../errors.js"; -import { URL } from "../util/url.js"; import { Logger } from "@gnu-taler/taler-util"; import { bytesToString } from "../crypto/talerCrypto.js"; -import { TalerErrorCode } from "@gnu-taler/taler-util"; +import { TalerErrorCode, URL } from "@gnu-taler/taler-util"; const logger = new Logger("NodeHttpLib.ts"); diff --git a/packages/taler-wallet-core/src/index.ts b/packages/taler-wallet-core/src/index.ts index 822c1aa2b..1c97bf7c2 100644 --- a/packages/taler-wallet-core/src/index.ts +++ b/packages/taler-wallet-core/src/index.ts @@ -22,7 +22,6 @@ export * from "./errors.js"; // Util functionality -export { URL } from "./util/url.js"; export * from "./util/promiseUtils.js"; export * from "./util/query.js"; export * from "./util/http.js"; diff --git a/packages/taler-wallet-core/src/operations/backup/index.ts b/packages/taler-wallet-core/src/operations/backup/index.ts index 8a0aad560..041c927a5 100644 --- a/packages/taler-wallet-core/src/operations/backup/index.ts +++ b/packages/taler-wallet-core/src/operations/backup/index.ts @@ -59,8 +59,8 @@ import { getTimestampNow, Timestamp, timestampAddDuration, + URL } from "@gnu-taler/taler-util"; -import { URL } from "../../util/url.js"; import { buildCodecForObject, Codec, diff --git a/packages/taler-wallet-core/src/operations/deposits.ts b/packages/taler-wallet-core/src/operations/deposits.ts index 5051fd32a..9dee7557c 100644 --- a/packages/taler-wallet-core/src/operations/deposits.ts +++ b/packages/taler-wallet-core/src/operations/deposits.ts @@ -36,6 +36,7 @@ import { timestampTruncateToSecond, TrackDepositGroupRequest, TrackDepositGroupResponse, + URL } from "@gnu-taler/taler-util"; import { InternalWalletState } from "../common.js"; import { kdf } from "../crypto/primitives/kdf.js"; @@ -49,7 +50,6 @@ import { guardOperationException } from "../errors.js"; import { selectPayCoins } from "../util/coinSelection.js"; import { readSuccessResponseJsonOrThrow } from "../util/http.js"; import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js"; -import { URL } from "../util/url.js"; import { getExchangeDetails } from "./exchanges.js"; import { applyCoinSpend, diff --git a/packages/taler-wallet-core/src/operations/exchanges.ts b/packages/taler-wallet-core/src/operations/exchanges.ts index 65cc8f5e9..85455cf9c 100644 --- a/packages/taler-wallet-core/src/operations/exchanges.ts +++ b/packages/taler-wallet-core/src/operations/exchanges.ts @@ -37,6 +37,7 @@ import { parsePaytoUri, Recoup, TalerErrorCode, + URL, TalerErrorDetails, Timestamp, } from "@gnu-taler/taler-util"; @@ -59,7 +60,6 @@ import { } from "../util/http.js"; import { DbAccess, GetReadOnlyAccess } from "../util/query.js"; import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js"; -import { URL } from "../util/url.js"; import { guardOperationException, makeErrorDetails, diff --git a/packages/taler-wallet-core/src/operations/pay.ts b/packages/taler-wallet-core/src/operations/pay.ts index 2a9bf154e..464c3136f 100644 --- a/packages/taler-wallet-core/src/operations/pay.ts +++ b/packages/taler-wallet-core/src/operations/pay.ts @@ -51,6 +51,7 @@ import { PreparePayResultType, parsePayUri, Logger, + URL, getDurationRemaining, } from "@gnu-taler/taler-util"; import { encodeCrock, getRandomBytes } from "../crypto/talerCrypto.js"; @@ -99,7 +100,6 @@ import { OperationFailedAndReportedError, OperationFailedError, } from "../errors.js"; -import { URL } from "../util/url.js"; /** * Logger. diff --git a/packages/taler-wallet-core/src/operations/recoup.ts b/packages/taler-wallet-core/src/operations/recoup.ts index 402111129..4510bda10 100644 --- a/packages/taler-wallet-core/src/operations/recoup.ts +++ b/packages/taler-wallet-core/src/operations/recoup.ts @@ -45,9 +45,8 @@ import { } from "../db.js"; import { readSuccessResponseJsonOrThrow } from "../util/http.js"; -import { Logger } from "@gnu-taler/taler-util"; +import { Logger, URL } from "@gnu-taler/taler-util"; import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js"; -import { URL } from "../util/url.js"; import { guardOperationException } from "../errors.js"; import { createRefreshGroup, processRefreshGroup } from "./refresh.js"; import { getReserveRequestTimeout, processReserve } from "./reserves.js"; diff --git a/packages/taler-wallet-core/src/operations/refresh.ts b/packages/taler-wallet-core/src/operations/refresh.ts index 06d735645..cf8b4ddde 100644 --- a/packages/taler-wallet-core/src/operations/refresh.ts +++ b/packages/taler-wallet-core/src/operations/refresh.ts @@ -50,8 +50,8 @@ import { timestampAddDuration, timestampDifference, timestampMin, + URL, } from "@gnu-taler/taler-util"; -import { URL } from "../util/url.js"; import { guardOperationException } from "../errors.js"; import { updateExchangeFromUrl } from "./exchanges.js"; import { EXCHANGE_COINS_LOCK, InternalWalletState } from "../common.js"; diff --git a/packages/taler-wallet-core/src/operations/refund.ts b/packages/taler-wallet-core/src/operations/refund.ts index 09006b811..4ea80689c 100644 --- a/packages/taler-wallet-core/src/operations/refund.ts +++ b/packages/taler-wallet-core/src/operations/refund.ts @@ -42,6 +42,7 @@ import { RefreshReason, TalerErrorCode, TalerErrorDetails, + URL, timestampAddDuration, } from "@gnu-taler/taler-util"; import { @@ -56,7 +57,6 @@ import { readSuccessResponseJsonOrThrow } from "../util/http.js"; import { checkDbInvariant } from "../util/invariants.js"; import { GetReadWriteAccess } from "../util/query.js"; import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js"; -import { URL } from "../util/url.js"; import { guardOperationException } from "../errors.js"; import { createRefreshGroup, getTotalRefreshCost } from "./refresh.js"; import { InternalWalletState } from "../common.js"; diff --git a/packages/taler-wallet-core/src/operations/reserves.ts b/packages/taler-wallet-core/src/operations/reserves.ts index fca4d2143..162b5b405 100644 --- a/packages/taler-wallet-core/src/operations/reserves.ts +++ b/packages/taler-wallet-core/src/operations/reserves.ts @@ -64,13 +64,12 @@ import { getBankWithdrawalInfo, } from "./withdraw.js"; import { encodeCrock, getRandomBytes } from "../crypto/talerCrypto.js"; -import { Logger } from "@gnu-taler/taler-util"; +import { Logger, URL } from "@gnu-taler/taler-util"; import { readSuccessResponseJsonOrErrorCode, readSuccessResponseJsonOrThrow, throwUnexpectedRequestError, } from "../util/http.js"; -import { URL } from "../util/url.js"; import { GetReadOnlyAccess } from "../util/query.js"; const logger = new Logger("reserves.ts"); diff --git a/packages/taler-wallet-core/src/operations/testing.ts b/packages/taler-wallet-core/src/operations/testing.ts index 8a0c20200..c9786801b 100644 --- a/packages/taler-wallet-core/src/operations/testing.ts +++ b/packages/taler-wallet-core/src/operations/testing.ts @@ -31,11 +31,11 @@ import { IntegrationTestArgs, Amounts, TestPayArgs, + URL, PreparePayResultType, } from "@gnu-taler/taler-util"; import { createTalerWithdrawReserve } from "./reserves.js"; import { InternalWalletState } from "../common.js"; -import { URL } from "../util/url.js"; import { confirmPay, preparePayForUri } from "./pay.js"; import { getBalances } from "./balance.js"; import { runUntilDone } from "../wallet.js"; diff --git a/packages/taler-wallet-core/src/operations/tip.ts b/packages/taler-wallet-core/src/operations/tip.ts index 1da2c887a..892a3b588 100644 --- a/packages/taler-wallet-core/src/operations/tip.ts +++ b/packages/taler-wallet-core/src/operations/tip.ts @@ -29,6 +29,7 @@ import { TalerErrorCode, codecForTipResponse, Logger, + URL, } from "@gnu-taler/taler-util"; import { DerivedTipPlanchet } from "../crypto/cryptoTypes.js"; import { @@ -50,7 +51,6 @@ import { selectWithdrawalDenominations, denomSelectionInfoToState, } from "./withdraw.js"; -import { URL } from "../util/url.js"; import { getHttpResponseErrorDetails, readSuccessResponseJsonOrThrow, diff --git a/packages/taler-wallet-core/src/operations/withdraw.ts b/packages/taler-wallet-core/src/operations/withdraw.ts index 6cf20259c..e966f6a14 100644 --- a/packages/taler-wallet-core/src/operations/withdraw.ts +++ b/packages/taler-wallet-core/src/operations/withdraw.ts @@ -39,6 +39,7 @@ import { timestampCmp, timestampSubtractDuraction, WithdrawResponse, + URL, WithdrawUriInfoResponse, } from "@gnu-taler/taler-util"; import { @@ -56,7 +57,6 @@ import { import { walletCoreDebugFlags } from "../util/debugFlags.js"; import { readSuccessResponseJsonOrThrow } from "../util/http.js"; import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js"; -import { URL } from "../util/url.js"; import { guardOperationException, makeErrorDetails, diff --git a/packages/taler-wallet-core/src/util/RequestThrottler.ts b/packages/taler-wallet-core/src/util/RequestThrottler.ts index 56242a237..d79afe47a 100644 --- a/packages/taler-wallet-core/src/util/RequestThrottler.ts +++ b/packages/taler-wallet-core/src/util/RequestThrottler.ts @@ -26,8 +26,8 @@ import { timestampDifference, timestampCmp, Logger, + URL, } from "@gnu-taler/taler-util"; -import { URL } from "./url.js"; const logger = new Logger("RequestThrottler.ts"); diff --git a/packages/taler-wallet-core/src/util/url.ts b/packages/taler-wallet-core/src/util/url.ts deleted file mode 100644 index b50b4b466..000000000 --- a/packages/taler-wallet-core/src/util/url.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2020 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see - */ - -interface URL { - hash: string; - host: string; - hostname: string; - href: string; - toString(): string; - readonly origin: string; - password: string; - pathname: string; - port: string; - protocol: string; - search: string; - readonly searchParams: URLSearchParams; - username: string; - toJSON(): string; -} - -interface URLSearchParams { - append(name: string, value: string): void; - delete(name: string): void; - get(name: string): string | null; - getAll(name: string): string[]; - has(name: string): boolean; - set(name: string, value: string): void; - sort(): void; - toString(): string; - forEach( - callbackfn: (value: string, key: string, parent: URLSearchParams) => void, - thisArg?: any, - ): void; -} - -export interface URLSearchParamsCtor { - new ( - init?: string[][] | Record | string | URLSearchParams, - ): URLSearchParams; -} - -export interface URLCtor { - new (url: string, base?: string | URL): URL; -} - -// @ts-ignore -const _URL = globalThis.URL; -if (!_URL) { - throw Error("FATAL: URL not available"); -} - -export const URL: URLCtor = _URL; - -// @ts-ignore -const _URLSearchParams = globalThis.URLSearchParams; - -if (!_URLSearchParams) { - throw Error("FATAL: URLSearchParams not available"); -} - -export const URLSearchParams: URLSearchParamsCtor = _URLSearchParams; diff --git a/packages/taler-wallet-webextension/src/compat.ts b/packages/taler-wallet-webextension/src/compat.ts index 4635abd80..36846e615 100644 --- a/packages/taler-wallet-webextension/src/compat.ts +++ b/packages/taler-wallet-webextension/src/compat.ts @@ -19,6 +19,21 @@ * WebExtension APIs consistently. */ +// globalThis polyfill, see https://mathiasbynens.be/notes/globalthis +(function () { + if (typeof globalThis === "object") return; + Object.defineProperty(Object.prototype, "__magic__", { + get: function () { + return this; + }, + configurable: true, // This makes it possible to `delete` the getter later. + }); + // @ts-ignore: polyfill magic + __magic__.globalThis = __magic__; // lolwat + // @ts-ignore: polyfill magic + delete Object.prototype.__magic__; +})(); + export function isFirefox(): boolean { const rt = chrome.runtime as any; if (typeof rt.getBrowserInfo === "function") {