taler-typescript-core

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

commit 9f889207ddad3b786e4b30ea076f3ec24591a9da
parent f75859dd6141f543546c8f117162780a1e635614
Author: Sebastian <sebasjm@gmail.com>
Date:   Wed,  1 Oct 2025 14:04:30 -0300

fix runtime error because of import problems

Diffstat:
Mpackages/taler-util/src/aml/reporting.ts | 11++++-------
Mpackages/taler-util/src/amounts.ts | 19++++++++++++-------
Mpackages/taler-util/src/bech32.ts | 10+++-------
Mpackages/taler-util/src/bitcoin.test.ts | 3++-
Mpackages/taler-util/src/bitcoin.ts | 10+++-------
Mpackages/taler-util/src/helpers.ts | 11-----------
Mpackages/taler-util/src/http-client/exchange-client.ts | 9++-------
Mpackages/taler-util/src/http-client/utils.ts | 2+-
Mpackages/taler-util/src/iban.ts | 3++-
Mpackages/taler-util/src/index.ts | 3++-
Mpackages/taler-util/src/iso-3166.ts | 2+-
Mpackages/taler-util/src/iso-4217.ts | 2+-
Mpackages/taler-util/src/iso-639.ts | 3++-
Mpackages/taler-util/src/longpool-queue.ts | 3++-
Mpackages/taler-util/src/observability.ts | 9+++------
Mpackages/taler-util/src/operation.ts | 16+++++++---------
Mpackages/taler-util/src/payto.ts | 36+++++++++++++++++++++---------------
Mpackages/taler-util/src/qr.ts | 2+-
Mpackages/taler-util/src/segwit_addr.ts | 5+++--
Mpackages/taler-util/src/taler-signatures.ts | 4+++-
Mpackages/taler-util/src/taleruri.test.ts | 78+++++++++++++++++++++++++++++++++++++++---------------------------------------
Mpackages/taler-util/src/taleruri.ts | 102++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Mpackages/taler-util/src/time.test.ts | 2+-
Mpackages/taler-util/src/types-donau.ts | 21++++++++++-----------
Mpackages/taler-util/src/types-taler-bank-integration.ts | 10++++------
Mpackages/taler-util/src/types-taler-common.ts | 4+++-
Mpackages/taler-util/src/types-taler-corebank.ts | 24+++++++++---------------
Mpackages/taler-util/src/types-taler-exchange.ts | 29++++++++++++++---------------
Mpackages/taler-util/src/types-taler-wallet.ts | 23+++++++----------------
Mpackages/taler-util/src/types-taler-wire-gateway.ts | 8++++----
30 files changed, 228 insertions(+), 236 deletions(-)

diff --git a/packages/taler-util/src/aml/reporting.ts b/packages/taler-util/src/aml/reporting.ts @@ -1,10 +1,7 @@ -import { - AbsoluteTime, - Duration, - OfficerAccount, - TalerExchangeHttpClient, - TOPS_AmlEventsName, -} from "../index.js"; +import { TalerExchangeHttpClient } from "../http-client/exchange-client.js"; +import { AbsoluteTime, Duration } from "../time.js"; +import { OfficerAccount } from "../types-taler-common.js"; +import { TOPS_AmlEventsName } from "./events.js"; /** * Define a set of parameters to make a request to the server diff --git a/packages/taler-util/src/amounts.ts b/packages/taler-util/src/amounts.ts @@ -30,13 +30,8 @@ import { codecForString, renderContext, } from "./codec.js"; -import { - CurrencySpecification, - OperationResult, - opFixedSuccess, - opKnownFailure, -} from "./index.js"; -import { AmountString } from "./types-taler-common.js"; +import { opFixedSuccess, opKnownFailure } from "./operation.js"; +import { AmountString, CurrencySpecification } from "./types-taler-common.js"; /** * Number of fractional units that one value unit represents. @@ -655,6 +650,16 @@ export class Amounts { return `${a.currency}:${s}` as AmountString; } + + /** + * Show an amount in a form suitable for the user. + * FIXME: In the future, this should consider currency-specific + * settings such as significant digits or currency symbols. + */ + static toPretty(amount: AmountJson): string { + const x = amount.value + amount.fraction / amountFractionalBase; + return `${x} ${amount.currency}`; + } static amountHasSameCurrency(a1: AmountLike, a2: AmountLike): boolean { const x1 = this.jsonifyAmount(a1); diff --git a/packages/taler-util/src/bech32.ts b/packages/taler-util/src/bech32.ts @@ -18,13 +18,9 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -import { - assertUnreachable, - BtAddrString, - OperationResult, - opFixedSuccess, - opKnownFailure -} from "./index.js"; +import { assertUnreachable } from "./errors.js"; +import { opFixedSuccess, opKnownFailure } from "./operation.js"; +import { BtAddrString } from "./payto.js"; var CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"; var GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]; diff --git a/packages/taler-util/src/bitcoin.test.ts b/packages/taler-util/src/bitcoin.test.ts @@ -20,7 +20,8 @@ import test from "ava"; import { generateFakeSegwitAddress } from "./bitcoin.js"; -import { Paytos, succeedOrThrow } from "./index.node.js"; +import { Paytos } from "./payto.js"; +import { succeedOrThrow } from "./operation.js"; test("generate testnet", (t) => { const [addr1, addr2] = succeedOrThrow( diff --git a/packages/taler-util/src/bitcoin.ts b/packages/taler-util/src/bitcoin.ts @@ -23,12 +23,8 @@ * Imports. */ import { AmountJson, Amounts } from "./amounts.js"; -import { - BtAddrString, - OperationResult, - opFixedSuccess, - opKnownFailure -} from "./index.js"; +import { opFixedSuccess, opKnownFailure } from "./operation.js"; +import { BtAddrString } from "./payto.js"; import { BitcoinSewgit } from "./segwit_addr.js"; function buf2hex(buffer: Uint8Array) { @@ -59,7 +55,7 @@ export enum GenerateSegwitAddrError { export function generateFakeSegwitAddress( pub: Uint8Array, addr: string, -): OperationResult<[BtAddrString, BtAddrString], GenerateSegwitAddrError> { +){ const first_rnd = new Uint8Array(4); first_rnd.set(pub.subarray(0, 4)); const second_rnd = new Uint8Array(4); diff --git a/packages/taler-util/src/helpers.ts b/packages/taler-util/src/helpers.ts @@ -21,19 +21,8 @@ /** * Imports. */ -import { AmountJson } from "./amounts.js"; -import * as Amounts from "./amounts.js"; import { URL } from "./url.js"; -/** - * Show an amount in a form suitable for the user. - * FIXME: In the future, this should consider currency-specific - * settings such as significant digits or currency symbols. - */ -export function amountToPretty(amount: AmountJson): string { - const x = amount.value + amount.fraction / Amounts.amountFractionalBase; - return `${x} ${amount.currency}`; -} /** * Canonicalize a base url, typically for the exchange. diff --git a/packages/taler-util/src/http-client/exchange-client.ts b/packages/taler-util/src/http-client/exchange-client.ts @@ -47,15 +47,13 @@ import { LongPollParams, OfficerAccount, PaginationParams, - PaytoHash, - codecForTalerCommonConfigResponse, + PaytoHash } from "../types-taler-common.js"; import { AccountKycStatus, AmlDecisionRequest, AmlDecisionsResponse, AvailableMeasureSummary, - EventCounter, ExchangeGetContractResponse, ExchangeKeysResponse, ExchangeKycUploadFormRequest, @@ -88,7 +86,6 @@ import { codecForAmlStatisticsResponse, codecForAmlWalletKycCheckResponse, codecForAvailableMeasureSummary, - codecForEventCounter, codecForExchangeConfig, codecForExchangeGetContractResponse, codecForExchangeKeysResponse, @@ -103,7 +100,7 @@ import { codecForLegitimizationMeasuresList, codecForLegitimizationNeededResponse, codecForPurseConflict, - codecForPurseConflictPartial, + codecForPurseConflictPartial } from "../types-taler-exchange.js"; import { CacheEvictor, @@ -112,7 +109,6 @@ import { nullEvictor, } from "./utils.js"; -import { TalerError } from "../errors.js"; import { AmountJson, Amounts, @@ -121,7 +117,6 @@ import { signAmlDecision, signAmlQuery, } from "../index.js"; -import { TalerErrorCode } from "../taler-error-codes.js"; import { AbsoluteTime } from "../time.js"; import { EmptyObject, codecForEmptyObject } from "../types-taler-wallet.js"; diff --git a/packages/taler-util/src/http-client/utils.ts b/packages/taler-util/src/http-client/utils.ts @@ -18,7 +18,7 @@ * Imports. */ import { base64FromArrayBuffer } from "../base64.js"; -import { encodeCrock, getRandomBytes, stringToBytes } from "../taler-crypto.js"; +import { stringToBytes } from "../taler-crypto.js"; import { AccessToken, LongPollParams, diff --git a/packages/taler-util/src/iban.ts b/packages/taler-util/src/iban.ts @@ -14,7 +14,8 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { OperationResult, opFixedSuccess, opKnownFailure } from "./index.js"; +import { OperationResult, opFixedSuccess, opKnownFailure } from "./operation.js"; + /** * IBAN validation. diff --git a/packages/taler-util/src/index.ts b/packages/taler-util/src/index.ts @@ -90,10 +90,11 @@ export * from "./account-restrictions.js"; export * from "./aml/events.js"; export * from "./aml/properties.js"; -export * from "./aml/reporting.js"; export * from "./taler-account-properties.js"; export * from "./taler-form-attributes.js"; export * from "./iso-3166.js"; export * from "./iso-4217.js"; export * from "./iso-639.js"; + +export * from "./aml/reporting.js"; diff --git a/packages/taler-util/src/iso-3166.ts b/packages/taler-util/src/iso-3166.ts @@ -13,7 +13,7 @@ You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { Translator } from "./index.js"; +import { Translator } from "./i18n.js"; // From https://en.wikipedia.org/wiki/ISO_3166 diff --git a/packages/taler-util/src/iso-4217.ts b/packages/taler-util/src/iso-4217.ts @@ -14,7 +14,7 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { Translator } from "./index.js"; +import { Translator } from "./i18n.js"; // From https://en.wikipedia.org/wiki/ISO_4217 diff --git a/packages/taler-util/src/iso-639.ts b/packages/taler-util/src/iso-639.ts @@ -14,7 +14,8 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { Translator } from "./index.js"; +import { Translator } from "./i18n.js"; + /** * This was taken from https://raw.githubusercontent.com/umpirsky/language-list/refs/heads/master/data/ak/language.txt * diff --git a/packages/taler-util/src/longpool-queue.ts b/packages/taler-util/src/longpool-queue.ts @@ -16,8 +16,9 @@ SPDX-License-Identifier: AGPL3.0-or-later */ -import { openPromise, CancellationToken } from "./index.js"; +import { CancellationToken } from "./CancellationToken.js"; import { Logger } from "./logging.js"; +import { openPromise } from "./promises.js"; const logger = new Logger("longpoll-queue.ts"); diff --git a/packages/taler-util/src/observability.ts b/packages/taler-util/src/observability.ts @@ -15,17 +15,14 @@ */ import { - AbsoluteTime, - CancellationToken, - ObservabilityEvent, -} from "./index.js"; -import { HttpRequestLibrary, HttpRequestOptions, HttpResponse, } from "./http-common.js"; -import { ObservabilityEventType } from "./notifications.js"; +import { ObservabilityEvent, ObservabilityEventType } from "./notifications.js"; import { getErrorDetailFromException } from "./errors.js"; +import { CancellationToken } from "./CancellationToken.js"; +import { AbsoluteTime } from "./time.js"; /** * Observability sink can be passed into various operations (HTTP requests, DB access) diff --git a/packages/taler-util/src/operation.ts b/packages/taler-util/src/operation.ts @@ -17,21 +17,19 @@ /** * Imports. */ +import { Codec } from "./codec.js"; +import { TalerError } from "./errors.js"; import { HttpResponse, readResponseJsonOrThrow, readSuccessResponseJsonOrThrow, readTalerErrorResponse, } from "./http-common.js"; -import { - Codec, - codecForTalerCommonConfigResponse, - HttpStatusCode, - LibtoolVersion, - TalerError, - TalerErrorCode, - TalerErrorDetail, -} from "./index.js"; +import { HttpStatusCode } from "./http-status-codes.js"; +import { LibtoolVersion } from "./libtool-version.js"; +import { TalerErrorCode } from "./taler-error-codes.js"; +import { codecForTalerCommonConfigResponse } from "./types-taler-common.js"; +import { TalerErrorDetail } from "./types-taler-wallet.js"; export type OperationResult<Body, ErrorEnum> = | OperationOk<Body> diff --git a/packages/taler-util/src/payto.ts b/packages/taler-util/src/payto.ts @@ -18,19 +18,18 @@ import { BitcoinBech32 } from "./bech32.js"; import { generateFakeSegwitAddress } from "./bitcoin.js"; import { Codec, Context, DecodingError, renderContext } from "./codec.js"; import { - assertUnreachable, - decodeCrock, - encodeCrock, - hashTruncate32, - ParseIbanError as IbanParseError, - IbanString, - OperationResult, opFixedSuccess, opKnownFailure, opKnownFailureWithBody, - parseIban, +} from "./operation.js"; +import { IbanString, parseIban } from "./iban.js"; +import { assertUnreachable } from "./errors.js"; +import { + decodeCrock, + encodeCrock, + hashTruncate32, stringToBytes, -} from "./index.js"; +} from "./taler-crypto.js"; import { URLSearchParams } from "./url.js"; /** @@ -233,19 +232,22 @@ export namespace Paytos { * Return the canonical form. * * @param hostname + * @param path * @param scheme * @returns */ export function parseHostPortPath( hostname: string, + path: string, scheme: "http" | "https" = "https", ): HostPortPath | undefined { // maybe it should check that it doesn't contain search or hash? try { - const url = new URL("/", `${scheme}://${hostname}`); - if (!url.pathname.endsWith("/")) { - url.pathname = url.pathname + "/"; + // https://url.spec.whatwg.org/#concept-basic-url-parser + if (!path.endsWith("/")) { + path = path + "/"; } + const url = new URL(path, `${scheme}://${hostname.toLowerCase()}`); url.search = ""; url.password = ""; url.username = ""; @@ -508,7 +510,7 @@ export namespace Paytos { }); } - const host = parseHostPortPath(cs.slice(0, -1).join("/")); + const host = parseHostPortPath(cs[0], cs.slice(1, -1).join("/")); if (!opts.ignoreComponentError && !host) { return opKnownFailureWithBody(PaytoParseError.INVALID_TARGET_PATH, { pos: 0 as const, @@ -539,7 +541,7 @@ export namespace Paytos { targetType, }); } - const exchange = parseHostPortPath(cs.slice(0, -1).join("/")); + const exchange = parseHostPortPath(cs[0], cs.slice(1, -1).join("/")); if (!opts.ignoreComponentError && !exchange) { return opKnownFailureWithBody(PaytoParseError.INVALID_TARGET_PATH, { pos: 0 as const, @@ -572,7 +574,11 @@ export namespace Paytos { targetType, }); } - const exchange = parseHostPortPath(cs.slice(0, -1).join("/"), "http"); + const exchange = parseHostPortPath( + cs[0], + cs.slice(1, -1).join("/"), + "http", + ); if (!opts.ignoreComponentError && !exchange) { return opKnownFailureWithBody(PaytoParseError.INVALID_TARGET_PATH, { pos: 0, diff --git a/packages/taler-util/src/qr.ts b/packages/taler-util/src/qr.ts @@ -17,7 +17,7 @@ /** * Imports. */ -import { Amounts } from "./index.js"; +import { Amounts } from "./amounts.js"; import { parsePaytoUri } from "./payto.js"; type EncodeResult = { type: "ok"; qrContent: string } | { type: "skip" }; diff --git a/packages/taler-util/src/segwit_addr.ts b/packages/taler-util/src/segwit_addr.ts @@ -19,7 +19,8 @@ // THE SOFTWARE. import { BitcoinBech32 } from "./bech32.js"; -import { BtAddrString, OperationResult, opFixedSuccess, opKnownFailure, Paytos } from "./index.js"; +import { OperationResult, opFixedSuccess, opKnownFailure } from "./operation.js"; +import { BtAddrString } from "./payto.js"; function convertbits( data: Array<number>, @@ -100,7 +101,7 @@ export namespace BitcoinSewgit { hrp: string, version: number, program: Array<number>, - ): OperationResult<BtAddrString, BitcoinSewgitParseError> { + ) { const enc = version > 0 ? BitcoinBech32.Encodings.BECH32M diff --git a/packages/taler-util/src/taler-signatures.ts b/packages/taler-util/src/taler-signatures.ts @@ -14,7 +14,8 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { AmountLike, canonicalJson, TalerProtocolTimestamp } from "./index.js"; +import { AmountLike } from "./amounts.js"; +import { canonicalJson } from "./helpers.js"; import { bufferFromAmount, bufferForUint64, @@ -28,6 +29,7 @@ import { TalerSignaturePurpose, timestampRoundedToBuffer, } from "./taler-crypto.js"; +import { TalerProtocolTimestamp } from "./time.js"; import { AmlDecisionRequestWithoutSignature } from "./types-taler-exchange.js"; /** diff --git a/packages/taler-util/src/taleruri.test.ts b/packages/taler-util/src/taleruri.test.ts @@ -15,7 +15,7 @@ */ import test from "ava"; -import { AmountString } from "./types-taler-common.js"; +// import { AmountString } from "./types-taler-common.js"; import { parseAddExchangeUri, parseDevExperimentUri, @@ -38,7 +38,7 @@ import { stringifyWithdrawExchange, stringifyWithdrawUri, } from "./taleruri.js"; -import { HostPortPath } from "./payto.js"; +// import { HostPortPath } from "./payto.js"; /** * 5.1 action: withdraw https://lsd.gnunet.org/lsd0006/#name-action-withdraw @@ -52,7 +52,7 @@ test("taler withdraw uri parsing", (t) => { return; } t.is(r1.withdrawalOperationId, "12345"); - t.is(r1.bankIntegrationApiBaseUrl, "https://bank.example.com/" as HostPortPath); + t.is(r1.bankIntegrationApiBaseUrl, "https://bank.example.com/" as any); }); test("taler withdraw uri parsing with external confirmation", (t) => { @@ -64,7 +64,7 @@ test("taler withdraw uri parsing with external confirmation", (t) => { } t.is(r1.externalConfirmation, true); t.is(r1.withdrawalOperationId, "12345"); - t.is(r1.bankIntegrationApiBaseUrl, "https://bank.example.com/" as HostPortPath); + t.is(r1.bankIntegrationApiBaseUrl, "https://bank.example.com/" as any); }); test("taler withdraw uri parsing (http)", (t) => { @@ -75,12 +75,12 @@ test("taler withdraw uri parsing (http)", (t) => { return; } t.is(r1.withdrawalOperationId, "12345"); - t.is(r1.bankIntegrationApiBaseUrl, "http://bank.example.com/" as HostPortPath); + t.is(r1.bankIntegrationApiBaseUrl, "http://bank.example.com/" as any); }); test("taler withdraw URI (stringify)", (t) => { const url = stringifyWithdrawUri({ - bankIntegrationApiBaseUrl: "https://bank.taler.test/integration-api/" as HostPortPath, + bankIntegrationApiBaseUrl: "https://bank.taler.test/integration-api/" as any, withdrawalOperationId: "123", }); t.deepEqual(url, "taler://withdraw/bank.taler.test/integration-api/123"); @@ -96,7 +96,7 @@ test("taler pay url parsing: defaults", (t) => { t.fail(); return; } - t.is(r1.merchantBaseUrl, "https://example.com/" as HostPortPath); + t.is(r1.merchantBaseUrl, "https://example.com/" as any); t.is(r1.sessionId, ""); const url2 = "taler://pay/example.com/myorder/mysession"; @@ -105,7 +105,7 @@ test("taler pay url parsing: defaults", (t) => { t.fail(); return; } - t.is(r2.merchantBaseUrl, "https://example.com/" as HostPortPath); + t.is(r2.merchantBaseUrl, "https://example.com/" as any); t.is(r2.sessionId, "mysession"); }); @@ -116,7 +116,7 @@ test("taler pay url parsing: instance", (t) => { t.fail(); return; } - t.is(r1.merchantBaseUrl, "https://example.com/instances/myinst/" as HostPortPath); + t.is(r1.merchantBaseUrl, "https://example.com/instances/myinst/" as any); t.is(r1.orderId, "myorder"); }); @@ -127,7 +127,7 @@ test("taler pay url parsing (claim token)", (t) => { t.fail(); return; } - t.is(r1.merchantBaseUrl, "https://example.com/instances/myinst/" as HostPortPath); + t.is(r1.merchantBaseUrl, "https://example.com/instances/myinst/" as any); t.is(r1.orderId, "myorder"); t.is(r1.claimToken, "ASDF"); }); @@ -139,7 +139,7 @@ test("taler pay uri parsing: non-https", (t) => { t.fail(); return; } - t.is(r1.merchantBaseUrl, "http://example.com/" as HostPortPath); + t.is(r1.merchantBaseUrl, "http://example.com/" as any); t.is(r1.orderId, "myorder"); }); @@ -155,14 +155,14 @@ test("taler pay uri parsing: missing session component", (t) => { test("taler pay URI (stringify)", (t) => { const url1 = stringifyPayUri({ - merchantBaseUrl: "http://localhost:123/" as HostPortPath, + merchantBaseUrl: "http://localhost:123/" as any, orderId: "foo", sessionId: "", }); t.deepEqual(url1, "taler+http://pay/localhost:123/foo/"); const url2 = stringifyPayUri({ - merchantBaseUrl: "http://localhost:123/" as HostPortPath, + merchantBaseUrl: "http://localhost:123/" as any, orderId: "foo", sessionId: "bla", }); @@ -171,14 +171,14 @@ test("taler pay URI (stringify)", (t) => { test("taler pay URI (stringify with https)", (t) => { const url1 = stringifyPayUri({ - merchantBaseUrl: "https://localhost:123/" as HostPortPath, + merchantBaseUrl: "https://localhost:123/" as any, orderId: "foo", sessionId: "", }); t.deepEqual(url1, "taler://pay/localhost:123/foo/"); const url2 = stringifyPayUri({ - merchantBaseUrl: "https://localhost/" as HostPortPath, + merchantBaseUrl: "https://localhost/" as any, orderId: "foo", sessionId: "bla", noncePriv: "123", @@ -197,7 +197,7 @@ test("taler refund uri parsing: non-https #1", (t) => { t.fail(); return; } - t.is(r1.merchantBaseUrl, "http://example.com/" as HostPortPath); + t.is(r1.merchantBaseUrl, "http://example.com/" as any); t.is(r1.orderId, "myorder"); }); @@ -208,7 +208,7 @@ test("taler refund uri parsing", (t) => { t.fail(); return; } - t.is(r1.merchantBaseUrl, "https://merchant.example.com/" as HostPortPath); + t.is(r1.merchantBaseUrl, "https://merchant.example.com/" as any); t.is(r1.orderId, "1234"); }); @@ -220,12 +220,12 @@ test("taler refund uri parsing with instance", (t) => { return; } t.is(r1.orderId, "1234"); - t.is(r1.merchantBaseUrl, "https://merchant.example.com/instances/myinst/" as HostPortPath); + t.is(r1.merchantBaseUrl, "https://merchant.example.com/instances/myinst/" as any); }); test("taler refund URI (stringify)", (t) => { const url = stringifyRefundUri({ - merchantBaseUrl: "https://merchant.test/instance/pepe/" as HostPortPath, + merchantBaseUrl: "https://merchant.test/instance/pepe/" as any, orderId: "123", }); t.deepEqual(url, "taler://refund/merchant.test/instance/pepe/123/"); @@ -242,7 +242,7 @@ test("taler peer to peer push URI", (t) => { t.fail(); return; } - t.is(r1.exchangeBaseUrl, "https://exch.example.com/" as HostPortPath); + t.is(r1.exchangeBaseUrl, "https://exch.example.com/" as any); t.is(r1.contractPriv, "foo"); }); @@ -253,7 +253,7 @@ test("taler peer to peer push URI (path)", (t) => { t.fail(); return; } - t.is(r1.exchangeBaseUrl, "https://exch.example.com:123/bla/" as HostPortPath); + t.is(r1.exchangeBaseUrl, "https://exch.example.com:123/bla/" as any); t.is(r1.contractPriv, "foo"); }); @@ -264,13 +264,13 @@ test("taler peer to peer push URI (http)", (t) => { t.fail(); return; } - t.is(r1.exchangeBaseUrl, "http://exch.example.com:123/bla/" as HostPortPath); + t.is(r1.exchangeBaseUrl, "http://exch.example.com:123/bla/" as any); t.is(r1.contractPriv, "foo"); }); test("taler peer to peer push URI (stringify)", (t) => { const url = stringifyPayPushUri({ - exchangeBaseUrl: "https://foo.example.com/bla/" as HostPortPath, + exchangeBaseUrl: "https://foo.example.com/bla/" as any, contractPriv: "123", }); t.deepEqual(url, "taler://pay-push/foo.example.com/bla/123"); @@ -287,7 +287,7 @@ test("taler peer to peer pull URI", (t) => { t.fail(); return; } - t.is(r1.exchangeBaseUrl, "https://exch.example.com/" as HostPortPath); + t.is(r1.exchangeBaseUrl, "https://exch.example.com/" as any); t.is(r1.contractPriv, "foo"); }); @@ -298,7 +298,7 @@ test("taler peer to peer pull URI (path)", (t) => { t.fail(); return; } - t.is(r1.exchangeBaseUrl, "https://exch.example.com:123/bla/" as HostPortPath); + t.is(r1.exchangeBaseUrl, "https://exch.example.com:123/bla/" as any); t.is(r1.contractPriv, "foo"); }); @@ -309,13 +309,13 @@ test("taler peer to peer pull URI (http)", (t) => { t.fail(); return; } - t.is(r1.exchangeBaseUrl, "http://exch.example.com:123/bla/" as HostPortPath); + t.is(r1.exchangeBaseUrl, "http://exch.example.com:123/bla/" as any); t.is(r1.contractPriv, "foo"); }); test("taler peer to peer pull URI (stringify)", (t) => { const url = stringifyPayPullUri({ - exchangeBaseUrl: "https://foo.example.com/bla/" as HostPortPath, + exchangeBaseUrl: "https://foo.example.com/bla/" as any, contractPriv: "123", }); t.deepEqual(url, "taler://pay-pull/foo.example.com/bla/123"); @@ -333,7 +333,7 @@ test("taler pay template URI (parsing)", (t) => { t.fail(); return; } - t.deepEqual(r1.merchantBaseUrl, "https://merchant.example.com/" as HostPortPath); + t.deepEqual(r1.merchantBaseUrl, "https://merchant.example.com/" as any); t.deepEqual(r1.templateId, "FEGHYJY48FEGU6WETYIOIDEDE2QW3OCZVY"); }); @@ -345,13 +345,13 @@ test("taler pay template URI (parsing, http with port)", (t) => { t.fail(); return; } - t.deepEqual(r1.merchantBaseUrl, "http://merchant.example.com:1234/" as HostPortPath); + t.deepEqual(r1.merchantBaseUrl, "http://merchant.example.com:1234/" as any); t.deepEqual(r1.templateId, "FEGHYJY48FEGU6WETYIOIDEDE2QW3OCZVY"); }); test("taler pay template URI (stringify)", (t) => { const url1 = stringifyPayTemplateUri({ - merchantBaseUrl: "http://merchant.example.com:1234/" as HostPortPath, + merchantBaseUrl: "http://merchant.example.com:1234/" as any, templateId: "FEGHYJY48FEGU6WETYIOIDEDE2QW3OCZVY", }); t.deepEqual( @@ -397,7 +397,7 @@ test("taler restore URI (parsing, https with port)", (t) => { test("taler restore URI (stringify)", (t) => { const url = stringifyRestoreUri({ walletRootPriv: "GJKG23V4ZBHEH45YRK7TWQE8ZTY7JWTY5094TQJSRZN5DSDBX8E0", - providers: ["http://prov1.example.com" as HostPortPath, "https://prov2.example.com:234/" as HostPortPath], + providers: ["http://prov1.example.com" as any, "https://prov2.example.com:234/" as any], }); t.deepEqual( url, @@ -476,7 +476,7 @@ test("taler withdraw exchange URI (parse)", (t) => { return; } t.deepEqual(r3.amount, undefined); - t.deepEqual(r3.exchangeBaseUrl, "https://exchange.demo.taler.net/" as HostPortPath); + t.deepEqual(r3.exchangeBaseUrl, "https://exchange.demo.taler.net/" as any); } { @@ -489,21 +489,21 @@ test("taler withdraw exchange URI (parse)", (t) => { return; } t.deepEqual(r4.amount, undefined); - t.deepEqual(r4.exchangeBaseUrl, "https://exchange.demo.taler.net/" as HostPortPath); + t.deepEqual(r4.exchangeBaseUrl, "https://exchange.demo.taler.net/" as any); } }); test("taler withdraw exchange URI (stringify)", (t) => { const url = stringifyWithdrawExchange({ - exchangeBaseUrl: "https://exchange.demo.taler.net" as HostPortPath, + exchangeBaseUrl: "https://exchange.demo.taler.net" as any, }); t.deepEqual(url, "taler://withdraw-exchange/exchange.demo.taler.net/"); }); test("taler withdraw exchange URI with amount (stringify)", (t) => { const url = stringifyWithdrawExchange({ - exchangeBaseUrl: "https://exchange.demo.taler.net" as HostPortPath, - amount: "KUDOS:19" as AmountString, + exchangeBaseUrl: "https://exchange.demo.taler.net" as any, + amount: "KUDOS:19" as any, }); t.deepEqual( url, @@ -524,7 +524,7 @@ test("taler add exchange URI (parse)", (t) => { t.fail(); return; } - t.deepEqual(r1.exchangeBaseUrl, "https://exchange.example.com/" as HostPortPath); + t.deepEqual(r1.exchangeBaseUrl, "https://exchange.example.com/" as any); } { const r2 = parseAddExchangeUri( @@ -534,13 +534,13 @@ test("taler add exchange URI (parse)", (t) => { t.fail(); return; } - t.deepEqual(r2.exchangeBaseUrl, "https://exchanges.example.com/api/" as HostPortPath); + t.deepEqual(r2.exchangeBaseUrl, "https://exchanges.example.com/api/" as any); } }); test("taler add exchange URI (stringify)", (t) => { const url = stringifyAddExchange({ - exchangeBaseUrl: "https://exchange.demo.taler.net" as HostPortPath, + exchangeBaseUrl: "https://exchange.demo.taler.net" as any, }); t.deepEqual(url, "taler://add-exchange/exchange.demo.taler.net/"); }); diff --git a/packages/taler-util/src/taleruri.ts b/packages/taler-util/src/taleruri.ts @@ -24,20 +24,18 @@ * Imports. */ import { Codec, Context, DecodingError, renderContext } from "./codec.js"; -import { canonicalizeBaseUrl } from "./helpers.js"; -import { - Amounts, - assertUnreachable, - opFixedSuccess, - opKnownFailure, - opKnownFailureWithBody, -} from "./index.js"; import { HostPortPath, Paytos } from "./payto.js"; import { Result } from "./result.js"; import { TalerErrorCode } from "./taler-error-codes.js"; import { AmountString } from "./types-taler-common.js"; import { URL, URLSearchParams } from "./url.js"; - +import { + opFixedSuccess, + opKnownFailure, + opKnownFailureWithBody, +} from "./operation.js"; +import { Amounts } from "./amounts.js"; +import { assertUnreachable } from "./errors.js"; /** * A parsed taler URI. */ @@ -271,7 +269,6 @@ export namespace TalerUris { .slice((isHttp ? TALER_HTTP_PREFIX : TALER_PREFIX).length) .split("?", 2); - // check if supported const firstSlashPos = path.indexOf("/"); const uriType = ( @@ -300,7 +297,7 @@ export namespace TalerUris { params[k] = v; }); } - + // get URI components const cs = targetPath.split("/"); switch (uriType) { @@ -314,7 +311,8 @@ export namespace TalerUris { // get merchant host const merchant = Paytos.parseHostPortPath( - cs.slice(0, -2).join("/"), + cs[0], + cs.slice(1, -2).join("/"), scheme, ); if (!opts.ignoreComponentError && !merchant) { @@ -355,7 +353,8 @@ export namespace TalerUris { // get bank host const bank = Paytos.parseHostPortPath( - cs.slice(0, -1).join("/"), + cs[0], + cs.slice(1, -1).join("/"), scheme, ); if (!opts.ignoreComponentError && !bank) { @@ -392,7 +391,8 @@ export namespace TalerUris { // get merchant host const merchant = Paytos.parseHostPortPath( - cs.slice(0, -1).join("/"), + cs[0], + cs.slice(1, -1).join("/"), scheme, ); if (!opts.ignoreComponentError && !merchant) { @@ -423,7 +423,8 @@ export namespace TalerUris { // get exchange host const exchange = Paytos.parseHostPortPath( - cs.slice(0, -1).join("/"), + cs[0], + cs.slice(1, -1).join("/"), scheme, ); if (!opts.ignoreComponentError && !exchange) { @@ -453,7 +454,8 @@ export namespace TalerUris { // get exchange host const exchange = Paytos.parseHostPortPath( - cs.slice(0, -1).join("/"), + cs[0], + cs.slice(1, -1).join("/"), scheme, ); if (!opts.ignoreComponentError && !exchange) { @@ -484,7 +486,8 @@ export namespace TalerUris { // get merchant host const merchant = Paytos.parseHostPortPath( - cs.slice(0, -1).join("/"), + cs[0], + cs.slice(1, -1).join("/"), scheme, ); if (!opts.ignoreComponentError && !merchant) { @@ -520,11 +523,9 @@ export namespace TalerUris { const providers: Array<HostPortPath> = []; // const providers = new Array<HostPortPath>(); cs[1].split(",").map((name) => { - const url = Paytos.parseHostPortPath( - decodeURIComponent(name), - scheme, - )!; - providers.push(url); + const [hostname, path] = decodeURIComponent(name).split("/", 1); + const host = Paytos.parseHostPortPath(hostname, path, scheme)!; + providers.push(host); }); return opFixedSuccess<URI>( @@ -555,7 +556,11 @@ export namespace TalerUris { } // get exchange host - const exchange = Paytos.parseHostPortPath(cs.join("/"), scheme); + const exchange = Paytos.parseHostPortPath( + cs[0], + cs.slice(1).join("/"), + scheme, + ); if (!opts.ignoreComponentError && !exchange) { return opKnownFailureWithBody( TalerUriParseError.INVALID_TARGET_PATH, @@ -602,7 +607,11 @@ export namespace TalerUris { } // get exchange host - const exchange = Paytos.parseHostPortPath(cs.join("/"), scheme); + const exchange = Paytos.parseHostPortPath( + cs[0], + cs.slice(1).join("/"), + scheme, + ); if (!opts.ignoreComponentError && !exchange) { return opKnownFailureWithBody( TalerUriParseError.INVALID_TARGET_PATH, @@ -753,12 +762,13 @@ export function parseWithdrawUriWithError(s: string) { * trimming the parts-list. FIXME */ const withdrawId = parts[parts.length - 1]; - const p = [host, ...pathSegments].join("/"); + // const p = [host, ...pathSegments].join("/"); const result: WithdrawUriResult = { type: TalerUriAction.Withdraw, bankIntegrationApiBaseUrl: Paytos.parseHostPortPath( - p, + host, + pathSegments.join("/"), pi.value.innerProto, )!, withdrawalOperationId: withdrawId, @@ -801,11 +811,15 @@ export function parseAddExchangeUriWithError(s: string) { * actual withdrawal operation ID. That can be fixed by * trimming the parts-list. FIXME */ - const p = [host, ...pathSegments].join("/"); + // const p = [host, ...pathSegments].join("/"); const result: AddExchangeUri = { type: TalerUriAction.AddExchange, - exchangeBaseUrl: Paytos.parseHostPortPath(p, pi.value.innerProto)!, + exchangeBaseUrl: Paytos.parseHostPortPath( + host, + pathSegments.join("/"), + pi.value.innerProto, + )!, }; return Result.of(result); } @@ -1013,8 +1027,12 @@ export function parsePayUri(s: string): PayUriResult | undefined { const sessionId = parts[parts.length - 1]; const orderId = parts[parts.length - 2]; const pathSegments = parts.slice(1, parts.length - 2); - const p = [host, ...pathSegments].join("/"); - const merchantBaseUrl = Paytos.parseHostPortPath(p, pi.innerProto)!; + // const p = [host, ...pathSegments].join("/"); + const merchantBaseUrl = Paytos.parseHostPortPath( + host, + pathSegments.join("/"), + pi.innerProto, + )!; return { type: TalerUriAction.Pay, @@ -1055,7 +1073,8 @@ export function parsePayTemplateUri( // ); const merchantBaseUrl = Paytos.parseHostPortPath( - hostAndSegments, + host, + pathSegments.join("/"), pi.innerProto, )!; return { @@ -1083,7 +1102,8 @@ export function parsePayPushUri(s: string): PayPushUriResult | undefined { // `${pi.innerProto}://${hostAndSegments}/`, // ); const exchangeBaseUrl = Paytos.parseHostPortPath( - hostAndSegments, + host, + pathSegments.join("/"), pi.innerProto, )!; @@ -1112,7 +1132,8 @@ export function parsePayPullUri(s: string): PayPullUriResult | undefined { // `${pi.innerProto}://${hostAndSegments}/`, // ); const exchangeBaseUrl = Paytos.parseHostPortPath( - hostAndSegments, + host, + pathSegments.join("/"), pi.innerProto, )!; @@ -1150,7 +1171,8 @@ export function parseWithdrawExchangeUri( // `${pi.innerProto}://${hostAndSegments}/`, // ); const exchangeBaseUrl = Paytos.parseHostPortPath( - hostAndSegments, + host, + pathSegments.join("/"), pi.innerProto, )!; @@ -1187,7 +1209,8 @@ export function parseRefundUri(s: string): RefundUriResult | undefined { // `${pi.innerProto}://${hostAndSegments}/`, // ); const merchantBaseUrl = Paytos.parseHostPortPath( - hostAndSegments, + host, + pathSegments.join("/"), pi.innerProto, )!; @@ -1227,11 +1250,10 @@ export function parseRestoreUri(uri: string): BackupRestoreUri | undefined { if (!walletRootPriv) return undefined; const providers = new Array<HostPortPath>(); parts[1].split(",").map((name) => { - const url = Paytos.parseHostPortPath( - decodeURIComponent(name), - pi.innerProto, - )!; - providers.push(url); + const [hostname, path] = decodeURIComponent(name).split("/", 1); + const host = Paytos.parseHostPortPath(hostname, path??"/", pi.innerProto)!; + console.log("TUVIEJA", hostname, path??"/", host) + providers.push(host); }); return { type: TalerUriAction.Restore, diff --git a/packages/taler-util/src/time.test.ts b/packages/taler-util/src/time.test.ts @@ -15,7 +15,7 @@ */ import test from "ava"; -import { AbsoluteTime, Duration } from "./time.js"; +import { Duration } from "./time.js"; test("duration parsing", (t) => { const d1 = Duration.fromPrettyString("1h"); diff --git a/packages/taler-util/src/types-donau.ts b/packages/taler-util/src/types-donau.ts @@ -16,37 +16,36 @@ SPDX-License-Identifier: AGPL-3.0-or-later */ +import { codecForAmountString } from "./amounts.js"; import { buildCodecForObject, + buildCodecForUnion, Codec, + codecForAny, codecForConstString, + codecForList, + codecForNumber, codecForString, } from "./codec.js"; +import { codecForTimestamp, TalerProtocolTimestamp } from "./time.js"; import { - AmountString, + EddsaPublicKeyString, BlindedRsaSignature, - buildCodecForUnion, - codecForAmountString, - codecForAny, codecForEddsaPublicKey, codecForEddsaSignature, - codecForList, - codecForNumber, - codecForTimestamp, Cs25519Point, Cs25519Scalar, CSNonce, CsRPublic, - DenomKeyType, EddsaPublicKey, - EddsaPublicKeyString, EddsaSignatureString, HashCodeString, Integer, RsaPublicKeyString, RsaSignature, - TalerProtocolTimestamp, -} from "./index.js"; + AmountString, +} from "./types-taler-common.js"; +import { DenomKeyType } from "./types-taler-exchange.js"; export interface DonauVersionResponse { // libtool-style representation of the Donau protocol version, see diff --git a/packages/taler-util/src/types-taler-bank-integration.ts b/packages/taler-util/src/types-taler-bank-integration.ts @@ -16,19 +16,17 @@ SPDX-License-Identifier: AGPL-3.0-or-later */ +import { codecForAmountString } from "./amounts.js"; import { Codec, buildCodecForObject, + codecForBoolean, codecForConstString, codecForEither, - codecOptional, -} from "./codec.js"; -import { - codecForAmountString, - codecForBoolean, codecForList, codecForString, -} from "./index.js"; + codecOptional, +} from "./codec.js"; import { PaytoString, codecForPaytoString } from "./payto.js"; import { AmountString, diff --git a/packages/taler-util/src/types-taler-common.ts b/packages/taler-util/src/types-taler-common.ts @@ -34,11 +34,13 @@ import { codecForAny, codecForBoolean, codecForConstString, + codecForList, codecForMap, codecForNumber, codecForString, + codecOptional, } from "./codec.js"; -import { EddsaPrivP, codecForList, codecOptional } from "./index.js"; +import { EddsaPrivP } from "./taler-crypto.js"; import { TalerProtocolDuration, TalerProtocolTimestamp, diff --git a/packages/taler-util/src/types-taler-corebank.ts b/packages/taler-util/src/types-taler-corebank.ts @@ -16,32 +16,25 @@ SPDX-License-Identifier: AGPL-3.0-or-later */ +import { codecForAmountString } from "./amounts.js"; import { Codec, buildCodecForObject, + buildCodecForUnion, codecForBoolean, codecForConstString, - codecForString, - codecOptional, -} from "./codec.js"; -import { - buildCodecForUnion, - codecForAmountString, - codecForConversionRate, codecForEither, codecForList, codecForNumber, - codecForTalerUriString, - codecForTimestamp, + codecForString, + codecOptional, codecOptionalDefault, - ConversionRate, - RoundingMode, - TanChannel, -} from "./index.js"; +} from "./codec.js"; import { PaytoString, codecForPaytoString } from "./payto.js"; -import { TalerUriString } from "./taleruri.js"; +import { codecForTalerUriString, TalerUriString } from "./taleruri.js"; +import { codecForTimestamp } from "./time.js"; +import { codecForConversionRate, ConversionRate, RoundingMode } from "./types-taler-bank-conversion.js"; import { WithdrawalOperationStatusFlag } from "./types-taler-bank-integration.js"; -import { ChallengeResponse } from "./types-taler-challenger.js"; import { AmountString, CurrencySpecification, @@ -52,6 +45,7 @@ import { codecForCurrencySpecificiation, codecForDecimalNumber, } from "./types-taler-common.js"; +import { TanChannel } from "./types-taler-merchant.js"; export interface IntegrationConfig { // libtool-style representation of the Bank protocol version, see diff --git a/packages/taler-util/src/types-taler-exchange.ts b/packages/taler-util/src/types-taler-exchange.ts @@ -16,32 +16,29 @@ SPDX-License-Identifier: AGPL-3.0-or-later */ +import { codecForAmountString } from "./amounts.js"; import { Codec, buildCodecForObject, + buildCodecForUnion, codecForAny, + codecForBoolean, + codecForConstString, + codecForEither, codecForList, + codecForMap, codecForNumber, codecForString, codecForStringURL, codecOptional, -} from "./codec.js"; -import { - TalerErrorCode, - TalerFormAttributes, - buildCodecForUnion, - codecForAmountString, - codecForBoolean, - codecForConstString, - codecForCurrencySpecificiation, - codecForEither, - codecForMap, - codecForPaytoString, - codecForURN, codecOptionalDefault, - strcmp, -} from "./index.js"; +} from "./codec.js"; +import { strcmp } from "./helpers.js"; +import { codecForPaytoString } from "./payto.js"; + import { Edx25519PublicKeyEnc } from "./taler-crypto.js"; +import { TalerErrorCode } from "./taler-error-codes.js"; +import { TalerFormAttributes } from "./taler-form-attributes.js"; import { TalerProtocolDuration, TalerProtocolTimestamp, @@ -69,10 +66,12 @@ import { Timestamp, WireSalt, codecForAccessToken, + codecForCurrencySpecificiation, codecForEddsaPublicKey, codecForEddsaSignature, codecForInternationalizedString, codecForURLString, + codecForURN, } from "./types-taler-common.js"; export type DenominationPubKey = RsaDenominationPubKey | CsDenominationPubKey; diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts @@ -47,27 +47,15 @@ import { codecOptional, renderContext, } from "./codec.js"; -import { - AmountString, - CurrencySpecification, - DurationUnitSpec, - EddsaPrivateKeyString, - EddsaPublicKeyString, - EddsaSignatureString, - HashCode, - TalerMerchantApi, - TemplateParams, - Timestamp, - WithdrawalOperationStatusFlag, - canonicalizeBaseUrl, - codecForEddsaPrivateKey, -} from "./index.js"; +import { canonicalizeBaseUrl } from "./helpers.js"; import { PaytoString, codecForPaytoString } from "./payto.js"; import { QrCodeSpec } from "./qr.js"; import { AgeCommitmentProof } from "./taler-crypto.js"; import { TalerErrorCode } from "./taler-error-codes.js"; +import { TemplateParams } from "./taleruri.js"; import { AbsoluteTime, + DurationUnitSpec, TalerPreciseTimestamp, TalerProtocolDuration, TalerProtocolTimestamp, @@ -76,6 +64,8 @@ import { codecForTimestamp, } from "./time.js"; import { BlindedDonationReceiptKeyPair } from "./types-donau.js"; +import { WithdrawalOperationStatusFlag } from "./types-taler-bank-integration.js"; +import { AmountString, codecForEddsaPrivateKey, CurrencySpecification, EddsaPrivateKeyString, EddsaPublicKeyString, EddsaSignatureString, HashCode, Timestamp } from "./types-taler-common.js"; import { AccountRestriction, AuditorDenomSig, @@ -96,6 +86,7 @@ import { MerchantContractTermsV1, TokenEnvelope, TokenIssuePublicKey, + WalletTemplateDetails, codecForMerchantContractTerms, codecForMerchantContractTermsV0, } from "./types-taler-merchant.js"; @@ -2471,7 +2462,7 @@ export interface CheckPayTemplateRequest { } export type CheckPayTemplateReponse = { - templateDetails: TalerMerchantApi.WalletTemplateDetails; + templateDetails: WalletTemplateDetails; supportedCurrencies: string[]; }; diff --git a/packages/taler-util/src/types-taler-wire-gateway.ts b/packages/taler-util/src/types-taler-wire-gateway.ts @@ -18,10 +18,8 @@ import { Codec, - TalerWireGatewayApi, buildCodecForObject, buildCodecForUnion, - codecForAmountString, codecForBoolean, codecForConstString, codecForEither, @@ -30,18 +28,20 @@ import { codecForString, codecForStringURL, codecOptional, -} from "./index.js"; +} from "./codec.js"; +import { TalerWireGatewayApi } from "./index.js"; +import { codecForAmountString } from "./amounts.js"; import { PaytoString, codecForPaytoString } from "./payto.js"; import { codecForTimestamp } from "./time.js"; import { AmountString, - codecForEddsaPublicKey, EddsaPublicKey, HashCode, SafeUint64, ShortHashCode, Timestamp, WadId, + codecForEddsaPublicKey, } from "./types-taler-common.js"; export interface TransferResponse {