mirror of
https://git.asonix.dog/asonix/pict-rs
synced 2024-12-22 19:31:35 +00:00
Unite launch-with-store fns
This commit is contained in:
parent
c176e4c686
commit
835647d290
1 changed files with 28 additions and 89 deletions
117
src/lib.rs
117
src/lib.rs
|
@ -49,6 +49,7 @@ use middleware::{Metrics, Payload};
|
||||||
use repo::ArcRepo;
|
use repo::ArcRepo;
|
||||||
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
|
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
|
||||||
use reqwest_tracing::TracingMiddleware;
|
use reqwest_tracing::TracingMiddleware;
|
||||||
|
use rustls_channel_resolver::ChannelSender;
|
||||||
use rusty_s3::UrlStyle;
|
use rusty_s3::UrlStyle;
|
||||||
use state::State;
|
use state::State;
|
||||||
use std::{
|
use std::{
|
||||||
|
@ -59,6 +60,7 @@ use std::{
|
||||||
time::{Duration, SystemTime},
|
time::{Duration, SystemTime},
|
||||||
};
|
};
|
||||||
use streem::IntoStreamer;
|
use streem::IntoStreamer;
|
||||||
|
use sync::DropHandle;
|
||||||
use tmp_file::{ArcTmpDir, TmpDir};
|
use tmp_file::{ArcTmpDir, TmpDir};
|
||||||
use tokio::sync::Semaphore;
|
use tokio::sync::Semaphore;
|
||||||
use tracing::Instrument;
|
use tracing::Instrument;
|
||||||
|
@ -1664,8 +1666,27 @@ where
|
||||||
crate::sync::spawn("process-worker", queue::process_images(state, process_map));
|
crate::sync::spawn("process-worker", queue::process_images(state, process_map));
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn launch_file_store<F: Fn(&mut web::ServiceConfig) + Send + Clone + 'static>(
|
fn watch_keys(tls: Tls, sender: ChannelSender) -> DropHandle<()> {
|
||||||
state: State<FileStore>,
|
crate::sync::abort_on_drop(crate::sync::spawn("cert-reader", async move {
|
||||||
|
let mut interval = tokio::time::interval(Duration::from_secs(30));
|
||||||
|
interval.tick().await;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
interval.tick().await;
|
||||||
|
|
||||||
|
match tls.open_keys().await {
|
||||||
|
Ok(certified_key) => sender.update(certified_key),
|
||||||
|
Err(e) => tracing::error!("Failed to open keys {}", format!("{e}")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn launch<
|
||||||
|
S: Store + Send + 'static,
|
||||||
|
F: Fn(&mut web::ServiceConfig) + Send + Clone + 'static,
|
||||||
|
>(
|
||||||
|
state: State<S>,
|
||||||
extra_config: F,
|
extra_config: F,
|
||||||
) -> color_eyre::Result<()> {
|
) -> color_eyre::Result<()> {
|
||||||
let process_map = ProcessMap::new();
|
let process_map = ProcessMap::new();
|
||||||
|
@ -1698,19 +1719,7 @@ async fn launch_file_store<F: Fn(&mut web::ServiceConfig) + Send + Clone + 'stat
|
||||||
|
|
||||||
let (tx, rx) = rustls_channel_resolver::channel::<32>(certified_key);
|
let (tx, rx) = rustls_channel_resolver::channel::<32>(certified_key);
|
||||||
|
|
||||||
let handle = crate::sync::abort_on_drop(crate::sync::spawn("cert-reader", async move {
|
let handle = watch_keys(tls, tx);
|
||||||
let mut interval = tokio::time::interval(Duration::from_secs(30));
|
|
||||||
interval.tick().await;
|
|
||||||
|
|
||||||
loop {
|
|
||||||
interval.tick().await;
|
|
||||||
|
|
||||||
match tls.open_keys().await {
|
|
||||||
Ok(certified_key) => tx.update(certified_key),
|
|
||||||
Err(e) => tracing::error!("Failed to open keys {}", format!("{e}")),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
let config = rustls_021::ServerConfig::builder()
|
let config = rustls_021::ServerConfig::builder()
|
||||||
.with_safe_defaults()
|
.with_safe_defaults()
|
||||||
|
@ -1732,70 +1741,6 @@ async fn launch_file_store<F: Fn(&mut web::ServiceConfig) + Send + Clone + 'stat
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn launch_object_store<F: Fn(&mut web::ServiceConfig) + Send + Clone + 'static>(
|
|
||||||
state: State<ObjectStore>,
|
|
||||||
extra_config: F,
|
|
||||||
) -> color_eyre::Result<()> {
|
|
||||||
let process_map = ProcessMap::new();
|
|
||||||
|
|
||||||
let address = state.config.server.address;
|
|
||||||
|
|
||||||
let tls = Tls::from_config(&state.config);
|
|
||||||
|
|
||||||
spawn_cleanup(state.clone());
|
|
||||||
|
|
||||||
let server = HttpServer::new(move || {
|
|
||||||
let extra_config = extra_config.clone();
|
|
||||||
let state = state.clone();
|
|
||||||
let process_map = process_map.clone();
|
|
||||||
|
|
||||||
spawn_workers(state.clone(), process_map.clone());
|
|
||||||
|
|
||||||
App::new()
|
|
||||||
.wrap(TracingLogger::default())
|
|
||||||
.wrap(Deadline)
|
|
||||||
.wrap(Metrics)
|
|
||||||
.wrap(Payload::new())
|
|
||||||
.configure(move |sc| {
|
|
||||||
configure_endpoints(sc, state.clone(), process_map.clone(), extra_config)
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
if let Some(tls) = tls {
|
|
||||||
let certified_key = tls.open_keys().await?;
|
|
||||||
|
|
||||||
let (tx, rx) = rustls_channel_resolver::channel::<32>(certified_key);
|
|
||||||
|
|
||||||
let handle = crate::sync::abort_on_drop(crate::sync::spawn("cert-reader", async move {
|
|
||||||
let mut interval = tokio::time::interval(Duration::from_secs(30));
|
|
||||||
interval.tick().await;
|
|
||||||
|
|
||||||
loop {
|
|
||||||
interval.tick().await;
|
|
||||||
|
|
||||||
match tls.open_keys().await {
|
|
||||||
Ok(certified_key) => tx.update(certified_key),
|
|
||||||
Err(e) => tracing::error!("Failed to open keys {}", format!("{e}")),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
let config = rustls_021::ServerConfig::builder()
|
|
||||||
.with_safe_defaults()
|
|
||||||
.with_no_client_auth()
|
|
||||||
.with_cert_resolver(rx);
|
|
||||||
|
|
||||||
server.bind_rustls_021(address, config)?.run().await?;
|
|
||||||
|
|
||||||
handle.abort();
|
|
||||||
let _ = handle.await;
|
|
||||||
} else {
|
|
||||||
server.bind(address)?.run().await?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
async fn migrate_inner<S1>(
|
async fn migrate_inner<S1>(
|
||||||
config: Configuration,
|
config: Configuration,
|
||||||
|
@ -2143,13 +2088,10 @@ impl PictRsConfiguration {
|
||||||
|
|
||||||
match repo {
|
match repo {
|
||||||
Repo::Sled(sled_repo) => {
|
Repo::Sled(sled_repo) => {
|
||||||
launch_file_store(state, move |sc| {
|
launch(state, move |sc| sled_extra_config(sc, sled_repo.clone())).await?;
|
||||||
sled_extra_config(sc, sled_repo.clone())
|
|
||||||
})
|
|
||||||
.await?;
|
|
||||||
}
|
}
|
||||||
Repo::Postgres(_) => {
|
Repo::Postgres(_) => {
|
||||||
launch_file_store(state, |_| {}).await?;
|
launch(state, |_| {}).await?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2209,13 +2151,10 @@ impl PictRsConfiguration {
|
||||||
|
|
||||||
match repo {
|
match repo {
|
||||||
Repo::Sled(sled_repo) => {
|
Repo::Sled(sled_repo) => {
|
||||||
launch_object_store(state, move |sc| {
|
launch(state, move |sc| sled_extra_config(sc, sled_repo.clone())).await?;
|
||||||
sled_extra_config(sc, sled_repo.clone())
|
|
||||||
})
|
|
||||||
.await?;
|
|
||||||
}
|
}
|
||||||
Repo::Postgres(_) => {
|
Repo::Postgres(_) => {
|
||||||
launch_object_store(state, |_| {}).await?;
|
launch(state, |_| {}).await?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue