UNPKG

stable-chromium

Version:

A library to install stable Chromium for testing via Gauge and Taiko

163 lines (141 loc) 6.05 kB
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 };