diff --git a/packages/super-editor/src/core/EventEmitter.js b/packages/super-editor/src/core/EventEmitter.js index a01060a7e4..1dcc94d855 100644 --- a/packages/super-editor/src/core/EventEmitter.js +++ b/packages/super-editor/src/core/EventEmitter.js @@ -6,8 +6,9 @@ export class EventEmitter { /** * Subscribe to the event. - * @param name Event name. - * @param fn Callback. + * @param {string} name Event name. + * @param {(...args: any[]) => void} fn Callback. + * @returns {void} */ on(name, fn) { const callbacks = this.#events.get(name); @@ -17,8 +18,9 @@ export class EventEmitter { /** * Emit event. - * @param name Event name. - * @param args Arguments. + * @param {string} name Event name. + * @param {...any} args – Arguments to pass to each listener. + * @returns {void} */ emit(name, ...args) { const callbacks = this.#events.get(name); @@ -31,8 +33,9 @@ export class EventEmitter { /** * Remove a specific callback from event * or all event subscriptions. - * @param name Event name. - * @param fn Callback. + * @param {string} name Event name. + * @param {(...args: any[]) => void} fn Callback. + * @returns {void} */ off(name, fn) { const callbacks = this.#events.get(name); @@ -47,6 +50,20 @@ export class EventEmitter { } } + /** + * Subscribe to an event that will be called only once. + * @param {string} name Event name. + * @param {(...args: any[]) => void} fn Callback. + * @returns {void} + */ + once(name, fn) { + const wrapper = (...args) => { + this.off(name, wrapper); + fn.apply(this, args); + }; + this.on(name, wrapper) + } + /** * Remove all registered events and subscriptions. */