UNPKG

matrix-react-sdk

Version:
124 lines (115 loc) 12 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _utils = require("matrix-js-sdk/src/utils"); /* Copyright 2024 New Vector Ltd. Copyright 2018-2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ /** A countdown timer, exposing a promise api. A timer starts in a non-started state, and needs to be started by calling `start()`` on it first. Timers can be `abort()`-ed which makes the promise reject prematurely. Once a timer is finished or aborted, it can't be started again (because the promise should not be replaced). Instead, create a new one through `clone()` or `cloneIfRun()`. */ class Timer { constructor(timeout) { (0, _defineProperty2.default)(this, "timerHandle", void 0); (0, _defineProperty2.default)(this, "startTs", void 0); (0, _defineProperty2.default)(this, "deferred", void 0); (0, _defineProperty2.default)(this, "onTimeout", () => { const now = Date.now(); const elapsed = now - this.startTs; if (elapsed >= this.timeout) { this.deferred.resolve(); this.setNotStarted(); } else { const delta = this.timeout - elapsed; this.timerHandle = window.setTimeout(this.onTimeout, delta); } }); this.timeout = timeout; this.setNotStarted(); } setNotStarted() { this.timerHandle = undefined; this.startTs = undefined; this.deferred = (0, _utils.defer)(); this.deferred.promise = this.deferred.promise.finally(() => { this.timerHandle = undefined; }); } changeTimeout(timeout) { if (timeout === this.timeout) { return; } const isSmallerTimeout = timeout < this.timeout; this.timeout = timeout; if (this.isRunning() && isSmallerTimeout) { clearTimeout(this.timerHandle); this.onTimeout(); } } /** * if not started before, starts the timer. * @returns {Timer} the same timer */ start() { if (!this.isRunning()) { this.startTs = Date.now(); this.timerHandle = window.setTimeout(this.onTimeout, this.timeout); } return this; } /** * (re)start the timer. If it's running, reset the timeout. If not, start it. * @returns {Timer} the same timer */ restart() { if (this.isRunning()) { // don't clearTimeout here as this method // can be called in fast succession, // instead just take note and compare // when the already running timeout expires this.startTs = Date.now(); return this; } else { return this.start(); } } /** * if the timer is running, abort it, * and reject the promise for this timer. * @returns {Timer} the same timer */ abort() { if (this.isRunning()) { clearTimeout(this.timerHandle); this.deferred.reject(new Error("Timer was aborted.")); this.setNotStarted(); } return this; } /** *promise that will resolve when the timer elapses, *or is rejected when abort is called *@return {Promise} */ finished() { return this.deferred.promise; } isRunning() { return this.timerHandle !== undefined; } } exports.default = Timer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXRpbHMiLCJyZXF1aXJlIiwiVGltZXIiLCJjb25zdHJ1Y3RvciIsInRpbWVvdXQiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsIm5vdyIsIkRhdGUiLCJlbGFwc2VkIiwic3RhcnRUcyIsImRlZmVycmVkIiwicmVzb2x2ZSIsInNldE5vdFN0YXJ0ZWQiLCJkZWx0YSIsInRpbWVySGFuZGxlIiwid2luZG93Iiwic2V0VGltZW91dCIsIm9uVGltZW91dCIsInVuZGVmaW5lZCIsImRlZmVyIiwicHJvbWlzZSIsImZpbmFsbHkiLCJjaGFuZ2VUaW1lb3V0IiwiaXNTbWFsbGVyVGltZW91dCIsImlzUnVubmluZyIsImNsZWFyVGltZW91dCIsInN0YXJ0IiwicmVzdGFydCIsImFib3J0IiwicmVqZWN0IiwiRXJyb3IiLCJmaW5pc2hlZCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvVGltZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTgtMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBJRGVmZXJyZWQsIGRlZmVyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3V0aWxzXCI7XG5cbi8qKlxuQSBjb3VudGRvd24gdGltZXIsIGV4cG9zaW5nIGEgcHJvbWlzZSBhcGkuXG5BIHRpbWVyIHN0YXJ0cyBpbiBhIG5vbi1zdGFydGVkIHN0YXRlLFxuYW5kIG5lZWRzIHRvIGJlIHN0YXJ0ZWQgYnkgY2FsbGluZyBgc3RhcnQoKWBgIG9uIGl0IGZpcnN0LlxuXG5UaW1lcnMgY2FuIGJlIGBhYm9ydCgpYC1lZCB3aGljaCBtYWtlcyB0aGUgcHJvbWlzZSByZWplY3QgcHJlbWF0dXJlbHkuXG5cbk9uY2UgYSB0aW1lciBpcyBmaW5pc2hlZCBvciBhYm9ydGVkLCBpdCBjYW4ndCBiZSBzdGFydGVkIGFnYWluXG4oYmVjYXVzZSB0aGUgcHJvbWlzZSBzaG91bGQgbm90IGJlIHJlcGxhY2VkKS4gSW5zdGVhZCwgY3JlYXRlXG5hIG5ldyBvbmUgdGhyb3VnaCBgY2xvbmUoKWAgb3IgYGNsb25lSWZSdW4oKWAuXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICAgIHByaXZhdGUgdGltZXJIYW5kbGU/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBzdGFydFRzPzogbnVtYmVyO1xuICAgIHByaXZhdGUgZGVmZXJyZWQhOiBJRGVmZXJyZWQ8dm9pZD47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSB0aW1lb3V0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXROb3RTdGFydGVkKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXROb3RTdGFydGVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRpbWVySGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnN0YXJ0VHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgICAgICB0aGlzLmRlZmVycmVkLnByb21pc2UgPSB0aGlzLmRlZmVycmVkLnByb21pc2UuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRpbWVySGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGltZW91dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZCA9IG5vdyAtIHRoaXMuc3RhcnRUcyE7XG4gICAgICAgIGlmIChlbGFwc2VkID49IHRoaXMudGltZW91dCkge1xuICAgICAgICAgICAgdGhpcy5kZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLnNldE5vdFN0YXJ0ZWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy50aW1lb3V0IC0gZWxhcHNlZDtcbiAgICAgICAgICAgIHRoaXMudGltZXJIYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9uVGltZW91dCwgZGVsdGEpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBjaGFuZ2VUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGltZW91dCA9PT0gdGhpcy50aW1lb3V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNTbWFsbGVyVGltZW91dCA9IHRpbWVvdXQgPCB0aGlzLnRpbWVvdXQ7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIGlmICh0aGlzLmlzUnVubmluZygpICYmIGlzU21hbGxlclRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVySGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMub25UaW1lb3V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBpZiBub3Qgc3RhcnRlZCBiZWZvcmUsIHN0YXJ0cyB0aGUgdGltZXIuXG4gICAgICogQHJldHVybnMge1RpbWVyfSB0aGUgc2FtZSB0aW1lclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGFydCgpOiBUaW1lciB7XG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydFRzID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRoaXMudGltZXJIYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9uVGltZW91dCwgdGhpcy50aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAocmUpc3RhcnQgdGhlIHRpbWVyLiBJZiBpdCdzIHJ1bm5pbmcsIHJlc2V0IHRoZSB0aW1lb3V0LiBJZiBub3QsIHN0YXJ0IGl0LlxuICAgICAqIEByZXR1cm5zIHtUaW1lcn0gdGhlIHNhbWUgdGltZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzdGFydCgpOiBUaW1lciB7XG4gICAgICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICAgICAgICAvLyBkb24ndCBjbGVhclRpbWVvdXQgaGVyZSBhcyB0aGlzIG1ldGhvZFxuICAgICAgICAgICAgLy8gY2FuIGJlIGNhbGxlZCBpbiBmYXN0IHN1Y2Nlc3Npb24sXG4gICAgICAgICAgICAvLyBpbnN0ZWFkIGp1c3QgdGFrZSBub3RlIGFuZCBjb21wYXJlXG4gICAgICAgICAgICAvLyB3aGVuIHRoZSBhbHJlYWR5IHJ1bm5pbmcgdGltZW91dCBleHBpcmVzXG4gICAgICAgICAgICB0aGlzLnN0YXJ0VHMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaWYgdGhlIHRpbWVyIGlzIHJ1bm5pbmcsIGFib3J0IGl0LFxuICAgICAqIGFuZCByZWplY3QgdGhlIHByb21pc2UgZm9yIHRoaXMgdGltZXIuXG4gICAgICogQHJldHVybnMge1RpbWVyfSB0aGUgc2FtZSB0aW1lclxuICAgICAqL1xuICAgIHB1YmxpYyBhYm9ydCgpOiBUaW1lciB7XG4gICAgICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lckhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLmRlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoXCJUaW1lciB3YXMgYWJvcnRlZC5cIikpO1xuICAgICAgICAgICAgdGhpcy5zZXROb3RTdGFydGVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdoZW4gdGhlIHRpbWVyIGVsYXBzZXMsXG4gICAgICpvciBpcyByZWplY3RlZCB3aGVuIGFib3J0IGlzIGNhbGxlZFxuICAgICAqQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluaXNoZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmVycmVkLnByb21pc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUnVubmluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZXJIYW5kbGUgIT09IHVuZGVmaW5lZDtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLE1BQU1DLEtBQUssQ0FBQztFQUtoQkMsV0FBV0EsQ0FBU0MsT0FBZSxFQUFFO0lBQUEsSUFBQUMsZ0JBQUEsQ0FBQUMsT0FBQTtJQUFBLElBQUFELGdCQUFBLENBQUFDLE9BQUE7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQSxxQkFheEIsTUFBWTtNQUM1QixNQUFNQyxHQUFHLEdBQUdDLElBQUksQ0FBQ0QsR0FBRyxDQUFDLENBQUM7TUFDdEIsTUFBTUUsT0FBTyxHQUFHRixHQUFHLEdBQUcsSUFBSSxDQUFDRyxPQUFRO01BQ25DLElBQUlELE9BQU8sSUFBSSxJQUFJLENBQUNMLE9BQU8sRUFBRTtRQUN6QixJQUFJLENBQUNP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