@100mslive/hls-player 0.0.1-alpha.2 → 0.1.0

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.
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ `@100mslive/hls-player` is currently a wrapper on hls.js with easy to use interface and few add-ons for [100ms's interactive live streaming feature](https://www.100ms.live/docs/javascript/v2/how--to-guides/record-and-live-stream/hls/hls).
2
+
3
+ Sample usage:
4
+
5
+ ```
6
+ import {
7
+ HLSPlaybackState,
8
+ } from "@100mslive/hls-player";
9
+
10
+ // hlsUrl is the url in which the hls stream is ongoing
11
+ // videoElement is the video element where you want to play the stream
12
+ const player = new HMSHLSPlayer(hlsUrl, videoElement);
13
+ player.play()
14
+
15
+ ```
16
+
17
+ More details to be added soon.
@@ -1,7 +1,7 @@
1
1
  import { HlsPlayerStats } from '@100mslive/hls-stats';
2
2
  import { HMSHLSPlayerListeners, IHMSHLSPlayerEventEmitter } from '../interfaces/events';
3
+ import { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';
3
4
  import IHMSHLSPlayer from '../interfaces/IHMSHLSPlayer';
4
- import { ILevel } from '../interfaces/ILevel';
5
5
  import { HMSHLSPlayerEvents } from '../utilies/constants';
6
6
  export declare class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
7
7
  private _hls;
@@ -50,30 +50,13 @@ export declare class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEm
50
50
  "current-time": number;
51
51
  "autoplay-blocked": import("..").HMSHLSException;
52
52
  "manifest-loaded": import("../interfaces/events").HMSHLSManifestLoaded;
53
- "level-updated": import("../interfaces/events").HMSHLSLevelUpdated;
53
+ "layer-updated": import("../interfaces/events").HMSHLSLayerUpdated;
54
54
  }[E]) => boolean;
55
55
  private removeAllListeners;
56
- /**
57
- * get current video volume
58
- */
59
56
  get volume(): number;
60
- /**
61
- * set video volumne
62
- * @param { volume } - define volume in range [1,100]
63
- */
64
57
  setVolume(volume: number): void;
65
- /**
66
- *
67
- * @returns returns a ILevel which represents current
68
- * quality level. -1 if currentlevel is set to "Auto"
69
- */
70
- getCurrentLevel(): ILevel | null;
71
- /**
72
- *
73
- * @param { ILevel } currentLevel - currentLevel we want to
74
- * set the stream to -1 for Auto
75
- */
76
- setCurrentLevel(currentLevel: ILevel): void;
58
+ getLayer(): HMSHLSLayer | null;
59
+ setLayer(layer: HMSHLSLayer): void;
77
60
  /**
78
61
  * set current stream to Live
79
62
  */
@@ -7,7 +7,7 @@ export declare const HMSHLSErrorFactory: {
7
7
  HLSNetworkError: {
8
8
  manifestLoadError(data: HMSHLSErrorDetails): HMSHLSException;
9
9
  manifestParsingError(data: HMSHLSErrorDetails): HMSHLSException;
10
- levelLoadError(data: HMSHLSErrorDetails): HMSHLSException;
10
+ layerLoadError(data: HMSHLSErrorDetails): HMSHLSException;
11
11
  };
12
12
  HLSMediaError: {
13
13
  manifestIncompatibleCodecsError(data: HMSHLSErrorDetails): HMSHLSException;
package/dist/index.cjs.js CHANGED
@@ -1,8 +1,8 @@
1
- var N=Object.create;var p=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var A=r=>p(r,"__esModule",{value:!0});var w=(r,e)=>{A(r);for(var t in e)p(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"&&p(r,i,{get:()=>e[i],enumerable:!(t=C(e,i))||t.enumerable});return r},u=r=>k(A(p(r!=null?N(F(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var c=(r,e,t)=>new Promise((i,o)=>{var v=h=>{try{a(t.next(h))}catch(s){o(s)}},_=h=>{try{a(t.throw(h))}catch(s){o(s)}},a=h=>h.done?i(h.value):Promise.resolve(h.value).then(v,_);a((t=t.apply(r,e)).next())});w(exports,{HLSPlaybackState:()=>S,HMSHLSPlayer:()=>D,HMSHLSPlayerEvents:()=>l});var b=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`{
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`{
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 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.LEVEL_UPDATED="level-updated",s.ERROR="error",s.PLAYBACK_STATE="playback-state",s.STATS="stats"})(l||(l={}));var m;(function(n){n.MANIFEST_LOAD_ERROR="manifest-load-error",n.MANIFEST_PARSING_ERROR="manifest-parsing-error",n.LEVEL_LOAD_ERROR="level-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"})(m||(m={}));var S;(function(t){t[t.playing=0]="playing",t[t.paused=1]="paused"})(S||(S={}));var L={HLSNetworkError:{manifestLoadError(r){return new d(m.MANIFEST_LOAD_ERROR,r.details,"Unable to load manifest file",r.fatal)},manifestParsingError(r){return new d(m.MANIFEST_PARSING_ERROR,r.details,"Unable to parse manifest file",r.fatal)},levelLoadError(r){return new d(m.LEVEL_LOAD_ERROR,r.details,"Unable to load levels",r.fatal)}},HLSMediaError:{manifestIncompatibleCodecsError(r){return new d(m.MANIFEST_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible manifest codecs",r.fatal)},fragDecryptError(r){return new d(m.FRAG_DECRYPT_ERROR,r.details,"Unable to decrypt fragment",r.fatal)},bufferIncompatibleCodecsError(r){return new d(m.BUFFER_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible buffer codecs",r.fatal)},videoElementNotFound(){return new d(m.VIDEO_ELEMENT_NOT_FOUND,"Video element not found","Video element not found",!1)},autoplayFailed(){return new d(m.HLS_AUTOPLAY_FAILED,"Failed to autoplay","Failed to autoplay",!1)},hlsURLNotFound(r){return new d(m.HLS_URL_NOT_FOUND,r||"hls url not found",r||"hls url not found",!0)}},UnknownError:r=>new d(m.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=>H(e)),H=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 _;let i=(_=this.extractMetaTextTrack())==null?void 0:_.cues;if(!i)return;let o=i.length,v=0;for(;v<o;){let a=i[v];if(a.queued)return;let h=P(a.value.data),s=h.start_date,n=h.end_date,M=new Date(s).getTime()-e,g=new Date(n).getTime()-new Date(s).getTime();M<=t&&(setTimeout(()=>{this.emit(l.TIMED_METADATA_LOADED,{id:a==null?void 0:a.id,payload:h.payload,duration:g,startDate:new Date(s),endDate:new Date(n)})},M),a.queued=!0),v++}};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=L.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 I=u(require("eventemitter2")),R=class{constructor(){this.eventEmitter=new I.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 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=()=>c(this,null,function*(){yield this.playVideo()});this.pause=()=>{this.pauseVideo()};this.seekTo=e=>{this._videoEl.currentTime=e};this.playVideo=()=>c(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,L.HLSMediaError.autoplayFailed())}});this.pauseVideo=()=>{this._videoEl.paused||this._videoEl.pause()};this.playEventHandler=()=>{this.emit(l.PLAYBACK_STATE,{state:S.playing})};this.pauseEventHandler=()=>{this.emit(l.PLAYBACK_STATE,{state:S.paused})};this.volumeEventHandler=()=>{this._volume=this._videoEl.volume};this.handleHLSException=(e,t)=>{var v,_;console.error(this.TAG,t);let o={details:((v=t.error)==null?void 0:v.message)||((_=t.err)==null?void 0:_.message)||"",fatal:t.fatal};switch(t.details){case E.default.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR:{let a=L.HLSMediaError.manifestIncompatibleCodecsError(o);this.emit(l.ERROR,a);break}case E.default.ErrorDetails.FRAG_DECRYPT_ERROR:{let a=L.HLSMediaError.fragDecryptError(o);this.emit(l.ERROR,a);break}case E.default.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR:{let a=L.HLSMediaError.bufferIncompatibleCodecsError(o);this.emit(l.ERROR,a);break}case E.default.ErrorDetails.MANIFEST_LOAD_ERROR:{let a=L.HLSNetworkError.manifestLoadError(o);this.emit(l.ERROR,a);break}case E.default.ErrorDetails.MANIFEST_PARSING_ERROR:{let a=L.HLSNetworkError.manifestParsingError(o);this.emit(l.ERROR,a);break}case E.default.ErrorDetails.LEVEL_LOAD_ERROR:{let a=L.HLSNetworkError.levelLoadError(o);this.emit(l.ERROR,a);break}default:{let a=L.UnknownError(o);this.emit(l.ERROR,a);break}}};this.manifestLoadedHandler=(e,{levels:t})=>{let i=O(this.removeAudioLevels(t));this.emit(l.MANIFEST_LOADED,{levels:i})};this.levelUpdatedHandler=(e,{level:t})=>{let i=H(this._hls.levels[t]);this.emit(l.LEVEL_UPDATED,{level:i})};this.handleTimeUpdateListener=e=>{this.emit(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.emit(l.SEEK_POS_BEHIND_LIVE_EDGE,{isLive:this._isLive}))};if(this._hls=new E.default(this.getPlayerConfig()),this._emitter=new R,this._hlsUrl=e,this._videoEl=t||this.createVideoElement(),e){if(!e.endsWith("m3u8"))throw L.HLSMediaError.hlsURLNotFound("Invalid URL, pass m3u8 url")}else throw L.HLSMediaError.hlsURLNotFound();this._hls.loadSource(e),this._hls.attachMedia(this._videoEl),this._isLive=!0,this._volume=this._videoEl.volume*100,this._hlsStats=new b.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}getCurrentLevel(){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?H(i):null}return null}setCurrentLevel(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 c(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 _;(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))}};
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 { ILevel } from './interfaces/ILevel';\nimport { HLSPlaybackState, HMSHLSPlayerEvents } from './utilies/constants';\nexport type { ILevel, 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 IHMSHLSPlayer from '../interfaces/IHMSHLSPlayer';\nimport { ILevel } from '../interfaces/ILevel';\nimport { HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY, HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';\nimport { mapLevel, mapLevels } 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 * @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 * get current video volume\n */\n public get volume(): number {\n return this._volume;\n }\n /**\n * set video volumne\n * @param { volume } - define volume in range [1,100]\n */\n setVolume(volume: number) {\n this._videoEl.volume = volume / 100;\n this._volume = volume;\n }\n /**\n *\n * @returns returns a ILevel which represents current\n * quality level. -1 if currentlevel is set to \"Auto\"\n */\n getCurrentLevel(): ILevel | null {\n if (this._hls && this._hls.currentLevel !== -1) {\n const currentLevel = this._hls?.levels.at(this._hls?.currentLevel);\n return currentLevel ? mapLevel(currentLevel) : null;\n }\n return null;\n }\n\n /**\n *\n * @param { ILevel } currentLevel - currentLevel we want to\n * set the stream to -1 for Auto\n */\n setCurrentLevel(currentLevel: ILevel) {\n if (this._hls) {\n const current = this._hls.levels.findIndex((level: Level) => {\n return level?.attrs?.RESOLUTION === currentLevel?.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.levelLoadError(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 level: ILevel[] = mapLevels(this.removeAudioLevels(levels));\n this.emit(HMSHLSPlayerEvents.MANIFEST_LOADED, {\n levels: level,\n });\n };\n private levelUpdatedHandler = (_: any, { level }: { level: number }) => {\n const qualityLevel: ILevel = mapLevel(this._hls.levels[level]);\n this.emit(HMSHLSPlayerEvents.LEVEL_UPDATED, {\n level: qualityLevel,\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 LEVEL_UPDATED = 'level-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 LEVEL_LOAD_ERROR = 'level-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 levelLoadError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.LEVEL_LOAD_ERROR,\n data.details,\n 'Unable to load levels',\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 { ILevel } from '../interfaces/ILevel';\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 ILevel[]\n */\nexport const mapLevels = (qualityLevel: Level[] | LevelParsed[]): ILevel[] => {\n return qualityLevel.map((level: Level | LevelParsed) => mapLevel(level));\n};\n\n/**\n * map Level[] to ILevel[]\n */\nexport const mapLevel = (qualityLevel: Level | LevelParsed): ILevel => {\n return {\n resolution: qualityLevel.attrs?.RESOLUTION,\n bitrate: qualityLevel.bitrate,\n height: qualityLevel.height,\n id: qualityLevel.id,\n url: qualityLevel.url[0],\n width: qualityLevel.width,\n };\n};\n", "import { HlsPlayerStats } from '@100mslive/hls-stats';\nimport { EventEmitter2 as EventEmitter } from 'eventemitter2';\nimport { ILevel } from './ILevel';\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.LEVEL_UPDATED]: HMSHLSLevelUpdated;\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 levels: ILevel[];\n}\nexport interface HMSHLSLevelUpdated {\n level: ILevel;\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.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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",
6
6
  "names": []
7
7
  }
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { HlsPlayerStats } from '@100mslive/hls-stats';
2
2
  import { HMSHLSPlayer } from './controllers/HMSHLSPlayer';
3
3
  import { HMSHLSException } from './error/HMSHLSException';
4
- import { ILevel } from './interfaces/ILevel';
4
+ import { HMSHLSLayer } from './interfaces/IHMSHLSLayer';
5
5
  import { HLSPlaybackState, HMSHLSPlayerEvents } from './utilies/constants';
6
- export type { ILevel, HMSHLSException, HlsPlayerStats };
6
+ export type { HMSHLSLayer, HMSHLSException, HlsPlayerStats };
7
7
  export { HMSHLSPlayer, HLSPlaybackState, HMSHLSPlayerEvents };
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- var p=(r,e,t)=>new Promise((i,o)=>{var v=h=>{try{a(t.next(h))}catch(s){o(s)}},_=h=>{try{a(t.throw(h))}catch(s){o(s)}},a=h=>h.done?i(h.value):Promise.resolve(h.value).then(v,_);a((t=t.apply(r,e)).next())});import{HlsStats as O}from"@100mslive/hls-stats";import E from"hls.js";import c 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 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`{
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 R=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.LEVEL_UPDATED="level-updated",s.ERROR="error",s.PLAYBACK_STATE="playback-state",s.STATS="stats"})(l||(l={}));var m;(function(n){n.MANIFEST_LOAD_ERROR="manifest-load-error",n.MANIFEST_PARSING_ERROR="manifest-parsing-error",n.LEVEL_LOAD_ERROR="level-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"})(m||(m={}));var S;(function(t){t[t.playing=0]="playing",t[t.paused=1]="paused"})(S||(S={}));var L={HLSNetworkError:{manifestLoadError(r){return new d(m.MANIFEST_LOAD_ERROR,r.details,"Unable to load manifest file",r.fatal)},manifestParsingError(r){return new d(m.MANIFEST_PARSING_ERROR,r.details,"Unable to parse manifest file",r.fatal)},levelLoadError(r){return new d(m.LEVEL_LOAD_ERROR,r.details,"Unable to load levels",r.fatal)}},HLSMediaError:{manifestIncompatibleCodecsError(r){return new d(m.MANIFEST_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible manifest codecs",r.fatal)},fragDecryptError(r){return new d(m.FRAG_DECRYPT_ERROR,r.details,"Unable to decrypt fragment",r.fatal)},bufferIncompatibleCodecsError(r){return new d(m.BUFFER_INCOMPATIBLE_CODECS_ERROR,r.details,"Incompatible buffer codecs",r.fatal)},videoElementNotFound(){return new d(m.VIDEO_ELEMENT_NOT_FOUND,"Video element not found","Video element not found",!1)},autoplayFailed(){return new d(m.HLS_AUTOPLAY_FAILED,"Failed to autoplay","Failed to autoplay",!1)},hlsURLNotFound(r){return new d(m.HLS_URL_NOT_FOUND,r||"hls url not found",r||"hls url not found",!0)}},UnknownError:r=>new d(m.UNKNOWN_ERROR,r.details,"Unknown error",r.fatal)};var D=r=>{try{let e=window==null?void 0:window.atob(r);return JSON.parse(e)}catch(e){return{payload:r}}},M=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 H=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 _;let i=(_=this.extractMetaTextTrack())==null?void 0:_.cues;if(!i)return;let o=i.length,v=0;for(;v<o;){let a=i[v];if(a.queued)return;let h=D(a.value.data),s=h.start_date,n=h.end_date,T=new Date(s).getTime()-e,y=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:y,startDate:new Date(s),endDate:new Date(n)})},T),a.queued=!0),v++}};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=L.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=()=>{c.isSupported()?this.hls.on(c.Events.FRAG_CHANGED,this.fragChangeHandler):this.videoEl.canPlayType("application/vnd.apple.mpegurl")&&this.videoEl.addEventListener("timeupdate",this.handleTimeUpdateListener)};this.unregisterListener=()=>{this.hls.off(c.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 A=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=()=>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.emit(l.AUTOPLAY_BLOCKED,L.HLSMediaError.autoplayFailed())}});this.pauseVideo=()=>{this._videoEl.paused||this._videoEl.pause()};this.playEventHandler=()=>{this.emit(l.PLAYBACK_STATE,{state:S.playing})};this.pauseEventHandler=()=>{this.emit(l.PLAYBACK_STATE,{state:S.paused})};this.volumeEventHandler=()=>{this._volume=this._videoEl.volume};this.handleHLSException=(e,t)=>{var v,_;console.error(this.TAG,t);let o={details:((v=t.error)==null?void 0:v.message)||((_=t.err)==null?void 0:_.message)||"",fatal:t.fatal};switch(t.details){case E.ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR:{let a=L.HLSMediaError.manifestIncompatibleCodecsError(o);this.emit(l.ERROR,a);break}case E.ErrorDetails.FRAG_DECRYPT_ERROR:{let a=L.HLSMediaError.fragDecryptError(o);this.emit(l.ERROR,a);break}case E.ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR:{let a=L.HLSMediaError.bufferIncompatibleCodecsError(o);this.emit(l.ERROR,a);break}case E.ErrorDetails.MANIFEST_LOAD_ERROR:{let a=L.HLSNetworkError.manifestLoadError(o);this.emit(l.ERROR,a);break}case E.ErrorDetails.MANIFEST_PARSING_ERROR:{let a=L.HLSNetworkError.manifestParsingError(o);this.emit(l.ERROR,a);break}case E.ErrorDetails.LEVEL_LOAD_ERROR:{let a=L.HLSNetworkError.levelLoadError(o);this.emit(l.ERROR,a);break}default:{let a=L.UnknownError(o);this.emit(l.ERROR,a);break}}};this.manifestLoadedHandler=(e,{levels:t})=>{let i=M(this.removeAudioLevels(t));this.emit(l.MANIFEST_LOADED,{levels:i})};this.levelUpdatedHandler=(e,{level:t})=>{let i=u(this._hls.levels[t]);this.emit(l.LEVEL_UPDATED,{level:i})};this.handleTimeUpdateListener=e=>{this.emit(l.CURRENT_TIME,this._videoEl.currentTime);let t=this._hls.liveSyncPosition?this._hls.liveSyncPosition-this._videoEl.currentTime<=R:!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 L.HLSMediaError.hlsURLNotFound("Invalid URL, pass m3u8 url")}else throw L.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 H(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}getCurrentLevel(){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}setCurrentLevel(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.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{S as HLSPlaybackState,A as HMSHLSPlayer,l as HMSHLSPlayerEvents};
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};
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 IHMSHLSPlayer from '../interfaces/IHMSHLSPlayer';\nimport { ILevel } from '../interfaces/ILevel';\nimport { HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY, HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';\nimport { mapLevel, mapLevels } 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 * @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 * get current video volume\n */\n public get volume(): number {\n return this._volume;\n }\n /**\n * set video volumne\n * @param { volume } - define volume in range [1,100]\n */\n setVolume(volume: number) {\n this._videoEl.volume = volume / 100;\n this._volume = volume;\n }\n /**\n *\n * @returns returns a ILevel which represents current\n * quality level. -1 if currentlevel is set to \"Auto\"\n */\n getCurrentLevel(): ILevel | null {\n if (this._hls && this._hls.currentLevel !== -1) {\n const currentLevel = this._hls?.levels.at(this._hls?.currentLevel);\n return currentLevel ? mapLevel(currentLevel) : null;\n }\n return null;\n }\n\n /**\n *\n * @param { ILevel } currentLevel - currentLevel we want to\n * set the stream to -1 for Auto\n */\n setCurrentLevel(currentLevel: ILevel) {\n if (this._hls) {\n const current = this._hls.levels.findIndex((level: Level) => {\n return level?.attrs?.RESOLUTION === currentLevel?.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.levelLoadError(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 level: ILevel[] = mapLevels(this.removeAudioLevels(levels));\n this.emit(HMSHLSPlayerEvents.MANIFEST_LOADED, {\n levels: level,\n });\n };\n private levelUpdatedHandler = (_: any, { level }: { level: number }) => {\n const qualityLevel: ILevel = mapLevel(this._hls.levels[level]);\n this.emit(HMSHLSPlayerEvents.LEVEL_UPDATED, {\n level: qualityLevel,\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 LEVEL_UPDATED = 'level-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 LEVEL_LOAD_ERROR = 'level-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 levelLoadError(data: HMSHLSErrorDetails): HMSHLSException {\n return new HMSHLSException(\n HMSHLSExceptionEvents.LEVEL_LOAD_ERROR,\n data.details,\n 'Unable to load levels',\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 { ILevel } from '../interfaces/ILevel';\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 ILevel[]\n */\nexport const mapLevels = (qualityLevel: Level[] | LevelParsed[]): ILevel[] => {\n return qualityLevel.map((level: Level | LevelParsed) => mapLevel(level));\n};\n\n/**\n * map Level[] to ILevel[]\n */\nexport const mapLevel = (qualityLevel: Level | LevelParsed): ILevel => {\n return {\n resolution: qualityLevel.attrs?.RESOLUTION,\n bitrate: qualityLevel.bitrate,\n height: qualityLevel.height,\n id: qualityLevel.id,\n url: qualityLevel.url[0],\n width: qualityLevel.width,\n };\n};\n", "import { HlsPlayerStats } from '@100mslive/hls-stats';\nimport { EventEmitter2 as EventEmitter } from 'eventemitter2';\nimport { ILevel } from './ILevel';\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.LEVEL_UPDATED]: HMSHLSLevelUpdated;\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 levels: ILevel[];\n}\nexport interface HMSHLSLevelUpdated {\n level: ILevel;\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.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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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import { LevelParsed } from 'hls.js';
2
- export declare interface ILevel extends Partial<LevelParsed> {
2
+ export declare interface HMSHLSLayer extends Partial<LevelParsed> {
3
3
  readonly bitrate: number;
4
4
  readonly height?: number;
5
5
  readonly id?: number;
@@ -1,4 +1,4 @@
1
- import { ILevel } from './ILevel';
1
+ import { HMSHLSLayer } from './IHMSHLSLayer';
2
2
  interface IHMSHLSPlayer {
3
3
  /**
4
4
  * @returns get html video element
@@ -6,21 +6,21 @@ interface IHMSHLSPlayer {
6
6
  getVideoElement(): HTMLVideoElement;
7
7
  /**
8
8
  * set video volumne
9
- * @param { volume } - define volume in range [1,100]
9
+ * @param { volume } - in range [0,100]
10
10
  */
11
11
  setVolume(volume: number): void;
12
12
  /**
13
13
  *
14
- * @returns returns a ILevel which represents current
15
- * quality level. -1 if currentlevel is set to "Auto"
14
+ * @returns returns HMSHLSLayer which represents current
15
+ * quality.
16
16
  */
17
- getCurrentLevel(): ILevel | null;
17
+ getLayer(): HMSHLSLayer | null;
18
18
  /**
19
19
  *
20
- * @param { ILevel } currentLevel - currentLevel we want to
21
- * set the stream to. -1 for Auto
20
+ * @param { HMSHLSLayer } layer - layer we want to set the stream to.
21
+ * set { height: auto } to set the layer to auto
22
22
  */
23
- setCurrentLevel(currentLevel: ILevel): void;
23
+ setLayer(layer: HMSHLSLayer): void;
24
24
  /**
25
25
  * move the video to Live
26
26
  */
@@ -1,5 +1,5 @@
1
1
  import { HlsPlayerStats } from '@100mslive/hls-stats';
2
- import { ILevel } from './ILevel';
2
+ import { HMSHLSLayer } from './IHMSHLSLayer';
3
3
  import { HMSHLSException } from '../error/HMSHLSException';
4
4
  import { HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';
5
5
  declare type HMSHLSListenerDataMapping = {
@@ -11,7 +11,7 @@ declare type HMSHLSListenerDataMapping = {
11
11
  [HMSHLSPlayerEvents.CURRENT_TIME]: number;
12
12
  [HMSHLSPlayerEvents.AUTOPLAY_BLOCKED]: HMSHLSException;
13
13
  [HMSHLSPlayerEvents.MANIFEST_LOADED]: HMSHLSManifestLoaded;
14
- [HMSHLSPlayerEvents.LEVEL_UPDATED]: HMSHLSLevelUpdated;
14
+ [HMSHLSPlayerEvents.LAYER_UPDATED]: HMSHLSLayerUpdated;
15
15
  };
16
16
  export declare type HMSHLSPlayerListeners<E extends HMSHLSPlayerEvents> = (data: HMSHLSListenerDataMapping[E], name: E) => void;
17
17
  export interface HMSHLSStreamLive {
@@ -28,10 +28,10 @@ export interface HMSHLSCue {
28
28
  endDate?: Date;
29
29
  }
30
30
  export interface HMSHLSManifestLoaded {
31
- levels: ILevel[];
31
+ layers: HMSHLSLayer[];
32
32
  }
33
- export interface HMSHLSLevelUpdated {
34
- level: ILevel;
33
+ export interface HMSHLSLayerUpdated {
34
+ layer: HMSHLSLayer;
35
35
  }
36
36
  export interface IHMSHLSPlayerEventEmitter {
37
37
  on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void;
@@ -5,7 +5,7 @@ export declare enum HMSHLSPlayerEvents {
5
5
  CURRENT_TIME = "current-time",
6
6
  AUTOPLAY_BLOCKED = "autoplay-blocked",
7
7
  MANIFEST_LOADED = "manifest-loaded",
8
- LEVEL_UPDATED = "level-updated",
8
+ LAYER_UPDATED = "layer-updated",
9
9
  ERROR = "error",
10
10
  PLAYBACK_STATE = "playback-state",
11
11
  STATS = "stats"
@@ -13,7 +13,7 @@ export declare enum HMSHLSPlayerEvents {
13
13
  export declare enum HMSHLSExceptionEvents {
14
14
  MANIFEST_LOAD_ERROR = "manifest-load-error",
15
15
  MANIFEST_PARSING_ERROR = "manifest-parsing-error",
16
- LEVEL_LOAD_ERROR = "level-load-error",
16
+ LAYER_LOAD_ERROR = "layer-load-error",
17
17
  MANIFEST_INCOMPATIBLE_CODECS_ERROR = "manifest-incompatible-codecs-error",
18
18
  FRAG_DECRYPT_ERROR = "frag-decrypt-error",
19
19
  BUFFER_INCOMPATIBLE_CODECS_ERROR = "buffer-incompatible-codecs-error",
@@ -1,5 +1,5 @@
1
1
  import { Level, LevelParsed } from 'hls.js';
2
- import { ILevel } from '../interfaces/ILevel';
2
+ import { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';
3
3
  /**
4
4
  *
5
5
  * @param payload a base64 string coming from backend
@@ -7,10 +7,10 @@ import { ILevel } from '../interfaces/ILevel';
7
7
  */
8
8
  export declare const metadataPayloadParser: (payload: string) => Record<string, any>;
9
9
  /**
10
- * map Level[] to ILevel[]
10
+ * map Level[] to HMSHLSLayer[]
11
11
  */
12
- export declare const mapLevels: (qualityLevel: Level[] | LevelParsed[]) => ILevel[];
12
+ export declare const mapLayers: (levels: Level[] | LevelParsed[]) => HMSHLSLayer[];
13
13
  /**
14
- * map Level[] to ILevel[]
14
+ * map Level[] to HMSHLSLayer[]
15
15
  */
16
- export declare const mapLevel: (qualityLevel: Level | LevelParsed) => ILevel;
16
+ export declare const mapLayer: (quality: Level | LevelParsed) => HMSHLSLayer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@100mslive/hls-player",
3
- "version": "0.0.1-alpha.2",
3
+ "version": "0.1.0",
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,8 +31,9 @@
31
31
  "author": "100ms",
32
32
  "license": "MIT",
33
33
  "dependencies": {
34
- "@100mslive/hls-stats": "0.1.1-alpha.2",
34
+ "@100mslive/hls-stats": "0.2.0",
35
35
  "eventemitter2": "^6.4.7",
36
36
  "hls.js": "^1.3.0"
37
- }
37
+ },
38
+ "gitHead": "b008b67affec32d51602bc041b17a87469461844"
38
39
  }
@@ -3,10 +3,10 @@ import Hls, { ErrorData, HlsConfig, Level, LevelParsed } from 'hls.js';
3
3
  import { HMSHLSTimedMetadata } from './HMSHLSTimedMetadata';
4
4
  import { HMSHLSErrorFactory } from '../error/HMSHLSErrorFactory';
5
5
  import { HMSHLSPlayerEventEmitter, HMSHLSPlayerListeners, IHMSHLSPlayerEventEmitter } from '../interfaces/events';
6
+ import { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';
6
7
  import IHMSHLSPlayer from '../interfaces/IHMSHLSPlayer';
7
- import { ILevel } from '../interfaces/ILevel';
8
8
  import { HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY, HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';
9
- import { mapLevel, mapLevels } from '../utilies/utils';
9
+ import { mapLayer, mapLayers } from '../utilies/utils';
10
10
 
11
11
  export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
12
12
  private _hls: Hls;
@@ -44,6 +44,7 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
44
44
  this._metaData = new HMSHLSTimedMetadata(this._hls, this._videoEl, this.emit);
45
45
  this.seekToLivePosition();
46
46
  }
47
+
47
48
  /**
48
49
  * @remarks It will create a video element with playiniline true.
49
50
  * @returns HTML video element
@@ -121,42 +122,28 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
121
122
  private removeAllListeners = <E extends HMSHLSPlayerEvents>(eventName?: E): void => {
122
123
  this._emitter.removeAllListeners(eventName);
123
124
  };
124
- /**
125
- * get current video volume
126
- */
125
+
127
126
  public get volume(): number {
128
127
  return this._volume;
129
128
  }
130
- /**
131
- * set video volumne
132
- * @param { volume } - define volume in range [1,100]
133
- */
129
+
134
130
  setVolume(volume: number) {
135
131
  this._videoEl.volume = volume / 100;
136
132
  this._volume = volume;
137
133
  }
138
- /**
139
- *
140
- * @returns returns a ILevel which represents current
141
- * quality level. -1 if currentlevel is set to "Auto"
142
- */
143
- getCurrentLevel(): ILevel | null {
134
+
135
+ getLayer(): HMSHLSLayer | null {
144
136
  if (this._hls && this._hls.currentLevel !== -1) {
145
137
  const currentLevel = this._hls?.levels.at(this._hls?.currentLevel);
146
- return currentLevel ? mapLevel(currentLevel) : null;
138
+ return currentLevel ? mapLayer(currentLevel) : null;
147
139
  }
148
140
  return null;
149
141
  }
150
142
 
151
- /**
152
- *
153
- * @param { ILevel } currentLevel - currentLevel we want to
154
- * set the stream to -1 for Auto
155
- */
156
- setCurrentLevel(currentLevel: ILevel) {
143
+ setLayer(layer: HMSHLSLayer): void {
157
144
  if (this._hls) {
158
145
  const current = this._hls.levels.findIndex((level: Level) => {
159
- return level?.attrs?.RESOLUTION === currentLevel?.resolution;
146
+ return level?.attrs?.RESOLUTION === layer?.resolution;
160
147
  });
161
148
  this._hls.currentLevel = current;
162
149
  }
@@ -265,7 +252,7 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
265
252
  break;
266
253
  }
267
254
  case Hls.ErrorDetails.LEVEL_LOAD_ERROR: {
268
- const error = HMSHLSErrorFactory.HLSNetworkError.levelLoadError(detail);
255
+ const error = HMSHLSErrorFactory.HLSNetworkError.layerLoadError(detail);
269
256
  this.emit(HMSHLSPlayerEvents.ERROR, error);
270
257
  break;
271
258
  }
@@ -277,15 +264,15 @@ export class HMSHLSPlayer implements IHMSHLSPlayer, IHMSHLSPlayerEventEmitter {
277
264
  }
278
265
  };
279
266
  private manifestLoadedHandler = (_: any, { levels }: { levels: LevelParsed[] }) => {
280
- const level: ILevel[] = mapLevels(this.removeAudioLevels(levels));
267
+ const layers: HMSHLSLayer[] = mapLayers(this.removeAudioLevels(levels));
281
268
  this.emit(HMSHLSPlayerEvents.MANIFEST_LOADED, {
282
- levels: level,
269
+ layers,
283
270
  });
284
271
  };
285
272
  private levelUpdatedHandler = (_: any, { level }: { level: number }) => {
286
- const qualityLevel: ILevel = mapLevel(this._hls.levels[level]);
287
- this.emit(HMSHLSPlayerEvents.LEVEL_UPDATED, {
288
- level: qualityLevel,
273
+ const qualityLayer: HMSHLSLayer = mapLayer(this._hls.levels[level]);
274
+ this.emit(HMSHLSPlayerEvents.LAYER_UPDATED, {
275
+ layer: qualityLayer,
289
276
  });
290
277
  };
291
278
 
@@ -23,11 +23,11 @@ export const HMSHLSErrorFactory = {
23
23
  data.fatal,
24
24
  );
25
25
  },
26
- levelLoadError(data: HMSHLSErrorDetails): HMSHLSException {
26
+ layerLoadError(data: HMSHLSErrorDetails): HMSHLSException {
27
27
  return new HMSHLSException(
28
- HMSHLSExceptionEvents.LEVEL_LOAD_ERROR,
28
+ HMSHLSExceptionEvents.LAYER_LOAD_ERROR,
29
29
  data.details,
30
- 'Unable to load levels',
30
+ 'Unable to load quality layers',
31
31
  data.fatal,
32
32
  );
33
33
  },
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { HlsPlayerStats } from '@100mslive/hls-stats';
2
2
  import { HMSHLSPlayer } from './controllers/HMSHLSPlayer';
3
3
  import { HMSHLSException } from './error/HMSHLSException';
4
- import { ILevel } from './interfaces/ILevel';
4
+ import { HMSHLSLayer } from './interfaces/IHMSHLSLayer';
5
5
  import { HLSPlaybackState, HMSHLSPlayerEvents } from './utilies/constants';
6
- export type { ILevel, HMSHLSException, HlsPlayerStats };
6
+ export type { HMSHLSLayer, HMSHLSException, HlsPlayerStats };
7
7
  export { HMSHLSPlayer, HLSPlaybackState, HMSHLSPlayerEvents };
@@ -1,6 +1,6 @@
1
1
  import { LevelParsed } from 'hls.js';
2
2
 
3
- export declare interface ILevel extends Partial<LevelParsed> {
3
+ export declare interface HMSHLSLayer extends Partial<LevelParsed> {
4
4
  readonly bitrate: number;
5
5
  readonly height?: number;
6
6
  readonly id?: number;
@@ -1,4 +1,4 @@
1
- import { ILevel } from './ILevel';
1
+ import { HMSHLSLayer } from './IHMSHLSLayer';
2
2
  interface IHMSHLSPlayer {
3
3
  /**
4
4
  * @returns get html video element
@@ -7,21 +7,21 @@ interface IHMSHLSPlayer {
7
7
 
8
8
  /**
9
9
  * set video volumne
10
- * @param { volume } - define volume in range [1,100]
10
+ * @param { volume } - in range [0,100]
11
11
  */
12
12
  setVolume(volume: number): void;
13
13
  /**
14
14
  *
15
- * @returns returns a ILevel which represents current
16
- * quality level. -1 if currentlevel is set to "Auto"
15
+ * @returns returns HMSHLSLayer which represents current
16
+ * quality.
17
17
  */
18
- getCurrentLevel(): ILevel | null;
18
+ getLayer(): HMSHLSLayer | null;
19
19
  /**
20
20
  *
21
- * @param { ILevel } currentLevel - currentLevel we want to
22
- * set the stream to. -1 for Auto
21
+ * @param { HMSHLSLayer } layer - layer we want to set the stream to.
22
+ * set { height: auto } to set the layer to auto
23
23
  */
24
- setCurrentLevel(currentLevel: ILevel): void;
24
+ setLayer(layer: HMSHLSLayer): void;
25
25
  /**
26
26
  * move the video to Live
27
27
  */
@@ -1,6 +1,6 @@
1
1
  import { HlsPlayerStats } from '@100mslive/hls-stats';
2
2
  import { EventEmitter2 as EventEmitter } from 'eventemitter2';
3
- import { ILevel } from './ILevel';
3
+ import { HMSHLSLayer } from './IHMSHLSLayer';
4
4
  import { HMSHLSException } from '../error/HMSHLSException';
5
5
  import { HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';
6
6
 
@@ -15,7 +15,7 @@ type HMSHLSListenerDataMapping = {
15
15
  [HMSHLSPlayerEvents.AUTOPLAY_BLOCKED]: HMSHLSException;
16
16
 
17
17
  [HMSHLSPlayerEvents.MANIFEST_LOADED]: HMSHLSManifestLoaded;
18
- [HMSHLSPlayerEvents.LEVEL_UPDATED]: HMSHLSLevelUpdated;
18
+ [HMSHLSPlayerEvents.LAYER_UPDATED]: HMSHLSLayerUpdated;
19
19
  };
20
20
 
21
21
  export type HMSHLSPlayerListeners<E extends HMSHLSPlayerEvents> = (data: HMSHLSListenerDataMapping[E], name: E) => void;
@@ -35,10 +35,10 @@ export interface HMSHLSCue {
35
35
  }
36
36
 
37
37
  export interface HMSHLSManifestLoaded {
38
- levels: ILevel[];
38
+ layers: HMSHLSLayer[];
39
39
  }
40
- export interface HMSHLSLevelUpdated {
41
- level: ILevel;
40
+ export interface HMSHLSLayerUpdated {
41
+ layer: HMSHLSLayer;
42
42
  }
43
43
  export interface IHMSHLSPlayerEventEmitter {
44
44
  on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void;
@@ -8,7 +8,7 @@ export enum HMSHLSPlayerEvents {
8
8
  AUTOPLAY_BLOCKED = 'autoplay-blocked',
9
9
 
10
10
  MANIFEST_LOADED = 'manifest-loaded',
11
- LEVEL_UPDATED = 'level-updated',
11
+ LAYER_UPDATED = 'layer-updated',
12
12
 
13
13
  ERROR = 'error',
14
14
  PLAYBACK_STATE = 'playback-state',
@@ -18,7 +18,7 @@ export enum HMSHLSPlayerEvents {
18
18
  export enum HMSHLSExceptionEvents {
19
19
  MANIFEST_LOAD_ERROR = 'manifest-load-error',
20
20
  MANIFEST_PARSING_ERROR = 'manifest-parsing-error',
21
- LEVEL_LOAD_ERROR = 'level-load-error',
21
+ LAYER_LOAD_ERROR = 'layer-load-error',
22
22
 
23
23
  MANIFEST_INCOMPATIBLE_CODECS_ERROR = 'manifest-incompatible-codecs-error',
24
24
  FRAG_DECRYPT_ERROR = 'frag-decrypt-error',
@@ -1,5 +1,5 @@
1
1
  import { Level, LevelParsed } from 'hls.js';
2
- import { ILevel } from '../interfaces/ILevel';
2
+ import { HMSHLSLayer } from '../interfaces/IHMSHLSLayer';
3
3
 
4
4
  /**
5
5
  *
@@ -17,22 +17,22 @@ export const metadataPayloadParser = (payload: string): Record<string, any> => {
17
17
  };
18
18
 
19
19
  /**
20
- * map Level[] to ILevel[]
20
+ * map Level[] to HMSHLSLayer[]
21
21
  */
22
- export const mapLevels = (qualityLevel: Level[] | LevelParsed[]): ILevel[] => {
23
- return qualityLevel.map((level: Level | LevelParsed) => mapLevel(level));
22
+ export const mapLayers = (levels: Level[] | LevelParsed[]): HMSHLSLayer[] => {
23
+ return levels.map((level: Level | LevelParsed) => mapLayer(level));
24
24
  };
25
25
 
26
26
  /**
27
- * map Level[] to ILevel[]
27
+ * map Level[] to HMSHLSLayer[]
28
28
  */
29
- export const mapLevel = (qualityLevel: Level | LevelParsed): ILevel => {
29
+ export const mapLayer = (quality: Level | LevelParsed): HMSHLSLayer => {
30
30
  return {
31
- resolution: qualityLevel.attrs?.RESOLUTION,
32
- bitrate: qualityLevel.bitrate,
33
- height: qualityLevel.height,
34
- id: qualityLevel.id,
35
- url: qualityLevel.url[0],
36
- width: qualityLevel.width,
31
+ resolution: quality.attrs?.RESOLUTION,
32
+ bitrate: quality.bitrate,
33
+ height: quality.height,
34
+ id: quality.id,
35
+ url: quality.url[0],
36
+ width: quality.width,
37
37
  };
38
38
  };