2020-08-14 08:46:34 +02:00
|
|
|
import appSettings from '../scripts/settings/appSettings';
|
2020-08-16 20:24:45 +02:00
|
|
|
import { pluginManager } from './pluginManager';
|
2020-08-01 03:51:44 +02:00
|
|
|
/* eslint-disable indent */
|
|
|
|
|
|
|
|
class PackageManager {
|
|
|
|
#packagesList = [];
|
|
|
|
#settingsKey = 'installedpackages1';
|
|
|
|
|
|
|
|
init() {
|
|
|
|
console.groupCollapsed('loading packages');
|
2020-10-07 21:12:14 +09:00
|
|
|
const manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]');
|
2020-08-01 03:51:44 +02:00
|
|
|
|
2020-08-01 16:04:24 +02:00
|
|
|
return Promise.all(manifestUrls.map((url) => {
|
|
|
|
return this.loadPackage(url);
|
|
|
|
}))
|
|
|
|
.then(() => {
|
|
|
|
console.debug('finished loading packages');
|
2020-08-01 03:51:44 +02:00
|
|
|
return Promise.resolve();
|
2020-08-01 16:04:24 +02:00
|
|
|
})
|
|
|
|
.catch(() => {
|
2020-08-01 03:51:44 +02:00
|
|
|
return Promise.resolve();
|
2020-08-01 16:04:24 +02:00
|
|
|
}).finally(() => {
|
|
|
|
console.groupEnd('loading packages');
|
2020-08-01 03:51:44 +02:00
|
|
|
});
|
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
get packages() {
|
|
|
|
return this.#packagesList.slice(0);
|
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
install(url) {
|
2020-08-01 16:04:24 +02:00
|
|
|
return this.loadPackage(url, true).then((pkg) => {
|
2020-10-07 21:12:14 +09:00
|
|
|
const manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]');
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
if (!manifestUrls.includes(url)) {
|
|
|
|
manifestUrls.push(url);
|
|
|
|
appSettings.set(this.#settingsKey, JSON.stringify(manifestUrls));
|
2019-01-10 15:39:37 +03:00
|
|
|
}
|
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
return pkg;
|
|
|
|
});
|
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
uninstall(name) {
|
2020-10-07 21:12:14 +09:00
|
|
|
const pkg = this.#packagesList.filter((p) => {
|
2020-08-01 03:51:44 +02:00
|
|
|
return p.name === name;
|
|
|
|
})[0];
|
2018-10-23 01:05:09 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
if (pkg) {
|
|
|
|
this.#packagesList = this.#packagesList.filter((p) => {
|
|
|
|
return p.name !== name;
|
|
|
|
});
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
this.removeUrl(pkg.url);
|
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
return Promise.resolve();
|
2020-08-01 03:51:44 +02:00
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
mapPath(pkg, pluginUrl) {
|
2020-10-07 21:12:14 +09:00
|
|
|
const urlLower = pluginUrl.toLowerCase();
|
2020-08-01 03:51:44 +02:00
|
|
|
if (urlLower.startsWith('http:') || urlLower.startsWith('https:') || urlLower.startsWith('file:')) {
|
|
|
|
return pluginUrl;
|
2019-01-10 15:39:37 +03:00
|
|
|
}
|
|
|
|
|
2020-10-07 21:12:14 +09:00
|
|
|
let packageUrl = pkg.url;
|
2020-08-01 03:51:44 +02:00
|
|
|
packageUrl = packageUrl.substring(0, packageUrl.lastIndexOf('/'));
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
packageUrl += '/';
|
|
|
|
packageUrl += pluginUrl;
|
|
|
|
|
|
|
|
return packageUrl;
|
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 16:04:24 +02:00
|
|
|
addPackage(pkg) {
|
2020-08-16 15:46:29 +02:00
|
|
|
this.#packagesList = this.#packagesList.filter((p) => {
|
2020-08-01 03:51:44 +02:00
|
|
|
return p.name !== pkg.name;
|
2019-01-10 15:39:37 +03:00
|
|
|
});
|
|
|
|
|
2020-08-16 15:46:29 +02:00
|
|
|
this.#packagesList.push(pkg);
|
2019-01-10 15:39:37 +03:00
|
|
|
}
|
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
removeUrl(url) {
|
2020-10-07 21:12:14 +09:00
|
|
|
let manifestUrls = JSON.parse(appSettings.get(this.#settingsKey) || '[]');
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
manifestUrls = manifestUrls.filter((i) => {
|
|
|
|
return i !== url;
|
|
|
|
});
|
|
|
|
|
|
|
|
appSettings.set(this.#settingsKey, JSON.stringify(manifestUrls));
|
2019-01-10 15:39:37 +03:00
|
|
|
}
|
|
|
|
|
2020-08-01 16:04:24 +02:00
|
|
|
loadPackage(url, throwError = false) {
|
2020-08-01 03:51:44 +02:00
|
|
|
return new Promise((resolve, reject) => {
|
2020-10-07 21:12:14 +09:00
|
|
|
const xhr = new XMLHttpRequest();
|
|
|
|
const originalUrl = url;
|
2020-08-01 03:51:44 +02:00
|
|
|
url += url.indexOf('?') === -1 ? '?' : '&';
|
|
|
|
url += 't=' + new Date().getTime();
|
|
|
|
|
|
|
|
xhr.open('GET', url, true);
|
|
|
|
|
2020-10-07 21:12:14 +09:00
|
|
|
const onError = () => {
|
2020-08-01 03:51:44 +02:00
|
|
|
if (throwError === true) {
|
|
|
|
reject();
|
|
|
|
} else {
|
|
|
|
this.removeUrl(originalUrl);
|
|
|
|
resolve();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-08-01 16:04:24 +02:00
|
|
|
xhr.onload = () => {
|
2020-08-01 03:51:44 +02:00
|
|
|
if (this.status < 400) {
|
2020-10-07 21:12:14 +09:00
|
|
|
const pkg = JSON.parse(this.response);
|
2020-08-01 03:51:44 +02:00
|
|
|
pkg.url = originalUrl;
|
|
|
|
|
2020-08-01 16:04:24 +02:00
|
|
|
this.addPackage(pkg);
|
2020-08-01 03:51:44 +02:00
|
|
|
|
2020-10-07 21:12:14 +09:00
|
|
|
const plugins = pkg.plugins || [];
|
2020-08-01 03:51:44 +02:00
|
|
|
if (pkg.plugin) {
|
|
|
|
plugins.push(pkg.plugin);
|
|
|
|
}
|
2020-10-07 21:12:14 +09:00
|
|
|
const promises = plugins.map((pluginUrl) => {
|
2020-08-01 16:04:24 +02:00
|
|
|
return pluginManager.loadPlugin(this.mapPath(pkg, pluginUrl));
|
2020-08-01 03:51:44 +02:00
|
|
|
});
|
|
|
|
Promise.all(promises).then(resolve, resolve);
|
|
|
|
} else {
|
|
|
|
onError();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
xhr.onerror = onError;
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
xhr.send();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
/* eslint-enable indent */
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-08-01 03:51:44 +02:00
|
|
|
export default new PackageManager();
|