@@ -3068,6 +3068,48 @@ napi_create_external_arraybuffer(napi_env env,
30683068 env, buffer, nullptr , nullptr , nullptr , result, nullptr );
30693069}
30703070
3071+ napi_status NAPI_CDECL
3072+ node_api_create_external_sharedarraybuffer (napi_env env,
3073+ void * external_data,
3074+ size_t byte_length,
3075+ node_api_noenv_finalize finalize_cb,
3076+ void * finalize_hint,
3077+ napi_value* result) {
3078+ NAPI_PREAMBLE (env);
3079+ CHECK_ARG (env, result);
3080+ #ifdef V8_ENABLE_SANDBOX
3081+ return napi_set_last_error (env, napi_no_external_buffers_allowed);
3082+ #else
3083+ struct FinalizerData {
3084+ void (*cb)(void * external_data, void * finalize_hint);
3085+ void * hint;
3086+ };
3087+ auto deleter = [](void * external_data, size_t length, void * deleter_data) {
3088+ if (auto fd = static_cast <FinalizerData*>(deleter_data)) {
3089+ fd->cb (external_data, fd->hint );
3090+ delete fd;
3091+ }
3092+ };
3093+ FinalizerData* deleter_data = nullptr ;
3094+ if (finalize_cb != nullptr ) {
3095+ deleter_data = new FinalizerData{finalize_cb, finalize_hint};
3096+ }
3097+ auto unique_backing_store = v8::SharedArrayBuffer::NewBackingStore (
3098+ external_data,
3099+ byte_length,
3100+ deleter,
3101+ reinterpret_cast <void *>(deleter_data));
3102+ CHECK (!!unique_backing_store); // Cannot fail.
3103+ auto shared_backing_store =
3104+ std::shared_ptr<v8::BackingStore>(std::move (unique_backing_store));
3105+ auto shared_array_buffer =
3106+ v8::SharedArrayBuffer::New (env->isolate , std::move (shared_backing_store));
3107+ CHECK_MAYBE_EMPTY (env, shared_array_buffer, napi_generic_failure);
3108+ *result = v8impl::JsValueFromV8LocalValue (shared_array_buffer);
3109+ return napi_clear_last_error (env);
3110+ #endif // V8_ENABLE_SANDBOX
3111+ }
3112+
30713113napi_status NAPI_CDECL napi_get_arraybuffer_info (napi_env env,
30723114 napi_value arraybuffer,
30733115 void ** data,
0 commit comments