nginx-binaries
Version:
A downloader for nginx and njs standalone binaries.
66 lines • 2.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatQuery = exports.queryIndex = exports.getIndex = exports.FORMAT_VERSION = void 0;
const FS = require("node:fs");
const path = require("node:path");
const node_fetch_1 = require("node-fetch");
const semver = require("semver");
const archName_1 = require("./internal/archName");
const fetch_1 = require("./internal/fetch");
const logger_1 = require("./logger");
/**
* Expected version of the index file.
* Keep in sync with FORMAT_VERSION in scripts/generate-index!
*/
exports.FORMAT_VERSION = 2;
async function getIndex(repoUrl, cacheDir, fetchTimeout, cacheMaxAge) {
const cachedIndexPath = path.join(cacheDir, 'index.json');
const readCachedIndex = () => JSON.parse(FS.readFileSync(cachedIndexPath, 'utf8'));
let isCached = false;
try {
if (Date.now() - FS.statSync(cachedIndexPath).mtimeMs < cacheMaxAge * 60000) {
logger_1.log.debug(`Using cached index ${cachedIndexPath}`);
return readCachedIndex();
}
isCached = true;
}
catch {
// ignore
}
try {
logger_1.log.debug(`Fetching ${repoUrl}/index.json`);
const index = await (0, fetch_1.fetchJson)(`${repoUrl}/index.json`, { timeout: fetchTimeout });
FS.mkdirSync(cacheDir, { recursive: true });
FS.writeFileSync(cachedIndexPath, JSON.stringify(index, null, 2));
return index;
}
catch (err) {
if (isCached && err instanceof node_fetch_1.FetchError && err.type === 'system') {
logger_1.log.warn('Failed to refresh repository index, using stale index');
return readCachedIndex();
}
throw err;
}
}
exports.getIndex = getIndex;
function queryIndex(index, name, query) {
logger_1.log.debug(`Looking for ${name} binary matching ${(0, exports.formatQuery)(query)}`);
return index.contents
.filter(x => x.name === name)
.filter(queryFilter(query))
.sort((a, b) => semver.rcompare(a.version, b.version));
}
exports.queryIndex = queryIndex;
const formatQuery = (query) => JSON.stringify(query)
.replace(/"/g, '')
.replace(/,/g, ', ')
.replace(/:/g, ': ');
exports.formatQuery = formatQuery;
const queryFilter = (query) => (meta) => objKeys(query).every(key => {
return query[key] === undefined ? false
: key === 'version' ? semver.satisfies(meta[key], query[key])
: key === 'arch' ? (0, archName_1.normalizeArch)(query[key]) === meta[key]
: query[key] === meta[key];
});
const objKeys = (obj) => Object.keys(obj);
//# sourceMappingURL=repoIndex.js.map