Я скомпилировал библиотеку C с Emscripten и написал JS, которая правильно взаимодействует с ней в интерактивной оболочке Node.js:
// script compiled by Emscripten
const _smaz = require("./_smaz");
var out_heap = _smaz['_malloc'](encoded.length * 8);
...
Однако _malloc
завершается неудачно, когда Функция вызывается непосредственно в моем приложении:
TypeError: Cannot read property 'apply' of undefined
at Object.a._malloc
Даже добавление 100ms setTimeout
решает проблему. Похоже, что скомпилированный Emscripten загружается асинхронно и функции не могут быть использованы немедленно.
Какой правильный способ справиться с этим? Emscripten docs предлагает добавить функцию Module['onRuntimeInitialized']
после загрузки моей "страницы", но я не уверен, где это должно go в серверном приложении Node.js или применяется ли оно в все.
Вот как я собираю:
emcc smaz.c -O2 -o _smaz.js --closure 1 -s EXPORTED_FUNCTIONS="['_smaz_compress', '_smaz_decompress']" -s 'EXTRA_EXPORTED_RUNTIME_METHODS=["ccall", "cwrap"]'