@@ -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 ;
1113use headless_chrome:: { Browser , LaunchOptionsBuilder , Tab } ;
1214use minijinja:: Environment ;
1315use serde:: Serialize ;
16+ use tokio:: time:: { Instant , sleep_until} ;
1417
1518use 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
2932static JINJA_ENGINE : OnceLock < Environment < ' static > > = OnceLock :: new ( ) ;
30- pub struct ChromiumTab ( OnceLock < ( Browser , Arc < Tab > ) > ) ;
33+ pub struct ChromiumTab ( OnceLock < ( Browser , Arc < Tab > , PathBuf ) > ) ;
3134static CHROMIUM_TAB : ChromiumTab = ChromiumTab ( OnceLock :: new ( ) ) ;
3235
3336pub async fn init ( ) -> Result < ( ) , Box < dyn Error > > {
@@ -147,12 +150,45 @@ fn round(value: f64) -> String {
147150}
148151pub 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
220256impl 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}
227263impl 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