thelounge
Version:
The self-hosted Web IRC client
102 lines (101 loc) • 3.79 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const got_1 = __importDefault(require("got"));
const chalk_1 = __importDefault(require("chalk"));
const log_1 = __importDefault(require("../log"));
const package_json_1 = __importDefault(require("../../package.json"));
const config_1 = __importDefault(require("../config"));
const TIME_TO_LIVE = 15 * 60 * 1000; // 15 minutes, in milliseconds
exports.default = {
isUpdateAvailable: false,
fetch,
checkForUpdates,
};
const versions = {
current: {
version: `v${package_json_1.default.version}`,
changelog: undefined,
},
expiresAt: -1,
latest: undefined,
packages: undefined,
};
async function fetch() {
const time = Date.now();
// Serving information from cache
if (versions.expiresAt > time) {
return versions;
}
try {
const response = await (0, got_1.default)("https://api.github.com/repos/thelounge/thelounge/releases", {
headers: {
Accept: "application/vnd.github.v3.html",
"User-Agent": package_json_1.default.name + "; +" + package_json_1.default.repository.url, // Identify the client
},
localAddress: config_1.default.values.bind,
});
if (response.statusCode !== 200) {
return versions;
}
updateVersions(response);
// Add expiration date to the data to send to the client for later refresh
versions.expiresAt = time + TIME_TO_LIVE;
}
catch (error) {
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
log_1.default.error(`Failed to fetch changelog: ${error}`);
}
return versions;
}
function updateVersions(response) {
let i;
let release;
let prerelease = false;
const body = JSON.parse(response.body);
// Find the current release among releases on GitHub
for (i = 0; i < body.length; i++) {
release = body[i];
if (release.tag_name === versions.current.version) {
versions.current.changelog = release.body_html;
prerelease = release.prerelease;
break;
}
}
// Find the latest release made after the current one if there is one
if (i > 0) {
for (let j = 0; j < i; j++) {
release = body[j];
// Find latest release or pre-release if current version is also a pre-release
if (!release.prerelease || release.prerelease === prerelease) {
module.exports.isUpdateAvailable = true;
versions.latest = {
prerelease: release.prerelease,
version: release.tag_name,
url: release.html_url,
};
break;
}
}
}
}
function checkForUpdates(manager) {
fetch()
.then((versionData) => {
if (!module.exports.isUpdateAvailable) {
// Check for updates every 24 hours + random jitter of <3 hours
setTimeout(() => checkForUpdates(manager), 24 * 3600 * 1000 + Math.floor(Math.random() * 10000000));
}
if (!versionData.latest) {
return;
}
log_1.default.info(`The Lounge ${chalk_1.default.green(versionData.latest.version)} is available. Read more on GitHub: ${versionData.latest.url}`);
// Notify all connected clients about the new version
manager.clients.forEach((client) => client.emit("changelog:newversion"));
})
.catch((error) => {
log_1.default.error(`Failed to check for updates: ${error.message}`);
});
}