Get transcript summaries of Web videos.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

35 lines
839 B

  1. import { Readable as NodeReadable } from 'stream';
  2. export interface Options<T extends NodeJS.EventEmitter> {
  3. dataEvent?: string;
  4. endEvent?: string;
  5. onBeforeEnd?: (emitter: T) => void;
  6. }
  7. export namespace Readable {
  8. export const fromEventEmitter = <T extends NodeJS.EventEmitter>(
  9. eventEmitter: T,
  10. options = {} as Options<T>,
  11. ) => {
  12. const stream = new NodeReadable({
  13. read() {
  14. // noop
  15. },
  16. });
  17. const dataEventHandler = (d: unknown) => {
  18. stream.emit('data', d);
  19. };
  20. const dataEvent = options?.dataEvent ?? 'data';
  21. eventEmitter.on(dataEvent, dataEventHandler);
  22. eventEmitter.on(options?.endEvent ?? 'end', () => {
  23. options?.onBeforeEnd?.(eventEmitter);
  24. stream.emit('end');
  25. eventEmitter.off(dataEvent, dataEventHandler);
  26. });
  27. return stream;
  28. };
  29. }