Skip to content

Releases: toyobayashi/emnapi

v0.28.1

24 Jan 15:06
Compare
Choose a tag to compare

0.28.0 breaks the -O3 build, fixed

v0.28.0

23 Jan 17:04
Compare
Choose a tag to compare

#27

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

21 Jan 14:33
Compare
Choose a tag to compare

v0.27.0

20 Jan 13:57
Compare
Choose a tag to compare

v0.26.1

16 Jan 14:06
Compare
Choose a tag to compare

same as v0.26.0

v0.26.0

16 Jan 13:45
Compare
Choose a tag to compare
  • 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

13 Jan 14:51
Compare
Choose a tag to compare
  • fix esm runtime build (#24)
  • force add emnapiInit to EXPORTED_RUNTIME_METHODS

v0.25.0

13 Jan 13:56
Compare
Choose a tag to compare
  • 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

09 Jan 16:25
Compare
Choose a tag to compare
  • 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 signature
    napi_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

04 Jan 16:09
Compare
Choose a tag to compare
  • Add napi_create_external_arraybuffer, the ArrayBuffer memory is copy from wasm, use emnapi_sync_memory to sync memory between wasm and JavaScript, use runtime method $emnapiSyncMemory on JavaScript side

    void 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, use emnapi_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);
    }