Есть ли способ записи в буфер JavaScript из контекста WebAssembly? - PullRequest
3 голосов
/ 27 июня 2019

Я хочу иметь функцию WebAssembly (скомпилированную из Rust), которая принимает JavaScript Buffer в качестве аргумента и записывает данные в буфер. Затем я хочу иметь возможность использовать этот буфер и взаимодействовать с данными из контекста JavaScript.

Я использую wasm-bindgen для экспорта структур WebAssembly в JavaScript, но я не знаю, как я могу использовать JavaScript Buffer внутри WebAssembly.

Это упрощенная версия того, что я хочу, чтобы исходный код 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 голосов
/ 27 июня 2019

Вы не можете импортировать его напрямую, и код, который вы разместили, является правильным способом сделать это. WASM не может касаться буферов JS непосредственно за пределами своей памяти. Вот как WASM изолирован для защиты среды хоста (JS) по соображениям безопасности.

Возможно, вы сможете увеличить скорость copy_into. Вы можете написать операцию копирования на стороне JS, вместо того, чтобы проходить через буфер на стороне Rust. Это будет быстрее, особенно для большого буфера, потому что JS выполнит внутреннюю операцию копирования блока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...