Signed-off-by: kjuulh <contact@kjuulh.io>
This commit is contained in:
53
crates/flux-releaser/src/services/flux_releaser_uploader.rs
Normal file
53
crates/flux-releaser/src/services/flux_releaser_uploader.rs
Normal file
@@ -0,0 +1,53 @@
|
||||
use tonic::transport::Channel;
|
||||
|
||||
use crate::{
|
||||
app::infra::grpc::FluxReleaserGrpcClient,
|
||||
grpc::gen::{flux_releaser_client::FluxReleaserClient, UploadArtifactRequest},
|
||||
};
|
||||
|
||||
use super::{archive::ArchiveFile, release_manager::models::UploadArtifactID};
|
||||
|
||||
pub struct FluxReleaserUploader {
|
||||
flux_client: FluxReleaserGrpcClient,
|
||||
}
|
||||
|
||||
impl FluxReleaserUploader {
|
||||
pub fn new(flux_client: FluxReleaserGrpcClient) -> Self {
|
||||
Self { flux_client }
|
||||
}
|
||||
|
||||
pub async fn upload_archive(&self, archive: ArchiveFile) -> anyhow::Result<UploadArtifactID> {
|
||||
let chunks = archive
|
||||
.content
|
||||
.chunks(1_000_000) // Slice by about 1MB
|
||||
.map(|ch| UploadArtifactRequest {
|
||||
content: ch.to_vec(),
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let resp = self
|
||||
.flux_client
|
||||
.lock()
|
||||
.await
|
||||
.upload_artifact(tonic::Request::new(tokio_stream::iter(chunks)))
|
||||
.await?;
|
||||
|
||||
resp.into_inner().upload_id.try_into()
|
||||
}
|
||||
}
|
||||
|
||||
pub mod extensions {
|
||||
use crate::app::SharedLocalApp;
|
||||
|
||||
use super::FluxReleaserUploader;
|
||||
|
||||
pub trait FluxReleaserUploaderExt {
|
||||
fn flux_releaser_uploader(&self) -> FluxReleaserUploader;
|
||||
}
|
||||
|
||||
impl FluxReleaserUploaderExt for SharedLocalApp {
|
||||
fn flux_releaser_uploader(&self) -> FluxReleaserUploader {
|
||||
FluxReleaserUploader::new(self.grpc_client.clone())
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user