NodeBB/NodeBB

View on GitHub
src/admin/versions.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

const request = require('../request');
const meta = require('../meta');

let versionCache = '';
let versionCacheLastModified = '';

const isPrerelease = /^v?\d+\.\d+\.\d+-.+$/;
const latestReleaseUrl = 'https://api.github.com/repos/NodeBB/NodeBB/releases/latest';

async function getLatestVersion() {
    const headers = {
        Accept: 'application/vnd.github.v3+json',
        'User-Agent': encodeURIComponent(`NodeBB Admin Control Panel/${meta.config.title}`),
    };

    if (versionCacheLastModified) {
        headers['If-Modified-Since'] = versionCacheLastModified;
    }

    const { body: latestRelease, response } = await request.get(latestReleaseUrl, {
        headers: headers,
        timeout: 2000,
    });
    if (response.statusCode === 304) {
        return versionCache;
    }
    if (response.statusCode !== 200) {
        throw new Error(response.statusText);
    }
    if (!latestRelease || !latestRelease.tag_name) {
        throw new Error('[[error:cant-get-latest-release]]');
    }
    const tagName = latestRelease.tag_name.replace(/^v/, '');
    versionCache = tagName;
    versionCacheLastModified = response.headers['last-modified'];
    return versionCache;
}

exports.getLatestVersion = getLatestVersion;
exports.isPrerelease = isPrerelease;

require('../promisify')(exports);