@@ -190,6 +190,64 @@ static napi_value getMemoryDataAsArray(napi_env env, napi_callback_info info) {
190190 return ret ;
191191}
192192
193+ NAPI_EXTERN napi_status NAPI_CDECL
194+ node_api_create_buffer_from_arraybuffer (napi_env env ,
195+ napi_value arraybuffer ,
196+ size_t byte_offset ,
197+ size_t byte_length ,
198+ napi_value * result );
199+
200+ static napi_value testBufferFromArrayBuffer (napi_env env ,
201+ napi_callback_info info ) {
202+ napi_status status ;
203+ napi_value arraybuffer ;
204+ void * data ;
205+ napi_value buffer ;
206+ size_t byte_length = 1024 ;
207+ size_t byte_offset = 0 ;
208+
209+ status = napi_create_arraybuffer (env , byte_length , & data , & arraybuffer );
210+ NODE_API_ASSERT (env , status == napi_ok , "Failed to create arraybuffer" );
211+
212+ status = node_api_create_buffer_from_arraybuffer (
213+ env , arraybuffer , byte_offset , byte_length , & buffer );
214+ NODE_API_ASSERT (
215+ env , status == napi_ok , "Failed to create buffer from arraybuffer" );
216+
217+ void * buffer_data ;
218+ size_t buffer_length ;
219+ status = napi_get_buffer_info (env , buffer , & buffer_data , & buffer_length );
220+ NODE_API_ASSERT (env , status == napi_ok , "Failed to get buffer info" );
221+ NODE_API_ASSERT (env , buffer_length == byte_length , "Buffer length mismatch" );
222+
223+ bool is_buffer ;
224+ status = napi_is_buffer (env , buffer , & is_buffer );
225+ NODE_API_ASSERT (env , status == napi_ok , "Failed to check if value is buffer" );
226+ NODE_API_ASSERT (env , is_buffer , "Expected a Buffer but did not get one" );
227+
228+ status = node_api_create_buffer_from_arraybuffer (
229+ env , arraybuffer , byte_length , byte_length + 1 , & buffer );
230+ NODE_API_ASSERT (env ,
231+ status == 10 ,
232+ "Expected range error for invalid byte offset" );
233+ napi_value last_error ;
234+ status = napi_get_and_clear_last_exception (env , & last_error );
235+ NODE_API_ASSERT (env , status == napi_ok , "Failed to call napi_get_and_clear_last_exception" );
236+
237+ napi_value non_arraybuffer ;
238+ status = napi_create_uint32 (env , 123 , & non_arraybuffer );
239+ NODE_API_ASSERT (
240+ env , status == napi_ok , "Failed to create non-arraybuffer value" );
241+
242+ status = node_api_create_buffer_from_arraybuffer (
243+ env , non_arraybuffer , byte_offset , byte_length , & buffer );
244+ NODE_API_ASSERT (env ,
245+ status == napi_invalid_arg ,
246+ "Expected invalid arg error for non-arraybuffer input" );
247+
248+ return arraybuffer ;
249+ }
250+
193251static napi_value Init (napi_env env , napi_value exports ) {
194252 napi_value theValue ;
195253
@@ -208,6 +266,8 @@ static napi_value Init(napi_env env, napi_value exports) {
208266 DECLARE_NODE_API_PROPERTY ("staticBuffer" , staticBuffer ),
209267 DECLARE_NODE_API_PROPERTY ("invalidObjectAsBuffer" , invalidObjectAsBuffer ),
210268 DECLARE_NODE_API_PROPERTY ("getMemoryDataAsArray" , getMemoryDataAsArray ),
269+ DECLARE_NODE_API_PROPERTY ("testBufferFromArrayBuffer" ,
270+ testBufferFromArrayBuffer ),
211271 };
212272
213273 NODE_API_CALL (env , napi_define_properties (
0 commit comments