playable
Version:
Video player based on HTML5Video
130 lines • 5.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var config_1 = (0, tslib_1.__importDefault)(require("./config"));
var player_api_decorator_1 = require("./player-api-decorator");
var Player = /** @class */ (function () {
function Player(params, scope, defaultModulesNames, additionalModuleNames, themeConfig) {
if (defaultModulesNames === void 0) { defaultModulesNames = []; }
if (additionalModuleNames === void 0) { additionalModuleNames = []; }
this._scope = scope;
this._scope.registerValue({
config: (0, config_1.default)(params),
});
this._scope.registerValue({
themeConfig: themeConfig,
});
this._config = this._scope.resolve('config');
this._resolveAdditionalModules(additionalModuleNames);
this._resolveDefaultModules(defaultModulesNames);
}
/*
Separation for default and additional modules is needed
for future implementation of public methods of resolved modules and
could be abolished in future
*/
Player.prototype._resolveDefaultModules = function (modulesNames) {
var _this = this;
this._defaultModules = modulesNames.reduce(function (modules, moduleName) {
if (_this._additionalModules[moduleName]) {
return modules;
}
var resolvedModule = _this._scope.resolve(moduleName);
_this._addPlayerAPIFromModule(resolvedModule);
modules[moduleName] = resolvedModule;
return modules;
}, {});
};
Player.prototype._resolveAdditionalModules = function (modulesNames) {
var _this = this;
this._additionalModules = modulesNames.reduce(function (modules, moduleName) {
var resolvedModule = _this._scope.resolve(moduleName);
_this._addPlayerAPIFromModule(resolvedModule);
modules[moduleName] = resolvedModule;
return modules;
}, {});
};
Player.prototype._getWrappedCallToModuleFunction = function (module, fn) {
var _this = this;
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (_this._destroyed) {
throw new Error('Player instance is destroyed');
}
return fn.apply(module, args);
};
};
Player.prototype._getPlayerAPIMethodDescriptor = function (module, descriptor) {
var playerMethodDescriptor = {
enumerable: true,
configurable: true,
};
var get = descriptor.get, set = descriptor.set, value = descriptor.value;
if (get) {
playerMethodDescriptor.get = this._getWrappedCallToModuleFunction(module, get);
}
if (set) {
playerMethodDescriptor.set = this._getWrappedCallToModuleFunction(module, set);
}
if (value) {
playerMethodDescriptor.value = this._getWrappedCallToModuleFunction(module, value);
playerMethodDescriptor.writable = true;
}
return playerMethodDescriptor;
};
Player.prototype._getModuleApi = function (module) {
return module.getAPI ? module.getAPI() : module[player_api_decorator_1.PLAYER_API_PROPERTY];
};
Player.prototype._addPlayerAPIFromModule = function (module) {
var _this = this;
var moduleApi = this._getModuleApi(module);
var getDescriptor = module.getAPI
? function (apiKey) { return Object.getOwnPropertyDescriptor(moduleApi, apiKey); }
: function (apiKey) {
return _this._getPlayerAPIMethodDescriptor(module, moduleApi[apiKey]);
};
if (moduleApi) {
Object.keys(moduleApi).forEach(function (apiKey) {
if (_this[apiKey]) {
throw new Error("API method ".concat(apiKey, " is already defined in Player facade"));
}
Object.defineProperty(_this, apiKey, getDescriptor(apiKey));
});
}
};
Player.prototype._clearPlayerAPIForModule = function (module) {
var _this = this;
var moduleApi = this._getModuleApi(module);
if (moduleApi) {
Object.keys(moduleApi).forEach(function (apiKey) {
delete _this[apiKey];
});
}
};
Player.prototype.destroy = function () {
var _this = this;
Object.keys(this._defaultModules).forEach(function (moduleName) {
var module = _this._defaultModules[moduleName];
_this._clearPlayerAPIForModule(module);
module.destroy();
});
Object.keys(this._additionalModules).forEach(function (moduleName) {
var module = _this._additionalModules[moduleName];
_this._clearPlayerAPIForModule(module);
if (module.destroy) {
module.destroy();
}
});
this._defaultModules = null;
this._additionalModules = null;
this._config = null;
this._scope = null;
this._destroyed = true;
};
return Player;
}());
exports.default = Player;
//# sourceMappingURL=player-facade.js.map