videojs-contrib-eme
Version:
Supports Encrypted Media Extensions for playback of encrypted content in Video.js
103 lines (79 loc) • 3.47 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _videoJs = require('video.js');
var _videoJs2 = _interopRequireDefault(_videoJs);
var _globalWindow = require('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _playready = require('./playready');
var PLAYREADY_KEY_SYSTEM = 'com.microsoft.playready';
exports.PLAYREADY_KEY_SYSTEM = PLAYREADY_KEY_SYSTEM;
var addKeyToSession = function addKeyToSession(options, session, event) {
var playreadyOptions = options.keySystems[PLAYREADY_KEY_SYSTEM];
if (typeof playreadyOptions.getKey === 'function') {
playreadyOptions.getKey(options, event.destinationURL, event.message.buffer, function (err, key) {
if (err) {
_videoJs2['default'].log.error('Unable to get key: ' + err);
return;
}
session.update(key);
});
return;
}
if (typeof playreadyOptions === 'string') {
playreadyOptions = { url: playreadyOptions };
}
var url = playreadyOptions.url || event.destinationURL;
(0, _playready.requestPlayreadyLicense)(url, event.message.buffer, function (err, response) {
if (err) {
_videoJs2['default'].log.error('Unable to request key from url: ' + url);
return;
}
session.update(new Uint8Array(response.body));
});
};
exports.addKeyToSession = addKeyToSession;
var createSession = function createSession(video, initData, options) {
var session = video.msKeys.createSession('video/mp4', initData);
if (!session) {
_videoJs2['default'].log.error('Could not create key session.');
return;
}
// Note that mskeymessage may not always be called for PlayReady:
//
// "If initData contains a PlayReady object that contains an OnDemand header, only a
// keyAdded event is returned (as opposed to a keyMessage event as described in the
// Encrypted Media Extension draft). Similarly, if initData contains a PlayReady object
// that contains a key identifier in the hashed data storage (HDS), only a keyAdded
// event is returned."
// eslint-disable-next-line max-len
// @see [PlayReady License Acquisition]{@link https://msdn.microsoft.com/en-us/library/dn468979.aspx}
session.addEventListener('mskeymessage', function (event) {
addKeyToSession(options, session, event);
});
session.addEventListener('mskeyerror', function (event) {
_videoJs2['default'].log.error('Unexpected key error from key session with ' + ('code: ' + session.error.code + ' and systemCode: ' + session.error.systemCode));
});
};
exports.createSession = createSession;
exports['default'] = function (_ref) {
var video = _ref.video;
var initData = _ref.initData;
var options = _ref.options;
// Although by the standard examples the presence of video.msKeys is checked first to
// verify that we aren't trying to create a new session when one already exists, here
// sessions are managed earlier (on the player.eme object), meaning that at this point
// any existing keys should be cleaned up.
if (video.msKeys) {
delete video.msKeys;
}
try {
video.msSetMediaKeys(new _globalWindow2['default'].MSMediaKeys(PLAYREADY_KEY_SYSTEM));
} catch (e) {
_videoJs2['default'].log.error('Unable to create media keys for PlayReady key system. Error: ' + e.message);
return;
}
createSession(video, initData, options);
};