chore: cleanup events code

This commit is contained in:
Krzysztof Moch
2025-10-02 13:31:21 +02:00
parent 07b55755d1
commit 58a268c022
4 changed files with 53 additions and 31 deletions
@@ -56,8 +56,8 @@ class VideoPlayer extends VideoPlayerEvents implements VideoPlayerBase {
const parsedError = tryParseNativeVideoError(error);
if (
parsedError instanceof VideoRuntimeError
&& this.triggerEvent('onError', parsedError)
parsedError instanceof VideoRuntimeError &&
this.triggerEvent('onError', parsedError)
) {
// We don't throw errors if onError is provided
return;
@@ -1,35 +1,21 @@
import type { VideoPlayerEventEmitter } from '../spec/nitro/VideoPlayerEventEmitter.nitro';
import type { AllPlayerEvents as PlayerEvents } from './types/Events';
import {
ALL_PLAYER_EVENTS,
type AllPlayerEvents as PlayerEvents,
} from './types/Events';
export class VideoPlayerEvents {
protected eventEmitter: VideoPlayerEventEmitter;
protected eventListeners: Partial<Record<keyof PlayerEvents, Set<(...params: any[]) => void>>> = {};
protected eventListeners: Partial<
Record<keyof PlayerEvents, Set<(...params: any[]) => void>>
> = {};
protected readonly supportedEvents: (keyof PlayerEvents)[] = [
'onAudioBecomingNoisy',
'onAudioFocusChange',
'onBandwidthUpdate',
'onBuffer',
'onControlsVisibleChange',
'onEnd',
'onExternalPlaybackChange',
'onLoad',
'onLoadStart',
'onPlaybackRateChange',
'onPlaybackStateChange',
'onProgress',
'onReadyToDisplay',
'onSeek',
'onStatusChange',
'onTextTrackDataChanged',
'onTimedMetadata',
'onTrackChange',
'onVolumeChange',
];
protected readonly supportedEvents: (keyof PlayerEvents)[] =
ALL_PLAYER_EVENTS;
constructor(eventEmitter: VideoPlayerEventEmitter) {
this.eventEmitter = eventEmitter;
for (let event of this.supportedEvents){
for (let event of this.supportedEvents) {
// @ts-expect-error we narrow the type of the event
this.eventEmitter[event] = this.triggerEvent.bind(this, event);
}
@@ -39,8 +25,7 @@ export class VideoPlayerEvents {
event: Event,
...params: Parameters<PlayerEvents[Event]>
): boolean {
if (!this.eventListeners[event]?.size)
return false;
if (!this.eventListeners[event]?.size) return false;
for (let fn of this.eventListeners[event]) {
fn(...params);
}
@@ -59,7 +44,7 @@ export class VideoPlayerEvents {
event: Event,
callback: PlayerEvents[Event]
) {
this.eventListeners[event]!.delete(callback);
this.eventListeners[event]?.delete(callback);
}
/**
@@ -18,6 +18,5 @@ export const useEvent = <T extends keyof AllPlayerEvents>(
player.addEventListener(event, callback);
return () => player.removeEventListener(event, callback);
;
}, [player, event, callback]);
};
@@ -97,7 +97,6 @@ export interface AllPlayerEvents extends VideoPlayerEvents {
onError: (error: VideoRuntimeError) => void;
}
export interface VideoViewEvents {
/**
* Called when the video view's picture in picture state changes.
@@ -226,3 +225,42 @@ export interface onVolumeChangeData {
*/
muted: boolean;
}
type CheckAllAndOnly<T, A extends readonly (keyof T)[]> =
// Missing keys?
Exclude<keyof T, A[number]> extends never
? // Extra keys?
Exclude<A[number], keyof T> extends never
? A
: ['Extra keys', Exclude<A[number], keyof T>]
: ['Missing keys', Exclude<keyof T, A[number]>];
function allKeysOf<T>() {
return <A extends readonly (keyof T)[]>(...arr: A): CheckAllAndOnly<T, A> => {
return arr as CheckAllAndOnly<T, A>;
};
}
export const ALL_PLAYER_EVENTS: (keyof AllPlayerEvents)[] =
allKeysOf<AllPlayerEvents>()(
'onAudioBecomingNoisy',
'onAudioFocusChange',
'onBandwidthUpdate',
'onBuffer',
'onControlsVisibleChange',
'onEnd',
'onError',
'onExternalPlaybackChange',
'onLoad',
'onLoadStart',
'onPlaybackStateChange',
'onPlaybackRateChange',
'onProgress',
'onReadyToDisplay',
'onSeek',
'onTimedMetadata',
'onTextTrackDataChanged',
'onTrackChange',
'onVolumeChange',
'onStatusChange'
);