Home Reference Source

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