add a timer parameter in the wallet constructor in order to resolve #7120
This commit is contained in:
parent
ccb50c6360
commit
a644efe1ab
@ -23,7 +23,7 @@
|
||||
* Imports.
|
||||
*/
|
||||
import { Logger } from "@gnu-taler/taler-util";
|
||||
import * as timer from "../../util/timer.js";
|
||||
import { timer, performanceNow, TimerHandle } from "../../util/timer.js";
|
||||
import { nullCrypto, TalerCryptoInterface } from "../cryptoImplementation.js";
|
||||
import { CryptoWorker } from "./cryptoWorkerInterface.js";
|
||||
|
||||
@ -46,7 +46,7 @@ interface WorkerState {
|
||||
/**
|
||||
* Timer to terminate the worker if it's not busy enough.
|
||||
*/
|
||||
idleTimeoutHandle: timer.TimerHandle | null;
|
||||
idleTimeoutHandle: TimerHandle | null;
|
||||
}
|
||||
|
||||
interface WorkItem {
|
||||
@ -166,7 +166,7 @@ export class CryptoDispatcher {
|
||||
operation: work.operation,
|
||||
};
|
||||
this.resetWorkerTimeout(ws);
|
||||
work.startTime = timer.performanceNow();
|
||||
work.startTime = performanceNow();
|
||||
timer.after(0, () => worker.postMessage(msg));
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,7 @@ import { NodeThreadCryptoWorkerFactory } from "../crypto/workers/nodeThreadWorke
|
||||
import { SynchronousCryptoWorkerFactory } from "../crypto/workers/synchronousWorkerFactory.js";
|
||||
import { openTalerDatabase } from "../db-utils.js";
|
||||
import { HttpRequestLibrary } from "../util/http.js";
|
||||
import { SetTimeoutTimerAPI } from "../util/timer.js";
|
||||
import { Wallet } from "../wallet.js";
|
||||
import { NodeHttpLib } from "./NodeHttpLib.js";
|
||||
|
||||
@ -176,7 +177,10 @@ export async function getDefaultNodeWallet2(
|
||||
workerFactory = new SynchronousCryptoWorkerFactory();
|
||||
}
|
||||
}
|
||||
const w = await Wallet.create(myDb, myHttpLib, workerFactory);
|
||||
|
||||
const timer = new SetTimeoutTimerAPI()
|
||||
|
||||
const w = await Wallet.create(myDb, myHttpLib, timer, workerFactory);
|
||||
|
||||
if (args.notifyHandler) {
|
||||
w.addNotificationListener(args.notifyHandler);
|
||||
|
@ -97,20 +97,6 @@ export const performanceNow: () => bigint = (() => {
|
||||
return () => BigInt(0);
|
||||
})();
|
||||
|
||||
/**
|
||||
* Call a function every time the delay given in milliseconds passes.
|
||||
*/
|
||||
export function every(delayMs: number, callback: () => void): TimerHandle {
|
||||
return new IntervalHandle(setInterval(callback, delayMs));
|
||||
}
|
||||
|
||||
/**
|
||||
* Call a function after the delay given in milliseconds passes.
|
||||
*/
|
||||
export function after(delayMs: number, callback: () => void): TimerHandle {
|
||||
return new TimeoutHandle(setTimeout(callback, delayMs));
|
||||
}
|
||||
|
||||
const nullTimerHandle = {
|
||||
clear() {
|
||||
// do nothing
|
||||
@ -125,13 +111,43 @@ const nullTimerHandle = {
|
||||
/**
|
||||
* Group of timers that can be destroyed at once.
|
||||
*/
|
||||
export interface TimerAPI {
|
||||
after(delayMs: number, callback: () => void): TimerHandle;
|
||||
every(delayMs: number, callback: () => void): TimerHandle;
|
||||
}
|
||||
|
||||
export class SetTimeoutTimerAPI implements TimerAPI {
|
||||
/**
|
||||
* Call a function every time the delay given in milliseconds passes.
|
||||
*/
|
||||
every(delayMs: number, callback: () => void): TimerHandle {
|
||||
return new IntervalHandle(setInterval(callback, delayMs));
|
||||
}
|
||||
|
||||
/**
|
||||
* Call a function after the delay given in milliseconds passes.
|
||||
*/
|
||||
after(delayMs: number, callback: () => void): TimerHandle {
|
||||
return new TimeoutHandle(setTimeout(callback, delayMs));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
export const timer = new SetTimeoutTimerAPI();
|
||||
|
||||
/**
|
||||
* Implementation of [[TimerGroup]] using setTimeout
|
||||
*/
|
||||
export class TimerGroup {
|
||||
private stopped = false;
|
||||
|
||||
private timerMap: { [index: number]: TimerHandle } = {};
|
||||
private readonly timerMap: { [index: number]: TimerHandle } = {};
|
||||
|
||||
private idGen = 1;
|
||||
|
||||
constructor(public readonly timerApi: TimerAPI) { }
|
||||
|
||||
stopCurrentAndFutureTimers(): void {
|
||||
this.stopped = true;
|
||||
for (const x in this.timerMap) {
|
||||
@ -158,7 +174,7 @@ export class TimerGroup {
|
||||
logger.warn("dropping timer since timer group is stopped");
|
||||
return nullTimerHandle;
|
||||
}
|
||||
const h = after(delayMs, callback);
|
||||
const h = this.timerApi.after(delayMs, callback);
|
||||
const myId = this.idGen++;
|
||||
this.timerMap[myId] = h;
|
||||
|
||||
@ -180,7 +196,7 @@ export class TimerGroup {
|
||||
logger.warn("dropping timer since timer group is stopped");
|
||||
return nullTimerHandle;
|
||||
}
|
||||
const h = every(delayMs, callback);
|
||||
const h = this.timerApi.every(delayMs, callback);
|
||||
const myId = this.idGen++;
|
||||
this.timerMap[myId] = h;
|
||||
|
||||
|
@ -192,7 +192,7 @@ import {
|
||||
openPromise,
|
||||
} from "./util/promiseUtils.js";
|
||||
import { DbAccess, GetReadWriteAccess } from "./util/query.js";
|
||||
import { TimerGroup } from "./util/timer.js";
|
||||
import { TimerAPI, TimerGroup } from "./util/timer.js";
|
||||
import { WalletCoreApiClient } from "./wallet-api-types.js";
|
||||
import { TalerCryptoInterface } from "./crypto/cryptoImplementation.js";
|
||||
|
||||
@ -1080,9 +1080,10 @@ export class Wallet {
|
||||
private constructor(
|
||||
db: DbAccess<typeof WalletStoresV1>,
|
||||
http: HttpRequestLibrary,
|
||||
timer: TimerAPI,
|
||||
cryptoWorkerFactory: CryptoWorkerFactory,
|
||||
) {
|
||||
this.ws = new InternalWalletStateImpl(db, http, cryptoWorkerFactory);
|
||||
this.ws = new InternalWalletStateImpl(db, http, timer, cryptoWorkerFactory);
|
||||
}
|
||||
|
||||
get client(): WalletCoreApiClient {
|
||||
@ -1100,9 +1101,10 @@ export class Wallet {
|
||||
static async create(
|
||||
db: DbAccess<typeof WalletStoresV1>,
|
||||
http: HttpRequestLibrary,
|
||||
timer: TimerAPI,
|
||||
cryptoWorkerFactory: CryptoWorkerFactory,
|
||||
): Promise<Wallet> {
|
||||
const w = new Wallet(db, http, cryptoWorkerFactory);
|
||||
const w = new Wallet(db, http, timer, cryptoWorkerFactory);
|
||||
w._client = await getClientFromWalletState(w.ws);
|
||||
return w;
|
||||
}
|
||||
@ -1153,7 +1155,7 @@ class InternalWalletStateImpl implements InternalWalletState {
|
||||
|
||||
insecureTrustExchange = false;
|
||||
|
||||
timerGroup: TimerGroup = new TimerGroup();
|
||||
readonly timerGroup: TimerGroup;
|
||||
latch = new AsyncCondition();
|
||||
stopped = false;
|
||||
|
||||
@ -1200,10 +1202,12 @@ class InternalWalletStateImpl implements InternalWalletState {
|
||||
// and throw an error in that case.
|
||||
public db: DbAccess<typeof WalletStoresV1>,
|
||||
public http: HttpRequestLibrary,
|
||||
public timer: TimerAPI,
|
||||
cryptoWorkerFactory: CryptoWorkerFactory,
|
||||
) {
|
||||
this.cryptoDispatcher = new CryptoDispatcher(cryptoWorkerFactory);
|
||||
this.cryptoApi = this.cryptoDispatcher.cryptoApi;
|
||||
this.timerGroup = new TimerGroup(timer)
|
||||
}
|
||||
|
||||
async getDenomInfo(
|
||||
|
Loading…
Reference in New Issue
Block a user