haematite 0.6.1

Content-addressed, branchable, actor-native storage engine
Documentation
use std::cell::Cell;

use wasm_bindgen::JsValue;
use wasm_bindgen_futures::JsFuture;

use super::BrowserLocalError;
use super::js::{haem_release_owner, haem_release_owner_now};

pub(super) struct OwnerLock {
    handle: JsValue,
    released: Cell<bool>,
}

impl OwnerLock {
    pub(super) const fn new(handle: JsValue) -> Self {
        Self {
            handle,
            released: Cell::new(false),
        }
    }

    pub(super) async fn release(&self) -> Result<(), BrowserLocalError> {
        if self.released.replace(true) {
            return Ok(());
        }
        JsFuture::from(haem_release_owner(&self.handle))
            .await
            .map_err(|_| BrowserLocalError::WorkerClosed)?;
        Ok(())
    }
}

impl Drop for OwnerLock {
    fn drop(&mut self) {
        if !self.released.replace(true) {
            haem_release_owner_now(&self.handle);
        }
    }
}