]>
Commit | Line | Data |
---|---|---|
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 | } |