src/utils/fromEvent.ts
import EventEmitter from 'eventemitter3';
import {Observable, fromEventPattern} from 'rxjs';
type FlattenIfOneElementArray<T> = T extends [infer R] ? R : T;
export function fromEvent<
Events extends EventEmitter.ValidEventTypes,
EventNames extends EventEmitter.EventNames<Events>,
EventArgs extends FlattenIfOneElementArray<EventEmitter.EventArgs<Events, EventNames>>,
>(emitter: EventEmitter<Events>, eventName: EventNames): Observable<EventArgs> {
return fromEventPattern(
handler => emitter.on(eventName, handler as EventEmitter.EventListener<Events, EventNames>),
handler => emitter.off(eventName, handler as EventEmitter.EventListener<Events, EventNames>),
);
}