|
- import { Readable as NodeReadable } from 'stream';
-
- export interface Options<T extends NodeJS.EventEmitter> {
- dataEvent?: string;
- endEvent?: string;
- onBeforeEnd?: (emitter: T) => void;
- }
-
- export namespace Readable {
- export const fromEventEmitter = <T extends NodeJS.EventEmitter>(
- eventEmitter: T,
- options = {} as Options<T>,
- ) => {
- const stream = new NodeReadable({
- read() {
- // noop
- },
- });
-
- const dataEventHandler = (d: unknown) => {
- stream.emit('data', d);
- };
-
- const dataEvent = options?.dataEvent ?? 'data';
- eventEmitter.on(dataEvent, dataEventHandler);
- eventEmitter.on(options?.endEvent ?? 'end', () => {
- options?.onBeforeEnd?.(eventEmitter);
- stream.emit('end');
- eventEmitter.off(dataEvent, dataEventHandler);
- });
-
- return stream;
- };
- }
|