@@ -1125,8 +1125,8 @@ napi_value ExtendedEnv::getUserSharedBuffer(std::string key, napi_value default_
1125
1125
resolution = userSharedBuffers.emplace (key, user_shared_buffer).first ;
1126
1126
}
1127
1127
1128
+ napi_threadsafe_function callback = nullptr ;
1128
1129
if (has_callback) {
1129
- napi_threadsafe_function callback;
1130
1130
napi_value resource;
1131
1131
napi_status status;
1132
1132
status = napi_create_object (env, &resource);
@@ -1138,11 +1138,38 @@ napi_value ExtendedEnv::getUserSharedBuffer(std::string key, napi_value default_
1138
1138
resolution->second .callbacks .push_back (callback);
1139
1139
}
1140
1140
1141
+ // Create a struct to hold the callback info
1142
+ struct CallbackInfo {
1143
+ napi_threadsafe_function callback;
1144
+ std::vector<napi_threadsafe_function>* callbacks;
1145
+ };
1146
+
1147
+ auto * cb_info = new CallbackInfo{callback, &resolution->second .callbacks };
1148
+
1141
1149
napi_value buffer_value;
1142
- napi_create_external_arraybuffer (env, resolution->second .buffer .mv_data , resolution->second .buffer .mv_size , nullptr , nullptr , &buffer_value);
1150
+ napi_create_external_arraybuffer (
1151
+ env,
1152
+ resolution->second .buffer .mv_data ,
1153
+ resolution->second .buffer .mv_size ,
1154
+ // Finalizer callback
1155
+ [](napi_env env, void * data, void * hint) {
1156
+ auto * cb_info = static_cast <CallbackInfo*>(hint);
1157
+ if (cb_info->callback ) {
1158
+ // Remove this callback from the vector
1159
+ auto & callbacks = *cb_info->callbacks ;
1160
+ callbacks.erase (
1161
+ std::remove (callbacks.begin (), callbacks.end (), cb_info->callback ),
1162
+ callbacks.end ()
1163
+ );
1164
+ napi_release_threadsafe_function (cb_info->callback , napi_tsfn_release);
1165
+ }
1166
+ delete cb_info;
1167
+ },
1168
+ cb_info,
1169
+ &buffer_value
1170
+ );
1143
1171
1144
1172
pthread_mutex_unlock (&userBuffersLock);
1145
-
1146
1173
return buffer_value;
1147
1174
}
1148
1175
0 commit comments