@100mslive/hls-player 0.1.1-alpha.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -41,7 +41,7 @@ export declare class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEm
41
41
  reset(): void;
42
42
  on: <E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) => void;
43
43
  off: <E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) => void;
44
- emit: <E extends HMSHLSPlayerEvents>(eventName: E, eventObject: {
44
+ emitEvent: <E extends HMSHLSPlayerEvents>(eventName: E, eventObject: {
45
45
  "seek-pos-behind-live-edge": import("../interfaces/events").HMSHLSStreamLive;
46
46
  "timed-metadata": import("../interfaces/events").HMSHLSCue;
47
47
  stats: HlsPlayerStats;
@@ -3,16 +3,16 @@ import { HMSHLSPlayerListeners } from '../interfaces/events';
3
3
  import { HMSHLSPlayerEvents } from '../utilies/constants';
4
4
  export declare class HMSHLSTimedMetadata {
5
5
  private videoEl;
6
- private emit;
6
+ private emitEvent;
7
7
  private hls;
8
- constructor(hls: Hls, videoEl: HTMLVideoElement, emit: <E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]) => boolean);
8
+ constructor(hls: Hls, videoEl: HTMLVideoElement, emitEvent: <E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]) => boolean);
9
9
  extractMetaTextTrack: () => TextTrack | null;
10
10
  fireCues: (currentAbsTime: number, tolerance: number) => void;
11
11
  handleTimeUpdateListener: () => void;
12
12
  /**
13
13
  * Metadata are automatically parsed and added to the video element's
14
14
  * textTrack cue by hlsjs as they come through the stream.
15
- * in FRAG_CHANGED, we read the cues and emit HLS_METADATA_LOADED
15
+ * in FRAG_CHANGED, we read the cues and emitEvent HLS_METADATA_LOADED
16
16
  * when the current fragment has a metadata to play.
17
17
  */
18
18
  fragChangeHandler: (_: any, { frag }: {
package/dist/index.cjs.js CHANGED
@@ -1,8 +1,8 @@
1
- var N=Object.create;var u=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var D=r=>u(r,"__esModule",{value:!0});var w=(r,e)=>{D(r);for(var t in e)u(r,t,{get:e[t],enumerable:!0})},k=(r,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of x(e))!U.call(r,i)&&i!=="default"&&u(r,i,{get:()=>e[i],enumerable:!(t=C(e,i))||t.enumerable});return r},p=r=>k(D(u(r!=null?N(F(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var v=(r,e,t)=>new Promise((i,o)=>{var S=h=>{try{a(t.next(h))}catch(s){o(s)}},H=h=>{try{a(t.throw(h))}catch(s){o(s)}},a=h=>h.done?i(h.value):Promise.resolve(h.value).then(S,H);a((t=t.apply(r,e)).next())});w(exports,{HLSPlaybackState:()=>_,HMSHLSPlayer:()=>R,HMSHLSPlayerEvents:()=>l});var g=p(require("@100mslive/hls-stats")),E=p(require("hls.js"));var f=p(require("hls.js"));var d=class extends Error{constructor(e,t,i,o=!1){super(t);this.name=e;this.message=t;this.description=i;this.isTerminal=o;Object.setPrototypeOf(this,d.prototype)}toAnalyticsProperties(){return{error_name:this.name,error_message:this.message,error_description:this.description,is_terminal:this.isTerminal}}addNativeError(e){this.nativeError=e}toString(){var e;return`{
1
+ var N=Object.create;var _=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var D=r=>_(r,"__esModule",{value:!0});var w=(r,e)=>{D(r);for(var t in e)_(r,t,{get:e[t],enumerable:!0})},k=(r,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of x(e))!U.call(r,i)&&i!=="default"&&_(r,i,{get:()=>e[i],enumerable:!(t=C(e,i))||t.enumerable});return r},u=r=>k(D(_(r!=null?N(F(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var p=(r,e,t)=>new Promise((i,o)=>{var S=h=>{try{a(t.next(h))}catch(s){o(s)}},v=h=>{try{a(t.throw(h))}catch(s){o(s)}},a=h=>h.done?i(h.value):Promise.resolve(h.value).then(S,v);a((t=t.apply(r,e)).next())});w(exports,{HLSPlaybackState:()=>H,HMSHLSPlayer:()=>M,HMSHLSPlayerEvents:()=>l});var g=u(require("@100mslive/hls-stats")),E=u(require("hls.js"));var f=u(require("hls.js"));var d=class extends Error{constructor(e,t,i,o=!1){super(t);this.name=e;this.message=t;this.description=i;this.isTerminal=o;Object.setPrototypeOf(this,d.prototype)}toAnalyticsProperties(){return{error_name:this.name,error_message:this.message,error_description:this.description,is_terminal:this.isTerminal}}addNativeError(e){this.nativeError=e}toString(){var e;return`{
2
2
  name: ${this.name};
3
3
  message: ${this.message};
4
4
  description: ${this.description};
5
5
  isTerminal: ${this.isTerminal};
6
6
  nativeError: ${(e=this.nativeError)==null?void 0:e.message};
7
- }`}};var A=5,l;(function(s){s.TIMED_METADATA_LOADED="timed-metadata",s.SEEK_POS_BEHIND_LIVE_EDGE="seek-pos-behind-live-edge",s.CURRENT_TIME="current-time",s.AUTOPLAY_BLOCKED="autoplay-blocked",s.MANIFEST_LOADED="manifest-loaded",s.LAYER_UPDATED="layer-updated",s.ERROR="error",s.PLAYBACK_STATE="playback-state",s.STATS="stats"})(l||(l={}));var L;(function(n){n.MANIFEST_LOAD_ERROR="manifest-load-error",n.MANIFEST_PARSING_ERROR="manifest-parsing-error",n.LAYER_LOAD_ERROR="layer-load-error",n.MANIFEST_INCOMPATIBLE_CODECS_ERROR="manifest-incompatible-codecs-error",n.FRAG_DECRYPT_ERROR="frag-decrypt-error",n.BUFFER_INCOMPATIBLE_CODECS_ERROR="buffer-incompatible-codecs-error",n.VIDEO_ELEMENT_NOT_FOUND="video-element-not-found",n.HLS_AUTOPLAY_FAILED="hls-autoplay-failed",n.HLS_URL_NOT_FOUND="hls-url-not-found",n.UNKNOWN_ERROR="unknown-error"})(L||(L={}));var _;(function(t){t[t.playing=0]="playing",t[t.paused=1]="paused"})(_||(_={}));var m={HLSNetworkError:{manifestLoadError(r){return new d(L.MANIFEST_LOAD_ERROR,r.details,"Unable to load manifest file",r.fatal)},manifestParsingError(r){return new d(L.MANIFEST_PARSING_ERROR,r.details,"Unable to parse manifest file",r.fatal)},layerLoadError(r){return new d(L.LAYER_LOAD_ERROR,r.details,"Unable to load quality layers",r.fatal)}},HLSMediaError:{manifestIncompatibleCodecsError(r){return new d(L.MANIFEST_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible manifest codecs",r.fatal)},fragDecryptError(r){return new d(L.FRAG_DECRYPT_ERROR,r.details,"Unable to decrypt fragment",r.fatal)},bufferIncompatibleCodecsError(r){return new d(L.BUFFER_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible buffer codecs",r.fatal)},videoElementNotFound(){return new d(L.VIDEO_ELEMENT_NOT_FOUND,"Video element not found","Video element not found",!1)},autoplayFailed(){return new d(L.HLS_AUTOPLAY_FAILED,"Failed to autoplay","Failed to autoplay",!1)},hlsURLNotFound(r){return new d(L.HLS_URL_NOT_FOUND,r||"hls url not found",r||"hls url not found",!0)}},UnknownError:r=>new d(L.UNKNOWN_ERROR,r.details,"Unknown error",r.fatal)};var P=r=>{try{let e=window==null?void 0:window.atob(r);return JSON.parse(e)}catch(e){return{payload:r}}},O=r=>r.map(e=>c(e)),c=r=>{var e;return{resolution:(e=r.attrs)==null?void 0:e.RESOLUTION,bitrate:r.bitrate,height:r.height,id:r.id,url:r.url[0],width:r.width}};var T=class{constructor(e,t,i){this.videoEl=t;this.emit=i;this.extractMetaTextTrack=()=>{let e=this.videoEl.textTracks.length||0;for(let t=0;t<e;t++){let i=this.videoEl.textTracks[t];if((i==null?void 0:i.kind)==="metadata")return i.mode="showing",i}return null};this.fireCues=(e,t)=>{var H;let i=(H=this.extractMetaTextTrack())==null?void 0:H.cues;if(!i)return;let o=i.length,S=0;for(;S<o;){let a=i[S];if(a.queued)return;let h=P(a.value.data),s=h.start_date,n=h.end_date,y=new Date(s).getTime()-e,I=new Date(n).getTime()-new Date(s).getTime();y<=t&&(setTimeout(()=>{this.emit(l.TIMED_METADATA_LOADED,{id:a==null?void 0:a.id,payload:h.payload,duration:I,startDate:new Date(s),endDate:new Date(n)})},y),a.queued=!0),S++}};this.handleTimeUpdateListener=()=>{var o;let e=this.extractMetaTextTrack();if(!e||!e.cues)return;let t=((o=this.videoEl)==null?void 0:o.getStartDate())||0,i=new Date(t).getTime()+(this.videoEl.currentTime||0)*1e3;this.fireCues(i,.25)};this.fragChangeHandler=(e,{frag:t})=>{if(!this.videoEl){let i=m.HLSMediaError.videoElementNotFound();this.emit(l.ERROR,i)}try{if(this.videoEl.textTracks.length===0)return;let i=t.programDateTime||0,o=t.end-t.start;this.fireCues(i,o)}catch(i){console.error("FRAG_CHANGED event error",i)}};this.registerListner=()=>{f.default.isSupported()?this.hls.on(f.default.Events.FRAG_CHANGED,this.fragChangeHandler):this.videoEl.canPlayType("application/vnd.apple.mpegurl")&&this.videoEl.addEventListener("timeupdate",this.handleTimeUpdateListener)};this.unregisterListener=()=>{this.hls.off(f.default.Events.FRAG_CHANGED,this.fragChangeHandler),this.videoEl.removeEventListener("timeupdate",this.handleTimeUpdateListener)};this.hls=e,this.registerListner()}};var b=p(require("eventemitter2")),M=class{constructor(){this.eventEmitter=new b.EventEmitter2}on(e,t){this.eventEmitter.on(e,t)}off(e,t){this.eventEmitter.off(e,t)}emit(e,t){return this.eventEmitter.emit(e,t,e)}removeAllListeners(e){this.eventEmitter.removeAllListeners(e)}};var R=class{constructor(e,t){this._subscribeHlsStats=null;this.TAG="[HMSHLSPlayer]";this.subscribeStats=(e=2e3)=>{this._subscribeHlsStats=this._hlsStats.subscribe(t=>{this.emit(l.STATS,t)},e)};this.unsubscribeStats=()=>{this._subscribeHlsStats&&this._subscribeHlsStats()};this.on=(e,t)=>{this._emitter.on(e,t)};this.off=(e,t)=>{this._emitter.off(e,t)};this.emit=(e,t)=>this._emitter.emit(e,t);this.removeAllListeners=e=>{this._emitter.removeAllListeners(e)};this.play=()=>v(this,null,function*(){yield this.playVideo()});this.pause=()=>{this.pauseVideo()};this.seekTo=e=>{this._videoEl.currentTime=e};this.playVideo=()=>v(this,null,function*(){try{this._videoEl.paused&&(yield this._videoEl.play())}catch(e){console.debug(this.TAG,"Play failed with error",e.message),e.name==="NotAllowedError"&&this.emit(l.AUTOPLAY_BLOCKED,m.HLSMediaError.autoplayFailed())}});this.pauseVideo=()=>{this._videoEl.paused||this._videoEl.pause()};this.playEventHandler=()=>{this.emit(l.PLAYBACK_STATE,{state:_.playing})};this.pauseEventHandler=()=>{this.emit(l.PLAYBACK_STATE,{state:_.paused})};this.volumeEventHandler=()=>{this._volume=this._videoEl.volume};this.handleHLSException=(e,t)=>{var S,H;console.error(this.TAG,t);let o={details:((S=t.error)==null?void 0:S.message)||((H=t.err)==null?void 0:H.message)||"",fatal:t.fatal};switch(t.details){case E.default.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR:{let a=m.HLSMediaError.manifestIncompatibleCodecsError(o);this.emit(l.ERROR,a);break}case E.default.ErrorDetails.FRAG_DECRYPT_ERROR:{let a=m.HLSMediaError.fragDecryptError(o);this.emit(l.ERROR,a);break}case E.default.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR:{let a=m.HLSMediaError.bufferIncompatibleCodecsError(o);this.emit(l.ERROR,a);break}case E.default.ErrorDetails.MANIFEST_LOAD_ERROR:{let a=m.HLSNetworkError.manifestLoadError(o);this.emit(l.ERROR,a);break}case E.default.ErrorDetails.MANIFEST_PARSING_ERROR:{let a=m.HLSNetworkError.manifestParsingError(o);this.emit(l.ERROR,a);break}case E.default.ErrorDetails.LEVEL_LOAD_ERROR:{let a=m.HLSNetworkError.layerLoadError(o);this.emit(l.ERROR,a);break}default:{let a=m.UnknownError(o);this.emit(l.ERROR,a);break}}};this.manifestLoadedHandler=(e,{levels:t})=>{let i=O(this.removeAudioLevels(t));this.emit(l.MANIFEST_LOADED,{layers:i})};this.levelUpdatedHandler=(e,{level:t})=>{let i=c(this._hls.levels[t]);this.emit(l.LAYER_UPDATED,{layer:i})};this.handleTimeUpdateListener=e=>{this.emit(l.CURRENT_TIME,this._videoEl.currentTime);let t=this._hls.liveSyncPosition?this._hls.liveSyncPosition-this._videoEl.currentTime<=A:!1;this._isLive!==t&&(this._isLive=t,this.emit(l.SEEK_POS_BEHIND_LIVE_EDGE,{isLive:this._isLive}))};if(this._hls=new E.default(this.getPlayerConfig()),this._emitter=new M,this._hlsUrl=e,this._videoEl=t||this.createVideoElement(),e){if(!e.endsWith("m3u8"))throw m.HLSMediaError.hlsURLNotFound("Invalid URL, pass m3u8 url")}else throw m.HLSMediaError.hlsURLNotFound();this._hls.loadSource(e),this._hls.attachMedia(this._videoEl),this._isLive=!0,this._volume=this._videoEl.volume*100,this._hlsStats=new g.HlsStats(this._hls,this._videoEl),this.listenHLSEvent(),this._metaData=new T(this._hls,this._videoEl,this.emit),this.seekToLivePosition()}createVideoElement(){if(this._videoEl)return this._videoEl;let e=document.createElement("video");return e.playsInline=!0,e.controls=!1,e.autoplay=!0,e}getVideoElement(){return this._videoEl}reset(){this._hls&&this._hls.media&&(this._hls.detachMedia(),this.unsubscribeStats()),this._metaData&&this._metaData.unregisterListener(),E.default.isSupported()&&(this._hls.off(E.default.Events.MANIFEST_LOADED,this.manifestLoadedHandler),this._hls.off(E.default.Events.LEVEL_UPDATED,this.levelUpdatedHandler),this._hls.off(E.default.Events.ERROR,this.handleHLSException)),this._videoEl&&(this._videoEl.removeEventListener("play",this.playEventHandler),this._videoEl.removeEventListener("pause",this.pauseEventHandler),this._videoEl.removeEventListener("timeupdate",this.handleTimeUpdateListener),this._videoEl.removeEventListener("volumechange",this.volumeEventHandler)),this.removeAllListeners()}get volume(){return this._volume}setVolume(e){this._videoEl.volume=e/100,this._volume=e}getLayer(){var e,t;if(this._hls&&this._hls.currentLevel!==-1){let i=(t=this._hls)==null?void 0:t.levels.at((e=this._hls)==null?void 0:e.currentLevel);return i?c(i):null}return null}setLayer(e){if(this._hls){let t=this._hls.levels.findIndex(i=>{var o;return((o=i==null?void 0:i.attrs)==null?void 0:o.RESOLUTION)===(e==null?void 0:e.resolution)});this._hls.currentLevel=t}}seekToLivePosition(){return v(this,null,function*(){let e=0;if(this._videoEl.buffered.length>0&&(e=this._videoEl.buffered.end(this._videoEl.buffered.length-1)),this._videoEl.currentTime=this._hls.liveSyncPosition||e,this._videoEl.paused)try{yield this.playVideo()}catch(t){console.error(this.TAG,"Attempt to jump to live position Failed.",t)}})}listenHLSEvent(){E.default.isSupported()?(this._hls.on(E.default.Events.MANIFEST_LOADED,this.manifestLoadedHandler),this._hls.on(E.default.Events.LEVEL_UPDATED,this.levelUpdatedHandler),this._hls.on(E.default.Events.ERROR,this.handleHLSException),this.subscribeStats()):this._videoEl.canPlayType("application/vnd.apple.mpegurl")&&(this._videoEl.src=this._hlsUrl),this._videoEl.addEventListener("timeupdate",this.handleTimeUpdateListener),this._videoEl.addEventListener("play",this.playEventHandler),this._videoEl.addEventListener("pause",this.pauseEventHandler),this._videoEl.addEventListener("volumechange",this.volumeEventHandler)}getPlayerConfig(){return{enableWorker:!0,maxBufferLength:20,backBufferLength:10}}removeAudioLevels(e){return e.filter(({videoCodec:t,width:i,height:o})=>!!t||!!(i&&o))}};
7
+ }`}};var A=5,l;(function(s){s.TIMED_METADATA_LOADED="timed-metadata",s.SEEK_POS_BEHIND_LIVE_EDGE="seek-pos-behind-live-edge",s.CURRENT_TIME="current-time",s.AUTOPLAY_BLOCKED="autoplay-blocked",s.MANIFEST_LOADED="manifest-loaded",s.LAYER_UPDATED="layer-updated",s.ERROR="error",s.PLAYBACK_STATE="playback-state",s.STATS="stats"})(l||(l={}));var L;(function(n){n.MANIFEST_LOAD_ERROR="manifest-load-error",n.MANIFEST_PARSING_ERROR="manifest-parsing-error",n.LAYER_LOAD_ERROR="layer-load-error",n.MANIFEST_INCOMPATIBLE_CODECS_ERROR="manifest-incompatible-codecs-error",n.FRAG_DECRYPT_ERROR="frag-decrypt-error",n.BUFFER_INCOMPATIBLE_CODECS_ERROR="buffer-incompatible-codecs-error",n.VIDEO_ELEMENT_NOT_FOUND="video-element-not-found",n.HLS_AUTOPLAY_FAILED="hls-autoplay-failed",n.HLS_URL_NOT_FOUND="hls-url-not-found",n.UNKNOWN_ERROR="unknown-error"})(L||(L={}));var H;(function(t){t[t.playing=0]="playing",t[t.paused=1]="paused"})(H||(H={}));var m={HLSNetworkError:{manifestLoadError(r){return new d(L.MANIFEST_LOAD_ERROR,r.details,"Unable to load manifest file",r.fatal)},manifestParsingError(r){return new d(L.MANIFEST_PARSING_ERROR,r.details,"Unable to parse manifest file",r.fatal)},layerLoadError(r){return new d(L.LAYER_LOAD_ERROR,r.details,"Unable to load quality layers",r.fatal)}},HLSMediaError:{manifestIncompatibleCodecsError(r){return new d(L.MANIFEST_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible manifest codecs",r.fatal)},fragDecryptError(r){return new d(L.FRAG_DECRYPT_ERROR,r.details,"Unable to decrypt fragment",r.fatal)},bufferIncompatibleCodecsError(r){return new d(L.BUFFER_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible buffer codecs",r.fatal)},videoElementNotFound(){return new d(L.VIDEO_ELEMENT_NOT_FOUND,"Video element not found","Video element not found",!1)},autoplayFailed(){return new d(L.HLS_AUTOPLAY_FAILED,"Failed to autoplay","Failed to autoplay",!1)},hlsURLNotFound(r){return new d(L.HLS_URL_NOT_FOUND,r||"hls url not found",r||"hls url not found",!0)}},UnknownError:r=>new d(L.UNKNOWN_ERROR,r.details,"Unknown error",r.fatal)};var P=r=>{try{let e=window==null?void 0:window.atob(r);return JSON.parse(e)}catch(e){return{payload:r}}},O=r=>r.map(e=>c(e)),c=r=>{var e;return{resolution:(e=r.attrs)==null?void 0:e.RESOLUTION,bitrate:r.bitrate,height:r.height,id:r.id,url:r.url[0],width:r.width}};var T=class{constructor(e,t,i){this.videoEl=t;this.emitEvent=i;this.extractMetaTextTrack=()=>{let e=this.videoEl.textTracks.length||0;for(let t=0;t<e;t++){let i=this.videoEl.textTracks[t];if((i==null?void 0:i.kind)==="metadata")return i.mode="showing",i}return null};this.fireCues=(e,t)=>{var v;let i=(v=this.extractMetaTextTrack())==null?void 0:v.cues;if(!i)return;let o=i.length,S=0;for(;S<o;){let a=i[S];if(a.queued)return;let h=P(a.value.data),s=h.start_date,n=h.end_date,R=new Date(s).getTime()-e,I=new Date(n).getTime()-new Date(s).getTime();R<=t&&(setTimeout(()=>{this.emitEvent(l.TIMED_METADATA_LOADED,{id:a==null?void 0:a.id,payload:h.payload,duration:I,startDate:new Date(s),endDate:new Date(n)})},R),a.queued=!0),S++}};this.handleTimeUpdateListener=()=>{var o;let e=this.extractMetaTextTrack();if(!e||!e.cues)return;let t=((o=this.videoEl)==null?void 0:o.getStartDate())||0,i=new Date(t).getTime()+(this.videoEl.currentTime||0)*1e3;this.fireCues(i,.25)};this.fragChangeHandler=(e,{frag:t})=>{if(!this.videoEl){let i=m.HLSMediaError.videoElementNotFound();this.emitEvent(l.ERROR,i)}try{if(this.videoEl.textTracks.length===0)return;let i=t.programDateTime||0,o=t.end-t.start;this.fireCues(i,o)}catch(i){console.error("FRAG_CHANGED event error",i)}};this.registerListner=()=>{f.default.isSupported()?this.hls.on(f.default.Events.FRAG_CHANGED,this.fragChangeHandler):this.videoEl.canPlayType("application/vnd.apple.mpegurl")&&this.videoEl.addEventListener("timeupdate",this.handleTimeUpdateListener)};this.unregisterListener=()=>{this.hls.off(f.default.Events.FRAG_CHANGED,this.fragChangeHandler),this.videoEl.removeEventListener("timeupdate",this.handleTimeUpdateListener)};this.hls=e,this.registerListner()}};var b=u(require("eventemitter2")),y=class{constructor(){this.eventEmitter=new b.EventEmitter2}on(e,t){this.eventEmitter.on(e,t)}off(e,t){this.eventEmitter.off(e,t)}emitEvent(e,t){return this.eventEmitter.emit(e,t,e)}removeAllListeners(e){this.eventEmitter.removeAllListeners(e)}};var M=class{constructor(e,t){this._subscribeHlsStats=null;this.TAG="[HMSHLSPlayer]";this.subscribeStats=(e=2e3)=>{this._subscribeHlsStats=this._hlsStats.subscribe(t=>{this.emitEvent(l.STATS,t)},e)};this.unsubscribeStats=()=>{this._subscribeHlsStats&&this._subscribeHlsStats()};this.on=(e,t)=>{this._emitter.on(e,t)};this.off=(e,t)=>{this._emitter.off(e,t)};this.emitEvent=(e,t)=>this._emitter.emitEvent(e,t);this.removeAllListeners=e=>{this._emitter.removeAllListeners(e)};this.play=()=>p(this,null,function*(){yield this.playVideo()});this.pause=()=>{this.pauseVideo()};this.seekTo=e=>{this._videoEl.currentTime=e};this.playVideo=()=>p(this,null,function*(){try{this._videoEl.paused&&(yield this._videoEl.play())}catch(e){console.debug(this.TAG,"Play failed with error",e.message),e.name==="NotAllowedError"&&this.emitEvent(l.AUTOPLAY_BLOCKED,m.HLSMediaError.autoplayFailed())}});this.pauseVideo=()=>{this._videoEl.paused||this._videoEl.pause()};this.playEventHandler=()=>{this.emitEvent(l.PLAYBACK_STATE,{state:H.playing})};this.pauseEventHandler=()=>{this.emitEvent(l.PLAYBACK_STATE,{state:H.paused})};this.volumeEventHandler=()=>{this._volume=this._videoEl.volume};this.handleHLSException=(e,t)=>{var S,v;console.error(this.TAG,`error type ${t.type} with details ${t.details} is fatal ${t.fatal}`);let o={details:((S=t.error)==null?void 0:S.message)||((v=t.err)==null?void 0:v.message)||"",fatal:t.fatal};switch(t.details){case E.default.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR:{let a=m.HLSMediaError.manifestIncompatibleCodecsError(o);this.emitEvent(l.ERROR,a);break}case E.default.ErrorDetails.FRAG_DECRYPT_ERROR:{let a=m.HLSMediaError.fragDecryptError(o);this.emitEvent(l.ERROR,a);break}case E.default.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR:{let a=m.HLSMediaError.bufferIncompatibleCodecsError(o);this.emitEvent(l.ERROR,a);break}case E.default.ErrorDetails.MANIFEST_LOAD_ERROR:{let a=m.HLSNetworkError.manifestLoadError(o);this.emitEvent(l.ERROR,a);break}case E.default.ErrorDetails.MANIFEST_PARSING_ERROR:{let a=m.HLSNetworkError.manifestParsingError(o);this.emitEvent(l.ERROR,a);break}case E.default.ErrorDetails.LEVEL_LOAD_ERROR:{let a=m.HLSNetworkError.layerLoadError(o);this.emitEvent(l.ERROR,a);break}default:{let a=m.UnknownError(o);this.emitEvent(l.ERROR,a);break}}};this.manifestLoadedHandler=(e,{levels:t})=>{let i=O(this.removeAudioLevels(t));this.emitEvent(l.MANIFEST_LOADED,{layers:i})};this.levelUpdatedHandler=(e,{level:t})=>{let i=c(this._hls.levels[t]);this.emitEvent(l.LAYER_UPDATED,{layer:i})};this.handleTimeUpdateListener=e=>{this.emitEvent(l.CURRENT_TIME,this._videoEl.currentTime);let t=this._hls.liveSyncPosition?this._hls.liveSyncPosition-this._videoEl.currentTime<=A:!1;this._isLive!==t&&(this._isLive=t,this.emitEvent(l.SEEK_POS_BEHIND_LIVE_EDGE,{isLive:this._isLive}))};if(this._hls=new E.default(this.getPlayerConfig()),this._emitter=new y,this._hlsUrl=e,this._videoEl=t||this.createVideoElement(),e){if(!e.endsWith("m3u8"))throw m.HLSMediaError.hlsURLNotFound("Invalid URL, pass m3u8 url")}else throw m.HLSMediaError.hlsURLNotFound();this._hls.loadSource(e),this._hls.attachMedia(this._videoEl),this._isLive=!0,this._volume=this._videoEl.volume*100,this._hlsStats=new g.HlsStats(this._hls,this._videoEl),this.listenHLSEvent(),this._metaData=new T(this._hls,this._videoEl,this.emitEvent),this.seekToLivePosition()}createVideoElement(){if(this._videoEl)return this._videoEl;let e=document.createElement("video");return e.playsInline=!0,e.controls=!1,e.autoplay=!0,e}getVideoElement(){return this._videoEl}reset(){this._hls&&this._hls.media&&(this._hls.detachMedia(),this.unsubscribeStats()),this._metaData&&this._metaData.unregisterListener(),E.default.isSupported()&&(this._hls.off(E.default.Events.MANIFEST_LOADED,this.manifestLoadedHandler),this._hls.off(E.default.Events.LEVEL_UPDATED,this.levelUpdatedHandler),this._hls.off(E.default.Events.ERROR,this.handleHLSException)),this._videoEl&&(this._videoEl.removeEventListener("play",this.playEventHandler),this._videoEl.removeEventListener("pause",this.pauseEventHandler),this._videoEl.removeEventListener("timeupdate",this.handleTimeUpdateListener),this._videoEl.removeEventListener("volumechange",this.volumeEventHandler)),this.removeAllListeners()}get volume(){return this._volume}setVolume(e){this._videoEl.volume=e/100,this._volume=e}getLayer(){var e,t;if(this._hls&&this._hls.currentLevel!==-1){let i=(t=this._hls)==null?void 0:t.levels.at((e=this._hls)==null?void 0:e.currentLevel);return i?c(i):null}return null}setLayer(e){if(this._hls){let t=this._hls.levels.findIndex(i=>{var o;return((o=i==null?void 0:i.attrs)==null?void 0:o.RESOLUTION)===(e==null?void 0:e.resolution)});this._hls.currentLevel=t}}seekToLivePosition(){return p(this,null,function*(){let e=0;if(this._videoEl.buffered.length>0&&(e=this._videoEl.buffered.end(this._videoEl.buffered.length-1)),this._videoEl.currentTime=this._hls.liveSyncPosition||e,this._videoEl.paused)try{yield this.playVideo()}catch(t){console.error(this.TAG,"Attempt to jump to live position Failed.",t)}})}listenHLSEvent(){E.default.isSupported()?(this._hls.on(E.default.Events.MANIFEST_LOADED,this.manifestLoadedHandler),this._hls.on(E.default.Events.LEVEL_UPDATED,this.levelUpdatedHandler),this._hls.on(E.default.Events.ERROR,this.handleHLSException),this.subscribeStats()):this._videoEl.canPlayType("application/vnd.apple.mpegurl")&&(this._videoEl.src=this._hlsUrl),this._videoEl.addEventListener("timeupdate",this.handleTimeUpdateListener),this._videoEl.addEventListener("play",this.playEventHandler),this._videoEl.addEventListener("pause",this.pauseEventHandler),this._videoEl.addEventListener("volumechange",this.volumeEventHandler)}getPlayerConfig(){return{enableWorker:!0,maxBufferLength:20,backBufferLength:10}}removeAudioLevels(e){return e.filter(({videoCodec:t,width:i,height:o})=>!!t||!!(i&&o))}};
8
8
  //# sourceMappingURL=index.cjs.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/controllers/HMSHLSPlayer.ts", "../src/controllers/HMSHLSTimedMetadata.ts", "../src/error/HMSHLSException.ts", "../src/utilies/constants.ts", "../src/error/HMSHLSErrorFactory.ts", "../src/utilies/utils.ts", "../src/interfaces/events.ts"],
4
- "sourcesContent": ["import { HlsPlayerStats } from '@100mslive/hls-stats';\nimport { HMSHLSPlayer } from './controllers/HMSHLSPlayer';\nimport { HMSHLSException } from './error/HMSHLSException';\nimport { HMSHLSLayer } from './interfaces/IHMSHLSLayer';\nimport { HLSPlaybackState, HMSHLSPlayerEvents } from './utilies/constants';\nexport type { HMSHLSLayer, HMSHLSException, HlsPlayerStats };\nexport { HMSHLSPlayer, HLSPlaybackState, HMSHLSPlayerEvents };\n", "import { HlsPlayerStats, HlsStats } from '@100mslive/hls-stats';\nimport Hls, { ErrorData, HlsConfig, Level, LevelParsed } from 'hls.js';\nimport { HMSHLSTimedMetadata } from './HMSHLSTimedMetadata';\nimport { HMSHLSErrorFactory } from '../error/HMSHLSErrorFactory';\nimport { HMSHLSPlayerEventEmitter, HMSHLSPlayerListeners, IHMSHLSPlayerEventEmitter } from '../interfaces/events';\nimport { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';\nimport IHMSHLSPlayer from '../interfaces/IHMSHLSPlayer';\nimport { HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY, HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';\nimport { mapLayer, mapLayers } from '../utilies/utils';\n\nexport class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {\n private _hls: Hls;\n private _hlsUrl: string;\n private _hlsStats: HlsStats;\n private _videoEl: HTMLVideoElement;\n private _emitter: HMSHLSPlayerEventEmitter;\n private _subscribeHlsStats?: (() => void) | null = null;\n private _isLive: boolean;\n private _volume: number;\n private _metaData: HMSHLSTimedMetadata;\n private readonly TAG = '[HMSHLSPlayer]';\n /**\n * Initiliaze the player with hlsUrl and video element\n * @remarks If video element is not passed, we will create one and call a method getVideoElement get element\n * @param hlsUrl required - Pass hls url to\n * @param videoEl optional field - HTML video element\n */\n constructor(hlsUrl: string, videoEl?: HTMLVideoElement) {\n this._hls = new Hls(this.getPlayerConfig());\n this._emitter = new HMSHLSPlayerEventEmitter();\n this._hlsUrl = hlsUrl;\n this._videoEl = videoEl || this.createVideoElement();\n if (!hlsUrl) {\n throw HMSHLSErrorFactory.HLSMediaError.hlsURLNotFound();\n } else if (!hlsUrl.endsWith('m3u8')) {\n throw HMSHLSErrorFactory.HLSMediaError.hlsURLNotFound('Invalid URL, pass m3u8 url');\n }\n this._hls.loadSource(hlsUrl);\n this._hls.attachMedia(this._videoEl);\n this._isLive = true;\n this._volume = this._videoEl.volume * 100;\n this._hlsStats = new HlsStats(this._hls, this._videoEl);\n this.listenHLSEvent();\n this._metaData = new HMSHLSTimedMetadata(this._hls, this._videoEl, this.emit);\n this.seekToLivePosition();\n }\n\n /**\n * @remarks It will create a video element with playiniline true.\n * @returns HTML video element\n */\n private createVideoElement(): HTMLVideoElement {\n if (this._videoEl) {\n return this._videoEl;\n }\n const video: HTMLVideoElement = document.createElement('video');\n video.playsInline = true;\n video.controls = false;\n video.autoplay = true;\n return video;\n }\n /**\n * @returns get html video element\n */\n getVideoElement(): HTMLVideoElement {\n return this._videoEl;\n }\n /**\n * Subscribe to hls stats\n */\n private subscribeStats = (interval = 2000) => {\n this._subscribeHlsStats = this._hlsStats.subscribe((state: HlsPlayerStats) => {\n this.emit(HMSHLSPlayerEvents.STATS, state);\n }, interval);\n };\n /**\n * Unsubscribe to hls stats\n */\n private unsubscribeStats = () => {\n if (this._subscribeHlsStats) {\n this._subscribeHlsStats();\n }\n };\n // reset the controller\n reset() {\n if (this._hls && this._hls.media) {\n this._hls.detachMedia();\n this.unsubscribeStats();\n }\n if (this._metaData) {\n this._metaData.unregisterListener();\n }\n if (Hls.isSupported()) {\n this._hls.off(Hls.Events.MANIFEST_LOADED, this.manifestLoadedHandler);\n this._hls.off(Hls.Events.LEVEL_UPDATED, this.levelUpdatedHandler);\n this._hls.off(Hls.Events.ERROR, this.handleHLSException);\n }\n if (this._videoEl) {\n this._videoEl.removeEventListener('play', this.playEventHandler);\n this._videoEl.removeEventListener('pause', this.pauseEventHandler);\n this._videoEl.removeEventListener('timeupdate', this.handleTimeUpdateListener);\n this._videoEl.removeEventListener('volumechange', this.volumeEventHandler);\n }\n this.removeAllListeners();\n }\n\n on = <E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) => {\n this._emitter.on(eventName, listener);\n };\n\n off = <E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) => {\n this._emitter.off(eventName, listener);\n };\n\n emit = <E extends HMSHLSPlayerEvents>(\n eventName: E,\n eventObject: Parameters<HMSHLSPlayerListeners<E>>[0],\n ): boolean => {\n return this._emitter.emit(eventName, eventObject);\n };\n\n private removeAllListeners = <E extends HMSHLSPlayerEvents>(eventName?: E): void => {\n this._emitter.removeAllListeners(eventName);\n };\n\n public get volume(): number {\n return this._volume;\n }\n\n setVolume(volume: number) {\n this._videoEl.volume = volume / 100;\n this._volume = volume;\n }\n\n getLayer(): HMSHLSLayer | null {\n if (this._hls && this._hls.currentLevel !== -1) {\n const currentLevel = this._hls?.levels.at(this._hls?.currentLevel);\n return currentLevel ? mapLayer(currentLevel) : null;\n }\n return null;\n }\n\n setLayer(layer: HMSHLSLayer): void {\n if (this._hls) {\n const current = this._hls.levels.findIndex((level: Level) => {\n return level?.attrs?.RESOLUTION === layer?.resolution;\n });\n this._hls.currentLevel = current;\n }\n return;\n }\n /**\n * set current stream to Live\n */\n async seekToLivePosition() {\n let end = 0;\n if (this._videoEl.buffered.length > 0) {\n end = this._videoEl.buffered.end(this._videoEl.buffered.length - 1);\n }\n this._videoEl.currentTime = this._hls.liveSyncPosition || end;\n if (this._videoEl.paused) {\n try {\n await this.playVideo();\n } catch (err) {\n console.error(this.TAG, 'Attempt to jump to live position Failed.', err);\n }\n }\n }\n /**\n * Play stream\n */\n play = async () => {\n await this.playVideo();\n };\n /**\n * Pause stream\n */\n pause = () => {\n this.pauseVideo();\n };\n /**\n * It will update the video element current time\n * @param seekValue Pass currentTime in second\n */\n seekTo = (seekValue: number) => {\n this._videoEl.currentTime = seekValue;\n };\n\n private playVideo = async () => {\n try {\n if (this._videoEl.paused) {\n await this._videoEl.play();\n }\n } catch (error) {\n console.debug(this.TAG, 'Play failed with error', (error as Error).message);\n if ((error as Error).name === 'NotAllowedError') {\n this.emit(HMSHLSPlayerEvents.AUTOPLAY_BLOCKED, HMSHLSErrorFactory.HLSMediaError.autoplayFailed());\n }\n }\n };\n private pauseVideo = () => {\n if (!this._videoEl.paused) {\n this._videoEl.pause();\n }\n };\n private playEventHandler = () => {\n this.emit(HMSHLSPlayerEvents.PLAYBACK_STATE, {\n state: HLSPlaybackState.playing,\n });\n };\n private pauseEventHandler = () => {\n this.emit(HMSHLSPlayerEvents.PLAYBACK_STATE, {\n state: HLSPlaybackState.paused,\n });\n };\n private volumeEventHandler = () => {\n this._volume = this._videoEl.volume;\n };\n // eslint-disable-next-line complexity\n private handleHLSException = (_: any, data: ErrorData) => {\n console.error(this.TAG, data);\n const details = data.error?.message || data.err?.message || '';\n const detail = {\n details: details,\n fatal: data.fatal,\n };\n switch (data.details) {\n case Hls.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.manifestIncompatibleCodecsError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.FRAG_DECRYPT_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.fragDecryptError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.bufferIncompatibleCodecsError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n // Below one are network related errors\n case Hls.ErrorDetails.MANIFEST_LOAD_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.manifestLoadError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.MANIFEST_PARSING_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.manifestParsingError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.LEVEL_LOAD_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.layerLoadError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n default: {\n const error = HMSHLSErrorFactory.UnknownError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n }\n };\n private manifestLoadedHandler = (_: any, { levels }: { levels: LevelParsed[] }) => {\n const layers: HMSHLSLayer[] = mapLayers(this.removeAudioLevels(levels));\n this.emit(HMSHLSPlayerEvents.MANIFEST_LOADED, {\n layers,\n });\n };\n private levelUpdatedHandler = (_: any, { level }: { level: number }) => {\n const qualityLayer: HMSHLSLayer = mapLayer(this._hls.levels[level]);\n this.emit(HMSHLSPlayerEvents.LAYER_UPDATED, {\n layer: qualityLayer,\n });\n };\n\n private handleTimeUpdateListener = (_: Event) => {\n this.emit(HMSHLSPlayerEvents.CURRENT_TIME, this._videoEl.currentTime);\n const live = this._hls.liveSyncPosition\n ? this._hls.liveSyncPosition - this._videoEl.currentTime <= HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY\n : false;\n if (this._isLive !== live) {\n this._isLive = live;\n this.emit(HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE, {\n isLive: this._isLive,\n });\n }\n };\n /**\n * Listen to hlsjs and video related events\n */\n private listenHLSEvent() {\n if (Hls.isSupported()) {\n this._hls.on(Hls.Events.MANIFEST_LOADED, this.manifestLoadedHandler);\n this._hls.on(Hls.Events.LEVEL_UPDATED, this.levelUpdatedHandler);\n this._hls.on(Hls.Events.ERROR, this.handleHLSException);\n this.subscribeStats();\n } else if (this._videoEl.canPlayType('application/vnd.apple.mpegurl')) {\n // code for ios safari, mseNot Supported.\n this._videoEl.src = this._hlsUrl;\n }\n this._videoEl.addEventListener('timeupdate', this.handleTimeUpdateListener);\n this._videoEl.addEventListener('play', this.playEventHandler);\n this._videoEl.addEventListener('pause', this.pauseEventHandler);\n this._videoEl.addEventListener('volumechange', this.volumeEventHandler);\n }\n\n private getPlayerConfig(): Partial<HlsConfig> {\n return {\n enableWorker: true,\n maxBufferLength: 20,\n backBufferLength: 10,\n };\n }\n\n /**\n * @param {Array} levels array from hlsJS\n * @returns a new array with only video levels.\n */\n private removeAudioLevels(levels: LevelParsed[]) {\n return levels.filter(({ videoCodec, width, height }) => !!videoCodec || !!(width && height));\n }\n}\n", "import Hls, { Fragment } from 'hls.js';\nimport { HMSHLSErrorFactory } from '../error/HMSHLSErrorFactory';\nimport { HMSHLSPlayerListeners } from '../interfaces/events';\nimport { HMSHLSPlayerEvents } from '../utilies/constants';\nimport { metadataPayloadParser } from '../utilies/utils';\n\nexport class HMSHLSTimedMetadata {\n private hls: Hls;\n constructor(\n hls: Hls,\n private videoEl: HTMLVideoElement,\n private emit: <E extends HMSHLSPlayerEvents>(\n eventName: E,\n eventObject: Parameters<HMSHLSPlayerListeners<E>>[0],\n ) => boolean,\n ) {\n this.hls = hls;\n this.registerListner();\n }\n extractMetaTextTrack = (): TextTrack | null => {\n const textTrackListCount = this.videoEl.textTracks.length || 0;\n for (let trackIndex = 0; trackIndex < textTrackListCount; trackIndex++) {\n const textTrack = this.videoEl.textTracks[trackIndex];\n if (textTrack?.kind !== 'metadata') {\n continue;\n }\n textTrack.mode = 'showing';\n return textTrack;\n }\n return null;\n };\n\n // sync time with cue and trigger event\n fireCues = (currentAbsTime: number, tolerance: number) => {\n const cues = this.extractMetaTextTrack()?.cues;\n if (!cues) {\n return;\n }\n const cuesLength = cues.length;\n let cueIndex = 0;\n while (cueIndex < cuesLength) {\n const cue = cues[cueIndex] as TextTrackCue & {\n queued: boolean;\n value: { data: string };\n };\n if (cue.queued) {\n return;\n }\n // here we are converting base64 to actual data.\n const data: Record<string, any> = metadataPayloadParser(cue.value.data);\n const startDate = data.start_date;\n const endDate = data.end_date;\n const timeDiff = new Date(startDate).getTime() - currentAbsTime;\n const duration = new Date(endDate).getTime() - new Date(startDate).getTime();\n if (timeDiff <= tolerance) {\n setTimeout(() => {\n this.emit(HMSHLSPlayerEvents.TIMED_METADATA_LOADED, {\n id: cue?.id,\n payload: data.payload,\n duration: duration,\n startDate: new Date(startDate),\n endDate: new Date(endDate),\n });\n }, timeDiff);\n cue.queued = true;\n }\n cueIndex++;\n }\n };\n\n // handle time update listener\n handleTimeUpdateListener = () => {\n // extract timed metadata text track\n const metaTextTrack: TextTrack | null = this.extractMetaTextTrack();\n if (!metaTextTrack || !metaTextTrack.cues) {\n return;\n }\n // @ts-ignore\n const firstFragProgramDateTime = this.videoEl?.getStartDate() || 0;\n const currentAbsTime = new Date(firstFragProgramDateTime).getTime() + (this.videoEl.currentTime || 0) * 1000;\n // fire cue for timed meta data extract\n this.fireCues(currentAbsTime, 0.25);\n };\n /**\n * Metadata are automatically parsed and added to the video element's\n * textTrack cue by hlsjs as they come through the stream.\n * in FRAG_CHANGED, we read the cues and emit HLS_METADATA_LOADED\n * when the current fragment has a metadata to play.\n */\n fragChangeHandler = (_: any, { frag }: { frag: Fragment }) => {\n if (!this.videoEl) {\n const error = HMSHLSErrorFactory.HLSMediaError.videoElementNotFound();\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n }\n try {\n if (this.videoEl.textTracks.length === 0) {\n return;\n }\n const fragStartTime = frag.programDateTime || 0;\n const fragmentDuration = frag.end - frag.start;\n this.fireCues(fragStartTime, fragmentDuration);\n } catch (e) {\n console.error('FRAG_CHANGED event error', e);\n }\n };\n private registerListner = () => {\n if (Hls.isSupported()) {\n this.hls.on(Hls.Events.FRAG_CHANGED, this.fragChangeHandler);\n } else if (this.videoEl.canPlayType('application/vnd.apple.mpegurl')) {\n this.videoEl.addEventListener('timeupdate', this.handleTimeUpdateListener);\n }\n };\n\n unregisterListener = () => {\n this.hls.off(Hls.Events.FRAG_CHANGED, this.fragChangeHandler);\n this.videoEl.removeEventListener('timeupdate', this.handleTimeUpdateListener);\n };\n}\n", "export class HMSHLSException extends Error {\n nativeError?: Error;\n\n constructor(\n public name: string,\n public message: string,\n public description: string,\n public isTerminal: boolean = false,\n ) {\n super(message);\n\n // Ref: https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, HMSHLSException.prototype);\n }\n\n toAnalyticsProperties() {\n return {\n error_name: this.name,\n error_message: this.message,\n error_description: this.description,\n is_terminal: this.isTerminal,\n };\n }\n\n addNativeError(error: Error) {\n this.nativeError = error;\n }\n\n toString() {\n return `{\n name: ${this.name};\n message: ${this.message};\n description: ${this.description};\n isTerminal: ${this.isTerminal};\n nativeError: ${this.nativeError?.message};\n }`;\n }\n}\n", "export const HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY = 5;\n\nexport enum HMSHLSPlayerEvents {\n TIMED_METADATA_LOADED = 'timed-metadata',\n SEEK_POS_BEHIND_LIVE_EDGE = 'seek-pos-behind-live-edge',\n\n CURRENT_TIME = 'current-time',\n AUTOPLAY_BLOCKED = 'autoplay-blocked',\n\n MANIFEST_LOADED = 'manifest-loaded',\n LAYER_UPDATED = 'layer-updated',\n\n ERROR = 'error',\n PLAYBACK_STATE = 'playback-state',\n STATS = 'stats',\n}\n\nexport enum HMSHLSExceptionEvents {\n MANIFEST_LOAD_ERROR = 'manifest-load-error',\n MANIFEST_PARSING_ERROR = 'manifest-parsing-error',\n LAYER_LOAD_ERROR = 'layer-load-error',\n\n MANIFEST_INCOMPATIBLE_CODECS_ERROR = 'manifest-incompatible-codecs-error',\n FRAG_DECRYPT_ERROR = 'frag-decrypt-error',\n BUFFER_INCOMPATIBLE_CODECS_ERROR = 'buffer-incompatible-codecs-error',\n\n VIDEO_ELEMENT_NOT_FOUND = 'video-element-not-found',\n HLS_AUTOPLAY_FAILED = 'hls-autoplay-failed',\n HLS_URL_NOT_FOUND = 'hls-url-not-found',\n UNKNOWN_ERROR = 'unknown-error',\n}\n\nexport enum HLSPlaybackState {\n playing,\n paused,\n}\n", "import { HMSHLSException } from './HMSHLSException';\nimport { HMSHLSExceptionEvents } from '../utilies/constants';\n\nexport type HMSHLSErrorDetails = {\n details: string;\n fatal?: boolean;\n};\nexport const HMSHLSErrorFactory = {\n HLSNetworkError: {\n manifestLoadError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_LOAD_ERROR,\n data.details,\n 'Unable to load manifest file',\n data.fatal,\n );\n },\n manifestParsingError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_PARSING_ERROR,\n data.details,\n 'Unable to parse manifest file',\n data.fatal,\n );\n },\n layerLoadError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.LAYER_LOAD_ERROR,\n data.details,\n 'Unable to load quality layers',\n data.fatal,\n );\n },\n },\n HLSMediaError: {\n manifestIncompatibleCodecsError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_INCOMPATIBLE_CODECS_ERROR,\n data.details,\n 'Incompatible manifest codecs',\n data.fatal,\n );\n },\n fragDecryptError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.FRAG_DECRYPT_ERROR,\n data.details,\n 'Unable to decrypt fragment',\n data.fatal,\n );\n },\n bufferIncompatibleCodecsError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.BUFFER_INCOMPATIBLE_CODECS_ERROR,\n data.details,\n 'Incompatible buffer codecs',\n data.fatal,\n );\n },\n videoElementNotFound(): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.VIDEO_ELEMENT_NOT_FOUND,\n 'Video element not found',\n 'Video element not found',\n false,\n );\n },\n autoplayFailed(): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.HLS_AUTOPLAY_FAILED,\n 'Failed to autoplay',\n 'Failed to autoplay',\n false,\n );\n },\n hlsURLNotFound(msg?: string): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.HLS_URL_NOT_FOUND,\n msg || 'hls url not found',\n msg || 'hls url not found',\n true,\n );\n },\n },\n UnknownError: (data: HMSHLSErrorDetails): HMSHLSException => {\n return new HMSHLSException(HMSHLSExceptionEvents.UNKNOWN_ERROR, data.details, 'Unknown error', data.fatal);\n },\n};\n", "import { Level, LevelParsed } from 'hls.js';\nimport { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';\n\n/**\n *\n * @param payload a base64 string coming from backend\n * @returns a parsed data which contains payload, start_date, end_date, version\n */\nexport const metadataPayloadParser = (payload: string): Record<string, any> => {\n try {\n const data = window?.atob(payload);\n const parsedData = JSON.parse(data);\n return parsedData;\n } catch (e) {\n return { payload };\n }\n};\n\n/**\n * map Level[] to HMSHLSLayer[]\n */\nexport const mapLayers = (levels: Level[] | LevelParsed[]): HMSHLSLayer[] => {\n return levels.map((level: Level | LevelParsed) => mapLayer(level));\n};\n\n/**\n * map Level[] to HMSHLSLayer[]\n */\nexport const mapLayer = (quality: Level | LevelParsed): HMSHLSLayer => {\n return {\n resolution: quality.attrs?.RESOLUTION,\n bitrate: quality.bitrate,\n height: quality.height,\n id: quality.id,\n url: quality.url[0],\n width: quality.width,\n };\n};\n", "import { HlsPlayerStats } from '@100mslive/hls-stats';\nimport { EventEmitter2 as EventEmitter } from 'eventemitter2';\nimport { HMSHLSLayer } from './IHMSHLSLayer';\nimport { HMSHLSException } from '../error/HMSHLSException';\nimport { HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';\n\ntype HMSHLSListenerDataMapping = {\n [HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE]: HMSHLSStreamLive;\n [HMSHLSPlayerEvents.TIMED_METADATA_LOADED]: HMSHLSCue;\n [HMSHLSPlayerEvents.STATS]: HlsPlayerStats;\n [HMSHLSPlayerEvents.PLAYBACK_STATE]: HMSHLSPlaybackState;\n\n [HMSHLSPlayerEvents.ERROR]: HMSHLSException;\n [HMSHLSPlayerEvents.CURRENT_TIME]: number;\n [HMSHLSPlayerEvents.AUTOPLAY_BLOCKED]: HMSHLSException;\n\n [HMSHLSPlayerEvents.MANIFEST_LOADED]: HMSHLSManifestLoaded;\n [HMSHLSPlayerEvents.LAYER_UPDATED]: HMSHLSLayerUpdated;\n};\n\nexport type HMSHLSPlayerListeners<E extends HMSHLSPlayerEvents> = (data: HMSHLSListenerDataMapping[E], name: E) => void;\n\nexport interface HMSHLSStreamLive {\n isLive: boolean;\n}\nexport interface HMSHLSPlaybackState {\n state: HLSPlaybackState;\n}\nexport interface HMSHLSCue {\n id?: string;\n payload: string;\n duration: number;\n startDate: Date;\n endDate?: Date;\n}\n\nexport interface HMSHLSManifestLoaded {\n layers: HMSHLSLayer[];\n}\nexport interface HMSHLSLayerUpdated {\n layer: HMSHLSLayer;\n}\nexport interface IHMSHLSPlayerEventEmitter {\n on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void;\n\n off<E extends HMSHLSPlayerEvents>(eventName: E, listener?: HMSHLSPlayerListeners<E>): void;\n}\n\nexport class HMSHLSPlayerEventEmitter implements IHMSHLSPlayerEventEmitter {\n private eventEmitter: EventEmitter;\n constructor() {\n this.eventEmitter = new EventEmitter();\n }\n on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void {\n this.eventEmitter.on(eventName, listener);\n }\n\n off<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) {\n this.eventEmitter.off(eventName, listener);\n }\n\n emit<E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]): boolean {\n return this.eventEmitter.emit(eventName, eventObject, eventName);\n }\n\n removeAllListeners<E extends HMSHLSPlayerEvents>(eventName?: E): void {\n this.eventEmitter.removeAllListeners(eventName);\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { HlsPlayerStats } from '@100mslive/hls-stats';\nimport { HMSHLSPlayer } from './controllers/HMSHLSPlayer';\nimport { HMSHLSException } from './error/HMSHLSException';\nimport { HMSHLSLayer } from './interfaces/IHMSHLSLayer';\nimport { HLSPlaybackState, HMSHLSPlayerEvents } from './utilies/constants';\nexport type { HMSHLSLayer, HMSHLSException, HlsPlayerStats };\nexport { HMSHLSPlayer, HLSPlaybackState, HMSHLSPlayerEvents };\n", "import { HlsPlayerStats, HlsStats } from '@100mslive/hls-stats';\nimport Hls, { ErrorData, HlsConfig, Level, LevelParsed } from 'hls.js';\nimport { HMSHLSTimedMetadata } from './HMSHLSTimedMetadata';\nimport { HMSHLSErrorFactory } from '../error/HMSHLSErrorFactory';\nimport { HMSHLSPlayerEventEmitter, HMSHLSPlayerListeners, IHMSHLSPlayerEventEmitter } from '../interfaces/events';\nimport { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';\nimport IHMSHLSPlayer from '../interfaces/IHMSHLSPlayer';\nimport { HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY, HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';\nimport { mapLayer, mapLayers } from '../utilies/utils';\n\nexport class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {\n private _hls: Hls;\n private _hlsUrl: string;\n private _hlsStats: HlsStats;\n private _videoEl: HTMLVideoElement;\n private _emitter: HMSHLSPlayerEventEmitter;\n private _subscribeHlsStats?: (() => void) | null = null;\n private _isLive: boolean;\n private _volume: number;\n private _metaData: HMSHLSTimedMetadata;\n private readonly TAG = '[HMSHLSPlayer]';\n /**\n * Initiliaze the player with hlsUrl and video element\n * @remarks If video element is not passed, we will create one and call a method getVideoElement get element\n * @param hlsUrl required - Pass hls url to\n * @param videoEl optional field - HTML video element\n */\n constructor(hlsUrl: string, videoEl?: HTMLVideoElement) {\n this._hls = new Hls(this.getPlayerConfig());\n this._emitter = new HMSHLSPlayerEventEmitter();\n this._hlsUrl = hlsUrl;\n this._videoEl = videoEl || this.createVideoElement();\n if (!hlsUrl) {\n throw HMSHLSErrorFactory.HLSMediaError.hlsURLNotFound();\n } else if (!hlsUrl.endsWith('m3u8')) {\n throw HMSHLSErrorFactory.HLSMediaError.hlsURLNotFound('Invalid URL, pass m3u8 url');\n }\n this._hls.loadSource(hlsUrl);\n this._hls.attachMedia(this._videoEl);\n this._isLive = true;\n this._volume = this._videoEl.volume * 100;\n this._hlsStats = new HlsStats(this._hls, this._videoEl);\n this.listenHLSEvent();\n this._metaData = new HMSHLSTimedMetadata(this._hls, this._videoEl, this.emitEvent);\n this.seekToLivePosition();\n }\n\n /**\n * @remarks It will create a video element with playiniline true.\n * @returns HTML video element\n */\n private createVideoElement(): HTMLVideoElement {\n if (this._videoEl) {\n return this._videoEl;\n }\n const video: HTMLVideoElement = document.createElement('video');\n video.playsInline = true;\n video.controls = false;\n video.autoplay = true;\n return video;\n }\n /**\n * @returns get html video element\n */\n getVideoElement(): HTMLVideoElement {\n return this._videoEl;\n }\n /**\n * Subscribe to hls stats\n */\n private subscribeStats = (interval = 2000) => {\n this._subscribeHlsStats = this._hlsStats.subscribe((state: HlsPlayerStats) => {\n this.emitEvent(HMSHLSPlayerEvents.STATS, state);\n }, interval);\n };\n /**\n * Unsubscribe to hls stats\n */\n private unsubscribeStats = () => {\n if (this._subscribeHlsStats) {\n this._subscribeHlsStats();\n }\n };\n // reset the controller\n reset() {\n if (this._hls && this._hls.media) {\n this._hls.detachMedia();\n this.unsubscribeStats();\n }\n if (this._metaData) {\n this._metaData.unregisterListener();\n }\n if (Hls.isSupported()) {\n this._hls.off(Hls.Events.MANIFEST_LOADED, this.manifestLoadedHandler);\n this._hls.off(Hls.Events.LEVEL_UPDATED, this.levelUpdatedHandler);\n this._hls.off(Hls.Events.ERROR, this.handleHLSException);\n }\n if (this._videoEl) {\n this._videoEl.removeEventListener('play', this.playEventHandler);\n this._videoEl.removeEventListener('pause', this.pauseEventHandler);\n this._videoEl.removeEventListener('timeupdate', this.handleTimeUpdateListener);\n this._videoEl.removeEventListener('volumechange', this.volumeEventHandler);\n }\n this.removeAllListeners();\n }\n\n on = <E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) => {\n this._emitter.on(eventName, listener);\n };\n\n off = <E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) => {\n this._emitter.off(eventName, listener);\n };\n\n emitEvent = <E extends HMSHLSPlayerEvents>(\n eventName: E,\n eventObject: Parameters<HMSHLSPlayerListeners<E>>[0],\n ): boolean => {\n return this._emitter.emitEvent(eventName, eventObject);\n };\n\n private removeAllListeners = <E extends HMSHLSPlayerEvents>(eventName?: E): void => {\n this._emitter.removeAllListeners(eventName);\n };\n\n public get volume(): number {\n return this._volume;\n }\n\n setVolume(volume: number) {\n this._videoEl.volume = volume / 100;\n this._volume = volume;\n }\n\n getLayer(): HMSHLSLayer | null {\n if (this._hls && this._hls.currentLevel !== -1) {\n const currentLevel = this._hls?.levels.at(this._hls?.currentLevel);\n return currentLevel ? mapLayer(currentLevel) : null;\n }\n return null;\n }\n\n setLayer(layer: HMSHLSLayer): void {\n if (this._hls) {\n const current = this._hls.levels.findIndex((level: Level) => {\n return level?.attrs?.RESOLUTION === layer?.resolution;\n });\n this._hls.currentLevel = current;\n }\n return;\n }\n /**\n * set current stream to Live\n */\n async seekToLivePosition() {\n let end = 0;\n if (this._videoEl.buffered.length > 0) {\n end = this._videoEl.buffered.end(this._videoEl.buffered.length - 1);\n }\n this._videoEl.currentTime = this._hls.liveSyncPosition || end;\n if (this._videoEl.paused) {\n try {\n await this.playVideo();\n } catch (err) {\n console.error(this.TAG, 'Attempt to jump to live position Failed.', err);\n }\n }\n }\n /**\n * Play stream\n */\n play = async () => {\n await this.playVideo();\n };\n /**\n * Pause stream\n */\n pause = () => {\n this.pauseVideo();\n };\n /**\n * It will update the video element current time\n * @param seekValue Pass currentTime in second\n */\n seekTo = (seekValue: number) => {\n this._videoEl.currentTime = seekValue;\n };\n\n private playVideo = async () => {\n try {\n if (this._videoEl.paused) {\n await this._videoEl.play();\n }\n } catch (error) {\n console.debug(this.TAG, 'Play failed with error', (error as Error).message);\n if ((error as Error).name === 'NotAllowedError') {\n this.emitEvent(HMSHLSPlayerEvents.AUTOPLAY_BLOCKED, HMSHLSErrorFactory.HLSMediaError.autoplayFailed());\n }\n }\n };\n private pauseVideo = () => {\n if (!this._videoEl.paused) {\n this._videoEl.pause();\n }\n };\n private playEventHandler = () => {\n this.emitEvent(HMSHLSPlayerEvents.PLAYBACK_STATE, {\n state: HLSPlaybackState.playing,\n });\n };\n private pauseEventHandler = () => {\n this.emitEvent(HMSHLSPlayerEvents.PLAYBACK_STATE, {\n state: HLSPlaybackState.paused,\n });\n };\n private volumeEventHandler = () => {\n this._volume = this._videoEl.volume;\n };\n // eslint-disable-next-line complexity\n private handleHLSException = (_: any, data: ErrorData) => {\n console.error(this.TAG, `error type ${data.type} with details ${data.details} is fatal ${data.fatal}`);\n const details = data.error?.message || data.err?.message || '';\n const detail = {\n details: details,\n fatal: data.fatal,\n };\n switch (data.details) {\n case Hls.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.manifestIncompatibleCodecsError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.FRAG_DECRYPT_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.fragDecryptError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.bufferIncompatibleCodecsError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n // Below one are network related errors\n case Hls.ErrorDetails.MANIFEST_LOAD_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.manifestLoadError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.MANIFEST_PARSING_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.manifestParsingError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.LEVEL_LOAD_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.layerLoadError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n default: {\n const error = HMSHLSErrorFactory.UnknownError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n }\n };\n private manifestLoadedHandler = (_: any, { levels }: { levels: LevelParsed[] }) => {\n const layers: HMSHLSLayer[] = mapLayers(this.removeAudioLevels(levels));\n this.emitEvent(HMSHLSPlayerEvents.MANIFEST_LOADED, {\n layers,\n });\n };\n private levelUpdatedHandler = (_: any, { level }: { level: number }) => {\n const qualityLayer: HMSHLSLayer = mapLayer(this._hls.levels[level]);\n this.emitEvent(HMSHLSPlayerEvents.LAYER_UPDATED, {\n layer: qualityLayer,\n });\n };\n\n private handleTimeUpdateListener = (_: Event) => {\n this.emitEvent(HMSHLSPlayerEvents.CURRENT_TIME, this._videoEl.currentTime);\n const live = this._hls.liveSyncPosition\n ? this._hls.liveSyncPosition - this._videoEl.currentTime <= HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY\n : false;\n if (this._isLive !== live) {\n this._isLive = live;\n this.emitEvent(HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE, {\n isLive: this._isLive,\n });\n }\n };\n /**\n * Listen to hlsjs and video related events\n */\n private listenHLSEvent() {\n if (Hls.isSupported()) {\n this._hls.on(Hls.Events.MANIFEST_LOADED, this.manifestLoadedHandler);\n this._hls.on(Hls.Events.LEVEL_UPDATED, this.levelUpdatedHandler);\n this._hls.on(Hls.Events.ERROR, this.handleHLSException);\n this.subscribeStats();\n } else if (this._videoEl.canPlayType('application/vnd.apple.mpegurl')) {\n // code for ios safari, mseNot Supported.\n this._videoEl.src = this._hlsUrl;\n }\n this._videoEl.addEventListener('timeupdate', this.handleTimeUpdateListener);\n this._videoEl.addEventListener('play', this.playEventHandler);\n this._videoEl.addEventListener('pause', this.pauseEventHandler);\n this._videoEl.addEventListener('volumechange', this.volumeEventHandler);\n }\n\n private getPlayerConfig(): Partial<HlsConfig> {\n return {\n enableWorker: true,\n maxBufferLength: 20,\n backBufferLength: 10,\n };\n }\n\n /**\n * @param {Array} levels array from hlsJS\n * @returns a new array with only video levels.\n */\n private removeAudioLevels(levels: LevelParsed[]) {\n return levels.filter(({ videoCodec, width, height }) => !!videoCodec || !!(width && height));\n }\n}\n", "import Hls, { Fragment } from 'hls.js';\nimport { HMSHLSErrorFactory } from '../error/HMSHLSErrorFactory';\nimport { HMSHLSPlayerListeners } from '../interfaces/events';\nimport { HMSHLSPlayerEvents } from '../utilies/constants';\nimport { metadataPayloadParser } from '../utilies/utils';\n\nexport class HMSHLSTimedMetadata {\n private hls: Hls;\n constructor(\n hls: Hls,\n private videoEl: HTMLVideoElement,\n private emitEvent: <E extends HMSHLSPlayerEvents>(\n eventName: E,\n eventObject: Parameters<HMSHLSPlayerListeners<E>>[0],\n ) => boolean,\n ) {\n this.hls = hls;\n this.registerListner();\n }\n extractMetaTextTrack = (): TextTrack | null => {\n const textTrackListCount = this.videoEl.textTracks.length || 0;\n for (let trackIndex = 0; trackIndex < textTrackListCount; trackIndex++) {\n const textTrack = this.videoEl.textTracks[trackIndex];\n if (textTrack?.kind !== 'metadata') {\n continue;\n }\n textTrack.mode = 'showing';\n return textTrack;\n }\n return null;\n };\n\n // sync time with cue and trigger event\n fireCues = (currentAbsTime: number, tolerance: number) => {\n const cues = this.extractMetaTextTrack()?.cues;\n if (!cues) {\n return;\n }\n const cuesLength = cues.length;\n let cueIndex = 0;\n while (cueIndex < cuesLength) {\n const cue = cues[cueIndex] as TextTrackCue & {\n queued: boolean;\n value: { data: string };\n };\n if (cue.queued) {\n return;\n }\n // here we are converting base64 to actual data.\n const data: Record<string, any> = metadataPayloadParser(cue.value.data);\n const startDate = data.start_date;\n const endDate = data.end_date;\n const timeDiff = new Date(startDate).getTime() - currentAbsTime;\n const duration = new Date(endDate).getTime() - new Date(startDate).getTime();\n if (timeDiff <= tolerance) {\n setTimeout(() => {\n this.emitEvent(HMSHLSPlayerEvents.TIMED_METADATA_LOADED, {\n id: cue?.id,\n payload: data.payload,\n duration: duration,\n startDate: new Date(startDate),\n endDate: new Date(endDate),\n });\n }, timeDiff);\n cue.queued = true;\n }\n cueIndex++;\n }\n };\n\n // handle time update listener\n handleTimeUpdateListener = () => {\n // extract timed metadata text track\n const metaTextTrack: TextTrack | null = this.extractMetaTextTrack();\n if (!metaTextTrack || !metaTextTrack.cues) {\n return;\n }\n // @ts-ignore\n const firstFragProgramDateTime = this.videoEl?.getStartDate() || 0;\n const currentAbsTime = new Date(firstFragProgramDateTime).getTime() + (this.videoEl.currentTime || 0) * 1000;\n // fire cue for timed meta data extract\n this.fireCues(currentAbsTime, 0.25);\n };\n /**\n * Metadata are automatically parsed and added to the video element's\n * textTrack cue by hlsjs as they come through the stream.\n * in FRAG_CHANGED, we read the cues and emitEvent HLS_METADATA_LOADED\n * when the current fragment has a metadata to play.\n */\n fragChangeHandler = (_: any, { frag }: { frag: Fragment }) => {\n if (!this.videoEl) {\n const error = HMSHLSErrorFactory.HLSMediaError.videoElementNotFound();\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n }\n try {\n if (this.videoEl.textTracks.length === 0) {\n return;\n }\n const fragStartTime = frag.programDateTime || 0;\n const fragmentDuration = frag.end - frag.start;\n this.fireCues(fragStartTime, fragmentDuration);\n } catch (e) {\n console.error('FRAG_CHANGED event error', e);\n }\n };\n private registerListner = () => {\n if (Hls.isSupported()) {\n this.hls.on(Hls.Events.FRAG_CHANGED, this.fragChangeHandler);\n } else if (this.videoEl.canPlayType('application/vnd.apple.mpegurl')) {\n this.videoEl.addEventListener('timeupdate', this.handleTimeUpdateListener);\n }\n };\n\n unregisterListener = () => {\n this.hls.off(Hls.Events.FRAG_CHANGED, this.fragChangeHandler);\n this.videoEl.removeEventListener('timeupdate', this.handleTimeUpdateListener);\n };\n}\n", "export class HMSHLSException extends Error {\n nativeError?: Error;\n\n constructor(\n public name: string,\n public message: string,\n public description: string,\n public isTerminal: boolean = false,\n ) {\n super(message);\n\n // Ref: https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, HMSHLSException.prototype);\n }\n\n toAnalyticsProperties() {\n return {\n error_name: this.name,\n error_message: this.message,\n error_description: this.description,\n is_terminal: this.isTerminal,\n };\n }\n\n addNativeError(error: Error) {\n this.nativeError = error;\n }\n\n toString() {\n return `{\n name: ${this.name};\n message: ${this.message};\n description: ${this.description};\n isTerminal: ${this.isTerminal};\n nativeError: ${this.nativeError?.message};\n }`;\n }\n}\n", "export const HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY = 5;\n\nexport enum HMSHLSPlayerEvents {\n TIMED_METADATA_LOADED = 'timed-metadata',\n SEEK_POS_BEHIND_LIVE_EDGE = 'seek-pos-behind-live-edge',\n\n CURRENT_TIME = 'current-time',\n AUTOPLAY_BLOCKED = 'autoplay-blocked',\n\n MANIFEST_LOADED = 'manifest-loaded',\n LAYER_UPDATED = 'layer-updated',\n\n ERROR = 'error',\n PLAYBACK_STATE = 'playback-state',\n STATS = 'stats',\n}\n\nexport enum HMSHLSExceptionEvents {\n MANIFEST_LOAD_ERROR = 'manifest-load-error',\n MANIFEST_PARSING_ERROR = 'manifest-parsing-error',\n LAYER_LOAD_ERROR = 'layer-load-error',\n\n MANIFEST_INCOMPATIBLE_CODECS_ERROR = 'manifest-incompatible-codecs-error',\n FRAG_DECRYPT_ERROR = 'frag-decrypt-error',\n BUFFER_INCOMPATIBLE_CODECS_ERROR = 'buffer-incompatible-codecs-error',\n\n VIDEO_ELEMENT_NOT_FOUND = 'video-element-not-found',\n HLS_AUTOPLAY_FAILED = 'hls-autoplay-failed',\n HLS_URL_NOT_FOUND = 'hls-url-not-found',\n UNKNOWN_ERROR = 'unknown-error',\n}\n\nexport enum HLSPlaybackState {\n playing,\n paused,\n}\n", "import { HMSHLSException } from './HMSHLSException';\nimport { HMSHLSExceptionEvents } from '../utilies/constants';\n\nexport type HMSHLSErrorDetails = {\n details: string;\n fatal?: boolean;\n};\nexport const HMSHLSErrorFactory = {\n HLSNetworkError: {\n manifestLoadError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_LOAD_ERROR,\n data.details,\n 'Unable to load manifest file',\n data.fatal,\n );\n },\n manifestParsingError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_PARSING_ERROR,\n data.details,\n 'Unable to parse manifest file',\n data.fatal,\n );\n },\n layerLoadError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.LAYER_LOAD_ERROR,\n data.details,\n 'Unable to load quality layers',\n data.fatal,\n );\n },\n },\n HLSMediaError: {\n manifestIncompatibleCodecsError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_INCOMPATIBLE_CODECS_ERROR,\n data.details,\n 'Incompatible manifest codecs',\n data.fatal,\n );\n },\n fragDecryptError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.FRAG_DECRYPT_ERROR,\n data.details,\n 'Unable to decrypt fragment',\n data.fatal,\n );\n },\n bufferIncompatibleCodecsError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.BUFFER_INCOMPATIBLE_CODECS_ERROR,\n data.details,\n 'Incompatible buffer codecs',\n data.fatal,\n );\n },\n videoElementNotFound(): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.VIDEO_ELEMENT_NOT_FOUND,\n 'Video element not found',\n 'Video element not found',\n false,\n );\n },\n autoplayFailed(): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.HLS_AUTOPLAY_FAILED,\n 'Failed to autoplay',\n 'Failed to autoplay',\n false,\n );\n },\n hlsURLNotFound(msg?: string): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.HLS_URL_NOT_FOUND,\n msg || 'hls url not found',\n msg || 'hls url not found',\n true,\n );\n },\n },\n UnknownError: (data: HMSHLSErrorDetails): HMSHLSException => {\n return new HMSHLSException(HMSHLSExceptionEvents.UNKNOWN_ERROR, data.details, 'Unknown error', data.fatal);\n },\n};\n", "import { Level, LevelParsed } from 'hls.js';\nimport { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';\n\n/**\n *\n * @param payload a base64 string coming from backend\n * @returns a parsed data which contains payload, start_date, end_date, version\n */\nexport const metadataPayloadParser = (payload: string): Record<string, any> => {\n try {\n const data = window?.atob(payload);\n const parsedData = JSON.parse(data);\n return parsedData;\n } catch (e) {\n return { payload };\n }\n};\n\n/**\n * map Level[] to HMSHLSLayer[]\n */\nexport const mapLayers = (levels: Level[] | LevelParsed[]): HMSHLSLayer[] => {\n return levels.map((level: Level | LevelParsed) => mapLayer(level));\n};\n\n/**\n * map Level[] to HMSHLSLayer[]\n */\nexport const mapLayer = (quality: Level | LevelParsed): HMSHLSLayer => {\n return {\n resolution: quality.attrs?.RESOLUTION,\n bitrate: quality.bitrate,\n height: quality.height,\n id: quality.id,\n url: quality.url[0],\n width: quality.width,\n };\n};\n", "import { HlsPlayerStats } from '@100mslive/hls-stats';\nimport { EventEmitter2 as EventEmitter } from 'eventemitter2';\nimport { HMSHLSLayer } from './IHMSHLSLayer';\nimport { HMSHLSException } from '../error/HMSHLSException';\nimport { HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';\n\ntype HMSHLSListenerDataMapping = {\n [HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE]: HMSHLSStreamLive;\n [HMSHLSPlayerEvents.TIMED_METADATA_LOADED]: HMSHLSCue;\n [HMSHLSPlayerEvents.STATS]: HlsPlayerStats;\n [HMSHLSPlayerEvents.PLAYBACK_STATE]: HMSHLSPlaybackState;\n\n [HMSHLSPlayerEvents.ERROR]: HMSHLSException;\n [HMSHLSPlayerEvents.CURRENT_TIME]: number;\n [HMSHLSPlayerEvents.AUTOPLAY_BLOCKED]: HMSHLSException;\n\n [HMSHLSPlayerEvents.MANIFEST_LOADED]: HMSHLSManifestLoaded;\n [HMSHLSPlayerEvents.LAYER_UPDATED]: HMSHLSLayerUpdated;\n};\n\nexport type HMSHLSPlayerListeners<E extends HMSHLSPlayerEvents> = (data: HMSHLSListenerDataMapping[E], name: E) => void;\n\nexport interface HMSHLSStreamLive {\n isLive: boolean;\n}\nexport interface HMSHLSPlaybackState {\n state: HLSPlaybackState;\n}\nexport interface HMSHLSCue {\n id?: string;\n payload: string;\n duration: number;\n startDate: Date;\n endDate?: Date;\n}\n\nexport interface HMSHLSManifestLoaded {\n layers: HMSHLSLayer[];\n}\nexport interface HMSHLSLayerUpdated {\n layer: HMSHLSLayer;\n}\nexport interface IHMSHLSPlayerEventEmitter {\n on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void;\n\n off<E extends HMSHLSPlayerEvents>(eventName: E, listener?: HMSHLSPlayerListeners<E>): void;\n}\n\nexport class HMSHLSPlayerEventEmitter implements IHMSHLSPlayerEventEmitter {\n private eventEmitter: EventEmitter;\n constructor() {\n this.eventEmitter = new EventEmitter();\n }\n on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void {\n this.eventEmitter.on(eventName, listener);\n }\n\n off<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) {\n this.eventEmitter.off(eventName, listener);\n }\n\n emitEvent<E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]): boolean {\n return this.eventEmitter.emit(eventName, eventObject, eventName);\n }\n\n removeAllListeners<E extends HMSHLSPlayerEvents>(eventName?: E): void {\n this.eventEmitter.removeAllListeners(eventName);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- var u=(r,e,t)=>new Promise((i,o)=>{var S=h=>{try{a(t.next(h))}catch(s){o(s)}},H=h=>{try{a(t.throw(h))}catch(s){o(s)}},a=h=>h.done?i(h.value):Promise.resolve(h.value).then(S,H);a((t=t.apply(r,e)).next())});import{HlsStats as O}from"@100mslive/hls-stats";import E from"hls.js";import v from"hls.js";var d=class extends Error{constructor(e,t,i,o=!1){super(t);this.name=e;this.message=t;this.description=i;this.isTerminal=o;Object.setPrototypeOf(this,d.prototype)}toAnalyticsProperties(){return{error_name:this.name,error_message:this.message,error_description:this.description,is_terminal:this.isTerminal}}addNativeError(e){this.nativeError=e}toString(){var e;return`{
1
+ var _=(r,e,t)=>new Promise((i,o)=>{var S=h=>{try{a(t.next(h))}catch(s){o(s)}},v=h=>{try{a(t.throw(h))}catch(s){o(s)}},a=h=>h.done?i(h.value):Promise.resolve(h.value).then(S,v);a((t=t.apply(r,e)).next())});import{HlsStats as O}from"@100mslive/hls-stats";import E from"hls.js";import p from"hls.js";var d=class extends Error{constructor(e,t,i,o=!1){super(t);this.name=e;this.message=t;this.description=i;this.isTerminal=o;Object.setPrototypeOf(this,d.prototype)}toAnalyticsProperties(){return{error_name:this.name,error_message:this.message,error_description:this.description,is_terminal:this.isTerminal}}addNativeError(e){this.nativeError=e}toString(){var e;return`{
2
2
  name: ${this.name};
3
3
  message: ${this.message};
4
4
  description: ${this.description};
5
5
  isTerminal: ${this.isTerminal};
6
6
  nativeError: ${(e=this.nativeError)==null?void 0:e.message};
7
- }`}};var M=5,l;(function(s){s.TIMED_METADATA_LOADED="timed-metadata",s.SEEK_POS_BEHIND_LIVE_EDGE="seek-pos-behind-live-edge",s.CURRENT_TIME="current-time",s.AUTOPLAY_BLOCKED="autoplay-blocked",s.MANIFEST_LOADED="manifest-loaded",s.LAYER_UPDATED="layer-updated",s.ERROR="error",s.PLAYBACK_STATE="playback-state",s.STATS="stats"})(l||(l={}));var L;(function(n){n.MANIFEST_LOAD_ERROR="manifest-load-error",n.MANIFEST_PARSING_ERROR="manifest-parsing-error",n.LAYER_LOAD_ERROR="layer-load-error",n.MANIFEST_INCOMPATIBLE_CODECS_ERROR="manifest-incompatible-codecs-error",n.FRAG_DECRYPT_ERROR="frag-decrypt-error",n.BUFFER_INCOMPATIBLE_CODECS_ERROR="buffer-incompatible-codecs-error",n.VIDEO_ELEMENT_NOT_FOUND="video-element-not-found",n.HLS_AUTOPLAY_FAILED="hls-autoplay-failed",n.HLS_URL_NOT_FOUND="hls-url-not-found",n.UNKNOWN_ERROR="unknown-error"})(L||(L={}));var _;(function(t){t[t.playing=0]="playing",t[t.paused=1]="paused"})(_||(_={}));var m={HLSNetworkError:{manifestLoadError(r){return new d(L.MANIFEST_LOAD_ERROR,r.details,"Unable to load manifest file",r.fatal)},manifestParsingError(r){return new d(L.MANIFEST_PARSING_ERROR,r.details,"Unable to parse manifest file",r.fatal)},layerLoadError(r){return new d(L.LAYER_LOAD_ERROR,r.details,"Unable to load quality layers",r.fatal)}},HLSMediaError:{manifestIncompatibleCodecsError(r){return new d(L.MANIFEST_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible manifest codecs",r.fatal)},fragDecryptError(r){return new d(L.FRAG_DECRYPT_ERROR,r.details,"Unable to decrypt fragment",r.fatal)},bufferIncompatibleCodecsError(r){return new d(L.BUFFER_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible buffer codecs",r.fatal)},videoElementNotFound(){return new d(L.VIDEO_ELEMENT_NOT_FOUND,"Video element not found","Video element not found",!1)},autoplayFailed(){return new d(L.HLS_AUTOPLAY_FAILED,"Failed to autoplay","Failed to autoplay",!1)},hlsURLNotFound(r){return new d(L.HLS_URL_NOT_FOUND,r||"hls url not found",r||"hls url not found",!0)}},UnknownError:r=>new d(L.UNKNOWN_ERROR,r.details,"Unknown error",r.fatal)};var R=r=>{try{let e=window==null?void 0:window.atob(r);return JSON.parse(e)}catch(e){return{payload:r}}},y=r=>r.map(e=>p(e)),p=r=>{var e;return{resolution:(e=r.attrs)==null?void 0:e.RESOLUTION,bitrate:r.bitrate,height:r.height,id:r.id,url:r.url[0],width:r.width}};var c=class{constructor(e,t,i){this.videoEl=t;this.emit=i;this.extractMetaTextTrack=()=>{let e=this.videoEl.textTracks.length||0;for(let t=0;t<e;t++){let i=this.videoEl.textTracks[t];if((i==null?void 0:i.kind)==="metadata")return i.mode="showing",i}return null};this.fireCues=(e,t)=>{var H;let i=(H=this.extractMetaTextTrack())==null?void 0:H.cues;if(!i)return;let o=i.length,S=0;for(;S<o;){let a=i[S];if(a.queued)return;let h=R(a.value.data),s=h.start_date,n=h.end_date,T=new Date(s).getTime()-e,A=new Date(n).getTime()-new Date(s).getTime();T<=t&&(setTimeout(()=>{this.emit(l.TIMED_METADATA_LOADED,{id:a==null?void 0:a.id,payload:h.payload,duration:A,startDate:new Date(s),endDate:new Date(n)})},T),a.queued=!0),S++}};this.handleTimeUpdateListener=()=>{var o;let e=this.extractMetaTextTrack();if(!e||!e.cues)return;let t=((o=this.videoEl)==null?void 0:o.getStartDate())||0,i=new Date(t).getTime()+(this.videoEl.currentTime||0)*1e3;this.fireCues(i,.25)};this.fragChangeHandler=(e,{frag:t})=>{if(!this.videoEl){let i=m.HLSMediaError.videoElementNotFound();this.emit(l.ERROR,i)}try{if(this.videoEl.textTracks.length===0)return;let i=t.programDateTime||0,o=t.end-t.start;this.fireCues(i,o)}catch(i){console.error("FRAG_CHANGED event error",i)}};this.registerListner=()=>{v.isSupported()?this.hls.on(v.Events.FRAG_CHANGED,this.fragChangeHandler):this.videoEl.canPlayType("application/vnd.apple.mpegurl")&&this.videoEl.addEventListener("timeupdate",this.handleTimeUpdateListener)};this.unregisterListener=()=>{this.hls.off(v.Events.FRAG_CHANGED,this.fragChangeHandler),this.videoEl.removeEventListener("timeupdate",this.handleTimeUpdateListener)};this.hls=e,this.registerListner()}};import{EventEmitter2 as P}from"eventemitter2";var f=class{constructor(){this.eventEmitter=new P}on(e,t){this.eventEmitter.on(e,t)}off(e,t){this.eventEmitter.off(e,t)}emit(e,t){return this.eventEmitter.emit(e,t,e)}removeAllListeners(e){this.eventEmitter.removeAllListeners(e)}};var D=class{constructor(e,t){this._subscribeHlsStats=null;this.TAG="[HMSHLSPlayer]";this.subscribeStats=(e=2e3)=>{this._subscribeHlsStats=this._hlsStats.subscribe(t=>{this.emit(l.STATS,t)},e)};this.unsubscribeStats=()=>{this._subscribeHlsStats&&this._subscribeHlsStats()};this.on=(e,t)=>{this._emitter.on(e,t)};this.off=(e,t)=>{this._emitter.off(e,t)};this.emit=(e,t)=>this._emitter.emit(e,t);this.removeAllListeners=e=>{this._emitter.removeAllListeners(e)};this.play=()=>u(this,null,function*(){yield this.playVideo()});this.pause=()=>{this.pauseVideo()};this.seekTo=e=>{this._videoEl.currentTime=e};this.playVideo=()=>u(this,null,function*(){try{this._videoEl.paused&&(yield this._videoEl.play())}catch(e){console.debug(this.TAG,"Play failed with error",e.message),e.name==="NotAllowedError"&&this.emit(l.AUTOPLAY_BLOCKED,m.HLSMediaError.autoplayFailed())}});this.pauseVideo=()=>{this._videoEl.paused||this._videoEl.pause()};this.playEventHandler=()=>{this.emit(l.PLAYBACK_STATE,{state:_.playing})};this.pauseEventHandler=()=>{this.emit(l.PLAYBACK_STATE,{state:_.paused})};this.volumeEventHandler=()=>{this._volume=this._videoEl.volume};this.handleHLSException=(e,t)=>{var S,H;console.error(this.TAG,t);let o={details:((S=t.error)==null?void 0:S.message)||((H=t.err)==null?void 0:H.message)||"",fatal:t.fatal};switch(t.details){case E.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR:{let a=m.HLSMediaError.manifestIncompatibleCodecsError(o);this.emit(l.ERROR,a);break}case E.ErrorDetails.FRAG_DECRYPT_ERROR:{let a=m.HLSMediaError.fragDecryptError(o);this.emit(l.ERROR,a);break}case E.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR:{let a=m.HLSMediaError.bufferIncompatibleCodecsError(o);this.emit(l.ERROR,a);break}case E.ErrorDetails.MANIFEST_LOAD_ERROR:{let a=m.HLSNetworkError.manifestLoadError(o);this.emit(l.ERROR,a);break}case E.ErrorDetails.MANIFEST_PARSING_ERROR:{let a=m.HLSNetworkError.manifestParsingError(o);this.emit(l.ERROR,a);break}case E.ErrorDetails.LEVEL_LOAD_ERROR:{let a=m.HLSNetworkError.layerLoadError(o);this.emit(l.ERROR,a);break}default:{let a=m.UnknownError(o);this.emit(l.ERROR,a);break}}};this.manifestLoadedHandler=(e,{levels:t})=>{let i=y(this.removeAudioLevels(t));this.emit(l.MANIFEST_LOADED,{layers:i})};this.levelUpdatedHandler=(e,{level:t})=>{let i=p(this._hls.levels[t]);this.emit(l.LAYER_UPDATED,{layer:i})};this.handleTimeUpdateListener=e=>{this.emit(l.CURRENT_TIME,this._videoEl.currentTime);let t=this._hls.liveSyncPosition?this._hls.liveSyncPosition-this._videoEl.currentTime<=M:!1;this._isLive!==t&&(this._isLive=t,this.emit(l.SEEK_POS_BEHIND_LIVE_EDGE,{isLive:this._isLive}))};if(this._hls=new E(this.getPlayerConfig()),this._emitter=new f,this._hlsUrl=e,this._videoEl=t||this.createVideoElement(),e){if(!e.endsWith("m3u8"))throw m.HLSMediaError.hlsURLNotFound("Invalid URL, pass m3u8 url")}else throw m.HLSMediaError.hlsURLNotFound();this._hls.loadSource(e),this._hls.attachMedia(this._videoEl),this._isLive=!0,this._volume=this._videoEl.volume*100,this._hlsStats=new O(this._hls,this._videoEl),this.listenHLSEvent(),this._metaData=new c(this._hls,this._videoEl,this.emit),this.seekToLivePosition()}createVideoElement(){if(this._videoEl)return this._videoEl;let e=document.createElement("video");return e.playsInline=!0,e.controls=!1,e.autoplay=!0,e}getVideoElement(){return this._videoEl}reset(){this._hls&&this._hls.media&&(this._hls.detachMedia(),this.unsubscribeStats()),this._metaData&&this._metaData.unregisterListener(),E.isSupported()&&(this._hls.off(E.Events.MANIFEST_LOADED,this.manifestLoadedHandler),this._hls.off(E.Events.LEVEL_UPDATED,this.levelUpdatedHandler),this._hls.off(E.Events.ERROR,this.handleHLSException)),this._videoEl&&(this._videoEl.removeEventListener("play",this.playEventHandler),this._videoEl.removeEventListener("pause",this.pauseEventHandler),this._videoEl.removeEventListener("timeupdate",this.handleTimeUpdateListener),this._videoEl.removeEventListener("volumechange",this.volumeEventHandler)),this.removeAllListeners()}get volume(){return this._volume}setVolume(e){this._videoEl.volume=e/100,this._volume=e}getLayer(){var e,t;if(this._hls&&this._hls.currentLevel!==-1){let i=(t=this._hls)==null?void 0:t.levels.at((e=this._hls)==null?void 0:e.currentLevel);return i?p(i):null}return null}setLayer(e){if(this._hls){let t=this._hls.levels.findIndex(i=>{var o;return((o=i==null?void 0:i.attrs)==null?void 0:o.RESOLUTION)===(e==null?void 0:e.resolution)});this._hls.currentLevel=t}}seekToLivePosition(){return u(this,null,function*(){let e=0;if(this._videoEl.buffered.length>0&&(e=this._videoEl.buffered.end(this._videoEl.buffered.length-1)),this._videoEl.currentTime=this._hls.liveSyncPosition||e,this._videoEl.paused)try{yield this.playVideo()}catch(t){console.error(this.TAG,"Attempt to jump to live position Failed.",t)}})}listenHLSEvent(){E.isSupported()?(this._hls.on(E.Events.MANIFEST_LOADED,this.manifestLoadedHandler),this._hls.on(E.Events.LEVEL_UPDATED,this.levelUpdatedHandler),this._hls.on(E.Events.ERROR,this.handleHLSException),this.subscribeStats()):this._videoEl.canPlayType("application/vnd.apple.mpegurl")&&(this._videoEl.src=this._hlsUrl),this._videoEl.addEventListener("timeupdate",this.handleTimeUpdateListener),this._videoEl.addEventListener("play",this.playEventHandler),this._videoEl.addEventListener("pause",this.pauseEventHandler),this._videoEl.addEventListener("volumechange",this.volumeEventHandler)}getPlayerConfig(){return{enableWorker:!0,maxBufferLength:20,backBufferLength:10}}removeAudioLevels(e){return e.filter(({videoCodec:t,width:i,height:o})=>!!t||!!(i&&o))}};export{_ as HLSPlaybackState,D as HMSHLSPlayer,l as HMSHLSPlayerEvents};
7
+ }`}};var y=5,l;(function(s){s.TIMED_METADATA_LOADED="timed-metadata",s.SEEK_POS_BEHIND_LIVE_EDGE="seek-pos-behind-live-edge",s.CURRENT_TIME="current-time",s.AUTOPLAY_BLOCKED="autoplay-blocked",s.MANIFEST_LOADED="manifest-loaded",s.LAYER_UPDATED="layer-updated",s.ERROR="error",s.PLAYBACK_STATE="playback-state",s.STATS="stats"})(l||(l={}));var L;(function(n){n.MANIFEST_LOAD_ERROR="manifest-load-error",n.MANIFEST_PARSING_ERROR="manifest-parsing-error",n.LAYER_LOAD_ERROR="layer-load-error",n.MANIFEST_INCOMPATIBLE_CODECS_ERROR="manifest-incompatible-codecs-error",n.FRAG_DECRYPT_ERROR="frag-decrypt-error",n.BUFFER_INCOMPATIBLE_CODECS_ERROR="buffer-incompatible-codecs-error",n.VIDEO_ELEMENT_NOT_FOUND="video-element-not-found",n.HLS_AUTOPLAY_FAILED="hls-autoplay-failed",n.HLS_URL_NOT_FOUND="hls-url-not-found",n.UNKNOWN_ERROR="unknown-error"})(L||(L={}));var H;(function(t){t[t.playing=0]="playing",t[t.paused=1]="paused"})(H||(H={}));var m={HLSNetworkError:{manifestLoadError(r){return new d(L.MANIFEST_LOAD_ERROR,r.details,"Unable to load manifest file",r.fatal)},manifestParsingError(r){return new d(L.MANIFEST_PARSING_ERROR,r.details,"Unable to parse manifest file",r.fatal)},layerLoadError(r){return new d(L.LAYER_LOAD_ERROR,r.details,"Unable to load quality layers",r.fatal)}},HLSMediaError:{manifestIncompatibleCodecsError(r){return new d(L.MANIFEST_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible manifest codecs",r.fatal)},fragDecryptError(r){return new d(L.FRAG_DECRYPT_ERROR,r.details,"Unable to decrypt fragment",r.fatal)},bufferIncompatibleCodecsError(r){return new d(L.BUFFER_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible buffer codecs",r.fatal)},videoElementNotFound(){return new d(L.VIDEO_ELEMENT_NOT_FOUND,"Video element not found","Video element not found",!1)},autoplayFailed(){return new d(L.HLS_AUTOPLAY_FAILED,"Failed to autoplay","Failed to autoplay",!1)},hlsURLNotFound(r){return new d(L.HLS_URL_NOT_FOUND,r||"hls url not found",r||"hls url not found",!0)}},UnknownError:r=>new d(L.UNKNOWN_ERROR,r.details,"Unknown error",r.fatal)};var M=r=>{try{let e=window==null?void 0:window.atob(r);return JSON.parse(e)}catch(e){return{payload:r}}},R=r=>r.map(e=>u(e)),u=r=>{var e;return{resolution:(e=r.attrs)==null?void 0:e.RESOLUTION,bitrate:r.bitrate,height:r.height,id:r.id,url:r.url[0],width:r.width}};var c=class{constructor(e,t,i){this.videoEl=t;this.emitEvent=i;this.extractMetaTextTrack=()=>{let e=this.videoEl.textTracks.length||0;for(let t=0;t<e;t++){let i=this.videoEl.textTracks[t];if((i==null?void 0:i.kind)==="metadata")return i.mode="showing",i}return null};this.fireCues=(e,t)=>{var v;let i=(v=this.extractMetaTextTrack())==null?void 0:v.cues;if(!i)return;let o=i.length,S=0;for(;S<o;){let a=i[S];if(a.queued)return;let h=M(a.value.data),s=h.start_date,n=h.end_date,T=new Date(s).getTime()-e,A=new Date(n).getTime()-new Date(s).getTime();T<=t&&(setTimeout(()=>{this.emitEvent(l.TIMED_METADATA_LOADED,{id:a==null?void 0:a.id,payload:h.payload,duration:A,startDate:new Date(s),endDate:new Date(n)})},T),a.queued=!0),S++}};this.handleTimeUpdateListener=()=>{var o;let e=this.extractMetaTextTrack();if(!e||!e.cues)return;let t=((o=this.videoEl)==null?void 0:o.getStartDate())||0,i=new Date(t).getTime()+(this.videoEl.currentTime||0)*1e3;this.fireCues(i,.25)};this.fragChangeHandler=(e,{frag:t})=>{if(!this.videoEl){let i=m.HLSMediaError.videoElementNotFound();this.emitEvent(l.ERROR,i)}try{if(this.videoEl.textTracks.length===0)return;let i=t.programDateTime||0,o=t.end-t.start;this.fireCues(i,o)}catch(i){console.error("FRAG_CHANGED event error",i)}};this.registerListner=()=>{p.isSupported()?this.hls.on(p.Events.FRAG_CHANGED,this.fragChangeHandler):this.videoEl.canPlayType("application/vnd.apple.mpegurl")&&this.videoEl.addEventListener("timeupdate",this.handleTimeUpdateListener)};this.unregisterListener=()=>{this.hls.off(p.Events.FRAG_CHANGED,this.fragChangeHandler),this.videoEl.removeEventListener("timeupdate",this.handleTimeUpdateListener)};this.hls=e,this.registerListner()}};import{EventEmitter2 as P}from"eventemitter2";var f=class{constructor(){this.eventEmitter=new P}on(e,t){this.eventEmitter.on(e,t)}off(e,t){this.eventEmitter.off(e,t)}emitEvent(e,t){return this.eventEmitter.emit(e,t,e)}removeAllListeners(e){this.eventEmitter.removeAllListeners(e)}};var D=class{constructor(e,t){this._subscribeHlsStats=null;this.TAG="[HMSHLSPlayer]";this.subscribeStats=(e=2e3)=>{this._subscribeHlsStats=this._hlsStats.subscribe(t=>{this.emitEvent(l.STATS,t)},e)};this.unsubscribeStats=()=>{this._subscribeHlsStats&&this._subscribeHlsStats()};this.on=(e,t)=>{this._emitter.on(e,t)};this.off=(e,t)=>{this._emitter.off(e,t)};this.emitEvent=(e,t)=>this._emitter.emitEvent(e,t);this.removeAllListeners=e=>{this._emitter.removeAllListeners(e)};this.play=()=>_(this,null,function*(){yield this.playVideo()});this.pause=()=>{this.pauseVideo()};this.seekTo=e=>{this._videoEl.currentTime=e};this.playVideo=()=>_(this,null,function*(){try{this._videoEl.paused&&(yield this._videoEl.play())}catch(e){console.debug(this.TAG,"Play failed with error",e.message),e.name==="NotAllowedError"&&this.emitEvent(l.AUTOPLAY_BLOCKED,m.HLSMediaError.autoplayFailed())}});this.pauseVideo=()=>{this._videoEl.paused||this._videoEl.pause()};this.playEventHandler=()=>{this.emitEvent(l.PLAYBACK_STATE,{state:H.playing})};this.pauseEventHandler=()=>{this.emitEvent(l.PLAYBACK_STATE,{state:H.paused})};this.volumeEventHandler=()=>{this._volume=this._videoEl.volume};this.handleHLSException=(e,t)=>{var S,v;console.error(this.TAG,`error type ${t.type} with details ${t.details} is fatal ${t.fatal}`);let o={details:((S=t.error)==null?void 0:S.message)||((v=t.err)==null?void 0:v.message)||"",fatal:t.fatal};switch(t.details){case E.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR:{let a=m.HLSMediaError.manifestIncompatibleCodecsError(o);this.emitEvent(l.ERROR,a);break}case E.ErrorDetails.FRAG_DECRYPT_ERROR:{let a=m.HLSMediaError.fragDecryptError(o);this.emitEvent(l.ERROR,a);break}case E.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR:{let a=m.HLSMediaError.bufferIncompatibleCodecsError(o);this.emitEvent(l.ERROR,a);break}case E.ErrorDetails.MANIFEST_LOAD_ERROR:{let a=m.HLSNetworkError.manifestLoadError(o);this.emitEvent(l.ERROR,a);break}case E.ErrorDetails.MANIFEST_PARSING_ERROR:{let a=m.HLSNetworkError.manifestParsingError(o);this.emitEvent(l.ERROR,a);break}case E.ErrorDetails.LEVEL_LOAD_ERROR:{let a=m.HLSNetworkError.layerLoadError(o);this.emitEvent(l.ERROR,a);break}default:{let a=m.UnknownError(o);this.emitEvent(l.ERROR,a);break}}};this.manifestLoadedHandler=(e,{levels:t})=>{let i=R(this.removeAudioLevels(t));this.emitEvent(l.MANIFEST_LOADED,{layers:i})};this.levelUpdatedHandler=(e,{level:t})=>{let i=u(this._hls.levels[t]);this.emitEvent(l.LAYER_UPDATED,{layer:i})};this.handleTimeUpdateListener=e=>{this.emitEvent(l.CURRENT_TIME,this._videoEl.currentTime);let t=this._hls.liveSyncPosition?this._hls.liveSyncPosition-this._videoEl.currentTime<=y:!1;this._isLive!==t&&(this._isLive=t,this.emitEvent(l.SEEK_POS_BEHIND_LIVE_EDGE,{isLive:this._isLive}))};if(this._hls=new E(this.getPlayerConfig()),this._emitter=new f,this._hlsUrl=e,this._videoEl=t||this.createVideoElement(),e){if(!e.endsWith("m3u8"))throw m.HLSMediaError.hlsURLNotFound("Invalid URL, pass m3u8 url")}else throw m.HLSMediaError.hlsURLNotFound();this._hls.loadSource(e),this._hls.attachMedia(this._videoEl),this._isLive=!0,this._volume=this._videoEl.volume*100,this._hlsStats=new O(this._hls,this._videoEl),this.listenHLSEvent(),this._metaData=new c(this._hls,this._videoEl,this.emitEvent),this.seekToLivePosition()}createVideoElement(){if(this._videoEl)return this._videoEl;let e=document.createElement("video");return e.playsInline=!0,e.controls=!1,e.autoplay=!0,e}getVideoElement(){return this._videoEl}reset(){this._hls&&this._hls.media&&(this._hls.detachMedia(),this.unsubscribeStats()),this._metaData&&this._metaData.unregisterListener(),E.isSupported()&&(this._hls.off(E.Events.MANIFEST_LOADED,this.manifestLoadedHandler),this._hls.off(E.Events.LEVEL_UPDATED,this.levelUpdatedHandler),this._hls.off(E.Events.ERROR,this.handleHLSException)),this._videoEl&&(this._videoEl.removeEventListener("play",this.playEventHandler),this._videoEl.removeEventListener("pause",this.pauseEventHandler),this._videoEl.removeEventListener("timeupdate",this.handleTimeUpdateListener),this._videoEl.removeEventListener("volumechange",this.volumeEventHandler)),this.removeAllListeners()}get volume(){return this._volume}setVolume(e){this._videoEl.volume=e/100,this._volume=e}getLayer(){var e,t;if(this._hls&&this._hls.currentLevel!==-1){let i=(t=this._hls)==null?void 0:t.levels.at((e=this._hls)==null?void 0:e.currentLevel);return i?u(i):null}return null}setLayer(e){if(this._hls){let t=this._hls.levels.findIndex(i=>{var o;return((o=i==null?void 0:i.attrs)==null?void 0:o.RESOLUTION)===(e==null?void 0:e.resolution)});this._hls.currentLevel=t}}seekToLivePosition(){return _(this,null,function*(){let e=0;if(this._videoEl.buffered.length>0&&(e=this._videoEl.buffered.end(this._videoEl.buffered.length-1)),this._videoEl.currentTime=this._hls.liveSyncPosition||e,this._videoEl.paused)try{yield this.playVideo()}catch(t){console.error(this.TAG,"Attempt to jump to live position Failed.",t)}})}listenHLSEvent(){E.isSupported()?(this._hls.on(E.Events.MANIFEST_LOADED,this.manifestLoadedHandler),this._hls.on(E.Events.LEVEL_UPDATED,this.levelUpdatedHandler),this._hls.on(E.Events.ERROR,this.handleHLSException),this.subscribeStats()):this._videoEl.canPlayType("application/vnd.apple.mpegurl")&&(this._videoEl.src=this._hlsUrl),this._videoEl.addEventListener("timeupdate",this.handleTimeUpdateListener),this._videoEl.addEventListener("play",this.playEventHandler),this._videoEl.addEventListener("pause",this.pauseEventHandler),this._videoEl.addEventListener("volumechange",this.volumeEventHandler)}getPlayerConfig(){return{enableWorker:!0,maxBufferLength:20,backBufferLength:10}}removeAudioLevels(e){return e.filter(({videoCodec:t,width:i,height:o})=>!!t||!!(i&&o))}};export{H as HLSPlaybackState,D as HMSHLSPlayer,l as HMSHLSPlayerEvents};
8
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/controllers/HMSHLSPlayer.ts", "../src/controllers/HMSHLSTimedMetadata.ts", "../src/error/HMSHLSException.ts", "../src/utilies/constants.ts", "../src/error/HMSHLSErrorFactory.ts", "../src/utilies/utils.ts", "../src/interfaces/events.ts"],
4
- "sourcesContent": ["import { HlsPlayerStats, HlsStats } from '@100mslive/hls-stats';\nimport Hls, { ErrorData, HlsConfig, Level, LevelParsed } from 'hls.js';\nimport { HMSHLSTimedMetadata } from './HMSHLSTimedMetadata';\nimport { HMSHLSErrorFactory } from '../error/HMSHLSErrorFactory';\nimport { HMSHLSPlayerEventEmitter, HMSHLSPlayerListeners, IHMSHLSPlayerEventEmitter } from '../interfaces/events';\nimport { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';\nimport IHMSHLSPlayer from '../interfaces/IHMSHLSPlayer';\nimport { HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY, HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';\nimport { mapLayer, mapLayers } from '../utilies/utils';\n\nexport class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {\n private _hls: Hls;\n private _hlsUrl: string;\n private _hlsStats: HlsStats;\n private _videoEl: HTMLVideoElement;\n private _emitter: HMSHLSPlayerEventEmitter;\n private _subscribeHlsStats?: (() => void) | null = null;\n private _isLive: boolean;\n private _volume: number;\n private _metaData: HMSHLSTimedMetadata;\n private readonly TAG = '[HMSHLSPlayer]';\n /**\n * Initiliaze the player with hlsUrl and video element\n * @remarks If video element is not passed, we will create one and call a method getVideoElement get element\n * @param hlsUrl required - Pass hls url to\n * @param videoEl optional field - HTML video element\n */\n constructor(hlsUrl: string, videoEl?: HTMLVideoElement) {\n this._hls = new Hls(this.getPlayerConfig());\n this._emitter = new HMSHLSPlayerEventEmitter();\n this._hlsUrl = hlsUrl;\n this._videoEl = videoEl || this.createVideoElement();\n if (!hlsUrl) {\n throw HMSHLSErrorFactory.HLSMediaError.hlsURLNotFound();\n } else if (!hlsUrl.endsWith('m3u8')) {\n throw HMSHLSErrorFactory.HLSMediaError.hlsURLNotFound('Invalid URL, pass m3u8 url');\n }\n this._hls.loadSource(hlsUrl);\n this._hls.attachMedia(this._videoEl);\n this._isLive = true;\n this._volume = this._videoEl.volume * 100;\n this._hlsStats = new HlsStats(this._hls, this._videoEl);\n this.listenHLSEvent();\n this._metaData = new HMSHLSTimedMetadata(this._hls, this._videoEl, this.emit);\n this.seekToLivePosition();\n }\n\n /**\n * @remarks It will create a video element with playiniline true.\n * @returns HTML video element\n */\n private createVideoElement(): HTMLVideoElement {\n if (this._videoEl) {\n return this._videoEl;\n }\n const video: HTMLVideoElement = document.createElement('video');\n video.playsInline = true;\n video.controls = false;\n video.autoplay = true;\n return video;\n }\n /**\n * @returns get html video element\n */\n getVideoElement(): HTMLVideoElement {\n return this._videoEl;\n }\n /**\n * Subscribe to hls stats\n */\n private subscribeStats = (interval = 2000) => {\n this._subscribeHlsStats = this._hlsStats.subscribe((state: HlsPlayerStats) => {\n this.emit(HMSHLSPlayerEvents.STATS, state);\n }, interval);\n };\n /**\n * Unsubscribe to hls stats\n */\n private unsubscribeStats = () => {\n if (this._subscribeHlsStats) {\n this._subscribeHlsStats();\n }\n };\n // reset the controller\n reset() {\n if (this._hls && this._hls.media) {\n this._hls.detachMedia();\n this.unsubscribeStats();\n }\n if (this._metaData) {\n this._metaData.unregisterListener();\n }\n if (Hls.isSupported()) {\n this._hls.off(Hls.Events.MANIFEST_LOADED, this.manifestLoadedHandler);\n this._hls.off(Hls.Events.LEVEL_UPDATED, this.levelUpdatedHandler);\n this._hls.off(Hls.Events.ERROR, this.handleHLSException);\n }\n if (this._videoEl) {\n this._videoEl.removeEventListener('play', this.playEventHandler);\n this._videoEl.removeEventListener('pause', this.pauseEventHandler);\n this._videoEl.removeEventListener('timeupdate', this.handleTimeUpdateListener);\n this._videoEl.removeEventListener('volumechange', this.volumeEventHandler);\n }\n this.removeAllListeners();\n }\n\n on = <E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) => {\n this._emitter.on(eventName, listener);\n };\n\n off = <E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) => {\n this._emitter.off(eventName, listener);\n };\n\n emit = <E extends HMSHLSPlayerEvents>(\n eventName: E,\n eventObject: Parameters<HMSHLSPlayerListeners<E>>[0],\n ): boolean => {\n return this._emitter.emit(eventName, eventObject);\n };\n\n private removeAllListeners = <E extends HMSHLSPlayerEvents>(eventName?: E): void => {\n this._emitter.removeAllListeners(eventName);\n };\n\n public get volume(): number {\n return this._volume;\n }\n\n setVolume(volume: number) {\n this._videoEl.volume = volume / 100;\n this._volume = volume;\n }\n\n getLayer(): HMSHLSLayer | null {\n if (this._hls && this._hls.currentLevel !== -1) {\n const currentLevel = this._hls?.levels.at(this._hls?.currentLevel);\n return currentLevel ? mapLayer(currentLevel) : null;\n }\n return null;\n }\n\n setLayer(layer: HMSHLSLayer): void {\n if (this._hls) {\n const current = this._hls.levels.findIndex((level: Level) => {\n return level?.attrs?.RESOLUTION === layer?.resolution;\n });\n this._hls.currentLevel = current;\n }\n return;\n }\n /**\n * set current stream to Live\n */\n async seekToLivePosition() {\n let end = 0;\n if (this._videoEl.buffered.length > 0) {\n end = this._videoEl.buffered.end(this._videoEl.buffered.length - 1);\n }\n this._videoEl.currentTime = this._hls.liveSyncPosition || end;\n if (this._videoEl.paused) {\n try {\n await this.playVideo();\n } catch (err) {\n console.error(this.TAG, 'Attempt to jump to live position Failed.', err);\n }\n }\n }\n /**\n * Play stream\n */\n play = async () => {\n await this.playVideo();\n };\n /**\n * Pause stream\n */\n pause = () => {\n this.pauseVideo();\n };\n /**\n * It will update the video element current time\n * @param seekValue Pass currentTime in second\n */\n seekTo = (seekValue: number) => {\n this._videoEl.currentTime = seekValue;\n };\n\n private playVideo = async () => {\n try {\n if (this._videoEl.paused) {\n await this._videoEl.play();\n }\n } catch (error) {\n console.debug(this.TAG, 'Play failed with error', (error as Error).message);\n if ((error as Error).name === 'NotAllowedError') {\n this.emit(HMSHLSPlayerEvents.AUTOPLAY_BLOCKED, HMSHLSErrorFactory.HLSMediaError.autoplayFailed());\n }\n }\n };\n private pauseVideo = () => {\n if (!this._videoEl.paused) {\n this._videoEl.pause();\n }\n };\n private playEventHandler = () => {\n this.emit(HMSHLSPlayerEvents.PLAYBACK_STATE, {\n state: HLSPlaybackState.playing,\n });\n };\n private pauseEventHandler = () => {\n this.emit(HMSHLSPlayerEvents.PLAYBACK_STATE, {\n state: HLSPlaybackState.paused,\n });\n };\n private volumeEventHandler = () => {\n this._volume = this._videoEl.volume;\n };\n // eslint-disable-next-line complexity\n private handleHLSException = (_: any, data: ErrorData) => {\n console.error(this.TAG, data);\n const details = data.error?.message || data.err?.message || '';\n const detail = {\n details: details,\n fatal: data.fatal,\n };\n switch (data.details) {\n case Hls.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.manifestIncompatibleCodecsError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.FRAG_DECRYPT_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.fragDecryptError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.bufferIncompatibleCodecsError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n // Below one are network related errors\n case Hls.ErrorDetails.MANIFEST_LOAD_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.manifestLoadError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.MANIFEST_PARSING_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.manifestParsingError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.LEVEL_LOAD_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.layerLoadError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n default: {\n const error = HMSHLSErrorFactory.UnknownError(detail);\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n }\n };\n private manifestLoadedHandler = (_: any, { levels }: { levels: LevelParsed[] }) => {\n const layers: HMSHLSLayer[] = mapLayers(this.removeAudioLevels(levels));\n this.emit(HMSHLSPlayerEvents.MANIFEST_LOADED, {\n layers,\n });\n };\n private levelUpdatedHandler = (_: any, { level }: { level: number }) => {\n const qualityLayer: HMSHLSLayer = mapLayer(this._hls.levels[level]);\n this.emit(HMSHLSPlayerEvents.LAYER_UPDATED, {\n layer: qualityLayer,\n });\n };\n\n private handleTimeUpdateListener = (_: Event) => {\n this.emit(HMSHLSPlayerEvents.CURRENT_TIME, this._videoEl.currentTime);\n const live = this._hls.liveSyncPosition\n ? this._hls.liveSyncPosition - this._videoEl.currentTime <= HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY\n : false;\n if (this._isLive !== live) {\n this._isLive = live;\n this.emit(HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE, {\n isLive: this._isLive,\n });\n }\n };\n /**\n * Listen to hlsjs and video related events\n */\n private listenHLSEvent() {\n if (Hls.isSupported()) {\n this._hls.on(Hls.Events.MANIFEST_LOADED, this.manifestLoadedHandler);\n this._hls.on(Hls.Events.LEVEL_UPDATED, this.levelUpdatedHandler);\n this._hls.on(Hls.Events.ERROR, this.handleHLSException);\n this.subscribeStats();\n } else if (this._videoEl.canPlayType('application/vnd.apple.mpegurl')) {\n // code for ios safari, mseNot Supported.\n this._videoEl.src = this._hlsUrl;\n }\n this._videoEl.addEventListener('timeupdate', this.handleTimeUpdateListener);\n this._videoEl.addEventListener('play', this.playEventHandler);\n this._videoEl.addEventListener('pause', this.pauseEventHandler);\n this._videoEl.addEventListener('volumechange', this.volumeEventHandler);\n }\n\n private getPlayerConfig(): Partial<HlsConfig> {\n return {\n enableWorker: true,\n maxBufferLength: 20,\n backBufferLength: 10,\n };\n }\n\n /**\n * @param {Array} levels array from hlsJS\n * @returns a new array with only video levels.\n */\n private removeAudioLevels(levels: LevelParsed[]) {\n return levels.filter(({ videoCodec, width, height }) => !!videoCodec || !!(width && height));\n }\n}\n", "import Hls, { Fragment } from 'hls.js';\nimport { HMSHLSErrorFactory } from '../error/HMSHLSErrorFactory';\nimport { HMSHLSPlayerListeners } from '../interfaces/events';\nimport { HMSHLSPlayerEvents } from '../utilies/constants';\nimport { metadataPayloadParser } from '../utilies/utils';\n\nexport class HMSHLSTimedMetadata {\n private hls: Hls;\n constructor(\n hls: Hls,\n private videoEl: HTMLVideoElement,\n private emit: <E extends HMSHLSPlayerEvents>(\n eventName: E,\n eventObject: Parameters<HMSHLSPlayerListeners<E>>[0],\n ) => boolean,\n ) {\n this.hls = hls;\n this.registerListner();\n }\n extractMetaTextTrack = (): TextTrack | null => {\n const textTrackListCount = this.videoEl.textTracks.length || 0;\n for (let trackIndex = 0; trackIndex < textTrackListCount; trackIndex++) {\n const textTrack = this.videoEl.textTracks[trackIndex];\n if (textTrack?.kind !== 'metadata') {\n continue;\n }\n textTrack.mode = 'showing';\n return textTrack;\n }\n return null;\n };\n\n // sync time with cue and trigger event\n fireCues = (currentAbsTime: number, tolerance: number) => {\n const cues = this.extractMetaTextTrack()?.cues;\n if (!cues) {\n return;\n }\n const cuesLength = cues.length;\n let cueIndex = 0;\n while (cueIndex < cuesLength) {\n const cue = cues[cueIndex] as TextTrackCue & {\n queued: boolean;\n value: { data: string };\n };\n if (cue.queued) {\n return;\n }\n // here we are converting base64 to actual data.\n const data: Record<string, any> = metadataPayloadParser(cue.value.data);\n const startDate = data.start_date;\n const endDate = data.end_date;\n const timeDiff = new Date(startDate).getTime() - currentAbsTime;\n const duration = new Date(endDate).getTime() - new Date(startDate).getTime();\n if (timeDiff <= tolerance) {\n setTimeout(() => {\n this.emit(HMSHLSPlayerEvents.TIMED_METADATA_LOADED, {\n id: cue?.id,\n payload: data.payload,\n duration: duration,\n startDate: new Date(startDate),\n endDate: new Date(endDate),\n });\n }, timeDiff);\n cue.queued = true;\n }\n cueIndex++;\n }\n };\n\n // handle time update listener\n handleTimeUpdateListener = () => {\n // extract timed metadata text track\n const metaTextTrack: TextTrack | null = this.extractMetaTextTrack();\n if (!metaTextTrack || !metaTextTrack.cues) {\n return;\n }\n // @ts-ignore\n const firstFragProgramDateTime = this.videoEl?.getStartDate() || 0;\n const currentAbsTime = new Date(firstFragProgramDateTime).getTime() + (this.videoEl.currentTime || 0) * 1000;\n // fire cue for timed meta data extract\n this.fireCues(currentAbsTime, 0.25);\n };\n /**\n * Metadata are automatically parsed and added to the video element's\n * textTrack cue by hlsjs as they come through the stream.\n * in FRAG_CHANGED, we read the cues and emit HLS_METADATA_LOADED\n * when the current fragment has a metadata to play.\n */\n fragChangeHandler = (_: any, { frag }: { frag: Fragment }) => {\n if (!this.videoEl) {\n const error = HMSHLSErrorFactory.HLSMediaError.videoElementNotFound();\n this.emit(HMSHLSPlayerEvents.ERROR, error);\n }\n try {\n if (this.videoEl.textTracks.length === 0) {\n return;\n }\n const fragStartTime = frag.programDateTime || 0;\n const fragmentDuration = frag.end - frag.start;\n this.fireCues(fragStartTime, fragmentDuration);\n } catch (e) {\n console.error('FRAG_CHANGED event error', e);\n }\n };\n private registerListner = () => {\n if (Hls.isSupported()) {\n this.hls.on(Hls.Events.FRAG_CHANGED, this.fragChangeHandler);\n } else if (this.videoEl.canPlayType('application/vnd.apple.mpegurl')) {\n this.videoEl.addEventListener('timeupdate', this.handleTimeUpdateListener);\n }\n };\n\n unregisterListener = () => {\n this.hls.off(Hls.Events.FRAG_CHANGED, this.fragChangeHandler);\n this.videoEl.removeEventListener('timeupdate', this.handleTimeUpdateListener);\n };\n}\n", "export class HMSHLSException extends Error {\n nativeError?: Error;\n\n constructor(\n public name: string,\n public message: string,\n public description: string,\n public isTerminal: boolean = false,\n ) {\n super(message);\n\n // Ref: https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, HMSHLSException.prototype);\n }\n\n toAnalyticsProperties() {\n return {\n error_name: this.name,\n error_message: this.message,\n error_description: this.description,\n is_terminal: this.isTerminal,\n };\n }\n\n addNativeError(error: Error) {\n this.nativeError = error;\n }\n\n toString() {\n return `{\n name: ${this.name};\n message: ${this.message};\n description: ${this.description};\n isTerminal: ${this.isTerminal};\n nativeError: ${this.nativeError?.message};\n }`;\n }\n}\n", "export const HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY = 5;\n\nexport enum HMSHLSPlayerEvents {\n TIMED_METADATA_LOADED = 'timed-metadata',\n SEEK_POS_BEHIND_LIVE_EDGE = 'seek-pos-behind-live-edge',\n\n CURRENT_TIME = 'current-time',\n AUTOPLAY_BLOCKED = 'autoplay-blocked',\n\n MANIFEST_LOADED = 'manifest-loaded',\n LAYER_UPDATED = 'layer-updated',\n\n ERROR = 'error',\n PLAYBACK_STATE = 'playback-state',\n STATS = 'stats',\n}\n\nexport enum HMSHLSExceptionEvents {\n MANIFEST_LOAD_ERROR = 'manifest-load-error',\n MANIFEST_PARSING_ERROR = 'manifest-parsing-error',\n LAYER_LOAD_ERROR = 'layer-load-error',\n\n MANIFEST_INCOMPATIBLE_CODECS_ERROR = 'manifest-incompatible-codecs-error',\n FRAG_DECRYPT_ERROR = 'frag-decrypt-error',\n BUFFER_INCOMPATIBLE_CODECS_ERROR = 'buffer-incompatible-codecs-error',\n\n VIDEO_ELEMENT_NOT_FOUND = 'video-element-not-found',\n HLS_AUTOPLAY_FAILED = 'hls-autoplay-failed',\n HLS_URL_NOT_FOUND = 'hls-url-not-found',\n UNKNOWN_ERROR = 'unknown-error',\n}\n\nexport enum HLSPlaybackState {\n playing,\n paused,\n}\n", "import { HMSHLSException } from './HMSHLSException';\nimport { HMSHLSExceptionEvents } from '../utilies/constants';\n\nexport type HMSHLSErrorDetails = {\n details: string;\n fatal?: boolean;\n};\nexport const HMSHLSErrorFactory = {\n HLSNetworkError: {\n manifestLoadError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_LOAD_ERROR,\n data.details,\n 'Unable to load manifest file',\n data.fatal,\n );\n },\n manifestParsingError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_PARSING_ERROR,\n data.details,\n 'Unable to parse manifest file',\n data.fatal,\n );\n },\n layerLoadError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.LAYER_LOAD_ERROR,\n data.details,\n 'Unable to load quality layers',\n data.fatal,\n );\n },\n },\n HLSMediaError: {\n manifestIncompatibleCodecsError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_INCOMPATIBLE_CODECS_ERROR,\n data.details,\n 'Incompatible manifest codecs',\n data.fatal,\n );\n },\n fragDecryptError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.FRAG_DECRYPT_ERROR,\n data.details,\n 'Unable to decrypt fragment',\n data.fatal,\n );\n },\n bufferIncompatibleCodecsError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.BUFFER_INCOMPATIBLE_CODECS_ERROR,\n data.details,\n 'Incompatible buffer codecs',\n data.fatal,\n );\n },\n videoElementNotFound(): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.VIDEO_ELEMENT_NOT_FOUND,\n 'Video element not found',\n 'Video element not found',\n false,\n );\n },\n autoplayFailed(): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.HLS_AUTOPLAY_FAILED,\n 'Failed to autoplay',\n 'Failed to autoplay',\n false,\n );\n },\n hlsURLNotFound(msg?: string): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.HLS_URL_NOT_FOUND,\n msg || 'hls url not found',\n msg || 'hls url not found',\n true,\n );\n },\n },\n UnknownError: (data: HMSHLSErrorDetails): HMSHLSException => {\n return new HMSHLSException(HMSHLSExceptionEvents.UNKNOWN_ERROR, data.details, 'Unknown error', data.fatal);\n },\n};\n", "import { Level, LevelParsed } from 'hls.js';\nimport { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';\n\n/**\n *\n * @param payload a base64 string coming from backend\n * @returns a parsed data which contains payload, start_date, end_date, version\n */\nexport const metadataPayloadParser = (payload: string): Record<string, any> => {\n try {\n const data = window?.atob(payload);\n const parsedData = JSON.parse(data);\n return parsedData;\n } catch (e) {\n return { payload };\n }\n};\n\n/**\n * map Level[] to HMSHLSLayer[]\n */\nexport const mapLayers = (levels: Level[] | LevelParsed[]): HMSHLSLayer[] => {\n return levels.map((level: Level | LevelParsed) => mapLayer(level));\n};\n\n/**\n * map Level[] to HMSHLSLayer[]\n */\nexport const mapLayer = (quality: Level | LevelParsed): HMSHLSLayer => {\n return {\n resolution: quality.attrs?.RESOLUTION,\n bitrate: quality.bitrate,\n height: quality.height,\n id: quality.id,\n url: quality.url[0],\n width: quality.width,\n };\n};\n", "import { HlsPlayerStats } from '@100mslive/hls-stats';\nimport { EventEmitter2 as EventEmitter } from 'eventemitter2';\nimport { HMSHLSLayer } from './IHMSHLSLayer';\nimport { HMSHLSException } from '../error/HMSHLSException';\nimport { HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';\n\ntype HMSHLSListenerDataMapping = {\n [HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE]: HMSHLSStreamLive;\n [HMSHLSPlayerEvents.TIMED_METADATA_LOADED]: HMSHLSCue;\n [HMSHLSPlayerEvents.STATS]: HlsPlayerStats;\n [HMSHLSPlayerEvents.PLAYBACK_STATE]: HMSHLSPlaybackState;\n\n [HMSHLSPlayerEvents.ERROR]: HMSHLSException;\n [HMSHLSPlayerEvents.CURRENT_TIME]: number;\n [HMSHLSPlayerEvents.AUTOPLAY_BLOCKED]: HMSHLSException;\n\n [HMSHLSPlayerEvents.MANIFEST_LOADED]: HMSHLSManifestLoaded;\n [HMSHLSPlayerEvents.LAYER_UPDATED]: HMSHLSLayerUpdated;\n};\n\nexport type HMSHLSPlayerListeners<E extends HMSHLSPlayerEvents> = (data: HMSHLSListenerDataMapping[E], name: E) => void;\n\nexport interface HMSHLSStreamLive {\n isLive: boolean;\n}\nexport interface HMSHLSPlaybackState {\n state: HLSPlaybackState;\n}\nexport interface HMSHLSCue {\n id?: string;\n payload: string;\n duration: number;\n startDate: Date;\n endDate?: Date;\n}\n\nexport interface HMSHLSManifestLoaded {\n layers: HMSHLSLayer[];\n}\nexport interface HMSHLSLayerUpdated {\n layer: HMSHLSLayer;\n}\nexport interface IHMSHLSPlayerEventEmitter {\n on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void;\n\n off<E extends HMSHLSPlayerEvents>(eventName: E, listener?: HMSHLSPlayerListeners<E>): void;\n}\n\nexport class HMSHLSPlayerEventEmitter implements IHMSHLSPlayerEventEmitter {\n private eventEmitter: EventEmitter;\n constructor() {\n this.eventEmitter = new EventEmitter();\n }\n on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void {\n this.eventEmitter.on(eventName, listener);\n }\n\n off<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) {\n this.eventEmitter.off(eventName, listener);\n }\n\n emit<E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]): boolean {\n return this.eventEmitter.emit(eventName, eventObject, eventName);\n }\n\n removeAllListeners<E extends HMSHLSPlayerEvents>(eventName?: E): void {\n this.eventEmitter.removeAllListeners(eventName);\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { HlsPlayerStats, HlsStats } from '@100mslive/hls-stats';\nimport Hls, { ErrorData, HlsConfig, Level, LevelParsed } from 'hls.js';\nimport { HMSHLSTimedMetadata } from './HMSHLSTimedMetadata';\nimport { HMSHLSErrorFactory } from '../error/HMSHLSErrorFactory';\nimport { HMSHLSPlayerEventEmitter, HMSHLSPlayerListeners, IHMSHLSPlayerEventEmitter } from '../interfaces/events';\nimport { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';\nimport IHMSHLSPlayer from '../interfaces/IHMSHLSPlayer';\nimport { HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY, HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';\nimport { mapLayer, mapLayers } from '../utilies/utils';\n\nexport class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {\n private _hls: Hls;\n private _hlsUrl: string;\n private _hlsStats: HlsStats;\n private _videoEl: HTMLVideoElement;\n private _emitter: HMSHLSPlayerEventEmitter;\n private _subscribeHlsStats?: (() => void) | null = null;\n private _isLive: boolean;\n private _volume: number;\n private _metaData: HMSHLSTimedMetadata;\n private readonly TAG = '[HMSHLSPlayer]';\n /**\n * Initiliaze the player with hlsUrl and video element\n * @remarks If video element is not passed, we will create one and call a method getVideoElement get element\n * @param hlsUrl required - Pass hls url to\n * @param videoEl optional field - HTML video element\n */\n constructor(hlsUrl: string, videoEl?: HTMLVideoElement) {\n this._hls = new Hls(this.getPlayerConfig());\n this._emitter = new HMSHLSPlayerEventEmitter();\n this._hlsUrl = hlsUrl;\n this._videoEl = videoEl || this.createVideoElement();\n if (!hlsUrl) {\n throw HMSHLSErrorFactory.HLSMediaError.hlsURLNotFound();\n } else if (!hlsUrl.endsWith('m3u8')) {\n throw HMSHLSErrorFactory.HLSMediaError.hlsURLNotFound('Invalid URL, pass m3u8 url');\n }\n this._hls.loadSource(hlsUrl);\n this._hls.attachMedia(this._videoEl);\n this._isLive = true;\n this._volume = this._videoEl.volume * 100;\n this._hlsStats = new HlsStats(this._hls, this._videoEl);\n this.listenHLSEvent();\n this._metaData = new HMSHLSTimedMetadata(this._hls, this._videoEl, this.emitEvent);\n this.seekToLivePosition();\n }\n\n /**\n * @remarks It will create a video element with playiniline true.\n * @returns HTML video element\n */\n private createVideoElement(): HTMLVideoElement {\n if (this._videoEl) {\n return this._videoEl;\n }\n const video: HTMLVideoElement = document.createElement('video');\n video.playsInline = true;\n video.controls = false;\n video.autoplay = true;\n return video;\n }\n /**\n * @returns get html video element\n */\n getVideoElement(): HTMLVideoElement {\n return this._videoEl;\n }\n /**\n * Subscribe to hls stats\n */\n private subscribeStats = (interval = 2000) => {\n this._subscribeHlsStats = this._hlsStats.subscribe((state: HlsPlayerStats) => {\n this.emitEvent(HMSHLSPlayerEvents.STATS, state);\n }, interval);\n };\n /**\n * Unsubscribe to hls stats\n */\n private unsubscribeStats = () => {\n if (this._subscribeHlsStats) {\n this._subscribeHlsStats();\n }\n };\n // reset the controller\n reset() {\n if (this._hls && this._hls.media) {\n this._hls.detachMedia();\n this.unsubscribeStats();\n }\n if (this._metaData) {\n this._metaData.unregisterListener();\n }\n if (Hls.isSupported()) {\n this._hls.off(Hls.Events.MANIFEST_LOADED, this.manifestLoadedHandler);\n this._hls.off(Hls.Events.LEVEL_UPDATED, this.levelUpdatedHandler);\n this._hls.off(Hls.Events.ERROR, this.handleHLSException);\n }\n if (this._videoEl) {\n this._videoEl.removeEventListener('play', this.playEventHandler);\n this._videoEl.removeEventListener('pause', this.pauseEventHandler);\n this._videoEl.removeEventListener('timeupdate', this.handleTimeUpdateListener);\n this._videoEl.removeEventListener('volumechange', this.volumeEventHandler);\n }\n this.removeAllListeners();\n }\n\n on = <E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) => {\n this._emitter.on(eventName, listener);\n };\n\n off = <E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) => {\n this._emitter.off(eventName, listener);\n };\n\n emitEvent = <E extends HMSHLSPlayerEvents>(\n eventName: E,\n eventObject: Parameters<HMSHLSPlayerListeners<E>>[0],\n ): boolean => {\n return this._emitter.emitEvent(eventName, eventObject);\n };\n\n private removeAllListeners = <E extends HMSHLSPlayerEvents>(eventName?: E): void => {\n this._emitter.removeAllListeners(eventName);\n };\n\n public get volume(): number {\n return this._volume;\n }\n\n setVolume(volume: number) {\n this._videoEl.volume = volume / 100;\n this._volume = volume;\n }\n\n getLayer(): HMSHLSLayer | null {\n if (this._hls && this._hls.currentLevel !== -1) {\n const currentLevel = this._hls?.levels.at(this._hls?.currentLevel);\n return currentLevel ? mapLayer(currentLevel) : null;\n }\n return null;\n }\n\n setLayer(layer: HMSHLSLayer): void {\n if (this._hls) {\n const current = this._hls.levels.findIndex((level: Level) => {\n return level?.attrs?.RESOLUTION === layer?.resolution;\n });\n this._hls.currentLevel = current;\n }\n return;\n }\n /**\n * set current stream to Live\n */\n async seekToLivePosition() {\n let end = 0;\n if (this._videoEl.buffered.length > 0) {\n end = this._videoEl.buffered.end(this._videoEl.buffered.length - 1);\n }\n this._videoEl.currentTime = this._hls.liveSyncPosition || end;\n if (this._videoEl.paused) {\n try {\n await this.playVideo();\n } catch (err) {\n console.error(this.TAG, 'Attempt to jump to live position Failed.', err);\n }\n }\n }\n /**\n * Play stream\n */\n play = async () => {\n await this.playVideo();\n };\n /**\n * Pause stream\n */\n pause = () => {\n this.pauseVideo();\n };\n /**\n * It will update the video element current time\n * @param seekValue Pass currentTime in second\n */\n seekTo = (seekValue: number) => {\n this._videoEl.currentTime = seekValue;\n };\n\n private playVideo = async () => {\n try {\n if (this._videoEl.paused) {\n await this._videoEl.play();\n }\n } catch (error) {\n console.debug(this.TAG, 'Play failed with error', (error as Error).message);\n if ((error as Error).name === 'NotAllowedError') {\n this.emitEvent(HMSHLSPlayerEvents.AUTOPLAY_BLOCKED, HMSHLSErrorFactory.HLSMediaError.autoplayFailed());\n }\n }\n };\n private pauseVideo = () => {\n if (!this._videoEl.paused) {\n this._videoEl.pause();\n }\n };\n private playEventHandler = () => {\n this.emitEvent(HMSHLSPlayerEvents.PLAYBACK_STATE, {\n state: HLSPlaybackState.playing,\n });\n };\n private pauseEventHandler = () => {\n this.emitEvent(HMSHLSPlayerEvents.PLAYBACK_STATE, {\n state: HLSPlaybackState.paused,\n });\n };\n private volumeEventHandler = () => {\n this._volume = this._videoEl.volume;\n };\n // eslint-disable-next-line complexity\n private handleHLSException = (_: any, data: ErrorData) => {\n console.error(this.TAG, `error type ${data.type} with details ${data.details} is fatal ${data.fatal}`);\n const details = data.error?.message || data.err?.message || '';\n const detail = {\n details: details,\n fatal: data.fatal,\n };\n switch (data.details) {\n case Hls.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.manifestIncompatibleCodecsError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.FRAG_DECRYPT_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.fragDecryptError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR: {\n const error = HMSHLSErrorFactory.HLSMediaError.bufferIncompatibleCodecsError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n // Below one are network related errors\n case Hls.ErrorDetails.MANIFEST_LOAD_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.manifestLoadError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.MANIFEST_PARSING_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.manifestParsingError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n case Hls.ErrorDetails.LEVEL_LOAD_ERROR: {\n const error = HMSHLSErrorFactory.HLSNetworkError.layerLoadError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n default: {\n const error = HMSHLSErrorFactory.UnknownError(detail);\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n break;\n }\n }\n };\n private manifestLoadedHandler = (_: any, { levels }: { levels: LevelParsed[] }) => {\n const layers: HMSHLSLayer[] = mapLayers(this.removeAudioLevels(levels));\n this.emitEvent(HMSHLSPlayerEvents.MANIFEST_LOADED, {\n layers,\n });\n };\n private levelUpdatedHandler = (_: any, { level }: { level: number }) => {\n const qualityLayer: HMSHLSLayer = mapLayer(this._hls.levels[level]);\n this.emitEvent(HMSHLSPlayerEvents.LAYER_UPDATED, {\n layer: qualityLayer,\n });\n };\n\n private handleTimeUpdateListener = (_: Event) => {\n this.emitEvent(HMSHLSPlayerEvents.CURRENT_TIME, this._videoEl.currentTime);\n const live = this._hls.liveSyncPosition\n ? this._hls.liveSyncPosition - this._videoEl.currentTime <= HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY\n : false;\n if (this._isLive !== live) {\n this._isLive = live;\n this.emitEvent(HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE, {\n isLive: this._isLive,\n });\n }\n };\n /**\n * Listen to hlsjs and video related events\n */\n private listenHLSEvent() {\n if (Hls.isSupported()) {\n this._hls.on(Hls.Events.MANIFEST_LOADED, this.manifestLoadedHandler);\n this._hls.on(Hls.Events.LEVEL_UPDATED, this.levelUpdatedHandler);\n this._hls.on(Hls.Events.ERROR, this.handleHLSException);\n this.subscribeStats();\n } else if (this._videoEl.canPlayType('application/vnd.apple.mpegurl')) {\n // code for ios safari, mseNot Supported.\n this._videoEl.src = this._hlsUrl;\n }\n this._videoEl.addEventListener('timeupdate', this.handleTimeUpdateListener);\n this._videoEl.addEventListener('play', this.playEventHandler);\n this._videoEl.addEventListener('pause', this.pauseEventHandler);\n this._videoEl.addEventListener('volumechange', this.volumeEventHandler);\n }\n\n private getPlayerConfig(): Partial<HlsConfig> {\n return {\n enableWorker: true,\n maxBufferLength: 20,\n backBufferLength: 10,\n };\n }\n\n /**\n * @param {Array} levels array from hlsJS\n * @returns a new array with only video levels.\n */\n private removeAudioLevels(levels: LevelParsed[]) {\n return levels.filter(({ videoCodec, width, height }) => !!videoCodec || !!(width && height));\n }\n}\n", "import Hls, { Fragment } from 'hls.js';\nimport { HMSHLSErrorFactory } from '../error/HMSHLSErrorFactory';\nimport { HMSHLSPlayerListeners } from '../interfaces/events';\nimport { HMSHLSPlayerEvents } from '../utilies/constants';\nimport { metadataPayloadParser } from '../utilies/utils';\n\nexport class HMSHLSTimedMetadata {\n private hls: Hls;\n constructor(\n hls: Hls,\n private videoEl: HTMLVideoElement,\n private emitEvent: <E extends HMSHLSPlayerEvents>(\n eventName: E,\n eventObject: Parameters<HMSHLSPlayerListeners<E>>[0],\n ) => boolean,\n ) {\n this.hls = hls;\n this.registerListner();\n }\n extractMetaTextTrack = (): TextTrack | null => {\n const textTrackListCount = this.videoEl.textTracks.length || 0;\n for (let trackIndex = 0; trackIndex < textTrackListCount; trackIndex++) {\n const textTrack = this.videoEl.textTracks[trackIndex];\n if (textTrack?.kind !== 'metadata') {\n continue;\n }\n textTrack.mode = 'showing';\n return textTrack;\n }\n return null;\n };\n\n // sync time with cue and trigger event\n fireCues = (currentAbsTime: number, tolerance: number) => {\n const cues = this.extractMetaTextTrack()?.cues;\n if (!cues) {\n return;\n }\n const cuesLength = cues.length;\n let cueIndex = 0;\n while (cueIndex < cuesLength) {\n const cue = cues[cueIndex] as TextTrackCue & {\n queued: boolean;\n value: { data: string };\n };\n if (cue.queued) {\n return;\n }\n // here we are converting base64 to actual data.\n const data: Record<string, any> = metadataPayloadParser(cue.value.data);\n const startDate = data.start_date;\n const endDate = data.end_date;\n const timeDiff = new Date(startDate).getTime() - currentAbsTime;\n const duration = new Date(endDate).getTime() - new Date(startDate).getTime();\n if (timeDiff <= tolerance) {\n setTimeout(() => {\n this.emitEvent(HMSHLSPlayerEvents.TIMED_METADATA_LOADED, {\n id: cue?.id,\n payload: data.payload,\n duration: duration,\n startDate: new Date(startDate),\n endDate: new Date(endDate),\n });\n }, timeDiff);\n cue.queued = true;\n }\n cueIndex++;\n }\n };\n\n // handle time update listener\n handleTimeUpdateListener = () => {\n // extract timed metadata text track\n const metaTextTrack: TextTrack | null = this.extractMetaTextTrack();\n if (!metaTextTrack || !metaTextTrack.cues) {\n return;\n }\n // @ts-ignore\n const firstFragProgramDateTime = this.videoEl?.getStartDate() || 0;\n const currentAbsTime = new Date(firstFragProgramDateTime).getTime() + (this.videoEl.currentTime || 0) * 1000;\n // fire cue for timed meta data extract\n this.fireCues(currentAbsTime, 0.25);\n };\n /**\n * Metadata are automatically parsed and added to the video element's\n * textTrack cue by hlsjs as they come through the stream.\n * in FRAG_CHANGED, we read the cues and emitEvent HLS_METADATA_LOADED\n * when the current fragment has a metadata to play.\n */\n fragChangeHandler = (_: any, { frag }: { frag: Fragment }) => {\n if (!this.videoEl) {\n const error = HMSHLSErrorFactory.HLSMediaError.videoElementNotFound();\n this.emitEvent(HMSHLSPlayerEvents.ERROR, error);\n }\n try {\n if (this.videoEl.textTracks.length === 0) {\n return;\n }\n const fragStartTime = frag.programDateTime || 0;\n const fragmentDuration = frag.end - frag.start;\n this.fireCues(fragStartTime, fragmentDuration);\n } catch (e) {\n console.error('FRAG_CHANGED event error', e);\n }\n };\n private registerListner = () => {\n if (Hls.isSupported()) {\n this.hls.on(Hls.Events.FRAG_CHANGED, this.fragChangeHandler);\n } else if (this.videoEl.canPlayType('application/vnd.apple.mpegurl')) {\n this.videoEl.addEventListener('timeupdate', this.handleTimeUpdateListener);\n }\n };\n\n unregisterListener = () => {\n this.hls.off(Hls.Events.FRAG_CHANGED, this.fragChangeHandler);\n this.videoEl.removeEventListener('timeupdate', this.handleTimeUpdateListener);\n };\n}\n", "export class HMSHLSException extends Error {\n nativeError?: Error;\n\n constructor(\n public name: string,\n public message: string,\n public description: string,\n public isTerminal: boolean = false,\n ) {\n super(message);\n\n // Ref: https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, HMSHLSException.prototype);\n }\n\n toAnalyticsProperties() {\n return {\n error_name: this.name,\n error_message: this.message,\n error_description: this.description,\n is_terminal: this.isTerminal,\n };\n }\n\n addNativeError(error: Error) {\n this.nativeError = error;\n }\n\n toString() {\n return `{\n name: ${this.name};\n message: ${this.message};\n description: ${this.description};\n isTerminal: ${this.isTerminal};\n nativeError: ${this.nativeError?.message};\n }`;\n }\n}\n", "export const HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY = 5;\n\nexport enum HMSHLSPlayerEvents {\n TIMED_METADATA_LOADED = 'timed-metadata',\n SEEK_POS_BEHIND_LIVE_EDGE = 'seek-pos-behind-live-edge',\n\n CURRENT_TIME = 'current-time',\n AUTOPLAY_BLOCKED = 'autoplay-blocked',\n\n MANIFEST_LOADED = 'manifest-loaded',\n LAYER_UPDATED = 'layer-updated',\n\n ERROR = 'error',\n PLAYBACK_STATE = 'playback-state',\n STATS = 'stats',\n}\n\nexport enum HMSHLSExceptionEvents {\n MANIFEST_LOAD_ERROR = 'manifest-load-error',\n MANIFEST_PARSING_ERROR = 'manifest-parsing-error',\n LAYER_LOAD_ERROR = 'layer-load-error',\n\n MANIFEST_INCOMPATIBLE_CODECS_ERROR = 'manifest-incompatible-codecs-error',\n FRAG_DECRYPT_ERROR = 'frag-decrypt-error',\n BUFFER_INCOMPATIBLE_CODECS_ERROR = 'buffer-incompatible-codecs-error',\n\n VIDEO_ELEMENT_NOT_FOUND = 'video-element-not-found',\n HLS_AUTOPLAY_FAILED = 'hls-autoplay-failed',\n HLS_URL_NOT_FOUND = 'hls-url-not-found',\n UNKNOWN_ERROR = 'unknown-error',\n}\n\nexport enum HLSPlaybackState {\n playing,\n paused,\n}\n", "import { HMSHLSException } from './HMSHLSException';\nimport { HMSHLSExceptionEvents } from '../utilies/constants';\n\nexport type HMSHLSErrorDetails = {\n details: string;\n fatal?: boolean;\n};\nexport const HMSHLSErrorFactory = {\n HLSNetworkError: {\n manifestLoadError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_LOAD_ERROR,\n data.details,\n 'Unable to load manifest file',\n data.fatal,\n );\n },\n manifestParsingError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_PARSING_ERROR,\n data.details,\n 'Unable to parse manifest file',\n data.fatal,\n );\n },\n layerLoadError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.LAYER_LOAD_ERROR,\n data.details,\n 'Unable to load quality layers',\n data.fatal,\n );\n },\n },\n HLSMediaError: {\n manifestIncompatibleCodecsError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.MANIFEST_INCOMPATIBLE_CODECS_ERROR,\n data.details,\n 'Incompatible manifest codecs',\n data.fatal,\n );\n },\n fragDecryptError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.FRAG_DECRYPT_ERROR,\n data.details,\n 'Unable to decrypt fragment',\n data.fatal,\n );\n },\n bufferIncompatibleCodecsError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.BUFFER_INCOMPATIBLE_CODECS_ERROR,\n data.details,\n 'Incompatible buffer codecs',\n data.fatal,\n );\n },\n videoElementNotFound(): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.VIDEO_ELEMENT_NOT_FOUND,\n 'Video element not found',\n 'Video element not found',\n false,\n );\n },\n autoplayFailed(): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.HLS_AUTOPLAY_FAILED,\n 'Failed to autoplay',\n 'Failed to autoplay',\n false,\n );\n },\n hlsURLNotFound(msg?: string): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.HLS_URL_NOT_FOUND,\n msg || 'hls url not found',\n msg || 'hls url not found',\n true,\n );\n },\n },\n UnknownError: (data: HMSHLSErrorDetails): HMSHLSException => {\n return new HMSHLSException(HMSHLSExceptionEvents.UNKNOWN_ERROR, data.details, 'Unknown error', data.fatal);\n },\n};\n", "import { Level, LevelParsed } from 'hls.js';\nimport { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';\n\n/**\n *\n * @param payload a base64 string coming from backend\n * @returns a parsed data which contains payload, start_date, end_date, version\n */\nexport const metadataPayloadParser = (payload: string): Record<string, any> => {\n try {\n const data = window?.atob(payload);\n const parsedData = JSON.parse(data);\n return parsedData;\n } catch (e) {\n return { payload };\n }\n};\n\n/**\n * map Level[] to HMSHLSLayer[]\n */\nexport const mapLayers = (levels: Level[] | LevelParsed[]): HMSHLSLayer[] => {\n return levels.map((level: Level | LevelParsed) => mapLayer(level));\n};\n\n/**\n * map Level[] to HMSHLSLayer[]\n */\nexport const mapLayer = (quality: Level | LevelParsed): HMSHLSLayer => {\n return {\n resolution: quality.attrs?.RESOLUTION,\n bitrate: quality.bitrate,\n height: quality.height,\n id: quality.id,\n url: quality.url[0],\n width: quality.width,\n };\n};\n", "import { HlsPlayerStats } from '@100mslive/hls-stats';\nimport { EventEmitter2 as EventEmitter } from 'eventemitter2';\nimport { HMSHLSLayer } from './IHMSHLSLayer';\nimport { HMSHLSException } from '../error/HMSHLSException';\nimport { HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';\n\ntype HMSHLSListenerDataMapping = {\n [HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE]: HMSHLSStreamLive;\n [HMSHLSPlayerEvents.TIMED_METADATA_LOADED]: HMSHLSCue;\n [HMSHLSPlayerEvents.STATS]: HlsPlayerStats;\n [HMSHLSPlayerEvents.PLAYBACK_STATE]: HMSHLSPlaybackState;\n\n [HMSHLSPlayerEvents.ERROR]: HMSHLSException;\n [HMSHLSPlayerEvents.CURRENT_TIME]: number;\n [HMSHLSPlayerEvents.AUTOPLAY_BLOCKED]: HMSHLSException;\n\n [HMSHLSPlayerEvents.MANIFEST_LOADED]: HMSHLSManifestLoaded;\n [HMSHLSPlayerEvents.LAYER_UPDATED]: HMSHLSLayerUpdated;\n};\n\nexport type HMSHLSPlayerListeners<E extends HMSHLSPlayerEvents> = (data: HMSHLSListenerDataMapping[E], name: E) => void;\n\nexport interface HMSHLSStreamLive {\n isLive: boolean;\n}\nexport interface HMSHLSPlaybackState {\n state: HLSPlaybackState;\n}\nexport interface HMSHLSCue {\n id?: string;\n payload: string;\n duration: number;\n startDate: Date;\n endDate?: Date;\n}\n\nexport interface HMSHLSManifestLoaded {\n layers: HMSHLSLayer[];\n}\nexport interface HMSHLSLayerUpdated {\n layer: HMSHLSLayer;\n}\nexport interface IHMSHLSPlayerEventEmitter {\n on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void;\n\n off<E extends HMSHLSPlayerEvents>(eventName: E, listener?: HMSHLSPlayerListeners<E>): void;\n}\n\nexport class HMSHLSPlayerEventEmitter implements IHMSHLSPlayerEventEmitter {\n private eventEmitter: EventEmitter;\n constructor() {\n this.eventEmitter = new EventEmitter();\n }\n on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void {\n this.eventEmitter.on(eventName, listener);\n }\n\n off<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) {\n this.eventEmitter.off(eventName, listener);\n }\n\n emitEvent<E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]): boolean {\n return this.eventEmitter.emit(eventName, eventObject, eventName);\n }\n\n removeAllListeners<E extends HMSHLSPlayerEvents>(eventName?: E): void {\n this.eventEmitter.removeAllListeners(eventName);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -42,7 +42,7 @@ export declare class HMSHLSPlayerEventEmitter implements IHMSHLSPlayerEventEmitt
42
42
  constructor();
43
43
  on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void;
44
44
  off<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void;
45
- emit<E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]): boolean;
45
+ emitEvent<E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]): boolean;
46
46
  removeAllListeners<E extends HMSHLSPlayerEvents>(eventName?: E): void;
47
47
  }
48
48
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@100mslive/hls-player",
3
- "version": "0.1.1-alpha.0",
3
+ "version": "0.1.1",
4
4
  "description": "HLS client library which uses HTML5 Video element and Media Source Extension for playback",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.js",
@@ -31,9 +31,9 @@
31
31
  "author": "100ms",
32
32
  "license": "MIT",
33
33
  "dependencies": {
34
- "@100mslive/hls-stats": "0.2.1-alpha.0",
34
+ "@100mslive/hls-stats": "0.2.1",
35
35
  "eventemitter2": "^6.4.7",
36
36
  "hls.js": "^1.3.0"
37
37
  },
38
- "gitHead": "8d953f1f952d9f44f0c6efe4eda1151fe78aa137"
38
+ "gitHead": "3f73582599b6941c06d184e4ca1a9a0b6198631a"
39
39
  }
@@ -41,7 +41,7 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
41
41
  this._volume = this._videoEl.volume * 100;
42
42
  this._hlsStats = new HlsStats(this._hls, this._videoEl);
43
43
  this.listenHLSEvent();
44
- this._metaData = new HMSHLSTimedMetadata(this._hls, this._videoEl, this.emit);
44
+ this._metaData = new HMSHLSTimedMetadata(this._hls, this._videoEl, this.emitEvent);
45
45
  this.seekToLivePosition();
46
46
  }
47
47
 
@@ -70,7 +70,7 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
70
70
  */
71
71
  private subscribeStats = (interval = 2000) => {
72
72
  this._subscribeHlsStats = this._hlsStats.subscribe((state: HlsPlayerStats) => {
73
- this.emit(HMSHLSPlayerEvents.STATS, state);
73
+ this.emitEvent(HMSHLSPlayerEvents.STATS, state);
74
74
  }, interval);
75
75
  };
76
76
  /**
@@ -112,11 +112,11 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
112
112
  this._emitter.off(eventName, listener);
113
113
  };
114
114
 
115
- emit = <E extends HMSHLSPlayerEvents>(
115
+ emitEvent = <E extends HMSHLSPlayerEvents>(
116
116
  eventName: E,
117
117
  eventObject: Parameters<HMSHLSPlayerListeners<E>>[0],
118
118
  ): boolean => {
119
- return this._emitter.emit(eventName, eventObject);
119
+ return this._emitter.emitEvent(eventName, eventObject);
120
120
  };
121
121
 
122
122
  private removeAllListeners = <E extends HMSHLSPlayerEvents>(eventName?: E): void => {
@@ -194,7 +194,7 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
194
194
  } catch (error) {
195
195
  console.debug(this.TAG, 'Play failed with error', (error as Error).message);
196
196
  if ((error as Error).name === 'NotAllowedError') {
197
- this.emit(HMSHLSPlayerEvents.AUTOPLAY_BLOCKED, HMSHLSErrorFactory.HLSMediaError.autoplayFailed());
197
+ this.emitEvent(HMSHLSPlayerEvents.AUTOPLAY_BLOCKED, HMSHLSErrorFactory.HLSMediaError.autoplayFailed());
198
198
  }
199
199
  }
200
200
  };
@@ -204,12 +204,12 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
204
204
  }
205
205
  };
206
206
  private playEventHandler = () => {
207
- this.emit(HMSHLSPlayerEvents.PLAYBACK_STATE, {
207
+ this.emitEvent(HMSHLSPlayerEvents.PLAYBACK_STATE, {
208
208
  state: HLSPlaybackState.playing,
209
209
  });
210
210
  };
211
211
  private pauseEventHandler = () => {
212
- this.emit(HMSHLSPlayerEvents.PLAYBACK_STATE, {
212
+ this.emitEvent(HMSHLSPlayerEvents.PLAYBACK_STATE, {
213
213
  state: HLSPlaybackState.paused,
214
214
  });
215
215
  };
@@ -218,7 +218,7 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
218
218
  };
219
219
  // eslint-disable-next-line complexity
220
220
  private handleHLSException = (_: any, data: ErrorData) => {
221
- console.error(this.TAG, data);
221
+ console.error(this.TAG, `error type ${data.type} with details ${data.details} is fatal ${data.fatal}`);
222
222
  const details = data.error?.message || data.err?.message || '';
223
223
  const detail = {
224
224
  details: details,
@@ -227,63 +227,63 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
227
227
  switch (data.details) {
228
228
  case Hls.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR: {
229
229
  const error = HMSHLSErrorFactory.HLSMediaError.manifestIncompatibleCodecsError(detail);
230
- this.emit(HMSHLSPlayerEvents.ERROR, error);
230
+ this.emitEvent(HMSHLSPlayerEvents.ERROR, error);
231
231
  break;
232
232
  }
233
233
  case Hls.ErrorDetails.FRAG_DECRYPT_ERROR: {
234
234
  const error = HMSHLSErrorFactory.HLSMediaError.fragDecryptError(detail);
235
- this.emit(HMSHLSPlayerEvents.ERROR, error);
235
+ this.emitEvent(HMSHLSPlayerEvents.ERROR, error);
236
236
  break;
237
237
  }
238
238
  case Hls.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR: {
239
239
  const error = HMSHLSErrorFactory.HLSMediaError.bufferIncompatibleCodecsError(detail);
240
- this.emit(HMSHLSPlayerEvents.ERROR, error);
240
+ this.emitEvent(HMSHLSPlayerEvents.ERROR, error);
241
241
  break;
242
242
  }
243
243
  // Below one are network related errors
244
244
  case Hls.ErrorDetails.MANIFEST_LOAD_ERROR: {
245
245
  const error = HMSHLSErrorFactory.HLSNetworkError.manifestLoadError(detail);
246
- this.emit(HMSHLSPlayerEvents.ERROR, error);
246
+ this.emitEvent(HMSHLSPlayerEvents.ERROR, error);
247
247
  break;
248
248
  }
249
249
  case Hls.ErrorDetails.MANIFEST_PARSING_ERROR: {
250
250
  const error = HMSHLSErrorFactory.HLSNetworkError.manifestParsingError(detail);
251
- this.emit(HMSHLSPlayerEvents.ERROR, error);
251
+ this.emitEvent(HMSHLSPlayerEvents.ERROR, error);
252
252
  break;
253
253
  }
254
254
  case Hls.ErrorDetails.LEVEL_LOAD_ERROR: {
255
255
  const error = HMSHLSErrorFactory.HLSNetworkError.layerLoadError(detail);
256
- this.emit(HMSHLSPlayerEvents.ERROR, error);
256
+ this.emitEvent(HMSHLSPlayerEvents.ERROR, error);
257
257
  break;
258
258
  }
259
259
  default: {
260
260
  const error = HMSHLSErrorFactory.UnknownError(detail);
261
- this.emit(HMSHLSPlayerEvents.ERROR, error);
261
+ this.emitEvent(HMSHLSPlayerEvents.ERROR, error);
262
262
  break;
263
263
  }
264
264
  }
265
265
  };
266
266
  private manifestLoadedHandler = (_: any, { levels }: { levels: LevelParsed[] }) => {
267
267
  const layers: HMSHLSLayer[] = mapLayers(this.removeAudioLevels(levels));
268
- this.emit(HMSHLSPlayerEvents.MANIFEST_LOADED, {
268
+ this.emitEvent(HMSHLSPlayerEvents.MANIFEST_LOADED, {
269
269
  layers,
270
270
  });
271
271
  };
272
272
  private levelUpdatedHandler = (_: any, { level }: { level: number }) => {
273
273
  const qualityLayer: HMSHLSLayer = mapLayer(this._hls.levels[level]);
274
- this.emit(HMSHLSPlayerEvents.LAYER_UPDATED, {
274
+ this.emitEvent(HMSHLSPlayerEvents.LAYER_UPDATED, {
275
275
  layer: qualityLayer,
276
276
  });
277
277
  };
278
278
 
279
279
  private handleTimeUpdateListener = (_: Event) => {
280
- this.emit(HMSHLSPlayerEvents.CURRENT_TIME, this._videoEl.currentTime);
280
+ this.emitEvent(HMSHLSPlayerEvents.CURRENT_TIME, this._videoEl.currentTime);
281
281
  const live = this._hls.liveSyncPosition
282
282
  ? this._hls.liveSyncPosition - this._videoEl.currentTime <= HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY
283
283
  : false;
284
284
  if (this._isLive !== live) {
285
285
  this._isLive = live;
286
- this.emit(HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE, {
286
+ this.emitEvent(HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE, {
287
287
  isLive: this._isLive,
288
288
  });
289
289
  }
@@ -9,7 +9,7 @@ export class HMSHLSTimedMetadata {
9
9
  constructor(
10
10
  hls: Hls,
11
11
  private videoEl: HTMLVideoElement,
12
- private emit: <E extends HMSHLSPlayerEvents>(
12
+ private emitEvent: <E extends HMSHLSPlayerEvents>(
13
13
  eventName: E,
14
14
  eventObject: Parameters<HMSHLSPlayerListeners<E>>[0],
15
15
  ) => boolean,
@@ -54,7 +54,7 @@ export class HMSHLSTimedMetadata {
54
54
  const duration = new Date(endDate).getTime() - new Date(startDate).getTime();
55
55
  if (timeDiff <= tolerance) {
56
56
  setTimeout(() => {
57
- this.emit(HMSHLSPlayerEvents.TIMED_METADATA_LOADED, {
57
+ this.emitEvent(HMSHLSPlayerEvents.TIMED_METADATA_LOADED, {
58
58
  id: cue?.id,
59
59
  payload: data.payload,
60
60
  duration: duration,
@@ -84,13 +84,13 @@ export class HMSHLSTimedMetadata {
84
84
  /**
85
85
  * Metadata are automatically parsed and added to the video element's
86
86
  * textTrack cue by hlsjs as they come through the stream.
87
- * in FRAG_CHANGED, we read the cues and emit HLS_METADATA_LOADED
87
+ * in FRAG_CHANGED, we read the cues and emitEvent HLS_METADATA_LOADED
88
88
  * when the current fragment has a metadata to play.
89
89
  */
90
90
  fragChangeHandler = (_: any, { frag }: { frag: Fragment }) => {
91
91
  if (!this.videoEl) {
92
92
  const error = HMSHLSErrorFactory.HLSMediaError.videoElementNotFound();
93
- this.emit(HMSHLSPlayerEvents.ERROR, error);
93
+ this.emitEvent(HMSHLSPlayerEvents.ERROR, error);
94
94
  }
95
95
  try {
96
96
  if (this.videoEl.textTracks.length === 0) {
@@ -59,7 +59,7 @@ export class HMSHLSPlayerEventEmitter implements IHMSHLSPlayerEventEmitter {
59
59
  this.eventEmitter.off(eventName, listener);
60
60
  }
61
61
 
62
- emit<E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]): boolean {
62
+ emitEvent<E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]): boolean {
63
63
  return this.eventEmitter.emit(eventName, eventObject, eventName);
64
64
  }
65
65