Что возвращает API
POST /api/launcher/builds/profile возвращает четыре связанных объекта:
profile описывает правила запуска Minecraft. build описывает файлы
конкретной сборки. runtime описывает доверенную Java, общую для всех
профилей с той же рекомендуемой версией.
Перед передачей build manifest в Rust scanner main process получает active
release из launcher-server, проверяет Ed25519 envelope по pinned public key и
сравнивает compatibility payload сайта с подписанным контрактом. Проверяются
не только пути, размеры и SHA-256, но и mainClass, classpath, JVM/game args,
asset index, Java runtime, категории файлов и policy managed/
replace-on-update. Частичное совпадение недостаточно: ослабленная файловая
политика или подменённый параметр запуска завершают подготовку с
CONTROL_PLANE_MANIFEST_MISMATCH.
Новые release envelopes также содержат отдельные resources inventories для
assets и Java runtime. В strict production-режиме оба обязательны: до запуска
scanner лаунчер сравнивает их id, полный file set, total size, SHA-256,
категории и optional-флаги с ответом site API. Старые envelopes без resources
допускаются только пока выключен enforceSignedReleases.
После проверки envelope main process выбирает mirror с наименьшим priority и
переводит build/assets/runtime resolver на подписанные URL
https://cdn.wraithbound.com/launcher/.... Renderer не получает control-plane
token или S3 credentials; native downloader видит только конечные HTTPS URL и
ожидаемые SHA-256.
Сайт по-прежнему отвечает за пользовательскую авторизацию и адрес выбранного
Minecraft-сервера. Критичные для исполнения поля он получает возможность
передать launcher только тогда, когда они совпадают с envelope, подписанным CI.
Перед непосредственным запуском Minecraft release проверяется повторно. Если
его отозвали, заблокировали или переключили после загрузки, ранее подготовленный
клиент не запускается. Пользователь должен получить и проверить актуальный
release заново.
Public bootstrap control-plane загружается параллельно с профилем и каталогом
серверов, пока открыт preload. Свежий результат переиспользуется не дольше 15
секунд, поэтому открытие сборки не создаёт лишний сетевой запрос. Эта
оптимизация не применяется к последней проверке перед запуском Minecraft: она
всегда принудительно запрашивает актуальный active release.
После preload main process обновляет public catalog каждые 30 секунд и
передаёт renderer только типизированный snapshot. Страница сервера реагирует на
locked и отсутствие active release без исчезновения основного содержимого;
временная недоступность control plane показывается отдельно и не подменяет
обязательную main-process проверку собственной логикой renderer-а.
Тот же snapshot поступает внутреннему main-process подписчику. Если уже
проверенный release отозван, заблокирован или заменён, его identity удаляется из
кэша, активный scanner/downloader отменяется, а готовая сборка переходит в
понятное состояние ошибки. Сетевой сбой сам по себе кэш не отзывает: перед
следующим запуском всё равно выполняется строгая принудительная проверка.
Signed maintenance проверяется тем же trust root. Main process блокирует
подготовку в install-disabled/full и запуск в launch-disabled/full для
затронутых build id. Renderer получает только проверенный policy snapshot;
full maintenance отображается обязательным окном и обновляется раз в 30 секунд.
Правила обслуживания не зависят от Electron API: отдельный адаптер рассылает
копии проверенного snapshot по renderer-окнам, а polling останавливается перед
завершением приложения. Поэтому доменные ограничения проверяются тестами без
запуска BrowserWindow и не оставляют timer после выхода.
Окно подготовки остаётся модальным слоем поверх настоящей страницы выбранного
сервера, поэтому фон не исчезает во время запросов. Transport errors, недоступный
control plane, обслуживание, блокировка и отзыв release преобразуются в разные
пользовательские состояния с повтором запроса; внутренние коды остаются в логах.
Локальные каталоги
{storageRoot} равен {userData}/storage. Пользователь может
перенести весь корень на другой диск в настройках лаунчера; клиент, assets,
Java runtime, manifests, download plans и Guardian policy переезжают вместе.
Java хранится отдельно от клиента. Поэтому, например, Java 17 загружается
один раз и повторно используется несколькими сборками. Перед каждым запуском
её целостность всё равно проверяется по манифесту.
Подготовка файлов клиента
Правила берутся изprofile.json:
managed вычисляется как объединение update + updateVerify. Лишний файл
может быть удалён только внутри управляемой области и только если он не
попадает в preserve/exclusions. Пользовательские saves, screenshots,
resourcepacks, shaderpacks, logs, crash-reports и options.txt
сохраняются по умолчанию.
В периодическую Guardian-проверку входят только файлы из updateVerify.
Файлы только из update восстанавливаются перед запуском, но могут штатно
изменяться во время игры. Весь Java runtime всегда защищён.
Подготовка Java
Версия runtime равнаrecommendJavaVersion. Сейчас поддерживается desktop
цель win32-x64. Сканер проверяет весь runtime; downloader получает только
отсутствующие или изменённые файлы. После загрузки выполняется повторная
проверка.
Запуск запрещается, если:
bin/javaw.exeилиbin/java.exeотсутствует в runtime-манифесте;- SHA-256
javaw.exeне совпадает; - версия Java находится вне
minJavaVersion..maxJavaVersion; - финальная проверка runtime не прошла.
warnMissJavaVersion не разрешает запуск неподходящей Java. Лаунчер сам
загружает точную рекомендуемую версию, поэтому обычному пользователю не нужно
устанавливать Java вручную.Формирование classpath
Лаунчер объединяетclassPath и altClassPath. Если элемент указывает на
каталог, все .jar внутри него находятся рекурсивно и сортируются для
детерминированного запуска. Если элемент указывает на файл, он добавляется
напрямую.
mainClass добавляется после -cp. Пустой classpath и некорректный Java
class name приводят к отказу до запуска.
compatClasses пока должны быть пустыми: их последовательный запуск требует
отдельного Java bootstrap-класса. При непустом массиве возвращается
COMPAT_CLASSES_REQUIRE_BOOTSTRAP.
JVM и Minecraft arguments
Лаунчер используетjvmArgs из профиля. Если -Xmx и -Xms не заданы,
они вычисляются автоматически:
settings.ram > 0— точное значение в мегабайтах;settings.ram = 0— 50% системной памяти, минимум 2048 МБ и максимум 8192 МБ.
Лаунчер всегда передаёт Minecraft как минимум:
settings.fullScreen = true, добавляется --fullscreen. Если
settings.autoEnter = true, добавляются --server и --port из сервера с
isDefault = true.
Authlib
Custom authlib является библиотекой самой Minecraft-сборки и должна входить в её manifest/classpath. Лаунчер не подключает authlib через-javaagent и не
подменяет её код. Он передаёт валидные username, UUID и access token, а
библиотека обращается к Wraithbound authlib endpoint’ам самостоятельно.
Это важно для Guardian: сторонние -javaagent, Attach API и инструментация
запрещены, но обычная authlib-библиотека в доверенном classpath работает.
Автоматический запуск и состояния
Main-процесс владеет состоянием игры:hideDuringGame = true главное окно скрывается после события
guardianStarted и возвращается после завершения процесса. Discord Presence
переключается между downloading/launching/playing и возвращается к launcher.
Отмена и остановка
- во время загрузки отменяется HTTP-запрос и активный Rust-процесс;
- до старта Guardian выставляется флаг отмены, поэтому Java не запустится;
- после старта завершается Guardian; Job Object завершает всё дерево Minecraft;
- окно лаунчера восстанавливается независимо от exit code.
Ограничения текущей реализации
- runtime target пока
win32-x64; compatClassesтребуют будущий Java bootstrap;- authlib должна уже находиться в сборке;
- реальный запуск возможен только после загрузки runtime и build manifests в S3.
