-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmoduleDownloader.js
More file actions
112 lines (91 loc) · 3.61 KB
/
moduleDownloader.js
File metadata and controls
112 lines (91 loc) · 3.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import { execSync } from 'child_process';
import https from 'https';
import { createWriteStream } from 'fs';
import { readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
import path from 'path';
export default class ModuleDownloader {
static download(file, url, resolve) {
const options = {
headers: { 'User-Agent': 'Lumen-server module downloader https://github.com/L-U-M-E-N/lumen-server' }
};
console.log(url);
const request = https.get(url, options, (response) => {
console.log('Status code: ', response.statusCode);
if(response.statusCode === 302) {
return ModuleDownloader.download(file, response.headers.location, resolve);
}
response.pipe(file);
// after download completed close filestream
file.on("finish", () => {
file.close();
console.log("Download Completed");
resolve();
});
});
}
static async downloadModules() {
log('./initialising.MODULES.DOWNLOAD', 'boot');
const globalPackageConfig = JSON.parse(await readFile(path.join('package.json'), 'utf-8'));
let directoryList = await readdir('modules');
let modified = false;
for(const currModule of config.modules) {
if(!currModule.server) {
continue;
}
// Module already exists
const modulePath = path.join('modules', currModule.name);
const packageConfigPath = path.join(modulePath, 'package.json');
let packageConfig = {};
if(directoryList.includes(currModule.name)) {
packageConfig = JSON.parse(await readFile(packageConfigPath, 'utf-8'));
if(packageConfig.version === currModule.version) {
continue;
}
await rm(modulePath, { recursive: true, force: true });
}
// Download module
const zipPath = path.join('modules', currModule.name + '.zip');
await (new Promise((resolve, reject) => {
const file = createWriteStream(zipPath);
const downloadURL = currModule.server_download_url.replace('%VERSION%', currModule.version);
ModuleDownloader.download(file, downloadURL, resolve);
}));
// Extract module
execSync(`unzip ${zipPath} -d ${modulePath}`);
execSync(`mv ${modulePath.replace('\\', '/')}/*/* ${modulePath}`);
await rm(zipPath);
// Set version
packageConfig = JSON.parse(await readFile(packageConfigPath, 'utf-8'));
packageConfig.version = currModule.version;
// Apply dependency to global package.json
if(packageConfig.dependencies) {
for(const dependencyName in packageConfig.dependencies) {
if(globalPackageConfig.dependencies[dependencyName]) {
if(globalPackageConfig.dependencies[dependencyName] !== packageConfig.dependencies[dependencyName]) {
throw new Error(`Error: dependendency "${dependencyName}" has not the same version between modules: ${globalPackageConfig.dependencies[dependencyName]} VS ${packageConfig.dependencies[dependencyName]}`);
}
continue;
}
console.log("Needs " + dependencyName + " v" + packageConfig.dependencies[dependencyName]);
globalPackageConfig.dependencies[dependencyName] = packageConfig.dependencies[dependencyName];
}
}
await writeFile(packageConfigPath, JSON.stringify(packageConfig, null, 2));
modified = true;
}
if(modified) {
await writeFile('package.json', JSON.stringify(globalPackageConfig, null, 2));
execSync('npm i');
}
const configModuleList = config.modules.filter(x => x.server).map(x => x.name);
for(const moduleName of directoryList) {
console.log('moduleName:', moduleName);
if(!configModuleList.includes(moduleName)) {
const modulePath = path.join('modules', moduleName);
await rm(modulePath, { recursive: true, force: true });
modified = true;
}
}
return modified;
}
}