tokio-fs-ext 0.3.8

Extend tokio fs to be compatible with native and wasm
Documentation
use std::io;

use send_wrapper::SendWrapper;
use tokio::sync::OnceCell;
use wasm_bindgen::{JsCast, JsValue};
use wasm_bindgen_futures::JsFuture;
use web_sys::{DedicatedWorkerGlobalScope, FileSystemDirectoryHandle};

use super::OpfsError;

static OPFS_ROOT: OnceCell<SendWrapper<FileSystemDirectoryHandle>> = OnceCell::const_new();

pub(super) async fn root() -> io::Result<SendWrapper<FileSystemDirectoryHandle>> {
    let root = OPFS_ROOT
        .get_or_try_init(|| async {
            let storage = DedicatedWorkerGlobalScope::from(JsValue::from(js_sys::global()))
                .navigator()
                .storage();
            let root_handle =
                SendWrapper::new(JsFuture::from(SendWrapper::new(storage).get_directory()))
                    .await
                    .map_err(|err| OpfsError::from(err).into_io_err())?
                    .dyn_into::<FileSystemDirectoryHandle>()
                    .map_err(|err| OpfsError::from(err).into_io_err())?;
            io::Result::Ok(SendWrapper::new(root_handle))
        })
        .await?;

    Ok(root.clone())
}