import { EventHandler } from './definitions' interface PlayerEventRegistrar { registrations: Function[] } interface PlayerEventRegistrationMap { [ name: string ]: PlayerEventRegistrar } export class EventRegistrar { private eventRegistrations: PlayerEventRegistrationMap = {} public bindToChannel (channel: Channel.MessagingChannel) { for (let name of Object.keys(this.eventRegistrations)) { channel.bind(name, (txn, params) => this.fire(name, params)) } } public registerTypes (names: string[]) { for (let name of names) { this.eventRegistrations[ name ] = { registrations: [] } } } public fire (name: string, event: T) { this.eventRegistrations[ name ].registrations.forEach(x => x(event)) } public addListener (name: string, handler: EventHandler) { if (!this.eventRegistrations[ name ]) { console.warn(`PeerTube: addEventListener(): The event '${name}' is not supported`) return false } this.eventRegistrations[ name ].registrations.push(handler) return true } public removeListener (name: string, handler: EventHandler) { if (!this.eventRegistrations[ name ]) return false this.eventRegistrations[ name ].registrations = this.eventRegistrations[ name ].registrations.filter(x => x === handler) return true } }