emnapi 1.8.1 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CMakeLists.txt +12 -13
  2. package/dist/library_napi.js +238 -120
  3. package/emnapi.gyp +8 -1
  4. package/include/node/emnapi.h +2 -2
  5. package/include/node/js_native_api.h +6 -6
  6. package/include/node/js_native_api_types.h +6 -7
  7. package/index.d.ts +12 -0
  8. package/index.js +36 -0
  9. package/lib/wasm32/libdlmalloc-mt.a +0 -0
  10. package/lib/wasm32/libdlmalloc.a +0 -0
  11. package/lib/wasm32/libemmalloc-mt.a +0 -0
  12. package/lib/wasm32/libemmalloc.a +0 -0
  13. package/lib/wasm32/libemnapi-basic-mt.a +0 -0
  14. package/lib/wasm32/libemnapi-basic.a +0 -0
  15. package/lib/wasm32/libemnapi.a +0 -0
  16. package/lib/wasm32-emscripten/libemnapi-basic.a +0 -0
  17. package/lib/wasm32-emscripten/libemnapi-mt.a +0 -0
  18. package/lib/wasm32-emscripten/libemnapi.a +0 -0
  19. package/lib/wasm32-wasi/libemnapi-basic-mt.a +0 -0
  20. package/lib/wasm32-wasi/libemnapi-basic.a +0 -0
  21. package/lib/wasm32-wasi/libemnapi.a +0 -0
  22. package/lib/wasm32-wasi-threads/libemnapi-basic-mt.a +0 -0
  23. package/lib/wasm32-wasi-threads/libemnapi-basic-napi-rs-mt.a +0 -0
  24. package/lib/wasm32-wasi-threads/libemnapi-basic.a +0 -0
  25. package/lib/wasm32-wasi-threads/libemnapi-mt.a +0 -0
  26. package/lib/wasm32-wasi-threads/libemnapi-napi-rs-mt.a +0 -0
  27. package/lib/wasm32-wasi-threads/libemnapi.a +0 -0
  28. package/lib/wasm32-wasip1/libemnapi-basic-mt.a +0 -0
  29. package/lib/wasm32-wasip1/libemnapi-basic.a +0 -0
  30. package/lib/wasm32-wasip1/libemnapi.a +0 -0
  31. package/lib/wasm32-wasip1-threads/libemnapi-basic-mt.a +0 -0
  32. package/lib/wasm32-wasip1-threads/libemnapi-basic-napi-rs-mt.a +0 -0
  33. package/lib/wasm32-wasip1-threads/libemnapi-basic.a +0 -0
  34. package/lib/wasm32-wasip1-threads/libemnapi-mt.a +0 -0
  35. package/lib/wasm32-wasip1-threads/libemnapi-napi-rs-mt.a +0 -0
  36. package/lib/wasm32-wasip1-threads/libemnapi.a +0 -0
  37. package/lib/wasm64-emscripten/libemnapi-basic.a +0 -0
  38. package/lib/wasm64-emscripten/libemnapi-mt.a +0 -0
  39. package/lib/wasm64-emscripten/libemnapi.a +0 -0
  40. package/package.json +5 -2
  41. package/src/async_cleanup_hook.c +0 -2
  42. package/src/emnapi_internal.h +12 -0
  43. package/src/node_api.c +1 -7
  44. package/src/thread/async_worker_create.c +24 -1
  45. package/src/threadsafe_function.c +110 -94
  46. package/src/threadsafe_function.h +51 -0
  47. package/src/uv/uv-common.c +9 -1
  48. package/src/wasi_wait.c +3 -0
@@ -278,6 +278,17 @@ function _napi_adjust_external_memory(env, low, high, adjusted_value) {
278
278
  #endif
279
279
  return envObject.clearLastError();
280
280
  }
281
+ /**
282
+ * @__deps $PThread
283
+ * @__sig vp
284
+ */
285
+ function __emnapi_worker_ref(pid) {
286
+ var worker = PThread.pthreads[pid];
287
+ worker = worker.worker || worker;
288
+ if (typeof worker.ref === 'function') {
289
+ worker.ref();
290
+ }
291
+ }
281
292
  /**
282
293
  * @__deps $PThread
283
294
  * @__sig vp
@@ -3121,7 +3132,7 @@ function _napi_create_object(env, result) {
3121
3132
  /**
3122
3133
  * @__sig ipppppp
3123
3134
  */
3124
- function _napi_create_object_with_properties(env, prototype_or_null, property_names, property_values, property_count, result) {
3135
+ function _node_api_create_object_with_properties(env, prototype_or_null, property_names, property_values, property_count, result) {
3125
3136
  if (!env)
3126
3137
  return 1 /* napi_status.napi_invalid_arg */;
3127
3138
  // @ts-expect-error
@@ -3990,6 +4001,21 @@ function _napi_fatal_exception(env, err) {
3990
4001
  }
3991
4002
  }
3992
4003
  /** @__sig ipppppp */
4004
+ function __emnapi_create_function(env, utf8name, length, cb, data, result) {
4005
+ {{{ from64('length') }}};
4006
+ var envObject = emnapiCtx.envStore.get(env);
4007
+ var fresult = emnapiCreateFunction(envObject, utf8name, length, cb, data);
4008
+ if (fresult.status !== 0 /* napi_status.napi_ok */)
4009
+ return envObject.setLastError(fresult.status);
4010
+ var f = fresult.f;
4011
+ var valueHandle = emnapiCtx.addToCurrentScope(f);
4012
+ {{{ from64('result') }}};
4013
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
4014
+ var value = valueHandle.id;
4015
+ {{{ makeSetValue('result', 0, 'value', '*') }}};
4016
+ return envObject.getReturnStatus();
4017
+ }
4018
+ /** @__sig ipppppp */
3993
4019
  function _napi_create_function(env, utf8name, length, cb, data, result) {
3994
4020
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
3995
4021
  var value;
@@ -4008,16 +4034,7 @@ function _napi_create_function(env, utf8name, length, cb, data, result) {
4008
4034
  return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
4009
4035
  if (!cb)
4010
4036
  return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
4011
- {{{ from64('length') }}};
4012
- var fresult = emnapiCreateFunction(envObject, utf8name, length, cb, data);
4013
- if (fresult.status !== 0 /* napi_status.napi_ok */)
4014
- return envObject.setLastError(fresult.status);
4015
- var f = fresult.f;
4016
- var valueHandle = emnapiCtx.addToCurrentScope(f);
4017
- {{{ from64('result') }}};
4018
- value = valueHandle.id;
4019
- {{{ makeSetValue('result', 0, 'value', '*') }}};
4020
- return envObject.getReturnStatus();
4037
+ return __emnapi_create_function(env, utf8name, length, cb, data, result);
4021
4038
  }
4022
4039
  catch (err) {
4023
4040
  envObject.tryCatch.setError(err);
@@ -4192,6 +4209,7 @@ function _napi_get_new_target(env, cbinfo, result) {
4192
4209
  {{{ from64('result') }}};
4193
4210
  var cbinfoValue = emnapiCtx.scopeStore.get(cbinfo).callbackInfo;
4194
4211
  var thiz = cbinfoValue.thiz, fn = cbinfoValue.fn;
4212
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain, @typescript-eslint/no-unused-vars
4195
4213
  var value = thiz == null || thiz.constructor == null
4196
4214
  ? 0
4197
4215
  : thiz instanceof fn
@@ -5521,28 +5539,75 @@ function _napi_run_script(env, script, result) {
5521
5539
  */
5522
5540
  var emnapiTSFN = {
5523
5541
  offset: {
5542
+ __size__: 0,
5524
5543
  /* napi_ref */ resource: 0,
5525
- /* double */ async_id: 8,
5526
- /* double */ trigger_async_id: 16,
5527
- /* size_t */ queue_size: 24,
5528
- /* void* */ queue: 1 * {{{ POINTER_SIZE }}} + 24,
5529
- /* size_t */ thread_count: 2 * {{{ POINTER_SIZE }}} + 24,
5530
- /* bool */ is_closing: 3 * {{{ POINTER_SIZE }}} + 24,
5531
- /* atomic_uchar */ dispatch_state: 3 * {{{ POINTER_SIZE }}} + 28,
5532
- /* void* */ context: 3 * {{{ POINTER_SIZE }}} + 32,
5533
- /* size_t */ max_queue_size: 4 * {{{ POINTER_SIZE }}} + 32,
5534
- /* napi_ref */ ref: 5 * {{{ POINTER_SIZE }}} + 32,
5535
- /* napi_env */ env: 6 * {{{ POINTER_SIZE }}} + 32,
5536
- /* void* */ finalize_data: 7 * {{{ POINTER_SIZE }}} + 32,
5537
- /* napi_finalize */ finalize_cb: 8 * {{{ POINTER_SIZE }}} + 32,
5538
- /* napi_threadsafe_function_call_js */ call_js_cb: 9 * {{{ POINTER_SIZE }}} + 32,
5539
- /* bool */ handles_closing: 10 * {{{ POINTER_SIZE }}} + 32,
5540
- /* bool */ async_ref: 10 * {{{ POINTER_SIZE }}} + 36,
5541
- /* int32_t */ mutex: 10 * {{{ POINTER_SIZE }}} + 40,
5542
- /* int32_t */ cond: 10 * {{{ POINTER_SIZE }}} + 44,
5543
- end: 10 * {{{ POINTER_SIZE }}} + 48
5544
+ /* double */ async_id: 0,
5545
+ /* double */ trigger_async_id: 0,
5546
+ /* size_t */ queue_size: 0,
5547
+ /* bool */ is_some: 0,
5548
+ /* void* */ queue: 0,
5549
+ /* size_t */ thread_count: 0,
5550
+ /* int32_t */ state: 0,
5551
+ /* atomic_uchar */ dispatch_state: 0,
5552
+ /* void* */ context: 0,
5553
+ /* size_t */ max_queue_size: 0,
5554
+ /* napi_ref */ ref: 0,
5555
+ /* napi_env */ env: 0,
5556
+ /* void* */ finalize_data: 0,
5557
+ /* napi_finalize */ finalize_cb: 0,
5558
+ /* napi_threadsafe_function_call_js */ call_js_cb: 0,
5559
+ /* bool */ handles_closing: 0,
5560
+ /* bool */ async_ref: 0,
5561
+ /* int32_t */ mutex: 0,
5562
+ /* int32_t */ cond: 0
5544
5563
  },
5545
5564
  init: function () {
5565
+ #if MEMORY64
5566
+ emnapiTSFN.offset.__size__ = 320 /* NapiTSFNOffset64.__size__ */;
5567
+ emnapiTSFN.offset.resource = 0 /* NapiTSFNOffset64.async_resource_resource */;
5568
+ emnapiTSFN.offset.async_id = 8 /* NapiTSFNOffset64.async_resource_async_context_async_id */;
5569
+ emnapiTSFN.offset.trigger_async_id = 16 /* NapiTSFNOffset64.async_resource_async_context_trigger_async_id */;
5570
+ emnapiTSFN.offset.queue_size = 88 /* NapiTSFNOffset64.queue_size */;
5571
+ emnapiTSFN.offset.is_some = 24 /* NapiTSFNOffset64.async_resource_is_some */;
5572
+ emnapiTSFN.offset.queue = 96 /* NapiTSFNOffset64.queue */;
5573
+ emnapiTSFN.offset.thread_count = 240 /* NapiTSFNOffset64.thread_count */;
5574
+ emnapiTSFN.offset.state = 248 /* NapiTSFNOffset64.state */;
5575
+ emnapiTSFN.offset.dispatch_state = 252 /* NapiTSFNOffset64.dispatch_state */;
5576
+ emnapiTSFN.offset.context = 256 /* NapiTSFNOffset64.context */;
5577
+ emnapiTSFN.offset.max_queue_size = 264 /* NapiTSFNOffset64.max_queue_size */;
5578
+ emnapiTSFN.offset.ref = 272 /* NapiTSFNOffset64.ref */;
5579
+ emnapiTSFN.offset.env = 280 /* NapiTSFNOffset64.env */;
5580
+ emnapiTSFN.offset.finalize_data = 288 /* NapiTSFNOffset64.finalize_data */;
5581
+ emnapiTSFN.offset.finalize_cb = 296 /* NapiTSFNOffset64.finalize_cb */;
5582
+ emnapiTSFN.offset.call_js_cb = 304 /* NapiTSFNOffset64.call_js_cb */;
5583
+ emnapiTSFN.offset.handles_closing = 312 /* NapiTSFNOffset64.handles_closing */;
5584
+ emnapiTSFN.offset.async_ref = 316 /* NapiTSFNOffset64.async_ref */;
5585
+ emnapiTSFN.offset.mutex = 32 /* NapiTSFNOffset64.mutex */;
5586
+ emnapiTSFN.offset.cond = 80 /* NapiTSFNOffset64.cond */;
5587
+ #else
5588
+ emnapiTSFN.offset.__size__ = 184 /* NapiTSFNOffset32.__size__ */;
5589
+ emnapiTSFN.offset.resource = 0 /* NapiTSFNOffset32.async_resource_resource */;
5590
+ emnapiTSFN.offset.async_id = 8 /* NapiTSFNOffset32.async_resource_async_context_async_id */;
5591
+ emnapiTSFN.offset.trigger_async_id = 16 /* NapiTSFNOffset32.async_resource_async_context_trigger_async_id */;
5592
+ emnapiTSFN.offset.queue_size = 60 /* NapiTSFNOffset32.queue_size */;
5593
+ emnapiTSFN.offset.is_some = 24 /* NapiTSFNOffset32.async_resource_is_some */;
5594
+ emnapiTSFN.offset.queue = 64 /* NapiTSFNOffset32.queue */;
5595
+ emnapiTSFN.offset.thread_count = 136 /* NapiTSFNOffset32.thread_count */;
5596
+ emnapiTSFN.offset.state = 140 /* NapiTSFNOffset32.state */;
5597
+ emnapiTSFN.offset.dispatch_state = 144 /* NapiTSFNOffset32.dispatch_state */;
5598
+ emnapiTSFN.offset.context = 148 /* NapiTSFNOffset32.context */;
5599
+ emnapiTSFN.offset.max_queue_size = 152 /* NapiTSFNOffset32.max_queue_size */;
5600
+ emnapiTSFN.offset.ref = 156 /* NapiTSFNOffset32.ref */;
5601
+ emnapiTSFN.offset.env = 160 /* NapiTSFNOffset32.env */;
5602
+ emnapiTSFN.offset.finalize_data = 164 /* NapiTSFNOffset32.finalize_data */;
5603
+ emnapiTSFN.offset.finalize_cb = 168 /* NapiTSFNOffset32.finalize_cb */;
5604
+ emnapiTSFN.offset.call_js_cb = 172 /* NapiTSFNOffset32.call_js_cb */;
5605
+ emnapiTSFN.offset.handles_closing = 176 /* NapiTSFNOffset32.handles_closing */;
5606
+ emnapiTSFN.offset.async_ref = 180 /* NapiTSFNOffset32.async_ref */;
5607
+ emnapiTSFN.offset.mutex = 32 /* NapiTSFNOffset32.mutex */;
5608
+ emnapiTSFN.offset.cond = 56 /* NapiTSFNOffset32.cond */;
5609
+ #endif
5610
+ emnapiTSFN.offset.mutex = emnapiTSFN.offset.mutex + 4;
5546
5611
  if (typeof PThread !== 'undefined') {
5547
5612
  PThread.unusedWorkers.forEach(emnapiTSFN.addListener);
5548
5613
  PThread.runningWorkers.forEach(emnapiTSFN.addListener);
@@ -5647,11 +5712,11 @@ var emnapiTSFN = {
5647
5712
  var waitCondition = function () {
5648
5713
  var queueSize = emnapiTSFN.getQueueSize(func);
5649
5714
  var maxSize = emnapiTSFN.getMaxQueueSize(func);
5650
- var isClosing = emnapiTSFN.getIsClosing(func);
5651
- return queueSize >= maxSize && maxSize > 0 && !isClosing;
5715
+ return queueSize >= maxSize && maxSize > 0 && emnapiTSFN.getState(func) === 0 /* State.kOpen */;
5652
5716
  };
5653
5717
  var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE;
5654
- return mutex.execute(function () {
5718
+ var shouldDelete = false;
5719
+ var ret = mutex.execute(function () {
5655
5720
  while (waitCondition()) {
5656
5721
  if (mode === 0 /* napi_threadsafe_function_call_mode.napi_tsfn_nonblocking */) {
5657
5722
  return 15 /* napi_status.napi_queue_full */;
@@ -5668,21 +5733,25 @@ var emnapiTSFN = {
5668
5733
  }
5669
5734
  cond.wait();
5670
5735
  }
5671
- if (emnapiTSFN.getIsClosing(func)) {
5672
- if (emnapiTSFN.getThreadCount(func) === 0) {
5673
- return 1 /* napi_status.napi_invalid_arg */;
5674
- }
5675
- else {
5676
- emnapiTSFN.subThreadCount(func);
5677
- return 16 /* napi_status.napi_closing */;
5678
- }
5679
- }
5680
- else {
5736
+ if (emnapiTSFN.getState(func) === 0 /* State.kOpen */) {
5681
5737
  emnapiTSFN.pushQueue(func, data);
5682
5738
  emnapiTSFN.send(func);
5683
5739
  return 0 /* napi_status.napi_ok */;
5684
5740
  }
5741
+ if (emnapiTSFN.getThreadCount(func) === 0) {
5742
+ return 1 /* napi_status.napi_invalid_arg */;
5743
+ }
5744
+ emnapiTSFN.subThreadCount(func);
5745
+ if (!(emnapiTSFN.getState(func) === 2 /* State.kClosed */ && emnapiTSFN.getThreadCount(func) === 0)) {
5746
+ return 16 /* napi_status.napi_closing */;
5747
+ }
5748
+ shouldDelete = true;
5749
+ return 16 /* napi_status.napi_closing */;
5685
5750
  });
5751
+ if (shouldDelete) {
5752
+ emnapiTSFN.destroy(func);
5753
+ }
5754
+ return ret;
5686
5755
  },
5687
5756
  getMutex: function (func) {
5688
5757
  var index = func + emnapiTSFN.offset.mutex;
@@ -5692,7 +5761,7 @@ var emnapiTSFN = {
5692
5761
  var i32a = new Int32Array(wasmMemory.buffer, index, 1);
5693
5762
  if (isBrowserMain) {
5694
5763
  while (true) {
5695
- var oldValue = Atomics.compareExchange(i32a, 0, 0, 1);
5764
+ var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);
5696
5765
  if (oldValue === 0) {
5697
5766
  return;
5698
5767
  }
@@ -5700,11 +5769,11 @@ var emnapiTSFN = {
5700
5769
  }
5701
5770
  else {
5702
5771
  while (true) {
5703
- var oldValue = Atomics.compareExchange(i32a, 0, 0, 1);
5772
+ var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);
5704
5773
  if (oldValue === 0) {
5705
5774
  return;
5706
5775
  }
5707
- Atomics.wait(i32a, 0, 1);
5776
+ Atomics.wait(i32a, 0, 10);
5708
5777
  }
5709
5778
  }
5710
5779
  },
@@ -5713,20 +5782,20 @@ var emnapiTSFN = {
5713
5782
  const again = (): void => { fn() }
5714
5783
  const fn = (): void => {
5715
5784
  const i32a = new Int32Array(wasmMemory.buffer, index, 1)
5716
- const oldValue = Atomics.compareExchange(i32a, 0, 0, 1)
5785
+ const oldValue = Atomics.compareExchange(i32a, 0, 0, 10)
5717
5786
  if (oldValue === 0) {
5718
5787
  resolve()
5719
5788
  return
5720
5789
  }
5721
- (Atomics as any).waitAsync(i32a, 0, 1).value.then(again)
5790
+ (Atomics as any).waitAsync(i32a, 0, 10).value.then(again)
5722
5791
  }
5723
5792
  fn()
5724
5793
  })
5725
5794
  }, */
5726
5795
  unlock: function () {
5727
5796
  var i32a = new Int32Array(wasmMemory.buffer, index, 1);
5728
- var oldValue = Atomics.compareExchange(i32a, 0, 1, 0);
5729
- if (oldValue !== 1) {
5797
+ var oldValue = Atomics.compareExchange(i32a, 0, 10, 0);
5798
+ if (oldValue !== 10) {
5730
5799
  throw new Error('Tried to unlock while not holding the mutex');
5731
5800
  }
5732
5801
  Atomics.notify(i32a, 0, 1);
@@ -5837,17 +5906,17 @@ var emnapiTSFN = {
5837
5906
  #endif
5838
5907
  Atomics.sub(arr, index, {{{ to64('1') }}});
5839
5908
  },
5840
- getIsClosing: function (func) {
5841
- return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.is_closing) >> 2);
5909
+ getState: function (func) {
5910
+ return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.state) >> 2);
5842
5911
  },
5843
- setIsClosing: function (func, value) {
5844
- Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.is_closing) >> 2, value);
5912
+ setState: function (func, value) {
5913
+ Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.state) >> 2, value);
5845
5914
  },
5846
5915
  getHandlesClosing: function (func) {
5847
- return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing) >> 2);
5916
+ return Atomics.load(new Int8Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing));
5848
5917
  },
5849
5918
  setHandlesClosing: function (func, value) {
5850
- Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing) >> 2, value);
5919
+ Atomics.store(new Int8Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing), value);
5851
5920
  },
5852
5921
  getDispatchState: function (func) {
5853
5922
  return Atomics.load(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >> 2);
@@ -5923,46 +5992,72 @@ var emnapiTSFN = {
5923
5992
  return undefined;
5924
5993
  }
5925
5994
  },
5995
+ releaseResources: function (func) {
5996
+ if (emnapiTSFN.getState(func) !== 2 /* State.kClosed */) {
5997
+ emnapiTSFN.setState(func, 2 /* State.kClosed */);
5998
+ var env = emnapiTSFN.getEnv(func);
5999
+ var envObject = emnapiCtx.envStore.get(env);
6000
+ var ref = emnapiTSFN.getRef(func);
6001
+ if (ref) {
6002
+ emnapiCtx.refStore.get(ref).dispose();
6003
+ }
6004
+ var resource = emnapiTSFN.getResource(func);
6005
+ emnapiCtx.refStore.get(resource).dispose();
6006
+ {{{ makeSetValue('func', 'emnapiTSFN.offset.is_some', '0', 'i8') }}};
6007
+ emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func);
6008
+ envObject.unref();
6009
+ var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2;
6010
+ var arr = new Uint32Array(wasmMemory.buffer);
6011
+ if (Atomics.load(arr, asyncRefOffset) > 0) {
6012
+ Atomics.store(arr, asyncRefOffset, 0);
6013
+ __emnapi_runtime_keepalive_pop();
6014
+ emnapiCtx.decreaseWaitingRequestCounter();
6015
+ }
6016
+ if (emnapiNodeBinding) {
6017
+ var view = new DataView(wasmMemory.buffer);
6018
+ var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
6019
+ var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
6020
+ __emnapi_node_emit_async_destroy(asyncId, triggerAsyncId);
6021
+ }
6022
+ }
6023
+ },
5926
6024
  destroy: function (func) {
5927
6025
  emnapiTSFN.destroyQueue(func);
5928
- var env = emnapiTSFN.getEnv(func);
5929
- var envObject = emnapiCtx.envStore.get(env);
5930
- var ref = emnapiTSFN.getRef(func);
5931
- if (ref) {
5932
- emnapiCtx.refStore.get(ref).dispose();
5933
- }
5934
- emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func);
5935
- envObject.unref();
5936
- var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2;
5937
- var arr = new Int32Array(wasmMemory.buffer);
5938
- if (Atomics.load(arr, asyncRefOffset)) {
5939
- Atomics.store(arr, asyncRefOffset, 0);
5940
- __emnapi_runtime_keepalive_pop();
5941
- emnapiCtx.decreaseWaitingRequestCounter();
5942
- }
5943
- var resource = emnapiTSFN.getResource(func);
5944
- emnapiCtx.refStore.get(resource).dispose();
5945
- if (emnapiNodeBinding) {
5946
- var view = new DataView(wasmMemory.buffer);
5947
- var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
5948
- var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
5949
- __emnapi_node_emit_async_destroy(asyncId, triggerAsyncId);
5950
- }
6026
+ emnapiTSFN.releaseResources(func);
5951
6027
  _free({{{ to64('func') }}});
5952
6028
  },
5953
- emptyQueueAndDelete: function (func) {
6029
+ emptyQueue: function (func) {
6030
+ var drainQueue = [];
6031
+ emnapiTSFN.getMutex(func).execute(function () {
6032
+ while (emnapiTSFN.getQueueSize(func) > 0) {
6033
+ drainQueue.push(emnapiTSFN.shiftQueue(func));
6034
+ }
6035
+ });
5954
6036
  var callJsCb = emnapiTSFN.getCallJSCb(func);
5955
6037
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
5956
6038
  var context = emnapiTSFN.getContext(func);
5957
6039
  var data;
5958
- while (emnapiTSFN.getQueueSize(func) > 0) {
6040
+ for (var i = 0; i < drainQueue.length; i++) {
5959
6041
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
5960
- data = emnapiTSFN.shiftQueue(func);
6042
+ data = drainQueue[i];
5961
6043
  if (callJsCb) {
5962
6044
  {{{ makeDynCall('vpppp', 'callJsCb') }}}({{{ to64('0') }}}, {{{ to64('0') }}}, {{{ to64('context') }}}, {{{ to64('data') }}});
5963
6045
  }
5964
6046
  }
5965
- emnapiTSFN.destroy(func);
6047
+ },
6048
+ maybeDelete: function (func) {
6049
+ var shouldDelete = false;
6050
+ emnapiTSFN.getMutex(func).execute(function () {
6051
+ if (emnapiTSFN.getThreadCount(func) > 0) {
6052
+ emnapiTSFN.releaseResources(func);
6053
+ }
6054
+ else {
6055
+ shouldDelete = true;
6056
+ }
6057
+ });
6058
+ if (shouldDelete) {
6059
+ emnapiTSFN.destroy(func);
6060
+ }
5966
6061
  },
5967
6062
  finalize: function (func) {
5968
6063
  var env = emnapiTSFN.getEnv(func);
@@ -5977,6 +6072,7 @@ var emnapiTSFN = {
5977
6072
  envObject.callFinalizerInternal(0, {{{ to64('finalize') }}}, {{{ to64('data') }}}, {{{ to64('context') }}});
5978
6073
  };
5979
6074
  try {
6075
+ emnapiTSFN.emptyQueue(func);
5980
6076
  if (finalize) {
5981
6077
  if (emnapiNodeBinding) {
5982
6078
  var resource = emnapiTSFN.getResource(func);
@@ -5994,7 +6090,7 @@ var emnapiTSFN = {
5994
6090
  f();
5995
6091
  }
5996
6092
  }
5997
- emnapiTSFN.emptyQueueAndDelete(func);
6093
+ emnapiTSFN.maybeDelete(func);
5998
6094
  }
5999
6095
  finally {
6000
6096
  emnapiCtx.closeScope(envObject);
@@ -6010,7 +6106,7 @@ var emnapiTSFN = {
6010
6106
  try {
6011
6107
  if (set_closing) {
6012
6108
  emnapiTSFN.getMutex(func).execute(function () {
6013
- emnapiTSFN.setIsClosing(func, 1);
6109
+ emnapiTSFN.setState(func, 1 /* State.kClosing */);
6014
6110
  if (emnapiTSFN.getMaxQueueSize(func) > 0) {
6015
6111
  emnapiTSFN.getCond(func).signal();
6016
6112
  }
@@ -6036,10 +6132,7 @@ var emnapiTSFN = {
6036
6132
  var mutex = emnapiTSFN.getMutex(func);
6037
6133
  var cond = emnapiTSFN.getCond(func);
6038
6134
  mutex.execute(function () {
6039
- if (emnapiTSFN.getIsClosing(func)) {
6040
- emnapiTSFN.closeHandlesAndMaybeDelete(func, 0);
6041
- }
6042
- else {
6135
+ if (emnapiTSFN.getState(func) === 0 /* State.kOpen */) {
6043
6136
  var size = emnapiTSFN.getQueueSize(func);
6044
6137
  if (size > 0) {
6045
6138
  data = emnapiTSFN.shiftQueue(func);
@@ -6052,7 +6145,7 @@ var emnapiTSFN = {
6052
6145
  }
6053
6146
  if (size === 0) {
6054
6147
  if (emnapiTSFN.getThreadCount(func) === 0) {
6055
- emnapiTSFN.setIsClosing(func, 1);
6148
+ emnapiTSFN.setState(func, 1 /* State.kClosing */);
6056
6149
  if (emnapiTSFN.getMaxQueueSize(func) > 0) {
6057
6150
  cond.signal();
6058
6151
  }
@@ -6063,6 +6156,9 @@ var emnapiTSFN = {
6063
6156
  has_more = true;
6064
6157
  }
6065
6158
  }
6159
+ else {
6160
+ emnapiTSFN.closeHandlesAndMaybeDelete(func, 0);
6161
+ }
6066
6162
  });
6067
6163
  if (popped_value) {
6068
6164
  var env = emnapiTSFN.getEnv(func);
@@ -6201,21 +6297,24 @@ function _napi_create_threadsafe_function(env, func, async_resource, async_resou
6201
6297
  asyncResourceName = String(asyncResourceName);
6202
6298
  var resource_name = envObject.ensureHandleId(asyncResourceName);
6203
6299
  // tsfn create
6204
- var sizeofTSFN = emnapiTSFN.offset.end;
6300
+ var sizeofTSFN = emnapiTSFN.offset.__size__;
6301
+ // eslint-disable-next-line prefer-const
6205
6302
  var tsfn = _malloc({{{ to64('sizeofTSFN') }}});
6206
6303
  if (!tsfn)
6207
6304
  return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
6305
+ {{{ from64('tsfn') }}};
6208
6306
  new Uint8Array(wasmMemory.buffer).subarray(tsfn, tsfn + sizeofTSFN).fill(0);
6209
6307
  var resourceRef = emnapiCtx.createReference(envObject, resource, 1, 1 /* ReferenceOwnership.kUserland */);
6210
6308
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
6211
6309
  var resource_ = resourceRef.id;
6212
- {{{ makeSetValue('tsfn', 0, 'resource_', '*') }}};
6310
+ {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.resource', 'resource_', '*') }}};
6213
6311
  if (!emnapiTSFN.initQueue(tsfn)) {
6214
6312
  _free({{{ to64('tsfn') }}});
6215
6313
  resourceRef.dispose();
6216
6314
  return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
6217
6315
  }
6218
6316
  __emnapi_node_emit_async_init(resource, resource_name, -1, tsfn + emnapiTSFN.offset.async_id);
6317
+ {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.is_some', '1', 'i8') }}};
6219
6318
  {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.thread_count', 'initial_thread_count', SIZE_TYPE) }}};
6220
6319
  {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.context', 'context', '*') }}};
6221
6320
  {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.max_queue_size', 'max_queue_size', SIZE_TYPE) }}};
@@ -6228,7 +6327,7 @@ function _napi_create_threadsafe_function(env, func, async_resource, async_resou
6228
6327
  envObject.ref();
6229
6328
  __emnapi_runtime_keepalive_push();
6230
6329
  emnapiCtx.increaseWaitingRequestCounter();
6231
- {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.async_ref', '1', 'i32') }}};
6330
+ {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.async_ref', '1', 'u32') }}};
6232
6331
  {{{ from64('result') }}};
6233
6332
  {{{ makeSetValue('result', 0, 'tsfn', '*') }}};
6234
6333
  return envObject.clearLastError();
@@ -6265,11 +6364,11 @@ function _napi_acquire_threadsafe_function(func) {
6265
6364
  {{{ from64('func') }}};
6266
6365
  var mutex = emnapiTSFN.getMutex(func);
6267
6366
  return mutex.execute(function () {
6268
- if (emnapiTSFN.getIsClosing(func)) {
6269
- return 16 /* napi_status.napi_closing */;
6367
+ if (emnapiTSFN.getState(func) === 0 /* State.kOpen */) {
6368
+ emnapiTSFN.addThreadCount(func);
6369
+ return 0 /* napi_status.napi_ok */;
6270
6370
  }
6271
- emnapiTSFN.addThreadCount(func);
6272
- return 0 /* napi_status.napi_ok */;
6371
+ return 16 /* napi_status.napi_closing */;
6273
6372
  });
6274
6373
  }
6275
6374
  /** @__sig ipi */
@@ -6281,24 +6380,33 @@ function _napi_release_threadsafe_function(func, mode) {
6281
6380
  {{{ from64('func') }}};
6282
6381
  var mutex = emnapiTSFN.getMutex(func);
6283
6382
  var cond = emnapiTSFN.getCond(func);
6284
- return mutex.execute(function () {
6383
+ var shouldDelete = false;
6384
+ var ret = mutex.execute(function () {
6285
6385
  if (emnapiTSFN.getThreadCount(func) === 0) {
6286
6386
  return 1 /* napi_status.napi_invalid_arg */;
6287
6387
  }
6288
6388
  emnapiTSFN.subThreadCount(func);
6289
6389
  if (emnapiTSFN.getThreadCount(func) === 0 || mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) {
6290
- var isClosing = emnapiTSFN.getIsClosing(func);
6291
- if (!isClosing) {
6292
- var isClosingValue = (mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) ? 1 : 0;
6293
- emnapiTSFN.setIsClosing(func, isClosingValue);
6294
- if (isClosingValue && emnapiTSFN.getMaxQueueSize(func) > 0) {
6390
+ if (emnapiTSFN.getState(func) === 0 /* State.kOpen */) {
6391
+ if (mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) {
6392
+ emnapiTSFN.setState(func, 1 /* State.kClosing */);
6393
+ }
6394
+ if (emnapiTSFN.getState(func) === 1 /* State.kClosing */ && emnapiTSFN.getMaxQueueSize(func) > 0) {
6295
6395
  cond.signal();
6296
6396
  }
6297
6397
  emnapiTSFN.send(func);
6298
6398
  }
6299
6399
  }
6400
+ if (!(emnapiTSFN.getState(func) === 2 /* State.kClosed */ && emnapiTSFN.getThreadCount(func) === 0)) {
6401
+ return 0 /* napi_status.napi_ok */;
6402
+ }
6403
+ shouldDelete = true;
6300
6404
  return 0 /* napi_status.napi_ok */;
6301
6405
  });
6406
+ if (shouldDelete) {
6407
+ emnapiTSFN.destroy(func);
6408
+ }
6409
+ return ret;
6302
6410
  }
6303
6411
  /** @__sig ipp */
6304
6412
  function _napi_unref_threadsafe_function(env, func) {
@@ -6308,11 +6416,14 @@ function _napi_unref_threadsafe_function(env, func) {
6308
6416
  }
6309
6417
  {{{ from64('func') }}};
6310
6418
  var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2;
6311
- var arr = new Int32Array(wasmMemory.buffer);
6312
- if (Atomics.load(arr, asyncRefOffset)) {
6313
- Atomics.store(arr, asyncRefOffset, 0);
6314
- __emnapi_runtime_keepalive_pop();
6315
- emnapiCtx.decreaseWaitingRequestCounter();
6419
+ var arr = new Uint32Array(wasmMemory.buffer);
6420
+ var currentValue = Atomics.load(arr, asyncRefOffset);
6421
+ if (currentValue > 0) {
6422
+ Atomics.store(arr, asyncRefOffset, currentValue - 1);
6423
+ if (currentValue === 1) {
6424
+ __emnapi_runtime_keepalive_pop();
6425
+ emnapiCtx.decreaseWaitingRequestCounter();
6426
+ }
6316
6427
  }
6317
6428
  return 0 /* napi_status.napi_ok */;
6318
6429
  }
@@ -6324,12 +6435,13 @@ function _napi_ref_threadsafe_function(env, func) {
6324
6435
  }
6325
6436
  {{{ from64('func') }}};
6326
6437
  var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2;
6327
- var arr = new Int32Array(wasmMemory.buffer);
6328
- if (!Atomics.load(arr, asyncRefOffset)) {
6329
- Atomics.store(arr, asyncRefOffset, 1);
6438
+ var arr = new Uint32Array(wasmMemory.buffer);
6439
+ var currentValue = Atomics.load(arr, asyncRefOffset);
6440
+ if (!currentValue) {
6330
6441
  __emnapi_runtime_keepalive_push();
6331
6442
  emnapiCtx.increaseWaitingRequestCounter();
6332
6443
  }
6444
+ Atomics.store(arr, asyncRefOffset, currentValue + 1);
6333
6445
  return 0 /* napi_status.napi_ok */;
6334
6446
  }
6335
6447
  /** @__sig ippp */
@@ -6857,6 +6969,14 @@ function _napi_get_version(env, result) {
6857
6969
  _emnapi_close_handle_scope: __emnapi_close_handle_scope,
6858
6970
  _emnapi_close_handle_scope__deps: ["$emnapiCtx", "$emnapiCtx"],
6859
6971
  _emnapi_close_handle_scope__sig: "vp",
6972
+ $emnapiString: emnapiString,
6973
+ $emnapiString__deps: ["$emnapiCtx"],
6974
+ $emnapiString__postset: "emnapiString.init();",
6975
+ $emnapiCreateFunction: emnapiCreateFunction,
6976
+ $emnapiCreateFunction__deps: ["$emnapiString", "$emnapiCtx"],
6977
+ _emnapi_create_function: __emnapi_create_function,
6978
+ _emnapi_create_function__deps: ["$emnapiCtx", "$emnapiCreateFunction"],
6979
+ _emnapi_create_function__sig: "ipppppp",
6860
6980
  _emnapi_ctx_decrease_waiting_request_counter: __emnapi_ctx_decrease_waiting_request_counter,
6861
6981
  _emnapi_ctx_decrease_waiting_request_counter__deps: ["$emnapiCtx"],
6862
6982
  _emnapi_ctx_decrease_waiting_request_counter__sig: "v",
@@ -6872,9 +6992,6 @@ function _napi_get_version(env, result) {
6872
6992
  _emnapi_env_unref: __emnapi_env_unref,
6873
6993
  _emnapi_env_unref__deps: ["$emnapiCtx"],
6874
6994
  _emnapi_env_unref__sig: "vp",
6875
- $emnapiString: emnapiString,
6876
- $emnapiString__deps: ["$emnapiCtx"],
6877
- $emnapiString__postset: "emnapiString.init();",
6878
6995
  _emnapi_get_filename: __emnapi_get_filename,
6879
6996
  _emnapi_get_filename__deps: ["$emnapiCtx", "$emnapiString"],
6880
6997
  _emnapi_get_filename__sig: "ippi",
@@ -6909,6 +7026,9 @@ function _napi_get_version(env, result) {
6909
7026
  _emnapi_runtime_keepalive_push__sig: "v",
6910
7027
  _emnapi_unwind: __emnapi_unwind,
6911
7028
  _emnapi_unwind__sig: "v",
7029
+ _emnapi_worker_ref: __emnapi_worker_ref,
7030
+ _emnapi_worker_ref__deps: ["$PThread"],
7031
+ _emnapi_worker_ref__sig: "vp",
6912
7032
  _emnapi_worker_unref: __emnapi_worker_unref,
6913
7033
  _emnapi_worker_unref__deps: ["$PThread"],
6914
7034
  _emnapi_worker_unref__sig: "vp",
@@ -7044,10 +7164,8 @@ function _napi_get_version(env, result) {
7044
7164
  napi_create_external_buffer: _napi_create_external_buffer,
7045
7165
  napi_create_external_buffer__deps: ["emnapi_create_memory_view"],
7046
7166
  napi_create_external_buffer__sig: "ipppppp",
7047
- $emnapiCreateFunction: emnapiCreateFunction,
7048
- $emnapiCreateFunction__deps: ["$emnapiString", "$emnapiCtx"],
7049
7167
  napi_create_function: _napi_create_function,
7050
- napi_create_function__deps: ["$emnapiCtx", "$emnapiCreateFunction"],
7168
+ napi_create_function__deps: ["$emnapiCtx", "_emnapi_create_function"],
7051
7169
  napi_create_function__sig: "ipppppp",
7052
7170
  napi_create_int32: _napi_create_int32,
7053
7171
  napi_create_int32__deps: ["$emnapiCtx"],
@@ -7058,9 +7176,6 @@ function _napi_get_version(env, result) {
7058
7176
  napi_create_object: _napi_create_object,
7059
7177
  napi_create_object__deps: ["$emnapiCtx"],
7060
7178
  napi_create_object__sig: "ipp",
7061
- napi_create_object_with_properties: _napi_create_object_with_properties,
7062
- napi_create_object_with_properties__deps: ["$emnapiCtx"],
7063
- napi_create_object_with_properties__sig: "ipppppp",
7064
7179
  napi_create_promise: _napi_create_promise,
7065
7180
  napi_create_promise__deps: ["$emnapiCtx"],
7066
7181
  napi_create_promise__sig: "ippp",
@@ -7384,6 +7499,9 @@ function _napi_get_version(env, result) {
7384
7499
  node_api_create_external_string_utf16: _node_api_create_external_string_utf16,
7385
7500
  node_api_create_external_string_utf16__deps: ["$emnapiString", "napi_create_string_utf16"],
7386
7501
  node_api_create_external_string_utf16__sig: "ippppppp",
7502
+ node_api_create_object_with_properties: _node_api_create_object_with_properties,
7503
+ node_api_create_object_with_properties__deps: ["$emnapiCtx"],
7504
+ node_api_create_object_with_properties__sig: "ipppppp",
7387
7505
  node_api_create_property_key_latin1: _node_api_create_property_key_latin1,
7388
7506
  node_api_create_property_key_latin1__deps: ["napi_create_string_latin1"],
7389
7507
  node_api_create_property_key_latin1__sig: "ipppp",
package/emnapi.gyp CHANGED
@@ -48,7 +48,6 @@
48
48
  'target_name': 'emnapi_basic',
49
49
  'type': 'static_library',
50
50
  'defines': [
51
- 'EMNAPI_DISABLE_UV'
52
51
  ],
53
52
  'sources': [
54
53
  'src/js_native_api.c',
@@ -56,6 +55,14 @@
56
55
  'src/async_cleanup_hook.c',
57
56
  'src/async_context.c',
58
57
  'src/wasi_wait.c',
58
+
59
+ 'src/uv/uv-common.c',
60
+ 'src/uv/threadpool.c',
61
+ 'src/uv/unix/loop.c',
62
+ 'src/uv/unix/posix-hrtime.c',
63
+ 'src/uv/unix/thread.c',
64
+ 'src/uv/unix/async.c',
65
+ 'src/uv/unix/core.c',
59
66
  ],
60
67
  'link_settings': {
61
68
  'target_conditions': [