Моя цель - написать библиотеку Kotlin, скомпилировать ее в WebAssembly и вызвать ее функции из JS. Уже несколько часов я пытаюсь заставить работать простой мир. Документация по этой теме либо не существует, либо хорошо скрыта.
Это мой файл kotlin:
@Used
public fun hello() {
println("Hello world!")
}
fun main(args: Array<String>) {
println("main() function executed!")
}
Когда я компилирую его в WebAssembly, я получаю файл hello.wasm и hello.wasm.js .
Сначала я попытался использовать что-то вроде этого для выполнения функции:
WebAssembly.instantiateStreaming(fetch('hello.wasm'), importObject)
.then(obj => obj.instance.exports.hello());
Тогда я понял, что мне нужно передать импорт из моего файла hello.wasm.js в параметре importObject . Поэтому я думаю, что мне нужно использовать файл hello.wasm.js , чтобы правильно инициализировать мою программу wasm.
Когда я загружаю свой wasm следующим образом, я не получаю никаких ошибок, и выполняется функция main () .
<script wasm="hello.wasm" src="hello.wasm.js"></script>
Но как мне выполнить функцию hello () из JavaScript? Единственные примеры kotlin wasm, которые я обнаружил, это не вызов определенных функций, а рендеринг чего-либо из функции main () .
Также приветствуются любые ссылки на соответствующую документацию.
UPDATE:
Мне удалось выполнить функцию, но я не верю, что это правильный путь:
<script wasm="hello.wasm" src="hello.wasm.js"></script>
<script>
WebAssembly.instantiateStreaming(fetch('hello.wasm'), konan_dependencies)
.then(obj => obj.instance.exports['kfun:hello$$ValueType']());
</script>
Проблема в том, что мой файл wasm выбирается два раза, если я так делаю.
Загрузка только файла hello.wasm.js без атрибута wasm выдает мне следующую ошибку:
Uncaught Error: Could not find the wasm attribute pointing to the WebAssembly binary.
at Object.konan.moduleEntry (stats.wasm.js:433)
at stats.wasm.js:532