33use crate :: data:: { Loader , ManagedPackage , ManagedVersion , PackageType } ;
44use crate :: prelude:: PackagePath ;
55use crate :: processor:: Cluster ;
6- use crate :: proxy:: send:: send_internet;
6+ use crate :: proxy:: send:: { init_ingress , send_ingress , send_internet} ;
77use crate :: store:: { ClusterPath , ManagedVersionFile , Package , PackageMetadata } ;
88use crate :: utils:: http;
99use crate :: { Result , State } ;
1010use onelauncher_utils:: io;
11+ use reqwest:: Method ;
1112// TODO: Implement proper error handling
1213
1314/// Find a managed version using filters
@@ -85,14 +86,9 @@ pub async fn download_package(
8586 let file = managed_version
8687 . get_primary_file ( )
8788 . ok_or_else ( || anyhow:: anyhow!( "no primary file found" ) ) ?;
88- tracing:: info!(
89- "downloading file '{}' version '{}'" ,
90- file. file_name,
91- managed_version. name
92- ) ;
9389
94- let package_path = download_file ( file, & package. package_type , cluster) . await ?;
95- let sha1 = file. hashes . get ( "sha1" ) . unwrap_or ( & "" . to_string ( ) ) . clone ( ) ;
90+ let package_path = download_file ( package , & managed_version , file, & package. package_type , cluster) . await ?;
91+ let sha1 = file. hashes . get ( "sha1" ) . unwrap_or ( & String :: new ( ) ) . clone ( ) ;
9692
9793 let package = Package {
9894 file_name : file. file_name . clone ( ) ,
@@ -105,28 +101,54 @@ pub async fn download_package(
105101}
106102
107103/// Download a file to a cluster from a managed version file.
108- #[ tracing:: instrument( skip ( file , cluster ) ) ]
104+ #[ tracing:: instrument( skip_all ) ]
109105async fn download_file (
106+ package : & ManagedPackage ,
107+ version : & ManagedVersion ,
110108 file : & ManagedVersionFile ,
111109 package_type : & PackageType ,
112110 cluster : & Cluster ,
113111) -> Result < PackagePath > {
114112 // TODO: Implement hash checking
113+ let cluster_path = & cluster. get_full_path ( ) . await ?;
114+
115115 let path = PackagePath :: new (
116- & cluster
117- . get_full_path ( )
118- . await ?
116+ & cluster_path
119117 . join ( package_type. get_folder ( ) )
120118 . join ( & file. file_name ) ,
121119 ) ;
122120
121+ let ingress_id = init_ingress (
122+ crate :: IngressType :: DownloadPackage {
123+ cluster_path : cluster_path. to_owned ( ) ,
124+ package_name : package. title . clone ( ) ,
125+ icon : None ,
126+ package_id : Some ( package. id . clone ( ) ) ,
127+ package_version : Some ( version. id . clone ( ) ) ,
128+ } , 100.0 , "downloading package" ) . await ?;
129+
130+ tracing:: info!(
131+ "downloading file '{}' version '{}'" ,
132+ file. file_name,
133+ version. name
134+ ) ;
135+
123136 let state = State :: get ( ) . await ?;
124- let bytes = http:: fetch (
137+ let bytes = http:: fetch_advanced (
138+ Method :: GET ,
125139 & file. url ,
126140 file. hashes . get ( "sha1" ) . map ( String :: as_str) ,
141+ None ,
142+ None ,
143+ Some ( ( & ingress_id, 90.0 ) ) ,
127144 & state. fetch_semaphore ,
128145 )
129146 . await ?;
147+
148+ if let Err ( err) = send_ingress ( & ingress_id, 5.0 , Some ( "saving file" ) ) . await {
149+ tracing:: error!( "{err}" ) ;
150+ }
151+
130152 if let Err ( err) = http:: write ( & path. 0 , & bytes, & state. io_semaphore ) . await {
131153 tracing:: error!( "failed to write file to cluster: {err}" ) ;
132154 if path. 0 . exists ( ) {
@@ -136,6 +158,10 @@ async fn download_file(
136158 return Err ( err) ;
137159 } ;
138160
161+ if let Err ( err) = send_ingress ( & ingress_id, 100.0 , Some ( format ! ( "downloaded package {}" , package. title) . as_str ( ) ) ) . await {
162+ tracing:: error!( "{err}" ) ;
163+ }
164+
139165 drop ( state) ;
140166
141167 Ok ( path)
0 commit comments