From 20d6adc0c2f9bd34845873f499eea03bc2a8bb5d Mon Sep 17 00:00:00 2001 From: Brandon Casey <2381475+brandonocasey@users.noreply.github.com> Date: Tue, 15 Sep 2020 16:29:45 -0400 Subject: [PATCH] fix: try to re-request key if the session expired (#120) --- src/eme.js | 20 +++++++++++--------- test/eme.test.js | 12 ++++++++++-- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/eme.js b/src/eme.js index d7011b9..dd73a2a 100644 --- a/src/eme.js +++ b/src/eme.js @@ -73,15 +73,16 @@ export const getSupportedKeySystem = (keySystems) => { return promise; }; -export const makeNewRequest = ({ - mediaKeys, - initDataType, - initData, - options, - getLicense, - removeSession, - eventBus -}) => { +export const makeNewRequest = (requestOptions) => { + const { + mediaKeys, + initDataType, + initData, + options, + getLicense, + removeSession, + eventBus + } = requestOptions; const keySession = mediaKeys.createSession(); return new Promise((resolve, reject) => { @@ -140,6 +141,7 @@ export const makeNewRequest = ({ // videojs.log.debug('Session expired, closing the session.'); keySession.close().then(() => { removeSession(initData); + makeNewRequest(requestOptions); }); } }, false); diff --git a/test/eme.test.js b/test/eme.test.js index d9ebf21..a378c98 100644 --- a/test/eme.test.js +++ b/test/eme.test.js @@ -139,7 +139,7 @@ QUnit.test('keystatuseschange triggers keystatuschange on eventBus for each key' }); -QUnit.test('keystatuseschange with expired key closes session', function(assert) { +QUnit.test('keystatuseschange with expired key closes and recreates session', function(assert) { const removeSessionCalls = []; // once the eme module gets the removeSession function, the session argument is already // bound to the function (note that it's a custom session maintained by the plugin, not @@ -150,10 +150,15 @@ QUnit.test('keystatuseschange with expired key closes session', function(assert) const eventBus = { trigger: (name) => {} }; + let creates = 0; makeNewRequest({ mediaKeys: { - createSession: () => mockSession + createSession: () => { + creates++; + + return mockSession; + } }, initDataType: '', initData, @@ -163,6 +168,7 @@ QUnit.test('keystatuseschange with expired key closes session', function(assert) eventBus }); + assert.equal(creates, 1, 'created session'); assert.equal(mockSession.listeners.length, 2, 'added listeners'); assert.equal(mockSession.listeners[1].type, 'keystatuseschange', @@ -190,6 +196,8 @@ QUnit.test('keystatuseschange with expired key closes session', function(assert) // synchronously assert.equal(removeSessionCalls.length, 1, 'called remove session'); assert.equal(removeSessionCalls[0], initData, 'called to remove session with initData'); + + assert.equal(creates, 2, 'created another session'); }); QUnit.test('keystatuseschange with internal-error logs a warning', function(assert) {