diff --git a/src/data-channel-wrapper.cpp b/src/data-channel-wrapper.cpp index 94695099..edb2a06f 100644 --- a/src/data-channel-wrapper.cpp +++ b/src/data-channel-wrapper.cpp @@ -58,6 +58,10 @@ DataChannelWrapper::DataChannelWrapper(const Napi::CallbackInfo &info) : Napi::O PLOG_DEBUG << "Constructor called"; mDataChannelPtr = *(info[0].As>>().Data()); PLOG_DEBUG << "Data Channel created"; + + // Closed callback must be set to trigger cleanup + mOnClosedCallback = std::make_unique(Napi::Function::New(info.Env(), [](const Napi::CallbackInfo&){})); + instances.insert(this); } diff --git a/src/media-track-wrapper.cpp b/src/media-track-wrapper.cpp index e06e3be9..d9a9afbd 100644 --- a/src/media-track-wrapper.cpp +++ b/src/media-track-wrapper.cpp @@ -56,7 +56,12 @@ Napi::Object TrackWrapper::Init(Napi::Env env, Napi::Object exports) TrackWrapper::TrackWrapper(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) { + PLOG_DEBUG << "Constructor called"; mTrackPtr = *(info[0].As>>().Data()); + PLOG_DEBUG << "Track created"; + + // Closed callback must be set to trigger cleanup + mOnClosedCallback = std::make_unique(Napi::Function::New(info.Env(), [](const Napi::CallbackInfo&){})); instances.insert(this); } diff --git a/src/peer-connection-wrapper.cpp b/src/peer-connection-wrapper.cpp index 32efcb7b..a496a38e 100644 --- a/src/peer-connection-wrapper.cpp +++ b/src/peer-connection-wrapper.cpp @@ -237,7 +237,7 @@ PeerConnectionWrapper::PeerConnectionWrapper(const Napi::CallbackInfo &info) : N // Create peer-connection try { - PLOG_DEBUG << "Creating a new peer"; + PLOG_DEBUG << "Creating a new Peer Connection"; mRtcPeerConnPtr = std::make_unique(rtcConfig); } catch (std::exception &ex) @@ -246,6 +246,11 @@ PeerConnectionWrapper::PeerConnectionWrapper(const Napi::CallbackInfo &info) : N return; } + PLOG_DEBUG << "Peer Connection created"; + + // State change callback must be set to trigger cleanup on close + mOnStateChangeCallback = std::make_unique(Napi::Function::New(info.Env(), [](const Napi::CallbackInfo&){})); + instances.insert(this); } diff --git a/src/thread-safe-callback.cpp b/src/thread-safe-callback.cpp index afabe92a..fbd15737 100644 --- a/src/thread-safe-callback.cpp +++ b/src/thread-safe-callback.cpp @@ -9,16 +9,16 @@ const char *ThreadSafeCallback::CancelException::what() const throw() ThreadSafeCallback::ThreadSafeCallback(Napi::Function callback) { - if (!callback.IsFunction()) - throw Napi::Error::New(callback.Env(), "Callback must be a function"); - Napi::Env env = callback.Env(); - receiver = Napi::Persistent(static_cast(Napi::Object::New(env))); + if (!callback.IsFunction()) + throw Napi::Error::New(env, "Callback must be a function"); + tsfn = tsfn_t::New(env, std::move(callback), "ThreadSafeCallback callback", - 0, 1, &receiver); + 0, // unlimited queue + 1); } ThreadSafeCallback::~ThreadSafeCallback() @@ -38,10 +38,10 @@ void ThreadSafeCallback::call(arg_func_t argFunc, cleanup_func_t cleanupFunc) void ThreadSafeCallback::callbackFunc(Napi::Env env, Napi::Function callback, - Napi::Reference *context, + ContextType *context, CallbackData *data) { - // if env is gone this could mean cb fn has changed. See issue#176 + // if env is gone, it could mean this cb was destroyed. See issue#176 if (!data || !env) return; @@ -59,9 +59,10 @@ void ThreadSafeCallback::callbackFunc(Napi::Env env, return; } - if (env && callback) + if (callback) { - callback.Call(context->Value(), args); - cleanup(); + callback.Call(args); } + + cleanup(); } diff --git a/src/thread-safe-callback.h b/src/thread-safe-callback.h index 0f49d12c..f21d4c43 100644 --- a/src/thread-safe-callback.h +++ b/src/thread-safe-callback.h @@ -30,6 +30,7 @@ class ThreadSafeCallback }; private: + using ContextType = std::nullptr_t; struct CallbackData { arg_func_t argFunc; @@ -38,12 +39,10 @@ class ThreadSafeCallback static void callbackFunc(Napi::Env env, Napi::Function callback, - Napi::Reference *context, + ContextType *context, CallbackData *data); - using tsfn_t = Napi::TypedThreadSafeFunction, CallbackData, callbackFunc>; - - Napi::Reference receiver; + using tsfn_t = Napi::TypedThreadSafeFunction; tsfn_t tsfn; }; diff --git a/src/web-socket-wrapper.cpp b/src/web-socket-wrapper.cpp index e30018c5..0d7ecac6 100644 --- a/src/web-socket-wrapper.cpp +++ b/src/web-socket-wrapper.cpp @@ -238,6 +238,10 @@ WebSocketWrapper::WebSocketWrapper(const Napi::CallbackInfo &info) : Napi::Objec } PLOG_DEBUG << "WebSocket created"; + + // Closed callback must set to trigger cleanup + mOnClosedCallback = std::make_unique(Napi::Function::New(info.Env(), [](const Napi::CallbackInfo&){})); + instances.insert(this); } @@ -471,7 +475,7 @@ Napi::Value WebSocketWrapper::remoteAddress(const Napi::CallbackInfo &info) if (!mWebSocketPtr) { - return env.Undefined(); + return env.Undefined(); } try @@ -500,7 +504,7 @@ Napi::Value WebSocketWrapper::path(const Napi::CallbackInfo &info) if (!mWebSocketPtr) { - return env.Undefined(); + return env.Undefined(); } try