absurder_sql/storage/
export_import_lock.rs

1//! Export/Import Operation Locking
2//!
3//! Uses weblocks crate to serialize export/import operations.
4
5use wasm_bindgen::prelude::*;
6
7/// Request a Web Lock and execute work
8pub async fn with_lock<F, Fut>(lock_name: &str, f: F) -> Result<(), JsValue>
9where
10    F: FnOnce() -> Fut + 'static,
11    Fut: std::future::Future<Output = Result<(), JsValue>> + 'static,
12{
13    log::info!("[LOCK] ===== STARTING LOCK REQUEST =====");
14    log::info!("[LOCK] Lock name: {}", lock_name);
15    log::info!("[LOCK] Creating AcquireOptions...");
16
17    let opts = weblocks::AcquireOptions::exclusive();
18    log::info!("[LOCK] AcquireOptions created, calling acquire()...");
19
20    // Try to acquire the lock
21    let acquire_future = weblocks::acquire(lock_name, opts);
22    log::info!("[LOCK] acquire() called, awaiting future...");
23
24    let guard_result = acquire_future.await;
25    log::info!(
26        "[LOCK] acquire() future resolved: {:?}",
27        guard_result.is_ok()
28    );
29
30    let _guard = guard_result.map_err(|e| {
31        log::error!("[LOCK] Failed to acquire lock: {:?}", e);
32        e
33    })?;
34
35    log::info!("[LOCK] ===== LOCK ACQUIRED, EXECUTING WORK =====");
36
37    // Execute the work while holding the lock
38    let result = f().await;
39
40    log::info!("[LOCK] ===== WORK COMPLETED: {:?} =====", result.is_ok());
41
42    // Lock is released when _guard is dropped
43    result
44}