79 lines
1.8 KiB
TypeScript
79 lines
1.8 KiB
TypeScript
import * as smartpromise from '@push.rocks/smartpromise';
|
|
|
|
/**
|
|
* delay something, works like setTimeout
|
|
* @param timeInMillisecondArg
|
|
* @param passOnArg
|
|
*/
|
|
export let delayFor = async <T>(
|
|
timeInMillisecondArg: number,
|
|
passOnArg?: T,
|
|
unrefedArg = false
|
|
) => {
|
|
const timeout = new Timeout(timeInMillisecondArg, null, unrefedArg);
|
|
await timeout.promise;
|
|
return passOnArg;
|
|
};
|
|
|
|
/**
|
|
* delay for a random time
|
|
*/
|
|
export let delayForRandom = async <T>(
|
|
timeMinInMillisecondArg: number,
|
|
timeMaxInMillisecondArg: number,
|
|
passOnArg?: T,
|
|
unrefedArg = false
|
|
) => {
|
|
await delayFor(
|
|
Math.random() * (timeMaxInMillisecondArg - timeMinInMillisecondArg) + timeMinInMillisecondArg,
|
|
null,
|
|
unrefedArg
|
|
);
|
|
return passOnArg;
|
|
};
|
|
|
|
export class Timeout<T> {
|
|
promise: Promise<T>;
|
|
private _deferred: smartpromise.Deferred<T>;
|
|
private _timeout;
|
|
private _cancelled: boolean = false;
|
|
|
|
private timeoutInMillis: number;
|
|
private started: number;
|
|
|
|
constructor(timeInMillisecondArg, passOn?: T, unrefedArg = false) {
|
|
this.timeoutInMillis = timeInMillisecondArg;
|
|
this._deferred = smartpromise.defer<T>();
|
|
this.promise = this._deferred.promise;
|
|
this._timeout = setTimeout(() => {
|
|
if (!this._cancelled) {
|
|
this._deferred.resolve(passOn);
|
|
}
|
|
}, timeInMillisecondArg);
|
|
this.started = Date.now();
|
|
if (unrefedArg) {
|
|
this.makeUnrefed();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* unreffing a timeout causes the node process to not wait for completion before exit
|
|
*/
|
|
public makeUnrefed() {
|
|
this._timeout.unref();
|
|
}
|
|
|
|
/**
|
|
* cancels the timer
|
|
*/
|
|
public cancel() {
|
|
this._cancelled = true;
|
|
clearTimeout(this._timeout);
|
|
}
|
|
|
|
public getTimeLeft() {
|
|
const result = this.started + this.timeoutInMillis - Date.now();
|
|
return result > 0 ? result : 0;
|
|
}
|
|
}
|