alwaysai
Version:
The alwaysAI command-line interface (CLI)
55 lines • 1.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.downloadToFile = void 0;
const util_1 = require("util");
const path_1 = require("path");
const fs_1 = require("fs");
const mkdirp = require("mkdirp");
const pump = require("pump");
const rimraf_1 = require("rimraf");
const alwayscli_1 = require("@alwaysai/alwayscli");
const random_string_1 = require("./random-string");
const constants_1 = require("../constants");
const logger_1 = require("./logger");
const stringify_error_1 = require("./stringify-error");
const fetch_1 = require("./fetch");
async function writeToFile(path, readable) {
mkdirp.sync((0, path_1.dirname)(path));
const tmpFilePath = `${path}.${(0, random_string_1.RandomString)()}.tmp`;
try {
await new Promise((resolve, reject) => {
const writeable = (0, fs_1.createWriteStream)(tmpFilePath);
pump(readable, writeable, (err) => {
if (err) {
reject(err);
}
else {
resolve();
}
});
});
await (0, util_1.promisify)(fs_1.rename)(tmpFilePath, path);
}
catch (exception) {
try {
await (0, rimraf_1.default)(tmpFilePath);
}
catch (err) {
logger_1.logger.warn('Failed to delete %s! %s', tmpFilePath, (0, stringify_error_1.stringifyError)(err));
}
throw exception;
}
}
async function downloadToFile(props) {
const { url, path } = props;
logger_1.logger.debug(`Downloading package from ${url}`);
try {
const filestream = await (0, fetch_1.fetchFilestream)(url);
await writeToFile(path, filestream);
}
catch (e) {
throw new alwayscli_1.CliTerseError(`Failed to download ${url}. ${constants_1.PLEASE_REPORT_THIS_ERROR_MESSAGE}`);
}
}
exports.downloadToFile = downloadToFile;
//# sourceMappingURL=download-to-file.js.map