有没有一种方法可以从WebAssembly上下文向JavaScript缓冲区中写入数据?

3
我希望有一个WebAssembly函数(从Rust编译而来),它可以将JavaScript Buffer 作为参数并写入数据到该buffer中。然后我想能够使用这个buffer并从JavaScript上下文与数据交互。
我正在使用wasm-bindgen将WebAssembly结构导出到JavaScript,但我不知道如何在WebAssembly内部使用JavaScript的Buffer
以下是我想要Rust源代码样式的简化版本:
struct Element {
    a: u8,
    b: String,
}

impl Element {
    fn new(a: u8, b: &str) -> Element {
        Element {
            a: a,
            b: String::from(b),
        }
    }

    fn copy_into(&self, buffer: Buffer) {
        let mut offset = 0;
        buffer[offset] = self.a;
        offset += std::mem::size_of::<u8>();
        buffer[offset] = self.b;
    }
}

这是我在JavaScript环境下想要做的事情:
// Code for importing Element and instantiating the wasm module omitted.

let element = new Element(1, 'abc');
let buffer = Buffer.allocUnsafe(4);
element.copy_into(buffer);

console.log(buffer.toString('hex'));

我希望上述代码末尾的console.log能够打印出'01616263'。我希望在WebAssembly中不需要分配新内存并复制内容的情况下实现此操作。相反,我想直接写入JavaScript内存,其中buffer是指向该内存的指针。

如何通过导入Buffer到Rust来实现这一目标?
1个回答

2
你不能直接导入它,你发布的代码是正确的操作方式。WASM 不能直接触及 JS 缓冲区以外的内存。这就是 WASM 被沙盒化以保护主机环境(JS)的原因之一,出于安全考虑。
你可以提高 copy_into 的速度。你可以在 JS 端编写复制操作,而不是在 Rust 端遍历缓冲区。这对于大缓冲区来说会更快,因为 JS 将在内部执行块复制操作。

您写道代码是正确的方式。这是否意味着我实际上可以将JS缓冲区作为参数并以我描述的方式写入它?如果是这样,那么这不意味着它会直接从Wasm写入JS内存?您究竟是如何加速copy_into的?您是否建议我,而不是将缓冲区作为参数,仅在Wasm中返回值,例如Array,然后在JS侧将其复制到缓冲区中? - Jacob Bohlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接