diff options
author | Florian Dold <florian.dold@gmail.com> | 2019-12-02 00:42:40 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2019-12-02 00:42:40 +0100 |
commit | e1369ff7e8fc02116b9c4261036f0e42e3423cf4 (patch) | |
tree | c621067ebda8977a888bfed34b7bbecf64b3b0f0 /src/util/timer.ts | |
parent | aaf7e1338d6cdb1b4e01ad318938b3eaea2f922b (diff) | |
download | wallet-core-e1369ff7e8fc02116b9c4261036f0e42e3423cf4.tar.xz |
the giant refactoring: split wallet into multiple parts
Diffstat (limited to 'src/util/timer.ts')
-rw-r--r-- | src/util/timer.ts | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/util/timer.ts b/src/util/timer.ts new file mode 100644 index 000000000..d3bb5d485 --- /dev/null +++ b/src/util/timer.ts @@ -0,0 +1,145 @@ +/* + This file is part of TALER + (C) 2017 GNUnet e.V. + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** + * Cross-platform timers. + * + * NodeJS and the browser use slightly different timer API, + * this abstracts over these differences. + */ + +/** + * Cancelable timer. + */ +export interface TimerHandle { + clear(): void; +} + +class IntervalHandle { + constructor(public h: any) { + } + + clear() { + clearInterval(this.h); + } +} + +class TimeoutHandle { + constructor(public h: any) { + } + + clear() { + clearTimeout(this.h); + } +} + +/** + * Get a performance counter in milliseconds. + */ +export const performanceNow: () => number = (() => { + if (typeof process !== "undefined" && process.hrtime) { + return () => { + const t = process.hrtime(); + return t[0] * 1e9 + t[1]; + }; + } else if (typeof "performance" !== "undefined") { + return () => performance.now(); + } else { + return () => 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 + return; + }, +}; + +/** + * Group of timers that can be destroyed at once. + */ +export class TimerGroup { + private stopped: boolean = false; + + private timerMap: { [index: number]: TimerHandle } = {}; + + private idGen = 1; + + stopCurrentAndFutureTimers() { + this.stopped = true; + for (const x in this.timerMap) { + if (!this.timerMap.hasOwnProperty(x)) { + continue; + } + this.timerMap[x].clear(); + delete this.timerMap[x]; + } + } + + after(delayMs: number, callback: () => void): TimerHandle { + if (this.stopped) { + console.warn("dropping timer since timer group is stopped"); + return nullTimerHandle; + } + const h = after(delayMs, callback); + const myId = this.idGen++; + this.timerMap[myId] = h; + + const tm = this.timerMap; + + return { + clear() { + h.clear(); + delete tm[myId]; + }, + }; + } + + every(delayMs: number, callback: () => void): TimerHandle { + if (this.stopped) { + console.warn("dropping timer since timer group is stopped"); + return nullTimerHandle; + } + const h = every(delayMs, callback); + const myId = this.idGen++; + this.timerMap[myId] = h; + + const tm = this.timerMap; + + return { + clear() { + h.clear(); + delete tm[myId]; + }, + }; + } +} |