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:
parent
37ad0a3799
commit
934b0cdf88
@ -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;
|
||||
|
@ -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[]>;
|
||||
|
22
src/lib/util/anyEventEmitter.test.ts
Normal file
22
src/lib/util/anyEventEmitter.test.ts
Normal 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]);
|
||||
});
|
12
src/lib/util/anyEventEmitter.ts
Normal file
12
src/lib/util/anyEventEmitter.ts
Normal 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);
|
||||
}
|
||||
}
|
4
src/test/fixtures/fake-event-store.ts
vendored
4
src/test/fixtures/fake-event-store.ts
vendored
@ -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() {
|
||||
|
Loading…
Reference in New Issue
Block a user