Skip to content

雲端儲存

雲端主目錄是使用者已擁有儲存空間中的一個位置。每個提供者都透過 coven 中相同的儲存介面驅動;各提供者不同的是驗證方式,以及第二台裝置如何取得存取權。

提供者驗證新裝置的存取權
S3-compatibleAccess key + secret憑證嵌入邀請中
Google DriveOAuth (PKCE)資料夾分享給加入者的帳號
DropboxOAuth (PKCE)資料夾分享給加入者的帳號
OneDriveOAuth (PKCE)資料夾分享給加入者的帳號
iCloud (CloudKit)Apple ID,無需登入加入者接受 CloudKit share

S3-compatible 涵蓋 AWS、Backblaze B2、Cloudflare R2、Wasabi、MinIO,以及任何使用該 API 的服務;bucket、region、endpoint 與 key prefix 可設定,而且 bucket 會在儲存設定前被探測,讓打字錯誤在設定時失敗,而不是第一次同步時才失敗。OAuth 提供者只存在於完整 bae 版本;baeium 建置會把它們編譯出去。

登入是帶 PKCE 的 authorization-code flow,作為 public client。桌面端的 redirect 會落到綁定本機連接埠的 loopback 伺服器,只用於那一次 callback;行動端則由 App 捕捉 custom-scheme redirect。bae 會要求提供者為該工作提供的最窄 scope;在 Google Drive 上,這表示只存取 App 自己建立的檔案。Token 儲存在 OS 鑰匙圈中,透過提供者的 refresh grant 更新;被拒絕的更新會顯示為重新連接提示,而不是無聲重試迴圈。

CloudKit 完全不需要 flow:平台的 CloudKit driver 由 App 實作並交給核心,使用已登入的 Apple ID 運作。

在主目錄內,coven 會配置各裝置 changeset 流、snapshot 世代、成員資格記錄與 blob namespace。bae 貢獻三個 blob namespace:release_filescoversartist_images

物件如何作為 key 取決於主目錄的儲存模式,建立時固定:

  • 不透明:物件會加密,並以不揭露任何資訊的內容衍生 key 儲存。這是完全信任密碼學的模式;請見加密
  • 可瀏覽:物件是明文,位於每個 blob 上傳時記錄的可讀路徑:release_files/{artist}/{album}/{filename}covers/{album}/{release}/cover.{ext}artist_images/{artist}/artist.{ext}。bucket 同時也是可用的檔案樹;取捨是沒有加密與成員資格,因此可瀏覽主目錄不能分享給其他人。

播放讀取會使用範圍請求:播放器串流它需要的位元組區段,而不是整個檔案。超過大小門檻的上傳會在提供者支援時使用 multipart。速率限制與暫時性提供者錯誤會以指數退避重試,並在提供者給出 retry-after 時遵守;過期的 OAuth token 會就地更新。同步寄件匣會跨重啟保留:結束 App 中斷的上傳會繼續,而不是重新開始。