node-datachannel 0.2.4 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +12 -0
- package/.eslintignore +2 -0
- package/.eslintrc.js +8 -0
- package/.github/FUNDING.yml +2 -0
- package/.github/workflows/build-linux.yml +3 -3
- package/.github/workflows/build-mac.yml +1 -1
- package/.github/workflows/build-win.yml +4 -4
- package/.github/workflows/lint.yml +22 -0
- package/.prettierrc.js +7 -0
- package/CMakeLists.txt +8 -2
- package/README.md +4 -4
- package/examples/client-server/client-benchmark.js +43 -32
- package/examples/client-server/client-periodic.js +30 -14
- package/examples/client-server/client.js +6 -5
- package/examples/client-server/package-lock.json +183 -44
- package/examples/client-server/signaling-server.js +3 -5
- package/examples/media/media.js +9 -9
- package/lib/datachannel-stream.js +23 -12
- package/lib/index.d.ts +113 -116
- package/lib/index.js +3 -2
- package/node_modules/detect-libc/package.json +1 -0
- package/node_modules/lru-cache/package.json +1 -2
- package/node_modules/minimist/index.js +6 -2
- package/node_modules/minimist/package.json +10 -11
- package/node_modules/minimist/readme.markdown +4 -1
- package/node_modules/minimist/test/proto.js +16 -0
- package/node_modules/node-abi/node_modules/semver/README.md +3 -1
- package/node_modules/node-abi/node_modules/semver/bin/semver.js +19 -9
- package/node_modules/node-abi/node_modules/semver/classes/comparator.js +3 -2
- package/node_modules/node-abi/node_modules/semver/classes/index.js +1 -1
- package/node_modules/node-abi/node_modules/semver/classes/range.js +31 -22
- package/node_modules/node-abi/node_modules/semver/classes/semver.js +1 -1
- package/node_modules/node-abi/node_modules/semver/functions/cmp.js +8 -4
- package/node_modules/node-abi/node_modules/semver/functions/coerce.js +3 -2
- package/node_modules/node-abi/node_modules/semver/functions/inc.js +4 -1
- package/node_modules/node-abi/node_modules/semver/functions/parse.js +1 -1
- package/node_modules/node-abi/node_modules/semver/internal/constants.js +2 -2
- package/node_modules/node-abi/node_modules/semver/internal/identifiers.js +1 -1
- package/node_modules/node-abi/node_modules/semver/internal/parse-options.js +3 -3
- package/node_modules/node-abi/node_modules/semver/internal/re.js +3 -3
- package/node_modules/node-abi/node_modules/semver/package.json +51 -18
- package/node_modules/node-abi/node_modules/semver/ranges/min-version.js +2 -1
- package/node_modules/node-abi/node_modules/semver/ranges/outside.js +1 -1
- package/node_modules/node-abi/node_modules/semver/ranges/simplify.js +15 -12
- package/node_modules/node-abi/node_modules/semver/ranges/subset.js +53 -31
- package/node_modules/node-abi/package.json +1 -0
- package/node_modules/npmlog/node_modules/are-we-there-yet/package.json +10 -10
- package/node_modules/npmlog/package.json +1 -1
- package/node_modules/tar-stream/node_modules/bl/.travis.yml +4 -3
- package/node_modules/tar-stream/node_modules/bl/BufferList.js +1 -1
- package/node_modules/tar-stream/node_modules/bl/package.json +10 -10
- package/node_modules/tar-stream/node_modules/bl/test/test.js +20 -2
- package/node_modules/wide-align/LICENSE +0 -0
- package/node_modules/wide-align/README.md +0 -0
- package/node_modules/wide-align/align.js +0 -0
- package/node_modules/wide-align/package.json +14 -14
- package/package.json +12 -4
- package/src/data-channel-wrapper.cpp +90 -40
- package/src/data-channel-wrapper.h +2 -0
- package/src/media-audio-wrapper.cpp +5 -5
- package/src/media-track-wrapper.cpp +96 -38
- package/src/media-track-wrapper.h +1 -0
- package/src/media-video-wrapper.cpp +5 -5
- package/src/peer-connection-wrapper.cpp +111 -54
- package/test/connectivity.js +22 -21
- package/test/test.js +25 -33
- package/node_modules/node-abi/node_modules/semver/CHANGELOG.md +0 -111
|
@@ -23,6 +23,8 @@ public:
|
|
|
23
23
|
// Functions
|
|
24
24
|
void close(const Napi::CallbackInfo &info);
|
|
25
25
|
Napi::Value getLabel(const Napi::CallbackInfo &info);
|
|
26
|
+
Napi::Value getId(const Napi::CallbackInfo &info);
|
|
27
|
+
Napi::Value getProtocol(const Napi::CallbackInfo &info);
|
|
26
28
|
Napi::Value sendMessage(const Napi::CallbackInfo &info);
|
|
27
29
|
Napi::Value sendMessageBinary(const Napi::CallbackInfo &info);
|
|
28
30
|
Napi::Value isOpen(const Napi::CallbackInfo &info);
|
|
@@ -157,15 +157,15 @@ Napi::Value AudioWrapper::generateSdp(const Napi::CallbackInfo &info)
|
|
|
157
157
|
Napi::Env env = info.Env();
|
|
158
158
|
int length = info.Length();
|
|
159
159
|
|
|
160
|
-
if (length < 3 || !info[0].IsString() || !info[1].IsString() || !info[2].
|
|
160
|
+
if (length < 3 || !info[0].IsString() || !info[1].IsString() || !info[2].IsNumber())
|
|
161
161
|
{
|
|
162
|
-
Napi::TypeError::New(env, "We expect (String, String,
|
|
162
|
+
Napi::TypeError::New(env, "We expect (String, String, Number) as param").ThrowAsJavaScriptException();
|
|
163
163
|
return Napi::String::New(env, "");
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
std::string eol = info[0].As<Napi::String>().ToString();
|
|
167
167
|
std::string addr = info[1].As<Napi::String>().ToString();
|
|
168
|
-
|
|
168
|
+
uint16_t port = info[2].As<Napi::Number>().Uint32Value();
|
|
169
169
|
|
|
170
170
|
return Napi::String::New(env, mAudioPtr->generateSdp(eol, addr, port));
|
|
171
171
|
}
|
|
@@ -398,7 +398,7 @@ void AudioWrapper::setBitrate(const Napi::CallbackInfo &info)
|
|
|
398
398
|
Napi::Value AudioWrapper::getBitrate(const Napi::CallbackInfo &info)
|
|
399
399
|
{
|
|
400
400
|
|
|
401
|
-
return Napi::Number::New(info.Env(), mAudioPtr->
|
|
401
|
+
return Napi::Number::New(info.Env(), mAudioPtr->bitrate());
|
|
402
402
|
}
|
|
403
403
|
|
|
404
404
|
Napi::Value AudioWrapper::hasPayloadType(const Napi::CallbackInfo &info)
|
|
@@ -432,7 +432,7 @@ void AudioWrapper::addRTXCodec(const Napi::CallbackInfo &info)
|
|
|
432
432
|
unsigned int originalPayloadType = static_cast<unsigned int>(info[1].As<Napi::Number>().ToNumber());
|
|
433
433
|
unsigned int clockRate = static_cast<unsigned int>(info[2].As<Napi::Number>().ToNumber());
|
|
434
434
|
|
|
435
|
-
mAudioPtr->
|
|
435
|
+
mAudioPtr->addRtxCodec(payloadType, originalPayloadType, clockRate);
|
|
436
436
|
}
|
|
437
437
|
|
|
438
438
|
void AudioWrapper::addRTPMap(const Napi::CallbackInfo &info)
|
|
@@ -22,6 +22,7 @@ Napi::Object TrackWrapper::Init(Napi::Env env, Napi::Object exports)
|
|
|
22
22
|
{
|
|
23
23
|
InstanceMethod("direction", &TrackWrapper::direction),
|
|
24
24
|
InstanceMethod("mid", &TrackWrapper::mid),
|
|
25
|
+
InstanceMethod("type", &TrackWrapper::type),
|
|
25
26
|
InstanceMethod("close", &TrackWrapper::close),
|
|
26
27
|
InstanceMethod("sendMessage", &TrackWrapper::sendMessage),
|
|
27
28
|
InstanceMethod("sendMessageBinary", &TrackWrapper::sendMessageBinary),
|
|
@@ -57,26 +58,26 @@ TrackWrapper::~TrackWrapper()
|
|
|
57
58
|
|
|
58
59
|
void TrackWrapper::doClose()
|
|
59
60
|
{
|
|
60
|
-
instances.erase(this);
|
|
61
|
-
|
|
62
61
|
if (mTrackPtr)
|
|
63
62
|
{
|
|
64
63
|
try
|
|
65
64
|
{
|
|
66
|
-
mOnOpenCallback.reset();
|
|
67
|
-
mOnClosedCallback.reset();
|
|
68
|
-
mOnErrorCallback.reset();
|
|
69
|
-
mOnMessageCallback.reset();
|
|
70
|
-
|
|
71
65
|
mTrackPtr->close();
|
|
72
66
|
mTrackPtr.reset();
|
|
73
67
|
}
|
|
74
68
|
catch (std::exception &ex)
|
|
75
69
|
{
|
|
76
|
-
std::
|
|
70
|
+
std::cerr << std::string("libdatachannel error while closing track: ") + ex.what() << std::endl;
|
|
77
71
|
return;
|
|
78
72
|
}
|
|
79
73
|
}
|
|
74
|
+
|
|
75
|
+
mOnOpenCallback.reset();
|
|
76
|
+
mOnClosedCallback.reset();
|
|
77
|
+
mOnErrorCallback.reset();
|
|
78
|
+
mOnMessageCallback.reset();
|
|
79
|
+
|
|
80
|
+
instances.erase(this);
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
void TrackWrapper::close(const Napi::CallbackInfo &info)
|
|
@@ -86,21 +87,45 @@ void TrackWrapper::close(const Napi::CallbackInfo &info)
|
|
|
86
87
|
|
|
87
88
|
Napi::Value TrackWrapper::direction(const Napi::CallbackInfo &info)
|
|
88
89
|
{
|
|
90
|
+
if (!mTrackPtr)
|
|
91
|
+
{
|
|
92
|
+
Napi::Error::New(info.Env(), "direction() called on destroyed track").ThrowAsJavaScriptException();
|
|
93
|
+
return info.Env().Null();
|
|
94
|
+
}
|
|
95
|
+
|
|
89
96
|
Napi::Env env = info.Env();
|
|
90
97
|
return Napi::String::New(env, directionToStr(mTrackPtr->direction()));
|
|
91
98
|
}
|
|
92
99
|
|
|
93
100
|
Napi::Value TrackWrapper::mid(const Napi::CallbackInfo &info)
|
|
94
101
|
{
|
|
102
|
+
if (!mTrackPtr)
|
|
103
|
+
{
|
|
104
|
+
Napi::Error::New(info.Env(), "mid() called on destroyed track").ThrowAsJavaScriptException();
|
|
105
|
+
return info.Env().Null();
|
|
106
|
+
}
|
|
107
|
+
|
|
95
108
|
Napi::Env env = info.Env();
|
|
96
109
|
return Napi::String::New(env, mTrackPtr->mid());
|
|
97
110
|
}
|
|
98
111
|
|
|
112
|
+
Napi::Value TrackWrapper::type(const Napi::CallbackInfo &info)
|
|
113
|
+
{
|
|
114
|
+
if (!mTrackPtr)
|
|
115
|
+
{
|
|
116
|
+
Napi::Error::New(info.Env(), "type() called on destroyed track").ThrowAsJavaScriptException();
|
|
117
|
+
return info.Env().Null();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
Napi::Env env = info.Env();
|
|
121
|
+
return Napi::String::New(env, mTrackPtr->description().type());
|
|
122
|
+
}
|
|
123
|
+
|
|
99
124
|
Napi::Value TrackWrapper::sendMessage(const Napi::CallbackInfo &info)
|
|
100
125
|
{
|
|
101
126
|
if (!mTrackPtr)
|
|
102
127
|
{
|
|
103
|
-
Napi::Error::New(info.Env(), "
|
|
128
|
+
Napi::Error::New(info.Env(), "sendMessage() called on destroyed track").ThrowAsJavaScriptException();
|
|
104
129
|
return info.Env().Null();
|
|
105
130
|
}
|
|
106
131
|
|
|
@@ -120,7 +145,7 @@ Napi::Value TrackWrapper::sendMessage(const Napi::CallbackInfo &info)
|
|
|
120
145
|
}
|
|
121
146
|
catch (std::exception &ex)
|
|
122
147
|
{
|
|
123
|
-
Napi::Error::New(env, std::string("libdatachannel error while sending track
|
|
148
|
+
Napi::Error::New(env, std::string("libdatachannel error while sending track message: ") + ex.what()).ThrowAsJavaScriptException();
|
|
124
149
|
return Napi::Boolean::New(info.Env(), false);
|
|
125
150
|
}
|
|
126
151
|
}
|
|
@@ -129,7 +154,7 @@ Napi::Value TrackWrapper::sendMessageBinary(const Napi::CallbackInfo &info)
|
|
|
129
154
|
{
|
|
130
155
|
if (!mTrackPtr)
|
|
131
156
|
{
|
|
132
|
-
Napi::Error::New(info.Env(), "
|
|
157
|
+
Napi::Error::New(info.Env(), "sendMessageBinary() called on destroyed track").ThrowAsJavaScriptException();
|
|
133
158
|
return info.Env().Null();
|
|
134
159
|
}
|
|
135
160
|
|
|
@@ -149,7 +174,7 @@ Napi::Value TrackWrapper::sendMessageBinary(const Napi::CallbackInfo &info)
|
|
|
149
174
|
}
|
|
150
175
|
catch (std::exception &ex)
|
|
151
176
|
{
|
|
152
|
-
Napi::Error::New(env, std::string("libdatachannel error while sending track
|
|
177
|
+
Napi::Error::New(env, std::string("libdatachannel error while sending track message: ") + ex.what()).ThrowAsJavaScriptException();
|
|
153
178
|
return Napi::Boolean::New(info.Env(), false);
|
|
154
179
|
}
|
|
155
180
|
}
|
|
@@ -157,18 +182,31 @@ Napi::Value TrackWrapper::sendMessageBinary(const Napi::CallbackInfo &info)
|
|
|
157
182
|
Napi::Value TrackWrapper::isOpen(const Napi::CallbackInfo &info)
|
|
158
183
|
{
|
|
159
184
|
Napi::Env env = info.Env();
|
|
185
|
+
|
|
186
|
+
if (!mTrackPtr)
|
|
187
|
+
{
|
|
188
|
+
return Napi::Boolean::New(env, false);
|
|
189
|
+
}
|
|
190
|
+
|
|
160
191
|
return Napi::Boolean::New(env, mTrackPtr->isOpen());
|
|
161
192
|
}
|
|
162
193
|
|
|
163
194
|
Napi::Value TrackWrapper::isClosed(const Napi::CallbackInfo &info)
|
|
164
195
|
{
|
|
165
196
|
Napi::Env env = info.Env();
|
|
197
|
+
|
|
198
|
+
if (!mTrackPtr)
|
|
199
|
+
{
|
|
200
|
+
return Napi::Boolean::New(env, true);
|
|
201
|
+
}
|
|
202
|
+
|
|
166
203
|
return Napi::Boolean::New(env, mTrackPtr->isClosed());
|
|
167
204
|
}
|
|
168
205
|
|
|
169
206
|
Napi::Value TrackWrapper::maxMessageSize(const Napi::CallbackInfo &info)
|
|
170
207
|
{
|
|
171
208
|
Napi::Env env = info.Env();
|
|
209
|
+
|
|
172
210
|
if (!mTrackPtr)
|
|
173
211
|
{
|
|
174
212
|
return Napi::Number::New(info.Env(), 0);
|
|
@@ -180,13 +218,19 @@ Napi::Value TrackWrapper::maxMessageSize(const Napi::CallbackInfo &info)
|
|
|
180
218
|
}
|
|
181
219
|
catch (std::exception &ex)
|
|
182
220
|
{
|
|
183
|
-
Napi::Error::New(env, std::string("libdatachannel error
|
|
221
|
+
Napi::Error::New(env, std::string("libdatachannel error: ") + ex.what()).ThrowAsJavaScriptException();
|
|
184
222
|
return Napi::Number::New(info.Env(), 0);
|
|
185
223
|
}
|
|
186
224
|
}
|
|
187
225
|
|
|
188
226
|
Napi::Value TrackWrapper::requestKeyframe(const Napi::CallbackInfo &info)
|
|
189
227
|
{
|
|
228
|
+
if (!mTrackPtr)
|
|
229
|
+
{
|
|
230
|
+
Napi::Error::New(info.Env(), "requestKeyframe() called on destroyed track").ThrowAsJavaScriptException();
|
|
231
|
+
return info.Env().Null();
|
|
232
|
+
}
|
|
233
|
+
|
|
190
234
|
Napi::Env env = info.Env();
|
|
191
235
|
return Napi::Boolean::New(env, mTrackPtr->requestKeyframe());
|
|
192
236
|
}
|
|
@@ -195,7 +239,7 @@ void TrackWrapper::setMediaHandler(const Napi::CallbackInfo &info)
|
|
|
195
239
|
{
|
|
196
240
|
if (!mTrackPtr)
|
|
197
241
|
{
|
|
198
|
-
Napi::Error::New(info.Env(), "
|
|
242
|
+
Napi::Error::New(info.Env(), "setMediaHandler() called on destroyed track").ThrowAsJavaScriptException();
|
|
199
243
|
return;
|
|
200
244
|
}
|
|
201
245
|
|
|
@@ -204,7 +248,7 @@ void TrackWrapper::setMediaHandler(const Napi::CallbackInfo &info)
|
|
|
204
248
|
|
|
205
249
|
if (length < 1 || !info[0].IsObject())
|
|
206
250
|
{
|
|
207
|
-
Napi::TypeError::New(env, "
|
|
251
|
+
Napi::TypeError::New(env, "MediaHandler class instance expected").ThrowAsJavaScriptException();
|
|
208
252
|
return;
|
|
209
253
|
}
|
|
210
254
|
|
|
@@ -214,6 +258,12 @@ void TrackWrapper::setMediaHandler(const Napi::CallbackInfo &info)
|
|
|
214
258
|
|
|
215
259
|
void TrackWrapper::onOpen(const Napi::CallbackInfo &info)
|
|
216
260
|
{
|
|
261
|
+
if (!mTrackPtr)
|
|
262
|
+
{
|
|
263
|
+
Napi::Error::New(info.Env(), "onOpen() called on destroyed track").ThrowAsJavaScriptException();
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
217
267
|
Napi::Env env = info.Env();
|
|
218
268
|
int length = info.Length();
|
|
219
269
|
|
|
@@ -226,11 +276,10 @@ void TrackWrapper::onOpen(const Napi::CallbackInfo &info)
|
|
|
226
276
|
// Callback
|
|
227
277
|
mOnOpenCallback = std::make_unique<ThreadSafeCallback>(info[0].As<Napi::Function>());
|
|
228
278
|
|
|
229
|
-
mTrackPtr->onOpen([&]()
|
|
230
|
-
{
|
|
279
|
+
mTrackPtr->onOpen([&]() {
|
|
231
280
|
if (mOnOpenCallback)
|
|
232
281
|
mOnOpenCallback->call([this](Napi::Env env, std::vector<napi_value> &args) {
|
|
233
|
-
// Check the
|
|
282
|
+
// Check the track is not closed
|
|
234
283
|
if(instances.find(this) == instances.end())
|
|
235
284
|
throw ThreadSafeCallback::CancelException();
|
|
236
285
|
|
|
@@ -242,6 +291,12 @@ void TrackWrapper::onOpen(const Napi::CallbackInfo &info)
|
|
|
242
291
|
|
|
243
292
|
void TrackWrapper::onClosed(const Napi::CallbackInfo &info)
|
|
244
293
|
{
|
|
294
|
+
if (!mTrackPtr)
|
|
295
|
+
{
|
|
296
|
+
Napi::Error::New(info.Env(), "onClosed() called on destroyed track").ThrowAsJavaScriptException();
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
|
|
245
300
|
Napi::Env env = info.Env();
|
|
246
301
|
int length = info.Length();
|
|
247
302
|
|
|
@@ -254,13 +309,10 @@ void TrackWrapper::onClosed(const Napi::CallbackInfo &info)
|
|
|
254
309
|
// Callback
|
|
255
310
|
mOnClosedCallback = std::make_unique<ThreadSafeCallback>(info[0].As<Napi::Function>());
|
|
256
311
|
|
|
257
|
-
mTrackPtr->onClosed([&]()
|
|
258
|
-
{
|
|
312
|
+
mTrackPtr->onClosed([&]() {
|
|
259
313
|
if (mOnClosedCallback)
|
|
260
314
|
mOnClosedCallback->call([this](Napi::Env env, std::vector<napi_value> &args) {
|
|
261
|
-
//
|
|
262
|
-
if(instances.find(this) == instances.end())
|
|
263
|
-
throw ThreadSafeCallback::CancelException();
|
|
315
|
+
// Do not check if the data channel has been closed here
|
|
264
316
|
|
|
265
317
|
// This will run in main thread and needs to construct the
|
|
266
318
|
// arguments for the call
|
|
@@ -270,6 +322,12 @@ void TrackWrapper::onClosed(const Napi::CallbackInfo &info)
|
|
|
270
322
|
|
|
271
323
|
void TrackWrapper::onError(const Napi::CallbackInfo &info)
|
|
272
324
|
{
|
|
325
|
+
if (!mTrackPtr)
|
|
326
|
+
{
|
|
327
|
+
Napi::Error::New(info.Env(), "onError() called on destroyed track").ThrowAsJavaScriptException();
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
|
|
273
331
|
Napi::Env env = info.Env();
|
|
274
332
|
int length = info.Length();
|
|
275
333
|
|
|
@@ -282,11 +340,10 @@ void TrackWrapper::onError(const Napi::CallbackInfo &info)
|
|
|
282
340
|
// Callback
|
|
283
341
|
mOnErrorCallback = std::make_unique<ThreadSafeCallback>(info[0].As<Napi::Function>());
|
|
284
342
|
|
|
285
|
-
mTrackPtr->onError([&](const std::string &error)
|
|
286
|
-
{
|
|
343
|
+
mTrackPtr->onError([&](const std::string &error) {
|
|
287
344
|
if (mOnErrorCallback)
|
|
288
345
|
mOnErrorCallback->call([this, error](Napi::Env env, std::vector<napi_value> &args) {
|
|
289
|
-
// Check the
|
|
346
|
+
// Check the track is not closed
|
|
290
347
|
if(instances.find(this) == instances.end())
|
|
291
348
|
throw ThreadSafeCallback::CancelException();
|
|
292
349
|
|
|
@@ -298,6 +355,12 @@ void TrackWrapper::onError(const Napi::CallbackInfo &info)
|
|
|
298
355
|
|
|
299
356
|
void TrackWrapper::onMessage(const Napi::CallbackInfo &info)
|
|
300
357
|
{
|
|
358
|
+
if (!mTrackPtr)
|
|
359
|
+
{
|
|
360
|
+
Napi::Error::New(info.Env(), "onMessage() called on destroyed track").ThrowAsJavaScriptException();
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
|
|
301
364
|
Napi::Env env = info.Env();
|
|
302
365
|
int length = info.Length();
|
|
303
366
|
|
|
@@ -310,24 +373,19 @@ void TrackWrapper::onMessage(const Napi::CallbackInfo &info)
|
|
|
310
373
|
// Callback
|
|
311
374
|
mOnMessageCallback = std::make_unique<ThreadSafeCallback>(info[0].As<Napi::Function>());
|
|
312
375
|
|
|
313
|
-
mTrackPtr->onMessage([&](
|
|
314
|
-
{
|
|
376
|
+
mTrackPtr->onMessage([&](std::variant<rtc::binary, std::string> message) {
|
|
315
377
|
if (mOnMessageCallback)
|
|
316
|
-
mOnMessageCallback->call([this, message](Napi::Env env, std::vector<napi_value> &args) {
|
|
317
|
-
// Check the
|
|
378
|
+
mOnMessageCallback->call([this, message = std::move(message)](Napi::Env env, std::vector<napi_value> &args) {
|
|
379
|
+
// Check the track is not closed
|
|
318
380
|
if(instances.find(this) == instances.end())
|
|
319
381
|
throw ThreadSafeCallback::CancelException();
|
|
320
382
|
|
|
321
383
|
// This will run in main thread and needs to construct the
|
|
322
384
|
// arguments for the call
|
|
323
|
-
|
|
324
|
-
if (std::holds_alternative<std::string>(message))
|
|
325
|
-
{
|
|
326
|
-
args = {Napi::String::New(env, std::get<std::string>(message))};
|
|
327
|
-
}
|
|
328
|
-
else
|
|
385
|
+
if (std::holds_alternative<rtc::binary>(message)) // Track will always receive messages as binary
|
|
329
386
|
{
|
|
330
|
-
|
|
387
|
+
auto bin = std::get<rtc::binary>(std::move(message));
|
|
388
|
+
args = {Napi::Buffer<std::byte>::Copy(env, bin.data(), bin.size())};
|
|
331
389
|
}
|
|
332
390
|
}); });
|
|
333
|
-
}
|
|
391
|
+
}
|
|
@@ -23,6 +23,7 @@ public:
|
|
|
23
23
|
// Functions
|
|
24
24
|
Napi::Value direction(const Napi::CallbackInfo &info);
|
|
25
25
|
Napi::Value mid(const Napi::CallbackInfo &info);
|
|
26
|
+
Napi::Value type(const Napi::CallbackInfo &info);
|
|
26
27
|
void close(const Napi::CallbackInfo &info);
|
|
27
28
|
Napi::Value sendMessage(const Napi::CallbackInfo &info);
|
|
28
29
|
Napi::Value sendMessageBinary(const Napi::CallbackInfo &info);
|
|
@@ -190,15 +190,15 @@ Napi::Value VideoWrapper::generateSdp(const Napi::CallbackInfo &info)
|
|
|
190
190
|
Napi::Env env = info.Env();
|
|
191
191
|
int length = info.Length();
|
|
192
192
|
|
|
193
|
-
if (length < 3 || !info[0].IsString() || !info[1].IsString() || !info[2].
|
|
193
|
+
if (length < 3 || !info[0].IsString() || !info[1].IsString() || !info[2].IsNumber())
|
|
194
194
|
{
|
|
195
|
-
Napi::TypeError::New(env, "We expect (String, String,
|
|
195
|
+
Napi::TypeError::New(env, "We expect (String, String, Number) as param").ThrowAsJavaScriptException();
|
|
196
196
|
return Napi::String::New(env, "");
|
|
197
197
|
}
|
|
198
198
|
|
|
199
199
|
std::string eol = info[0].As<Napi::String>().ToString();
|
|
200
200
|
std::string addr = info[1].As<Napi::String>().ToString();
|
|
201
|
-
|
|
201
|
+
uint16_t port = info[2].As<Napi::Number>().Uint32Value();
|
|
202
202
|
|
|
203
203
|
return Napi::String::New(env, mVideoPtr->generateSdp(eol, addr, port));
|
|
204
204
|
}
|
|
@@ -431,7 +431,7 @@ void VideoWrapper::setBitrate(const Napi::CallbackInfo &info)
|
|
|
431
431
|
Napi::Value VideoWrapper::getBitrate(const Napi::CallbackInfo &info)
|
|
432
432
|
{
|
|
433
433
|
|
|
434
|
-
return Napi::Number::New(info.Env(), mVideoPtr->
|
|
434
|
+
return Napi::Number::New(info.Env(), mVideoPtr->bitrate());
|
|
435
435
|
}
|
|
436
436
|
|
|
437
437
|
Napi::Value VideoWrapper::hasPayloadType(const Napi::CallbackInfo &info)
|
|
@@ -465,7 +465,7 @@ void VideoWrapper::addRTXCodec(const Napi::CallbackInfo &info)
|
|
|
465
465
|
unsigned int originalPayloadType = static_cast<unsigned int>(info[1].As<Napi::Number>().ToNumber());
|
|
466
466
|
unsigned int clockRate = static_cast<unsigned int>(info[2].As<Napi::Number>().ToNumber());
|
|
467
467
|
|
|
468
|
-
mVideoPtr->
|
|
468
|
+
mVideoPtr->addRtxCodec(payloadType, originalPayloadType, clockRate);
|
|
469
469
|
}
|
|
470
470
|
|
|
471
471
|
void VideoWrapper::addRTPMap(const Napi::CallbackInfo &info)
|