taler-typescript-core

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

commit c4a416fc79a9b1d1824e8bd2ff93393d4f5f8bd4
parent bd44affc75befed89360b6df1f1e6c751b2c9969
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Tue, 27 Oct 2026 14:08:05 +0100

taldir: improve type handling and fix database txs

Diffstat:
Mpackages/taler-util/src/http-client/taldir.ts | 10+++++-----
Mpackages/taler-util/src/types-taler-directory.ts | 13++++++++++---
Mpackages/taler-util/src/types-taler-wallet.ts | 4++--
Mpackages/taler-wallet-core/src/db/sqlite/transaction.ts | 10+++++++---
4 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/packages/taler-util/src/http-client/taldir.ts b/packages/taler-util/src/http-client/taldir.ts @@ -23,12 +23,12 @@ import { OperationOk, RelativeTime, TaldirAlreadyPaidResponse, - TaldirMailboxDetailResponse, + TaldirDirectoryEntryResponse, TalerDirectoryApi, carefullyParseConfig, codecForAny, - codecForEmptyObject, codecForTaldirAlreadyPaidResponse, + codecForTaldirDirectoryEntryResponse, codecForTalerDirectoryConfigResponse, opFixedSuccess, opKnownHttpFailure, @@ -106,8 +106,8 @@ export class TalerDirectoryInstanceHttpClient { async lookupAlias(args: { hAlias: string; }): Promise< - | OperationOk<TaldirMailboxDetailResponse> - | OperationFail<HttpStatusCode.NotFound> + | OperationOk<TaldirDirectoryEntryResponse> + | OperationFail<HttpStatusCode.NotFound> > { const { hAlias: hAlias } = args; const url = new URL(`${pathSegment(hAlias.toUpperCase())}`, this.baseUrl); @@ -119,7 +119,7 @@ export class TalerDirectoryInstanceHttpClient { switch (resp.status) { case HttpStatusCode.Ok: { - return opSuccessFromHttp(resp, codecForAny()); + return opSuccessFromHttp(resp, codecForTaldirDirectoryEntryResponse()); } case HttpStatusCode.NotFound: { return opFixedSuccess(resp, {target_uri: ''}); diff --git a/packages/taler-util/src/types-taler-directory.ts b/packages/taler-util/src/types-taler-directory.ts @@ -17,7 +17,7 @@ */ import { codecForAmountString } from "./amounts.js"; -import { Codec, buildCodecForObject, codecForList } from "./codec.js"; +import { Codec, buildCodecForObject, codecForList, codecOptional } from "./codec.js"; import { codecForConstString, codecForString } from "./codec.js"; import { codecForDuration } from "./time.js"; import { AmountString, RelativeTime } from "./types-taler-common.js"; @@ -65,7 +65,7 @@ export interface TalerDirectoryConfigResponse { monthly_fee: AmountString; } -export interface TaldirMailboxDetailResponse { +export interface TaldirDirectoryEntryResponse { // Target URI to associate with this alias. target_uri: string; @@ -73,6 +73,13 @@ export interface TaldirMailboxDetailResponse { valid_for?: RelativeTime; } +export const codecForTaldirDirectoryEntryResponse = + (): Codec<TaldirDirectoryEntryResponse> => + buildCodecForObject<TaldirDirectoryEntryResponse>() + .property("target_uri", codecForString()) + .property("valid_for", codecOptional(codecForDuration)) + .build("TalerDirectoryApi.TaldirDirectoryEntryResponse"); + export interface TaldirAlreadyPaidResponse { // The remaining duration for which this registration is still paid for valid_for: RelativeTime; @@ -81,5 +88,5 @@ export interface TaldirAlreadyPaidResponse { export const codecForTaldirAlreadyPaidResponse = (): Codec<TaldirAlreadyPaidResponse> => buildCodecForObject<TaldirAlreadyPaidResponse>() - .property("valid_for", codecForDuration) + .property("valid_for", codecForDuration) .build("TalerDirectoryApi.TaldirAlreadyPaidResponse"); diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts @@ -1818,7 +1818,7 @@ export const codecForContactEntry = (): Codec<ContactEntry> => .property("isSelf", codecOptional(codecForBoolean())) .property("source", codecForString()) .property("petname", codecForString()) - .property("expiration", codecOptional(codecForAbsoluteTime)) + .property("expiration", codecOptional(codecForTimestamp)) .build("ContactListItem"); export const codecForAddContactRequest = (): Codec<AddContactRequest> => @@ -2271,7 +2271,7 @@ export interface ContactEntry { /** * The soft expiration of this entry */ - expiration?: AbsoluteTime; + expiration?: Timestamp; } /** diff --git a/packages/taler-wallet-core/src/db/sqlite/transaction.ts b/packages/taler-wallet-core/src/db/sqlite/transaction.ts @@ -45,6 +45,7 @@ import { MailboxConfiguration, MailboxMessageRecord, ScopeInfo, + TalerProtocolTimestamp, } from "@gnu-taler/taler-util"; import { checkExchangeInScopeGeneric, @@ -4702,14 +4703,15 @@ export class SqliteWalletTransaction implements WalletDbTransaction { async addContact(contact: ContactEntry): Promise<void> { await this.run( `INSERT INTO contacts ( - alias, alias_type, mailbox_base_uri, mailbox_address, source, petname, self - ) VALUES ($alias, $type, $uri, $addr, $src, $pet, $self) + alias, alias_type, mailbox_base_uri, mailbox_address, source, petname, self, expiration + ) VALUES ($alias, $type, $uri, $addr, $src, $pet, $self, $exp) ON CONFLICT(alias, alias_type) DO UPDATE SET mailbox_base_uri = excluded.mailbox_base_uri, mailbox_address = excluded.mailbox_address, source = excluded.source, petname = excluded.petname, - self = excluded.self`, + self = excluded.self, + expiration = excluded.expiration`, { alias: contact.alias, type: contact.aliasType, @@ -4718,6 +4720,7 @@ export class SqliteWalletTransaction implements WalletDbTransaction { src: contact.source, pet: contact.petname, self: boolToDb(contact.isSelf ?? false), + exp: timestampProtocolToDb(contact.expiration ?? TalerProtocolTimestamp.zero()), }, ); } @@ -4739,6 +4742,7 @@ export class SqliteWalletTransaction implements WalletDbTransaction { source: str(row.source), petname: str(row.petname), self: dbToOptBool(row.self), + expiration: timestampProtocolFromDb(dbTimestamp(row.expiration)), })); }