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

时间:2019-06-27 12:09:07

标签: javascript rust webassembly

我想要一个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来完成此工作?

1 个答案:

答案 0 :(得分:2)

您不能直接导入它,并且发布的代码是正确的方法。 WASM无法直接在其内存外部接触JS缓冲区。出于安全原因,将WASM放到沙箱中以保护主机环境(JS)。

您也许可以提高copy_into的速度。您可以在JS端编写复制操作,而不是在Rust端浏览缓冲区。特别是对于大缓冲区,这将更快,因为JS会在内部执行块复制操作。