regular-listener
Version:
RegularListener is a listener that detects the value periodically.
167 lines (159 loc) • 6.33 kB
JavaScript
/**
* @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