UNPKG

cnpmcore

Version:
117 lines 9.21 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.mimeLookup = exports.downloadToTempfile = exports.createTempfile = exports.createTempDir = void 0; const promises_1 = require("node:fs/promises"); const node_fs_1 = require("node:fs"); const promises_2 = require("node:timers/promises"); const node_path_1 = __importDefault(require("node:path")); const node_url_1 = __importDefault(require("node:url")); const node_crypto_1 = require("node:crypto"); const mime_types_1 = __importDefault(require("mime-types")); const dayjs_1 = __importDefault(require("./dayjs")); async function createTempDir(dataDir, dirname) { // will auto clean on CleanTempDir Schedule let tmpdir = node_path_1.default.join(dataDir, 'downloads', (0, dayjs_1.default)().format('YYYY/MM/DD')); if (dirname) { tmpdir = node_path_1.default.join(tmpdir, dirname); } await (0, promises_1.mkdir)(tmpdir, { recursive: true }); return tmpdir; } exports.createTempDir = createTempDir; async function createTempfile(dataDir, filename) { const tmpdir = await createTempDir(dataDir); // The filename is a URL (from dist.tarball), which needs to be truncated, (`getconf NAME_MAX /` # max filename length: 255 bytes) // https://github.com/cnpm/cnpmjs.org/pull/1345 const tmpfile = node_path_1.default.join(tmpdir, `${(0, node_crypto_1.randomBytes)(10).toString('hex')}-${node_path_1.default.basename(node_url_1.default.parse(filename).pathname)}`); return tmpfile; } exports.createTempfile = createTempfile; async function downloadToTempfile(httpclient, dataDir, url, optionalConfig) { let retries = optionalConfig?.retries || 3; let lastError; while (retries > 0) { try { return await _downloadToTempfile(httpclient, dataDir, url, optionalConfig); } catch (err) { if (err.name === 'DownloadNotFoundError') throw err; lastError = err; } retries--; if (retries > 0) { // sleep 1s ~ 4s in random const delay = process.env.NODE_ENV === 'test' ? 1 : 1000 + Math.random() * 4000; await (0, promises_2.setTimeout)(delay); } } throw lastError; } exports.downloadToTempfile = downloadToTempfile; async function _downloadToTempfile(httpclient, dataDir, url, optionalConfig) { const tmpfile = await createTempfile(dataDir, url); const writeStream = (0, node_fs_1.createWriteStream)(tmpfile); try { // max 10 mins to download // FIXME: should show download progress const requestHeaders = {}; if (optionalConfig?.remoteAuthToken) { requestHeaders.authorization = `Bearer ${optionalConfig.remoteAuthToken}`; } const { status, headers, res } = await httpclient.request(url, { timeout: 60000 * 10, headers: requestHeaders, writeStream, timing: true, followRedirect: true, }); if (status === 404 || (optionalConfig?.ignoreDownloadStatuses && optionalConfig.ignoreDownloadStatuses.includes(status))) { const err = new Error(`Not found, status(${status})`); err.name = 'DownloadNotFoundError'; throw err; } if (status !== 200) { const err = new Error(`Download ${url} status(${status}) invalid`); err.name = 'DownloadStatusInvalidError'; throw err; } return { tmpfile, headers, timing: res.timing, }; } catch (err) { await (0, promises_1.rm)(tmpfile, { force: true }); throw err; } } const DEFAULT_CONTENT_TYPE = 'application/octet-stream'; const PLAIN_TEXT = 'text/plain'; const WHITE_FILENAME_CONTENT_TYPES = { license: PLAIN_TEXT, readme: PLAIN_TEXT, history: PLAIN_TEXT, changelog: PLAIN_TEXT, '.npmignore': PLAIN_TEXT, '.jshintignore': PLAIN_TEXT, '.eslintignore': PLAIN_TEXT, '.jshintrc': 'application/json', '.eslintrc': 'application/json', }; function mimeLookup(filepath) { const filename = node_path_1.default.basename(filepath).toLowerCase(); if (filename.endsWith('.ts')) return PLAIN_TEXT; if (filename.endsWith('.lock')) return PLAIN_TEXT; return mime_types_1.default.lookup(filename) || WHITE_FILENAME_CONTENT_TYPES[filename] || DEFAULT_CONTENT_TYPE; } exports.mimeLookup = mimeLookup; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZVV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcHAvY29tbW9uL0ZpbGVVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLCtDQUE2QztBQUM3QyxxQ0FBNEM7QUFDNUMsbURBQWtEO0FBQ2xELDBEQUE2QjtBQUM3Qix3REFBMkI7QUFDM0IsNkNBQTBDO0FBRTFDLDREQUE4QjtBQUM5QixvREFBNEI7QUFRckIsS0FBSyxVQUFVLGFBQWEsQ0FBQyxPQUFlLEVBQUUsT0FBZ0I7SUFDbkUsMkNBQTJDO0lBQzNDLElBQUksTUFBTSxHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBQSxlQUFLLEdBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUMzRSxJQUFJLE9BQU8sRUFBRTtRQUNYLE1BQU0sR0FBRyxtQkFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDckM7SUFDRCxNQUFNLElBQUEsZ0JBQUssRUFBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6QyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBUkQsc0NBUUM7QUFFTSxLQUFLLFVBQVUsY0FBYyxDQUFDLE9BQWUsRUFBRSxRQUFnQjtJQUNwRSxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxrSUFBa0k7SUFDbEksK0NBQStDO0lBQy9DLE1BQU0sT0FBTyxHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUEseUJBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksbUJBQUksQ0FBQyxRQUFRLENBQUMsa0JBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUyxDQUFDLEVBQUUs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