From 934b0cdf889496cecccc6f26c1a4e4c20af1b8aa Mon Sep 17 00:00:00 2001 From: olav Date: Mon, 15 Aug 2022 16:01:57 +0200 Subject: [PATCH] feat: support listening for any event --- src/lib/db/event-store.ts | 4 ++-- src/lib/types/stores/event-store.ts | 4 ++-- src/lib/util/anyEventEmitter.test.ts | 22 ++++++++++++++++++++++ src/lib/util/anyEventEmitter.ts | 12 ++++++++++++ src/test/fixtures/fake-event-store.ts | 4 ++-- 5 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 src/lib/util/anyEventEmitter.test.ts create mode 100644 src/lib/util/anyEventEmitter.ts diff --git a/src/lib/db/event-store.ts b/src/lib/db/event-store.ts index 013aacd34e..e0790473b1 100644 --- a/src/lib/db/event-store.ts +++ b/src/lib/db/event-store.ts @@ -1,10 +1,10 @@ -import { EventEmitter } from 'events'; import { Knex } from 'knex'; import { IEvent, IBaseEvent } from '../types/events'; import { LogProvider, Logger } from '../logger'; import { IEventStore } from '../types/stores/event-store'; import { ITag } from '../types/model'; import { SearchEventsSchema } from '../openapi/spec/search-events-schema'; +import { AnyEventEmitter } from '../util/anyEventEmitter'; const EVENT_COLUMNS = [ 'id', @@ -34,7 +34,7 @@ export interface IEventTable { const TABLE = 'events'; -class EventStore extends EventEmitter implements IEventStore { +class EventStore extends AnyEventEmitter implements IEventStore { private db: Knex; private logger: Logger; diff --git a/src/lib/types/stores/event-store.ts b/src/lib/types/stores/event-store.ts index 67b2e33aab..2a234c2c0a 100644 --- a/src/lib/types/stores/event-store.ts +++ b/src/lib/types/stores/event-store.ts @@ -1,9 +1,9 @@ -import EventEmitter from 'events'; import { IBaseEvent, IEvent } from '../events'; import { Store } from './store'; import { SearchEventsSchema } from '../../openapi/spec/search-events-schema'; +import { AnyEventEmitter } from 'lib/util/anyEventEmitter'; -export interface IEventStore extends Store, EventEmitter { +export interface IEventStore extends Store, AnyEventEmitter { store(event: IBaseEvent): Promise; batchStore(events: IBaseEvent[]): Promise; getEvents(): Promise; diff --git a/src/lib/util/anyEventEmitter.test.ts b/src/lib/util/anyEventEmitter.test.ts new file mode 100644 index 0000000000..268434a78d --- /dev/null +++ b/src/lib/util/anyEventEmitter.test.ts @@ -0,0 +1,22 @@ +import { AnyEventEmitter } from './anyEventEmitter'; + +test('AnyEventEmitter', () => { + const events = []; + const results = []; + + class MyEventEmitter extends AnyEventEmitter {} + const myEventEmitter = new MyEventEmitter(); + + myEventEmitter.on('a', () => events.push('a')); + myEventEmitter.on('b', () => events.push('b')); + myEventEmitter.on('c', () => events.push('c')); + myEventEmitter.on('*', () => events.push('*')); + + results.push(myEventEmitter.emit('a')); + results.push(myEventEmitter.emit('b')); + results.push(myEventEmitter.emit('c')); + results.push(myEventEmitter.emit('d')); + + expect(events).toEqual(['*', 'a', '*', 'b', '*', 'c', '*']); + expect(results).toEqual([true, true, true, false]); +}); diff --git a/src/lib/util/anyEventEmitter.ts b/src/lib/util/anyEventEmitter.ts new file mode 100644 index 0000000000..76ccaa710f --- /dev/null +++ b/src/lib/util/anyEventEmitter.ts @@ -0,0 +1,12 @@ +import EventEmitter from 'events'; + +export const ANY_EVENT = '*'; + +// Extends the built-in EventEmitter with support for listening for any event. +// See https://stackoverflow.com/a/54431931. +export class AnyEventEmitter extends EventEmitter { + emit(type: string, ...args: any[]): boolean { + super.emit(ANY_EVENT, ...args); + return super.emit(type, ...args) || super.emit('', ...args); + } +} diff --git a/src/test/fixtures/fake-event-store.ts b/src/test/fixtures/fake-event-store.ts index 1155bc2056..dbd2505a00 100644 --- a/src/test/fixtures/fake-event-store.ts +++ b/src/test/fixtures/fake-event-store.ts @@ -1,8 +1,8 @@ -import EventEmitter from 'events'; import { IEventStore } from '../../lib/types/stores/event-store'; import { IEvent } from '../../lib/types/events'; +import { AnyEventEmitter } from '../../lib/util/anyEventEmitter'; -class FakeEventStore extends EventEmitter implements IEventStore { +class FakeEventStore extends AnyEventEmitter implements IEventStore { events: IEvent[]; constructor() {