aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-util
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2023-05-22 13:12:27 -0300
committerSebastian <sebasjm@gmail.com>2023-05-22 13:12:27 -0300
commit984cba226ff99d8db3e774f2b0cae5b4b3fa5185 (patch)
tree0044dd2d59f4137292ecff3b34e6e8d4a9a8be58 /packages/taler-util
parent3e95ae356a98d01e523bdf48547db4114ff224fe (diff)
transactionIdStr nominal typing
Diffstat (limited to 'packages/taler-util')
-rw-r--r--packages/taler-util/src/wallet-types.ts155
1 files changed, 101 insertions, 54 deletions
diff --git a/packages/taler-util/src/wallet-types.ts b/packages/taler-util/src/wallet-types.ts
index bc43652d9..2f9d3bb04 100644
--- a/packages/taler-util/src/wallet-types.ts
+++ b/packages/taler-util/src/wallet-types.ts
@@ -30,9 +30,11 @@
import { AmountJson, codecForAmountString } from "./amounts.js";
import { BackupRecovery } from "./backup-types.js";
import {
+ Codec,
+ Context,
+ DecodingError,
buildCodecForObject,
buildCodecForUnion,
- Codec,
codecForAny,
codecForBoolean,
codecForConstString,
@@ -42,6 +44,7 @@ import {
codecForNumber,
codecForString,
codecOptional,
+ renderContext,
} from "./codec.js";
import { VersionMatchResult } from "./libtool-version.js";
import { PaytoUri } from "./payto.js";
@@ -50,40 +53,84 @@ import { TalerErrorCode } from "./taler-error-codes.js";
import {
AmountString,
AuditorDenomSig,
- codecForMerchantContractTerms,
- codecForPeerContractTerms,
CoinEnvelope,
- DenominationPubKey,
DenomKeyType,
+ DenominationPubKey,
ExchangeAuditor,
MerchantContractTerms,
PeerContractTerms,
- TrackTransaction,
UnblindedSignature,
+ codecForMerchantContractTerms,
+ codecForPeerContractTerms,
} from "./taler-types.js";
import {
AbsoluteTime,
- codecForAbsoluteTime,
- codecForTimestamp,
TalerProtocolDuration,
TalerProtocolTimestamp,
+ codecForAbsoluteTime,
+ codecForTimestamp,
} from "./time.js";
-import {
- codecForOrderShortInfo,
- OrderShortInfo,
-} from "./transactions-types.js";
+import { OrderShortInfo } from "./transactions-types.js";
/**
* Identifier for a transaction in the wallet.
*/
-export type TransactionIdStr = `txn:${string}:${string}`;
+declare const __txId: unique symbol;
+export type TransactionIdStr = `txn:${string}:${string}` & { [__txId]: true };
/**
* Identifier for a pending task in the wallet.
*/
-export type PendingIdStr = `pnd:${string}:${string}`;
+declare const __pndId: unique symbol;
+export type PendingIdStr = `pnd:${string}:${string}` & { [__pndId]: true };
+
+declare const __tmbId: unique symbol;
+export type TombstoneIdStr = `tmb:${string}:${string}` & { [__tmbId]: true };
+
+function codecForTransactionIdStr(): Codec<TransactionIdStr> {
+ return {
+ decode(x: any, c?: Context): TransactionIdStr {
+ if (typeof x === "string" && x.startsWith("txn:")) {
+ return x as TransactionIdStr;
+ }
+ throw new DecodingError(
+ `expected string starting with "txn:" at ${renderContext(
+ c,
+ )} but got ${x}`,
+ );
+ },
+ };
+}
-export type TombstoneIdStr = `tmb:${string}:${string}`;
+function codecForPendingIdStr(): Codec<PendingIdStr> {
+ return {
+ decode(x: any, c?: Context): PendingIdStr {
+ if (typeof x === "string" && x.startsWith("txn:")) {
+ return x as PendingIdStr;
+ }
+ throw new DecodingError(
+ `expected string starting with "txn:" at ${renderContext(
+ c,
+ )} but got ${x}`,
+ );
+ },
+ };
+}
+
+function codecForTombstoneIdStr(): Codec<TombstoneIdStr> {
+ return {
+ decode(x: any, c?: Context): TombstoneIdStr {
+ if (typeof x === "string" && x.startsWith("tmb:")) {
+ return x as TombstoneIdStr;
+ }
+ throw new DecodingError(
+ `expected string starting with "tmb:" at ${renderContext(
+ c,
+ )} but got ${x}`,
+ );
+ },
+ };
+}
/**
* Response for the create reserve request to the wallet.
@@ -257,12 +304,12 @@ export enum ConfirmPayResultType {
export interface ConfirmPayResultDone {
type: ConfirmPayResultType.Done;
contractTerms: MerchantContractTerms;
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export interface ConfirmPayResultPending {
type: ConfirmPayResultType.Pending;
- transactionId: string;
+ transactionId: TransactionIdStr;
lastError: TalerErrorDetail | undefined;
}
@@ -279,14 +326,14 @@ export const codecForConfirmPayResultPending =
(): Codec<ConfirmPayResultPending> =>
buildCodecForObject<ConfirmPayResultPending>()
.property("lastError", codecOptional(codecForTalerErrorDetail()))
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.property("type", codecForConstString(ConfirmPayResultType.Pending))
.build("ConfirmPayResultPending");
export const codecForConfirmPayResultDone = (): Codec<ConfirmPayResultDone> =>
buildCodecForObject<ConfirmPayResultDone>()
.property("type", codecForConstString(ConfirmPayResultType.Done))
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.property("contractTerms", codecForMerchantContractTerms())
.build("ConfirmPayResultDone");
@@ -387,7 +434,7 @@ export interface PrepareTipResult {
}
export interface AcceptTipResponse {
- transactionId: string;
+ transactionId: TransactionIdStr;
next_url?: string;
}
@@ -419,7 +466,7 @@ export const codecForPreparePayResultPaymentPossible =
.property("amountEffective", codecForAmountString())
.property("amountRaw", codecForAmountString())
.property("contractTerms", codecForMerchantContractTerms())
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.property("proposalId", codecForString())
.property("contractTermsHash", codecForString())
.property("talerUri", codecForString())
@@ -495,7 +542,7 @@ export const codecForPreparePayResultInsufficientBalance =
.property("contractTerms", codecForAny())
.property("talerUri", codecForString())
.property("proposalId", codecForString())
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.property("noncePriv", codecForString())
.property(
"status",
@@ -520,7 +567,7 @@ export const codecForPreparePayResultAlreadyConfirmed =
.property("talerUri", codecOptional(codecForString()))
.property("contractTerms", codecForAny())
.property("contractTermsHash", codecForString())
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.property("proposalId", codecForString())
.build("PreparePayResultAlreadyConfirmed");
@@ -554,7 +601,7 @@ export type PreparePayResult =
*/
export interface PreparePayResultPaymentPossible {
status: PreparePayResultType.PaymentPossible;
- transactionId: string;
+ transactionId: TransactionIdStr;
/**
* @deprecated use transactionId instead
*/
@@ -569,7 +616,7 @@ export interface PreparePayResultPaymentPossible {
export interface PreparePayResultInsufficientBalance {
status: PreparePayResultType.InsufficientBalance;
- transactionId: string;
+ transactionId: TransactionIdStr;
proposalId: string;
contractTerms: MerchantContractTerms;
amountRaw: string;
@@ -580,7 +627,7 @@ export interface PreparePayResultInsufficientBalance {
export interface PreparePayResultAlreadyConfirmed {
status: PreparePayResultType.AlreadyConfirmed;
- transactionId: string;
+ transactionId: TransactionIdStr;
contractTerms: MerchantContractTerms;
paid: boolean;
amountRaw: string;
@@ -603,7 +650,7 @@ export interface BankWithdrawDetails {
export interface AcceptWithdrawalResponse {
reservePub: string;
confirmTransferUrl?: string;
- transactionId: string;
+ transactionId: TransactionIdStr;
}
/**
@@ -1067,7 +1114,7 @@ export interface AcceptManualWithdrawalResult {
*/
reservePub: string;
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export interface ManualWithdrawalDetails {
@@ -1362,12 +1409,12 @@ export const codecForAcceptExchangeTosRequest =
.build("AcceptExchangeTosRequest");
export interface AcceptRefundRequest {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export const codecForApplyRefundRequest = (): Codec<AcceptRefundRequest> =>
buildCodecForObject<AcceptRefundRequest>()
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.build("AcceptRefundRequest");
export interface ApplyRefundFromPurchaseIdRequest {
@@ -1615,7 +1662,7 @@ export interface PrepareRefundRequest {
}
export interface StartRefundQueryForUriResponse {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export const codecForPrepareRefundRequest = (): Codec<PrepareRefundRequest> =>
@@ -1624,13 +1671,13 @@ export const codecForPrepareRefundRequest = (): Codec<PrepareRefundRequest> =>
.build("PrepareRefundRequest");
export interface StartRefundQueryRequest {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export const codecForStartRefundQueryRequest =
(): Codec<StartRefundQueryRequest> =>
buildCodecForObject<StartRefundQueryRequest>()
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.build("StartRefundQueryRequest");
export interface PrepareTipRequest {
@@ -1639,7 +1686,7 @@ export interface PrepareTipRequest {
export const codecForPrepareTipRequest = (): Codec<PrepareTipRequest> =>
buildCodecForObject<PrepareTipRequest>()
- .property("talerTipUri", codecForString())
+ .property("talerTipUri", codecForTransactionIdStr())
.build("PrepareTipRequest");
export interface AcceptTipRequest {
@@ -1652,35 +1699,35 @@ export const codecForAcceptTipRequest = (): Codec<AcceptTipRequest> =>
.build("AcceptTipRequest");
export interface SuspendTransactionRequest {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export const codecForSuspendTransaction =
(): Codec<SuspendTransactionRequest> =>
buildCodecForObject<AbortTransactionRequest>()
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.build("SuspendTransactionRequest");
export interface ResumeTransactionRequest {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export const codecForResumeTransaction = (): Codec<ResumeTransactionRequest> =>
buildCodecForObject<ResumeTransactionRequest>()
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.build("ResumeTransactionRequest");
export interface AbortTransactionRequest {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export interface CancelAbortingTransactionRequest {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export const codecForAbortTransaction = (): Codec<AbortTransactionRequest> =>
buildCodecForObject<AbortTransactionRequest>()
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.build("AbortTransactionRequest");
export interface DepositGroupFees {
@@ -1727,11 +1774,11 @@ export const codecForCreateDepositGroupRequest =
export interface CreateDepositGroupResponse {
depositGroupId: string;
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export interface TxIdResponse {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export interface WithdrawUriInfoResponse {
@@ -1762,23 +1809,23 @@ export interface WalletCurrencyInfo {
}
export interface DeleteTransactionRequest {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export interface RetryTransactionRequest {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export const codecForDeleteTransactionRequest =
(): Codec<DeleteTransactionRequest> =>
buildCodecForObject<DeleteTransactionRequest>()
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.build("DeleteTransactionRequest");
export const codecForRetryTransactionRequest =
(): Codec<RetryTransactionRequest> =>
buildCodecForObject<RetryTransactionRequest>()
- .property("transactionId", codecForString())
+ .property("transactionId", codecForTransactionIdStr())
.build("RetryTransactionRequest");
export interface SetWalletDeviceIdRequest {
@@ -1907,12 +1954,12 @@ interface AttentionBackupUnpaid {
interface AttentionMerchantRefund {
type: AttentionType.MerchantRefund;
- transactionId: string;
+ transactionId: TransactionIdStr;
}
interface AttentionKycWithdrawal {
type: AttentionType.KycWithdrawal;
- transactionId: string;
+ transactionId: TransactionIdStr;
}
interface AttentionExchangeTosChanged {
@@ -1942,12 +1989,12 @@ interface AttentionAuditorDenominationExpires {
}
interface AttentionPullPaymentPaid {
type: AttentionType.PullPaymentPaid;
- transactionId: string;
+ transactionId: TransactionIdStr;
}
interface AttentionPushPaymentReceived {
type: AttentionType.PushPaymentReceived;
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export type UserAttentionUnreadList = Array<{
@@ -2070,7 +2117,7 @@ export interface InitiatePeerPushDebitResponse {
mergePriv: string;
contractPriv: string;
talerUri: string;
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export const codecForInitiatePeerPushDebitRequest =
@@ -2130,11 +2177,11 @@ export interface ConfirmPeerPushCreditRequest {
peerPushPaymentIncomingId: string;
}
export interface AcceptPeerPushPaymentResponse {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export interface AcceptPeerPullPaymentResponse {
- transactionId: string;
+ transactionId: TransactionIdStr;
}
export const codecForConfirmPeerPushPaymentRequest =
@@ -2201,7 +2248,7 @@ export interface InitiatePeerPullCreditResponse {
*/
talerUri: string;
- transactionId: string;
+ transactionId: TransactionIdStr;
}
/**