import Evented from '../../Evented'; import { Handle } from '../../interfaces'; import on, { EventEmitter } from '../../on'; import Promise from '../../promise'; import { Source } from '../ReadableStream'; import ReadableStreamController from '../ReadableStreamController'; export type EventTargetTypes = Evented | EventEmitter | EventTarget; export type EventTypes = string | string[]; export default class EventedStreamSource implements Source { protected _controller: ReadableStreamController; protected _target: EventTargetTypes; protected _events: string[]; protected _handles: Handle[]; constructor(target: EventTargetTypes, type: EventTypes) { this._target = target; if (Array.isArray(type)) { this._events = type; } else { this._events = [ type ]; } this._handles = []; } start(controller: ReadableStreamController): Promise { this._controller = controller; this._events.forEach((eventName: string) => { this._handles.push(on( this._target, eventName, this._handleEvent.bind(this))); }); return Promise.resolve(); } cancel(reason?: any): Promise { while (this._handles.length) { this._handles.shift().destroy(); } return Promise.resolve(); } protected _handleEvent(event: Event) { this._controller.enqueue(event); } }