アーキテクチャ
アプリケーションは Go + MyGo のネイティブ UI を使用します。VitePress は独立したドキュメントのビルドであり、アプリケーションのフロントエンドとして組み込まれていません。
状態と所有権
main.go は CLI オプションを解析し、名前、バージョン、設定パス、mygo.json から埋め込まれた公開更新設定を internal/app.Run に渡します。app パッケージはネイティブのライフサイクル、ウィンドウ、UI テストを管理します。application は設定ストアとアクティブウィンドウを所有します。window は接続、転送パネル、設定、保存した場所、コマンドパレットの状態に加え、ブラウザー、オブジェクト、Bucket、RAM、メール、更新の機能別状態をまとめます。ビューは状態を宣言的に読み取り、commands() がメニューとコマンドパレットの両方の操作を定義します。
ネイティブの言語・テーマ API は UI スレッドで実行します。設定変更はバックグラウンドで保存し、その後 UI スナップショット、言語、外観、カスタムメニューをまとめて更新します。
バックグラウンド処理
ブロッキング処理は window.run を通します。開始前にユーザー入力をコピーし、コンテキストによるキャンセルをサポートして、Window.Update で結果を反映します。
internal/tasks は世代を確認し、遅れて届いた進捗・完了コールバックが置き換え済みのタスクや閉じたウィンドウを更新しないようにします。基盤は設定とブラウザー操作を直列化します。internal/transfers.Queue は独立したスケジューラーで、待機リストと実行数を使ってアップロード・ダウンロードを個別に制限し、変更操作には 1 スロットを設けます。これにより転送中も閲覧できます。AddBatch は選択分をまとめて追加してから一度だけスケジュールし、完了時には待機キューの先頭だけを確認します。削除されたワーカーも完了まではスロットを保持します。完了・スキップしたジョブは処理クロージャを解放し、履歴圧縮時には破棄したポインターを消去します。状態とコールバックは UI が所有し、ワーカーにはコピーしたファイルパス、オブジェクト、サービス参照を渡します。キャンセルはワーカーのコンテキストに伝わり、再試行は停止後に開始します。切断時にキューの世代をリセットし、ジョブのクロージャを解放するため、旧セッションのコールバックは新しい転送に影響しません。
永続化
config.Store はスキーマバージョン、言語、外観を検証します。スナップショットはミューテックスで保護します。一時ファイルへの書き込み、同期、名前変更を行い、永続化が成功した後にだけメモリを変更します。
破損した設定や未対応の設定を自動で上書きすることはありません。ファイルを修復して設定の再読み込みを実行してください。古い schema-v1 ファイルに言語がなければ system を継承します。
国際化
internal/i18n/locales/*.json は Go バイナリに埋め込まれます。意味に基づくキーにより、UI コードは元の言語に依存しません。言語の解決とフォールバックは rivu と同じ方式です。言語と外観を参照してください。
OSS との境界
internal/ossclient は Alibaba Cloud 公式 OSS Go SDK v2 をラップし、HTTPS Endpoint の検証、AccessKey/STS 署名、リージョン対応クライアント、ページ分割、機密情報を除いたエラーを提供します。internal/app の connection_actions.go はログインと復旧を調整し、browser_state.go は移動履歴、一覧の統合、並び替えキャッシュを所有し、browser_actions.go は移動要求を調整します。対応するビューファイルが Design v2 の画面を描画します。プレビュー、共有、メタデータ、ACL のフィールドはオブジェクトダイアログの枠組みから分離され、変更操作には専用のキュー制御があります。転送アダプターは進捗付きでファイルをストリーミングし、明示的な競合方針を提供し、利用可能ならダウンロードの ETag を制約します。ローカル一時ファイルを確定する前にサイズと CRC64 を検証します。SDK の転送マネージャーがマルチパートとチェックポイント復旧を提供します。上書き禁止ヘッダーの挙動は OSS Bucket のバージョニングに従います。UI は SDK を直接呼び出したり、秘密情報を永続化したりしてはいけません。
設計資料と実装マイルストーンは別々に追跡します。製品アプリは実際の OSS リクエストを使用し、固定データはテスト専用です。アカウント全体の一覧取得と Bucket/プレフィックスへの直接接続では必要な権限が異なります。接続プロファイルは ID、Secret、Token を含めず保存します。並び替えは読み込み済みページ内で行い、オブジェクトのプレフィックス検索はサーバー側で行います。
永続的な転送とオブジェクト操作
internal/transfers.Record は、変更不可の操作記述と直近の結果を 1 件ずつ JSON ファイルに保存します。処理の前後に、所有者のみアクセス可能な権限でファイルをアトミックに置き換えます。接続プロファイルと AccessKey ID のハッシュで復旧ディレクトリを分離し、秘密情報と署名付き URL はシリアライズしません。復元時、未完了の項目は停止状態で表示され、明示的な再試行が必要です。有効な未完了記録とファイル別診断を返し、破損記録はディスクに残して他のジョブの復元を妨げません。SDK のチェックポイントディレクトリはジョブ単位で所有し、同じチェックポイントに並行アクセスできません。記録のリースはワーカー実行から最終ジャーナル書き込みまで保持します。明示的な削除では削除マーカーを書き、ワーカー終了後にジャーナル、チェックポイント、非公開のダウンロード作業ディレクトリを清掃します。終了状態の記録は 7 日間保持し、接続時に削除します。未完了・破損記録は経過時間で削除しません。清掃に失敗したデータは次回の清掃に残します。
アップロード、ダウンロード、再帰的なオブジェクト計画は MyGo から独立した internal/transfers にあります。フォルダー計画はシンボリックリンクと通常ファイル以外の入力を拒否し、ダウンロード先の準備には os.Root を使用します。OSS キーはパストラバーサル、予約名、大文字・小文字の衝突を確認します。転送ジョブは選択した相対ツリーを保持します。ダウンロード SDK のチェックポイントは再利用前に保存済み範囲を検証します。キャンセル時もパートデータは残り、リモートのマルチパート削除は確認付きの Bucket ダイアログから実行できます。
internal/vault は OS の資格情報ストアをラップします。保存・削除には明示的な UI 操作が必要です。ログイン保持は後のストア読み込みを許可し、平文へのフォールバックは行いません。テストにはメモリ内プロバイダーを使います。internal/ossclient は UI 制御とは独立して、認証コードの期限、読み取り専用制限、ルート範囲を強制します。
オブジェクトのプレビューにはデコード前に上限を適用します。編集したテキストは既定で新しいキーに保存します。元のオブジェクトの置換は明示的に選択し、ETag を事前確認してヘッダー、メタデータ、ACL、タグ、ストレージクラスを保持します。事前確認と PUT はアトミックではありません。メタデータの自己コピーは元の ETag を制約し、ACL とコンテンツヘッダーを保持します。移動の再試行は成功済みのコピーを記憶しますが、削除は引き続き独立した非アトミックな OSS 操作です。変更ジョブはセッション限定で、再起動後に再実行しません。
更新確認は internal/updates を使い、設定済みの MyGo フィード/署名形式と MyGo のインストール適格性に従います。それ以外は固定の GitHub リポジトリを使用します。自動更新は完全なアーカイブの準備と検証だけを行い、明示的なインストール時に再検証します。置換失敗時はロールバックし、その後 MyGo の再起動操作を別途行います。差分アーカイブは使いません。未設定の開発ビルドは手動ダウンロードを提供します。更新、サムネイル、詳細取得は個別のキャンセル世代を持ちます。設定は独立したカテゴリーダイアログで、下書き検証と保存をデバウンスします。RAM/STS は署名付き OpenAPI リクエスト、SMTP は TLS を使用します。上限付き診断ワーカーはペイロードや秘密情報を含めず、操作状態とエラー種別を保存します。
プロトコル資料:OSS Uploader、PutObject、CopyObject、および設計からリンクした固定バージョンの上流 OSS Browser 認証コード形式。
一覧と描画のコスト
ページ統合はキー集合を使い、線形時間で重複を除去します。更新・統合時に一覧スライスを置き換え、ブラウザー状態は一覧の識別子、並び順、検索条件に基づいて行をキャッシュします。転送履歴と確認一覧には ui.List を使い、見える行だけを構築します。履歴行のキーはジョブ識別子なので、絞り込みや削除後も正しい操作に対応します。
バージョンの境界
internal/buildinfo.Version がデスクトップ版のバージョンの基準です。ルートのエントリーが app.Run に渡し、tools/version が mygo.json との整合性確認や同期を行います。CI、make check、Release ワークフローは同じ検査を実行します。非公開のルート npm パッケージのバージョンはデスクトップのリリースを表しません。