Хорошо, теперь я думаю, что знаю, что пошло не так: файл js, сгенерированный из пакета wasm, пытается загрузить WebAssembly как модуль.Модуль должен иметь MIME Javascript, иначе он потерпит неудачу (поэтому я попытался отправить файл wasm как content::JavaScript<Vec<u8>>
), но, очевидно, загрузка wasm как модуля не поддерживается (поправьте меня, если я ошибаюсь), так что, конечно,он найдет недопустимый токен в двоичном файле, потому что он пытается интерпретировать его как простой javascript.Что я на самом деле сейчас использую, так это тип Option<NamedFile>
от Rocket, у которого есть application/wasm
mime.
Мне нужно было немного изменить сгенерированный js-файл: WebAssembly инициализируется с помощью WebAssembly.instatiateStreaming(fetch(...), importObjects)
, тогда импорт модуля должен бытьудален.importObjects
тоже был немного хитрым, потому что передача стрингов в WebAssembly немного неудобна.Для функции оповещения, которую можно вызвать из WebAssembly, importObjects
выглядело так:
let importObjects = {'./wasm_test': { __wbg_alert_3d9cbee15c16469e: __wbg_alert_3d9cbee15c16469e }};
.
Имена взяты из двоичного файла wasm: (import "./wasm_test" "__wbg_alert_3d9cbee15c16469e" (func $__wbg_alert_3d9cbee15c16469e (type $t0)))
Функция __wbg_alert_3d9cbee15c16469e
создаетсяWasm-Pack.Последнее, что нужно изменить, - это объект, который был изначально импортирован с помощью оператора import
.Теперь у меня есть переменная с содержимым из obj.instance.exports
, которая установлена в операторе then из WebAssembly.instatiateStreaming(fetch(...), importObjects).then(obj => {
wasm = obj.instance.exports;
})
. С этими изменениями она работала для меня (отправка и чтение строк в / из WebAssembly)