@@ -10,26 +10,26 @@ import {
1010import { HlsConfig } from '../hls' ;
1111import { logger } from '../utils/logger' ;
1212
13- export const enum FragPreloadRequestState {
13+ export const enum FragRequestState {
1414 IDLE ,
1515 LOADING ,
1616}
1717
1818type FragPreloadRequest = {
1919 frag : Fragment ;
20- part : Part | null ;
20+ part : Part | undefined ;
2121 loadPromise : Promise < FragLoadedData > ;
2222} ;
2323
24- type FragPreloadRequestInfo = {
25- info : FragPreloadRequest | null ;
26- state : FragPreloadRequestState ;
24+ type FragPreloaderStorage = {
25+ request : FragPreloadRequest | undefined ;
26+ state : FragRequestState ;
2727} ;
2828
2929export default class FragmentPreloader extends FragmentLoader {
30- private storage : FragPreloadRequestInfo = {
31- info : null ,
32- state : FragPreloadRequestState . IDLE ,
30+ private storage : FragPreloaderStorage = {
31+ request : undefined ,
32+ state : FragRequestState . IDLE ,
3333 } ;
3434 protected log : ( msg : any ) => void ;
3535
@@ -40,27 +40,32 @@ export default class FragmentPreloader extends FragmentLoader {
4040
4141 private getPreloadStateStr ( ) {
4242 switch ( this . storage . state ) {
43- case FragPreloadRequestState . IDLE :
44- return 'IDLE' ;
45- case FragPreloadRequestState . LOADING :
43+ case FragRequestState . IDLE :
44+ return 'IDLE ' ;
45+ case FragRequestState . LOADING :
4646 return 'LOADING' ;
4747 }
4848 }
4949
50- public haveMatchingRequest ( frag : Fragment , part : Part | null ) : boolean {
51- const request = this . storage . info ;
50+ public has ( frag : Fragment , part : Part | undefined ) : boolean {
51+ const { request } = this . storage ;
5252 return (
53- request !== null &&
53+ request !== undefined &&
5454 request . frag . sn === frag . sn &&
5555 request . part ?. index === part ?. index
5656 ) ;
5757 }
5858
59+ public get loading ( ) : boolean {
60+ const { request, state } = this . storage ;
61+ return request !== undefined && state !== FragRequestState . IDLE ;
62+ }
63+
5964 public preload ( frag : Fragment , part : Part | undefined ) : void {
60- // We might have a stale request preloaded
61- const { info, state } = this . storage ;
62- if ( info && state !== FragPreloadRequestState . IDLE ) {
65+ if ( this . has ( frag , part ) ) {
6366 return ;
67+ } else {
68+ this . abort ( ) ;
6469 }
6570
6671 this . log (
@@ -69,57 +74,52 @@ export default class FragmentPreloader extends FragmentLoader {
6974 } :${ part ?. index } `,
7075 ) ;
7176
72- const noop = ( ) => { } ;
7377 const loadPromise =
7478 part !== undefined
7579 ? this . loadPart ( frag , part , noop )
7680 : this . load ( frag , noop ) ;
7781
7882 const request = {
7983 frag,
80- part : part ?? null ,
84+ part,
8185 loadPromise,
8286 } ;
8387
8488 this . storage = {
85- info : request ,
86- state : FragPreloadRequestState . LOADING ,
89+ request : request ,
90+ state : FragRequestState . LOADING ,
8791 } ;
8892 }
8993
9094 public getCachedRequest (
9195 frag : Fragment ,
92- part : Part | null ,
93- ) : Promise < FragLoadedData | PartsLoadedData > | null {
94- const request = this . storage . info ;
95- if ( request ) {
96- this . log (
97- `[${ this . getPreloadStateStr ( ) } ] check cache for [${ frag . type } ] ${
98- frag . sn
99- } :${ part ?. index } / preloadInfo=${ request ?. frag ?. sn } /${
100- request ?. part ?. index
101- } `,
102- ) ;
96+ part : Part | undefined ,
97+ ) : Promise < FragLoadedData | PartsLoadedData > | undefined {
98+ const request = this . storage . request ;
99+
100+ if ( ! request ) {
101+ return undefined ;
103102 }
104- if (
105- this . storage . state !== FragPreloadRequestState . IDLE &&
106- request &&
107- this . haveMatchingRequest ( frag , part )
108- ) {
109- // Do we need to merge the preload frag into the frag/part?
103+
104+ const cacheHit = this . has ( frag , part ) ;
105+
106+ this . log (
107+ `[${ this . getPreloadStateStr ( ) } ] check cache for [${ frag . type } ] ${
108+ frag . sn
109+ } :${ part ?. index ?? '' } / have: ${ request . frag . sn } :${ request . part ?. index ?? '' } hit=${ cacheHit } `,
110+ ) ;
111+ if ( cacheHit ) {
110112 return request . loadPromise . then ( ( data ) => {
111113 mergeFragData ( frag , part , data ) ;
112114 this . reset ( ) ;
113115 return data ;
114116 } ) ;
115- }
116-
117- if ( request && this . storage . state !== FragPreloadRequestState . IDLE ) {
117+ } else if ( this . loading ) {
118118 const { frag : preloadFrag , part : preloadPart } = request ;
119119 const haveOldSn = preloadFrag . sn < frag . sn ;
120120 const haveOldPart =
121- preloadPart !== null &&
122- part !== null &&
121+ preloadPart !== undefined &&
122+ part !== undefined &&
123123 ! haveOldSn &&
124124 preloadPart . index < part . index ;
125125
@@ -128,7 +128,7 @@ export default class FragmentPreloader extends FragmentLoader {
128128 }
129129 }
130130
131- return null ;
131+ return undefined ;
132132 }
133133
134134 public revalidate ( data : LevelLoadedData | TrackLoadedData ) {
@@ -144,16 +144,16 @@ export default class FragmentPreloader extends FragmentLoader {
144144 }
145145
146146 public get frag ( ) {
147- if ( this . storage . info ) {
148- return this . storage . info . frag ;
147+ if ( this . storage . request ) {
148+ return this . storage . request . frag ;
149149 }
150- return null ;
150+ return undefined ;
151151 }
152152
153153 public reset ( ) {
154154 this . storage = {
155- info : null ,
156- state : FragPreloadRequestState . IDLE ,
155+ request : undefined ,
156+ state : FragRequestState . IDLE ,
157157 } ;
158158 }
159159
@@ -168,9 +168,11 @@ export default class FragmentPreloader extends FragmentLoader {
168168 }
169169}
170170
171+ function noop ( ) { }
172+
171173function mergeFragData (
172174 frag : Fragment ,
173- part : Part | null ,
175+ part : Part | undefined ,
174176 data : FragLoadedData ,
175177) {
176178 const loadedFrag = data . frag ;
0 commit comments