wip
This commit is contained in:
@@ -41,7 +41,7 @@ pub struct ChromiumCoordinator {
|
||||
|
||||
impl ChromiumCoordinator {
|
||||
const NUMBER_OF_INSTANCES: usize = 1; // TODO: make this configurable
|
||||
|
||||
|
||||
pub async fn new() -> Self {
|
||||
let instances: Arc<Mutex<Vec<BrowserHolder>>> = Arc::new(Mutex::new(Vec::with_capacity(Self::NUMBER_OF_INSTANCES)));
|
||||
trace!("creating {} Chromium instances", Self::NUMBER_OF_INSTANCES);
|
||||
@@ -63,7 +63,7 @@ impl ChromiumCoordinator {
|
||||
}
|
||||
|
||||
fn spawn_browser(&self) {
|
||||
let instances = self.instances.clone();
|
||||
let instances = self.instances.clone();
|
||||
tokio::spawn(async move {
|
||||
debug!("spawn new instance of browser");
|
||||
// Create new instance
|
||||
@@ -133,7 +133,7 @@ impl<'r> FromRequest<'r> for BrowserHolder {
|
||||
let coordinator = request.rocket().state::<ChromiumCoordinator>().unwrap();
|
||||
let get_instance = coordinator.get_browser();
|
||||
pin_mut!(get_instance); // TODO: wth?
|
||||
let result = match tokio::time::timeout(std::time::Duration::from_secs(10), &mut get_instance).await {
|
||||
match tokio::time::timeout(std::time::Duration::from_secs(10), &mut get_instance).await {
|
||||
Ok(maybebrowser) => match maybebrowser {
|
||||
Ok(browser) => Outcome::<BrowserHolder, ()>::Success(browser),
|
||||
Err(_) => {
|
||||
@@ -145,9 +145,6 @@ impl<'r> FromRequest<'r> for BrowserHolder {
|
||||
error!("Can't create new instance of browser (timeout)");
|
||||
Outcome::<BrowserHolder, ()>::Error((Status::InternalServerError, ()))
|
||||
}
|
||||
};
|
||||
|
||||
result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,8 +18,9 @@ pub struct CVBackendConfig {
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[serde(crate = "rocket::serde")]
|
||||
#[allow(dead_code)]
|
||||
pub struct DefaultPerson {
|
||||
default_person_name: String,
|
||||
pub(crate) default_person_name: String,
|
||||
}
|
||||
|
||||
pub fn rocket_builder() -> Rocket<Build> {
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
use std::{panic, fs::File, io::Write};
|
||||
|
||||
use log::error;
|
||||
use nanobyte_opentelemetry::{default_filter_layer, LogLevel, install_panic_handler};
|
||||
use ovlach_pdf::rocket_builder;
|
||||
use tracing::Level;
|
||||
|
||||
|
||||
#[rocket::main]
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
use headless_chrome::Browser;
|
||||
use headless_chrome::types::PrintToPdfOptions;
|
||||
use nanobyte_opentelemetry::rocket::{TracingSpan, RequestId, OtelReqwestClient};
|
||||
use nanobyte_opentelemetry::rocket::{TracingSpan, OtelReqwestClient};
|
||||
use nanobyte_tera::l18n::LanguageDescription;
|
||||
use ovlach_data::cv::data::CV;
|
||||
use reqwest::Client;
|
||||
use rocket::fs::NamedFile;
|
||||
use ::rocket::{State, http::Status};
|
||||
use ::rocket::get;
|
||||
use tempfile::NamedTempFile;
|
||||
use tera::Context;
|
||||
use tracing::{info_span, error, debug, Instrument};
|
||||
use crate::DefaultPerson;
|
||||
use crate::{chromium::rocket::BrowserHolder, tools::{tera::NanoTera, pdf::PdfStream, rocket::RequestLanguage}, services::cv::fetch_cv_data_from_backend, CVBackendConfig};
|
||||
|
||||
// TODO: request-id
|
||||
@@ -36,11 +34,9 @@ fn generate_pdf(browser: Browser, file: &NamedTempFile) -> Vec<u8> {
|
||||
|
||||
//thread::sleep(Duration::from_secs(10));
|
||||
|
||||
let bytes = info_span!("print_pdf").in_scope(|| {
|
||||
info_span!("print_pdf").in_scope(|| {
|
||||
tab.print_to_pdf(Some(options)).unwrap()
|
||||
});
|
||||
|
||||
return bytes;
|
||||
})
|
||||
}
|
||||
|
||||
#[tracing::instrument]
|
||||
@@ -62,10 +58,9 @@ fn render_template(template_name: &str, file: &NamedTempFile, tera: NanoTera, cv
|
||||
|
||||
#[get("/cv/<username>/<language>/output.pdf")]
|
||||
pub async fn render_pdf_cv(username: &str, tera: NanoTera, tracing: TracingSpan, request_client: OtelReqwestClient,
|
||||
cv_config: &State<CVBackendConfig>, language: RequestLanguage, browser: BrowserHolder,
|
||||
default_person: &State<DefaultPerson>) -> Result<PdfStream, Status> {
|
||||
cv_config: &State<CVBackendConfig>, language: RequestLanguage, browser: BrowserHolder) -> Result<PdfStream, Status> {
|
||||
async move {
|
||||
match fetch_cv_data_from_backend(&cv_config.cv_backend_path, &default_person.inner().default_person_name, &request_client.0).await {
|
||||
match fetch_cv_data_from_backend(&cv_config.cv_backend_path, &username.to_string(), &request_client.0).await {
|
||||
Ok(cv_data) => {
|
||||
let file = tempfile::Builder::new().suffix(".html").tempfile().unwrap();
|
||||
render_template("two_column", &file, tera, cv_data, language.language);
|
||||
@@ -86,10 +81,9 @@ pub async fn render_pdf_cv(username: &str, tera: NanoTera, tracing: TracingSpan,
|
||||
/// Route only for debuging
|
||||
#[get("/cv/<username>/<language>/output.html")]
|
||||
pub async fn render_html_cv(username: &str, tera: NanoTera, tracing: TracingSpan, request_client: OtelReqwestClient,
|
||||
cv_config: &State<CVBackendConfig>, language: RequestLanguage,
|
||||
default_person: &State<DefaultPerson>) -> Result<NamedFile, Status> {
|
||||
cv_config: &State<CVBackendConfig>, language: RequestLanguage) -> Result<NamedFile, Status> {
|
||||
async move {
|
||||
match fetch_cv_data_from_backend(&cv_config.cv_backend_path, &default_person.inner().default_person_name, &request_client.0).await {
|
||||
match fetch_cv_data_from_backend(&cv_config.cv_backend_path, &username.to_string(), &request_client.0).await {
|
||||
Ok(cv_data) => {
|
||||
let file = tempfile::Builder::new().suffix(".html").tempfile().unwrap();
|
||||
render_template("two_column", &file, tera, cv_data, language.language);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use rocket::{response::{Responder, self}, Request, Response, http::{Header, ContentType}};
|
||||
use rocket::{response::{Responder, self}, Request, Response, http::ContentType};
|
||||
use std::io::Cursor;
|
||||
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ pub struct NanoTera(pub Tera);
|
||||
impl<'r> FromRequest<'r> for NanoTera {
|
||||
type Error = ();
|
||||
|
||||
async fn from_request(request: &'r Request<'_>) -> Outcome<Self, ()> {
|
||||
async fn from_request(_request: &'r Request<'_>) -> Outcome<Self, ()> {
|
||||
let mut tera = Tera::new("templates/*").unwrap();
|
||||
tera.register_filter("translate", translate_filter);
|
||||
tera.register_filter("calculate_age", calculate_age);
|
||||
|
||||
Reference in New Issue
Block a user