diff options
Diffstat (limited to '')
-rw-r--r-- | filamento/src/files/opfs.rs | 38 |
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>")), + ) } } |