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);
}
}
}