stable-chromium
Version:
A library to install stable Chromium for testing via Gauge and Taiko
163 lines (141 loc) • 6.05 kB
JavaScript
const extract = require('extract-zip');
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const os = require('os');
const config = require('./config.json');
// Определение платформы
const platform = os.platform();
console.log(`Определена платформа: ${platform}`);
// Получение конфигурации для текущей платформы
const platformConfig = config.platforms[platform];
if (!platformConfig) {
console.error(`Ошибка: конфигурация для платформы "${platform}" не найдена в config.json`);
throw new Error(`Неподдерживаемая платформа: ${platform}`);
}
let Chrome_URL = platformConfig.Chrome_URL;
// Нормализация UNC-пути для Windows
if (platform === 'win32' && Chrome_URL.startsWith('\\') && !Chrome_URL.startsWith('\\\\')) {
Chrome_URL = '\\' + Chrome_URL;
console.log(`Преобразованный UNC-путь: ${Chrome_URL}`);
}
const DOWNLOAD_PATH = path.resolve(platformConfig.DOWNLOAD_PATH);
const EXTRACT_PATH = path.resolve(platformConfig.EXTRACT_PATH);
function ensureDirExists(dir) {
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
console.log(`Создана директория: ${dir}`);
}
}
async function downloadChrome() {
if (!Chrome_URL) {
console.error('Ошибка: Chrome_URL не задан в config.');
throw new Error('Chrome_URL не задан');
}
ensureDirExists(path.dirname(DOWNLOAD_PATH));
// Проверка: URL или локальный путь
const isHttpUrl = Chrome_URL.startsWith('http://') || Chrome_URL.startsWith('https://');
if (isHttpUrl) {
// Скачивание через HTTP
console.log('Начало скачивания Chrome из интернета...');
console.log(`URL: ${Chrome_URL}`);
try {
const response = await axios({
method: 'get',
url: Chrome_URL,
responseType: 'stream',
onDownloadProgress: (progressEvent) => {
if (progressEvent.total) {
const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
console.log(`Загружено: ${percentCompleted}%`);
}
}
});
const writer = fs.createWriteStream(DOWNLOAD_PATH);
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on('finish', () => {
console.log('Скачивание завершено.');
resolve();
});
writer.on('error', (err) => {
console.error('Ошибка при записи файла:', err);
reject(err);
});
});
} catch (error) {
console.error('Ошибка при скачивании Chrome:', error.message);
throw error;
}
} else {
// Копирование локального файла
console.log('Начало копирования Chrome из сети...');
if (!fs.existsSync(Chrome_URL)) {
console.error(`Ошибка: исходный файл не найден по пути ${Chrome_URL}`);
throw new Error('Исходный файл не найден');
}
return new Promise((resolve, reject) => {
const readStream = fs.createReadStream(Chrome_URL);
const writer = fs.createWriteStream(DOWNLOAD_PATH);
readStream.on('error', (err) => {
console.error('Ошибка при чтении исходного файла:', err);
reject(err);
});
writer.on('error', (err) => {
console.error('Ошибка при записи файла:', err);
reject(err);
});
writer.on('finish', () => {
console.log('Копирование завершено.');
resolve();
});
readStream.pipe(writer);
});
}
}
async function extractChrome() {
console.log('Начало распаковки Chrome...');
if (!fs.existsSync(DOWNLOAD_PATH)) {
console.error(`Ошибка: архив не найден по пути ${DOWNLOAD_PATH}`);
throw new Error('Архив не найден');
}
ensureDirExists(EXTRACT_PATH);
try {
console.log('Распаковка ZIP архива...');
await extract(DOWNLOAD_PATH, { dir: EXTRACT_PATH });
console.log('Распаковка завершена.');
try {
fs.unlinkSync(DOWNLOAD_PATH);
console.log('Архив удалён после распаковки.');
} catch (unlinkError) {
console.error('Ошибка при удалении архива:', unlinkError);
}
} catch (error) {
console.error('Ошибка при распаковке Chrome:', error);
throw error;
}
}
async function installChrome() {
console.log('Начало установки Chrome...');
try {
await downloadChrome();
} catch (error) {
console.error('Установка прервана на этапе копирования.');
return;
}
try {
await extractChrome();
} catch (error) {
console.error('Установка прервана на этапе распаковки.');
return;
}
console.log('Chrome успешно установлен!');
}
if (require.main === module) {
installChrome().catch(err => {
console.error('Необработанная ошибка установки:', err);
});
}
module.exports = {
install: installChrome
};