@@ -3140,6 +3140,48 @@ napi_create_external_arraybuffer(napi_env env,
31403140 env, buffer, nullptr , nullptr , nullptr , result, nullptr );
31413141}
31423142
3143+ napi_status NAPI_CDECL
3144+ node_api_create_external_sharedarraybuffer (napi_env env,
3145+ void * external_data,
3146+ size_t byte_length,
3147+ node_api_noenv_finalize finalize_cb,
3148+ void * finalize_hint,
3149+ napi_value* result) {
3150+ NAPI_PREAMBLE (env);
3151+ CHECK_ARG (env, result);
3152+ #ifdef V8_ENABLE_SANDBOX
3153+ return napi_set_last_error (env, napi_no_external_buffers_allowed);
3154+ #else
3155+ struct FinalizerData {
3156+ void (*cb)(void * external_data, void * finalize_hint);
3157+ void * hint;
3158+ };
3159+ auto deleter = [](void * external_data, size_t length, void * deleter_data) {
3160+ if (auto fd = static_cast <FinalizerData*>(deleter_data)) {
3161+ fd->cb (external_data, fd->hint );
3162+ delete fd;
3163+ }
3164+ };
3165+ FinalizerData* deleter_data = nullptr ;
3166+ if (finalize_cb != nullptr ) {
3167+ deleter_data = new FinalizerData{finalize_cb, finalize_hint};
3168+ }
3169+ auto unique_backing_store = v8::SharedArrayBuffer::NewBackingStore (
3170+ external_data,
3171+ byte_length,
3172+ deleter,
3173+ reinterpret_cast <void *>(deleter_data));
3174+ CHECK (!!unique_backing_store); // Cannot fail.
3175+ auto shared_backing_store =
3176+ std::shared_ptr<v8::BackingStore>(std::move (unique_backing_store));
3177+ auto shared_array_buffer =
3178+ v8::SharedArrayBuffer::New (env->isolate , std::move (shared_backing_store));
3179+ CHECK_MAYBE_EMPTY (env, shared_array_buffer, napi_generic_failure);
3180+ *result = v8impl::JsValueFromV8LocalValue (shared_array_buffer);
3181+ return napi_clear_last_error (env);
3182+ #endif // V8_ENABLE_SANDBOX
3183+ }
3184+
31433185napi_status NAPI_CDECL napi_get_arraybuffer_info (napi_env env,
31443186 napi_value arraybuffer,
31453187 void ** data,
0 commit comments