Releases: toyobayashi/emnapi
Releases · toyobayashi/emnapi
v0.28.1
0.28.0 breaks the -O3 build, fixed
v0.28.0
Add custom asynchronous operations API support and async_resource
parameter of napi_create_async_work
and napi_create_threadsafe_function
on Node.js
- napi_async_init
- napi_async_destroy
- napi_make_callback
return napi_generic_failure
on browser or nodeBinding
is not provided when initializing.
Module.emnapiInit({
context,
nodeBinding: require('@tybys/emnapi-node-binding')
})
v0.27.1
v0.27.0
v0.26.1
v0.26.0
napi_fatal_exception
node_api_get_module_file_name
napi_add_env_cleanup_hook
napi_remove_env_cleanup_hook
napi_add_async_cleanup_hook
napi_remove_async_cleanup_hook
v0.25.1
v0.25.0
- Initialization breaking change (#22)
Initialization Breaking Change:
before
Module.onEmnapiInitialized = function (err, emnapiExports) {
if (err) {
console.error(err)
return
}
emnapiExports.doSomething()
}
Module.onRuntimeInitialized = function () {
Module.emnapiExports.doSomething()
}
// -sMODULARIZE=1
Module().then(function (Module) {
Module.emnapiExports.doSomething()
})
after
npm install @tybys/emnapi-runtime
<script src="node_modules/@tybys/emnapi-runtime/dist/emnapi.min.js"></script>
const emnapi = require('@tybys/emnapi-runtime') // Node.js
const emnapi = window.emnapi // Browser
const context = emnapi.createContext()
Module.onRuntimeInitialized = function () {
try {
var binding = Module.emnapiInit({ context })
} catch (err) {
console.error(err)
return
}
binding.doSomething()
}
// -sMODULARIZE=1
Module().then(function (Module) {
try {
var binding = Module.emnapiInit({ context })
} catch (err) {
console.error(err)
return
}
binding.doSomething()
})
v0.24.0
- Buffer API support (#13)
- napi_create_buffer
- napi_create_external_buffer
- napi_create_buffer_copy
- napi_is_buffer
- napi_get_buffer_info
emnapi_create_memory_view
(#20)- Fix string decoding (#19)
- Fix init order (#18)
- Change
emnapi_sync_memory
signaturenapi_status emnapi_sync_memory(napi_env env, bool js_to_wasm, napi_value* arraybuffer_or_view, size_t byte_offset, size_t length);
declare function emnapiSyncMemory<T extends ArrayBuffer | ArrayBufferView> ( jsToWasm: boolean, arrayBufferOrView: T, byteOffset?: number, length?: number, ): T
Great thanks to @RReverser
v0.23.0
-
Add
napi_create_external_arraybuffer
, theArrayBuffer
memory is copy from wasm, useemnapi_sync_memory
to sync memory between wasm and JavaScript, use runtime method$emnapiSyncMemory
on JavaScript sidevoid finalizer(napi_env env, void* finalize_data, void* finalize_hint) { free(finalize_data); } napi_value createExternalArraybuffer(napi_env env, napi_callback_info info) { uint8_t* external_data = malloc(3); external_data[0] = 0; external_data[1] = 1; external_data[2] = 2; napi_value array_buffer; napi_create_external_arraybuffer(env, external_data, 3, finalizer, NULL, &array_buffer); external_data[0] = 3; // JavaScript ArrayBuffer memory will not change emnapi_sync_memory(env, array_buffer, 0, external_data, NAPI_AUTO_LENGTH, false); // after sync memory, new Uint8Array(array_buffer)[0] === 3 return array_buffer; }
declare function emnapiSyncMemory ( arrayBufferOrView: ArrayBuffer | ArrayBufferView, offset?: number, pointer?: number, len?: number, js_to_wasm?: boolean ): void const array_buffer = Module.emnapiExports.createExternalArraybuffer() new Uint8Array(array_buffer)[1] === 4 Module.emnapiSyncMemory(array_buffer, 0, 0, -1, true)
-
ArrayBuffer related API always return
data
pointer, the memory could be a copy from JavaScript ArrayBuffer, useemnapi_get_memory_address
to check if the memory should be released by user,napi_create_arraybuffer
napi_get_arraybuffer_info
napi_get_typedarray_info
napi_get_dataview_info
void* data; napi_get_typedarray_info(env, typedarray, NULL, NULL, &data, NULL, NULL); void* address; emnapi_ownership ownership; bool runtime_allocated; emnapi_get_memory_address(env, typedarray, &address, &ownership, &runtime_allocated); assert(address == data); if (data != NULL && runtime_allocated && ownership == emnapi_userland) { // user should free data // free(data); }