Об этом проекте
itch — это десктопное приложение для запуска игр с itch.io. Его заявленная цель — позволить пользователям скачивать и запускать игры, получать уведомления об обновлениях и поддерживать игры в актуальном состоянии, не заменяя сам сайт itch.io.
Архитектура
Приложение представляет собой Electron-приложение с многопроцессной архитектурой. Главный процесс (Node.js) управляет состоянием через Redux, бизнес-логикой и координацией с сопутствующими компонентами; он использует паттерн «reactor» для побочных эффектов от действий Redux. Процесс рендеринга — это UI на основе React, состояние которого синхронизируется из главного процесса через electron-redux.
Его поддерживают два сопутствующих компонента на Go:
- butler: демон, который обрабатывает загрузку, установку, обновление и запуск игр, ведёт базу данных SQLite с данными об установках и общается с приложением по RPC на основе TCP. Он запускается как дочерний процесс, привязанный к жизненному циклу приложения.
- itch-setup: исполняемый файл, который выполняет первоначальную установку на всех платформах и управляет проверками самообновления и перезапусками.
Управление версиями (broth)
Приложение управляет версиями butler и itch-setup через систему под названием broth — сервис, который проксирует API itch.io для предоставления фиксированных URL-адресов загрузки бинарных файлов и ресурсов. Бинарные файлы размещаются на broth.itch.zone с идентификаторами платформ, такими как linux-amd64, darwin-arm64 и windows-386. Локально версии хранятся в каталоге broth (например, ~/.config/itch/broth/ в Linux), с распакованными бинарными файлами, временными загрузками и маркером .chosen-version.
Выбор версии использует semver-ограничения, определённые в src/main/broth/formulas.ts (butler ^15.20.0, itch-setup ^1.8.0). Приложение запрашивает эндпоинт /versions и выбирает новейшую версию, удовлетворяющую ограничению; канареечные сборки используют каналы -head без ограничений. При запуске оно проверяет выбранную версию, проверяет наличие новых версий компонентов при изменении версии приложения, скачивает и распаковывает с проверкой CRC32, выполняет проверку работоспособности, затем обновляет маркер и удаляет старые версии. Переопределение для разработки (BROTH_USE_LOCAL=butler) позволяет использовать локально собранный butler.
Привязки butlerd
Для связи с butler используется протокол JSON-RPC 2.0 под названием butlerd. Определения TypeScript для запросов, уведомлений и типов данных находятся в src/common/butlerd/messages.ts и автоматически генерируются из определений типов Go с помощью инструмента под названием generous. Сгенерированный код зависит от npm-пакета @itchio/butlerd, который предоставляет среду выполнения для запуска демона, подключения по TCP и обмена сообщениями JSON-RPC. Привязки можно перегенерировать с помощью npm run sync-butler, когда репозиторий butler размещён как соседний каталог.
itch против kitch
Кодовая база поддерживает два варианта: itch (стабильный) и kitch (канареечный), устанавливаемые параллельно. Вариант определяется git-тегом во время сборки: тег, заканчивающийся на -canary, создаёт kitch, иначе itch. Локальная разработка всегда работает как kitch, поскольку имя в package.json по умолчанию — «kitch»; при продакшн-упаковке оно перезаписывается на «itch» для неканареечных сборок. Различия включают URL-протоколы (itchio:// и itch:// против kitchio:// и kitch://), каналы broth (обычные против -head), semver-ограничения (присутствуют против отсутствуют), идентификаторы бандлов macOS, значки трея/окна и имена артефактов.
Разработка и тестирование
Для разработки требуется npm install, затем npm start для запуска в режиме разработки с отслеживанием и пересборкой. Другие скрипты включают npm run ts-check для проверки типов и npm run compile для сборки ресурсов. Интеграционные тесты используют ChromeDriver для управления приложением Electron и проверки сценариев, таких как вход в систему, установка игр и навигация по UI. Они требуют Go (тестовый раннер написан на Go), дисплей (xvfb в Linux CI) и ключ API itch.io от тестового аккаунта. Версия ChromeDriver должна соответствовать версии Electron; при изменении версии Electron в package.json необходимо соответственно обновить integration-tests/versions.go. Тесты могут запускаться против упакованной сборки (npm run integration-tests) или версии для разработки (node release/test.js --test-dev).
Лицензия и связанные проекты
itch выпускается под лицензией MIT. В README также упоминается Mitch — Android-клиент, начатый другими разработчиками.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.