@@ -136,6 +136,42 @@ napi_status NewExternalString(napi_env env,
136136 return status;
137137}
138138
139+ napi_status NewExternalSharedArrayBuffer (napi_env env,
140+ void * external_data,
141+ size_t byte_length,
142+ void (*finalize_cb)(
143+ void * external_data,
144+ void * finalize_hint),
145+ void* finalize_hint,
146+ napi_value* result) {
147+ struct FinalizerData {
148+ void (*cb)(void * external_data, void * finalize_hint);
149+ void * hint;
150+ };
151+ auto deleter = [](void * external_data, size_t length, void * deleter_data) {
152+ if (auto fd = static_cast <FinalizerData*>(deleter_data)) {
153+ fd->cb (external_data, fd->hint );
154+ delete fd;
155+ }
156+ };
157+ FinalizerData* deleter_data = nullptr ;
158+ if (finalize_cb != nullptr ) {
159+ deleter_data = new FinalizerData { finalize_cb, finalize_hint };
160+ }
161+ auto unique_backing_store =
162+ v8::SharedArrayBuffer::NewBackingStore (
163+ external_data, byte_length, deleter,
164+ reinterpret_cast <void *>(deleter_data));
165+ CHECK (!!unique_backing_store); // Cannot fail.
166+ auto shared_backing_store =
167+ std::shared_ptr<v8::BackingStore>(std::move (unique_backing_store));
168+ auto shared_array_buffer =
169+ v8::SharedArrayBuffer::New (env->isolate , shared_backing_store);
170+ CHECK_MAYBE_EMPTY (env, shared_array_buffer, napi_generic_failure);
171+ *result = v8impl::JsValueFromV8LocalValue (shared_array_buffer);
172+ return napi_clear_last_error (env);
173+ }
174+
139175class TrackedStringResource : private RefTracker {
140176 public:
141177 TrackedStringResource (napi_env env,
@@ -3134,6 +3170,19 @@ napi_create_external_arraybuffer(napi_env env,
31343170 env, buffer, nullptr , nullptr , nullptr , result, nullptr );
31353171}
31363172
3173+ napi_status NAPI_CDECL
3174+ napi_create_external_sharedarraybuffer (napi_env env,
3175+ void * external_data,
3176+ size_t byte_length,
3177+ void (*finalize_cb)(
3178+ void * external_data,
3179+ void * finalize_hint),
3180+ void* finalize_hint,
3181+ napi_value* result) {
3182+ return v8impl::NewExternalSharedArrayBuffer (
3183+ env, external_data, byte_length, finalize_cb, finalize_hint, result);
3184+ }
3185+
31373186napi_status NAPI_CDECL napi_get_arraybuffer_info (napi_env env,
31383187 napi_value arraybuffer,
31393188 void ** data,
0 commit comments