dom-observe
Version:
  • 3.79 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DOMObserver = void 0;
const events_1 = require("events");
const delay_me_1 = require("delay-me");
class DOMObserver {
/**
* @param {SelectorCallback<T>} selector
* @param {IDOMObserverInitParameters<T>>} parameters
*/
constructor(selector, parameters) {
this.emitter = new events_1.EventEmitter();
this.observer = null;
this._is_active = false;
this._parameters = null;
this._state = 'disappeared';
this.$elementRef = null;
this._parameters = parameters;
this.selector = selector;
this.observeProcess = this.observeProcess.bind(this);
this.onMutationOccurred = this.onMutationOccurred.bind(this);
}
get isActive() { return this._is_active; }
get parameters() { return Object.assign({}, this._parameters); }
/**
* Starts DOM observation
*/
start() {
if (this._is_active)
return;
this._is_active = true;
this.emit('start');
delay_me_1.setImmediate(this.observeProcess);
}
/**
* Stops DOM observation
*/
stop() {
if (!this._is_active)
return;
this._is_active = false;
this.observer.disconnect();
this.observer = null;
this.emit('stop');
}
/**
* @returns {Promise<void>}
* @protected
*/
async observeProcess() {
if (!this._is_active)
return;
switch (this._state) {
case 'appeared':
{
if (this.$elementRef === null || !document.contains(this.$elementRef)) {
this._state = 'disappeared';
if (this.observer !== null) {
this.observer.disconnect();
this.observer = null;
}
const $element = this.$elementRef;
this.$elementRef = null;
this.emit('disappear', $element);
}
}
break;
case 'disappeared':
{
let $element = this.selector.apply(null, []);
if ($element !== null) {
this._state = 'appeared';
this.$elementRef = $element;
this.emit('appear', $element);
if (this.observer !== null) {
this.observer.disconnect();
this.observer = null;
}
if (!this._is_active)
return;
this.observer = new MutationObserver(this.onMutationOccurred);
this.observer.observe(this.$elementRef, this._parameters);
}
}
break;
}
if (this._is_active) {
await delay_me_1.sleep(this.parameters.interval);
delay_me_1.setImmediate(this.observeProcess);
}
}
/**
* @param {MutationRecord[]} mutations
* @protected
*/
onMutationOccurred(mutations) {
if (!this._is_active)
return;
this.emit('change', this.$elementRef, mutations);
}
emit(event, ...args) {
this.emitter.emit(event, ...args);
}
on(event, listener) {
this.emitter.on(event, listener);
return this;
}
once(event, listener) {
this.emitter.once(event, listener);
return this;
}
off(event, listener) {
this.emitter.off(event, listener);
return this;
}
}
exports.DOMObserver = DOMObserver;