有没有办法从 WebAssembly 上下文写入 JavaScript 缓冲区?

Is there a way to write to a JavaScript Buffer from the WebAssembly context?

我想要一个 WebAssembly 函数(从 Rust 编译),它以 JavaScript 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 来完成此操作?

您不能直接导入它,您发布的代码是正确的导入方法。 WASM 无法直接接触其内存之外的 JS 缓冲区。出于安全原因,这就是 WASM 沙盒化的方式,以保护主机环境 (JS)。

您或许可以提高 copy_into 的速度。您可以在 JS 端编写复制操作,而不是在 Rust 端遍历缓冲区。这将更快,尤其是对于大缓冲区,因为 JS 将在内部执行块复制操作。