UNPKG

nginx-binaries

Version:

A downloader for nginx and njs standalone binaries.

66 lines 2.66 kB
"use strict"; 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