xgplayer-dash
Version:
xgplayer plugin for MPEG-DASH
132 lines (131 loc) • 4.6 kB
JavaScript
import { inherits as _inherits, createSuper as _createSuper, classCallCheck as _classCallCheck, createClass as _createClass, createForOfIteratorHelper as _createForOfIteratorHelper } from "../_virtual/_rollupPluginBabelHelpers.js";
import EventEmitter from "eventemitter3";
import util from "../util/index.js";
var EME = /* @__PURE__ */ function(_EventEmitter) {
_inherits(EME2, _EventEmitter);
var _super = _createSuper(EME2);
function EME2(drm) {
var _this;
_classCallCheck(this, EME2);
_this = _super.call(this);
_this.drm = drm;
_this.KEYSYSTEM_TYPE = "";
_this.keys = {};
if (_this.drm.clearKeys) {
_this.KEYSYSTEM_TYPE = "org.w3.clearkey";
_this.keys = _this.drm.clearKeys;
}
_this.options = [];
_this.ensurePromise = void 0;
return _this;
}
_createClass(EME2, [{
key: "setOptions",
value: function setOptions() {
var basicVideoCapabilities = [{
contentType: 'video/mp4; codecs="avc1.42E01E"'
}, {
contentType: 'video/webm; codecs="vp8"'
}];
var basicConfig = {
videoCapabilities: basicVideoCapabilities
};
var offlineConfig = {
videoCapabilities: basicVideoCapabilities,
persistentState: "required",
sessionTypes: ["persistent-license"]
};
this.options = [offlineConfig, basicConfig];
}
}, {
key: "bail",
value: function bail(message) {
return function(err) {
console.log(message + (err ? " " + err : ""));
};
}
}, {
key: "UpdateSessionFunc",
value: function UpdateSessionFunc(drmKeys) {
var self = this;
return function(ev) {
var keys = [];
var keyIds = [];
Object.keys(drmKeys).forEach(function(keyIdHex) {
var keyHex = drmKeys[keyIdHex];
var keyId = util.fromHex(keyIdHex);
var key = util.fromHex(keyHex);
var keyObj = {
kty: "oct",
kid: util.toBase64(keyId, false),
k: util.toBase64(key, false)
};
keys.push(keyObj);
keyIds.push(keyObj.kid);
});
var jwkSet = {
keys
};
var license = JSON.stringify(jwkSet);
ev.target.update(util.StringToArrayBuffer(license)).then(function() {
}, self.bail(" MediaKeySession update failed"));
};
}
}, {
key: "KeysChange",
value: function KeysChange(event) {
var session = event.target;
var map = session.keyStatuses;
var _iterator = _createForOfIteratorHelper(map.entries()), _step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done; ) {
var entry = _step.value;
var keyId = entry[0];
var status = entry[1];
var base64KeyId = util.Base64ToHex(window.btoa(util.ArrayBufferToString(keyId)));
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
}, {
key: "EnsureMediaKeysCreated",
value: function EnsureMediaKeysCreated(video, keySystem, options) {
var self = this;
if (this.ensurePromise) {
return this.ensurePromise;
}
this.ensurePromise = navigator.requestMediaKeySystemAccess(keySystem, options).then(function(keySystemAccess) {
return keySystemAccess.createMediaKeys();
}, self.bail(" Failed to request key system access.")).then(function(mediaKeys) {
return video.setMediaKeys(mediaKeys);
}, self.bail(" failed to create MediaKeys object"));
return this.ensurePromise;
}
}, {
key: "SetupEME",
value: function SetupEME(video, keyIds) {
var self = this;
video.sessions = [];
this.on("encrypted", function() {
var initDataType = "keyids";
var initDataStr = JSON.stringify({
kids: ["0123456789abcdef0123456789abcdef"]
});
var initData = new Uint8Array(util.toUTF8(initDataStr));
self.EnsureMediaKeysCreated(video, self.KEYSYSTEM_TYPE, self.options).then(function() {
var session = video.mediaKeys.createSession();
video.sessions.push(session);
session.addEventListener("message", self.UpdateSessionFunc(self.keys));
session.addEventListener("keystatuseschange", self.KeysChange);
return session.generateRequest(initDataType, initData.buffer);
}, self.bail(" failed to ensure MediaKeys on HTMLMediaElement")).then(function() {
}, self.bail(" Failed to generate request."));
});
}
}]);
return EME2;
}(EventEmitter);
export { EME as default };