From 2d6390e562f71e18ef21e754062d053f21f3e4c6 Mon Sep 17 00:00:00 2001 From: Spxg Date: Sun, 18 May 2025 17:01:40 +0800 Subject: [PATCH] Fix OPFS initialization --- src/worker/mod.rs | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/worker/mod.rs b/src/worker/mod.rs index 680efb7..5961605 100644 --- a/src/worker/mod.rs +++ b/src/worker/mod.rs @@ -54,7 +54,7 @@ where f(DB_POOL.lock().get_mut(id).ok_or(WorkerError::NotFound)?) } -async fn opfs_util() -> Result<&'static OpfsSAHPoolUtil> { +async fn init_opfs_util() -> Result<&'static OpfsSAHPoolUtil> { FS_UTIL .opfs .get_or_try_init(|| async { @@ -73,16 +73,19 @@ async fn opfs_util() -> Result<&'static OpfsSAHPoolUtil> { .await } -pub async fn download_db(options: DownloadDbOptions) -> Result { - let opfs = opfs_util().await?; - let mem_vfs = &FS_UTIL.mem; +fn get_opfs_util() -> Result<&'static OpfsSAHPoolUtil> { + FS_UTIL.opfs.get().ok_or(WorkerError::Unexpected) +} +pub async fn download_db(options: DownloadDbOptions) -> Result { with_worker(&options.id, |worker| { let filename = &worker.open_options.filename; let db = if worker.open_options.persist { - opfs.export_file(filename) + get_opfs_util()? + .export_file(filename) .map_err(|err| WorkerError::DownloadDb(format!("{err}")))? } else { + let mem_vfs = &FS_UTIL.mem; mem_vfs .export_db(filename) .map_err(|err| WorkerError::DownloadDb(format!("{err}")))? @@ -97,19 +100,18 @@ pub async fn download_db(options: DownloadDbOptions) -> Result Result<()> { let db = copy_to_vec(&options.data); - let opfs = opfs_util().await?; - let mem_vfs = &FS_UTIL.mem; - with_worker(&options.id, |worker| { worker.db.take(); let filename = &worker.open_options.filename; if worker.open_options.persist { + let opfs = get_opfs_util()?; opfs.unlink(filename).map_err(|_| WorkerError::Unexpected)?; if let Err(err) = opfs.import_db(filename, &db) { return Err(WorkerError::LoadDb(format!("{err}"))); } } else { + let mem_vfs = &FS_UTIL.mem; mem_vfs.delete_db(filename); if let Err(err) = mem_vfs.import_db(filename, &db) { return Err(WorkerError::LoadDb(format!("{err}"))); @@ -127,7 +129,7 @@ pub async fn open(options: OpenOptions) -> Result { return Ok(worker.id.clone()); } if options.persist { - let util = opfs_util().await?; + let util = init_opfs_util().await?; if util.get_capacity() - util.get_file_count() * 3 < 3 { util.add_capacity(3) .await @@ -148,17 +150,17 @@ pub async fn open(options: OpenOptions) -> Result { } pub async fn prepare(options: PrepareOptions) -> Result<()> { - let opfs = opfs_util().await?; - let mem_vfs = &FS_UTIL.mem; - with_worker(&options.id, |worker| { if options.clear_on_prepare { worker.db.take(); let filename = &worker.open_options.filename; if worker.open_options.persist { - opfs.unlink(filename).map_err(|_| WorkerError::Unexpected)?; + get_opfs_util()? + .unlink(filename) + .map_err(|_| WorkerError::Unexpected)?; } else { + let mem_vfs = &FS_UTIL.mem; mem_vfs.delete_db(filename); }