1
0
mirror of https://github.com/spacebarchat/server.git synced 2024-11-26 04:03:03 +01:00

🚧 auto update

This commit is contained in:
Flam3rboy 2021-08-15 14:41:14 +02:00
parent 4f12d6d353
commit a086735e27
2 changed files with 82 additions and 0 deletions

View File

@ -0,0 +1,80 @@
import "missing-native-js-functions";
import fetch from "node-fetch";
import readline from "readline";
import fs from "fs/promises";
import path from "path";
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
export function enableAutoUpdate(opts: {
checkInterval: number | boolean;
packageJsonLink: string;
path: string;
downloadUrl: string;
downloadType?: "zip";
}) {
if (!opts.checkInterval) return;
var interval = 1000 * 60 * 60 * 24;
if (typeof opts.checkInterval === "number") opts.checkInterval = 1000 * interval;
const i = setInterval(async () => {
const currentVersion = await getCurrentVersion(opts.path);
const latestVersion = await getLatestVersion(opts.packageJsonLink);
if (currentVersion !== latestVersion) {
clearInterval(i);
console.log(`[Auto Update] Current version (${currentVersion}) is out of date, updating ...`);
await download(opts.downloadUrl, opts.path);
}
}, interval);
setImmediate(async () => {
const currentVersion = await getCurrentVersion(opts.path);
const latestVersion = await getLatestVersion(opts.packageJsonLink);
if (currentVersion !== latestVersion) {
rl.question(
`[Auto Update] Current version (${currentVersion}) is out of date, would you like to update? (yes/no)`,
(answer) => {
if (answer.toBoolean()) {
console.log(`[Auto update] updating ...`);
download(opts.downloadUrl, opts.path);
} else {
}
}
);
}
});
}
async function download(url: string, dir: string) {
try {
// TODO: use file stream instead of buffer (to prevent crash because of high memory usage for big files)
// TODO check file hash
const response = await fetch(url);
const buffer = await response.buffer();
const tempDir = await fs.mkdtemp("fosscord");
fs.writeFile(path.join(tempDir, "Fosscord.zip"), buffer);
} catch (error) {
console.error(`[Auto Update] download failed`, error);
}
}
async function getCurrentVersion(dir: string) {
try {
const content = await fs.readFile(path.join(dir, "package.json"), { encoding: "utf8" });
return JSON.parse(content).version;
} catch (error) {
throw new Error("[Auto update] couldn't get current version in " + dir);
}
}
async function getLatestVersion(url: string) {
try {
const response = await fetch(url);
const content = await response.json();
return content.version;
} catch (error) {
throw new Error("[Auto update] check failed for " + url);
}
}

View File

@ -99,6 +99,7 @@ export interface DefaultOptions {
};
};
security: {
autoUpdate: boolean | number;
requestSignature: string;
jwtSecret: string;
forwadedFor: string | null; // header to get the real user ip address
@ -230,6 +231,7 @@ export const DefaultOptions: DefaultOptions = {
},
},
security: {
autoUpdate: true,
requestSignature: crypto.randomBytes(32).toString("base64"),
jwtSecret: crypto.randomBytes(256).toString("base64"),
forwadedFor: null,