99} from '../types/events' ;
1010import { HlsConfig } from '../hls' ;
1111import { logger } from '../utils/logger' ;
12+ import FetchLoader from '../utils/fetch-loader' ;
1213
1314export const enum FragRequestState {
1415 IDLE ,
@@ -32,6 +33,7 @@ export default class FragmentPreloader extends FragmentLoader {
3233 state : FragRequestState . IDLE ,
3334 } ;
3435 protected log : ( msg : any ) => void ;
36+ private fetchLoader ?: FetchLoader | undefined ;
3537
3638 constructor ( config : HlsConfig , logPrefix : string ) {
3739 super ( config ) ;
@@ -49,10 +51,38 @@ export default class FragmentPreloader extends FragmentLoader {
4951
5052 public has ( frag : Fragment , part : Part | undefined ) : boolean {
5153 const { request } = this . storage ;
54+
55+ if ( request === undefined || request . frag . sn !== frag . sn ) {
56+ return false ;
57+ }
58+
59+ const requestPart = request . part ;
60+ // frag preload hint only
61+ if ( requestPart === undefined && part === undefined ) {
62+ return true ;
63+ }
64+
65+ // mismatched part / frag
66+ if ( requestPart === undefined || part === undefined ) {
67+ return false ;
68+ }
69+
70+ if ( requestPart . index === part . index ) {
71+ return true ;
72+ }
73+
74+ // Return true if byterange into requested part AND fetch loader exists
5275 return (
53- request !== undefined &&
54- request . frag . sn === frag . sn &&
55- request . part ?. index === part ?. index
76+ this . fetchLoader !== undefined &&
77+ // request is byterange
78+ requestPart . byteRangeStartOffset !== undefined &&
79+ requestPart . byteRangeEndOffset !== undefined &&
80+ // part is byterange
81+ part . byteRangeStartOffset !== undefined &&
82+ part . byteRangeEndOffset !== undefined &&
83+ // part byterange contained within request range
84+ requestPart . byteRangeStartOffset <= part . byteRangeStartOffset &&
85+ requestPart . byteRangeEndOffset >= part . byteRangeEndOffset
5686 ) ;
5787 }
5888
@@ -74,10 +104,17 @@ export default class FragmentPreloader extends FragmentLoader {
74104 } :${ part ?. index } `,
75105 ) ;
76106
77- const loadPromise =
78- part !== undefined
79- ? this . loadPart ( frag , part , noop )
80- : this . load ( frag , noop ) ;
107+ let loadPromise ;
108+ if ( part !== undefined ) {
109+ // TODO: Use fetch loader to progressively load open-ended byterange requests
110+ if ( part . byteRangeEndOffset === 2 ** 53 - 1 ) {
111+ return ;
112+ } else {
113+ loadPromise = this . loadPart ( frag , part , noop ) ;
114+ }
115+ } else {
116+ loadPromise = this . load ( frag , noop ) ;
117+ }
81118
82119 const request = {
83120 frag,
0 commit comments