35 lines
919 B
TypeScript
35 lines
919 B
TypeScript
import { BasicSource } from "../../utils/event-source.ts";
|
|
|
|
export type AllEventTypes = RawEventTypes | QueueEventTypes;
|
|
export type RawEventTypes = "next" | "done";
|
|
export type QueueEventTypes = "loop";
|
|
|
|
export type PlayerListener<T, J extends AllEventTypes> = (
|
|
data: EventData<T>[J]
|
|
) => void;
|
|
|
|
type PlayerEvent<T, J extends AllEventTypes> = {
|
|
type: J;
|
|
data: EventData<T>[J];
|
|
};
|
|
type EventData<T> = {
|
|
next: T;
|
|
done: T;
|
|
loop: T;
|
|
};
|
|
|
|
export class PlayerEventSource<T, K extends AllEventTypes> {
|
|
#source = new BasicSource<PlayerEvent<T, K>>();
|
|
|
|
on<J extends K>(event: J, listener: PlayerListener<T, J>) {
|
|
return this.#source.listen((value) => {
|
|
if (value.type === event) {
|
|
listener((value as PlayerEvent<T, J>).data);
|
|
}
|
|
});
|
|
}
|
|
|
|
trigger<J extends K>(event: J, data: EventData<T>[J]) {
|
|
this.#source.trigger({ type: event, data });
|
|
}
|
|
} |