Соберите браузерный пакет и вызовите функцию Топаза из JavaScript с аргументами 45 и 20. Пример вернёт оставшееся время 25 и покажет, как читать результат с указанием типа.
Для локальной сборки нужны CLI Топаза, Rust с Cargo и wasm32-unknown-unknown. Пример JavaScript запускается в Node.js. Готовый браузерный пакет работает без Топаза и Rust.
Запустите исходный код в песочнице
В песочнице можно редактировать, проверять и запускать Топаз в браузере без установки CLI. Она загружает WASM компилятора и интерпретатора внутри Worker. Для вызова функций Топаза из собственного приложения JavaScript соберите пакет Web по примеру ниже.
Соберите пакет Web
В новом каталоге сохраните всю программу как main.tpz.
export function остаток(всего: int, потрачено: int) -> int {
всего - потрачено
}Выполните сборку из этого каталога.
topaz build --target web main.tpz --release --out-dir web-productВ конце сборка выводит пути к topaz-web.wasm и его загрузчику topaz-web.js. Каталог web-product содержит topaz-web.js, topaz-web.d.ts, topaz-web.wasm и общие файлы. Ваше приложение JavaScript создаёт интерфейс и вызывает экспортированные функции через сгенерированный модуль.
Вызовите функцию из JavaScript
Сохраните этот package.json рядом с main.tpz, чтобы Node.js читал созданный файл .js как модуль ES.
{ "type": "module" }Сохраните следующий файл как call.mjs в том же каталоге.
import { readFile } from 'node:fs/promises';
import { instantiateTopaz } from './web-product/topaz-web.js';
const wasm = await readFile(
new URL('./web-product/topaz-web.wasm', import.meta.url)
);
const app = await instantiateTopaz(wasm);
const result = app.exports.остаток(
{ $: 'int', value: '45' },
{ $: 'int', value: '20' }
);
console.log(JSON.stringify(result));Запустите файл JavaScript из каталога с main.tpz.
node call.mjsВызов выдаёт следующий результат.
{"status":"ok","value":{"$":"int","value":"25"}}Значение status: "ok" означает успешный вызов. Результат содержит целое число Топаза в виде десятичной строки "25". Каждый аргумент также содержит метку int и десятичную строку. Такой формат сохраняет значение целого числа при передаче через JavaScript.
Созданный topaz-web.d.ts описывает этот формат аргументов и результатов, называемый ABI. Проверяйте status перед чтением value. Результат fault содержит код ошибки, сообщение и диапазон исходного кода. Результат error содержит сообщение. Исправьте имя экспорта, аргументы или указанный исходный код Топаза перед повторным вызовом.
В браузере раздавайте весь продукт по HTTP. Импортируйте instantiateTopaz в модульном скрипте и передайте ему URL файла topaz-web.wasm. Экспортированная функция принимает аргументы с теми же метками типов. Браузеры не поддерживают прямую загрузку этого пакета через file://.
Выполняйте вызовы в Worker вне главного потока
Соберите тот же main.tpz для Worker, если вызовы должны выполняться вне главного потока браузера.
topaz build main.tpz --target web-worker --release --out-dir worker-productК файлам Web добавляются topaz-web-worker.js и topaz-web-worker-client.js. Клиент передаёт запросы и ответы в том же формате аргументов и результатов. Вызовы выполняются асинхронно. Интерфейс и разрешения по-прежнему задаёт ваше приложение JavaScript. Worker не предоставляет дополнительных полномочий.
Исправьте ошибки загрузки и сборки
| Проблема | Действие |
|---|---|
| Отсутствует цель Rust для WASM | Установите wasm32-unknown-unknown в инструментарий Rust, который использует сборка |
| Браузер сообщает о несовпадении идентификаторов среды и файлов выполнения | Разверните весь каталог одной сборки и храните его JavaScript вместе с WASM |
| Изменены управляемые файлы каталога вывода | Сохраните каталог для изучения и выберите новый пустой --out-dir |