emnapi 1.8.0 → 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 +252 -120
  3. package/emnapi.gyp +8 -1
  4. package/include/node/emnapi.h +2 -1
  5. package/include/node/js_native_api.h +6 -6
  6. package/include/node/js_native_api_types.h +8 -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
@@ -1262,6 +1273,9 @@ function _napi_get_typedarray_info(env, typedarray, type, length, data, arraybuf
1262
1273
  else if (v instanceof Uint32Array) {
1263
1274
  t = 6 /* napi_typedarray_type.napi_uint32_array */;
1264
1275
  }
1276
+ else if (typeof Float16Array === 'function' && v instanceof Float16Array) {
1277
+ t = 11 /* napi_typedarray_type.napi_float16_array */;
1278
+ }
1265
1279
  else if (v instanceof Float32Array) {
1266
1280
  t = 7 /* napi_typedarray_type.napi_float32_array */;
1267
1281
  }
@@ -2612,6 +2626,12 @@ function _emnapi_create_memory_view(env, typedarray_type, external_data, byte_le
2612
2626
  case -1 /* emnapi_memory_view_type.emnapi_data_view */:
2613
2627
  viewDescriptor = { Ctor: DataView, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
2614
2628
  break;
2629
+ case 11 /* emnapi_memory_view_type.emnapi_float16_array */:
2630
+ if (typeof Float16Array !== 'function') {
2631
+ return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
2632
+ }
2633
+ viewDescriptor = { Ctor: Float16Array, address: external_data, length: byte_length >> 1, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
2634
+ break;
2615
2635
  case -2 /* emnapi_memory_view_type.emnapi_buffer */: {
2616
2636
  if (!emnapiCtx.feature.Buffer) {
2617
2637
  throw emnapiCtx.createNotSupportBufferError('emnapi_create_memory_view', '');
@@ -3112,7 +3132,7 @@ function _napi_create_object(env, result) {
3112
3132
  /**
3113
3133
  * @__sig ipppppp
3114
3134
  */
3115
- 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) {
3116
3136
  if (!env)
3117
3137
  return 1 /* napi_status.napi_invalid_arg */;
3118
3138
  // @ts-expect-error
@@ -3274,6 +3294,11 @@ function _napi_create_typedarray(env, type, length, arraybuffer, byte_offset, re
3274
3294
  return createTypedArray(envObject, BigInt64Array, 8, buffer, byte_offset, length);
3275
3295
  case 10 /* napi_typedarray_type.napi_biguint64_array */:
3276
3296
  return createTypedArray(envObject, BigUint64Array, 8, buffer, byte_offset, length);
3297
+ case 11 /* napi_typedarray_type.napi_float16_array */:
3298
+ if (typeof Float16Array !== 'function') {
3299
+ return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
3300
+ }
3301
+ return createTypedArray(envObject, Float16Array, 2, buffer, byte_offset, length);
3277
3302
  default:
3278
3303
  return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
3279
3304
  }
@@ -3976,6 +4001,21 @@ function _napi_fatal_exception(env, err) {
3976
4001
  }
3977
4002
  }
3978
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 */
3979
4019
  function _napi_create_function(env, utf8name, length, cb, data, result) {
3980
4020
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
3981
4021
  var value;
@@ -3994,16 +4034,7 @@ function _napi_create_function(env, utf8name, length, cb, data, result) {
3994
4034
  return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
3995
4035
  if (!cb)
3996
4036
  return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
3997
- {{{ from64('length') }}};
3998
- var fresult = emnapiCreateFunction(envObject, utf8name, length, cb, data);
3999
- if (fresult.status !== 0 /* napi_status.napi_ok */)
4000
- return envObject.setLastError(fresult.status);
4001
- var f = fresult.f;
4002
- var valueHandle = emnapiCtx.addToCurrentScope(f);
4003
- {{{ from64('result') }}};
4004
- value = valueHandle.id;
4005
- {{{ makeSetValue('result', 0, 'value', '*') }}};
4006
- return envObject.getReturnStatus();
4037
+ return __emnapi_create_function(env, utf8name, length, cb, data, result);
4007
4038
  }
4008
4039
  catch (err) {
4009
4040
  envObject.tryCatch.setError(err);
@@ -4178,6 +4209,7 @@ function _napi_get_new_target(env, cbinfo, result) {
4178
4209
  {{{ from64('result') }}};
4179
4210
  var cbinfoValue = emnapiCtx.scopeStore.get(cbinfo).callbackInfo;
4180
4211
  var thiz = cbinfoValue.thiz, fn = cbinfoValue.fn;
4212
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain, @typescript-eslint/no-unused-vars
4181
4213
  var value = thiz == null || thiz.constructor == null
4182
4214
  ? 0
4183
4215
  : thiz instanceof fn
@@ -5507,28 +5539,75 @@ function _napi_run_script(env, script, result) {
5507
5539
  */
5508
5540
  var emnapiTSFN = {
5509
5541
  offset: {
5542
+ __size__: 0,
5510
5543
  /* napi_ref */ resource: 0,
5511
- /* double */ async_id: 8,
5512
- /* double */ trigger_async_id: 16,
5513
- /* size_t */ queue_size: 24,
5514
- /* void* */ queue: 1 * {{{ POINTER_SIZE }}} + 24,
5515
- /* size_t */ thread_count: 2 * {{{ POINTER_SIZE }}} + 24,
5516
- /* bool */ is_closing: 3 * {{{ POINTER_SIZE }}} + 24,
5517
- /* atomic_uchar */ dispatch_state: 3 * {{{ POINTER_SIZE }}} + 28,
5518
- /* void* */ context: 3 * {{{ POINTER_SIZE }}} + 32,
5519
- /* size_t */ max_queue_size: 4 * {{{ POINTER_SIZE }}} + 32,
5520
- /* napi_ref */ ref: 5 * {{{ POINTER_SIZE }}} + 32,
5521
- /* napi_env */ env: 6 * {{{ POINTER_SIZE }}} + 32,
5522
- /* void* */ finalize_data: 7 * {{{ POINTER_SIZE }}} + 32,
5523
- /* napi_finalize */ finalize_cb: 8 * {{{ POINTER_SIZE }}} + 32,
5524
- /* napi_threadsafe_function_call_js */ call_js_cb: 9 * {{{ POINTER_SIZE }}} + 32,
5525
- /* bool */ handles_closing: 10 * {{{ POINTER_SIZE }}} + 32,
5526
- /* bool */ async_ref: 10 * {{{ POINTER_SIZE }}} + 36,
5527
- /* int32_t */ mutex: 10 * {{{ POINTER_SIZE }}} + 40,
5528
- /* int32_t */ cond: 10 * {{{ POINTER_SIZE }}} + 44,
5529
- 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
5530
5563
  },
5531
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;
5532
5611
  if (typeof PThread !== 'undefined') {
5533
5612
  PThread.unusedWorkers.forEach(emnapiTSFN.addListener);
5534
5613
  PThread.runningWorkers.forEach(emnapiTSFN.addListener);
@@ -5633,11 +5712,11 @@ var emnapiTSFN = {
5633
5712
  var waitCondition = function () {
5634
5713
  var queueSize = emnapiTSFN.getQueueSize(func);
5635
5714
  var maxSize = emnapiTSFN.getMaxQueueSize(func);
5636
- var isClosing = emnapiTSFN.getIsClosing(func);
5637
- return queueSize >= maxSize && maxSize > 0 && !isClosing;
5715
+ return queueSize >= maxSize && maxSize > 0 && emnapiTSFN.getState(func) === 0 /* State.kOpen */;
5638
5716
  };
5639
5717
  var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE;
5640
- return mutex.execute(function () {
5718
+ var shouldDelete = false;
5719
+ var ret = mutex.execute(function () {
5641
5720
  while (waitCondition()) {
5642
5721
  if (mode === 0 /* napi_threadsafe_function_call_mode.napi_tsfn_nonblocking */) {
5643
5722
  return 15 /* napi_status.napi_queue_full */;
@@ -5654,21 +5733,25 @@ var emnapiTSFN = {
5654
5733
  }
5655
5734
  cond.wait();
5656
5735
  }
5657
- if (emnapiTSFN.getIsClosing(func)) {
5658
- if (emnapiTSFN.getThreadCount(func) === 0) {
5659
- return 1 /* napi_status.napi_invalid_arg */;
5660
- }
5661
- else {
5662
- emnapiTSFN.subThreadCount(func);
5663
- return 16 /* napi_status.napi_closing */;
5664
- }
5665
- }
5666
- else {
5736
+ if (emnapiTSFN.getState(func) === 0 /* State.kOpen */) {
5667
5737
  emnapiTSFN.pushQueue(func, data);
5668
5738
  emnapiTSFN.send(func);
5669
5739
  return 0 /* napi_status.napi_ok */;
5670
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 */;
5671
5750
  });
5751
+ if (shouldDelete) {
5752
+ emnapiTSFN.destroy(func);
5753
+ }
5754
+ return ret;
5672
5755
  },
5673
5756
  getMutex: function (func) {
5674
5757
  var index = func + emnapiTSFN.offset.mutex;
@@ -5678,7 +5761,7 @@ var emnapiTSFN = {
5678
5761
  var i32a = new Int32Array(wasmMemory.buffer, index, 1);
5679
5762
  if (isBrowserMain) {
5680
5763
  while (true) {
5681
- var oldValue = Atomics.compareExchange(i32a, 0, 0, 1);
5764
+ var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);
5682
5765
  if (oldValue === 0) {
5683
5766
  return;
5684
5767
  }
@@ -5686,11 +5769,11 @@ var emnapiTSFN = {
5686
5769
  }
5687
5770
  else {
5688
5771
  while (true) {
5689
- var oldValue = Atomics.compareExchange(i32a, 0, 0, 1);
5772
+ var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);
5690
5773
  if (oldValue === 0) {
5691
5774
  return;
5692
5775
  }
5693
- Atomics.wait(i32a, 0, 1);
5776
+ Atomics.wait(i32a, 0, 10);
5694
5777
  }
5695
5778
  }
5696
5779
  },
@@ -5699,20 +5782,20 @@ var emnapiTSFN = {
5699
5782
  const again = (): void => { fn() }
5700
5783
  const fn = (): void => {
5701
5784
  const i32a = new Int32Array(wasmMemory.buffer, index, 1)
5702
- const oldValue = Atomics.compareExchange(i32a, 0, 0, 1)
5785
+ const oldValue = Atomics.compareExchange(i32a, 0, 0, 10)
5703
5786
  if (oldValue === 0) {
5704
5787
  resolve()
5705
5788
  return
5706
5789
  }
5707
- (Atomics as any).waitAsync(i32a, 0, 1).value.then(again)
5790
+ (Atomics as any).waitAsync(i32a, 0, 10).value.then(again)
5708
5791
  }
5709
5792
  fn()
5710
5793
  })
5711
5794
  }, */
5712
5795
  unlock: function () {
5713
5796
  var i32a = new Int32Array(wasmMemory.buffer, index, 1);
5714
- var oldValue = Atomics.compareExchange(i32a, 0, 1, 0);
5715
- if (oldValue !== 1) {
5797
+ var oldValue = Atomics.compareExchange(i32a, 0, 10, 0);
5798
+ if (oldValue !== 10) {
5716
5799
  throw new Error('Tried to unlock while not holding the mutex');
5717
5800
  }
5718
5801
  Atomics.notify(i32a, 0, 1);
@@ -5823,17 +5906,17 @@ var emnapiTSFN = {
5823
5906
  #endif
5824
5907
  Atomics.sub(arr, index, {{{ to64('1') }}});
5825
5908
  },
5826
- getIsClosing: function (func) {
5827
- 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);
5828
5911
  },
5829
- setIsClosing: function (func, value) {
5830
- 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);
5831
5914
  },
5832
5915
  getHandlesClosing: function (func) {
5833
- 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));
5834
5917
  },
5835
5918
  setHandlesClosing: function (func, value) {
5836
- 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);
5837
5920
  },
5838
5921
  getDispatchState: function (func) {
5839
5922
  return Atomics.load(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >> 2);
@@ -5909,46 +5992,72 @@ var emnapiTSFN = {
5909
5992
  return undefined;
5910
5993
  }
5911
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
+ },
5912
6024
  destroy: function (func) {
5913
6025
  emnapiTSFN.destroyQueue(func);
5914
- var env = emnapiTSFN.getEnv(func);
5915
- var envObject = emnapiCtx.envStore.get(env);
5916
- var ref = emnapiTSFN.getRef(func);
5917
- if (ref) {
5918
- emnapiCtx.refStore.get(ref).dispose();
5919
- }
5920
- emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func);
5921
- envObject.unref();
5922
- var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2;
5923
- var arr = new Int32Array(wasmMemory.buffer);
5924
- if (Atomics.load(arr, asyncRefOffset)) {
5925
- Atomics.store(arr, asyncRefOffset, 0);
5926
- __emnapi_runtime_keepalive_pop();
5927
- emnapiCtx.decreaseWaitingRequestCounter();
5928
- }
5929
- var resource = emnapiTSFN.getResource(func);
5930
- emnapiCtx.refStore.get(resource).dispose();
5931
- if (emnapiNodeBinding) {
5932
- var view = new DataView(wasmMemory.buffer);
5933
- var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
5934
- var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
5935
- __emnapi_node_emit_async_destroy(asyncId, triggerAsyncId);
5936
- }
6026
+ emnapiTSFN.releaseResources(func);
5937
6027
  _free({{{ to64('func') }}});
5938
6028
  },
5939
- 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
+ });
5940
6036
  var callJsCb = emnapiTSFN.getCallJSCb(func);
5941
6037
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
5942
6038
  var context = emnapiTSFN.getContext(func);
5943
6039
  var data;
5944
- while (emnapiTSFN.getQueueSize(func) > 0) {
6040
+ for (var i = 0; i < drainQueue.length; i++) {
5945
6041
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
5946
- data = emnapiTSFN.shiftQueue(func);
6042
+ data = drainQueue[i];
5947
6043
  if (callJsCb) {
5948
6044
  {{{ makeDynCall('vpppp', 'callJsCb') }}}({{{ to64('0') }}}, {{{ to64('0') }}}, {{{ to64('context') }}}, {{{ to64('data') }}});
5949
6045
  }
5950
6046
  }
5951
- 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
+ }
5952
6061
  },
5953
6062
  finalize: function (func) {
5954
6063
  var env = emnapiTSFN.getEnv(func);
@@ -5963,6 +6072,7 @@ var emnapiTSFN = {
5963
6072
  envObject.callFinalizerInternal(0, {{{ to64('finalize') }}}, {{{ to64('data') }}}, {{{ to64('context') }}});
5964
6073
  };
5965
6074
  try {
6075
+ emnapiTSFN.emptyQueue(func);
5966
6076
  if (finalize) {
5967
6077
  if (emnapiNodeBinding) {
5968
6078
  var resource = emnapiTSFN.getResource(func);
@@ -5980,7 +6090,7 @@ var emnapiTSFN = {
5980
6090
  f();
5981
6091
  }
5982
6092
  }
5983
- emnapiTSFN.emptyQueueAndDelete(func);
6093
+ emnapiTSFN.maybeDelete(func);
5984
6094
  }
5985
6095
  finally {
5986
6096
  emnapiCtx.closeScope(envObject);
@@ -5996,7 +6106,7 @@ var emnapiTSFN = {
5996
6106
  try {
5997
6107
  if (set_closing) {
5998
6108
  emnapiTSFN.getMutex(func).execute(function () {
5999
- emnapiTSFN.setIsClosing(func, 1);
6109
+ emnapiTSFN.setState(func, 1 /* State.kClosing */);
6000
6110
  if (emnapiTSFN.getMaxQueueSize(func) > 0) {
6001
6111
  emnapiTSFN.getCond(func).signal();
6002
6112
  }
@@ -6022,10 +6132,7 @@ var emnapiTSFN = {
6022
6132
  var mutex = emnapiTSFN.getMutex(func);
6023
6133
  var cond = emnapiTSFN.getCond(func);
6024
6134
  mutex.execute(function () {
6025
- if (emnapiTSFN.getIsClosing(func)) {
6026
- emnapiTSFN.closeHandlesAndMaybeDelete(func, 0);
6027
- }
6028
- else {
6135
+ if (emnapiTSFN.getState(func) === 0 /* State.kOpen */) {
6029
6136
  var size = emnapiTSFN.getQueueSize(func);
6030
6137
  if (size > 0) {
6031
6138
  data = emnapiTSFN.shiftQueue(func);
@@ -6038,7 +6145,7 @@ var emnapiTSFN = {
6038
6145
  }
6039
6146
  if (size === 0) {
6040
6147
  if (emnapiTSFN.getThreadCount(func) === 0) {
6041
- emnapiTSFN.setIsClosing(func, 1);
6148
+ emnapiTSFN.setState(func, 1 /* State.kClosing */);
6042
6149
  if (emnapiTSFN.getMaxQueueSize(func) > 0) {
6043
6150
  cond.signal();
6044
6151
  }
@@ -6049,6 +6156,9 @@ var emnapiTSFN = {
6049
6156
  has_more = true;
6050
6157
  }
6051
6158
  }
6159
+ else {
6160
+ emnapiTSFN.closeHandlesAndMaybeDelete(func, 0);
6161
+ }
6052
6162
  });
6053
6163
  if (popped_value) {
6054
6164
  var env = emnapiTSFN.getEnv(func);
@@ -6187,21 +6297,24 @@ function _napi_create_threadsafe_function(env, func, async_resource, async_resou
6187
6297
  asyncResourceName = String(asyncResourceName);
6188
6298
  var resource_name = envObject.ensureHandleId(asyncResourceName);
6189
6299
  // tsfn create
6190
- var sizeofTSFN = emnapiTSFN.offset.end;
6300
+ var sizeofTSFN = emnapiTSFN.offset.__size__;
6301
+ // eslint-disable-next-line prefer-const
6191
6302
  var tsfn = _malloc({{{ to64('sizeofTSFN') }}});
6192
6303
  if (!tsfn)
6193
6304
  return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
6305
+ {{{ from64('tsfn') }}};
6194
6306
  new Uint8Array(wasmMemory.buffer).subarray(tsfn, tsfn + sizeofTSFN).fill(0);
6195
6307
  var resourceRef = emnapiCtx.createReference(envObject, resource, 1, 1 /* ReferenceOwnership.kUserland */);
6196
6308
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
6197
6309
  var resource_ = resourceRef.id;
6198
- {{{ makeSetValue('tsfn', 0, 'resource_', '*') }}};
6310
+ {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.resource', 'resource_', '*') }}};
6199
6311
  if (!emnapiTSFN.initQueue(tsfn)) {
6200
6312
  _free({{{ to64('tsfn') }}});
6201
6313
  resourceRef.dispose();
6202
6314
  return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
6203
6315
  }
6204
6316
  __emnapi_node_emit_async_init(resource, resource_name, -1, tsfn + emnapiTSFN.offset.async_id);
6317
+ {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.is_some', '1', 'i8') }}};
6205
6318
  {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.thread_count', 'initial_thread_count', SIZE_TYPE) }}};
6206
6319
  {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.context', 'context', '*') }}};
6207
6320
  {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.max_queue_size', 'max_queue_size', SIZE_TYPE) }}};
@@ -6214,7 +6327,7 @@ function _napi_create_threadsafe_function(env, func, async_resource, async_resou
6214
6327
  envObject.ref();
6215
6328
  __emnapi_runtime_keepalive_push();
6216
6329
  emnapiCtx.increaseWaitingRequestCounter();
6217
- {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.async_ref', '1', 'i32') }}};
6330
+ {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.async_ref', '1', 'u32') }}};
6218
6331
  {{{ from64('result') }}};
6219
6332
  {{{ makeSetValue('result', 0, 'tsfn', '*') }}};
6220
6333
  return envObject.clearLastError();
@@ -6251,11 +6364,11 @@ function _napi_acquire_threadsafe_function(func) {
6251
6364
  {{{ from64('func') }}};
6252
6365
  var mutex = emnapiTSFN.getMutex(func);
6253
6366
  return mutex.execute(function () {
6254
- if (emnapiTSFN.getIsClosing(func)) {
6255
- 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 */;
6256
6370
  }
6257
- emnapiTSFN.addThreadCount(func);
6258
- return 0 /* napi_status.napi_ok */;
6371
+ return 16 /* napi_status.napi_closing */;
6259
6372
  });
6260
6373
  }
6261
6374
  /** @__sig ipi */
@@ -6267,24 +6380,33 @@ function _napi_release_threadsafe_function(func, mode) {
6267
6380
  {{{ from64('func') }}};
6268
6381
  var mutex = emnapiTSFN.getMutex(func);
6269
6382
  var cond = emnapiTSFN.getCond(func);
6270
- return mutex.execute(function () {
6383
+ var shouldDelete = false;
6384
+ var ret = mutex.execute(function () {
6271
6385
  if (emnapiTSFN.getThreadCount(func) === 0) {
6272
6386
  return 1 /* napi_status.napi_invalid_arg */;
6273
6387
  }
6274
6388
  emnapiTSFN.subThreadCount(func);
6275
6389
  if (emnapiTSFN.getThreadCount(func) === 0 || mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) {
6276
- var isClosing = emnapiTSFN.getIsClosing(func);
6277
- if (!isClosing) {
6278
- var isClosingValue = (mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) ? 1 : 0;
6279
- emnapiTSFN.setIsClosing(func, isClosingValue);
6280
- 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) {
6281
6395
  cond.signal();
6282
6396
  }
6283
6397
  emnapiTSFN.send(func);
6284
6398
  }
6285
6399
  }
6400
+ if (!(emnapiTSFN.getState(func) === 2 /* State.kClosed */ && emnapiTSFN.getThreadCount(func) === 0)) {
6401
+ return 0 /* napi_status.napi_ok */;
6402
+ }
6403
+ shouldDelete = true;
6286
6404
  return 0 /* napi_status.napi_ok */;
6287
6405
  });
6406
+ if (shouldDelete) {
6407
+ emnapiTSFN.destroy(func);
6408
+ }
6409
+ return ret;
6288
6410
  }
6289
6411
  /** @__sig ipp */
6290
6412
  function _napi_unref_threadsafe_function(env, func) {
@@ -6294,11 +6416,14 @@ function _napi_unref_threadsafe_function(env, func) {
6294
6416
  }
6295
6417
  {{{ from64('func') }}};
6296
6418
  var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2;
6297
- var arr = new Int32Array(wasmMemory.buffer);
6298
- if (Atomics.load(arr, asyncRefOffset)) {
6299
- Atomics.store(arr, asyncRefOffset, 0);
6300
- __emnapi_runtime_keepalive_pop();
6301
- 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
+ }
6302
6427
  }
6303
6428
  return 0 /* napi_status.napi_ok */;
6304
6429
  }
@@ -6310,12 +6435,13 @@ function _napi_ref_threadsafe_function(env, func) {
6310
6435
  }
6311
6436
  {{{ from64('func') }}};
6312
6437
  var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2;
6313
- var arr = new Int32Array(wasmMemory.buffer);
6314
- if (!Atomics.load(arr, asyncRefOffset)) {
6315
- Atomics.store(arr, asyncRefOffset, 1);
6438
+ var arr = new Uint32Array(wasmMemory.buffer);
6439
+ var currentValue = Atomics.load(arr, asyncRefOffset);
6440
+ if (!currentValue) {
6316
6441
  __emnapi_runtime_keepalive_push();
6317
6442
  emnapiCtx.increaseWaitingRequestCounter();
6318
6443
  }
6444
+ Atomics.store(arr, asyncRefOffset, currentValue + 1);
6319
6445
  return 0 /* napi_status.napi_ok */;
6320
6446
  }
6321
6447
  /** @__sig ippp */
@@ -6843,6 +6969,14 @@ function _napi_get_version(env, result) {
6843
6969
  _emnapi_close_handle_scope: __emnapi_close_handle_scope,
6844
6970
  _emnapi_close_handle_scope__deps: ["$emnapiCtx", "$emnapiCtx"],
6845
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",
6846
6980
  _emnapi_ctx_decrease_waiting_request_counter: __emnapi_ctx_decrease_waiting_request_counter,
6847
6981
  _emnapi_ctx_decrease_waiting_request_counter__deps: ["$emnapiCtx"],
6848
6982
  _emnapi_ctx_decrease_waiting_request_counter__sig: "v",
@@ -6858,9 +6992,6 @@ function _napi_get_version(env, result) {
6858
6992
  _emnapi_env_unref: __emnapi_env_unref,
6859
6993
  _emnapi_env_unref__deps: ["$emnapiCtx"],
6860
6994
  _emnapi_env_unref__sig: "vp",
6861
- $emnapiString: emnapiString,
6862
- $emnapiString__deps: ["$emnapiCtx"],
6863
- $emnapiString__postset: "emnapiString.init();",
6864
6995
  _emnapi_get_filename: __emnapi_get_filename,
6865
6996
  _emnapi_get_filename__deps: ["$emnapiCtx", "$emnapiString"],
6866
6997
  _emnapi_get_filename__sig: "ippi",
@@ -6895,6 +7026,9 @@ function _napi_get_version(env, result) {
6895
7026
  _emnapi_runtime_keepalive_push__sig: "v",
6896
7027
  _emnapi_unwind: __emnapi_unwind,
6897
7028
  _emnapi_unwind__sig: "v",
7029
+ _emnapi_worker_ref: __emnapi_worker_ref,
7030
+ _emnapi_worker_ref__deps: ["$PThread"],
7031
+ _emnapi_worker_ref__sig: "vp",
6898
7032
  _emnapi_worker_unref: __emnapi_worker_unref,
6899
7033
  _emnapi_worker_unref__deps: ["$PThread"],
6900
7034
  _emnapi_worker_unref__sig: "vp",
@@ -7030,10 +7164,8 @@ function _napi_get_version(env, result) {
7030
7164
  napi_create_external_buffer: _napi_create_external_buffer,
7031
7165
  napi_create_external_buffer__deps: ["emnapi_create_memory_view"],
7032
7166
  napi_create_external_buffer__sig: "ipppppp",
7033
- $emnapiCreateFunction: emnapiCreateFunction,
7034
- $emnapiCreateFunction__deps: ["$emnapiString", "$emnapiCtx"],
7035
7167
  napi_create_function: _napi_create_function,
7036
- napi_create_function__deps: ["$emnapiCtx", "$emnapiCreateFunction"],
7168
+ napi_create_function__deps: ["$emnapiCtx", "_emnapi_create_function"],
7037
7169
  napi_create_function__sig: "ipppppp",
7038
7170
  napi_create_int32: _napi_create_int32,
7039
7171
  napi_create_int32__deps: ["$emnapiCtx"],
@@ -7044,9 +7176,6 @@ function _napi_get_version(env, result) {
7044
7176
  napi_create_object: _napi_create_object,
7045
7177
  napi_create_object__deps: ["$emnapiCtx"],
7046
7178
  napi_create_object__sig: "ipp",
7047
- napi_create_object_with_properties: _napi_create_object_with_properties,
7048
- napi_create_object_with_properties__deps: ["$emnapiCtx"],
7049
- napi_create_object_with_properties__sig: "ipppppp",
7050
7179
  napi_create_promise: _napi_create_promise,
7051
7180
  napi_create_promise__deps: ["$emnapiCtx"],
7052
7181
  napi_create_promise__sig: "ippp",
@@ -7370,6 +7499,9 @@ function _napi_get_version(env, result) {
7370
7499
  node_api_create_external_string_utf16: _node_api_create_external_string_utf16,
7371
7500
  node_api_create_external_string_utf16__deps: ["$emnapiString", "napi_create_string_utf16"],
7372
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",
7373
7505
  node_api_create_property_key_latin1: _node_api_create_property_key_latin1,
7374
7506
  node_api_create_property_key_latin1__deps: ["napi_create_string_latin1"],
7375
7507
  node_api_create_property_key_latin1__sig: "ipppp",