Fix is managaeble for channels
[oweals/peertube.git] / client / src / standalone / player / events.ts
1 import { EventHandler } from './definitions'
2
3 interface PlayerEventRegistrar {
4   registrations: Function[]
5 }
6
7 interface PlayerEventRegistrationMap {
8   [ name: string ]: PlayerEventRegistrar
9 }
10
11 export class EventRegistrar {
12
13   private eventRegistrations: PlayerEventRegistrationMap = {}
14
15   public bindToChannel (channel: Channel.MessagingChannel) {
16     for (const name of Object.keys(this.eventRegistrations)) {
17       channel.bind(name, (txn, params) => this.fire(name, params))
18     }
19   }
20
21   public registerTypes (names: string[]) {
22     for (const name of names) {
23       this.eventRegistrations[ name ] = { registrations: [] }
24     }
25   }
26
27   public fire<T> (name: string, event: T) {
28     this.eventRegistrations[ name ].registrations.forEach(x => x(event))
29   }
30
31   public addListener<T> (name: string, handler: EventHandler<T>) {
32     if (!this.eventRegistrations[ name ]) {
33       console.warn(`PeerTube: addEventListener(): The event '${name}' is not supported`)
34       return false
35     }
36
37     this.eventRegistrations[ name ].registrations.push(handler)
38     return true
39   }
40
41   public removeListener<T> (name: string, handler: EventHandler<T>) {
42     if (!this.eventRegistrations[ name ]) return false
43
44     this.eventRegistrations[ name ].registrations = this.eventRegistrations[ name ].registrations.filter(x => x === handler)
45
46     return true
47   }
48 }