From 7828ee7b28a71cf15614d9fd39d0cf771b5afe47 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Mon, 14 Jul 2025 18:41:47 +0300 Subject: [PATCH 01/17] node-api: added SharedArrayBuffer api --- doc/api/n-api.md | 120 +++++++++++++ src/js_native_api.h | 11 ++ src/js_native_api_v8.cc | 59 ++++++ .../test_sharedarraybuffer/binding.gyp | 8 + .../test_sharedarraybuffer/test.js | 71 ++++++++ .../test_sharedarraybuffer.c | 168 ++++++++++++++++++ 6 files changed, 437 insertions(+) create mode 100644 test/js-native-api/test_sharedarraybuffer/binding.gyp create mode 100644 test/js-native-api/test_sharedarraybuffer/test.js create mode 100644 test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 77257623157bdd..fdf03c7efba045 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -4246,6 +4246,125 @@ This API represents the invocation of the `ArrayBuffer` `IsDetachedBuffer` operation as defined in [Section isDetachedBuffer][] of the ECMAScript Language Specification. +## Working with JavaScript SharedArrayBuffers + +SharedArrayBuffers are used to represent fixed-length binary data buffers +that can be shared across multiple workers. They are similar to ArrayBuffers +but allow for concurrent access from multiple threads. + +### `napi_is_sharedarraybuffer` + + + +```c +napi_status napi_is_sharedarraybuffer(napi_env env, napi_value value, bool* result) +``` + +* `[in] env`: The environment that the API is invoked under. +* `[in] value`: The JavaScript value to check. +* `[out] result`: Whether the given `napi_value` represents a `SharedArrayBuffer`. + +Returns `napi_ok` if the API succeeded. + +This API checks if the Object passed in is a `SharedArrayBuffer`. + +### `napi_create_sharedarraybuffer` + + + +```c +napi_status napi_create_sharedarraybuffer(napi_env env, + size_t byte_length, + void** data, + napi_value* result) +``` + +* `[in] env`: The environment that the API is invoked under. +* `[in] byte_length`: The length in bytes of the shared array buffer to create. +* `[out] data`: Pointer to the underlying byte buffer of the `SharedArrayBuffer`. + `data` can optionally be ignored by passing `NULL`. +* `[out] result`: A `napi_value` representing a JavaScript `SharedArrayBuffer`. + +Returns `napi_ok` if the API succeeded. + +This API returns a Node-API value corresponding to a JavaScript `SharedArrayBuffer`. +`SharedArrayBuffer`s are used to represent fixed-length binary data buffers that +can be shared across multiple workers. + +The `SharedArrayBuffer` allocated will have an underlying byte buffer whose size is +determined by the `byte_length` parameter that's passed in. +The underlying buffer is optionally returned back to the caller in case the +caller wants to directly manipulate the buffer. This buffer can only be +written to directly from native code. To write to this buffer from JavaScript, +a typed array or `DataView` object would need to be created. + +JavaScript `SharedArrayBuffer` objects are described in +[Section 24.2][] of the ECMAScript Language Specification. + +### `napi_get_sharedarraybuffer_info` + + + +```c +napi_status napi_get_sharedarraybuffer_info(napi_env env, + napi_value sharedarraybuffer, + void** data, + size_t* byte_length) +``` + +* `[in] env`: The environment that the API is invoked under. +* `[in] sharedarraybuffer`: `napi_value` representing the `SharedArrayBuffer` being queried. +* `[out] data`: The underlying data buffer of the `SharedArrayBuffer`. If byte\_length + is `0`, this may be `NULL` or any other pointer value. +* `[out] byte_length`: The length in bytes of the underlying data buffer. + +Returns `napi_ok` if the API succeeded. + +This API is used to retrieve the underlying data buffer of a `SharedArrayBuffer` and +its length. + +_Warning_: Use caution while using this API. The lifetime of the underlying data +buffer is managed by the `SharedArrayBuffer` even after it's returned. A +possible safe way to use this API is in conjunction with +[`napi_create_reference`][], which can be used to guarantee control over the +lifetime of the `SharedArrayBuffer`. It's also safe to use the returned data buffer +within the same callback as long as there are no calls to other APIs that might +trigger a GC. + +#### Example + +```c +napi_value shared_array_buffer; +void* shared_data; +size_t shared_byte_length; + +// Create a SharedArrayBuffer +napi_status status = napi_create_sharedarraybuffer(env, 1024, &shared_data, &shared_array_buffer); +if (status != napi_ok) { + // Handle error +} + +// Check if a value is a SharedArrayBuffer +bool is_shared_array_buffer; +status = napi_is_sharedarraybuffer(env, shared_array_buffer, &is_shared_array_buffer); +if (status == napi_ok && is_shared_array_buffer) { + // Get SharedArrayBuffer info + status = napi_get_sharedarraybuffer_info(env, shared_array_buffer, &shared_data, &shared_byte_length); + if (status == napi_ok) { + // Use shared_data and shared_byte_length + } +} +``` + ## Working with JavaScript properties Node-API exposes a set of APIs to get and set properties on JavaScript @@ -6759,6 +6878,7 @@ the add-on's file name during loading. [Section IsArray]: https://tc39.es/ecma262/#sec-isarray [Section IsStrctEqual]: https://tc39.es/ecma262/#sec-strict-equality-comparison [Section Promise objects]: https://tc39.es/ecma262/#sec-promise-objects +[Section SharedArrayBuffer objects]: https://tc39.es/ecma262/#sec-sharedarraybuffer-objects [Section ToBoolean]: https://tc39.es/ecma262/#sec-toboolean [Section ToNumber]: https://tc39.es/ecma262/#sec-tonumber [Section ToObject]: https://tc39.es/ecma262/#sec-toobject diff --git a/src/js_native_api.h b/src/js_native_api.h index 8177ace3acbb89..ee3177af985a61 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -486,6 +486,17 @@ napi_get_dataview_info(napi_env env, napi_value* arraybuffer, size_t* byte_offset); +NAPI_EXTERN napi_status NAPI_CDECL napi_is_sharedarraybuffer(napi_env env, + napi_value value, + bool* result); +NAPI_EXTERN napi_status NAPI_CDECL napi_create_sharedarraybuffer( + napi_env env, size_t byte_length, void** data, napi_value* result); +NAPI_EXTERN napi_status NAPI_CDECL +napi_get_sharedarraybuffer_info(napi_env env, + napi_value sharedarraybuffer, + void** data, + size_t* byte_length); + // version management NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(node_api_basic_env env, uint32_t* result); diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 260a572ce71a82..eb289295196328 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -3091,6 +3091,65 @@ napi_status NAPI_CDECL napi_get_arraybuffer_info(napi_env env, return napi_clear_last_error(env); } +napi_status NAPI_CDECL napi_is_sharedarraybuffer(napi_env env, + napi_value value, + bool* result) { + CHECK_ENV_NOT_IN_GC(env); + CHECK_ARG(env, value); + CHECK_ARG(env, result); + + v8::Local val = v8impl::V8LocalValueFromJsValue(value); + *result = val->IsSharedArrayBuffer(); + + return napi_clear_last_error(env); +} + +napi_status NAPI_CDECL napi_create_sharedarraybuffer(napi_env env, + size_t byte_length, + void** data, + napi_value* result) { + NAPI_PREAMBLE(env); + CHECK_ARG(env, result); + + v8::Isolate* isolate = env->isolate; + v8::Local buffer = + v8::SharedArrayBuffer::New(isolate, byte_length); + + // Optionally return a pointer to the buffer's data, to avoid another call to + // retrieve it. + if (data != nullptr) { + *data = buffer->Data(); + } + + *result = v8impl::JsValueFromV8LocalValue(buffer); + return GET_RETURN_STATUS(env); +} + +napi_status NAPI_CDECL +napi_get_sharedarraybuffer_info(napi_env env, + napi_value sharedarraybuffer, + void** data, + size_t* byte_length) { + CHECK_ENV_NOT_IN_GC(env); + CHECK_ARG(env, sharedarraybuffer); + + v8::Local value = + v8impl::V8LocalValueFromJsValue(sharedarraybuffer); + RETURN_STATUS_IF_FALSE(env, value->IsSharedArrayBuffer(), napi_invalid_arg); + + v8::Local sab = value.As(); + + if (data != nullptr) { + *data = sab->Data(); + } + + if (byte_length != nullptr) { + *byte_length = sab->ByteLength(); + } + + return napi_clear_last_error(env); +} + napi_status NAPI_CDECL napi_is_typedarray(napi_env env, napi_value value, bool* result) { diff --git a/test/js-native-api/test_sharedarraybuffer/binding.gyp b/test/js-native-api/test_sharedarraybuffer/binding.gyp new file mode 100644 index 00000000000000..a5bf2a1d36f574 --- /dev/null +++ b/test/js-native-api/test_sharedarraybuffer/binding.gyp @@ -0,0 +1,8 @@ +{ + "targets": [ + { + "target_name": "test_sharedarraybuffer", + "sources": [ "test_sharedarraybuffer.c" ] + } + ] +} \ No newline at end of file diff --git a/test/js-native-api/test_sharedarraybuffer/test.js b/test/js-native-api/test_sharedarraybuffer/test.js new file mode 100644 index 00000000000000..9f117e7689dcb0 --- /dev/null +++ b/test/js-native-api/test_sharedarraybuffer/test.js @@ -0,0 +1,71 @@ +'use strict'; + +const common = require('../../common'); +const assert = require('assert'); +const test_sharedarraybuffer = require(`./build/${common.buildType}/test_sharedarraybuffer`); + +{ + const sab = new SharedArrayBuffer(16); + const ab = new ArrayBuffer(16); + const obj = {}; + const arr = []; + + assert.strictEqual(test_sharedarraybuffer.TestIsSharedArrayBuffer(sab), true); + assert.strictEqual(test_sharedarraybuffer.TestIsSharedArrayBuffer(ab), false); + assert.strictEqual(test_sharedarraybuffer.TestIsSharedArrayBuffer(obj), false); + assert.strictEqual(test_sharedarraybuffer.TestIsSharedArrayBuffer(arr), false); + assert.strictEqual(test_sharedarraybuffer.TestIsSharedArrayBuffer(null), false); + assert.strictEqual(test_sharedarraybuffer.TestIsSharedArrayBuffer(undefined), false); +} + +// Test napi_create_sharedarraybuffer +{ + const sab = test_sharedarraybuffer.TestCreateSharedArrayBuffer(16); + assert(sab instanceof SharedArrayBuffer); + assert.strictEqual(sab.byteLength, 16); +} + +// Test napi_get_sharedarraybuffer_info +{ + const sab = new SharedArrayBuffer(32); + const byteLength = test_sharedarraybuffer.TestGetSharedArrayBufferInfo(sab); + assert.strictEqual(byteLength, 32); +} + +// Test data access +{ + const sab = new SharedArrayBuffer(8); + const result = test_sharedarraybuffer.TestSharedArrayBufferData(sab); + assert.strictEqual(result, true); + + // Check if data was written correctly + const view = new Uint8Array(sab); + for (let i = 0; i < 8; i++) { + assert.strictEqual(view[i], i % 256); + } +} + +// Test data pointer from existing SharedArrayBuffer +{ + const sab = new SharedArrayBuffer(16); + const result = test_sharedarraybuffer.TestSharedArrayBufferFromExisting(sab); + assert.strictEqual(result, true); +} + +// Test zero-length SharedArrayBuffer +{ + const sab = test_sharedarraybuffer.TestCreateSharedArrayBuffer(0); + assert(sab instanceof SharedArrayBuffer); + assert.strictEqual(sab.byteLength, 0); +} + +// Test invalid arguments +{ + assert.throws(() => { + test_sharedarraybuffer.TestGetSharedArrayBufferInfo(new ArrayBuffer(16)); + }, Error); + + assert.throws(() => { + test_sharedarraybuffer.TestGetSharedArrayBufferInfo({}); + }, Error); +} diff --git a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c new file mode 100644 index 00000000000000..c698946c01cb70 --- /dev/null +++ b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c @@ -0,0 +1,168 @@ +#include +#include +#include "../common.h" +#include "../entry_point.h" + +static napi_value TestIsSharedArrayBuffer(napi_env env, + napi_callback_info info) { + size_t argc = 1; + napi_value args[1]; + NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); + + NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); + + bool is_sharedarraybuffer; + NODE_API_CALL(env, + napi_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + + napi_value ret; + NODE_API_CALL(env, napi_get_boolean(env, is_sharedarraybuffer, &ret)); + + return ret; +} + +static napi_value TestCreateSharedArrayBuffer(napi_env env, + napi_callback_info info) { + size_t argc = 1; + napi_value args[1]; + NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); + + NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); + + napi_valuetype valuetype0; + NODE_API_CALL(env, napi_typeof(env, args[0], &valuetype0)); + + NODE_API_ASSERT( + env, + valuetype0 == napi_number, + "Wrong type of arguments. Expects a number as first argument."); + + int32_t byte_length; + NODE_API_CALL(env, napi_get_value_int32(env, args[0], &byte_length)); + + NODE_API_ASSERT(env, + byte_length >= 0, + "Invalid byte length. Expects a non-negative integer."); + + napi_value ret; + void* data; + NODE_API_CALL(env, + napi_create_sharedarraybuffer(env, byte_length, &data, &ret)); + + return ret; +} + +static napi_value TestGetSharedArrayBufferInfo(napi_env env, + napi_callback_info info) { + size_t argc = 1; + napi_value args[1]; + NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); + + NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); + + bool is_sharedarraybuffer; + NODE_API_CALL(env, + napi_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + + NODE_API_ASSERT( + env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); + + void* data; + size_t byte_length; + NODE_API_CALL( + env, napi_get_sharedarraybuffer_info(env, args[0], &data, &byte_length)); + + napi_value ret; + NODE_API_CALL(env, napi_create_uint32(env, byte_length, &ret)); + + return ret; +} + +static napi_value TestSharedArrayBufferData(napi_env env, + napi_callback_info info) { + size_t argc = 1; + napi_value args[1]; + NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); + + NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); + + bool is_sharedarraybuffer; + NODE_API_CALL(env, + napi_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + + NODE_API_ASSERT( + env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); + + void* data; + size_t byte_length; + NODE_API_CALL( + env, napi_get_sharedarraybuffer_info(env, args[0], &data, &byte_length)); + + // Write some test data + if (byte_length > 0) { + uint8_t* bytes = (uint8_t*)data; + for (size_t i = 0; i < byte_length; i++) { + bytes[i] = i % 256; + } + } + + napi_value ret; + NODE_API_CALL(env, napi_get_boolean(env, true, &ret)); + + return ret; +} + +static napi_value TestSharedArrayBufferFromExisting(napi_env env, + napi_callback_info info) { + size_t argc = 1; + napi_value args[1]; + NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); + + NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); + + bool is_sharedarraybuffer; + NODE_API_CALL(env, + napi_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + + NODE_API_ASSERT( + env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); + + void* data; + size_t byte_length; + NODE_API_CALL( + env, napi_get_sharedarraybuffer_info(env, args[0], &data, &byte_length)); + + // Return the same data pointer validity + bool data_valid = (data != NULL) && (byte_length > 0); + + napi_value ret; + NODE_API_CALL(env, napi_get_boolean(env, data_valid, &ret)); + + return ret; +} + +EXTERN_C_START +napi_value Init(napi_env env, napi_value exports) { + napi_property_descriptor descriptors[] = { + DECLARE_NODE_API_PROPERTY("TestIsSharedArrayBuffer", + TestIsSharedArrayBuffer), + DECLARE_NODE_API_PROPERTY("TestCreateSharedArrayBuffer", + TestCreateSharedArrayBuffer), + DECLARE_NODE_API_PROPERTY("TestGetSharedArrayBufferInfo", + TestGetSharedArrayBufferInfo), + DECLARE_NODE_API_PROPERTY("TestSharedArrayBufferData", + TestSharedArrayBufferData), + DECLARE_NODE_API_PROPERTY("TestSharedArrayBufferFromExisting", + TestSharedArrayBufferFromExisting), + }; + + NODE_API_CALL( + env, + napi_define_properties(env, + exports, + sizeof(descriptors) / sizeof(*descriptors), + descriptors)); + + return exports; +} +EXTERN_C_END \ No newline at end of file From d8eca2ad012e9490c0169ccfa866f16dff8ed891 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Wed, 16 Jul 2025 20:20:12 +0300 Subject: [PATCH 02/17] unify ArrayBuffer and SharedArrayBuffer info API --- doc/api/n-api.md | 69 ++----------------- src/js_native_api.h | 5 -- src/js_native_api_v8.cc | 52 ++++++-------- .../test_sharedarraybuffer.c | 12 ++-- 4 files changed, 31 insertions(+), 107 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index fdf03c7efba045..7381d2739ce242 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -3277,21 +3277,20 @@ napi_status napi_get_arraybuffer_info(napi_env env, ``` * `[in] env`: The environment that the API is invoked under. -* `[in] arraybuffer`: `napi_value` representing the `ArrayBuffer` being queried. +* `[in] arraybuffer`: `napi_value` representing the `ArrayBuffer` or `SharedArrayBuffer` being queried. * `[out] data`: The underlying data buffer of the `ArrayBuffer`. If byte\_length is `0`, this may be `NULL` or any other pointer value. * `[out] byte_length`: Length in bytes of the underlying data buffer. Returns `napi_ok` if the API succeeded. -This API is used to retrieve the underlying data buffer of an `ArrayBuffer` and -its length. +This API is used to retrieve the underlying data buffer of an `ArrayBuffer` or `SharedArrayBuffer` and its length. _WARNING_: Use caution while using this API. The lifetime of the underlying data -buffer is managed by the `ArrayBuffer` even after it's returned. A +buffer is managed by the `ArrayBuffer` or `SharedArrayBuffer` even after it's returned. A possible safe way to use this API is in conjunction with [`napi_create_reference`][], which can be used to guarantee control over the -lifetime of the `ArrayBuffer`. It's also safe to use the returned data buffer +lifetime of the `ArrayBuffer` or `SharedArrayBuffer`. It's also safe to use the returned data buffer within the same callback as long as there are no calls to other APIs that might trigger a GC. @@ -4246,7 +4245,7 @@ This API represents the invocation of the `ArrayBuffer` `IsDetachedBuffer` operation as defined in [Section isDetachedBuffer][] of the ECMAScript Language Specification. -## Working with JavaScript SharedArrayBuffers +### Working with JavaScript SharedArrayBuffers SharedArrayBuffers are used to represent fixed-length binary data buffers that can be shared across multiple workers. They are similar to ArrayBuffers @@ -4307,64 +4306,6 @@ a typed array or `DataView` object would need to be created. JavaScript `SharedArrayBuffer` objects are described in [Section 24.2][] of the ECMAScript Language Specification. -### `napi_get_sharedarraybuffer_info` - - - -```c -napi_status napi_get_sharedarraybuffer_info(napi_env env, - napi_value sharedarraybuffer, - void** data, - size_t* byte_length) -``` - -* `[in] env`: The environment that the API is invoked under. -* `[in] sharedarraybuffer`: `napi_value` representing the `SharedArrayBuffer` being queried. -* `[out] data`: The underlying data buffer of the `SharedArrayBuffer`. If byte\_length - is `0`, this may be `NULL` or any other pointer value. -* `[out] byte_length`: The length in bytes of the underlying data buffer. - -Returns `napi_ok` if the API succeeded. - -This API is used to retrieve the underlying data buffer of a `SharedArrayBuffer` and -its length. - -_Warning_: Use caution while using this API. The lifetime of the underlying data -buffer is managed by the `SharedArrayBuffer` even after it's returned. A -possible safe way to use this API is in conjunction with -[`napi_create_reference`][], which can be used to guarantee control over the -lifetime of the `SharedArrayBuffer`. It's also safe to use the returned data buffer -within the same callback as long as there are no calls to other APIs that might -trigger a GC. - -#### Example - -```c -napi_value shared_array_buffer; -void* shared_data; -size_t shared_byte_length; - -// Create a SharedArrayBuffer -napi_status status = napi_create_sharedarraybuffer(env, 1024, &shared_data, &shared_array_buffer); -if (status != napi_ok) { - // Handle error -} - -// Check if a value is a SharedArrayBuffer -bool is_shared_array_buffer; -status = napi_is_sharedarraybuffer(env, shared_array_buffer, &is_shared_array_buffer); -if (status == napi_ok && is_shared_array_buffer) { - // Get SharedArrayBuffer info - status = napi_get_sharedarraybuffer_info(env, shared_array_buffer, &shared_data, &shared_byte_length); - if (status == napi_ok) { - // Use shared_data and shared_byte_length - } -} -``` - ## Working with JavaScript properties Node-API exposes a set of APIs to get and set properties on JavaScript diff --git a/src/js_native_api.h b/src/js_native_api.h index ee3177af985a61..61a79c850cb6d8 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -491,11 +491,6 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_is_sharedarraybuffer(napi_env env, bool* result); NAPI_EXTERN napi_status NAPI_CDECL napi_create_sharedarraybuffer( napi_env env, size_t byte_length, void** data, napi_value* result); -NAPI_EXTERN napi_status NAPI_CDECL -napi_get_sharedarraybuffer_info(napi_env env, - napi_value sharedarraybuffer, - void** data, - size_t* byte_length); // version management NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(node_api_basic_env env, diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index eb289295196328..d8e4f5aba3fabb 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -3076,16 +3076,29 @@ napi_status NAPI_CDECL napi_get_arraybuffer_info(napi_env env, CHECK_ARG(env, arraybuffer); v8::Local value = v8impl::V8LocalValueFromJsValue(arraybuffer); - RETURN_STATUS_IF_FALSE(env, value->IsArrayBuffer(), napi_invalid_arg); - v8::Local ab = value.As(); + if (value->IsArrayBuffer()) { + v8::Local ab = value.As(); - if (data != nullptr) { - *data = ab->Data(); - } + if (data != nullptr) { + *data = ab->Data(); + } - if (byte_length != nullptr) { - *byte_length = ab->ByteLength(); + if (byte_length != nullptr) { + *byte_length = ab->ByteLength(); + } + } else if (value->IsSharedArrayBuffer()) { + v8::Local sab = value.As(); + + if (data != nullptr) { + *data = sab->Data(); + } + + if (byte_length != nullptr) { + *byte_length = sab->ByteLength(); + } + } else { + return napi_set_last_error(env, napi_invalid_arg); } return napi_clear_last_error(env); @@ -3125,31 +3138,6 @@ napi_status NAPI_CDECL napi_create_sharedarraybuffer(napi_env env, return GET_RETURN_STATUS(env); } -napi_status NAPI_CDECL -napi_get_sharedarraybuffer_info(napi_env env, - napi_value sharedarraybuffer, - void** data, - size_t* byte_length) { - CHECK_ENV_NOT_IN_GC(env); - CHECK_ARG(env, sharedarraybuffer); - - v8::Local value = - v8impl::V8LocalValueFromJsValue(sharedarraybuffer); - RETURN_STATUS_IF_FALSE(env, value->IsSharedArrayBuffer(), napi_invalid_arg); - - v8::Local sab = value.As(); - - if (data != nullptr) { - *data = sab->Data(); - } - - if (byte_length != nullptr) { - *byte_length = sab->ByteLength(); - } - - return napi_clear_last_error(env); -} - napi_status NAPI_CDECL napi_is_typedarray(napi_env env, napi_value value, bool* result) { diff --git a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c index c698946c01cb70..892227d529e70b 100644 --- a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c +++ b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c @@ -69,8 +69,8 @@ static napi_value TestGetSharedArrayBufferInfo(napi_env env, void* data; size_t byte_length; - NODE_API_CALL( - env, napi_get_sharedarraybuffer_info(env, args[0], &data, &byte_length)); + NODE_API_CALL(env, + napi_get_arraybuffer_info(env, args[0], &data, &byte_length)); napi_value ret; NODE_API_CALL(env, napi_create_uint32(env, byte_length, &ret)); @@ -95,8 +95,8 @@ static napi_value TestSharedArrayBufferData(napi_env env, void* data; size_t byte_length; - NODE_API_CALL( - env, napi_get_sharedarraybuffer_info(env, args[0], &data, &byte_length)); + NODE_API_CALL(env, + napi_get_arraybuffer_info(env, args[0], &data, &byte_length)); // Write some test data if (byte_length > 0) { @@ -129,8 +129,8 @@ static napi_value TestSharedArrayBufferFromExisting(napi_env env, void* data; size_t byte_length; - NODE_API_CALL( - env, napi_get_sharedarraybuffer_info(env, args[0], &data, &byte_length)); + NODE_API_CALL(env, + napi_get_arraybuffer_info(env, args[0], &data, &byte_length)); // Return the same data pointer validity bool data_valid = (data != NULL) && (byte_length > 0); From 49c383613220c7d2a271666901e38672ba89ebe6 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Fri, 18 Jul 2025 19:04:28 +0300 Subject: [PATCH 03/17] naming fixed --- doc/api/n-api.md | 18 +++++++++++------- src/js_native_api.h | 11 +++++++---- src/js_native_api_v8.cc | 14 +++++++------- .../test_sharedarraybuffer.c | 10 +++++----- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 7381d2739ce242..77c10009f9a132 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -4251,15 +4251,17 @@ SharedArrayBuffers are used to represent fixed-length binary data buffers that can be shared across multiple workers. They are similar to ArrayBuffers but allow for concurrent access from multiple threads. -### `napi_is_sharedarraybuffer` +### `node_api_is_sharedarraybuffer` +> Stability: 1 - Experimental + ```c -napi_status napi_is_sharedarraybuffer(napi_env env, napi_value value, bool* result) +napi_status node_api_is_sharedarraybuffer(napi_env env, napi_value value, bool* result) ``` * `[in] env`: The environment that the API is invoked under. @@ -4270,18 +4272,20 @@ Returns `napi_ok` if the API succeeded. This API checks if the Object passed in is a `SharedArrayBuffer`. -### `napi_create_sharedarraybuffer` +### `node_api_create_sharedarraybuffer` +> Stability: 1 - Experimental + ```c -napi_status napi_create_sharedarraybuffer(napi_env env, - size_t byte_length, - void** data, - napi_value* result) +napi_status node_api_create_sharedarraybuffer(napi_env env, + size_t byte_length, + void** data, + napi_value* result) ``` * `[in] env`: The environment that the API is invoked under. diff --git a/src/js_native_api.h b/src/js_native_api.h index 61a79c850cb6d8..728006cc109fcf 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -486,11 +486,13 @@ napi_get_dataview_info(napi_env env, napi_value* arraybuffer, size_t* byte_offset); -NAPI_EXTERN napi_status NAPI_CDECL napi_is_sharedarraybuffer(napi_env env, - napi_value value, - bool* result); -NAPI_EXTERN napi_status NAPI_CDECL napi_create_sharedarraybuffer( +#if NAPI_VERSION >= 10 +NAPI_EXTERN napi_status NAPI_CDECL node_api_is_sharedarraybuffer(napi_env env, + napi_value value, + bool* result); +NAPI_EXTERN napi_status NAPI_CDECL node_api_create_sharedarraybuffer( napi_env env, size_t byte_length, void** data, napi_value* result); +#endif // NAPI_VERSION >= 10 // version management NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(node_api_basic_env env, @@ -547,6 +549,7 @@ napi_add_finalizer(napi_env env, #ifdef NAPI_EXPERIMENTAL #define NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER +#define NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER NAPI_EXTERN napi_status NAPI_CDECL node_api_post_finalizer(node_api_basic_env env, diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index d8e4f5aba3fabb..1278a0920c4262 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -3104,9 +3104,9 @@ napi_status NAPI_CDECL napi_get_arraybuffer_info(napi_env env, return napi_clear_last_error(env); } -napi_status NAPI_CDECL napi_is_sharedarraybuffer(napi_env env, - napi_value value, - bool* result) { +napi_status NAPI_CDECL node_api_is_sharedarraybuffer(napi_env env, + napi_value value, + bool* result) { CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -3117,10 +3117,10 @@ napi_status NAPI_CDECL napi_is_sharedarraybuffer(napi_env env, return napi_clear_last_error(env); } -napi_status NAPI_CDECL napi_create_sharedarraybuffer(napi_env env, - size_t byte_length, - void** data, - napi_value* result) { +napi_status NAPI_CDECL node_api_create_sharedarraybuffer(napi_env env, + size_t byte_length, + void** data, + napi_value* result) { NAPI_PREAMBLE(env); CHECK_ARG(env, result); diff --git a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c index 892227d529e70b..6fdd8d27ff65dd 100644 --- a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c +++ b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c @@ -13,7 +13,7 @@ static napi_value TestIsSharedArrayBuffer(napi_env env, bool is_sharedarraybuffer; NODE_API_CALL(env, - napi_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); napi_value ret; NODE_API_CALL(env, napi_get_boolean(env, is_sharedarraybuffer, &ret)); @@ -47,7 +47,7 @@ static napi_value TestCreateSharedArrayBuffer(napi_env env, napi_value ret; void* data; NODE_API_CALL(env, - napi_create_sharedarraybuffer(env, byte_length, &data, &ret)); + node_api_create_sharedarraybuffer(env, byte_length, &data, &ret)); return ret; } @@ -62,7 +62,7 @@ static napi_value TestGetSharedArrayBufferInfo(napi_env env, bool is_sharedarraybuffer; NODE_API_CALL(env, - napi_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); NODE_API_ASSERT( env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); @@ -88,7 +88,7 @@ static napi_value TestSharedArrayBufferData(napi_env env, bool is_sharedarraybuffer; NODE_API_CALL(env, - napi_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); NODE_API_ASSERT( env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); @@ -122,7 +122,7 @@ static napi_value TestSharedArrayBufferFromExisting(napi_env env, bool is_sharedarraybuffer; NODE_API_CALL(env, - napi_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); NODE_API_ASSERT( env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); From 1b36a6495c1dd1d1619ed8a608c91323e9b3453c Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Fri, 18 Jul 2025 19:05:43 +0300 Subject: [PATCH 04/17] naming fixed --- test/js-native-api/test_sharedarraybuffer/test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/js-native-api/test_sharedarraybuffer/test.js b/test/js-native-api/test_sharedarraybuffer/test.js index 9f117e7689dcb0..9fc035ade7d722 100644 --- a/test/js-native-api/test_sharedarraybuffer/test.js +++ b/test/js-native-api/test_sharedarraybuffer/test.js @@ -18,14 +18,14 @@ const test_sharedarraybuffer = require(`./build/${common.buildType}/test_shareda assert.strictEqual(test_sharedarraybuffer.TestIsSharedArrayBuffer(undefined), false); } -// Test napi_create_sharedarraybuffer +// Test node_api_create_sharedarraybuffer { const sab = test_sharedarraybuffer.TestCreateSharedArrayBuffer(16); assert(sab instanceof SharedArrayBuffer); assert.strictEqual(sab.byteLength, 16); } -// Test napi_get_sharedarraybuffer_info +// Test node_api_create_get_sharedarraybuffer_info { const sab = new SharedArrayBuffer(32); const byteLength = test_sharedarraybuffer.TestGetSharedArrayBufferInfo(sab); From 81173e53d43e5ed063bb5d3ef66172ffaf5a75c6 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Fri, 18 Jul 2025 19:12:56 +0300 Subject: [PATCH 05/17] revert condition --- src/js_native_api.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/js_native_api.h b/src/js_native_api.h index 728006cc109fcf..0c23f1d23b6739 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -486,13 +486,11 @@ napi_get_dataview_info(napi_env env, napi_value* arraybuffer, size_t* byte_offset); -#if NAPI_VERSION >= 10 NAPI_EXTERN napi_status NAPI_CDECL node_api_is_sharedarraybuffer(napi_env env, napi_value value, bool* result); NAPI_EXTERN napi_status NAPI_CDECL node_api_create_sharedarraybuffer( napi_env env, size_t byte_length, void** data, napi_value* result); -#endif // NAPI_VERSION >= 10 // version management NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(node_api_basic_env env, From 259727bfd6a45b4254d1f131664f869c3cc772b6 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Fri, 18 Jul 2025 19:13:34 +0300 Subject: [PATCH 06/17] Update test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c Co-authored-by: James M Snell --- .../test_sharedarraybuffer/test_sharedarraybuffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c index 6fdd8d27ff65dd..105d632668dd6a 100644 --- a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c +++ b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c @@ -165,4 +165,4 @@ napi_value Init(napi_env env, napi_value exports) { return exports; } -EXTERN_C_END \ No newline at end of file +EXTERN_C_END From 75c5de2119b18ef679c3ee70ecb1bc7ea6915f58 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Fri, 18 Jul 2025 19:16:27 +0300 Subject: [PATCH 07/17] lint --- src/js_native_api.h | 5 ++--- .../test_sharedarraybuffer.c | 20 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/js_native_api.h b/src/js_native_api.h index 0c23f1d23b6739..cfb16fb72f02b1 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -486,9 +486,8 @@ napi_get_dataview_info(napi_env env, napi_value* arraybuffer, size_t* byte_offset); -NAPI_EXTERN napi_status NAPI_CDECL node_api_is_sharedarraybuffer(napi_env env, - napi_value value, - bool* result); +NAPI_EXTERN napi_status NAPI_CDECL +node_api_is_sharedarraybuffer(napi_env env, napi_value value, bool* result); NAPI_EXTERN napi_status NAPI_CDECL node_api_create_sharedarraybuffer( napi_env env, size_t byte_length, void** data, napi_value* result); diff --git a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c index 105d632668dd6a..36076557cbf812 100644 --- a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c +++ b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c @@ -12,8 +12,8 @@ static napi_value TestIsSharedArrayBuffer(napi_env env, NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); bool is_sharedarraybuffer; - NODE_API_CALL(env, - node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + NODE_API_CALL( + env, node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); napi_value ret; NODE_API_CALL(env, napi_get_boolean(env, is_sharedarraybuffer, &ret)); @@ -46,8 +46,8 @@ static napi_value TestCreateSharedArrayBuffer(napi_env env, napi_value ret; void* data; - NODE_API_CALL(env, - node_api_create_sharedarraybuffer(env, byte_length, &data, &ret)); + NODE_API_CALL( + env, node_api_create_sharedarraybuffer(env, byte_length, &data, &ret)); return ret; } @@ -61,8 +61,8 @@ static napi_value TestGetSharedArrayBufferInfo(napi_env env, NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); bool is_sharedarraybuffer; - NODE_API_CALL(env, - node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + NODE_API_CALL( + env, node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); NODE_API_ASSERT( env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); @@ -87,8 +87,8 @@ static napi_value TestSharedArrayBufferData(napi_env env, NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); bool is_sharedarraybuffer; - NODE_API_CALL(env, - node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + NODE_API_CALL( + env, node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); NODE_API_ASSERT( env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); @@ -121,8 +121,8 @@ static napi_value TestSharedArrayBufferFromExisting(napi_env env, NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); bool is_sharedarraybuffer; - NODE_API_CALL(env, - node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); + NODE_API_CALL( + env, node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); NODE_API_ASSERT( env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); From 9ac8e9b029042bf6e87cc4dc06f5b31ee6bf2902 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Fri, 18 Jul 2025 19:23:04 +0300 Subject: [PATCH 08/17] lint md --- doc/api/n-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 77c10009f9a132..b8af5645a2c4b1 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -4308,7 +4308,7 @@ written to directly from native code. To write to this buffer from JavaScript, a typed array or `DataView` object would need to be created. JavaScript `SharedArrayBuffer` objects are described in -[Section 24.2][] of the ECMAScript Language Specification. +\[Section 24.2]\[] of the ECMAScript Language Specification. ## Working with JavaScript properties From d4e0b8152223d3eaa708b0cefe82d73512d65aaf Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Sat, 19 Jul 2025 13:37:42 +0300 Subject: [PATCH 09/17] api definition moved to new domain and version removed --- doc/api/n-api.md | 1 - src/js_native_api.h | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index b8af5645a2c4b1..7dc964fbcdfe5e 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -4255,7 +4255,6 @@ but allow for concurrent access from multiple threads. > Stability: 1 - Experimental diff --git a/src/js_native_api.h b/src/js_native_api.h index cfb16fb72f02b1..7a35000449e5e9 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -486,6 +486,10 @@ napi_get_dataview_info(napi_env env, napi_value* arraybuffer, size_t* byte_offset); +#ifdef NAPI_EXPERIMENTAL +#define NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER +#endif // NAPI_EXPERIMENTAL + NAPI_EXTERN napi_status NAPI_CDECL node_api_is_sharedarraybuffer(napi_env env, napi_value value, bool* result); NAPI_EXTERN napi_status NAPI_CDECL node_api_create_sharedarraybuffer( @@ -546,7 +550,6 @@ napi_add_finalizer(napi_env env, #ifdef NAPI_EXPERIMENTAL #define NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER -#define NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER NAPI_EXTERN napi_status NAPI_CDECL node_api_post_finalizer(node_api_basic_env env, From 6a1723d4bb69557a9f3d28b3f1818f2c234018f1 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Sat, 19 Jul 2025 14:57:17 +0300 Subject: [PATCH 10/17] fix : repair markdown texts --- doc/api/n-api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 7dc964fbcdfe5e..0116fdf7d66cfb 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -3278,7 +3278,7 @@ napi_status napi_get_arraybuffer_info(napi_env env, * `[in] env`: The environment that the API is invoked under. * `[in] arraybuffer`: `napi_value` representing the `ArrayBuffer` or `SharedArrayBuffer` being queried. -* `[out] data`: The underlying data buffer of the `ArrayBuffer`. If byte\_length +* `[out] data`: The underlying data buffer of the `ArrayBuffer` or `SharedArrayBuffer` is `0`, this may be `NULL` or any other pointer value. * `[out] byte_length`: Length in bytes of the underlying data buffer. @@ -4307,7 +4307,7 @@ written to directly from native code. To write to this buffer from JavaScript, a typed array or `DataView` object would need to be created. JavaScript `SharedArrayBuffer` objects are described in -\[Section 24.2]\[] of the ECMAScript Language Specification. +[Section SharedArrayBuffer objects][] of the ECMAScript Language Specification. ## Working with JavaScript properties From ae0a28a11f7a811977dcdd4d19a9a4cab34cd5ab Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Fri, 25 Jul 2025 06:04:20 +0300 Subject: [PATCH 11/17] address review feedback for SharedArrayBuffer API --- doc/api/n-api.md | 5 +- src/js_native_api.h | 2 + .../test_sharedarraybuffer/test.js | 4 -- .../test_sharedarraybuffer.c | 51 +++---------------- 4 files changed, 12 insertions(+), 50 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 0116fdf7d66cfb..9dce187224904c 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -3267,6 +3267,10 @@ Specification. ```c @@ -4275,7 +4279,6 @@ This API checks if the Object passed in is a `SharedArrayBuffer`. > Stability: 1 - Experimental diff --git a/src/js_native_api.h b/src/js_native_api.h index 7a35000449e5e9..1d249c9d9cf547 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -490,10 +490,12 @@ napi_get_dataview_info(napi_env env, #define NODE_API_EXPERIMENTAL_HAS_SHAREDARRAYBUFFER #endif // NAPI_EXPERIMENTAL +#ifdef NAPI_EXPERIMENTAL NAPI_EXTERN napi_status NAPI_CDECL node_api_is_sharedarraybuffer(napi_env env, napi_value value, bool* result); NAPI_EXTERN napi_status NAPI_CDECL node_api_create_sharedarraybuffer( napi_env env, size_t byte_length, void** data, napi_value* result); +#endif // NAPI_EXPERIMENTAL // version management NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(node_api_basic_env env, diff --git a/test/js-native-api/test_sharedarraybuffer/test.js b/test/js-native-api/test_sharedarraybuffer/test.js index 9fc035ade7d722..64d228dba71554 100644 --- a/test/js-native-api/test_sharedarraybuffer/test.js +++ b/test/js-native-api/test_sharedarraybuffer/test.js @@ -61,10 +61,6 @@ const test_sharedarraybuffer = require(`./build/${common.buildType}/test_shareda // Test invalid arguments { - assert.throws(() => { - test_sharedarraybuffer.TestGetSharedArrayBufferInfo(new ArrayBuffer(16)); - }, Error); - assert.throws(() => { test_sharedarraybuffer.TestGetSharedArrayBufferInfo({}); }, Error); diff --git a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c index 36076557cbf812..57d6815a12ffde 100644 --- a/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c +++ b/test/js-native-api/test_sharedarraybuffer/test_sharedarraybuffer.c @@ -60,13 +60,6 @@ static napi_value TestGetSharedArrayBufferInfo(napi_env env, NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); - bool is_sharedarraybuffer; - NODE_API_CALL( - env, node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); - - NODE_API_ASSERT( - env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); - void* data; size_t byte_length; NODE_API_CALL(env, @@ -78,60 +71,30 @@ static napi_value TestGetSharedArrayBufferInfo(napi_env env, return ret; } -static napi_value TestSharedArrayBufferData(napi_env env, - napi_callback_info info) { - size_t argc = 1; - napi_value args[1]; - NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); - - NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); - - bool is_sharedarraybuffer; - NODE_API_CALL( - env, node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); - - NODE_API_ASSERT( - env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); - - void* data; - size_t byte_length; - NODE_API_CALL(env, - napi_get_arraybuffer_info(env, args[0], &data, &byte_length)); - - // Write some test data - if (byte_length > 0) { +static void WriteTestDataToBuffer(void* data, size_t byte_length) { + if (byte_length > 0 && data != NULL) { uint8_t* bytes = (uint8_t*)data; for (size_t i = 0; i < byte_length; i++) { bytes[i] = i % 256; } } - - napi_value ret; - NODE_API_CALL(env, napi_get_boolean(env, true, &ret)); - - return ret; } -static napi_value TestSharedArrayBufferFromExisting(napi_env env, - napi_callback_info info) { +static napi_value TestSharedArrayBufferData(napi_env env, + napi_callback_info info) { size_t argc = 1; napi_value args[1]; NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); NODE_API_ASSERT(env, argc >= 1, "Wrong number of arguments"); - bool is_sharedarraybuffer; - NODE_API_CALL( - env, node_api_is_sharedarraybuffer(env, args[0], &is_sharedarraybuffer)); - - NODE_API_ASSERT( - env, is_sharedarraybuffer, "Argument should be a SharedArrayBuffer"); - void* data; size_t byte_length; NODE_API_CALL(env, napi_get_arraybuffer_info(env, args[0], &data, &byte_length)); + WriteTestDataToBuffer(data, byte_length); + // Return the same data pointer validity bool data_valid = (data != NULL) && (byte_length > 0); @@ -152,8 +115,6 @@ napi_value Init(napi_env env, napi_value exports) { TestGetSharedArrayBufferInfo), DECLARE_NODE_API_PROPERTY("TestSharedArrayBufferData", TestSharedArrayBufferData), - DECLARE_NODE_API_PROPERTY("TestSharedArrayBufferFromExisting", - TestSharedArrayBufferFromExisting), }; NODE_API_CALL( From 3bd03d804ef08559df737787622f300f502e2d44 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Fri, 25 Jul 2025 06:07:05 +0300 Subject: [PATCH 12/17] remove Working with JavaScript SharedArrayBuffers section --- doc/api/n-api.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 9dce187224904c..e8db0d307cace4 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -4249,12 +4249,6 @@ This API represents the invocation of the `ArrayBuffer` `IsDetachedBuffer` operation as defined in [Section isDetachedBuffer][] of the ECMAScript Language Specification. -### Working with JavaScript SharedArrayBuffers - -SharedArrayBuffers are used to represent fixed-length binary data buffers -that can be shared across multiple workers. They are similar to ArrayBuffers -but allow for concurrent access from multiple threads. - ### `node_api_is_sharedarraybuffer`