UNPKG

saij

Version:
164 lines (133 loc) 12.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.unByKey = unByKey; exports.default = void 0; var _Target = _interopRequireDefault(require("./Target.js")); var _EventType = _interopRequireDefault(require("./EventType.js")); var _events = require("./utils/events.js"); /** * @module saij/core/Observable */ /* eslint max-len: 0 */ /** * @classdesc * Abstract base class; normally only used for creating subclasses and not * instantiated in apps. * An event target providing convenient methods for listener registration * and unregistration. A generic `change` event is always available through * {@link module:saij/core/Observable~Observable#changed}. * * @fires module:saij/core/Event~Event * @api */ class Observable extends _Target.default { constructor() { super(); /** * @private * @type {number} */ this.revision_ = 0; } /** * Increases the revision counter and dispatches a 'change' event. * @api */ changed() { this.revision_ += 1; this.dispatchEvent(_EventType.default.CHANGE); } /** * Get the version number for this object. Each time the object is modified, * its version number will be incremented. * @return {number} Revision. * @api */ getRevision() { return this.revision_; } /** * Listen for a certain type of event. * @param {string|Array<string>} type The event type or array of event types. * @param {function(?): ?} listener The listener function. * @return {module:saij/core/utils/events~EventsKey|Array<module:saij/core/utils/events~EventsKey>} Unique key for the listener. If * called with an array of event types as the first argument, the return * will be an array of keys. * @api */ on(type, listener) { if (Array.isArray(type)) { const len = type.length; const keys = new Array(len); for (let i = 0; i < len; i += 1) { keys[i] = (0, _events.listen)(this, type[i], listener); } return keys; } return (0, _events.listen)(this, /** @type {string} */ type, listener); } /** * Listen once for a certain type of event. * @param {string|Array<string>} type The event type or array of event types. * @param {function(?): ?} listener The listener function. * @return {module:saij/core/utils/events~EventsKey|Array<module:saij/core/utils/events~EventsKey>} Unique key for the listener. If * called with an array of event types as the first argument, the return * will be an array of keys. * @api */ once(type, listener) { if (Array.isArray(type)) { const len = type.length; const keys = new Array(len); for (let i = 0; i < len; i += 1) { keys[i] = (0, _events.listenOnce)(this, type[i], listener); } return keys; } return (0, _events.listenOnce)(this, /** @type {string} */ type, listener); } /** * Unlisten for a certain type of event. * @param {string|Array<string>} type The event type or array of event types. * @param {function(?): ?} listener The listener function. * @api */ un(type, listener) { if (Array.isArray(type)) { for (let i = 0, ii = type.length; i < ii; i += 1) { (0, _events.unlisten)(this, type[i], listener); } return; } (0, _events.unlisten)(this, /** @type {string} */ type, listener); } } /** * Removes an event listener using the key returned by `on()` or `once()`. * @param {module:saij/core/utils/events~EventsKey|Array<module:saij/core/utils/events~EventsKey>} key The key returned by `on()` * or `once()` (or an array of keys). * @api */ function unByKey(key) { if (Array.isArray(key)) { for (let i = 0, ii = key.length; i < ii; i += 1) { (0, _events.unlistenByKey)(key[i]); } } else { (0, _events.unlistenByKey)( /** @type {module:saij/core/utils/events~EventsKey} */ key); } } var _default = Observable; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zYWlqL2NvcmUvT2JzZXJ2YWJsZS5qcyJdLCJuYW1lcyI6WyJPYnNlcnZhYmxlIiwiRXZlbnRUYXJnZXQiLCJjb25zdHJ1Y3RvciIsInJldmlzaW9uXyIsImNoYW5nZWQiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnRUeXBlIiwiQ0hBTkdFIiwiZ2V0UmV2aXNpb24iLCJvbiIsInR5cGUiLCJsaXN0ZW5lciIsIkFycmF5IiwiaXNBcnJheSIsImxlbiIsImxlbmd0aCIsImtleXMiLCJpIiwib25jZSIsInVuIiwiaWkiLCJ1bkJ5S2V5Iiwia2V5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBTEE7Ozs7QUFPQTs7QUFHQTs7Ozs7Ozs7Ozs7QUFXQSxNQUFNQSxVQUFOLFNBQXlCQyxlQUF6QixDQUFxQztBQUNuQ0MsRUFBQUEsV0FBVyxHQUFHO0FBRVo7QUFFQTs7Ozs7QUFJQSxTQUFLQyxTQUFMLEdBQWlCLENBQWpCO0FBRUQ7QUFFRDs7Ozs7O0FBSUFDLEVBQUFBLE9BQU8sR0FBRztBQUNSLFNBQUtELFNBQUwsSUFBa0IsQ0FBbEI7QUFDQSxTQUFLRSxhQUFMLENBQW1CQyxtQkFBVUMsTUFBN0I7QUFDRDtBQUVEOzs7Ozs7OztBQU1BQyxFQUFBQSxXQUFXLEdBQUc7QUFDWixXQUFPLEtBQUtMLFNBQVo7QUFDRDtBQUVEOzs7Ozs7Ozs7OztBQVNBTSxFQUFBQSxFQUFFLENBQUNDLElBQUQsRUFBT0MsUUFBUCxFQUFpQjtBQUNqQixRQUFJQyxLQUFLLENBQUNDLE9BQU4sQ0FBY0gsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLFlBQU1JLEdBQUcsR0FBR0osSUFBSSxDQUFDSyxNQUFqQjtBQUNBLFlBQU1DLElBQUksR0FBRyxJQUFJSixLQUFKLENBQVVFLEdBQVYsQ0FBYjs7QUFDQSxXQUFLLElBQUlHLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdILEdBQXBCLEVBQXlCRyxDQUFDLElBQUksQ0FBOUIsRUFBaUM7QUFDL0JELFFBQUFBLElBQUksQ0FBQ0MsQ0FBRCxDQUFKLEdBQVUsb0JBQU8sSUFBUCxFQUFhUCxJQUFJLENBQUNPLENBQUQsQ0FBakIsRUFBc0JOLFFBQXRCLENBQVY7QUFDRDs7QUFDRCxhQUFPSyxJQUFQO0FBQ0Q7O0FBRUQsV0FBTyxvQkFBTyxJQUFQO0FBQWE7QUFBdUJOLElBQUFBLElBQXBDLEVBQTJDQyxRQUEzQyxDQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7QUFTQU8sRUFBQUEsSUFBSSxDQUFDUixJQUFELEVBQU9DLFFBQVAsRUFBaUI7QUFDbkIsUUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNILElBQWQsQ0FBSixFQUF5QjtBQUN2QixZQUFNSSxHQUFHLEdBQUdKLElBQUksQ0FBQ0ssTUFBakI7QUFDQSxZQUFNQyxJQUFJLEdBQUcsSUFBSUosS0FBSixDQUFVRSxHQUFWLENBQWI7O0FBQ0EsV0FBSyxJQUFJRyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSCxHQUFwQixFQUF5QkcsQ0FBQyxJQUFJLENBQTlCLEVBQWlDO0FBQy9CRCxRQUFBQSxJQUFJLENBQUNDLENBQUQsQ0FBSixHQUFVLHdCQUFXLElBQVgsRUFBaUJQLElBQUksQ0FBQ08sQ0FBRCxDQUFyQixFQUEwQk4sUUFBMUIsQ0FBVjtBQUNEOztBQUNELGFBQU9LLElBQVA7QUFDRDs7QUFFRCxXQUFPLHdCQUFXLElBQVg7QUFBaUI7QUFBdUJOLElBQUFBLElBQXhDLEVBQStDQyxRQUEvQyxDQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7QUFNQVEsRUFBQUEsRUFBRSxDQUFDVCxJQUFELEVBQU9DLFFBQVAsRUFBaUI7QUFDakIsUUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNILElBQWQsQ0FBSixFQUF5QjtBQUN2QixXQUFLLElBQUlPLENBQUMsR0FBRyxDQUFSLEVBQVdHLEVBQUUsR0FBR1YsSUFBSSxDQUFDSyxNQUExQixFQUFrQ0UsQ0FBQyxHQUFHRyxFQUF0QyxFQUEwQ0gsQ0FBQyxJQUFJLENBQS9DLEVBQWtEO0FBQ2hELDhCQUFTLElBQVQsRUFBZVAsSUFBSSxDQUFDTyxDQUFELENBQW5CLEVBQXdCTixRQUF4QjtBQUNEOztBQUNEO0FBQ0Q7O0FBRUQsMEJBQVMsSUFBVDtBQUFlO0FBQXVCRCxJQUFBQSxJQUF0QyxFQUE2Q0MsUUFBN0M7QUFDRDs7QUEzRmtDO0FBK0ZyQzs7Ozs7Ozs7QUFNTyxTQUFTVSxPQUFULENBQWlCQyxHQUFqQixFQUFzQjtBQUMzQixNQUFJVixLQUFLLENBQUNDLE9BQU4sQ0FBY1MsR0FBZCxDQUFKLEVBQXdCO0FBQ3RCLFNBQUssSUFBSUwsQ0FBQyxHQUFHLENBQVIsRUFBV0csRUFBRSxHQUFHRSxHQUFHLENBQUNQLE1BQXpCLEVBQWlDRSxDQUFDLEdBQUdHLEVBQXJDLEVBQXlDSCxDQUFDLElBQUksQ0FBOUMsRUFBaUQ7QUFDL0MsaUNBQWNLLEdBQUcsQ0FBQ0wsQ0FBRCxDQUFqQjtBQUNEO0FBQ0YsR0FKRCxNQUlPO0FBQ0w7QUFBYztBQUF3REssSUFBQUEsR0FBdEU7QUFDRDtBQUNGOztlQUdjdEIsVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBzYWlqL2NvcmUvT2JzZXJ2YWJsZVxuICovXG5pbXBvcnQgRXZlbnRUYXJnZXQgZnJvbSAnLi9UYXJnZXQuanMnO1xuaW1wb3J0IEV2ZW50VHlwZSBmcm9tICcuL0V2ZW50VHlwZS5qcyc7XG5pbXBvcnQge2xpc3RlbiwgdW5saXN0ZW5CeUtleSwgdW5saXN0ZW4sIGxpc3Rlbk9uY2V9IGZyb20gJy4vdXRpbHMvZXZlbnRzLmpzJztcblxuLyogZXNsaW50IG1heC1sZW46IDAgKi9cblxuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3M7IG5vcm1hbGx5IG9ubHkgdXNlZCBmb3IgY3JlYXRpbmcgc3ViY2xhc3NlcyBhbmQgbm90XG4gKiBpbnN0YW50aWF0ZWQgaW4gYXBwcy5cbiAqIEFuIGV2ZW50IHRhcmdldCBwcm92aWRpbmcgY29udmVuaWVudCBtZXRob2RzIGZvciBsaXN0ZW5lciByZWdpc3RyYXRpb25cbiAqIGFuZCB1bnJlZ2lzdHJhdGlvbi4gQSBnZW5lcmljIGBjaGFuZ2VgIGV2ZW50IGlzIGFsd2F5cyBhdmFpbGFibGUgdGhyb3VnaFxuICoge0BsaW5rIG1vZHVsZTpzYWlqL2NvcmUvT2JzZXJ2YWJsZX5PYnNlcnZhYmxlI2NoYW5nZWR9LlxuICpcbiAqIEBmaXJlcyBtb2R1bGU6c2Fpai9jb3JlL0V2ZW50fkV2ZW50XG4gKiBAYXBpXG4gKi9cbmNsYXNzIE9ic2VydmFibGUgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgc3VwZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnJldmlzaW9uXyA9IDA7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZWFzZXMgdGhlIHJldmlzaW9uIGNvdW50ZXIgYW5kIGRpc3BhdGNoZXMgYSAnY2hhbmdlJyBldmVudC5cbiAgICogQGFwaVxuICAgKi9cbiAgY2hhbmdlZCgpIHtcbiAgICB0aGlzLnJldmlzaW9uXyArPSAxO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChFdmVudFR5cGUuQ0hBTkdFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZvciB0aGlzIG9iamVjdC4gIEVhY2ggdGltZSB0aGUgb2JqZWN0IGlzIG1vZGlmaWVkLFxuICAgKiBpdHMgdmVyc2lvbiBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBSZXZpc2lvbi5cbiAgICogQGFwaVxuICAgKi9cbiAgZ2V0UmV2aXNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucmV2aXNpb25fO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgYSBjZXJ0YWluIHR5cGUgb2YgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PHN0cmluZz59IHR5cGUgVGhlIGV2ZW50IHR5cGUgb3IgYXJyYXkgb2YgZXZlbnQgdHlwZXMuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oPyk6ID99IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7bW9kdWxlOnNhaWovY29yZS91dGlscy9ldmVudHN+RXZlbnRzS2V5fEFycmF5PG1vZHVsZTpzYWlqL2NvcmUvdXRpbHMvZXZlbnRzfkV2ZW50c0tleT59IFVuaXF1ZSBrZXkgZm9yIHRoZSBsaXN0ZW5lci4gSWZcbiAgICogICAgIGNhbGxlZCB3aXRoIGFuIGFycmF5IG9mIGV2ZW50IHR5cGVzIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIHJldHVyblxuICAgKiAgICAgd2lsbCBiZSBhbiBhcnJheSBvZiBrZXlzLlxuICAgKiBAYXBpXG4gICAqL1xuICBvbih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICBjb25zdCBsZW4gPSB0eXBlLmxlbmd0aDtcbiAgICAgIGNvbnN0IGtleXMgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAga2V5c1tpXSA9IGxpc3Rlbih0aGlzLCB0eXBlW2ldLCBsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5cztcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdGVuKHRoaXMsIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAodHlwZSksIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gb25jZSBmb3IgYSBjZXJ0YWluIHR5cGUgb2YgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PHN0cmluZz59IHR5cGUgVGhlIGV2ZW50IHR5cGUgb3IgYXJyYXkgb2YgZXZlbnQgdHlwZXMuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oPyk6ID99IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7bW9kdWxlOnNhaWovY29yZS91dGlscy9ldmVudHN+RXZlbnRzS2V5fEFycmF5PG1vZHVsZTpzYWlqL2NvcmUvdXRpbHMvZXZlbnRzfkV2ZW50c0tleT59IFVuaXF1ZSBrZXkgZm9yIHRoZSBsaXN0ZW5lci4gSWZcbiAgICogICAgIGNhbGxlZCB3aXRoIGFuIGFycmF5IG9mIGV2ZW50IHR5cGVzIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIHJldHVyblxuICAgKiAgICAgd2lsbCBiZSBhbiBhcnJheSBvZiBrZXlzLlxuICAgKiBAYXBpXG4gICAqL1xuICBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgIGNvbnN0IGxlbiA9IHR5cGUubGVuZ3RoO1xuICAgICAgY29uc3Qga2V5cyA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBrZXlzW2ldID0gbGlzdGVuT25jZSh0aGlzLCB0eXBlW2ldLCBsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5cztcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdGVuT25jZSh0aGlzLCAvKiogQHR5cGUge3N0cmluZ30gKi8gKHR5cGUpLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogVW5saXN0ZW4gZm9yIGEgY2VydGFpbiB0eXBlIG9mIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSB0eXBlIFRoZSBldmVudCB0eXBlIG9yIGFycmF5IG9mIGV2ZW50IHR5cGVzLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKD8pOiA/fSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gICAqIEBhcGlcbiAgICovXG4gIHVuKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHR5cGUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMSkge1xuICAgICAgICB1bmxpc3Rlbih0aGlzLCB0eXBlW2ldLCBsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdW5saXN0ZW4odGhpcywgLyoqIEB0eXBlIHtzdHJpbmd9ICovICh0eXBlKSwgbGlzdGVuZXIpO1xuICB9XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIHVzaW5nIHRoZSBrZXkgcmV0dXJuZWQgYnkgYG9uKClgIG9yIGBvbmNlKClgLlxuICogQHBhcmFtIHttb2R1bGU6c2Fpai9jb3JlL3V0aWxzL2V2ZW50c35FdmVudHNLZXl8QXJyYXk8bW9kdWxlOnNhaWovY29yZS91dGlscy9ldmVudHN+RXZlbnRzS2V5Pn0ga2V5IFRoZSBrZXkgcmV0dXJuZWQgYnkgYG9uKClgXG4gKiAgICAgb3IgYG9uY2UoKWAgKG9yIGFuIGFycmF5IG9mIGtleXMpLlxuICogQGFwaVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5CeUtleShrZXkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGtleS5sZW5ndGg7IGkgPCBpaTsgaSArPSAxKSB7XG4gICAgICB1bmxpc3RlbkJ5S2V5KGtleVtpXSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHVubGlzdGVuQnlLZXkoLyoqIEB0eXBlIHttb2R1bGU6c2Fpai9jb3JlL3V0aWxzL2V2ZW50c35FdmVudHNLZXl9ICovIChrZXkpKTtcbiAgfVxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IE9ic2VydmFibGU7XG4iXX0=