node-api: add napi_create_buffer_from_arraybuffer method · nodejs/node@a559008 · GitHub
Skip to content

Commit a559008

Browse files
mertcanaltinruyadorno
authored andcommitted
node-api: add napi_create_buffer_from_arraybuffer method
PR-URL: #54505 Fixes: #54440 Reviewed-By: Robert Nagy <ronagy@icloud.com> Reviewed-By: Gabriel Schulhof <gabrielschulhof@gmail.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: Vladimir Morozov <vmorozov@microsoft.com>
1 parent d8c552a commit a559008

6 files changed

Lines changed: 134 additions & 12 deletions

File tree

doc/api/n-api.md

Lines changed: 31 additions & 0 deletions

src/node_api.cc

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,3 +1427,38 @@ napi_status NAPI_CDECL node_api_get_module_file_name(
14271427
*result = static_cast<node_napi_env>(env)->GetFilename();
14281428
return napi_clear_last_error(env);
14291429
}
1430+
1431+
#ifdef NAPI_EXPERIMENTAL
1432+
1433+
napi_status NAPI_CDECL
1434+
node_api_create_buffer_from_arraybuffer(napi_env env,
1435+
napi_value arraybuffer,
1436+
size_t byte_offset,
1437+
size_t byte_length,
1438+
napi_value* result) {
1439+
NAPI_PREAMBLE(env);
1440+
CHECK_ARG(env, arraybuffer);
1441+
CHECK_ARG(env, result);
1442+
1443+
v8::Local<v8::Value> arraybuffer_value =
1444+
v8impl::V8LocalValueFromJsValue(arraybuffer);
1445+
if (!arraybuffer_value->IsArrayBuffer()) {
1446+
return napi_invalid_arg;
1447+
}
1448+
1449+
v8::Local<v8::ArrayBuffer> arraybuffer_obj =
1450+
arraybuffer_value.As<v8::ArrayBuffer>();
1451+
if (byte_offset + byte_length > arraybuffer_obj->ByteLength()) {
1452+
return napi_throw_range_error(
1453+
env, "ERR_OUT_OF_RANGE", "The byte offset + length is out of range");
1454+
}
1455+
1456+
v8::Local<v8::Object> buffer =
1457+
node::Buffer::New(env->isolate, arraybuffer_obj, byte_offset, byte_length)
1458+
.ToLocalChecked();
1459+
1460+
*result = v8impl::JsValueFromV8LocalValue(buffer);
1461+
return napi_ok;
1462+
}
1463+
1464+
#endif

src/node_api.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,18 @@ napi_create_external_buffer(napi_env env,
135135
void* finalize_hint,
136136
napi_value* result);
137137
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
138+
139+
#ifdef NAPI_EXPERIMENTAL
140+
#define NODE_API_EXPERIMENTAL_HAS_CREATE_BUFFER_FROM_ARRAYBUFFER
141+
142+
NAPI_EXTERN napi_status NAPI_CDECL
143+
node_api_create_buffer_from_arraybuffer(napi_env env,
144+
napi_value arraybuffer,
145+
size_t byte_offset,
146+
size_t byte_length,
147+
napi_value* result);
148+
#endif // NAPI_EXPERIMENTAL
149+
138150
NAPI_EXTERN napi_status NAPI_CDECL napi_create_buffer_copy(napi_env env,
139151
size_t length,
140152
const void* data,

test/node-api/test_buffer/binding.gyp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
"targets": [
33
{
44
"target_name": "test_buffer",
5+
"defines": [
6+
'NAPI_EXPERIMENTAL'
7+
],
58
"sources": [ "test_buffer.c" ]
69
},
710
{

test/node-api/test_buffer/test.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,7 @@ const tick = require('util').promisify(require('../../common/tick'));
2828

2929
// To test this doesn't crash
3030
binding.invalidObjectAsBuffer({});
31+
32+
const testBuffer = binding.bufferFromArrayBuffer();
33+
assert(testBuffer instanceof Buffer, 'Expected a Buffer');
3134
})().then(common.mustCall());

test/node-api/test_buffer/test_buffer.c

Lines changed: 50 additions & 12 deletions

0 commit comments

Comments
 (0)