UNPKG

@signaldb/core

Version:

SignalDB is a client-side database that provides a simple MongoDB-like interface to the data with first-class typescript support to achieve an optimistic UI. Data persistence can be achieved by using storage providers that store the data through a JSON in

139 lines (138 loc) 4.89 kB
"use strict"; var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); class EventEmitter { constructor() { __publicField(this, "_maxListeners", 100); /** * We store a set of the listeners for each event. */ __publicField(this, "_listenerStore", /* @__PURE__ */ new Map()); } setMaxListeners(max) { this._maxListeners = max; return this; } /** * Subscribe to an event with a listener function. * @param eventName The event name (key of E). * @param listener A function that receives the emitted arguments. * @returns The emitter instance (for chaining). */ on(eventName, listener) { let listenersSet = this._listenerStore.get(eventName); if (!listenersSet) { listenersSet = /* @__PURE__ */ new Set(); this._listenerStore.set(eventName, listenersSet); } listenersSet.add(listener); if (listenersSet.size > this._maxListeners) { console.warn(`Possible EventEmitter memory leak detected. ${listenersSet.size} ${String(eventName)} listeners added. Use emitter.setMaxListeners() to increase limit.`); } return this; } /** * Subscribe to an event with a listener function. * @param eventName The event name (key of E). * @param listener A function that receives the emitted arguments. * @returns The emitter instance (for chaining). */ addListener(eventName, listener) { return this.on(eventName, listener); } /** * Subscribe to an event, handling it only once. Automatically removes * the listener after it fires the first time. * @param eventName The event name (key of E). * @param listener A function that receives the emitted arguments. * @returns The emitter instance (for chaining). */ once(eventName, listener) { const onceWrapper = (...args) => { listener(...args); this.off(eventName, onceWrapper); }; return this.on(eventName, onceWrapper); } /** * Unsubscribe a previously subscribed listener. * @param eventName The event name (key of E). * @param listener The original function passed to `on` or `once`. * @returns The emitter instance (for chaining). */ off(eventName, listener) { const listenersSet = this._listenerStore.get(eventName); if (!listenersSet) return this; listenersSet.delete(listener); if (listenersSet.size === 0) { this._listenerStore.delete(eventName); } return this; } /** * Unsubscribe a previously subscribed listener. * @param eventName The event name (key of E). * @param listener The original function passed to `on` or `once`. * @returns The emitter instance (for chaining). */ removeListener(eventName, listener) { return this.off(eventName, listener); } /** * Emit (dispatch) an event with a variable number of arguments. * @param eventName The event name (key of E). * @param args The arguments to pass to subscribed listeners. */ emit(eventName, ...args) { this.listeners(eventName).forEach((listener) => { listener(...args); }); } /** * Returns the array of listener functions currently registered for a given event. * @param eventName The event name (key of E). * @returns An array of listener functions. */ listeners(eventName) { const listenersSet = this._listenerStore.get(eventName); if (!listenersSet) return []; return [...listenersSet.values()]; } /** * Returns the number of listeners for a given event. * @param eventName The event name (key of E). * @returns The number of listeners. */ listenerCount(eventName) { const listenersSet = this._listenerStore.get(eventName); return listenersSet ? listenersSet.size : 0; } /** * Removes all listeners for a given event, or all events if none is specified. * @param eventName Optional. If omitted, clears all events’ listeners. * @returns The emitter instance (for chaining). */ removeAllListeners(eventName) { if (eventName === void 0) { for (const [eventName_, listenersSet] of this._listenerStore.entries()) { for (const listener of listenersSet.values()) { this.off(eventName_, listener); } } this._listenerStore.clear(); } else { const listenersSet = this._listenerStore.get(eventName); if (listenersSet) { for (const listener of listenersSet.values()) { this.off(eventName, listener); } this._listenerStore.delete(eventName); } } return this; } } module.exports = EventEmitter;