Skip to content

Commit

Permalink
fix: Close keySession when player is disposed (#176)
Browse files Browse the repository at this point in the history
* close keySession on dispose, update tests

* remove debug comment

* relocate old test, add new one

* wrap close in arrow func
  • Loading branch information
alex-barstow committed Oct 13, 2022
1 parent 6a19aba commit c8ca31a
Show file tree
Hide file tree
Showing 4 changed files with 150 additions and 59 deletions.
18 changes: 13 additions & 5 deletions src/eme.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ export const getSupportedKeySystem = (keySystems) => {
return promise;
};

export const makeNewRequest = (requestOptions) => {
export const makeNewRequest = (player, requestOptions) => {
const {
mediaKeys,
initDataType,
Expand All @@ -108,8 +108,11 @@ export const makeNewRequest = (requestOptions) => {

eventBus.trigger('keysessioncreated');

return new Promise((resolve, reject) => {
player.on('dispose', () => {
keySession.close();
});

return new Promise((resolve, reject) => {
keySession.addEventListener('message', (event) => {
// all other types will be handled by keystatuseschange
if (event.messageType !== 'license-request' && event.messageType !== 'license-renewal') {
Expand Down Expand Up @@ -167,7 +170,7 @@ export const makeNewRequest = (requestOptions) => {
// videojs.log.debug('Session expired, closing the session.');
keySession.close().then(() => {
removeSession(initData);
makeNewRequest(requestOptions);
makeNewRequest(player, requestOptions);
});
}
}, false);
Expand Down Expand Up @@ -206,6 +209,7 @@ export const makeNewRequest = (requestOptions) => {
* session creation if media keys are available
*/
export const addSession = ({
player,
video,
initDataType,
initData,
Expand All @@ -227,7 +231,7 @@ export const addSession = ({

if (video.mediaKeysObject) {
sessionData.mediaKeys = video.mediaKeysObject;
return makeNewRequest(sessionData);
return makeNewRequest(player, sessionData);
}

video.pendingSessionData.push(sessionData);
Expand Down Expand Up @@ -255,6 +259,7 @@ export const addSession = ({
* video object
*/
export const addPendingSessions = ({
player,
video,
certificate,
createdMediaKeys
Expand All @@ -271,7 +276,7 @@ export const addPendingSessions = ({
for (let i = 0; i < video.pendingSessionData.length; i++) {
const data = video.pendingSessionData[i];

promises.push(makeNewRequest({
promises.push(makeNewRequest(player, {
mediaKeys: video.mediaKeysObject,
initDataType: data.initDataType,
initData: data.initData,
Expand Down Expand Up @@ -375,6 +380,7 @@ const standardizeKeySystemOptions = (keySystem, keySystemOptions) => {
};

export const standard5July2016 = ({
player,
video,
initDataType,
initData,
Expand Down Expand Up @@ -432,6 +438,7 @@ export const standard5July2016 = ({
return keySystemAccess.createMediaKeys();
}).then((createdMediaKeys) => {
return addPendingSessions({
player,
video,
certificate,
createdMediaKeys
Expand All @@ -452,6 +459,7 @@ export const standard5July2016 = ({
promisifyGetLicense(keySystem, keySystemOptions.getLicense, eventBus) : null;

return addSession({
player,
video,
initDataType,
initData,
Expand Down
7 changes: 4 additions & 3 deletions src/plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export const removeSession = (sessions, initData) => {
}
};

export const handleEncryptedEvent = (event, options, sessions, eventBus) => {
export const handleEncryptedEvent = (player, event, options, sessions, eventBus) => {
if (!options || !options.keySystems) {
// return silently since it may be handled by a different system
return Promise.resolve();
Expand Down Expand Up @@ -82,6 +82,7 @@ export const handleEncryptedEvent = (event, options, sessions, eventBus) => {
sessions.push({ initData });

return standard5July2016({
player,
video: event.target,
initDataType: event.initDataType,
initData,
Expand Down Expand Up @@ -234,7 +235,7 @@ const onPlayerReady = (player, emeError) => {
// https://github.com/videojs/video.js/pull/4780
// videojs.log('eme', 'Received an \'encrypted\' event');
setupSessions(player);
handleEncryptedEvent(event, getOptions(player), player.eme.sessions, player.tech_)
handleEncryptedEvent(player, event, getOptions(player), player.eme.sessions, player.tech_)
.catch(emeError);
});
} else if (window.WebKitMediaKeys) {
Expand Down Expand Up @@ -365,7 +366,7 @@ const eme = function(options = {}) {
setupSessions(player);

if (window.MediaKeys) {
handleEncryptedEvent(mockEncryptedEvent, mergedEmeOptions, player.eme.sessions, player.tech_)
handleEncryptedEvent(player, mockEncryptedEvent, mergedEmeOptions, player.eme.sessions, player.tech_)
.then(() => callback())
.catch((error) => {
callback(error);
Expand Down
Loading

0 comments on commit c8ca31a

Please sign in to comment.