{"version":3,"file":"Observable.mjs","sources":["../../src/Observable.ts"],"sourcesContent":["export type TEventCallback<T = any> = (options: T) => any;\n\ntype EventRegistryObject<E> = {\n  [K in keyof E]?: TEventCallback<E[K]>;\n};\n\n/**\n * @see {@link http://fabric5.fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabric5.fabricjs.com/events|Events demo}\n */\nexport class Observable<EventSpec> {\n  private __eventListeners: Record<keyof EventSpec, TEventCallback[]> =\n    {} as Record<keyof EventSpec, TEventCallback[]>;\n\n  /**\n   * Observes specified event\n   * @alias on\n   * @param {string} eventName Event name (eg. 'after:render')\n   * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n   * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n   * @return {Function} disposer\n   */\n  on<K extends keyof EventSpec, E extends EventSpec[K]>(\n    eventName: K,\n    handler: TEventCallback<E>,\n  ): VoidFunction;\n  on(handlers: EventRegistryObject<EventSpec>): VoidFunction;\n  on<K extends keyof EventSpec, E extends EventSpec[K]>(\n    arg0: K | EventRegistryObject<EventSpec>,\n    handler?: TEventCallback<E>,\n  ): VoidFunction {\n    if (!this.__eventListeners) {\n      this.__eventListeners = {} as Record<keyof EventSpec, TEventCallback[]>;\n    }\n    if (typeof arg0 === 'object') {\n      // one object with key/value pairs was passed\n      Object.entries(arg0).forEach(([eventName, handler]) => {\n        this.on(eventName as K, handler as TEventCallback);\n      });\n      return () => this.off(arg0);\n    } else if (handler) {\n      const eventName = arg0;\n      if (!this.__eventListeners[eventName]) {\n        this.__eventListeners[eventName] = [];\n      }\n      this.__eventListeners[eventName].push(handler);\n      return () => this.off(eventName, handler);\n    } else {\n      // noop\n      return () => false;\n    }\n  }\n\n  /**\n   * Observes specified event **once**\n   * @alias once\n   * @param {string} eventName Event name (eg. 'after:render')\n   * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n   * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n   * @return {Function} disposer\n   */\n  once<K extends keyof EventSpec, E extends EventSpec[K]>(\n    eventName: K,\n    handler: TEventCallback<E>,\n  ): VoidFunction;\n  once(handlers: EventRegistryObject<EventSpec>): VoidFunction;\n  once<K extends keyof EventSpec, E extends EventSpec[K]>(\n    arg0: K | EventRegistryObject<EventSpec>,\n    handler?: TEventCallback<E>,\n  ): VoidFunction {\n    if (typeof arg0 === 'object') {\n      // one object with key/value pairs was passed\n      const disposers: VoidFunction[] = [];\n      Object.entries(arg0).forEach(([eventName, handler]) => {\n        disposers.push(this.once(eventName as K, handler as TEventCallback));\n      });\n      return () => disposers.forEach((d) => d());\n    } else if (handler) {\n      const disposer = this.on<K, E>(\n        arg0,\n        function onceHandler(this: Observable<EventSpec>, ...args) {\n          handler.call(this, ...args);\n          disposer();\n        },\n      );\n      return disposer;\n    } else {\n      // noop\n      return () => false;\n    }\n  }\n\n  /**\n   * @private\n   * @param {string} eventName\n   * @param {Function} [handler]\n   */\n  private _removeEventListener<K extends keyof EventSpec>(\n    eventName: K,\n    handler?: TEventCallback,\n  ) {\n    if (!this.__eventListeners[eventName]) {\n      return;\n    }\n\n    if (handler) {\n      const eventListener = this.__eventListeners[eventName];\n      const index = eventListener.indexOf(handler);\n      index > -1 && eventListener.splice(index, 1);\n    } else {\n      this.__eventListeners[eventName] = [];\n    }\n  }\n\n  /**\n   * Unsubscribe all event listeners for eventname.\n   * Do not use this pattern. You could kill internal fabricJS events.\n   * We know we should have protected events for internal flows, but we don't have yet\n   * @deprecated\n   * @param {string} eventName event name (eg. 'after:render')\n   */\n  off<K extends keyof EventSpec>(eventName: K): void;\n  /**\n   * unsubscribe an event listener\n   * @param {string} eventName event name (eg. 'after:render')\n   * @param {TEventCallback} handler event listener to unsubscribe\n   */\n  off<K extends keyof EventSpec>(eventName: K, handler: TEventCallback): void;\n  /**\n   * unsubscribe event listeners\n   * @param handlers handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n   */\n  off(handlers: EventRegistryObject<EventSpec>): void;\n  /**\n   * unsubscribe all event listeners\n   */\n  off(): void;\n  off<K extends keyof EventSpec>(\n    arg0?: K | EventRegistryObject<EventSpec>,\n    handler?: TEventCallback,\n  ) {\n    if (!this.__eventListeners) {\n      return;\n    }\n\n    // remove all key/value pairs (event name -> event handler)\n    if (typeof arg0 === 'undefined') {\n      for (const eventName in this.__eventListeners) {\n        this._removeEventListener(eventName);\n      }\n    }\n    // one object with key/value pairs was passed\n    else if (typeof arg0 === 'object') {\n      Object.entries(arg0).forEach(([eventName, handler]) => {\n        this._removeEventListener(eventName as K, handler as TEventCallback);\n      });\n    } else {\n      this._removeEventListener(arg0, handler);\n    }\n  }\n\n  /**\n   * Fires event with an optional options object\n   * @param {String} eventName Event name to fire\n   * @param {Object} [options] Options object\n   */\n  fire<K extends keyof EventSpec>(eventName: K, options?: EventSpec[K]) {\n    if (!this.__eventListeners) {\n      return;\n    }\n\n    const listenersForEvent = this.__eventListeners[eventName]?.concat();\n    if (listenersForEvent) {\n      for (let i = 0; i < listenersForEvent.length; i++) {\n        listenersForEvent[i].call(this, options || {});\n      }\n    }\n  }\n}\n"],"names":["Observable","constructor","_defineProperty","on","arg0","handler","__eventListeners","Object","entries","forEach","_ref","eventName","off","push","once","disposers","_ref2","d","disposer","onceHandler","_len","arguments","length","args","Array","_key","call","_removeEventListener","eventListener","index","indexOf","splice","_ref3","fire","options","_this$__eventListener","listenersForEvent","concat","i"],"mappings":"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"}