@100mslive/hls-player 0.0.1-alpha.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.
@@ -0,0 +1,69 @@
1
+ import { HlsPlayerStats } from '@100mslive/hls-stats';
2
+ import { EventEmitter2 as EventEmitter } from 'eventemitter2';
3
+ import { ILevel } from './ILevel';
4
+ import { HMSHLSException } from '../error/HMSHLSException';
5
+ import { HLSPlaybackState, HMSHLSPlayerEvents } from '../utilies/constants';
6
+
7
+ type HMSHLSListenerDataMapping = {
8
+ [HMSHLSPlayerEvents.SEEK_POS_BEHIND_LIVE_EDGE]: HMSHLSStreamLive;
9
+ [HMSHLSPlayerEvents.TIMED_METADATA_LOADED]: HMSHLSCue;
10
+ [HMSHLSPlayerEvents.STATS]: HlsPlayerStats;
11
+ [HMSHLSPlayerEvents.PLAYBACK_STATE]: HMSHLSPlaybackState;
12
+
13
+ [HMSHLSPlayerEvents.ERROR]: HMSHLSException;
14
+ [HMSHLSPlayerEvents.CURRENT_TIME]: number;
15
+ [HMSHLSPlayerEvents.AUTOPLAY_BLOCKED]: HMSHLSException;
16
+
17
+ [HMSHLSPlayerEvents.MANIFEST_LOADED]: HMSHLSManifestLoaded;
18
+ [HMSHLSPlayerEvents.LEVEL_UPDATED]: HMSHLSLevelUpdated;
19
+ };
20
+
21
+ export type HMSHLSPlayerListeners<E extends HMSHLSPlayerEvents> = (data: HMSHLSListenerDataMapping[E], name: E) => void;
22
+
23
+ export interface HMSHLSStreamLive {
24
+ isLive: boolean;
25
+ }
26
+ export interface HMSHLSPlaybackState {
27
+ state: HLSPlaybackState;
28
+ }
29
+ export interface HMSHLSCue {
30
+ id?: string;
31
+ payload: string;
32
+ duration: number;
33
+ startDate: Date;
34
+ endDate?: Date;
35
+ }
36
+
37
+ export interface HMSHLSManifestLoaded {
38
+ levels: ILevel[];
39
+ }
40
+ export interface HMSHLSLevelUpdated {
41
+ level: ILevel;
42
+ }
43
+ export interface IHMSHLSPlayerEventEmitter {
44
+ on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void;
45
+
46
+ off<E extends HMSHLSPlayerEvents>(eventName: E, listener?: HMSHLSPlayerListeners<E>): void;
47
+ }
48
+
49
+ export class HMSHLSPlayerEventEmitter implements IHMSHLSPlayerEventEmitter {
50
+ private eventEmitter: EventEmitter;
51
+ constructor() {
52
+ this.eventEmitter = new EventEmitter();
53
+ }
54
+ on<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>): void {
55
+ this.eventEmitter.on(eventName, listener);
56
+ }
57
+
58
+ off<E extends HMSHLSPlayerEvents>(eventName: E, listener: HMSHLSPlayerListeners<E>) {
59
+ this.eventEmitter.off(eventName, listener);
60
+ }
61
+
62
+ emit<E extends HMSHLSPlayerEvents>(eventName: E, eventObject: Parameters<HMSHLSPlayerListeners<E>>[0]): boolean {
63
+ return this.eventEmitter.emit(eventName, eventObject, eventName);
64
+ }
65
+
66
+ removeAllListeners<E extends HMSHLSPlayerEvents>(eventName?: E): void {
67
+ this.eventEmitter.removeAllListeners(eventName);
68
+ }
69
+ }
@@ -0,0 +1,36 @@
1
+ export const HLS_DEFAULT_ALLOWED_MAX_LATENCY_DELAY = 5;
2
+
3
+ export enum HMSHLSPlayerEvents {
4
+ TIMED_METADATA_LOADED = 'timed-metadata',
5
+ SEEK_POS_BEHIND_LIVE_EDGE = 'seek-pos-behind-live-edge',
6
+
7
+ CURRENT_TIME = 'current-time',
8
+ AUTOPLAY_BLOCKED = 'autoplay-blocked',
9
+
10
+ MANIFEST_LOADED = 'manifest-loaded',
11
+ LEVEL_UPDATED = 'level-updated',
12
+
13
+ ERROR = 'error',
14
+ PLAYBACK_STATE = 'playback-state',
15
+ STATS = 'stats',
16
+ }
17
+
18
+ export enum HMSHLSExceptionEvents {
19
+ MANIFEST_LOAD_ERROR = 'manifest-load-error',
20
+ MANIFEST_PARSING_ERROR = 'manifest-parsing-error',
21
+ LEVEL_LOAD_ERROR = 'level-load-error',
22
+
23
+ MANIFEST_INCOMPATIBLE_CODECS_ERROR = 'manifest-incompatible-codecs-error',
24
+ FRAG_DECRYPT_ERROR = 'frag-decrypt-error',
25
+ BUFFER_INCOMPATIBLE_CODECS_ERROR = 'buffer-incompatible-codecs-error',
26
+
27
+ VIDEO_ELEMENT_NOT_FOUND = 'video-element-not-found',
28
+ HLS_AUTOPLAY_FAILED = 'hls-autoplay-failed',
29
+ HLS_URL_NOT_FOUND = 'hls-url-not-found',
30
+ UNKNOWN_ERROR = 'unknown-error',
31
+ }
32
+
33
+ export enum HLSPlaybackState {
34
+ playing,
35
+ paused,
36
+ }
@@ -0,0 +1,38 @@
1
+ import { Level, LevelParsed } from 'hls.js';
2
+ import { ILevel } from '../interfaces/ILevel';
3
+
4
+ /**
5
+ *
6
+ * @param payload a base64 string coming from backend
7
+ * @returns a parsed data which contains payload, start_date, end_date, version
8
+ */
9
+ export const metadataPayloadParser = (payload: string): Record<string, any> => {
10
+ try {
11
+ const data = window?.atob(payload);
12
+ const parsedData = JSON.parse(data);
13
+ return parsedData;
14
+ } catch (e) {
15
+ return { payload };
16
+ }
17
+ };
18
+
19
+ /**
20
+ * map Level[] to ILevel[]
21
+ */
22
+ export const mapLevels = (qualityLevel: Level[] | LevelParsed[]): ILevel[] => {
23
+ return qualityLevel.map((level: Level | LevelParsed) => mapLevel(level));
24
+ };
25
+
26
+ /**
27
+ * map Level[] to ILevel[]
28
+ */
29
+ export const mapLevel = (qualityLevel: Level | LevelParsed): ILevel => {
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,
37
+ };
38
+ };