ABI для WebAssembly
Один импорт и четыре экспорта: как написать SDK для любого языка, который собирается в WebAssembly.
Модуль WASM общается с хостом одним импортом и четырьмя экспортами. Этого достаточно, чтобы написать SDK на любом языке.
- Хост выделяет буфер через
opensd_alloc, записывает в него событие в UTF-8 JSON, вызываетopensd_eventи освобождает буфер черезopensd_free. - Модуль отправляет команду, вызывая
opensd.sendс указателем на UTF-8 JSON. Ответ0значит, что команда принята, отрицательное значение значит, что она отклонена. - Ненулевой результат
opensd_eventозначает ошибку обработчика. Описание ошибки модуль сам отправляет командойlog. - Других импортов быть не должно. Упаковщик проверяет это и устанавливает предел памяти 64 МиБ, если модуль его не задал.
Пример обмена
- Хост вызывает
opensd_alloc(len)и получает указатель на буфер в линейной памяти модуля. - Хост записывает в буфер событие, например
{"type":"tap","context":"k1","action":"com.example.counter.counter","settings":{},"state":0,"now":1520}. - Хост вызывает
opensd_event(ptr, len). Модуль разбирает JSON и вызываетopensd.sendс командой{"type":"setTitle","context":"k1","title":"1"}. opensd_eventвозвращает0, хост вызываетopensd_free(ptr, len).
Обработка события синхронная: пока opensd_event не вернула результат, следующее событие модулю не придёт. Долгие операции делаются через брокеры и таймеры, ответы на них приходят следующими событиями.
Крейт opensd это эталонная реализация ABI. Его модуль runtime.rs занимает около 140 строк и подходит как образец для SDK на другом языке. Типы событий и команд описаны в разделе протокол.