/*! @license
* Shaka Player
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
goog.provide('shaka.util.Timer');
goog.require('shaka.util.DelayedTick');
/**
* A timer allows a single function to be executed at a later time or at
* regular intervals.
*
* @final
* @export
*/
shaka.util.Timer = class {
/**
* Create a new timer. A timer is committed to a single callback function.
* While there is no technical reason to do this, it is far easier to
* understand and use timers when they are connected to one functional idea.
*
* @param {function()} onTick
*/
constructor(onTick) {
/**
* Each time our timer "does work", we call that a "tick". The name comes
* from old analog clocks.
*
* @private {function()}
*/
this.onTick_ = onTick;
/** @private {shaka.util.DelayedTick} */
this.ticker_ = null;
}
/**
* Have the timer call |onTick| now.
*
* @return {!shaka.util.Timer}
* @export
*/
tickNow() {
this.stop();
this.onTick_();
return this;
}
/**
* Have the timer call |onTick| after |seconds| has elapsed unless |stop| is
* called first.
*
* @param {number} seconds
* @return {!shaka.util.Timer}
* @export
*/
tickAfter(seconds) {
this.stop();
this.ticker_ = new shaka.util.DelayedTick(() => {
this.onTick_();
}).tickAfter(seconds);
return this;
}
/**
* Have the timer call |onTick| every |seconds| until |stop| is called.
*
* @param {number} seconds
* @return {!shaka.util.Timer}
* @export
*/
tickEvery(seconds) {
this.stop();
if (goog.DEBUG) {
// Capture the stack trace by making a fake error.
const stackTrace = Error('Timer created').stack;
shaka.util.Timer.activeTimers.set(this, stackTrace);
}
this.ticker_ = new shaka.util.DelayedTick(() => {
// Schedule the timer again first. |onTick_| could cancel the timer and
// rescheduling first simplifies the implementation.
this.ticker_.tickAfter(seconds);
this.onTick_();
}).tickAfter(seconds);
return this;
}
/**
* Stop the timer and clear the previous behaviour. The timer is still usable
* after calling |stop|.
*
* @export
*/
stop() {
if (this.ticker_) {
this.ticker_.stop();
this.ticker_ = null;
}
if (goog.DEBUG) {
shaka.util.Timer.activeTimers.delete(this);
}
}
};
if (goog.DEBUG) {
/**
* Tracks all active timer instances, along with the stack trace that created
* that timer.
* @type {!Map.<!shaka.util.Timer, string>}
*/
shaka.util.Timer.activeTimers = new Map();
}