compact logs

This commit is contained in:
2025-12-02 01:37:41 +05:00
parent 5d660e7a95
commit 65ea5418da
3 changed files with 87 additions and 118 deletions

33
package-lock.json generated
View File

@ -14,7 +14,8 @@
"@mui/icons-material": "^7.2.0", "@mui/icons-material": "^7.2.0",
"@mui/material": "^7.2.0", "@mui/material": "^7.2.0",
"@xmcl/core": "^2.14.1", "@xmcl/core": "^2.14.1",
"@xmcl/installer": "^6.1.0", "@xmcl/file-transfer": "^2.0.3",
"@xmcl/installer": "^6.1.2",
"@xmcl/resourcepack": "^1.2.4", "@xmcl/resourcepack": "^1.2.4",
"@xmcl/user": "^4.2.0", "@xmcl/user": "^4.2.0",
"electron-debug": "^4.1.0", "electron-debug": "^4.1.0",
@ -30,7 +31,7 @@
"skinview3d": "^3.4.1", "skinview3d": "^3.4.1",
"stream-browserify": "^3.0.0", "stream-browserify": "^3.0.0",
"three": "^0.178.0", "three": "^0.178.0",
"undici": "^7.11.0", "undici": "^7.16.0",
"util": "^0.12.5", "util": "^0.12.5",
"uuid": "^11.1.0" "uuid": "^11.1.0"
}, },
@ -5967,9 +5968,9 @@
} }
}, },
"node_modules/@xmcl/core": { "node_modules/@xmcl/core": {
"version": "2.14.1", "version": "2.15.1",
"resolved": "https://registry.npmjs.org/@xmcl/core/-/core-2.14.1.tgz", "resolved": "https://registry.npmjs.org/@xmcl/core/-/core-2.15.1.tgz",
"integrity": "sha512-oaaanDX1AG9/eHS6gxg/oYOxKn7bQMcOHFBF7i/gBk/AlhEB72lIkAxssoJZ2zggAz7p1gNNsNCt7ialrhWSkQ==", "integrity": "sha512-ldVWtFGRTnQ836oRnex3YiwCogQmy2XdKfdYz9uAoEbXofMrH/Yq/uEK593iQ9iVJa8Rlfik+LjzGAfsYzR1SQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@xmcl/unzip": "2.1.2" "@xmcl/unzip": "2.1.2"
@ -5979,9 +5980,9 @@
} }
}, },
"node_modules/@xmcl/file-transfer": { "node_modules/@xmcl/file-transfer": {
"version": "2.0.2", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/@xmcl/file-transfer/-/file-transfer-2.0.2.tgz", "resolved": "https://registry.npmjs.org/@xmcl/file-transfer/-/file-transfer-2.0.3.tgz",
"integrity": "sha512-4HZ18relTy2HKB0YPVzWzrGs5Bb74yvMvi6qwl+IYoPqJdUV4xLySGxY7xfTEff5Ct/cy74ZbvqaDFYly0L8Rw==", "integrity": "sha512-IzS1EsmirFF7fHQyJ3Otpu8W7l1vD4qzAlJtFDpkCrMRhfG99smgTiprhlfPzK8XklPe3cq8qKoiEO3v11VI9w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/http-cache-semantics": "^4.0.1", "@types/http-cache-semantics": "^4.0.1",
@ -6014,14 +6015,14 @@
} }
}, },
"node_modules/@xmcl/installer": { "node_modules/@xmcl/installer": {
"version": "6.1.0", "version": "6.1.2",
"resolved": "https://registry.npmjs.org/@xmcl/installer/-/installer-6.1.0.tgz", "resolved": "https://registry.npmjs.org/@xmcl/installer/-/installer-6.1.2.tgz",
"integrity": "sha512-m52Zl5945+ggc/y8unr9i2A0TY7vHwKJEdjvIeSqIPJuWMl57HBOgsi0JUFN3HRlHQOFC4aj+Yw5gt/2PFhv4A==", "integrity": "sha512-q0meO1I4oyL0jCd8mfRD8D92ODgTbg+sQvkfilWwG1115EBd1KNBzqFRKYXzkmEGwjrcCdhbA5Q4ECpJ87Ro0Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@xmcl/asm": "1.0.1", "@xmcl/asm": "1.0.1",
"@xmcl/core": "2.14.1", "@xmcl/core": "2.15.1",
"@xmcl/file-transfer": "2.0.2", "@xmcl/file-transfer": "2.0.3",
"@xmcl/forge-site-parser": "2.0.9", "@xmcl/forge-site-parser": "2.0.9",
"@xmcl/task": "4.1.1", "@xmcl/task": "4.1.1",
"@xmcl/unzip": "2.1.2", "@xmcl/unzip": "2.1.2",
@ -21355,9 +21356,9 @@
} }
}, },
"node_modules/undici": { "node_modules/undici": {
"version": "7.11.0", "version": "7.16.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.11.0.tgz", "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz",
"integrity": "sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==", "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=20.18.1" "node": ">=20.18.1"

View File

@ -108,7 +108,8 @@
"@mui/icons-material": "^7.2.0", "@mui/icons-material": "^7.2.0",
"@mui/material": "^7.2.0", "@mui/material": "^7.2.0",
"@xmcl/core": "^2.14.1", "@xmcl/core": "^2.14.1",
"@xmcl/installer": "^6.1.0", "@xmcl/file-transfer": "^2.0.3",
"@xmcl/installer": "^6.1.2",
"@xmcl/resourcepack": "^1.2.4", "@xmcl/resourcepack": "^1.2.4",
"@xmcl/user": "^4.2.0", "@xmcl/user": "^4.2.0",
"electron-debug": "^4.1.0", "electron-debug": "^4.1.0",
@ -124,7 +125,7 @@
"skinview3d": "^3.4.1", "skinview3d": "^3.4.1",
"stream-browserify": "^3.0.0", "stream-browserify": "^3.0.0",
"three": "^0.178.0", "three": "^0.178.0",
"undici": "^7.11.0", "undici": "^7.16.0",
"util": "^0.12.5", "util": "^0.12.5",
"uuid": "^11.1.0" "uuid": "^11.1.0"
}, },

View File

@ -484,7 +484,7 @@ export function initMinecraftHandlers() {
packName = 'Comfort', // Название основной сборки packName = 'Comfort', // Название основной сборки
versionToLaunchOverride = '', // Возможность переопределить версию для запуска versionToLaunchOverride = '', // Возможность переопределить версию для запуска
serverIp = 'popa-popa.ru', serverIp = 'popa-popa.ru',
serverPort, // Добавляем опциональный порт без значения по умолчанию serverPort, // опциональный порт
} = gameConfig || {}; } = gameConfig || {};
const appPath = path.dirname(app.getPath('exe')); const appPath = path.dirname(app.getPath('exe'));
@ -516,7 +516,7 @@ export function initMinecraftHandlers() {
console.log('Запускаем версию:', versionToLaunch); console.log('Запускаем версию:', versionToLaunch);
// Находим путь к Java // --- Поиск Java ---
event.sender.send('installation-status', { event.sender.send('installation-status', {
step: 'java', step: 'java',
message: 'Поиск Java...', message: 'Поиск Java...',
@ -524,7 +524,7 @@ export function initMinecraftHandlers() {
console.log('Поиск Java...'); console.log('Поиск Java...');
let javaPath; let javaPath: string;
try { try {
javaPath = await findJava(); javaPath = await findJava();
} catch (error) { } catch (error) {
@ -536,8 +536,9 @@ export function initMinecraftHandlers() {
javaPath = 'java'; javaPath = 'java';
} }
// Далее пробуем установить Minecraft, но продолжаем даже при ошибках // --- Установка Minecraft / Fabric / зависимостей ---
let resolvedVersion; let resolvedVersion: any;
try { try {
// 1. Получаем список версий и устанавливаем ванильный Minecraft // 1. Получаем список версий и устанавливаем ванильный Minecraft
event.sender.send('installation-status', { event.sender.send('installation-status', {
@ -563,53 +564,30 @@ export function initMinecraftHandlers() {
console.log('Установка Minecraft...'); console.log('Установка Minecraft...');
try { const installMcTask = installTask(minecraftVersion, minecraftDir, {
const installMcTask = installTask(minecraftVersion, minecraftDir, { // немного уменьшаем агрессию загрузчика
skipRevalidate: true, skipRevalidate: true,
}); assetsDownloadConcurrency: 2,
librariesDownloadConcurrency: 2,
});
console.log('installMcTask:', installMcTask); console.log('installMcTask started for', minecraftVersion.id);
await installMcTask.startAndWait({ await installMcTask.startAndWait({
onStart(task) { onFailed(task, error) {
event.sender.send('installation-status', { const stepName = (task as any).path || task.name || 'unknown';
step: `minecraft-install.${task.path}`, console.warn(
message: `Начало: ${task.name || task.path}`, `[minecraft-install] step "${stepName}" failed: ${
}); (error as any).code ?? ''
}, } ${(error as any).message}`,
onUpdate(task) { );
const percentage =
Math.round(
(installMcTask.progress / installMcTask.total) * 100,
) || 0;
event.sender.send('download-progress', percentage); event.sender.send('installation-status', {
event.sender.send('installation-status', { step: `minecraft-install.${stepName}`,
step: `minecraft-install.${task.path}`, message: `Ошибка: ${(error as any).message}`,
message: `Прогресс ${task.name || task.path}: ${percentage}% (${installMcTask.progress}/${installMcTask.total})`, });
}); },
}, });
onFailed(task, error) {
console.log('onFailed:', task, error);
console.warn(
`Ошибка при установке ${task.path}, продолжаем:`,
error,
);
event.sender.send('installation-status', {
step: `minecraft-install.${task.path}`,
message: `Ошибка: ${error.message}`,
});
},
onSucceed(task) {
event.sender.send('installation-status', {
step: `minecraft-install.${task.path}`,
message: `Завершено: ${task.name || task.path}`,
});
},
});
} catch (error) {
console.log('Ошибка при установке Minecraft, продолжаем:', error);
}
// 2. Устанавливаем Fabric // 2. Устанавливаем Fabric
console.log('Попытка установки Fabric:', { console.log('Попытка установки Fabric:', {
@ -617,6 +595,7 @@ export function initMinecraftHandlers() {
fabricVersion: fabricVersion, fabricVersion: fabricVersion,
minecraftDir: minecraftDir, minecraftDir: minecraftDir,
}); });
try { try {
event.sender.send('installation-status', { event.sender.send('installation-status', {
step: 'fabric-list', step: 'fabric-list',
@ -637,7 +616,7 @@ export function initMinecraftHandlers() {
await installFabric({ await installFabric({
minecraftVersion: baseVersion, minecraftVersion: baseVersion,
version: fabricVersion, // Используйте напрямую, без .version version: fabricVersion,
minecraft: minecraftDir, minecraft: minecraftDir,
}); });
} }
@ -647,7 +626,6 @@ export function initMinecraftHandlers() {
// 3. Подготовка версии и установка зависимостей // 3. Подготовка версии и установка зависимостей
try { try {
// Используем идентификатор Fabric-версии
const fabricVersionId = `${baseVersion}-fabric${fabricVersion}`; const fabricVersionId = `${baseVersion}-fabric${fabricVersion}`;
console.log('version-parse:', fabricVersionId); console.log('version-parse:', fabricVersionId);
@ -673,67 +651,64 @@ export function initMinecraftHandlers() {
}); });
const depsTask = installDependenciesTask(resolvedVersion, { const depsTask = installDependenciesTask(resolvedVersion, {
assetsDownloadConcurrency: 4, // максимально душим параллельность
assetsDownloadConcurrency: 2,
librariesDownloadConcurrency: 2,
// общие оптимизации
skipRevalidate: true, skipRevalidate: true,
prevalidSizeOnly: true, prevalidSizeOnly: true,
checksumValidatorResolver: (checksum) => ({ checksumValidatorResolver: () => ({
validate: async () => { validate: async () => {
/* void */ // отключаем проверку хэшей, чтобы не падать от мелких расхождений
}, },
}), }),
}); });
try { try {
await depsTask.startAndWait({ await depsTask.startAndWait({
onStart(task) {
event.sender.send('installation-status', {
step: `dependencies.${task.path}`,
message: `Начало: ${task.name || task.path}`,
});
},
onUpdate(task) {
const percentage =
Math.round((depsTask.progress / depsTask.total) * 100) || 0;
event.sender.send('download-progress', percentage);
event.sender.send('installation-status', {
step: `dependencies.${task.path}`,
message: `Установка ${task.name || task.path}: ${percentage}%`,
});
},
onFailed(task, error) { onFailed(task, error) {
console.log('onFailed:', task, error); const stepName = (task as any).path || task.name || 'unknown';
console.warn( console.warn(
`Ошибка при установке ${task.path}, продолжаем:`, `[deps] step "${stepName}" failed: ${
error, (error as any).code ?? ''
} ${(error as any).message}`,
); );
event.sender.send('installation-status', { event.sender.send('installation-status', {
step: `dependencies.${task.path}`, step: `dependencies.${stepName}`,
message: `Ошибка: ${error.message}`, message: `Ошибка: ${(error as any).message}`,
});
},
onSucceed(task) {
event.sender.send('installation-status', {
step: `dependencies.${task.path}`,
message: `Завершено: ${task.name || task.path}`,
}); });
}, },
}); });
} catch (error) { } catch (error: any) {
console.log( console.log(
'Ошибка при загрузке ресурсов, продолжаем запуск:', 'Ошибка при загрузке ресурсов, продолжаем запуск:',
error, error.message || error,
); );
} }
} catch (error) { } catch (error: any) {
console.log('Ошибка при подготовке версии, продолжаем:', error); console.log(
'Ошибка при подготовке версии, продолжаем:',
error.message || error,
);
} }
} else {
console.warn(
`Версия ${baseVersion} не найдена в списке версий Minecraft`,
);
} }
} catch (error) { } catch (error: any) {
console.log('Произошла ошибка при подготовке Minecraft:', error); const agg = error as any;
const innerCount = Array.isArray(agg?.errors) ? agg.errors.length : 0;
console.log(
'Ошибка при установке Minecraft/Fabric/зависимостей, продолжаем:',
agg?.message || String(agg),
innerCount ? `(внутренних ошибок: ${innerCount})` : '',
);
} }
// Загрузка и проверка authlib-injector // --- authlib-injector ---
const authlibPath = await ensureAuthlibInjectorExists(appPath); const authlibPath = await ensureAuthlibInjectorExists(appPath);
console.log('authlibPath:', authlibPath); console.log('authlibPath:', authlibPath);
@ -742,7 +717,7 @@ export function initMinecraftHandlers() {
message: 'authlib-injector готов', message: 'authlib-injector готов',
}); });
// Запускаем Minecraft с authlib-injector для Ely.by // --- Запуск игры ---
console.log('Запуск игры...'); console.log('Запуск игры...');
event.sender.send('installation-status', { event.sender.send('installation-status', {
@ -750,15 +725,9 @@ export function initMinecraftHandlers() {
message: 'Запуск игры...', message: 'Запуск игры...',
}); });
console.log('Запуск игры...');
// При запуске используем переданные параметры
const packDir = path.join(versionsDir, packName); const packDir = path.join(versionsDir, packName);
// При формировании конфигурации запуска создаем объект server только с нужными параметрами
const serverConfig: any = { ip: serverIp }; const serverConfig: any = { ip: serverIp };
// Добавляем порт только если он был передан
if (serverPort) { if (serverPort) {
serverConfig.port = serverPort; serverConfig.port = serverPort;
} }
@ -785,7 +754,6 @@ export function initMinecraftHandlers() {
'--quickPlayMultiplayer', '--quickPlayMultiplayer',
`${serverIp}:${serverPort || 25565}`, `${serverIp}:${serverPort || 25565}`,
], ],
// Используем данные аутентификации Yggdrasil
accessToken, accessToken,
gameProfile: { gameProfile: {
id: uuid, id: uuid,
@ -793,7 +761,6 @@ export function initMinecraftHandlers() {
}, },
}); });
// Логирование
proc.stdout?.on('data', (data) => { proc.stdout?.on('data', (data) => {
console.log(`Minecraft stdout: ${data}`); console.log(`Minecraft stdout: ${data}`);
}); });
@ -804,14 +771,14 @@ export function initMinecraftHandlers() {
console.log('Запуск игры...'); console.log('Запуск игры...');
return { success: true, pid: proc.pid }; return { success: true, pid: proc.pid };
} catch (error) { } catch (error: any) {
console.error('Ошибка при запуске Minecraft:', error); console.error('Ошибка при запуске Minecraft:', error);
event.sender.send('installation-status', { event.sender.send('installation-status', {
step: 'error', step: 'error',
message: `Ошибка запуска: ${error.message}`, message: `Ошибка запуска: ${error.message || String(error)}`,
}); });
return { success: false, error: error.message }; return { success: false, error: error.message || String(error) };
} }
}); });