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 { Knex } from 'knex';
|
||||||
import { IEvent, IBaseEvent } from '../types/events';
|
import { IEvent, IBaseEvent } from '../types/events';
|
||||||
import { LogProvider, Logger } from '../logger';
|
import { LogProvider, Logger } from '../logger';
|
||||||
import { IEventStore } from '../types/stores/event-store';
|
import { IEventStore } from '../types/stores/event-store';
|
||||||
import { ITag } from '../types/model';
|
import { ITag } from '../types/model';
|
||||||
import { SearchEventsSchema } from '../openapi/spec/search-events-schema';
|
import { SearchEventsSchema } from '../openapi/spec/search-events-schema';
|
||||||
|
import { AnyEventEmitter } from '../util/anyEventEmitter';
|
||||||
|
|
||||||
const EVENT_COLUMNS = [
|
const EVENT_COLUMNS = [
|
||||||
'id',
|
'id',
|
||||||
@ -34,7 +34,7 @@ export interface IEventTable {
|
|||||||
|
|
||||||
const TABLE = 'events';
|
const TABLE = 'events';
|
||||||
|
|
||||||
class EventStore extends EventEmitter implements IEventStore {
|
class EventStore extends AnyEventEmitter implements IEventStore {
|
||||||
private db: Knex;
|
private db: Knex;
|
||||||
|
|
||||||
private logger: Logger;
|
private logger: Logger;
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import EventEmitter from 'events';
|
|
||||||
import { IBaseEvent, IEvent } from '../events';
|
import { IBaseEvent, IEvent } from '../events';
|
||||||
import { Store } from './store';
|
import { Store } from './store';
|
||||||
import { SearchEventsSchema } from '../../openapi/spec/search-events-schema';
|
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>;
|
store(event: IBaseEvent): Promise<void>;
|
||||||
batchStore(events: IBaseEvent[]): Promise<void>;
|
batchStore(events: IBaseEvent[]): Promise<void>;
|
||||||
getEvents(): Promise<IEvent[]>;
|
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 { IEventStore } from '../../lib/types/stores/event-store';
|
||||||
import { IEvent } from '../../lib/types/events';
|
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[];
|
events: IEvent[];
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
Loading…
Reference in New Issue
Block a user