node-addon-api 8.4.0 → 8.6.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.
package/README.md CHANGED
@@ -19,7 +19,7 @@ and exception handling semantics with low overhead.
19
19
  API references are available in the [doc](doc/README.md) directory.
20
20
 
21
21
  <!-- x-release-please-start-version -->
22
- ## Current version: 8.4.0
22
+ ## Current version: 8.6.0
23
23
  <!-- x-release-please-end -->
24
24
 
25
25
  (See [CHANGELOG.md](CHANGELOG.md) for complete Changelog)
package/common.gypi CHANGED
@@ -5,7 +5,7 @@
5
5
  },
6
6
  'conditions': [
7
7
  ['NAPI_VERSION!=""', { 'defines': ['NAPI_VERSION=<@(NAPI_VERSION)'] } ],
8
- ['NAPI_VERSION==2147483647', { 'defines': ['NAPI_EXPERIMENTAL'] } ],
8
+ ['NAPI_VERSION==2147483647', { 'defines': ['NAPI_EXPERIMENTAL', 'NODE_API_EXPERIMENTAL_NO_WARNING'] } ],
9
9
  ['disable_deprecated=="true"', {
10
10
  'defines': ['NODE_ADDON_API_DISABLE_DEPRECATED']
11
11
  }],
package/napi-inl.h CHANGED
@@ -21,6 +21,12 @@
21
21
  #include <type_traits>
22
22
  #include <utility>
23
23
 
24
+ #if defined(__clang__) || defined(__GNUC__)
25
+ #define NAPI_NO_SANITIZE_VPTR __attribute__((no_sanitize("vptr")))
26
+ #else
27
+ #define NAPI_NO_SANITIZE_VPTR
28
+ #endif
29
+
24
30
  namespace Napi {
25
31
 
26
32
  #ifdef NAPI_CPP_CUSTOM_NAMESPACE
@@ -934,6 +940,19 @@ inline bool Value::IsExternal() const {
934
940
  return Type() == napi_external;
935
941
  }
936
942
 
943
+ #ifdef NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
944
+ inline bool Value::IsSharedArrayBuffer() const {
945
+ if (IsEmpty()) {
946
+ return false;
947
+ }
948
+
949
+ bool result;
950
+ napi_status status = node_api_is_sharedarraybuffer(_env, _value, &result);
951
+ NAPI_THROW_IF_FAILED(_env, status, false);
952
+ return result;
953
+ }
954
+ #endif
955
+
937
956
  template <typename T>
938
957
  inline T Value::As() const {
939
958
  #ifdef NODE_ADDON_API_ENABLE_TYPE_CHECK_ON_AS
@@ -2068,6 +2087,55 @@ inline uint32_t Array::Length() const {
2068
2087
  return result;
2069
2088
  }
2070
2089
 
2090
+ #ifdef NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
2091
+ ////////////////////////////////////////////////////////////////////////////////
2092
+ // SharedArrayBuffer class
2093
+ ////////////////////////////////////////////////////////////////////////////////
2094
+
2095
+ inline SharedArrayBuffer::SharedArrayBuffer() : Object() {}
2096
+
2097
+ inline SharedArrayBuffer::SharedArrayBuffer(napi_env env, napi_value value)
2098
+ : Object(env, value) {}
2099
+
2100
+ inline void SharedArrayBuffer::CheckCast(napi_env env, napi_value value) {
2101
+ NAPI_CHECK(value != nullptr, "SharedArrayBuffer::CheckCast", "empty value");
2102
+
2103
+ bool result;
2104
+ napi_status status = node_api_is_sharedarraybuffer(env, value, &result);
2105
+ NAPI_CHECK(status == napi_ok,
2106
+ "SharedArrayBuffer::CheckCast",
2107
+ "node_api_is_sharedarraybuffer failed");
2108
+ NAPI_CHECK(
2109
+ result, "SharedArrayBuffer::CheckCast", "value is not sharedarraybuffer");
2110
+ }
2111
+
2112
+ inline SharedArrayBuffer SharedArrayBuffer::New(napi_env env,
2113
+ size_t byteLength) {
2114
+ napi_value value;
2115
+ void* data;
2116
+ napi_status status =
2117
+ node_api_create_sharedarraybuffer(env, byteLength, &data, &value);
2118
+ NAPI_THROW_IF_FAILED(env, status, SharedArrayBuffer());
2119
+
2120
+ return SharedArrayBuffer(env, value);
2121
+ }
2122
+
2123
+ inline void* SharedArrayBuffer::Data() {
2124
+ void* data;
2125
+ napi_status status = napi_get_arraybuffer_info(_env, _value, &data, nullptr);
2126
+ NAPI_THROW_IF_FAILED(_env, status, nullptr);
2127
+ return data;
2128
+ }
2129
+
2130
+ inline size_t SharedArrayBuffer::ByteLength() {
2131
+ size_t length;
2132
+ napi_status status =
2133
+ napi_get_arraybuffer_info(_env, _value, nullptr, &length);
2134
+ NAPI_THROW_IF_FAILED(_env, status, 0);
2135
+ return length;
2136
+ }
2137
+ #endif // NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
2138
+
2071
2139
  ////////////////////////////////////////////////////////////////////////////////
2072
2140
  // ArrayBuffer class
2073
2141
  ////////////////////////////////////////////////////////////////////////////////
@@ -2811,8 +2879,95 @@ inline void Promise::CheckCast(napi_env env, napi_value value) {
2811
2879
  NAPI_CHECK(result, "Promise::CheckCast", "value is not promise");
2812
2880
  }
2813
2881
 
2882
+ inline Promise::Promise() : Object() {}
2883
+
2814
2884
  inline Promise::Promise(napi_env env, napi_value value) : Object(env, value) {}
2815
2885
 
2886
+ inline MaybeOrValue<Promise> Promise::Then(napi_value onFulfilled) const {
2887
+ EscapableHandleScope scope(_env);
2888
+ #ifdef NODE_ADDON_API_ENABLE_MAYBE
2889
+ Value thenMethod;
2890
+ if (!Get("then").UnwrapTo(&thenMethod)) {
2891
+ return Nothing<Promise>();
2892
+ }
2893
+ MaybeOrValue<Value> result =
2894
+ thenMethod.As<Function>().Call(*this, {onFulfilled});
2895
+ if (result.IsJust()) {
2896
+ return Just(scope.Escape(result.Unwrap()).As<Promise>());
2897
+ }
2898
+ return Nothing<Promise>();
2899
+ #else
2900
+ Function thenMethod = Get("then").As<Function>();
2901
+ MaybeOrValue<Value> result = thenMethod.Call(*this, {onFulfilled});
2902
+ if (scope.Env().IsExceptionPending()) {
2903
+ return Promise();
2904
+ }
2905
+ return scope.Escape(result).As<Promise>();
2906
+ #endif
2907
+ }
2908
+
2909
+ inline MaybeOrValue<Promise> Promise::Then(napi_value onFulfilled,
2910
+ napi_value onRejected) const {
2911
+ EscapableHandleScope scope(_env);
2912
+ #ifdef NODE_ADDON_API_ENABLE_MAYBE
2913
+ Value thenMethod;
2914
+ if (!Get("then").UnwrapTo(&thenMethod)) {
2915
+ return Nothing<Promise>();
2916
+ }
2917
+ MaybeOrValue<Value> result =
2918
+ thenMethod.As<Function>().Call(*this, {onFulfilled, onRejected});
2919
+ if (result.IsJust()) {
2920
+ return Just(scope.Escape(result.Unwrap()).As<Promise>());
2921
+ }
2922
+ return Nothing<Promise>();
2923
+ #else
2924
+ Function thenMethod = Get("then").As<Function>();
2925
+ MaybeOrValue<Value> result =
2926
+ thenMethod.Call(*this, {onFulfilled, onRejected});
2927
+ if (scope.Env().IsExceptionPending()) {
2928
+ return Promise();
2929
+ }
2930
+ return scope.Escape(result).As<Promise>();
2931
+ #endif
2932
+ }
2933
+
2934
+ inline MaybeOrValue<Promise> Promise::Catch(napi_value onRejected) const {
2935
+ EscapableHandleScope scope(_env);
2936
+ #ifdef NODE_ADDON_API_ENABLE_MAYBE
2937
+ Value catchMethod;
2938
+ if (!Get("catch").UnwrapTo(&catchMethod)) {
2939
+ return Nothing<Promise>();
2940
+ }
2941
+ MaybeOrValue<Value> result =
2942
+ catchMethod.As<Function>().Call(*this, {onRejected});
2943
+ if (result.IsJust()) {
2944
+ return Just(scope.Escape(result.Unwrap()).As<Promise>());
2945
+ }
2946
+ return Nothing<Promise>();
2947
+ #else
2948
+ Function catchMethod = Get("catch").As<Function>();
2949
+ MaybeOrValue<Value> result = catchMethod.Call(*this, {onRejected});
2950
+ if (scope.Env().IsExceptionPending()) {
2951
+ return Promise();
2952
+ }
2953
+ return scope.Escape(result).As<Promise>();
2954
+ #endif
2955
+ }
2956
+
2957
+ inline MaybeOrValue<Promise> Promise::Then(const Function& onFulfilled) const {
2958
+ return Then(static_cast<napi_value>(onFulfilled));
2959
+ }
2960
+
2961
+ inline MaybeOrValue<Promise> Promise::Then(const Function& onFulfilled,
2962
+ const Function& onRejected) const {
2963
+ return Then(static_cast<napi_value>(onFulfilled),
2964
+ static_cast<napi_value>(onRejected));
2965
+ }
2966
+
2967
+ inline MaybeOrValue<Promise> Promise::Catch(const Function& onRejected) const {
2968
+ return Catch(static_cast<napi_value>(onRejected));
2969
+ }
2970
+
2816
2971
  ////////////////////////////////////////////////////////////////////////////////
2817
2972
  // Buffer<T> class
2818
2973
  ////////////////////////////////////////////////////////////////////////////////
@@ -4630,7 +4785,8 @@ inline napi_value InstanceWrap<T>::WrappedMethod(
4630
4785
  ////////////////////////////////////////////////////////////////////////////////
4631
4786
 
4632
4787
  template <typename T>
4633
- inline ObjectWrap<T>::ObjectWrap(const Napi::CallbackInfo& callbackInfo) {
4788
+ inline NAPI_NO_SANITIZE_VPTR ObjectWrap<T>::ObjectWrap(
4789
+ const Napi::CallbackInfo& callbackInfo) {
4634
4790
  napi_env env = callbackInfo.Env();
4635
4791
  napi_value wrapper = callbackInfo.This();
4636
4792
  napi_status status;
@@ -4644,7 +4800,7 @@ inline ObjectWrap<T>::ObjectWrap(const Napi::CallbackInfo& callbackInfo) {
4644
4800
  }
4645
4801
 
4646
4802
  template <typename T>
4647
- inline ObjectWrap<T>::~ObjectWrap() {
4803
+ inline NAPI_NO_SANITIZE_VPTR ObjectWrap<T>::~ObjectWrap() {
4648
4804
  // If the JS object still exists at this point, remove the finalizer added
4649
4805
  // through `napi_wrap()`.
4650
4806
  if (!IsEmpty() && !_finalized) {
@@ -4657,8 +4813,12 @@ inline ObjectWrap<T>::~ObjectWrap() {
4657
4813
  }
4658
4814
  }
4659
4815
 
4816
+ // with RTTI turned on, modern compilers check to see if virtual function
4817
+ // pointers are stripped of RTTI by void casts. this is intrinsic to how Unwrap
4818
+ // works, so we inject a compiler pragma to turn off that check just for the
4819
+ // affected methods. this compiler check is on by default in Android NDK 29.
4660
4820
  template <typename T>
4661
- inline T* ObjectWrap<T>::Unwrap(Object wrapper) {
4821
+ inline NAPI_NO_SANITIZE_VPTR T* ObjectWrap<T>::Unwrap(Object wrapper) {
4662
4822
  void* unwrapped;
4663
4823
  napi_status status = napi_unwrap(wrapper.Env(), wrapper, &unwrapped);
4664
4824
  NAPI_THROW_IF_FAILED(wrapper.Env(), status, nullptr);
@@ -6943,4 +7103,6 @@ inline void BasicEnv::PostFinalizer(FinalizerType finalizeCallback,
6943
7103
 
6944
7104
  } // namespace Napi
6945
7105
 
7106
+ #undef NAPI_NO_SANITIZE_VPTR
7107
+
6946
7108
  #endif // SRC_NAPI_INL_H_
package/napi.h CHANGED
@@ -543,6 +543,9 @@ class Value {
543
543
  bool IsDataView() const; ///< Tests if a value is a JavaScript data view.
544
544
  bool IsBuffer() const; ///< Tests if a value is a Node buffer.
545
545
  bool IsExternal() const; ///< Tests if a value is a pointer to external data.
546
+ #ifdef NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
547
+ bool IsSharedArrayBuffer() const;
548
+ #endif
546
549
 
547
550
  /// Casts to another type of `Napi::Value`, when the actual type is known or
548
551
  /// assumed.
@@ -1202,6 +1205,21 @@ class Object::iterator {
1202
1205
  };
1203
1206
  #endif // NODE_ADDON_API_CPP_EXCEPTIONS
1204
1207
 
1208
+ #ifdef NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER
1209
+ class SharedArrayBuffer : public Object {
1210
+ public:
1211
+ SharedArrayBuffer();
1212
+ SharedArrayBuffer(napi_env env, napi_value value);
1213
+
1214
+ static SharedArrayBuffer New(napi_env env, size_t byteLength);
1215
+
1216
+ static void CheckCast(napi_env env, napi_value value);
1217
+
1218
+ void* Data();
1219
+ size_t ByteLength();
1220
+ };
1221
+ #endif
1222
+
1205
1223
  /// A JavaScript array buffer value.
1206
1224
  class ArrayBuffer : public Object {
1207
1225
  public:
@@ -1574,7 +1592,18 @@ class Promise : public Object {
1574
1592
 
1575
1593
  static void CheckCast(napi_env env, napi_value value);
1576
1594
 
1595
+ Promise();
1577
1596
  Promise(napi_env env, napi_value value);
1597
+
1598
+ MaybeOrValue<Promise> Then(napi_value onFulfilled) const;
1599
+ MaybeOrValue<Promise> Then(napi_value onFulfilled,
1600
+ napi_value onRejected) const;
1601
+ MaybeOrValue<Promise> Catch(napi_value onRejected) const;
1602
+
1603
+ MaybeOrValue<Promise> Then(const Function& onFulfilled) const;
1604
+ MaybeOrValue<Promise> Then(const Function& onFulfilled,
1605
+ const Function& onRejected) const;
1606
+ MaybeOrValue<Promise> Catch(const Function& onRejected) const;
1578
1607
  };
1579
1608
 
1580
1609
  template <typename T>
package/package.json CHANGED
@@ -472,7 +472,7 @@
472
472
  "lint:fix": "eslint --fix && node tools/clang-format --fix"
473
473
  },
474
474
  "pre-commit": "lint",
475
- "version": "8.4.0",
475
+ "version": "8.6.0",
476
476
  "support": true,
477
477
  "engines": {
478
478
  "node": "^18 || ^20 || >= 21"