videojs-contrib-eme
Version:
Supports Encrypted Media Extensions for playback of encrypted content in Video.js
262 lines (213 loc) • 7.84 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 _playready = require('./playready');
var getSupportedKeySystem = function getSupportedKeySystem(_ref) {
var video = _ref.video;
var keySystems = _ref.keySystems;
// As this happens after the src is set on the video, we rely only on the set src (we
// do not change src based on capabilities of the browser in this plugin).
var promise = undefined;
Object.keys(keySystems).forEach(function (keySystem) {
// TODO use initDataTypes when appropriate
var systemOptions = {};
var audioContentType = keySystems[keySystem].audioContentType;
var videoContentType = keySystems[keySystem].videoContentType;
if (audioContentType) {
systemOptions.audioCapabilities = [{
contentType: audioContentType
}];
}
if (videoContentType) {
systemOptions.videoCapabilities = [{
contentType: videoContentType
}];
}
if (!promise) {
promise = navigator.requestMediaKeySystemAccess(keySystem, [systemOptions]);
} else {
promise = promise['catch'](function (e) {
return navigator.requestMediaKeySystemAccess(keySystem, [systemOptions]);
});
}
});
return promise;
};
var makeNewRequest = function makeNewRequest(_ref2) {
var mediaKeys = _ref2.mediaKeys;
var initDataType = _ref2.initDataType;
var initData = _ref2.initData;
var options = _ref2.options;
var getLicense = _ref2.getLicense;
var keySession = mediaKeys.createSession();
keySession.addEventListener('message', function (event) {
getLicense(options, event.message).then(function (license) {
return keySession.update(license);
})['catch'](_videoJs2['default'].log.error.bind(_videoJs2['default'].log.error, 'failed to get and set license'));
}, false);
keySession.generateRequest(initDataType, initData)['catch'](_videoJs2['default'].log.error.bind(_videoJs2['default'].log.error, 'Unable to create or initialize key session'));
};
var addSession = function addSession(_ref3) {
var video = _ref3.video;
var initDataType = _ref3.initDataType;
var initData = _ref3.initData;
var options = _ref3.options;
var getLicense = _ref3.getLicense;
if (video.mediaKeysObject) {
makeNewRequest({
mediaKeys: video.mediaKeysObject,
initDataType: initDataType,
initData: initData,
options: options,
getLicense: getLicense
});
} else {
video.pendingSessionData.push({ initDataType: initDataType, initData: initData });
}
};
var setMediaKeys = function setMediaKeys(_ref4) {
var video = _ref4.video;
var certificate = _ref4.certificate;
var createdMediaKeys = _ref4.createdMediaKeys;
var options = _ref4.options;
var getLicense = _ref4.getLicense;
video.mediaKeysObject = createdMediaKeys;
if (certificate) {
createdMediaKeys.setServerCertificate(certificate);
}
for (var i = 0; i < video.pendingSessionData.length; i++) {
var data = video.pendingSessionData[i];
makeNewRequest({
mediaKeys: video.mediaKeysObject,
initDataType: data.initDataType,
initData: data.initData,
options: options,
getLicense: getLicense
});
}
video.pendingSessionData = [];
return video.setMediaKeys(createdMediaKeys);
};
var defaultPlayreadyGetLicense = function defaultPlayreadyGetLicense(url) {
return function (emeOptions, keyMessage, callback) {
(0, _playready.requestPlayreadyLicense)(url, keyMessage, function (err, response, responseBody) {
if (err) {
callback(err);
return;
}
callback(null, responseBody);
});
};
};
var defaultGetLicense = function defaultGetLicense(url) {
return function (emeOptions, keyMessage, callback) {
_videoJs2['default'].xhr({
uri: url,
method: 'POST',
responseType: 'arraybuffer',
body: keyMessage,
headers: {
'Content-type': 'application/octet-stream'
}
}, function (err, response, responseBody) {
if (err) {
callback(err);
return;
}
callback(null, responseBody);
});
};
};
var promisifyGetLicense = function promisifyGetLicense(getLicenseFn) {
return function (emeOptions, keyMessage) {
return new Promise(function (resolve, reject) {
getLicenseFn(emeOptions, keyMessage, function (err, license) {
if (err) {
reject(err);
}
resolve(license);
});
});
};
};
var standardizeKeySystemOptions = function standardizeKeySystemOptions(keySystem, keySystemOptions) {
if (typeof keySystemOptions === 'string') {
keySystemOptions = { url: keySystemOptions };
}
if (!keySystemOptions.url && !keySystemOptions.getLicense) {
throw new Error('Neither URL nor getLicense function provided to get license');
}
if (keySystemOptions.url && !keySystemOptions.getLicense) {
keySystemOptions.getLicense = keySystem === 'com.microsoft.playready' ? defaultPlayreadyGetLicense(keySystemOptions.url) : defaultGetLicense(keySystemOptions.url);
}
return keySystemOptions;
};
var standard5July2016 = function standard5July2016(_ref5) {
var video = _ref5.video;
var initDataType = _ref5.initDataType;
var initData = _ref5.initData;
var options = _ref5.options;
if (typeof video.mediaKeysObject === 'undefined') {
var _ret = (function () {
// Prevent entering this path again.
video.mediaKeysObject = null;
// Will store all initData until the MediaKeys is ready.
video.pendingSessionData = [];
var certificate = undefined;
var keySystemOptions = undefined;
var keySystemPromise = getSupportedKeySystem({
video: video,
keySystems: options.keySystems
});
if (!keySystemPromise) {
_videoJs2['default'].log.error('No supported key system found');
return {
v: undefined
};
}
keySystemPromise.then(function (keySystemAccess) {
return new Promise(function (resolve, reject) {
// save key system for adding sessions
video.keySystem = keySystemAccess.keySystem;
keySystemOptions = standardizeKeySystemOptions(keySystemAccess.keySystem, options.keySystems[keySystemAccess.keySystem]);
if (!keySystemOptions.getCertificate) {
resolve(keySystemAccess);
return;
}
keySystemOptions.getCertificate(options, function (err, cert) {
if (err) {
reject(err);
return;
}
certificate = cert;
resolve(keySystemAccess);
});
});
}).then(function (keySystemAccess) {
return keySystemAccess.createMediaKeys();
}).then(function (createdMediaKeys) {
return setMediaKeys({
video: video,
certificate: certificate,
createdMediaKeys: createdMediaKeys,
options: options,
getLicense: promisifyGetLicense(keySystemOptions.getLicense)
});
})['catch'](_videoJs2['default'].log.error.bind(_videoJs2['default'].log.error, 'Failed to create and initialize a MediaKeys object'));
})();
if (typeof _ret === 'object') return _ret.v;
}
addSession({
video: video,
initDataType: initDataType,
initData: initData,
options: options,
// if key system has not been determined then addSession doesn't need getLicense
getLicense: video.keySystem ? promisifyGetLicense(standardizeKeySystemOptions(video.keySystem, options.keySystems[video.keySystem]).getLicense) : null
});
};
exports.standard5July2016 = standard5July2016;