diff options
author | Florian Dold <florian@dold.me> | 2024-04-23 12:49:42 +0200 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2024-04-23 12:49:42 +0200 |
commit | 666b767766ef299bd58655c55ece6d4a82c3e947 (patch) | |
tree | ad55f617626d96fb656ff7ab4ccb71b7931ee7b9 /packages/taler-wallet-core/src | |
parent | 0308290a128d29792225d7b2f4d2e22cb5d42f72 (diff) | |
download | wallet-core-666b767766ef299bd58655c55ece6d4a82c3e947.tar.gz wallet-core-666b767766ef299bd58655c55ece6d4a82c3e947.tar.bz2 wallet-core-666b767766ef299bd58655c55ece6d4a82c3e947.zip |
wallet-core: support for withdrawals with forced reserve key
Diffstat (limited to 'packages/taler-wallet-core/src')
-rw-r--r-- | packages/taler-wallet-core/src/observable-wrappers.ts | 4 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/shepherd.ts | 23 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/wallet-api-types.ts | 8 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/wallet.ts | 13 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/withdraw.ts | 19 |
5 files changed, 53 insertions, 14 deletions
diff --git a/packages/taler-wallet-core/src/observable-wrappers.ts b/packages/taler-wallet-core/src/observable-wrappers.ts index f09498d95..717de41ca 100644 --- a/packages/taler-wallet-core/src/observable-wrappers.ts +++ b/packages/taler-wallet-core/src/observable-wrappers.ts @@ -60,6 +60,10 @@ export class ObservableTaskScheduler implements TaskScheduler { } } + shutdown(): Promise<void> { + return this.impl.shutdown(); + } + getActiveTasks(): TaskIdStr[] { return this.impl.getActiveTasks(); } diff --git a/packages/taler-wallet-core/src/shepherd.ts b/packages/taler-wallet-core/src/shepherd.ts index 5e2d23fd9..3b160d97f 100644 --- a/packages/taler-wallet-core/src/shepherd.ts +++ b/packages/taler-wallet-core/src/shepherd.ts @@ -149,6 +149,7 @@ export interface TaskScheduler { reload(): Promise<void>; getActiveTasks(): TaskIdStr[]; isIdle(): boolean; + shutdown(): Promise<void>; } export class TaskSchedulerImpl implements TaskScheduler { @@ -176,6 +177,14 @@ export class TaskSchedulerImpl implements TaskScheduler { return [...this.sheps.keys()]; } + async shutdown(): Promise<void> { + const tasksIds = [...this.sheps.keys()]; + logger.info(`Stopping task shepherd.`); + for (const taskId of tasksIds) { + this.stopShepherdTask(taskId); + } + } + async ensureRunning(): Promise<void> { if (this.isRunning) { return; @@ -193,7 +202,7 @@ export class TaskSchedulerImpl implements TaskScheduler { logger.error(`err: ${e}`); }) .then(() => { - logger.info("done running task loop"); + logger.trace("done running task loop"); this.isRunning = false; }); } @@ -212,11 +221,11 @@ export class TaskSchedulerImpl implements TaskScheduler { } private async run(): Promise<void> { - logger.info("Running task loop."); - logger.info(`sheps: ${this.sheps.size}`); + logger.trace("Running task loop."); + logger.trace(`sheps: ${this.sheps.size}`); while (true) { if (this.ws.stopped) { - logger.info("Breaking out of task loop (wallet stopped)."); + logger.trace("Breaking out of task loop (wallet stopped)."); break; } @@ -228,7 +237,7 @@ export class TaskSchedulerImpl implements TaskScheduler { await this.iterCond.wait(); } - logger.info("Done with task loop."); + logger.trace("Done with task loop."); } startShepherdTask(taskId: TaskIdStr): void { @@ -360,11 +369,11 @@ export class TaskSchedulerImpl implements TaskScheduler { }; } if (info.cts.token.isCancelled) { - logger.info("task cancelled, not processing result"); + logger.trace("task cancelled, not processing result"); return; } if (this.ws.stopped) { - logger.info("wallet stopped, not processing result"); + logger.trace("wallet stopped, not processing result"); return; } wex.oc.observe({ diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts index ba28c009a..e876d8aea 100644 --- a/packages/taler-wallet-core/src/wallet-api-types.ts +++ b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -252,6 +252,7 @@ export enum WalletApiOperation { AddGlobalCurrencyAuditor = "addGlobalCurrencyAuditor", RemoveGlobalCurrencyAuditor = "removeGlobalCurrencyAuditor", ListAssociatedRefreshes = "listAssociatedRefreshes", + Shutdown = "shutdown", TestingWaitTransactionsFinal = "testingWaitTransactionsFinal", TestingWaitRefreshesFinal = "testingWaitRefreshesFinal", TestingWaitTransactionState = "testingWaitTransactionState", @@ -278,6 +279,12 @@ export type InitWalletOp = { response: InitResponse; }; +export type ShutdownOp = { + op: WalletApiOperation.Shutdown; + request: EmptyObject; + response: EmptyObject; +}; + /** * Change the configuration of wallet-core. * @@ -1284,6 +1291,7 @@ export type WalletOperations = { [WalletApiOperation.TestingListTaskForTransaction]: TestingListTasksForTransactionOp; [WalletApiOperation.TestingGetDenomStats]: TestingGetDenomStatsOp; [WalletApiOperation.TestingPing]: TestingPingOp; + [WalletApiOperation.Shutdown]: ShutdownOp; }; export type WalletCoreRequestType< diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts index b59f52840..dd6ce96f4 100644 --- a/packages/taler-wallet-core/src/wallet.ts +++ b/packages/taler-wallet-core/src/wallet.ts @@ -145,6 +145,7 @@ import { parsePaytoUri, parseTalerUri, performanceNow, + safeStringifyException, sampleWalletCoreTransactions, setDangerousTimetravel, validateIban, @@ -909,6 +910,7 @@ async function dispatchRequestInternal( amount: Amounts.parseOrThrow(req.amount), exchangeBaseUrl: req.exchangeBaseUrl, restrictAge: req.restrictAge, + forceReservePriv: req.forceReservePriv, }); return res; } @@ -1432,6 +1434,10 @@ async function dispatchRequestInternal( await applyDevExperiment(wex, req.devExperimentUri); return {}; } + case WalletApiOperation.Shutdown: { + wex.ws.stop(); + return {}; + } case WalletApiOperation.GetVersion: { return getVersion(wex); } @@ -1700,10 +1706,6 @@ export class Wallet { return this.ws.addNotificationListener(f); } - stop(): void { - this.ws.stop(); - } - async handleCoreApiRequest( operation: string, id: string, @@ -1952,6 +1954,9 @@ export class InternalWalletState { this.stopped = true; this.timerGroup.stopCurrentAndFutureTimers(); this.cryptoDispatcher.stop(); + this.taskScheduler.shutdown().catch((e) => { + logger.warn(`shutdown failed: ${safeStringifyException(e)}`); + }); } /** diff --git a/packages/taler-wallet-core/src/withdraw.ts b/packages/taler-wallet-core/src/withdraw.ts index 4936135bd..a55ada796 100644 --- a/packages/taler-wallet-core/src/withdraw.ts +++ b/packages/taler-wallet-core/src/withdraw.ts @@ -41,6 +41,7 @@ import { DenomSelItem, DenomSelectionState, Duration, + EddsaPrivateKeyString, ExchangeBatchWithdrawRequest, ExchangeUpdateStatus, ExchangeWireAccount, @@ -3050,6 +3051,7 @@ export async function createManualWithdrawal( amount: AmountLike; restrictAge?: number; forcedDenomSel?: ForcedDenomSel; + forceReservePriv?: EddsaPrivateKeyString; }, ): Promise<AcceptManualWithdrawalResult> { const { exchangeBaseUrl } = req; @@ -3061,9 +3063,20 @@ export async function createManualWithdrawal( "manual withdrawal with conversion from foreign currency is not yet supported", ); } - const reserveKeyPair: EddsaKeypair = await wex.cryptoApi.createEddsaKeypair( - {}, - ); + + let reserveKeyPair: EddsaKeypair; + if (req.forceReservePriv) { + const pubResp = await wex.cryptoApi.eddsaGetPublic({ + priv: req.forceReservePriv, + }); + + reserveKeyPair = { + priv: req.forceReservePriv, + pub: pubResp.pub, + }; + } else { + reserveKeyPair = await wex.cryptoApi.createEddsaKeypair({}); + } const withdrawalAccountsList = await fetchWithdrawalAccountInfo( wex, |