UNPKG

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
"use strict"; 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