@@ -136,11 +136,6 @@ class EMEController extends Logger implements ComponentAPI {
136136 // Tracks active `main`, `audio` (playlistType), and `previous[]` (array) of encrypted fragments and LevelKey objects
137137 private activeKeys : ActiveKeys = { } ;
138138
139- // Resolves when key status starts with "usable", deleted when changed to expired or released
140- private keyUsablePromises : {
141- [ keyId : string ] : Promise < LevelKey > | undefined ;
142- } = { } ;
143-
144139 private mediaKeys : MediaKeys | null = null ;
145140 private setMediaKeysQueue : Promise < void > [ ] = EMEController . CDMCleanupPromise
146141 ? [ EMEController . CDMCleanupPromise ]
@@ -517,8 +512,6 @@ class EMEController extends Logger implements ComponentAPI {
517512 return Promise . reject ( error ) ;
518513 }
519514
520- const keyId = getKeyIdString ( levelKey ) ;
521-
522515 // track active playlist fragments
523516 const playlistType = frag . type as
524517 | PlaylistLevelType . MAIN
@@ -528,52 +521,45 @@ class EMEController extends Logger implements ComponentAPI {
528521 if ( encryptedFrag && ! levelKey . matches ( encryptedFrag . decryptdata ) ) {
529522 activeKeys . previous ||= [ ] ;
530523 activeKeys . previous . push ( encryptedFrag ) ;
524+ delete activeKeys [ playlistType ] ;
531525 }
532- activeKeys [ playlistType ] = frag ;
526+ activeKeys [ playlistType ] || = frag ;
533527
534- // Get key-session context async
535- const keyUsablePromise = this . keyUsablePromises [ keyId ] ;
536- if ( ! keyUsablePromise ) {
537- this . log (
538- `Waiting for usable key (playlist: ${ playlistType } keyId: ${ keyId } URI: ${ levelKey . uri } format: "${ levelKey . keyFormat } " method: ${ levelKey . method } )` ,
539- ) ;
540- return this . updateUsablePromise ( levelKey , 'playlist-key' , frag ) ;
528+ // check for external expiration
529+ for ( let i = this . mediaKeySessions . length ; i -- ; ) {
530+ const context = this . mediaKeySessions [ i ] ;
531+ if (
532+ levelKey . keyId &&
533+ context . keyStatuses [ arrayToHex ( levelKey . keyId ) ] === 'expired'
534+ ) {
535+ return this . renewKeySession ( levelKey , context ) ;
536+ }
541537 }
542538
543- return keyUsablePromise ;
539+ // Get key-session context async
540+ return this . updateUsablePromise ( levelKey , 'playlist-key' , frag ) ;
544541 }
545542
546- public renewKeySession ( levelKey : LevelKey ) {
547- const keyId = getKeyIdString ( levelKey ) ;
548- if ( levelKey . pssh ) {
549- // Reset cached mediaKeys, access promise, and usable key promise so that new session and request are generated
550- this . resetMediaKeys ( ) ;
551- delete this . keyUsablePromises [ keyId ] ;
552-
553- // same as loadKey, mediaKeys will be set with new session
554- const renewalPromise = this . updateUsablePromise ( levelKey , 'expired' ) ;
555- renewalPromise
556- . then ( ( ) => {
557- // remove old session after new one is established
558- // return this.removeSession(mediaKeySessionContext);
559- } )
560- . catch ( ( error ) => this . handleError ( error ) ) ;
561- } else {
562- this . warn ( `Could not renew expired key ${ keyId } . Missing pssh initData.` ) ;
563- }
543+ public renewKeySession (
544+ levelKey : LevelKey ,
545+ context : MediaKeySessionContext ,
546+ ) : Promise < LevelKey > {
547+ // Reset cached mediaKeys, access promise, and usable key promise so that new session and request are generated
548+ this . resetMediaKeys ( ) ;
549+ return this . removeSession ( context ) . then ( ( ) => {
550+ this . throwIfDestroyed ( ) ;
551+ return this . updateUsablePromise ( levelKey , 'expired' ) ;
552+ } ) ;
564553 }
565554
566555 private updateUsablePromise (
567556 levelKey : LevelKey ,
568557 reason : LicenseRequestReason ,
569558 frag ?: EncryptedFragment ,
570559 ) : Promise < LevelKey > {
571- const keyId = getKeyIdString ( levelKey ) ;
572560 const keySessionContextPromise = this . getSessionForKey ( levelKey , reason ) ;
573561 keySessionContextPromise . catch ( ( error ) => this . handleError ( error , frag ) ) ;
574- const usablePromise = ( this . keyUsablePromises [ keyId ] =
575- keySessionContextPromise . then ( ( context ) => levelKey ) ) ;
576- return usablePromise ;
562+ return keySessionContextPromise . then ( ( context ) => levelKey ) ;
577563 }
578564
579565 // add Key to new or existing session
@@ -593,6 +579,9 @@ class EMEController extends Logger implements ComponentAPI {
593579 // If request is in progress wait for it to resolve
594580 const requestEmitter = context . keyRequests [ levelKey . uri ] ;
595581 if ( requestEmitter ) {
582+ this . log (
583+ `Waiting for usable key (${ reason } keyId: ${ getKeyIdString ( levelKey ) } format: "${ levelKey . keyFormat } " URI: ${ levelKey . uri } )` ,
584+ ) ;
596585 return getRequestToKeyUsablePromise ( requestEmitter ) . then (
597586 ( ) => context ,
598587 ) ;
@@ -1034,7 +1023,9 @@ class EMEController extends Logger implements ComponentAPI {
10341023 this . log (
10351024 `Expired key ${ stringify ( keyStatuses ) } in key-session "${ context . mediaKeysSession . sessionId } "` ,
10361025 ) ;
1037- this . renewKeySession ( levelKey ) ;
1026+ this . renewKeySession ( levelKey , context ) . catch ( ( error ) =>
1027+ this . handleError ( error ) ,
1028+ ) ;
10381029 break ;
10391030 }
10401031 }
@@ -1560,7 +1551,6 @@ class EMEController extends Logger implements ComponentAPI {
15601551 private _clear ( ) {
15611552 this . keyFormatPromise = null ;
15621553 this . keySystemAccessPromises = { } ;
1563- this . keyUsablePromises = { } ;
15641554 this . activeKeys = { } ;
15651555 const mediaResolved = this . mediaResolved ;
15661556 if ( mediaResolved ) {
0 commit comments