@@ -7,6 +7,10 @@ import { EventEmitter } from 'eventemitter3';
7
7
import { ErrorDetails , ErrorTypes } from '../errors' ;
8
8
import { Events } from '../events' ;
9
9
import { LevelKey } from '../loader/level-key' ;
10
+ import {
11
+ addEventListener ,
12
+ removeEventListener ,
13
+ } from '../utils/event-listener-helper' ;
10
14
import Hex from '../utils/hex' ;
11
15
import { Logger } from '../utils/logger' ;
12
16
import {
@@ -105,10 +109,8 @@ class EMEController extends Logger implements ComponentAPI {
105
109
}
106
110
107
111
public destroy ( ) {
108
- const media = this . media ;
109
- this . unregisterListeners ( ) ;
112
+ this . onDestroying ( ) ;
110
113
this . onMediaDetached ( ) ;
111
- this . _clear ( media ) ;
112
114
// Remove any references that could be held in config options or callbacks
113
115
const config = this . config ;
114
116
config . requestMediaKeySystemAccessFunc = null ;
@@ -125,13 +127,15 @@ class EMEController extends Logger implements ComponentAPI {
125
127
this . hls . on ( Events . MEDIA_DETACHED , this . onMediaDetached , this ) ;
126
128
this . hls . on ( Events . MANIFEST_LOADING , this . onManifestLoading , this ) ;
127
129
this . hls . on ( Events . MANIFEST_LOADED , this . onManifestLoaded , this ) ;
130
+ this . hls . on ( Events . DESTROYING , this . onDestroying , this ) ;
128
131
}
129
132
130
133
private unregisterListeners ( ) {
131
134
this . hls . off ( Events . MEDIA_ATTACHED , this . onMediaAttached , this ) ;
132
135
this . hls . off ( Events . MEDIA_DETACHED , this . onMediaDetached , this ) ;
133
136
this . hls . off ( Events . MANIFEST_LOADING , this . onManifestLoading , this ) ;
134
137
this . hls . off ( Events . MANIFEST_LOADED , this . onManifestLoaded , this ) ;
138
+ this . hls . off ( Events . DESTROYING , this . onDestroying , this ) ;
135
139
}
136
140
137
141
private getLicenseServerUrl ( keySystem : KeySystems ) : string | undefined {
@@ -375,7 +379,7 @@ class EMEController extends Logger implements ComponentAPI {
375
379
376
380
private updateKeySession (
377
381
mediaKeySessionContext : MediaKeySessionContext ,
378
- data : Uint8Array ,
382
+ data : Uint8Array < ArrayBuffer > ,
379
383
) : Promise < void > {
380
384
const keySession = mediaKeySessionContext . mediaKeysSession ;
381
385
this . log (
@@ -879,8 +883,9 @@ class EMEController extends Logger implements ComponentAPI {
879
883
}
880
884
} ) ;
881
885
882
- context . mediaKeysSession . addEventListener ( 'message' , onmessage ) ;
883
- context . mediaKeysSession . addEventListener (
886
+ addEventListener ( context . mediaKeysSession , 'message' , onmessage ) ;
887
+ addEventListener (
888
+ context . mediaKeysSession ,
884
889
'keystatuseschange' ,
885
890
onkeystatuseschange ,
886
891
) ;
@@ -1108,8 +1113,8 @@ class EMEController extends Logger implements ComponentAPI {
1108
1113
1109
1114
private unpackPlayReadyKeyMessage (
1110
1115
xhr : XMLHttpRequest ,
1111
- licenseChallenge : Uint8Array ,
1112
- ) : Uint8Array {
1116
+ licenseChallenge : Uint8Array < ArrayBuffer > ,
1117
+ ) : Uint8Array < ArrayBuffer > {
1113
1118
// On Edge, the raw license message is UTF-16-encoded XML. We need
1114
1119
// to unpack the Challenge element (base64-encoded string containing the
1115
1120
// actual license request) and any HttpHeader elements (sent as request
@@ -1156,8 +1161,11 @@ class EMEController extends Logger implements ComponentAPI {
1156
1161
xhr : XMLHttpRequest ,
1157
1162
url : string ,
1158
1163
keysListItem : MediaKeySessionContext ,
1159
- licenseChallenge : Uint8Array ,
1160
- ) : Promise < { xhr : XMLHttpRequest ; licenseChallenge : Uint8Array } > {
1164
+ licenseChallenge : Uint8Array < ArrayBuffer > ,
1165
+ ) : Promise < {
1166
+ xhr : XMLHttpRequest ;
1167
+ licenseChallenge : Uint8Array < ArrayBuffer > ;
1168
+ } > {
1161
1169
const licenseXhrSetup = this . config . licenseXhrSetup ;
1162
1170
1163
1171
if ( ! licenseXhrSetup ) {
@@ -1209,7 +1217,7 @@ class EMEController extends Logger implements ComponentAPI {
1209
1217
1210
1218
private requestLicense (
1211
1219
keySessionContext : MediaKeySessionContext ,
1212
- licenseChallenge : Uint8Array ,
1220
+ licenseChallenge : Uint8Array < ArrayBuffer > ,
1213
1221
) : Promise < ArrayBuffer > {
1214
1222
const keyLoadPolicy = this . config . keyLoadPolicy . default ;
1215
1223
return new Promise ( ( resolve , reject ) => {
@@ -1305,6 +1313,11 @@ class EMEController extends Logger implements ComponentAPI {
1305
1313
} ) ;
1306
1314
}
1307
1315
1316
+ private onDestroying ( ) {
1317
+ this . unregisterListeners ( ) ;
1318
+ this . _clear ( ) ;
1319
+ }
1320
+
1308
1321
private onMediaAttached (
1309
1322
event : Events . MEDIA_ATTACHED ,
1310
1323
data : MediaAttachedData ,
@@ -1318,30 +1331,32 @@ class EMEController extends Logger implements ComponentAPI {
1318
1331
// keep reference of media
1319
1332
this . media = media ;
1320
1333
1321
- media . removeEventListener ( 'encrypted' , this . onMediaEncrypted ) ;
1322
- media . removeEventListener ( 'waitingforkey' , this . onWaitingForKey ) ;
1323
- media . addEventListener ( 'encrypted' , this . onMediaEncrypted ) ;
1324
- media . addEventListener ( 'waitingforkey' , this . onWaitingForKey ) ;
1334
+ addEventListener ( media , 'encrypted' , this . onMediaEncrypted ) ;
1335
+ addEventListener ( media , 'waitingforkey' , this . onWaitingForKey ) ;
1325
1336
}
1326
1337
1327
1338
private onMediaDetached ( ) {
1328
1339
const media = this . media ;
1329
1340
1330
1341
if ( media ) {
1331
- media . removeEventListener ( 'encrypted' , this . onMediaEncrypted ) ;
1332
- media . removeEventListener ( 'waitingforkey' , this . onWaitingForKey ) ;
1342
+ removeEventListener ( media , 'encrypted' , this . onMediaEncrypted ) ;
1343
+ removeEventListener ( media , 'waitingforkey' , this . onWaitingForKey ) ;
1333
1344
this . media = null ;
1334
1345
this . mediaKeys = null ;
1335
1346
}
1336
1347
}
1337
1348
1338
- private _clear ( media ) {
1339
- const mediaKeysList = this . mediaKeySessions ;
1349
+ private _clear ( ) {
1340
1350
this . _requestLicenseFailureCount = 0 ;
1341
- this . mediaKeys = null ;
1342
- this . setMediaKeysQueue = [ ] ;
1343
- this . mediaKeySessions = [ ] ;
1344
1351
this . keyIdToKeySessionPromise = { } ;
1352
+ if ( ! this . mediaKeys && ! this . mediaKeySessions . length ) {
1353
+ return ;
1354
+ }
1355
+ const media = this . media ;
1356
+ const mediaKeysList = this . mediaKeySessions . slice ( ) ;
1357
+ this . mediaKeySessions = [ ] ;
1358
+ this . mediaKeys = null ;
1359
+
1345
1360
LevelKey . clearKeyUriToKeyIdMap ( ) ;
1346
1361
1347
1362
// Close all sessions and remove media keys from the video element.
@@ -1363,12 +1378,6 @@ class EMEController extends Logger implements ComponentAPI {
1363
1378
} ) ,
1364
1379
) ,
1365
1380
)
1366
- . then ( ( ) => {
1367
- if ( keySessionCount ) {
1368
- this . log ( 'finished closing key sessions and clearing media keys' ) ;
1369
- mediaKeysList . length = 0 ;
1370
- }
1371
- } )
1372
1381
. catch ( ( error ) => {
1373
1382
this . log ( `Could not close sessions and clear media keys: ${ error } ` ) ;
1374
1383
this . hls ?. trigger ( Events . ERROR , {
@@ -1379,6 +1388,12 @@ class EMEController extends Logger implements ComponentAPI {
1379
1388
`Could not close sessions and clear media keys: ${ error } ` ,
1380
1389
) ,
1381
1390
} ) ;
1391
+ } )
1392
+
1393
+ . then ( ( ) => {
1394
+ if ( keySessionCount ) {
1395
+ this . log ( 'finished closing key sessions and clearing media keys' ) ;
1396
+ }
1382
1397
} ) ;
1383
1398
}
1384
1399
0 commit comments