Home Reference Source

src/events.ts

  1. import {
  2. ManifestLoadedData,
  3. ManifestLoadingData,
  4. MediaAttachedData,
  5. MediaAttachingData,
  6. LevelLoadingData,
  7. LevelLoadedData,
  8. ManifestParsedData,
  9. LevelUpdatedData,
  10. LevelsUpdatedData,
  11. FragParsingUserdataData,
  12. FragDecryptedData,
  13. FragLoadedData,
  14. InitPTSFoundData,
  15. CuesParsedData,
  16. SubtitleFragProcessedData,
  17. NonNativeTextTracksData,
  18. FragLoadingData,
  19. AudioTrackLoadedData,
  20. SubtitleTrackLoadedData,
  21. ErrorData,
  22. AudioTrackSwitchingData,
  23. AudioTrackSwitchedData,
  24. KeyLoadedData,
  25. KeyLoadingData,
  26. SubtitleTrackSwitchData,
  27. SubtitleTracksUpdatedData,
  28. LevelSwitchedData,
  29. FragChangedData,
  30. BufferAppendingData,
  31. BufferCodecsData,
  32. FragParsingMetadataData,
  33. FragParsingInitSegmentData,
  34. FragBufferedData,
  35. BufferFlushingData,
  36. BufferEOSData,
  37. LevelSwitchingData,
  38. FPSDropLevelCappingData,
  39. FPSDropData,
  40. BufferCreatedData,
  41. BufferAppendedData,
  42. LevelPTSUpdatedData,
  43. FragParsedData,
  44. AudioTracksUpdatedData,
  45. FragLoadEmergencyAbortedData,
  46. BackBufferData,
  47. LiveBackBufferData,
  48. TrackLoadingData,
  49. BufferFlushedData,
  50. } from './types/events';
  51.  
  52. /**
  53. * @readonly
  54. * @enum {string}
  55. */
  56. export enum Events {
  57. // Fired before MediaSource is attaching to media element
  58. MEDIA_ATTACHING = 'hlsMediaAttaching',
  59. // Fired when MediaSource has been successfully attached to media element
  60. MEDIA_ATTACHED = 'hlsMediaAttached',
  61. // Fired before detaching MediaSource from media element
  62. MEDIA_DETACHING = 'hlsMediaDetaching',
  63. // Fired when MediaSource has been detached from media element
  64. MEDIA_DETACHED = 'hlsMediaDetached',
  65. // Fired when the buffer is going to be reset
  66. BUFFER_RESET = 'hlsBufferReset',
  67. // Fired when we know about the codecs that we need buffers for to push into - data: {tracks : { container, codec, levelCodec, initSegment, metadata }}
  68. BUFFER_CODECS = 'hlsBufferCodecs',
  69. // fired when sourcebuffers have been created - data: { tracks : tracks }
  70. BUFFER_CREATED = 'hlsBufferCreated',
  71. // fired when we append a segment to the buffer - data: { segment: segment object }
  72. BUFFER_APPENDING = 'hlsBufferAppending',
  73. // fired when we are done with appending a media segment to the buffer - data : { parent : segment parent that triggered BUFFER_APPENDING, pending : nb of segments waiting for appending for this segment parent}
  74. BUFFER_APPENDED = 'hlsBufferAppended',
  75. // fired when the stream is finished and we want to notify the media buffer that there will be no more data - data: { }
  76. BUFFER_EOS = 'hlsBufferEos',
  77. // fired when the media buffer should be flushed - data { startOffset, endOffset }
  78. BUFFER_FLUSHING = 'hlsBufferFlushing',
  79. // fired when the media buffer has been flushed - data: { }
  80. BUFFER_FLUSHED = 'hlsBufferFlushed',
  81. // fired to signal that a manifest loading starts - data: { url : manifestURL}
  82. MANIFEST_LOADING = 'hlsManifestLoading',
  83. // fired after manifest has been loaded - data: { levels : [available quality levels], audioTracks : [ available audio tracks ], url : manifestURL, stats : LoaderStats }
  84. MANIFEST_LOADED = 'hlsManifestLoaded',
  85. // fired after manifest has been parsed - data: { levels : [available quality levels], firstLevel : index of first quality level appearing in Manifest}
  86. MANIFEST_PARSED = 'hlsManifestParsed',
  87. // fired when a level switch is requested - data: { level : id of new level }
  88. LEVEL_SWITCHING = 'hlsLevelSwitching',
  89. // fired when a level switch is effective - data: { level : id of new level }
  90. LEVEL_SWITCHED = 'hlsLevelSwitched',
  91. // fired when a level playlist loading starts - data: { url : level URL, level : id of level being loaded}
  92. LEVEL_LOADING = 'hlsLevelLoading',
  93. // fired when a level playlist loading finishes - data: { details : levelDetails object, level : id of loaded level, stats : LoaderStats }
  94. LEVEL_LOADED = 'hlsLevelLoaded',
  95. // fired when a level's details have been updated based on previous details, after it has been loaded - data: { details : levelDetails object, level : id of updated level }
  96. LEVEL_UPDATED = 'hlsLevelUpdated',
  97. // fired when a level's PTS information has been updated after parsing a fragment - data: { details : levelDetails object, level : id of updated level, drift: PTS drift observed when parsing last fragment }
  98. LEVEL_PTS_UPDATED = 'hlsLevelPtsUpdated',
  99. // fired to notify that levels have changed after removing a level - data: { levels : [available quality levels] }
  100. LEVELS_UPDATED = 'hlsLevelsUpdated',
  101. // fired to notify that audio track lists has been updated - data: { audioTracks : audioTracks }
  102. AUDIO_TRACKS_UPDATED = 'hlsAudioTracksUpdated',
  103. // fired when an audio track switching is requested - data: { id : audio track id }
  104. AUDIO_TRACK_SWITCHING = 'hlsAudioTrackSwitching',
  105. // fired when an audio track switch actually occurs - data: { id : audio track id }
  106. AUDIO_TRACK_SWITCHED = 'hlsAudioTrackSwitched',
  107. // fired when an audio track loading starts - data: { url : audio track URL, id : audio track id }
  108. AUDIO_TRACK_LOADING = 'hlsAudioTrackLoading',
  109. // fired when an audio track loading finishes - data: { details : levelDetails object, id : audio track id, stats : LoaderStats }
  110. AUDIO_TRACK_LOADED = 'hlsAudioTrackLoaded',
  111. // fired to notify that subtitle track lists has been updated - data: { subtitleTracks : subtitleTracks }
  112. SUBTITLE_TRACKS_UPDATED = 'hlsSubtitleTracksUpdated',
  113. // fired to notify that subtitle tracks were cleared as a result of stopping the media
  114. SUBTITLE_TRACKS_CLEARED = 'hlsSubtitleTracksCleared',
  115. // fired when an subtitle track switch occurs - data: { id : subtitle track id }
  116. SUBTITLE_TRACK_SWITCH = 'hlsSubtitleTrackSwitch',
  117. // fired when a subtitle track loading starts - data: { url : subtitle track URL, id : subtitle track id }
  118. SUBTITLE_TRACK_LOADING = 'hlsSubtitleTrackLoading',
  119. // fired when a subtitle track loading finishes - data: { details : levelDetails object, id : subtitle track id, stats : LoaderStats }
  120. SUBTITLE_TRACK_LOADED = 'hlsSubtitleTrackLoaded',
  121. // fired when a subtitle fragment has been processed - data: { success : boolean, frag : the processed frag }
  122. SUBTITLE_FRAG_PROCESSED = 'hlsSubtitleFragProcessed',
  123. // fired when a set of VTTCues to be managed externally has been parsed - data: { type: string, track: string, cues: [ VTTCue ] }
  124. CUES_PARSED = 'hlsCuesParsed',
  125. // fired when a text track to be managed externally is found - data: { tracks: [ { label: string, kind: string, default: boolean } ] }
  126. NON_NATIVE_TEXT_TRACKS_FOUND = 'hlsNonNativeTextTracksFound',
  127. // fired when the first timestamp is found - data: { id : demuxer id, initPTS: initPTS, timescale: timescale, frag : fragment object }
  128. INIT_PTS_FOUND = 'hlsInitPtsFound',
  129. // fired when a fragment loading starts - data: { frag : fragment object }
  130. FRAG_LOADING = 'hlsFragLoading',
  131. // fired when a fragment loading is progressing - data: { frag : fragment object, { trequest, tfirst, loaded } }
  132. // FRAG_LOAD_PROGRESS = 'hlsFragLoadProgress',
  133. // Identifier for fragment load aborting for emergency switch down - data: { frag : fragment object }
  134. FRAG_LOAD_EMERGENCY_ABORTED = 'hlsFragLoadEmergencyAborted',
  135. // fired when a fragment loading is completed - data: { frag : fragment object, payload : fragment payload, stats : LoaderStats }
  136. FRAG_LOADED = 'hlsFragLoaded',
  137. // fired when a fragment has finished decrypting - data: { id : demuxer id, frag: fragment object, payload : fragment payload, stats : { tstart, tdecrypt } }
  138. FRAG_DECRYPTED = 'hlsFragDecrypted',
  139. // fired when Init Segment has been extracted from fragment - data: { id : demuxer id, frag: fragment object, moov : moov MP4 box, codecs : codecs found while parsing fragment }
  140. FRAG_PARSING_INIT_SEGMENT = 'hlsFragParsingInitSegment',
  141. // fired when parsing sei text is completed - data: { id : demuxer id, frag: fragment object, samples : [ sei samples pes ] }
  142. FRAG_PARSING_USERDATA = 'hlsFragParsingUserdata',
  143. // fired when parsing id3 is completed - data: { id : demuxer id, frag: fragment object, samples : [ id3 samples pes ] }
  144. FRAG_PARSING_METADATA = 'hlsFragParsingMetadata',
  145. // fired when data have been extracted from fragment - data: { id : demuxer id, frag: fragment object, data1 : moof MP4 box or TS fragments, data2 : mdat MP4 box or null}
  146. // FRAG_PARSING_DATA = 'hlsFragParsingData',
  147. // fired when fragment parsing is completed - data: { id : demuxer id, frag: fragment object }
  148. FRAG_PARSED = 'hlsFragParsed',
  149. // fired when fragment remuxed MP4 boxes have all been appended into SourceBuffer - data: { id : demuxer id, frag : fragment object, stats : LoaderStats }
  150. FRAG_BUFFERED = 'hlsFragBuffered',
  151. // fired when fragment matching with current media position is changing - data : { id : demuxer id, frag : fragment object }
  152. FRAG_CHANGED = 'hlsFragChanged',
  153. // Identifier for a FPS drop event - data: { currentDropped, currentDecoded, totalDroppedFrames }
  154. FPS_DROP = 'hlsFpsDrop',
  155. // triggered when FPS drop triggers auto level capping - data: { level, droppedLevel }
  156. FPS_DROP_LEVEL_CAPPING = 'hlsFpsDropLevelCapping',
  157. // Identifier for an error event - data: { type : error type, details : error details, fatal : if true, hls.js cannot/will not try to recover, if false, hls.js will try to recover,other error specific data }
  158. ERROR = 'hlsError',
  159. // fired when hls.js instance starts destroying. Different from MEDIA_DETACHED as one could want to detach and reattach a media to the instance of hls.js to handle mid-rolls for example - data: { }
  160. DESTROYING = 'hlsDestroying',
  161. // fired when a decrypt key loading starts - data: { frag : fragment object }
  162. KEY_LOADING = 'hlsKeyLoading',
  163. // fired when a decrypt key loading is completed - data: { frag : fragment object, payload : key payload, stats : LoaderStats }
  164. KEY_LOADED = 'hlsKeyLoaded',
  165. // deprecated; please use BACK_BUFFER_REACHED - data : { bufferEnd: number }
  166. LIVE_BACK_BUFFER_REACHED = 'hlsLiveBackBufferReached',
  167. // fired when the back buffer is reached as defined by the backBufferLength config option - data : { bufferEnd: number }
  168. BACK_BUFFER_REACHED = 'hlsBackBufferReached',
  169. }
  170.  
  171. export interface HlsListeners {
  172. [Events.MEDIA_ATTACHING]: (
  173. event: Events.MEDIA_ATTACHING,
  174. data: MediaAttachingData
  175. ) => void;
  176. [Events.MEDIA_ATTACHED]: (
  177. event: Events.MEDIA_ATTACHED,
  178. data: MediaAttachedData
  179. ) => void;
  180. [Events.MEDIA_DETACHING]: (event: Events.MEDIA_DETACHING) => void;
  181. [Events.MEDIA_DETACHED]: (event: Events.MEDIA_DETACHED) => void;
  182. [Events.BUFFER_RESET]: (event: Events.BUFFER_RESET) => void;
  183. [Events.BUFFER_CODECS]: (
  184. event: Events.BUFFER_CODECS,
  185. data: BufferCodecsData
  186. ) => void;
  187. [Events.BUFFER_CREATED]: (
  188. event: Events.BUFFER_CREATED,
  189. data: BufferCreatedData
  190. ) => void;
  191. [Events.BUFFER_APPENDING]: (
  192. event: Events.BUFFER_APPENDING,
  193. data: BufferAppendingData
  194. ) => void;
  195. [Events.BUFFER_APPENDED]: (
  196. event: Events.BUFFER_APPENDED,
  197. data: BufferAppendedData
  198. ) => void;
  199. [Events.BUFFER_EOS]: (event: Events.BUFFER_EOS, data: BufferEOSData) => void;
  200. [Events.BUFFER_FLUSHING]: (
  201. event: Events.BUFFER_FLUSHING,
  202. data: BufferFlushingData
  203. ) => void;
  204. [Events.BUFFER_FLUSHED]: (
  205. event: Events.BUFFER_FLUSHED,
  206. data: BufferFlushedData
  207. ) => void;
  208. [Events.MANIFEST_LOADING]: (
  209. event: Events.MANIFEST_LOADING,
  210. data: ManifestLoadingData
  211. ) => void;
  212. [Events.MANIFEST_LOADED]: (
  213. event: Events.MANIFEST_LOADED,
  214. data: ManifestLoadedData
  215. ) => void;
  216. [Events.MANIFEST_PARSED]: (
  217. event: Events.MANIFEST_PARSED,
  218. data: ManifestParsedData
  219. ) => void;
  220. [Events.LEVEL_SWITCHING]: (
  221. event: Events.LEVEL_SWITCHING,
  222. data: LevelSwitchingData
  223. ) => void;
  224. [Events.LEVEL_SWITCHED]: (
  225. event: Events.LEVEL_SWITCHED,
  226. data: LevelSwitchedData
  227. ) => void;
  228. [Events.LEVEL_LOADING]: (
  229. event: Events.LEVEL_LOADING,
  230. data: LevelLoadingData
  231. ) => void;
  232. [Events.LEVEL_LOADED]: (
  233. event: Events.LEVEL_LOADED,
  234. data: LevelLoadedData
  235. ) => void;
  236. [Events.LEVEL_UPDATED]: (
  237. event: Events.LEVEL_UPDATED,
  238. data: LevelUpdatedData
  239. ) => void;
  240. [Events.LEVEL_PTS_UPDATED]: (
  241. event: Events.LEVEL_PTS_UPDATED,
  242. data: LevelPTSUpdatedData
  243. ) => void;
  244. [Events.LEVELS_UPDATED]: (
  245. event: Events.LEVELS_UPDATED,
  246. data: LevelsUpdatedData
  247. ) => void;
  248. [Events.AUDIO_TRACKS_UPDATED]: (
  249. event: Events.AUDIO_TRACKS_UPDATED,
  250. data: AudioTracksUpdatedData
  251. ) => void;
  252. [Events.AUDIO_TRACK_SWITCHING]: (
  253. event: Events.AUDIO_TRACK_SWITCHING,
  254. data: AudioTrackSwitchingData
  255. ) => void;
  256. [Events.AUDIO_TRACK_SWITCHED]: (
  257. event: Events.AUDIO_TRACK_SWITCHED,
  258. data: AudioTrackSwitchedData
  259. ) => void;
  260. [Events.AUDIO_TRACK_LOADING]: (
  261. event: Events.AUDIO_TRACK_LOADING,
  262. data: TrackLoadingData
  263. ) => void;
  264. [Events.AUDIO_TRACK_LOADED]: (
  265. event: Events.AUDIO_TRACK_LOADED,
  266. data: AudioTrackLoadedData
  267. ) => void;
  268. [Events.SUBTITLE_TRACKS_UPDATED]: (
  269. event: Events.SUBTITLE_TRACKS_UPDATED,
  270. data: SubtitleTracksUpdatedData
  271. ) => void;
  272. [Events.SUBTITLE_TRACKS_CLEARED]: (
  273. event: Events.SUBTITLE_TRACKS_CLEARED
  274. ) => void;
  275. [Events.SUBTITLE_TRACK_SWITCH]: (
  276. event: Events.SUBTITLE_TRACK_SWITCH,
  277. data: SubtitleTrackSwitchData
  278. ) => void;
  279. [Events.SUBTITLE_TRACK_LOADING]: (
  280. event: Events.SUBTITLE_TRACK_LOADING,
  281. data: TrackLoadingData
  282. ) => void;
  283. [Events.SUBTITLE_TRACK_LOADED]: (
  284. event: Events.SUBTITLE_TRACK_LOADED,
  285. data: SubtitleTrackLoadedData
  286. ) => void;
  287. [Events.SUBTITLE_FRAG_PROCESSED]: (
  288. event: Events.SUBTITLE_FRAG_PROCESSED,
  289. data: SubtitleFragProcessedData
  290. ) => void;
  291. [Events.CUES_PARSED]: (
  292. event: Events.CUES_PARSED,
  293. data: CuesParsedData
  294. ) => void;
  295. [Events.NON_NATIVE_TEXT_TRACKS_FOUND]: (
  296. event: Events.NON_NATIVE_TEXT_TRACKS_FOUND,
  297. data: NonNativeTextTracksData
  298. ) => void;
  299. [Events.INIT_PTS_FOUND]: (
  300. event: Events.INIT_PTS_FOUND,
  301. data: InitPTSFoundData
  302. ) => void;
  303. [Events.FRAG_LOADING]: (
  304. event: Events.FRAG_LOADING,
  305. data: FragLoadingData
  306. ) => void;
  307. // [Events.FRAG_LOAD_PROGRESS]: TodoEventType
  308. [Events.FRAG_LOAD_EMERGENCY_ABORTED]: (
  309. event: Events.FRAG_LOAD_EMERGENCY_ABORTED,
  310. data: FragLoadEmergencyAbortedData
  311. ) => void;
  312. [Events.FRAG_LOADED]: (
  313. event: Events.FRAG_LOADED,
  314. data: FragLoadedData
  315. ) => void;
  316. [Events.FRAG_DECRYPTED]: (
  317. event: Events.FRAG_DECRYPTED,
  318. data: FragDecryptedData
  319. ) => void;
  320. [Events.FRAG_PARSING_INIT_SEGMENT]: (
  321. event: Events.FRAG_PARSING_INIT_SEGMENT,
  322. data: FragParsingInitSegmentData
  323. ) => void;
  324. [Events.FRAG_PARSING_USERDATA]: (
  325. event: Events.FRAG_PARSING_USERDATA,
  326. data: FragParsingUserdataData
  327. ) => void;
  328. [Events.FRAG_PARSING_METADATA]: (
  329. event: Events.FRAG_PARSING_METADATA,
  330. data: FragParsingMetadataData
  331. ) => void;
  332. // [Events.FRAG_PARSING_DATA]: TodoEventType
  333. [Events.FRAG_PARSED]: (
  334. event: Events.FRAG_PARSED,
  335. data: FragParsedData
  336. ) => void;
  337. [Events.FRAG_BUFFERED]: (
  338. event: Events.FRAG_BUFFERED,
  339. data: FragBufferedData
  340. ) => void;
  341. [Events.FRAG_CHANGED]: (
  342. event: Events.FRAG_CHANGED,
  343. data: FragChangedData
  344. ) => void;
  345. [Events.FPS_DROP]: (event: Events.FPS_DROP, data: FPSDropData) => void;
  346. [Events.FPS_DROP_LEVEL_CAPPING]: (
  347. event: Events.FPS_DROP_LEVEL_CAPPING,
  348. data: FPSDropLevelCappingData
  349. ) => void;
  350. [Events.ERROR]: (event: Events.ERROR, data: ErrorData) => void;
  351. [Events.DESTROYING]: (event: Events.DESTROYING) => void;
  352. [Events.KEY_LOADING]: (
  353. event: Events.KEY_LOADING,
  354. data: KeyLoadingData
  355. ) => void;
  356. [Events.KEY_LOADED]: (event: Events.KEY_LOADED, data: KeyLoadedData) => void;
  357. [Events.LIVE_BACK_BUFFER_REACHED]: (
  358. event: Events.LIVE_BACK_BUFFER_REACHED,
  359. data: LiveBackBufferData
  360. ) => void;
  361. [Events.BACK_BUFFER_REACHED]: (
  362. event: Events.BACK_BUFFER_REACHED,
  363. data: BackBufferData
  364. ) => void;
  365. }
  366. export interface HlsEventEmitter {
  367. on<E extends keyof HlsListeners, Context = undefined>(
  368. event: E,
  369. listener: HlsListeners[E],
  370. context?: Context
  371. ): void;
  372. once<E extends keyof HlsListeners, Context = undefined>(
  373. event: E,
  374. listener: HlsListeners[E],
  375. context?: Context
  376. ): void;
  377.  
  378. removeAllListeners<E extends keyof HlsListeners>(event?: E): void;
  379. off<E extends keyof HlsListeners, Context = undefined>(
  380. event: E,
  381. listener?: HlsListeners[E],
  382. context?: Context,
  383. once?: boolean
  384. ): void;
  385.  
  386. listeners<E extends keyof HlsListeners>(event: E): HlsListeners[E][];
  387. emit<E extends keyof HlsListeners>(
  388. event: E,
  389. name: E,
  390. eventObject: Parameters<HlsListeners[E]>[1]
  391. ): boolean;
  392. listenerCount<E extends keyof HlsListeners>(event: E): number;
  393. }