Home Reference Source

src/types/loader.ts

  1. import type { Fragment } from '../loader/fragment';
  2. import type { Part } from '../loader/fragment';
  3. import type { LevelDetails } from '../loader/level-details';
  4. import type { HlsUrlParameters } from './level';
  5.  
  6. export interface LoaderContext {
  7. // target URL
  8. url: string;
  9. // loader response type (arraybuffer or default response type for playlist)
  10. responseType: string;
  11. // start byte range offset
  12. rangeStart?: number;
  13. // end byte range offset
  14. rangeEnd?: number;
  15. // true if onProgress should report partial chunk of loaded content
  16. progressData?: boolean;
  17. }
  18.  
  19. export interface FragmentLoaderContext extends LoaderContext {
  20. frag: Fragment;
  21. part: Part | null;
  22. }
  23.  
  24. export interface LoaderConfiguration {
  25. // Max number of load retries
  26. maxRetry: number;
  27. // Timeout after which `onTimeOut` callback will be triggered
  28. // (if loading is still not finished after that delay)
  29. timeout: number;
  30. // Delay between an I/O error and following connection retry (ms).
  31. // This to avoid spamming the server
  32. retryDelay: number;
  33. // max connection retry delay (ms)
  34. maxRetryDelay: number;
  35. // When streaming progressively, this is the minimum chunk size required to emit a PROGRESS event
  36. highWaterMark: number;
  37. }
  38.  
  39. export interface LoaderResponse {
  40. url: string;
  41. data: string | ArrayBuffer;
  42. }
  43.  
  44. export interface LoaderStats {
  45. aborted: boolean;
  46. loaded: number;
  47. retry: number;
  48. total: number;
  49. chunkCount: number;
  50. bwEstimate: number;
  51. loading: HlsProgressivePerformanceTiming;
  52. parsing: HlsPerformanceTiming;
  53. buffering: HlsProgressivePerformanceTiming;
  54. }
  55.  
  56. export interface HlsPerformanceTiming {
  57. start: number;
  58. end: number;
  59. }
  60.  
  61. export interface HlsChunkPerformanceTiming extends HlsPerformanceTiming {
  62. executeStart: number;
  63. executeEnd: number;
  64. }
  65.  
  66. export interface HlsProgressivePerformanceTiming extends HlsPerformanceTiming {
  67. first: number;
  68. }
  69.  
  70. export type LoaderOnSuccess<T extends LoaderContext> = (
  71. response: LoaderResponse,
  72. stats: LoaderStats,
  73. context: T,
  74. networkDetails: any
  75. ) => void;
  76.  
  77. export type LoaderOnProgress<T extends LoaderContext> = (
  78. stats: LoaderStats,
  79. context: T,
  80. data: string | ArrayBuffer,
  81. networkDetails: any
  82. ) => void;
  83.  
  84. export type LoaderOnError<T extends LoaderContext> = (
  85. error: {
  86. // error status code
  87. code: number;
  88. // error description
  89. text: string;
  90. },
  91. context: T,
  92. networkDetails: any
  93. ) => void;
  94.  
  95. export type LoaderOnTimeout<T extends LoaderContext> = (
  96. stats: LoaderStats,
  97. context: T,
  98. networkDetails: any
  99. ) => void;
  100.  
  101. export type LoaderOnAbort<T extends LoaderContext> = (
  102. stats: LoaderStats,
  103. context: T,
  104. networkDetails: any
  105. ) => void;
  106.  
  107. export interface LoaderCallbacks<T extends LoaderContext> {
  108. onSuccess: LoaderOnSuccess<T>;
  109. onError: LoaderOnError<T>;
  110. onTimeout: LoaderOnTimeout<T>;
  111. onAbort?: LoaderOnAbort<T>;
  112. onProgress?: LoaderOnProgress<T>;
  113. }
  114.  
  115. export interface Loader<T extends LoaderContext> {
  116. destroy(): void;
  117. abort(): void;
  118. load(
  119. context: LoaderContext,
  120. config: LoaderConfiguration,
  121. callbacks: LoaderCallbacks<T>
  122. ): void;
  123. getResponseHeader(name: string): string | null;
  124. context: T;
  125. loader: any;
  126. stats: LoaderStats;
  127. }
  128.  
  129. export enum PlaylistContextType {
  130. MANIFEST = 'manifest',
  131. LEVEL = 'level',
  132. AUDIO_TRACK = 'audioTrack',
  133. SUBTITLE_TRACK = 'subtitleTrack',
  134. }
  135.  
  136. export enum PlaylistLevelType {
  137. MAIN = 'main',
  138. AUDIO = 'audio',
  139. SUBTITLE = 'subtitle',
  140. }
  141.  
  142. export interface PlaylistLoaderContext extends LoaderContext {
  143. loader?: Loader<PlaylistLoaderContext>;
  144.  
  145. type: PlaylistContextType;
  146. // the level index to load
  147. level: number | null;
  148. // level or track id from LevelLoadingData / TrackLoadingData
  149. id: number | null;
  150. // track group id
  151. groupId: string | null;
  152. // defines if the loader is handling a sidx request for the playlist
  153. isSidxRequest?: boolean;
  154. // internal representation of a parsed m3u8 level playlist
  155. levelDetails?: LevelDetails;
  156. // Blocking playlist request delivery directives (or null id none were added to playlist url
  157. deliveryDirectives: HlsUrlParameters | null;
  158. }