diff --git a/packages/keyv/package.json b/packages/keyv/package.json index 12939cb4..f30557ca 100644 --- a/packages/keyv/package.json +++ b/packages/keyv/package.json @@ -1,6 +1,6 @@ { "name": "keyv", - "version": "5.1.1", + "version": "5.1.2", "description": "Simple key-value storage with support for multiple backends", "type": "module", "main": "dist/index.cjs", diff --git a/packages/keyv/src/event-manager.ts b/packages/keyv/src/event-manager.ts index 30735670..7e2adf8d 100644 --- a/packages/keyv/src/event-manager.ts +++ b/packages/keyv/src/event-manager.ts @@ -51,6 +51,15 @@ class EventManager { } } + public once(event: string, listener: EventListener): void { + const onceListener: EventListener = (...arguments_: any[]) => { + listener(...arguments_); + this.off(event, onceListener); + }; + + this.on(event, onceListener); + } + // Emit an event public emit(event: string, ...arguments_: any[]): void { const listeners = this._eventListeners.get(event); diff --git a/packages/keyv/test/event-manager.test.ts b/packages/keyv/test/event-manager.test.ts index 4c8254ce..167d85d4 100644 --- a/packages/keyv/test/event-manager.test.ts +++ b/packages/keyv/test/event-manager.test.ts @@ -124,3 +124,17 @@ test.it('if it is an error with no listeners throw error', () => { emitter.emit('error', new Error('test')); }).toThrow(Error); }); + +test.it('once method', t => { + const emitter = new EventManager(); + let dataReceived = 0; + + emitter.once('test-event', () => { + dataReceived++; + }); + + emitter.emit('test-event'); + emitter.emit('test-event'); + + t.expect(dataReceived).toBe(1); +});