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