1+ use super :: metadata:: { Metadata , fetch_metadata_from_cdn, is_cdn_enabled, is_fallback_enabled} ;
12use crate :: env_manager:: {
23 DownloadStatus , EnvironmentProvider , EnvironmentVersion , emit_download_progress,
34} ;
@@ -22,25 +23,6 @@ struct GithubAsset {
2223 size : u64 ,
2324}
2425
25- // CDN Metadata 结构
26- #[ derive( Debug , Deserialize , Serialize , Clone ) ]
27- struct MetadataRelease {
28- version : String , // 版本号,如 "1.11.1.1262"
29- display_name : String , // 显示名称,如 "Clojure 1.11.1.1262"
30- published_at : String , // 发布时间
31- download_url : String , // CDN 下载地址
32- github_url : String , // GitHub 官方下载地址(作为备用)
33- file_name : String , // 文件名,如 "clojure-tools-1.11.1.1262.tar.gz"
34- size : u64 , // 文件大小(字节)
35- supported_platforms : Vec < String > , // 支持的平台,如 ["macos", "linux", "windows"]
36- }
37-
38- #[ derive( Debug , Deserialize , Serialize ) ]
39- struct Metadata {
40- language : String , // 语言名称 "clojure"
41- releases : Vec < MetadataRelease > ,
42- }
43-
4426#[ derive( Debug , Deserialize , Serialize ) ]
4527struct CachedReleases {
4628 releases : Vec < GithubRelease > ,
@@ -185,56 +167,6 @@ impl ClojureEnvironmentProvider {
185167 Ok ( versions)
186168 }
187169
188- // 从 CDN 获取 metadata.json
189- async fn fetch_metadata_from_cdn ( & self ) -> Result < Metadata , String > {
190- use crate :: config:: get_app_config_internal;
191-
192- let config = get_app_config_internal ( ) . map_err ( |e| format ! ( "读取配置失败: {}" , e) ) ?;
193-
194- let cdn_enabled = config
195- . environment_mirror
196- . as_ref ( )
197- . and_then ( |m| m. enabled )
198- . unwrap_or ( false ) ;
199-
200- if !cdn_enabled {
201- return Err ( "CDN 未启用" . to_string ( ) ) ;
202- }
203-
204- let base_url = config
205- . environment_mirror
206- . as_ref ( )
207- . and_then ( |m| m. base_url . as_ref ( ) )
208- . ok_or ( "CDN 地址未配置" ) ?;
209-
210- let metadata_url = format ! ( "{}/clojure/metadata.json" , base_url) ;
211- info ! ( "从 CDN 获取 Clojure metadata: {}" , metadata_url) ;
212-
213- let client = reqwest:: Client :: builder ( )
214- . user_agent ( "CodeForge" )
215- . timeout ( Duration :: from_secs ( 30 ) )
216- . build ( )
217- . map_err ( |e| format ! ( "创建 HTTP 客户端失败: {}" , e) ) ?;
218-
219- let response = client
220- . get ( & metadata_url)
221- . send ( )
222- . await
223- . map_err ( |e| format ! ( "请求 CDN metadata 失败: {}" , e) ) ?;
224-
225- if !response. status ( ) . is_success ( ) {
226- return Err ( format ! ( "CDN 返回错误状态码: {}" , response. status( ) ) ) ;
227- }
228-
229- let metadata: Metadata = response
230- . json ( )
231- . await
232- . map_err ( |e| format ! ( "解析 metadata.json 失败: {}" , e) ) ?;
233-
234- info ! ( "成功从 CDN 获取 {} 个版本" , metadata. releases. len( ) ) ;
235- Ok ( metadata)
236- }
237-
238170 async fn fetch_github_releases ( & self ) -> Result < Vec < GithubRelease > , String > {
239171 if let Some ( cached_releases) = self . read_cache ( ) {
240172 return Ok ( cached_releases) ;
@@ -636,30 +568,26 @@ impl EnvironmentProvider for ClojureEnvironmentProvider {
636568 }
637569
638570 async fn fetch_available_versions ( & self ) -> Result < Vec < EnvironmentVersion > , String > {
639- use crate :: config:: get_app_config_internal;
640-
641- // 优先尝试从 CDN 获取 metadata.json
642- match self . fetch_metadata_from_cdn ( ) . await {
643- Ok ( metadata) => {
644- info ! ( "使用 CDN metadata 获取版本列表" ) ;
645- return self . parse_metadata_to_versions ( metadata) ;
646- }
647- Err ( e) => {
648- warn ! ( "CDN metadata 获取失败: {}" , e) ;
571+ // 检查 CDN 是否启用
572+ if is_cdn_enabled ( ) {
573+ match fetch_metadata_from_cdn ( "clojure" ) . await {
574+ Ok ( metadata) => {
575+ info ! ( "使用 CDN metadata 获取版本列表" ) ;
576+ return self . parse_metadata_to_versions ( metadata) ;
577+ }
578+ Err ( e) => {
579+ warn ! ( "CDN metadata 获取失败: {}" , e) ;
649580
650- // 检查是否启用 fallback
651- let fallback_enabled = get_app_config_internal ( )
652- . ok ( )
653- . and_then ( |config| config. environment_mirror )
654- . and_then ( |mirror| mirror. fallback_enabled )
655- . unwrap_or ( false ) ;
581+ // 检查是否启用 fallback
582+ if !is_fallback_enabled ( ) {
583+ return Err ( format ! ( "CDN metadata 获取失败,未启用自动回退: {}" , e) ) ;
584+ }
656585
657- if !fallback_enabled {
658- return Err ( format ! ( "CDN metadata 获取失败,未启用自动回退: {}" , e) ) ;
586+ info ! ( "fallback 已启用,回退到 GitHub API" ) ;
659587 }
660-
661- info ! ( "fallback 已启用,回退到 GitHub API" ) ;
662588 }
589+ } else {
590+ info ! ( "CDN 未启用,使用 GitHub API" ) ;
663591 }
664592
665593 let releases = self . fetch_github_releases ( ) . await ?;
0 commit comments