wasui-memory 0.1.1

Easy way to create playground of WASI applications for web
Documentation
use crate::preview1::{GuestError, GuestMemory, GuestPtr, Memory, MemoryMut};
use js_sys::wasm_bindgen::JsValue;
use js_sys::{Reflect, Uint8Array, WebAssembly};

trait AsBuffer {
    fn as_buffer(&self) -> Result<JsValue, GuestError>;
}

impl AsBuffer for WebAssembly::Memory {
    fn as_buffer(&self) -> Result<JsValue, GuestError> {
        thread_local! {
            static BUFFER_NAME: JsValue = "buffer".into();
        }

        BUFFER_NAME.with(|buffer_name| {
            Reflect::get(&self, buffer_name).map_err(|_| GuestError::InvalidMemory)
        })
    }
}

impl Memory for WebAssembly::Memory {
    fn copy_to_slice(&self, ptr: GuestPtr<[u8]>, dst: &mut [u8]) -> Result<(), GuestError> {
        let buffer = self.as_buffer()?;

        let mem = Uint8Array::new_with_byte_offset_and_length(
            &buffer,
            ptr.offset_base() as u32,
            ptr.len() as u32,
        );

        mem.copy_to(dst);

        Ok(())
    }
}

impl MemoryMut for WebAssembly::Memory {
    fn copy_from_slice(&mut self, ptr: GuestPtr<[u8]>, src: &[u8]) -> Result<(), GuestError> {
        let buffer = self.as_buffer()?;

        let mem = Uint8Array::new_with_byte_offset_and_length(
            &buffer,
            ptr.offset_base() as u32,
            ptr.len() as u32,
        );

        mem.copy_from(src);

        Ok(())
    }
}

impl GuestMemory for WebAssembly::Memory {}