このプロジェクトについて
itchはitch.ioのゲームをプレイするためのデスクトップアプリケーションです。その目標は、itch.ioウェブサイト自体を置き換えることなく、ユーザーがゲームをダウンロードして実行し、更新通知を受け取り、ゲームを最新の状態に保つことを可能にすることです。
アーキテクチャ
このアプリはマルチプロセス設計のElectronアプリケーションです。メインプロセス(Node.js)はReduxによる状態管理、ビジネスロジック、およびコンパニオンコンポーネントとの調整を処理し、Reduxアクションからの副作用には「リアクター」パターンを使用します。レンダラープロセスはReactベースのUIで、その状態はelectron-reduxを介してメインプロセスから同期されます。
2つのコンパニオンGoコンポーネントがこれをサポートします:
- butler:ゲームのダウンロード、インストール、更新、起動を処理するデーモンで、インストールデータのSQLiteデータベースを保持し、TCPベースのRPCを介してアプリと通信します。アプリのライフサイクルに結び付けられた子プロセスとして生成されます。
- itch-setup:全プラットフォームでの初期インストールを処理し、自己更新チェックと再起動を管理する実行可能ファイルです。
バージョン管理(broth)
アプリはbrothと呼ばれるシステムを通じてbutlerとitch-setupのバージョンを管理します。これはitch.io APIをプロキシして、バイナリとアセットの固定ダウンロードURLを提供するサービスです。バイナリはbroth.itch.zoneでホストされ、linux-amd64、darwin-arm64、windows-386などのプラットフォーム識別子が付けられています。ローカルでは、バージョンはbrothディレクトリ(Linuxでは例:~/.config/itch/broth/)に保存され、抽出されたバイナリ、一時ダウンロード、.chosen-versionマーカーが含まれます。
バージョン選択には、src/main/broth/formulas.tsで定義されたsemver制約(butler ^15.20.0、itch-setup ^1.8.0)を使用します。アプリは/versionsエンドポイントを取得し、制約を満たす最新バージョンを選択します。カナリアビルドは制約のない-headチャネルを使用します。起動時には選択されたバージョンを検証し、アプリのバージョンが変更されたときに新しいコンポーネントバージョンをチェックし、CRC32検証付きでダウンロードと抽出を行い、健全性チェックを実行してからマーカーを更新し、古いバージョンをクリーンアップします。開発用オーバーライド(BROTH_USE_LOCAL=butler)により、ローカルでビルドされたbutlerを使用できます。
butlerdバインディング
butlerとの通信には、butlerdと呼ばれるJSON-RPC 2.0プロトコルを使用します。リクエスト、通知、データ型のTypeScript定義はsrc/common/butlerd/messages.tsにあり、generousと呼ばれるツールを使用してGoの型定義から自動生成されます。生成されたコードは@itchio/butlerd npmパッケージに依存し、デーモンの起動、TCP接続、JSON-RPCメッセージの交換のためのランタイムを提供します。バインディングは、butlerリポジトリが兄弟ディレクトリとしてチェックアウトされている場合、npm run sync-butlerで再生成できます。
itch vs. kitch
コードベースはitch(安定版)とkitch(カナリア版)の2つのバリアントをサポートしており、サイドバイサイドでインストールできます。バリアントはビルド時のgitタグによって決定されます:-canaryで終わるタグはkitchを生成し、それ以外はitchを生成します。ローカル開発はpackage.jsonの名前がデフォルトで「kitch」であるため、常にkitchとして実行されます。本番パッケージングでは、非カナリアビルドの場合に「itch」に上書きされます。違いには、URLプロトコル(itchio://とitch://対kitchio://とkitch://)、brothチャネル(通常対-head)、semver制約(あり対なし)、macOSバンドルID、トレイ/ウィンドウアイコン、アーティファクト名が含まれます。
開発とテスト
開発にはnpm installが必要で、その後npm startで開発モードで実行し、監視と再ビルドを行います。他のスクリプトには、型チェック用のnpm run ts-checkと、アセットをビルドするためのnpm run compileがあります。統合テストはChromeDriverを使用してElectronアプリを制御し、ログイン、ゲームのインストール、UIのナビゲーションなどのフローを実行します。これらにはGo(テストランナーはGoで書かれています)、ディスプレイ(Linux CIではxvfb)、テストアカウントからのitch.io APIキーが必要です。ChromeDriverのバージョンはElectronのバージョンと一致している必要があります。package.jsonのElectronバージョンが変更された場合は、integration-tests/versions.goもそれに応じて更新する必要があります。テストはパッケージ化されたビルド(npm run integration-tests)または開発バージョン(node release/test.js --test-dev)に対して実行できます。
ライセンスと関連プロジェクト
itchはMITライセンスの下でリリースされています。READMEには、他の開発者によって開始されたAndroidクライアントであるMitchについても言及されています。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.