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.
Files changed (67) hide show
  1. package/.editorconfig +12 -0
  2. package/.eslintignore +2 -0
  3. package/.eslintrc.js +8 -0
  4. package/.github/FUNDING.yml +2 -0
  5. package/.github/workflows/build-linux.yml +3 -3
  6. package/.github/workflows/build-mac.yml +1 -1
  7. package/.github/workflows/build-win.yml +4 -4
  8. package/.github/workflows/lint.yml +22 -0
  9. package/.prettierrc.js +7 -0
  10. package/CMakeLists.txt +8 -2
  11. package/README.md +4 -4
  12. package/examples/client-server/client-benchmark.js +43 -32
  13. package/examples/client-server/client-periodic.js +30 -14
  14. package/examples/client-server/client.js +6 -5
  15. package/examples/client-server/package-lock.json +183 -44
  16. package/examples/client-server/signaling-server.js +3 -5
  17. package/examples/media/media.js +9 -9
  18. package/lib/datachannel-stream.js +23 -12
  19. package/lib/index.d.ts +113 -116
  20. package/lib/index.js +3 -2
  21. package/node_modules/detect-libc/package.json +1 -0
  22. package/node_modules/lru-cache/package.json +1 -2
  23. package/node_modules/minimist/index.js +6 -2
  24. package/node_modules/minimist/package.json +10 -11
  25. package/node_modules/minimist/readme.markdown +4 -1
  26. package/node_modules/minimist/test/proto.js +16 -0
  27. package/node_modules/node-abi/node_modules/semver/README.md +3 -1
  28. package/node_modules/node-abi/node_modules/semver/bin/semver.js +19 -9
  29. package/node_modules/node-abi/node_modules/semver/classes/comparator.js +3 -2
  30. package/node_modules/node-abi/node_modules/semver/classes/index.js +1 -1
  31. package/node_modules/node-abi/node_modules/semver/classes/range.js +31 -22
  32. package/node_modules/node-abi/node_modules/semver/classes/semver.js +1 -1
  33. package/node_modules/node-abi/node_modules/semver/functions/cmp.js +8 -4
  34. package/node_modules/node-abi/node_modules/semver/functions/coerce.js +3 -2
  35. package/node_modules/node-abi/node_modules/semver/functions/inc.js +4 -1
  36. package/node_modules/node-abi/node_modules/semver/functions/parse.js +1 -1
  37. package/node_modules/node-abi/node_modules/semver/internal/constants.js +2 -2
  38. package/node_modules/node-abi/node_modules/semver/internal/identifiers.js +1 -1
  39. package/node_modules/node-abi/node_modules/semver/internal/parse-options.js +3 -3
  40. package/node_modules/node-abi/node_modules/semver/internal/re.js +3 -3
  41. package/node_modules/node-abi/node_modules/semver/package.json +51 -18
  42. package/node_modules/node-abi/node_modules/semver/ranges/min-version.js +2 -1
  43. package/node_modules/node-abi/node_modules/semver/ranges/outside.js +1 -1
  44. package/node_modules/node-abi/node_modules/semver/ranges/simplify.js +15 -12
  45. package/node_modules/node-abi/node_modules/semver/ranges/subset.js +53 -31
  46. package/node_modules/node-abi/package.json +1 -0
  47. package/node_modules/npmlog/node_modules/are-we-there-yet/package.json +10 -10
  48. package/node_modules/npmlog/package.json +1 -1
  49. package/node_modules/tar-stream/node_modules/bl/.travis.yml +4 -3
  50. package/node_modules/tar-stream/node_modules/bl/BufferList.js +1 -1
  51. package/node_modules/tar-stream/node_modules/bl/package.json +10 -10
  52. package/node_modules/tar-stream/node_modules/bl/test/test.js +20 -2
  53. package/node_modules/wide-align/LICENSE +0 -0
  54. package/node_modules/wide-align/README.md +0 -0
  55. package/node_modules/wide-align/align.js +0 -0
  56. package/node_modules/wide-align/package.json +14 -14
  57. package/package.json +12 -4
  58. package/src/data-channel-wrapper.cpp +90 -40
  59. package/src/data-channel-wrapper.h +2 -0
  60. package/src/media-audio-wrapper.cpp +5 -5
  61. package/src/media-track-wrapper.cpp +96 -38
  62. package/src/media-track-wrapper.h +1 -0
  63. package/src/media-video-wrapper.cpp +5 -5
  64. package/src/peer-connection-wrapper.cpp +111 -54
  65. package/test/connectivity.js +22 -21
  66. package/test/test.js +25 -33
  67. 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].IsString())
160
+ if (length < 3 || !info[0].IsString() || !info[1].IsString() || !info[2].IsNumber())
161
161
  {
162
- Napi::TypeError::New(env, "We expect (String, String, String) as param").ThrowAsJavaScriptException();
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
- std::string port = info[2].As<Napi::String>().ToString();
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->getBitrate());
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->addRTXCodec(payloadType, originalPayloadType, clockRate);
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::cout << std::string("libdatachannel error while closing track# ") + ex.what() << std::endl;
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(), "It seems track is destroyed!").ThrowAsJavaScriptException();
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 msg# ") + ex.what()).ThrowAsJavaScriptException();
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(), "It seems track is destroyed!").ThrowAsJavaScriptException();
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 msg# ") + ex.what()).ThrowAsJavaScriptException();
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# ") + ex.what()).ThrowAsJavaScriptException();
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(), "It seems track is destroyed!").ThrowAsJavaScriptException();
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, "Mediahandler class instance expected").ThrowAsJavaScriptException();
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 peer connection is not closed
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
- // Check the peer connection is not closed
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 peer connection is not closed
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([&](const std::variant<rtc::binary, std::string> &message)
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 peer connection is not closed
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
- Napi::Object payload = Napi::Object::New(env);
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
- args = {Napi::Buffer<std::byte>::Copy(env, std::get<rtc::binary>(message).data(), std::get<rtc::binary>(message).size())};
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].IsString())
193
+ if (length < 3 || !info[0].IsString() || !info[1].IsString() || !info[2].IsNumber())
194
194
  {
195
- Napi::TypeError::New(env, "We expect (String, String, String) as param").ThrowAsJavaScriptException();
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
- std::string port = info[2].As<Napi::String>().ToString();
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->getBitrate());
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->addRTXCodec(payloadType, originalPayloadType, clockRate);
468
+ mVideoPtr->addRtxCodec(payloadType, originalPayloadType, clockRate);
469
469
  }
470
470
 
471
471
  void VideoWrapper::addRTPMap(const Napi::CallbackInfo &info)