UNPKG

regular-listener

Version:

RegularListener is a listener that detects the value periodically.

167 lines (159 loc) 6.33 kB
/** * @license * author: SNinjo <contact@SNinjo.com> (https://SNinjo.com) * regular-listener v1.0.7 * Released under the MIT license. */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["regular-listener"] = global["regular-listener"] || {})); })(this, (function (exports) { 'use strict'; class RegularListener { delay = 1000; intervalId = 0; readTypeOfArray = 'array'; isMessagePrinted = false; onTrigger = () => { }; onError = null; constructor(onTrigger) { if (onTrigger) { this.onTrigger = onTrigger; } } toString(value) { if (value instanceof Array) return `[${value.join(', ')}]`; else return `${value}`; } async run(getValue, isOnce) { return new Promise((resolve, reject) => { const run = async () => { try { const value = getValue(); let isTriggered = false; switch (this.readTypeOfArray) { case 'array': isTriggered = this.isTriggered(value); break; case 'some': case 'every': if (!(value instanceof Array)) throw new Error(`The value isn't an array, please set readTypeOfArray to "array".`); if (value.length === 0) throw new Error(`There are no value in the array, please add at least one value for listener.`); isTriggered = (value .map((element, index, value) => this.isTriggered(element, index, value))?.[this.readTypeOfArray](boolean => boolean)); break; } // eslint-disable-next-line no-console if (this.isMessagePrinted) console.log(`listen | isTriggered: ${isTriggered}, value: ${this.toString(value)}`); if (isTriggered) { if (isOnce) clearInterval(this.intervalId); await this.onTrigger(value); resolve(); } } catch (error) { clearInterval(this.intervalId); if (this.onError) { // eslint-disable-next-line no-console if (this.isMessagePrinted) console.warn(`catch error | ${error}`); await this.onError(error); resolve(); } else { reject(error); } } }; this.intervalId = setInterval(run, this.delay); run(); }); } async listenOnce(getValue) { return this.run(getValue, true); } async listen(getValue) { return this.run(getValue, false); } stop() { clearInterval(this.intervalId); } catch(onError) { this.onError = onError; } setDelay(delay) { this.delay = delay; } setReadTypeOfArray(readTypeOfArray) { this.readTypeOfArray = readTypeOfArray; } printMessage() { this.isMessagePrinted = true; } hideMessage() { this.isMessagePrinted = false; } } class BooleanListener extends RegularListener { isTriggered(value) { return Boolean(value); } } class ValueExistedListener extends RegularListener { isTriggered(value) { return (value !== undefined) && (value !== null); } } class ValueUpdatedListener extends RegularListener { isValueInitialized = false; lastValue; isTriggered(value, index, array) { if ((index !== undefined) && (array !== undefined)) { if (!this.isValueInitialized) { if (index !== (array.length - 1)) { return false; } else { this.isValueInitialized = true; this.lastValue = array; return false; } } if (!(this.lastValue instanceof Array)) throw new Error(`The last value isn't an array, please set initial value to be an array or set readTypeOfArray to "array".`); if (this.lastValue.length !== array.length) return true; const isUpdated = this.lastValue[index] !== value; this.lastValue[index] = value; return isUpdated; } else { if (!this.isValueInitialized) { this.isValueInitialized = true; this.lastValue = value; return false; } const isUpdated = (this.lastValue !== value); this.lastValue = value; return isUpdated; } } setInitialValue(value) { this.lastValue = value; this.isValueInitialized = true; } } exports = module.exports = RegularListener; exports.BooleanListener = BooleanListener; exports.ValueExistedListener = ValueExistedListener; exports.ValueUpdatedListener = ValueUpdatedListener; exports["default"] = RegularListener; Object.defineProperty(exports, '__esModule', { value: true }); })); //# sourceMappingURL=index.js.map