videojs-contrib-eme
Version:
Supports Encrypted Media Extensions for playback of encrypted content in Video.js
184 lines (145 loc) • 5.05 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 _utils = require('./utils');
var FAIRPLAY_KEY_SYSTEM = 'com.apple.fps.1_0';
exports.FAIRPLAY_KEY_SYSTEM = FAIRPLAY_KEY_SYSTEM;
var concatInitDataIdAndCertificate = function concatInitDataIdAndCertificate(_ref) {
var initData = _ref.initData;
var id = _ref.id;
var cert = _ref.cert;
if (typeof id === 'string') {
id = (0, _utils.stringToUint16Array)(id);
}
// layout:
// [initData]
// [4 byte: idLength]
// [idLength byte: id]
// [4 byte:certLength]
// [certLength byte: cert]
var offset = 0;
var buffer = new ArrayBuffer(initData.byteLength + 4 + id.byteLength + 4 + cert.byteLength);
var dataView = new DataView(buffer);
var initDataArray = new Uint8Array(buffer, offset, initData.byteLength);
initDataArray.set(initData);
offset += initData.byteLength;
dataView.setUint32(offset, id.byteLength, true);
offset += 4;
var idArray = new Uint16Array(buffer, offset, id.length);
idArray.set(id);
offset += idArray.byteLength;
dataView.setUint32(offset, cert.byteLength, true);
offset += 4;
var certArray = new Uint8Array(buffer, offset, cert.byteLength);
certArray.set(cert);
return new Uint8Array(buffer, 0, buffer.byteLength);
};
var addKey = function addKey(_ref2) {
var video = _ref2.video;
var contentId = _ref2.contentId;
var initData = _ref2.initData;
var cert = _ref2.cert;
var options = _ref2.options;
var getLicense = _ref2.getLicense;
return new Promise(function (resolve, reject) {
if (!video.webkitKeys) {
video.webkitSetMediaKeys(new _globalWindow2['default'].WebKitMediaKeys(FAIRPLAY_KEY_SYSTEM));
}
if (!video.webkitKeys) {
reject('Could not create MediaKeys');
return;
}
var keySession = video.webkitKeys.createSession('video/mp4', concatInitDataIdAndCertificate({ id: contentId, initData: initData, cert: cert }));
if (!keySession) {
reject('Could not create key session');
return;
}
keySession.contentId = contentId;
keySession.addEventListener('webkitkeymessage', function (event) {
getLicense(options, contentId, event.message, function (err, license) {
if (err) {
reject(err);
return;
}
keySession.update(new Uint8Array(license));
});
});
keySession.addEventListener('webkitkeyadded', function (event) {
resolve(event);
});
// for testing purposes, adding webkitkeyerror must be the last item in this method
keySession.addEventListener('webkitkeyerror', function (event) {
reject(event);
});
});
};
var defaultGetCertificate = function defaultGetCertificate(certificateUri) {
return function (emeOptions, callback) {
_videoJs2['default'].xhr({
uri: certificateUri,
responseType: 'arraybuffer'
}, function (err, response, responseBody) {
if (err) {
callback(err);
return;
}
callback(null, new Uint8Array(responseBody));
});
};
};
var defaultGetContentId = function defaultGetContentId(emeOptions, initData) {
return (0, _utils.getHostnameFromUri)((0, _utils.uint8ArrayToString)(initData));
};
var defaultGetLicense = function defaultGetLicense(licenseUri) {
return function (emeOptions, contentId, keyMessage, callback) {
_videoJs2['default'].xhr({
uri: licenseUri,
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 fairplay = function fairplay(_ref3) {
var video = _ref3.video;
var initData = _ref3.initData;
var options = _ref3.options;
var fairplayOptions = options.keySystems[FAIRPLAY_KEY_SYSTEM];
var getCertificate = fairplayOptions.getCertificate || defaultGetCertificate(fairplayOptions.certificateUri);
var getContentId = fairplayOptions.getContentId || defaultGetContentId;
var getLicense = fairplayOptions.getLicense || defaultGetLicense(fairplayOptions.licenseUri);
return new Promise(function (resolve, reject) {
getCertificate(options, function (err, cert) {
if (err) {
reject(err);
return;
}
resolve(cert);
});
}).then(function (cert) {
return addKey({
video: video,
cert: cert,
initData: initData,
getLicense: getLicense,
options: options,
contentId: getContentId(options, initData)
});
})['catch'](_videoJs2['default'].log.error.bind(_videoJs2['default'].log.error));
};
exports['default'] = fairplay;