handlor
Version:
Handles and stores eventsListeners, timeouts/intervals and animationFrames and stores in one place for convenient cancelling and unsubscribing of events
160 lines • 5.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
/**
* Enum for listener types
*/
var Type;
(function (Type) {
Type["Timeout"] = "timeout";
Type["Interval"] = "interval";
Type["RequestAnimationFrame"] = "requestAnimationFrame";
})(Type = exports.Type || (exports.Type = {}));
/**
* Main class to handle listeners
*/
var Handlor = /** @class */ (function () {
function Handlor() {
this.listeners = {};
}
/**
* Registers listeners and returns their IDs
*/
Handlor.prototype.registerHandles = function (data) {
var e_1, _a;
var keys = [];
if (Array.isArray(data)) {
try {
// handle multiple collects
for (var data_1 = tslib_1.__values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) {
var handle = data_1_1.value;
keys.push(this.addEvent(handle));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1);
}
finally { if (e_1) throw e_1.error; }
}
}
else {
keys.push(this.addEvent(data));
}
return keys;
};
;
Handlor.prototype.addEvent = function (handle) {
var eventId = Math.random() * 99999; // FIXME use a util func
var type = handle.type, callback = handle.callback, options = handle.options, addEventListenerOptions = handle.addEventListenerOptions;
/**
* Determine type of event to add
* Register the listeners and save
* them in the listeners object
*/
switch (type) {
case Type.Timeout: {
var id = setTimeout.apply(void 0, tslib_1.__spread([callback,
(options && options.timeoutInMs) || 0], (options && options.params ? options.params : [])));
this.listeners[eventId] = {
type: Type.Timeout,
id: id,
};
break;
}
case Type.Interval: {
var id = setInterval.apply(void 0, tslib_1.__spread([callback,
(options && options.timeoutInMs) || 0], (options && options.params ? options.params : [])));
this.listeners[eventId] = {
type: Type.Interval,
id: id,
};
break;
}
case Type.RequestAnimationFrame: {
var id = window.requestAnimationFrame(callback);
this.listeners[eventId] = {
type: Type.RequestAnimationFrame,
id: id,
};
break;
}
default: {
// Handle all addEventListener cases
((options && options.listenerNode)
|| window).addEventListener(type, callback, addEventListenerOptions);
this.listeners[eventId] = {
type: type,
callback: callback,
options: options,
};
}
}
// return id of the collected item. USed to clean a specific handler with this.clear
return eventId;
};
;
Handlor.prototype.cleanAll = function () {
/*
* determine type
* 1. eventListener can have options
* 2. interval has timeout
* 3. timeout has timeout
* 4. requestAnimationFrame
*/
for (var listener in this.listeners) {
if (this.listeners.hasOwnProperty(listener)) {
this.cleanItem(listener);
}
}
};
;
Handlor.prototype.cleanItems = function (keys) {
var e_2, _a;
try {
for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
var key = keys_1_1.value;
this.cleanItem(key);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
}
finally { if (e_2) throw e_2.error; }
}
};
Handlor.prototype.cleanItem = function (key) {
var item = this.listeners[key];
if (!item) {
return new Error("No such listener key registered");
}
var type = item.type, id = item.id, callback = item.callback, options = item.options;
switch (type) {
case Type.Timeout: {
clearTimeout(id);
break;
}
case Type.Interval: {
clearInterval(id);
break;
}
case Type.RequestAnimationFrame: {
((options && options.listenerNode)
|| window).cancelAnimationFrame(id);
break;
}
default: {
((options && options.listenerNode)
|| window).removeEventListener(type, callback);
}
}
delete this.listeners[key];
};
;
return Handlor;
}());
exports.Handlor = Handlor;
//# sourceMappingURL=index.js.map