@@ -18,7 +18,7 @@ Napi::Object RtcWrapper::Init(Napi::Env env, Napi::Object exports)
18
18
exports.Set (" cleanup" , Napi::Function::New (env, &RtcWrapper::cleanup));
19
19
exports.Set (" preload" , Napi::Function::New (env, &RtcWrapper::preload));
20
20
exports.Set (" setSctpSettings" , Napi::Function::New (env, &RtcWrapper::setSctpSettings));
21
- exports.Set (" onUnhandledStunRequest " , Napi::Function::New (env, &RtcWrapper::onUnhandledStunRequest ));
21
+ exports.Set (" listenIceUdpMux " , Napi::Function::New (env, &RtcWrapper::listenIceUdpMux ));
22
22
23
23
return exports;
24
24
}
@@ -174,48 +174,46 @@ void RtcWrapper::setSctpSettings(const Napi::CallbackInfo &info)
174
174
rtc::SetSctpSettings (settings);
175
175
}
176
176
177
- void RtcWrapper::onUnhandledStunRequest (const Napi::CallbackInfo &info)
177
+ void RtcWrapper::listenIceUdpMux (const Napi::CallbackInfo &info)
178
178
{
179
- PLOG_DEBUG << " onUnhandledStunRequest () called" ;
179
+ PLOG_DEBUG << " listenIceUdpMux () called" ;
180
180
Napi::Env env = info.Env ();
181
181
int length = info.Length ();
182
182
183
- if (length < 1 || !info[0 ].IsString ())
183
+ if (length < 1 || !info[0 ].IsNumber ())
184
184
{
185
- Napi::TypeError::New (env, " host (String ) expected" ).ThrowAsJavaScriptException ();
185
+ Napi::TypeError::New (env, " port (Number ) expected" ).ThrowAsJavaScriptException ();
186
186
return ;
187
187
}
188
- Napi::String host = info[0 ].As <Napi::String> ();
188
+ int port = info[0 ].As <Napi::Number>(). ToNumber ();
189
189
190
- if (length < 2 || !info[1 ].IsNumber ())
190
+ Napi::Function listener;
191
+ if (length > 1 && info[1 ].IsFunction ())
191
192
{
192
- Napi::TypeError::New (env, " port (Number) expected" ).ThrowAsJavaScriptException ();
193
- return ;
193
+ listener = info[1 ].As <Napi::Function>();
194
194
}
195
- Napi::Number port = info[1 ].As <Napi::Number>();
196
195
197
- // unbind listener if cb is null, undefined, or was omitted
198
- if (length == 2 || (info[2 ].IsNull () || info[2 ].IsUndefined ())) {
199
- unboundStunCallbacks.erase (port.ToNumber ().Uint32Value ());
200
- rtc::OnUnhandledStunRequest (host.ToString (), port.ToNumber ());
201
- return ;
196
+ std::string host;
197
+ if (length > 2 && info[2 ].IsString ())
198
+ {
199
+ host = info[2 ].As <Napi::String>().ToString ();
202
200
}
203
201
204
- if (length < 3 || !info[2 ].IsFunction ())
202
+ // unbind listener if cb is null, undefined, or was omitted
203
+ if (!listener)
205
204
{
206
- Napi::TypeError::New (env, " cb (Function) expected" ).ThrowAsJavaScriptException ();
205
+ std::lock_guard<std::mutex> guard (iceUdpMuxListenersMutex);
206
+ iceUdpMuxListeners.erase (port);
207
+ rtc::ListenIceUdpMux (port, nullptr , host);
207
208
return ;
208
209
}
209
- Napi::Function cb = info[2 ].As <Napi::Function>();
210
-
211
- std::unique_ptr<ThreadSafeCallback> callback = std::make_unique<ThreadSafeCallback>(cb);
212
- unboundStunCallbacks[port.ToNumber ().Uint32Value ()] = std::move (callback);
213
- void * ptr = &unboundStunCallbacks[port.ToNumber ().Uint32Value ()];
214
210
215
- rtc::OnUnhandledStunRequest (host. ToString (), port. ToNumber (), [&](rtc::UnhandledStunRequest request, void *userPtr) {
216
- PLOG_DEBUG << " mOnUnhandledStunRequestCallback call(1) " ;
211
+ auto uniqueCallback = std::make_unique<ThreadSafeCallback>(listener);
212
+ auto callback = std::shared_ptr<ThreadSafeCallback>( std::move (uniqueCallback)) ;
217
213
218
- std::unique_ptr<ThreadSafeCallback> &callback = *(std::unique_ptr<ThreadSafeCallback> *)userPtr;
214
+ rtc::IceUdpMuxCallback iceUdpMuxCallback = [callback](rtc::IceUdpMuxRequest request)
215
+ {
216
+ PLOG_DEBUG << " listenIceUdpMux IceUdpMuxCallback call(1)" ;
219
217
220
218
if (callback) {
221
219
callback->call ([request = std::move (request)](Napi::Env env, std::vector<napi_value> &args) {
@@ -228,6 +226,11 @@ void RtcWrapper::onUnhandledStunRequest(const Napi::CallbackInfo &info)
228
226
});
229
227
}
230
228
231
- PLOG_DEBUG << " mOnUnhandledStunRequestCallback call(2)" ;
232
- }, ptr);
229
+ PLOG_DEBUG << " listenIceUdpMux IceUdpMuxCallback call(2)" ;
230
+ };
231
+
232
+ std::lock_guard<std::mutex> guard (iceUdpMuxListenersMutex);
233
+ iceUdpMuxListeners[port] = std::move (iceUdpMuxCallback);
234
+
235
+ rtc::ListenIceUdpMux (port, &iceUdpMuxListeners[port], host);
233
236
}
0 commit comments