Skip to content

架構 ​

應用使用 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 是獨立排程器,使用待處理列表和運行計數,分別限制上傳、下載,並提供一個物件修改任務槽,因此傳輸期間仍可瀏覽。AddBatch 先追加整批選擇,再排程一次;任務完成時只檢查待處理佇列頭。已移除但尚未完成的工作仍佔用任務槽。完成或跳過的任務釋放工作閉包,壓縮歷史時清除丟棄的指標。狀態與回呼由 UI 持有,工作執行緒接收複製的檔案路徑、物件及服務引用。取消傳遞到工作上下文;重試在工作停止後啟動。斷開連接會重置佇列代次並釋放任務閉包,舊會話回呼無法影響新傳輸。

持久化 ​

config.Store 校驗架構版本、語言和外觀。互斥鎖保護快照。寫入使用臨時檔案、同步和重新命名;只有持久化成功後才更新記憶體。

損壞或不受支援的設定不會被自動覆蓋。修復檔案後使用“重新載入設定”。較舊的 schema-v1 檔案若缺少語言欄位,則繼承 system。

國際化 ​

internal/i18n/locales/*.json 嵌入 Go 二進位檔。語義化鍵讓 UI 程式碼不依賴任何源語言。語言解析與回退採用和 rivu 相同的方式。參見語言與外觀。

OSS 邊界 ​

internal/ossclient 封裝阿里雲官方 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 在每個 JSON 檔案中儲存一項不可變操作描述及其最近結果。工作開始前和結束後,以僅所有者可訪問的權限原子替換檔案。連接設定和 AccessKey ID 經雜湊後用於隔離恢復目錄;金鑰和簽名 URL 均不序列化。恢復時將未完成記錄呈現為已停止,必須顯式重試。恢復同時返回有效的未完成記錄與逐檔案診斷;損壞記錄保留在磁碟上,不阻止其他任務恢復。SDK 檢查點目錄屬於單個任務,並行嘗試不能操作同一檢查點。記錄租約覆蓋工作執行及最後一次日誌寫入。顯式移除會寫入刪除標記,工作結束後清理日誌、檢查點和私有下載暫存目錄。終止狀態記錄保留七天,在連接時清理;未完成或損壞記錄永不過期刪除。清理失敗的資料留待下一輪處理。

上傳、下載和遞迴物件規劃位於 internal/transfers,獨立於 MyGo。目錄規劃拒絕符號連結及非普通輸入,準備下載目錄時使用 os.Root。OSS 鍵會檢查路徑穿越、保留名稱及大小寫衝突。傳輸任務保留所選相對目錄樹。下載 SDK 檢查點在重用前校驗已儲存範圍。取消時保留分片資料;遠端分片清理由需要確認的 Bucket 分片對話方塊提供。

internal/vault 封裝作業系統憑據庫。儲存和刪除都要求顯式 UI 操作;保持登入授權後續讀取憑據庫,絕不回退到明文。測試使用記憶體憑據庫提供者。internal/ossclient 獨立於 UI 控制項強制檢查授權碼到期時間、只讀限制及根目錄範圍。

物件預覽在解碼前施加上限。編輯文字預設儲存到新鍵。替換原物件需要顯式選擇,執行 ETag 預檢並保留標頭、中繼資料、ACL、標籤及儲存類型;預檢與 PUT 不具備原子性。中繼資料自複製約束源 ETag,並保留 ACL 和內容標頭。移動重試會記住已成功的複製;刪除仍是獨立、非原子的 OSS 操作。物件修改任務僅屬於目前會話,重新啟動後不重放。

版本檢查通過 internal/updates 使用已設定的 MyGo 更新源/簽名格式及 MyGo 安裝資格判斷,否則使用固定的 GitHub 儲存庫。自動更新只暫存並驗證完整歸檔;顯式安裝會重新驗證這些位元組,替換失敗支援回滾,之後單獨執行 MyGo 重啟動作。不使用增量歸檔。未設定的開發建置提供手動下載。更新、縮圖和物件詳細資訊任務各自使用獨立取消代次。設定使用單獨的分類對話方塊,對草稿校驗和儲存進行防抖。RAM/STS 使用簽名 OpenAPI 請求;SMTP 強制使用 TLS。有界診斷工作執行緒持久化操作狀態和錯誤類型,不記錄載荷或金鑰。

協議參考:OSS 上傳器、PutObject、CopyObject,以及設計中連結的固定上游 OSS Browser 授權碼格式。

列表與繪製開銷 ​

分頁合併使用鍵集合在線性時間內去重。重新整理與合併時替換列表切片;瀏覽器狀態按列表識別、排序規則及搜尋條件快取排序結果。傳輸歷史和確認列表使用 ui.List,僅建置可見行;歷史行以任務識別為鍵,因此篩選和刪除後仍關聯正確操作。

版本邊界 ​

internal/buildinfo.Version 是桌面版本的來源。根入口將其傳入 app.Run,tools/version 檢查或同步它與 mygo.json。CI、make check 和 Release 工作流運行同一檢查。私有根 npm 包的版本不代表桌面發布版本。

OSS Browser 的獨立重構版本。