2018-10-23 01:05:09 +03:00
|
|
|
define(["appSettings", "pluginManager"], function(appSettings, pluginManager) {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
function addPackage(packageManager, pkg) {
|
|
|
|
packageManager.packagesList = packageManager.packagesList.filter(function(p) {
|
|
|
|
return p.name !== pkg.name
|
|
|
|
}), packageManager.packagesList.push(pkg)
|
|
|
|
}
|
|
|
|
|
|
|
|
function removeUrl(url) {
|
|
|
|
var manifestUrls = JSON.parse(appSettings.get(settingsKey) || "[]");
|
|
|
|
manifestUrls = manifestUrls.filter(function(i) {
|
|
|
|
return i !== url
|
|
|
|
}), appSettings.set(settingsKey, JSON.stringify(manifestUrls))
|
|
|
|
}
|
|
|
|
|
|
|
|
function loadPackage(packageManager, url, throwError) {
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
|
var xhr = new XMLHttpRequest,
|
|
|
|
originalUrl = url;
|
|
|
|
url += -1 === url.indexOf("?") ? "?" : "&", url += "t=" + (new Date).getTime(), xhr.open("GET", url, !0);
|
|
|
|
var onError = function() {
|
|
|
|
!0 === throwError ? reject() : (removeUrl(originalUrl), resolve())
|
|
|
|
};
|
|
|
|
xhr.onload = function(e) {
|
|
|
|
if (this.status < 400) {
|
|
|
|
var pkg = JSON.parse(this.response);
|
|
|
|
pkg.url = originalUrl, addPackage(packageManager, pkg);
|
|
|
|
var plugins = pkg.plugins || [];
|
|
|
|
pkg.plugin && plugins.push(pkg.plugin);
|
|
|
|
var promises = plugins.map(function(pluginUrl) {
|
|
|
|
return pluginManager.loadPlugin(packageManager.mapPath(pkg, pluginUrl))
|
|
|
|
});
|
|
|
|
Promise.all(promises).then(resolve, resolve)
|
|
|
|
} else onError()
|
|
|
|
}, xhr.onerror = onError, xhr.send()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
function PackageManager() {
|
|
|
|
this.packagesList = []
|
|
|
|
}
|
|
|
|
var settingsKey = "installedpackages1";
|
|
|
|
return PackageManager.prototype.init = function() {
|
|
|
|
var manifestUrls = JSON.parse(appSettings.get(settingsKey) || "[]"),
|
|
|
|
instance = this;
|
|
|
|
return Promise.all(manifestUrls.map(function(u) {
|
|
|
|
return loadPackage(instance, u)
|
|
|
|
})).then(function() {
|
|
|
|
return Promise.resolve()
|
|
|
|
}, function() {
|
|
|
|
return Promise.resolve()
|
|
|
|
})
|
|
|
|
}, PackageManager.prototype.packages = function() {
|
|
|
|
return this.packagesList.slice(0)
|
|
|
|
}, PackageManager.prototype.install = function(url) {
|
|
|
|
return loadPackage(this, url, !0).then(function(pkg) {
|
|
|
|
var manifestUrls = JSON.parse(appSettings.get(settingsKey) || "[]");
|
|
|
|
return -1 === manifestUrls.indexOf(url) && (manifestUrls.push(url), appSettings.set(settingsKey, JSON.stringify(manifestUrls))), pkg
|
|
|
|
})
|
|
|
|
}, PackageManager.prototype.uninstall = function(name) {
|
|
|
|
var pkg = this.packagesList.filter(function(p) {
|
|
|
|
return p.name === name
|
|
|
|
})[0];
|
|
|
|
return pkg && (this.packagesList = this.packagesList.filter(function(p) {
|
|
|
|
return p.name !== name
|
|
|
|
}), removeUrl(pkg.url)), Promise.resolve()
|
|
|
|
}, PackageManager.prototype.mapPath = function(pkg, pluginUrl) {
|
|
|
|
var urlLower = pluginUrl.toLowerCase();
|
|
|
|
if (0 === urlLower.indexOf("http:") || 0 === urlLower.indexOf("https:") || 0 === urlLower.indexOf("file:")) return pluginUrl;
|
|
|
|
var packageUrl = pkg.url;
|
|
|
|
return packageUrl = packageUrl.substring(0, packageUrl.lastIndexOf("/")), packageUrl += "/", packageUrl += pluginUrl
|
|
|
|
}, new PackageManager
|
|
|
|
});
|