aboutsummaryrefslogtreecommitdiffstats
path: root/filamento/src/files/opfs.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--filamento/src/files/opfs.rs38
1 files changed, 28 insertions, 10 deletions
diff --git a/filamento/src/files/opfs.rs b/filamento/src/files/opfs.rs
index e040762..fb32c6e 100644
--- a/filamento/src/files/opfs.rs
+++ b/filamento/src/files/opfs.rs
@@ -1,10 +1,11 @@
use std::path::Path;
use thiserror::Error;
-use wasm_bindgen::JsValue;
+use wasm_bindgen::{JsCast, JsValue};
use wasm_bindgen_futures::JsFuture;
use web_sys::{
- window, File, FileSystemDirectoryHandle, FileSystemFileHandle, FileSystemGetDirectoryOptions, FileSystemGetFileOptions, FileSystemWritableFileStream, Url
+ File, FileSystemDirectoryHandle, FileSystemFileHandle, FileSystemGetDirectoryOptions,
+ FileSystemGetFileOptions, FileSystemWritableFileStream, Url, js_sys, window,
};
use crate::FileStore;
@@ -26,7 +27,9 @@ impl FilesOPFS {
JsFuture::from(opfs_root.get_directory_handle_with_options(directory, &options))
.await?
.into();
- Ok(Self { directory: directory_string })
+ Ok(Self {
+ directory: directory_string,
+ })
}
pub async fn get_src(&self, file_name: impl AsRef<str>) -> Result<String, OPFSError> {
@@ -73,12 +76,21 @@ impl FileStore for FilesOPFS {
.into();
let options = FileSystemGetFileOptions::new();
options.set_create(true);
- let handle: FileSystemFileHandle = JsFuture::from(directory.get_file_handle_with_options(name, &options))
- .await?
- .into();
+ let handle: FileSystemFileHandle =
+ JsFuture::from(directory.get_file_handle_with_options(name, &options))
+ .await?
+ .into();
let write_handle: FileSystemWritableFileStream =
JsFuture::from(handle.create_writable()).await?.into();
- let write_promise = write_handle.write_with_u8_array(data)?;
+
+ let buffer = js_sys::ArrayBuffer::new(data.len() as u32);
+ let u8arr = js_sys::Uint8Array::new(&buffer);
+ for (idx, v) in data.iter().enumerate() {
+ u8arr.set_index(idx as u32, *v);
+ }
+
+ let write_promise = write_handle.write_with_js_u8_array(&u8arr).unwrap();
+ // let write_promise = write_handle.write_with_u8_array(data)?;
let _ = JsFuture::from(write_promise).await?;
let _ = JsFuture::from(write_handle.close()).await?;
Ok(())
@@ -98,13 +110,19 @@ impl FileStore for FilesOPFS {
#[derive(Error, Clone, Debug)]
pub enum OPFSError {
- #[error("not found")]
- NotFound,
+ #[error("js opfs error: {0}")]
+ Error(String),
}
// TODO: better errors
impl From<JsValue> for OPFSError {
fn from(value: JsValue) -> Self {
- Self::NotFound
+ Self::Error(
+ value
+ .dyn_into::<js_sys::Error>()
+ .ok()
+ .and_then(|err| err.message().as_string())
+ .unwrap_or(String::from("<no string>")),
+ )
}
}