react-native-theoplayer
Version:
A THEOplayer video component for react-native.
321 lines (320 loc) • 17.3 kB
JavaScript
"use strict";
import { AdEventType, MediaTrackEventType, MediaTrackType, PlayerEventType, TextTrackEventType, TextTrackKind, TextTrackMode, TheoAdsEventType, TheoLiveEventType, TrackListEventType } from 'react-native-theoplayer';
import { BaseEvent } from './event/BaseEvent';
import { DefaultAdEvent, DefaultAirplayStateChangeEvent, DefaultChromecastChangeEvent, DefaultChromecastErrorEvent, DefaultDimensionChangeEvent, DefaultDurationChangeEvent, DefaultErrorEvent, DefaultLoadedMetadataEvent, DefaultMediaTrackEvent, DefaultMediaTrackListEvent, DefaultProgressEvent, DefaultRateChangeEvent, DefaultReadyStateChangeEvent, DefaultResizeEvent, DefaultSeekedEvent, DefaultSeekingEvent, DefaultSegmentNotFoundEvent, DefaultTextTrackEvent, DefaultTextTrackListEvent, DefaultTheoAdsErrorEvent, DefaultTheoAdsEvent, DefaultTheoLiveDistributionEvent, DefaultTheoLiveEndpointLoadedEvent, DefaultTheoLiveEvent, DefaultTheoLiveIntentToFallbackEvent, DefaultTimeupdateEvent, DefaultVideoResizeEvent, DefaultVolumeChangeEvent } from './event/PlayerEvents';
import { fromNativeCue, fromNativeMediaTrack, fromNativeTextTrack } from './web/TrackUtils';
export class WebEventForwarder {
constructor(player, facade) {
this._player = player;
this._facade = facade;
this.addEventListeners();
}
addEventListeners() {
this._player.addEventListener('sourcechange', this.onSourceChange);
this._player.addEventListener('loadstart', this.onLoadStart);
this._player.addEventListener('loadeddata', this.onLoadedData);
this._player.addEventListener('loadedmetadata', this.onLoadedMetadata);
this._player.addEventListener('error', this.onError);
this._player.addEventListener('progress', this.onProgress);
this._player.addEventListener('play', this.onPlay);
this._player.addEventListener('canplay', this.onCanPlay);
this._player.addEventListener('playing', this.onPlaying);
this._player.addEventListener('pause', this.onPause);
this._player.addEventListener('seeking', this.onSeeking);
this._player.addEventListener('seeked', this.onSeeked);
this._player.addEventListener('ended', this.onEnded);
this._player.addEventListener('waiting', this.onWaiting);
this._player.addEventListener('readystatechange', this.onReadyStateChanged);
this._player.addEventListener('timeupdate', this.onTimeUpdate);
this._player.addEventListener('durationchange', this.onDurationChange);
this._player.addEventListener('ratechange', this.onPlaybackRateChange);
this._player.addEventListener('segmentnotfound', this.onSegmentNotFound);
this._player.addEventListener('volumechange', this.onVolumeChangeEvent);
this._player.addEventListener('dimensionchange', this.onDimensionChange);
this._player.addEventListener('resize', this.onVideoResize);
this._player.textTracks.addEventListener('addtrack', this.onAddTextTrack);
this._player.textTracks.addEventListener('removetrack', this.onRemoveTextTrack);
this._player.textTracks.addEventListener('change', this.onChangeTextTrack);
this._player.audioTracks.addEventListener('addtrack', this.onAddAudioTrack);
this._player.audioTracks.addEventListener('removetrack', this.onRemoveAudioTrack);
this._player.audioTracks.addEventListener('change', this.onChangeAudioTrack);
this._player.videoTracks.addEventListener('addtrack', this.onAddVideoTrack);
this._player.videoTracks.addEventListener('removetrack', this.onRemoveVideoTrack);
this._player.videoTracks.addEventListener('change', this.onChangeVideoTrack);
this._player.cast?.chromecast?.addEventListener('statechange', this.onChromecastStateChange);
this._player.cast?.chromecast?.addEventListener('error', this.onChromecastError);
this._player.cast?.airplay?.addEventListener('statechange', this.onAirplayStateChange);
this._player.ads?.addEventListener(FORWARDED_AD_EVENTS, this.onAdEvent);
this._player.ads?.addEventListener(FORWARDED_ADBREAK_EVENTS, this.onAdBreakEvent);
this._player.theoads?.addEventListener(FORWARDED_THEOADS_EVENTS, this.onTheoAdsEvent);
this._player.theoLive?.addEventListener(FORWARDED_THEOLIVE_EVENTS, this.onTheoLiveEvent);
}
unload() {
this.removeEventListeners();
}
removeEventListeners() {
this._player.removeEventListener('sourcechange', this.onSourceChange);
this._player.removeEventListener('loadstart', this.onLoadStart);
this._player.removeEventListener('loadeddata', this.onLoadedData);
this._player.removeEventListener('loadedmetadata', this.onLoadedMetadata);
this._player.removeEventListener('error', this.onError);
this._player.removeEventListener('progress', this.onProgress);
this._player.removeEventListener('canplay', this.onCanPlay);
this._player.removeEventListener('play', this.onPlay);
this._player.removeEventListener('playing', this.onPlaying);
this._player.removeEventListener('pause', this.onPause);
this._player.removeEventListener('seeking', this.onSeeking);
this._player.removeEventListener('seeked', this.onSeeked);
this._player.removeEventListener('ended', this.onEnded);
this._player.removeEventListener('waiting', this.onWaiting);
this._player.removeEventListener('readystatechange', this.onReadyStateChanged);
this._player.removeEventListener('timeupdate', this.onTimeUpdate);
this._player.removeEventListener('durationchange', this.onDurationChange);
this._player.removeEventListener('ratechange', this.onPlaybackRateChange);
this._player.removeEventListener('segmentnotfound', this.onSegmentNotFound);
this._player.removeEventListener('volumechange', this.onVolumeChangeEvent);
this._player.removeEventListener('dimensionchange', this.onDimensionChange);
this._player.removeEventListener('resize', this.onVideoResize);
this._player.textTracks.removeEventListener('addtrack', this.onAddTextTrack);
this._player.textTracks.removeEventListener('removetrack', this.onRemoveTextTrack);
this._player.textTracks.removeEventListener('change', this.onChangeTextTrack);
this._player.audioTracks.removeEventListener('addtrack', this.onAddAudioTrack);
this._player.audioTracks.removeEventListener('removetrack', this.onRemoveAudioTrack);
this._player.audioTracks.removeEventListener('change', this.onChangeAudioTrack);
this._player.videoTracks.removeEventListener('addtrack', this.onAddVideoTrack);
this._player.videoTracks.removeEventListener('removetrack', this.onRemoveVideoTrack);
this._player.videoTracks.removeEventListener('change', this.onChangeVideoTrack);
this._player.cast?.chromecast?.removeEventListener('statechange', this.onChromecastStateChange);
this._player.cast?.chromecast?.removeEventListener('error', this.onChromecastError);
this._player.cast?.airplay?.removeEventListener('statechange', this.onAirplayStateChange);
this._player.ads?.removeEventListener(FORWARDED_AD_EVENTS, this.onAdEvent);
this._player.ads?.removeEventListener(FORWARDED_ADBREAK_EVENTS, this.onAdBreakEvent);
this._player.theoads?.removeEventListener(FORWARDED_THEOADS_EVENTS, this.onTheoAdsEvent);
this._player.theoLive?.removeEventListener(FORWARDED_THEOLIVE_EVENTS, this.onTheoLiveEvent);
}
onSourceChange = () => {
this._facade.dispatchEvent(new BaseEvent(PlayerEventType.SOURCE_CHANGE));
};
onLoadStart = () => {
this._facade.dispatchEvent(new BaseEvent(PlayerEventType.LOAD_START));
};
onLoadedData = () => {
this._facade.dispatchEvent(new BaseEvent(PlayerEventType.LOADED_DATA));
};
onLoadedMetadata = () => {
this._facade.dispatchEvent(new DefaultLoadedMetadataEvent(this._player.textTracks.map(textTrack => fromNativeTextTrack(textTrack)), this._player.audioTracks.map(audioTrack => fromNativeMediaTrack(audioTrack)), this._player.videoTracks.map(videoTrack => fromNativeMediaTrack(videoTrack)), 1e3 * this._player.duration, this._player.textTracks.find(track => track.mode === 'showing')?.uid, this._player.videoTracks.find(track => track.enabled)?.uid, this._player.audioTracks.find(track => track.enabled)?.uid));
};
onError = event => {
this._facade.dispatchEvent(new DefaultErrorEvent({
errorCode: event.errorObject.code.toString(),
errorMessage: event.errorObject.message
}));
};
onProgress = () => {
this._facade.dispatchEvent(new DefaultProgressEvent(fromTimeRanges(this._player.seekable), fromTimeRanges(this._player.buffered)));
};
onCanPlay = () => {
this._facade.dispatchEvent(new BaseEvent(PlayerEventType.CANPLAY));
};
onPlay = () => {
this._facade.dispatchEvent(new BaseEvent(PlayerEventType.PLAY));
};
onPlaying = () => {
this._facade.dispatchEvent(new BaseEvent(PlayerEventType.PLAYING));
};
onPause = () => {
this._facade.dispatchEvent(new BaseEvent(PlayerEventType.PAUSE));
};
onSeeking = event => {
this._facade.dispatchEvent(new DefaultSeekingEvent(event.currentTime * 1e3));
};
onSeeked = event => {
this._facade.dispatchEvent(new DefaultSeekedEvent(event.currentTime * 1e3));
};
onEnded = () => {
this._facade.dispatchEvent(new BaseEvent(PlayerEventType.ENDED));
};
onWaiting = () => {
this._facade.dispatchEvent(new BaseEvent(PlayerEventType.WAITING));
};
onReadyStateChanged = event => {
this._facade.dispatchEvent(new DefaultReadyStateChangeEvent(event.readyState));
};
onTimeUpdate = event => {
this._facade.dispatchEvent(new DefaultTimeupdateEvent(event.currentTime * 1e3, event.currentProgramDateTime?.getTime()));
};
onDurationChange = event => {
this._facade.dispatchEvent(new DefaultDurationChangeEvent(event.duration * 1e3));
};
onPlaybackRateChange = event => {
this._facade.dispatchEvent(new DefaultRateChangeEvent(event.playbackRate));
};
onSegmentNotFound = () => {
this._facade.dispatchEvent(new DefaultSegmentNotFoundEvent(0, 'Segment not found', -1));
};
onVolumeChangeEvent = event => {
this._facade.dispatchEvent(new DefaultVolumeChangeEvent(event.volume, this._player.muted));
};
onDimensionChange = event => {
this._facade.dispatchEvent(new DefaultResizeEvent(event.width, event.height));
this._facade.dispatchEvent(new DefaultDimensionChangeEvent(event.width, event.height));
};
onVideoResize = _event => {
this._facade.dispatchEvent(new DefaultVideoResizeEvent(this._player.videoWidth, this._player.videoHeight));
};
onAddTextTrack = event => {
const track = event.track;
if (track.kind === TextTrackKind.metadata) {
track.mode = TextTrackMode.hidden;
}
track.addEventListener('addcue', this.onAddTextTrackCue(track));
track.addEventListener('removecue', this.onRemoveTextTrackCue(track));
track.addEventListener('entercue', this.onEnterTextTrackCue(track));
track.addEventListener('exitcue', this.onExitTextTrackCue(track));
this._facade.dispatchEvent(new DefaultTextTrackListEvent(TrackListEventType.ADD_TRACK, fromNativeTextTrack(track)));
};
onRemoveTextTrack = event => {
const track = event.track;
track.removeEventListener('addcue', this.onAddTextTrackCue(track));
track.removeEventListener('removecue', this.onRemoveTextTrackCue(track));
track.removeEventListener('entercue', this.onEnterTextTrackCue(track));
track.removeEventListener('exitcue', this.onExitTextTrackCue(track));
this._facade.dispatchEvent(new DefaultTextTrackListEvent(TrackListEventType.REMOVE_TRACK, fromNativeTextTrack(track)));
};
onChangeTextTrack = event => {
this._facade.dispatchEvent(new DefaultTextTrackListEvent(TrackListEventType.CHANGE_TRACK, fromNativeTextTrack(event.track)));
};
onAddAudioTrack = event => {
this.onAddMediaTrack(event, MediaTrackType.AUDIO);
};
onAddVideoTrack = event => {
this.onAddMediaTrack(event, MediaTrackType.VIDEO);
};
onAddMediaTrack = (event, trackType) => {
const track = event.track;
track.addEventListener('activequalitychanged', this.onActiveQualityChanged(trackType, track));
this._facade.dispatchEvent(new DefaultMediaTrackListEvent(TrackListEventType.ADD_TRACK, trackType, track));
};
onRemoveAudioTrack = event => {
this.onRemoveMediaTrack(event, MediaTrackType.AUDIO);
};
onRemoveVideoTrack = event => {
this.onRemoveMediaTrack(event, MediaTrackType.VIDEO);
};
onRemoveMediaTrack = (event, trackType) => {
const track = event.track;
track.removeEventListener('activequalitychanged', this.onActiveQualityChanged(trackType, track));
this._facade.dispatchEvent(new DefaultMediaTrackListEvent(TrackListEventType.REMOVE_TRACK, trackType, track));
};
onChangeAudioTrack = event => {
this.onChangeMediaTrack(event, MediaTrackType.AUDIO);
};
onChangeVideoTrack = event => {
this.onChangeMediaTrack(event, MediaTrackType.VIDEO);
};
onChangeMediaTrack = (event, trackType) => {
const track = event.track;
this._facade.dispatchEvent(new DefaultMediaTrackListEvent(TrackListEventType.CHANGE_TRACK, trackType, track));
};
onChromecastStateChange = event => {
this._facade.dispatchEvent(new DefaultChromecastChangeEvent(event.state));
};
onChromecastError = event => {
this._facade.dispatchEvent(new DefaultChromecastErrorEvent(event.error));
};
onAirplayStateChange = event => {
this._facade.dispatchEvent(new DefaultAirplayStateChangeEvent(event.state));
};
onAdEvent = event => {
const castedEvent = event;
this._facade.dispatchEvent(new DefaultAdEvent(event.type, castedEvent.ad));
};
onAdBreakEvent = event => {
const castedEvent = event;
this._facade.dispatchEvent(new DefaultAdEvent(event.type, castedEvent.adBreak));
};
onTheoAdsEvent = event => {
if (event.type === TheoAdsEventType.INTERSTITIAL_ERROR) {
const {
message
} = event;
this._facade.dispatchEvent(new DefaultTheoAdsErrorEvent(event.type, event.interstitial, message));
} else {
this._facade.dispatchEvent(new DefaultTheoAdsEvent(event.type, event.interstitial));
}
};
onTheoLiveEvent = event => {
if (event.type === TheoLiveEventType.DISTRIBUTION_LOAD_START || event.type === TheoLiveEventType.DISTRIBUTION_OFFLINE) {
const {
distributionId
} = event;
this._facade.dispatchEvent(new DefaultTheoLiveDistributionEvent(event.type, distributionId));
} else if (event.type === TheoLiveEventType.ENDPOINT_LOADED) {
const {
endpoint
} = event;
this._facade.dispatchEvent(new DefaultTheoLiveEndpointLoadedEvent(event.type, endpoint));
} else if (event.type === TheoLiveEventType.INTENT_TO_FALLBACK) {
const {
reason
} = event;
this._facade.dispatchEvent(new DefaultTheoLiveIntentToFallbackEvent(event.type, {
errorCode: reason?.code?.toString() ?? '',
errorMessage: reason?.message ?? ''
}));
} else {
this._facade.dispatchEvent(new DefaultTheoLiveEvent(event.type));
}
};
onAddTextTrackCue = track => event => {
const {
cue
} = event;
if (cue) {
this._facade.dispatchEvent(new DefaultTextTrackEvent(TextTrackEventType.ADD_CUE, track.uid, fromNativeCue(cue)));
}
};
onRemoveTextTrackCue = track => event => {
const {
cue
} = event;
if (cue) {
this._facade.dispatchEvent(new DefaultTextTrackEvent(TextTrackEventType.REMOVE_CUE, track.uid, fromNativeCue(cue)));
}
};
onEnterTextTrackCue = track => event => {
const {
cue
} = event;
if (cue) {
this._facade.dispatchEvent(new DefaultTextTrackEvent(TextTrackEventType.ENTER_CUE, track.uid, fromNativeCue(cue)));
}
};
onExitTextTrackCue = track => event => {
const {
cue
} = event;
if (cue) {
this._facade.dispatchEvent(new DefaultTextTrackEvent(TextTrackEventType.EXIT_CUE, track.uid, fromNativeCue(cue)));
}
};
onActiveQualityChanged = (trackType, track) => () => {
const quality = track.activeQuality;
this._facade.dispatchEvent(new DefaultMediaTrackEvent(MediaTrackEventType.ACTIVE_QUALITY_CHANGED, trackType, track.uid, quality ? [quality] : undefined));
};
}
const FORWARDED_AD_EVENTS = [AdEventType.AD_LOADED, AdEventType.ADD_AD, AdEventType.AD_BEGIN, AdEventType.AD_END, AdEventType.UPDATE_AD, AdEventType.AD_FIRST_QUARTILE, AdEventType.AD_MIDPOINT, AdEventType.AD_THIRD_QUARTILE, AdEventType.AD_SKIP, AdEventType.AD_IMPRESSION, AdEventType.AD_ERROR, AdEventType.AD_METADATA, AdEventType.AD_BUFFERING];
const FORWARDED_ADBREAK_EVENTS = [AdEventType.ADD_AD_BREAK, AdEventType.REMOVE_AD_BREAK, AdEventType.AD_BREAK_BEGIN, AdEventType.AD_BREAK_END, AdEventType.AD_BREAK_CHANGE, AdEventType.UPDATE_AD_BREAK];
const FORWARDED_THEOADS_EVENTS = [TheoAdsEventType.ADD_INTERSTITIAL, TheoAdsEventType.INTERSTITIAL_BEGIN, TheoAdsEventType.INTERSTITIAL_END, TheoAdsEventType.INTERSTITIAL_UPDATE, TheoAdsEventType.INTERSTITIAL_ERROR];
const FORWARDED_THEOLIVE_EVENTS = [TheoLiveEventType.DISTRIBUTION_LOAD_START, TheoLiveEventType.DISTRIBUTION_OFFLINE, TheoLiveEventType.ENDPOINT_LOADED, TheoLiveEventType.INTENT_TO_FALLBACK];
function fromTimeRanges(timeRanges) {
const result = [];
for (let i = 0; i < timeRanges.length; i++) {
result.push({
start: timeRanges.start(i) * 1e3,
end: timeRanges.end(i) * 1e3
});
}
return result;
}
//# sourceMappingURL=WebEventForwarder.js.map