1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-10 17:53:36 +02:00

feat: support listening for any event

This commit is contained in:
olav 2022-08-15 16:01:57 +02:00
parent 37ad0a3799
commit 934b0cdf88
5 changed files with 40 additions and 6 deletions

View File

@ -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;

View File

@ -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<IEvent, number>, EventEmitter {
export interface IEventStore extends Store<IEvent, number>, AnyEventEmitter {
store(event: IBaseEvent): Promise<void>;
batchStore(events: IBaseEvent[]): Promise<void>;
getEvents(): Promise<IEvent[]>;

View File

@ -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]);
});

View File

@ -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);
}
}

View File

@ -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() {