UNPKG

videojs-contrib-eme

Version:

Supports Encrypted Media Extensions for playback of encrypted content in Video.js

184 lines (145 loc) 5.05 kB
'use strict'; 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;