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 +1 -1
- package/common.gypi +1 -1
- package/napi-inl.h +165 -3
- package/napi.h +29 -0
- package/package.json +1 -1
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.
|
|
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(
|
|
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>
|