Skip to content

Commit cb530bc

Browse files
committed
fix chrome
1 parent d1ec057 commit cb530bc

1 file changed

Lines changed: 51 additions & 11 deletions

File tree

src/template/render.rs

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,20 @@ use std::{
44
ffi::{OsStr, OsString},
55
fmt::Debug,
66
ops::Deref,
7+
path::PathBuf,
78
sync::{Arc, OnceLock},
89
time::Duration,
910
};
1011

12+
use chrono::Local;
1113
use headless_chrome::{Browser, LaunchOptionsBuilder, Tab};
1214
use minijinja::Environment;
1315
use serde::Serialize;
16+
use tokio::time::{Instant, sleep_until};
1417

1518
use crate::{
1619
common::{
17-
constant::{SHARE_DRIVE_PATH_BUF, TZ},
20+
constant::{TMP_FS_PATH, TZ},
1821
domain::ServiceError,
1922
util::IdGenerator,
2023
},
@@ -27,7 +30,7 @@ use super::{
2730
};
2831

2932
static JINJA_ENGINE: OnceLock<Environment<'static>> = OnceLock::new();
30-
pub struct ChromiumTab(OnceLock<(Browser, Arc<Tab>)>);
33+
pub struct ChromiumTab(OnceLock<(Browser, Arc<Tab>, PathBuf)>);
3134
static CHROMIUM_TAB: ChromiumTab = ChromiumTab(OnceLock::new());
3235

3336
pub async fn init() -> Result<(), Box<dyn Error>> {
@@ -147,12 +150,45 @@ fn round(value: f64) -> String {
147150
}
148151
pub fn get_chromium_tab() -> Result<Arc<Tab>, Box<dyn Error>> {
149152
match CHROMIUM_TAB.get() {
150-
Some((_, tab)) => Ok(tab.clone()),
153+
Some((_, tab, _)) => Ok(tab.clone()),
151154
None => {
152-
let user_data_dir = OsString::from(format!(
153-
"--user-data-dir={}",
154-
SHARE_DRIVE_PATH_BUF.display()
155-
));
155+
let data_dir = TMP_FS_PATH.join(IdGenerator.get());
156+
std::fs::create_dir_all(&data_dir)?;
157+
158+
let handle = tokio::runtime::Handle::current();
159+
160+
let cleanup_dir = data_dir.clone();
161+
handle.spawn(async move {
162+
loop {
163+
tracing::info!("starting next clearing procedure of the chrome user data dir");
164+
let now = Local::now();
165+
let tomorrow_midnight = (now + chrono::Duration::days(1))
166+
.date_naive()
167+
.and_hms_opt(0, 0, 0)
168+
.unwrap()
169+
.and_local_timezone(Local)
170+
.unwrap();
171+
172+
let duration_until_midnight = (tomorrow_midnight - now).to_std().unwrap();
173+
174+
let sleep_time = Instant::now() + duration_until_midnight;
175+
176+
tracing::info!(
177+
"chromium --user-data-dir (tmpfs): next clearing schedule is {tomorrow_midnight}, data_dir: {cleanup_dir:?}",
178+
);
179+
sleep_until(sleep_time).await;
180+
tracing::info!(
181+
"clearing the chromium user data dir, this might be messy! {:?}",
182+
tokio::fs::remove_dir_all(&cleanup_dir).await
183+
);
184+
tracing::info!(
185+
"recreate dir {:?}",
186+
tokio::fs::create_dir_all(&cleanup_dir).await
187+
);
188+
}
189+
});
190+
191+
let user_data_dir = OsString::from(format!("--user-data-dir={}", data_dir.display()));
156192
let sandboxed = std::env::var(CHROMIUM_SANDBOXED)
157193
.map(|v| v.parse::<bool>().unwrap_or(false))
158194
.unwrap_or(false);
@@ -165,7 +201,7 @@ pub fn get_chromium_tab() -> Result<Arc<Tab>, Box<dyn Error>> {
165201
OsStr::new("--no-first-run"),
166202
// OsStr::new("--disable-setuid-sandbox"),
167203
OsStr::new("--disable-features=IsolateOrigins,site-per-process"),
168-
// OsStr::new("--default-background-color=00000000"),
204+
OsStr::new("--default-background-color=00000000"),
169205
OsStr::new("--disable-dev-shm-usage"),
170206
&user_data_dir,
171207
])
@@ -210,26 +246,30 @@ pub fn get_chromium_tab() -> Result<Arc<Tab>, Box<dyn Error>> {
210246
tracing::info!("we got a tab");
211247

212248
CHROMIUM_TAB
213-
.set((browser, tab.clone()))
249+
.set((browser, tab.clone(), data_dir))
214250
.map_err(|_tab| "could not setup chromium tab".to_string())?;
215251
Ok(tab)
216252
}
217253
}
218254
}
219255

220256
impl Deref for ChromiumTab {
221-
type Target = OnceLock<(headless_chrome::Browser, Arc<headless_chrome::Tab>)>;
257+
type Target = OnceLock<(headless_chrome::Browser, Arc<headless_chrome::Tab>, PathBuf)>;
222258

223259
fn deref(&self) -> &Self::Target {
224260
&self.0
225261
}
226262
}
227263
impl Drop for ChromiumTab {
228264
fn drop(&mut self) {
229-
if let Some((browser, tab)) = self.0.take() {
265+
if let Some((browser, tab, pb)) = self.0.take() {
230266
tracing::info!("closing tab result: {:?}", tab.close(true));
231267
drop(tab);
232268
drop(browser);
269+
tracing::info!(
270+
"deleting user data folder (chromium) {:?}",
271+
std::fs::remove_dir_all(pb)
272+
);
233273
}
234274
}
235275
}

0 commit comments

Comments
 (0)