node-datachannel 0.1.14-dev → 0.2.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.
@@ -0,0 +1,457 @@
1
+ #include "media-audio-wrapper.h"
2
+ #include "media-direction.h"
3
+
4
+ Napi::FunctionReference AudioWrapper::constructor;
5
+ std::unordered_set<AudioWrapper *> AudioWrapper::instances;
6
+
7
+ Napi::Object AudioWrapper::Init(Napi::Env env, Napi::Object exports)
8
+ {
9
+ Napi::HandleScope scope(env);
10
+
11
+ Napi::Function func = DefineClass(
12
+ env,
13
+ "Audio",
14
+ {
15
+ InstanceValue("media-type-audio", Napi::Boolean::New(env, true)),
16
+ InstanceMethod("addAudioCodec", &AudioWrapper::addAudioCodec),
17
+ InstanceMethod("addOpusCodec", &AudioWrapper::addOpusCodec),
18
+ InstanceMethod("direction", &AudioWrapper::direction),
19
+ InstanceMethod("generateSdp", &AudioWrapper::generateSdp),
20
+ InstanceMethod("mid", &AudioWrapper::mid),
21
+ InstanceMethod("setDirection", &AudioWrapper::setDirection),
22
+ InstanceMethod("description", &AudioWrapper::description),
23
+ InstanceMethod("removeFormat", &AudioWrapper::removeFormat),
24
+ InstanceMethod("addSSRC", &AudioWrapper::addSSRC),
25
+ InstanceMethod("removeSSRC", &AudioWrapper::removeSSRC),
26
+ InstanceMethod("replaceSSRC", &AudioWrapper::replaceSSRC),
27
+ InstanceMethod("hasSSRC", &AudioWrapper::hasSSRC),
28
+ InstanceMethod("getSSRCs", &AudioWrapper::getSSRCs),
29
+ InstanceMethod("getCNameForSsrc", &AudioWrapper::getCNameForSsrc),
30
+ InstanceMethod("setBitrate", &AudioWrapper::setBitrate),
31
+ InstanceMethod("getBitrate", &AudioWrapper::getBitrate),
32
+ InstanceMethod("hasPayloadType", &AudioWrapper::hasPayloadType),
33
+ InstanceMethod("addRTXCodec", &AudioWrapper::addRTXCodec),
34
+ InstanceMethod("addRTPMap", &AudioWrapper::addRTPMap),
35
+ InstanceMethod("parseSdpLine", &AudioWrapper::parseSdpLine),
36
+ });
37
+
38
+ constructor = Napi::Persistent(func);
39
+ constructor.SuppressDestruct();
40
+
41
+ exports.Set("Audio", func);
42
+ return exports;
43
+ }
44
+
45
+ AudioWrapper::AudioWrapper(const Napi::CallbackInfo &info) : Napi::ObjectWrap<AudioWrapper>(info)
46
+ {
47
+ Napi::Env env = info.Env();
48
+ int length = info.Length();
49
+
50
+ std::string mid = "audio";
51
+ rtc::Description::Direction dir = rtc::Description::Direction::SendOnly;
52
+
53
+ // optional
54
+ if (length > 1)
55
+ {
56
+ if (!info[0].IsString())
57
+ {
58
+ Napi::TypeError::New(env, "mid (String) expected").ThrowAsJavaScriptException();
59
+ return;
60
+ }
61
+ mid = info[0].As<Napi::String>().ToString();
62
+ }
63
+
64
+ // ootional
65
+ if (length > 2)
66
+ {
67
+ if (!info[1].IsString())
68
+ {
69
+ Napi::TypeError::New(env, "direction (String) expected").ThrowAsJavaScriptException();
70
+ return;
71
+ }
72
+
73
+ std::string dirAsStr = info[1].As<Napi::String>().ToString();
74
+ dir = strToDirection(dirAsStr);
75
+ }
76
+
77
+ mAudioPtr = std::make_unique<rtc::Description::Audio>(mid, dir);
78
+
79
+ instances.insert(this);
80
+ }
81
+
82
+ AudioWrapper::~AudioWrapper()
83
+ {
84
+ mAudioPtr.reset();
85
+ instances.erase(this);
86
+ }
87
+
88
+ rtc::Description::Audio AudioWrapper::getAudioInstance()
89
+ {
90
+ return *(mAudioPtr.get());
91
+ }
92
+
93
+ void AudioWrapper::addAudioCodec(const Napi::CallbackInfo &info)
94
+ {
95
+ Napi::Env env = info.Env();
96
+ int length = info.Length();
97
+
98
+ if (length < 2 || !info[0].IsNumber() || !info[1].IsString())
99
+ {
100
+ Napi::TypeError::New(env, "We expect (Number, String, String[optional]) as param").ThrowAsJavaScriptException();
101
+ return;
102
+ }
103
+
104
+ int payloadType = info[0].As<Napi::Number>().ToNumber();
105
+ std::string codec = info[1].As<Napi::String>().ToString();
106
+ std::optional<std::string> profile = std::nullopt;
107
+
108
+ if (length > 2)
109
+ {
110
+ if (!info[2].IsString())
111
+ {
112
+ Napi::TypeError::New(env, "profile (String) expected").ThrowAsJavaScriptException();
113
+ return;
114
+ }
115
+ profile = info[2].As<Napi::String>().ToString();
116
+ }
117
+
118
+ mAudioPtr->addAudioCodec(payloadType, codec, profile);
119
+ }
120
+
121
+ void AudioWrapper::addOpusCodec(const Napi::CallbackInfo &info)
122
+ {
123
+ Napi::Env env = info.Env();
124
+ int length = info.Length();
125
+
126
+ if (length < 1 || !info[0].IsNumber())
127
+ {
128
+ Napi::TypeError::New(env, "We expect (Number) as param").ThrowAsJavaScriptException();
129
+ return;
130
+ }
131
+
132
+ int payloadType = info[0].As<Napi::Number>().ToNumber();
133
+ std::optional<std::string> profile = rtc::DEFAULT_OPUS_AUDIO_PROFILE;
134
+
135
+ if (length > 1)
136
+ {
137
+ if (!info[1].IsString())
138
+ {
139
+ Napi::TypeError::New(env, "profile (String) expected").ThrowAsJavaScriptException();
140
+ return;
141
+ }
142
+ profile = info[1].As<Napi::String>().ToString();
143
+ }
144
+
145
+ mAudioPtr->addOpusCodec(payloadType, profile);
146
+ }
147
+
148
+
149
+ Napi::Value AudioWrapper::direction(const Napi::CallbackInfo &info)
150
+ {
151
+ Napi::Env env = info.Env();
152
+ return Napi::String::New(env, directionToStr(mAudioPtr->direction()));
153
+ }
154
+
155
+ Napi::Value AudioWrapper::generateSdp(const Napi::CallbackInfo &info)
156
+ {
157
+ Napi::Env env = info.Env();
158
+ int length = info.Length();
159
+
160
+ if (length < 3 || !info[0].IsString() || !info[1].IsString() || !info[2].IsString())
161
+ {
162
+ Napi::TypeError::New(env, "We expect (String, String, String) as param").ThrowAsJavaScriptException();
163
+ return Napi::String::New(env, "");
164
+ }
165
+
166
+ std::string eol = info[0].As<Napi::String>().ToString();
167
+ std::string addr = info[1].As<Napi::String>().ToString();
168
+ std::string port = info[2].As<Napi::String>().ToString();
169
+
170
+ return Napi::String::New(env, mAudioPtr->generateSdp(eol, addr, port));
171
+ }
172
+
173
+ Napi::Value AudioWrapper::mid(const Napi::CallbackInfo &info)
174
+ {
175
+ Napi::Env env = info.Env();
176
+ return Napi::String::New(env, mAudioPtr->mid());
177
+ }
178
+
179
+ void AudioWrapper::setDirection(const Napi::CallbackInfo &info)
180
+ {
181
+ Napi::Env env = info.Env();
182
+ int length = info.Length();
183
+
184
+ if (length < 1 || !info[0].IsString())
185
+ {
186
+ Napi::TypeError::New(env, "We expect (String) as param").ThrowAsJavaScriptException();
187
+ return;
188
+ }
189
+
190
+ std::string dirAsStr = info[0].As<Napi::String>().ToString();
191
+ rtc::Description::Direction dir = strToDirection(dirAsStr);
192
+ mAudioPtr->setDirection(dir);
193
+ }
194
+
195
+ Napi::Value AudioWrapper::description(const Napi::CallbackInfo &info)
196
+ {
197
+ Napi::Env env = info.Env();
198
+ return Napi::String::New(env, mAudioPtr->description());
199
+ }
200
+
201
+ void AudioWrapper::removeFormat(const Napi::CallbackInfo &info)
202
+ {
203
+ Napi::Env env = info.Env();
204
+ int length = info.Length();
205
+
206
+ if (length < 1 || !info[0].IsString())
207
+ {
208
+ Napi::TypeError::New(env, "We expect (String) as param").ThrowAsJavaScriptException();
209
+ return;
210
+ }
211
+
212
+ std::string fmt = info[0].As<Napi::String>().ToString();
213
+
214
+ mAudioPtr->removeFormat(fmt);
215
+ }
216
+
217
+ void AudioWrapper::addSSRC(const Napi::CallbackInfo &info)
218
+ {
219
+ Napi::Env env = info.Env();
220
+ int length = info.Length();
221
+
222
+ if (length < 1 || !info[0].IsNumber())
223
+ {
224
+ Napi::TypeError::New(env, "We expect (Number, String[optional], String[optional], String[optional]) as param").ThrowAsJavaScriptException();
225
+ return;
226
+ }
227
+
228
+ uint32_t ssrc = static_cast<uint32_t>(info[0].As<Napi::Number>().ToNumber());
229
+ std::optional<std::string> name;
230
+ std::optional<std::string> msid = std::nullopt;
231
+ std::optional<std::string> trackID = std::nullopt;
232
+
233
+ if (length > 1)
234
+ {
235
+ if (!info[1].IsString())
236
+ {
237
+ Napi::TypeError::New(env, "name as String expected").ThrowAsJavaScriptException();
238
+ return;
239
+ }
240
+ name = info[1].As<Napi::String>().ToString();
241
+ }
242
+
243
+ if (length > 2)
244
+ {
245
+ if (!info[2].IsString())
246
+ {
247
+ Napi::TypeError::New(env, "msid as String expected").ThrowAsJavaScriptException();
248
+ return;
249
+ }
250
+ msid = info[2].As<Napi::String>().ToString();
251
+ }
252
+
253
+ if (length > 3)
254
+ {
255
+ if (!info[3].IsString())
256
+ {
257
+ Napi::TypeError::New(env, "trackID as String expected").ThrowAsJavaScriptException();
258
+ return;
259
+ }
260
+ trackID = info[3].As<Napi::String>().ToString();
261
+ }
262
+
263
+ mAudioPtr->addSSRC(ssrc, name, msid, trackID);
264
+ }
265
+
266
+ void AudioWrapper::removeSSRC(const Napi::CallbackInfo &info)
267
+ {
268
+ Napi::Env env = info.Env();
269
+ int length = info.Length();
270
+
271
+ if (length < 1 || !info[0].IsNumber())
272
+ {
273
+ Napi::TypeError::New(env, "We expect (Number) as param").ThrowAsJavaScriptException();
274
+ return;
275
+ }
276
+
277
+ uint32_t ssrc = static_cast<uint32_t>(info[0].As<Napi::Number>().ToNumber());
278
+
279
+ mAudioPtr->removeSSRC(ssrc);
280
+ }
281
+
282
+ void AudioWrapper::replaceSSRC(const Napi::CallbackInfo &info)
283
+ {
284
+ Napi::Env env = info.Env();
285
+ int length = info.Length();
286
+
287
+ if (length < 2 || !info[0].IsNumber() || !info[1].IsNumber())
288
+ {
289
+ Napi::TypeError::New(env, "We expect (Number, Number, String[optional], String[optional], String[optional]) as param").ThrowAsJavaScriptException();
290
+ return;
291
+ }
292
+
293
+ uint32_t ssrc = static_cast<uint32_t>(info[0].As<Napi::Number>().ToNumber());
294
+ uint32_t oldSsrc = static_cast<uint32_t>(info[1].As<Napi::Number>().ToNumber());
295
+ std::optional<std::string> name;
296
+ std::optional<std::string> msid = std::nullopt;
297
+ std::optional<std::string> trackID = std::nullopt;
298
+
299
+ if (length > 2)
300
+ {
301
+ if (!info[2].IsString())
302
+ {
303
+ Napi::TypeError::New(env, "name as String expected").ThrowAsJavaScriptException();
304
+ return;
305
+ }
306
+ name = info[2].As<Napi::String>().ToString();
307
+ }
308
+
309
+ if (length > 3)
310
+ {
311
+ if (!info[3].IsString())
312
+ {
313
+ Napi::TypeError::New(env, "msid as String expected").ThrowAsJavaScriptException();
314
+ return;
315
+ }
316
+ msid = info[3].As<Napi::String>().ToString();
317
+ }
318
+
319
+ if (length > 4)
320
+ {
321
+ if (!info[4].IsString())
322
+ {
323
+ Napi::TypeError::New(env, "trackID as String expected").ThrowAsJavaScriptException();
324
+ return;
325
+ }
326
+ trackID = info[4].As<Napi::String>().ToString();
327
+ }
328
+
329
+ mAudioPtr->replaceSSRC(oldSsrc, ssrc, name, msid, trackID);
330
+ }
331
+
332
+ Napi::Value AudioWrapper::hasSSRC(const Napi::CallbackInfo &info)
333
+ {
334
+ Napi::Env env = info.Env();
335
+ int length = info.Length();
336
+
337
+ if (length < 1 || !info[0].IsNumber())
338
+ {
339
+ Napi::TypeError::New(env, "We expect (Number) as param").ThrowAsJavaScriptException();
340
+ return env.Null();
341
+ }
342
+
343
+ uint32_t ssrc = static_cast<uint32_t>(info[0].As<Napi::Number>().ToNumber());
344
+
345
+ return Napi::Boolean::New(env, mAudioPtr->hasSSRC(ssrc));
346
+ }
347
+
348
+ Napi::Value AudioWrapper::getSSRCs(const Napi::CallbackInfo &info)
349
+ {
350
+ Napi::Env env = info.Env();
351
+
352
+ auto list = mAudioPtr->getSSRCs();
353
+
354
+ Napi::Uint32Array napiArr = Napi::Uint32Array::New(env, list.size());
355
+ for (size_t i = 0; i < list.size(); i++)
356
+ napiArr[i] = list[i];
357
+
358
+ return napiArr;
359
+ }
360
+
361
+ Napi::Value AudioWrapper::getCNameForSsrc(const Napi::CallbackInfo &info)
362
+ {
363
+ Napi::Env env = info.Env();
364
+ int length = info.Length();
365
+
366
+ if (length < 1 || !info[0].IsNumber())
367
+ {
368
+ Napi::TypeError::New(env, "We expect (Number) as param").ThrowAsJavaScriptException();
369
+ return env.Null();
370
+ }
371
+
372
+ uint32_t ssrc = static_cast<uint32_t>(info[0].As<Napi::Number>().ToNumber());
373
+
374
+ std::optional<std::string> name = mAudioPtr->getCNameForSsrc(ssrc);
375
+
376
+ if (!name.has_value())
377
+ return env.Null();
378
+
379
+ return Napi::String::New(env, name.value());
380
+ }
381
+
382
+ void AudioWrapper::setBitrate(const Napi::CallbackInfo &info)
383
+ {
384
+ Napi::Env env = info.Env();
385
+ int length = info.Length();
386
+
387
+ if (length < 1 || !info[0].IsNumber())
388
+ {
389
+ Napi::TypeError::New(env, "We expect (Number) as param").ThrowAsJavaScriptException();
390
+ return;
391
+ }
392
+
393
+ int bitRate = static_cast<int>(info[0].As<Napi::Number>().ToNumber());
394
+
395
+ mAudioPtr->setBitrate(bitRate);
396
+ }
397
+
398
+ Napi::Value AudioWrapper::getBitrate(const Napi::CallbackInfo &info)
399
+ {
400
+
401
+ return Napi::Number::New(info.Env(), mAudioPtr->getBitrate());
402
+ }
403
+
404
+ Napi::Value AudioWrapper::hasPayloadType(const Napi::CallbackInfo &info)
405
+ {
406
+ Napi::Env env = info.Env();
407
+ int length = info.Length();
408
+
409
+ if (length < 1 || !info[0].IsNumber())
410
+ {
411
+ Napi::TypeError::New(env, "We expect (Number) as param").ThrowAsJavaScriptException();
412
+ return env.Null();
413
+ }
414
+
415
+ int payloadType = static_cast<int>(info[0].As<Napi::Number>().ToNumber());
416
+
417
+ return Napi::Boolean::New(env, mAudioPtr->hasPayloadType(payloadType));
418
+ }
419
+
420
+ void AudioWrapper::addRTXCodec(const Napi::CallbackInfo &info)
421
+ {
422
+ Napi::Env env = info.Env();
423
+ int length = info.Length();
424
+
425
+ if (length < 3 || !info[0].IsNumber() || !info[1].IsNumber() || !info[2].IsNumber())
426
+ {
427
+ Napi::TypeError::New(env, "We expect (Number,Number,Number) as param").ThrowAsJavaScriptException();
428
+ return;
429
+ }
430
+
431
+ unsigned int payloadType = static_cast<unsigned int>(info[0].As<Napi::Number>().ToNumber());
432
+ unsigned int originalPayloadType = static_cast<unsigned int>(info[1].As<Napi::Number>().ToNumber());
433
+ unsigned int clockRate = static_cast<unsigned int>(info[2].As<Napi::Number>().ToNumber());
434
+
435
+ mAudioPtr->addRTXCodec(payloadType, originalPayloadType, clockRate);
436
+ }
437
+
438
+ void AudioWrapper::addRTPMap(const Napi::CallbackInfo &info)
439
+ {
440
+ // mAudioPtr->addRTPMap()
441
+ }
442
+
443
+ void AudioWrapper::parseSdpLine(const Napi::CallbackInfo &info)
444
+ {
445
+ Napi::Env env = info.Env();
446
+ int length = info.Length();
447
+
448
+ if (length < 1 || !info[0].IsString())
449
+ {
450
+ Napi::TypeError::New(env, "We expect (String) as param").ThrowAsJavaScriptException();
451
+ return;
452
+ }
453
+
454
+ std::string line = info[0].As<Napi::String>().ToString();
455
+
456
+ mAudioPtr->parseSdpLine(line);
457
+ }
@@ -0,0 +1,54 @@
1
+ #ifndef MEDIA_AUDIO_WRAPPER_H
2
+ #define MEDIA_AUDIO_WRAPPER_H
3
+
4
+ #include <unordered_set>
5
+
6
+ #include <napi.h>
7
+ #include <rtc/rtc.hpp>
8
+
9
+ #include "thread-safe-callback.h"
10
+
11
+ class AudioWrapper : public Napi::ObjectWrap<AudioWrapper>
12
+ {
13
+ public:
14
+ static Napi::FunctionReference constructor;
15
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
16
+ AudioWrapper(const Napi::CallbackInfo &info);
17
+ ~AudioWrapper();
18
+
19
+ rtc::Description::Audio getAudioInstance();
20
+
21
+ // Functions
22
+ void addAudioCodec(const Napi::CallbackInfo &info);
23
+ void addOpusCodec(const Napi::CallbackInfo &info);
24
+
25
+ // class Entry
26
+ Napi::Value direction(const Napi::CallbackInfo &info);
27
+ Napi::Value generateSdp(const Napi::CallbackInfo &info);
28
+ Napi::Value mid(const Napi::CallbackInfo &info);
29
+ void setDirection(const Napi::CallbackInfo &info);
30
+
31
+ // class Media
32
+ Napi::Value description(const Napi::CallbackInfo &info);
33
+ void removeFormat(const Napi::CallbackInfo &info);
34
+ void addSSRC(const Napi::CallbackInfo &info);
35
+ void removeSSRC(const Napi::CallbackInfo &info);
36
+ void replaceSSRC(const Napi::CallbackInfo &info);
37
+ Napi::Value hasSSRC(const Napi::CallbackInfo &info);
38
+ Napi::Value getSSRCs(const Napi::CallbackInfo &info);
39
+ Napi::Value getCNameForSsrc(const Napi::CallbackInfo &info);
40
+ void setBitrate(const Napi::CallbackInfo &info);
41
+ Napi::Value getBitrate(const Napi::CallbackInfo &info);
42
+ Napi::Value hasPayloadType(const Napi::CallbackInfo &info);
43
+ void addRTXCodec(const Napi::CallbackInfo &info);
44
+ void addRTPMap(const Napi::CallbackInfo &info);
45
+ void parseSdpLine(const Napi::CallbackInfo &info);
46
+
47
+ // Callbacks
48
+
49
+ private:
50
+ static std::unordered_set<AudioWrapper *> instances;
51
+ std::shared_ptr<rtc::Description::Audio> mAudioPtr = nullptr;
52
+ };
53
+
54
+ #endif // MEDIA_AUDIO_WRAPPER_H
@@ -0,0 +1,43 @@
1
+ #include "media-direction.h"
2
+
3
+ rtc::Description::Direction strToDirection(const std::string dirAsStr)
4
+ {
5
+ rtc::Description::Direction dir = rtc::Description::Direction::Unknown;
6
+
7
+ if (dirAsStr == "SendOnly")
8
+ dir = rtc::Description::Direction::SendOnly;
9
+ if (dirAsStr == "SendRecv")
10
+ dir = rtc::Description::Direction::SendRecv;
11
+ if (dirAsStr == "RecvOnly")
12
+ dir = rtc::Description::Direction::RecvOnly;
13
+ if (dirAsStr == "Inactive")
14
+ dir = rtc::Description::Direction::Inactive;
15
+
16
+ return dir;
17
+ }
18
+
19
+ std::string directionToStr(rtc::Description::Direction dir)
20
+ {
21
+ std::string dirAsStr;
22
+ switch (dir)
23
+ {
24
+ case rtc::Description::Direction::Unknown:
25
+ dirAsStr = "Unknown";
26
+ break;
27
+ case rtc::Description::Direction::SendOnly:
28
+ dirAsStr = "SendOnly";
29
+ break;
30
+ case rtc::Description::Direction::RecvOnly:
31
+ dirAsStr = "RecvOnly";
32
+ break;
33
+ case rtc::Description::Direction::SendRecv:
34
+ dirAsStr = "SendRecv";
35
+ break;
36
+ case rtc::Description::Direction::Inactive:
37
+ dirAsStr = "Inactive";
38
+ break;
39
+ default:
40
+ dirAsStr = "UNKNOWN_DIR_TYPE";
41
+ }
42
+ return dirAsStr;
43
+ }
@@ -0,0 +1,10 @@
1
+ #ifndef MEDIA_DIRECTION_H
2
+ #define MEDIA_DIRECTION_H
3
+
4
+ #include <napi.h>
5
+ #include <rtc/rtc.hpp>
6
+
7
+ rtc::Description::Direction strToDirection(const std::string dirAsStr);
8
+ std::string directionToStr(rtc::Description::Direction dir);
9
+
10
+ #endif // MEDIA_DIRECTION_H
@@ -0,0 +1,63 @@
1
+ #include "media-rtcpreceivingsession-wrapper.h"
2
+
3
+ Napi::FunctionReference RtcpReceivingSessionWrapper::constructor;
4
+ std::unordered_set<RtcpReceivingSessionWrapper *> RtcpReceivingSessionWrapper::instances;
5
+
6
+ Napi::Object RtcpReceivingSessionWrapper::Init(Napi::Env env, Napi::Object exports)
7
+ {
8
+ Napi::HandleScope scope(env);
9
+
10
+ Napi::Function func = Napi::ObjectWrap<RtcpReceivingSessionWrapper>::DefineClass(
11
+ env,
12
+ "RtcpReceivingSession",
13
+ {
14
+ Napi::ObjectWrap<RtcpReceivingSessionWrapper>::InstanceMethod("requestBitrate", &RtcpReceivingSessionWrapper::requestBitrate),
15
+ Napi::ObjectWrap<RtcpReceivingSessionWrapper>::InstanceMethod("requestKeyframe", &RtcpReceivingSessionWrapper::requestKeyframe),
16
+ });
17
+
18
+ constructor = Napi::Persistent(func);
19
+ constructor.SuppressDestruct();
20
+
21
+ exports.Set("RtcpReceivingSession", func);
22
+ return exports;
23
+ }
24
+
25
+ RtcpReceivingSessionWrapper::RtcpReceivingSessionWrapper(const Napi::CallbackInfo &info) : Napi::ObjectWrap<RtcpReceivingSessionWrapper>(info)
26
+ {
27
+ Napi::Env env = info.Env();
28
+ mSessionPtr = std::make_unique<rtc::RtcpReceivingSession>();
29
+ instances.insert(this);
30
+ }
31
+
32
+ RtcpReceivingSessionWrapper::~RtcpReceivingSessionWrapper()
33
+ {
34
+ mSessionPtr.reset();
35
+ instances.erase(this);
36
+ }
37
+
38
+ std::shared_ptr<rtc::RtcpReceivingSession> RtcpReceivingSessionWrapper::getSessionInstance()
39
+ {
40
+ return mSessionPtr;
41
+ }
42
+
43
+ void RtcpReceivingSessionWrapper::requestBitrate(const Napi::CallbackInfo &info)
44
+ {
45
+ Napi::Env env = info.Env();
46
+ int length = info.Length();
47
+
48
+ if (length < 1 || !info[0].IsNumber())
49
+ {
50
+ Napi::TypeError::New(env, "We expect (Number) as param").ThrowAsJavaScriptException();
51
+ return;
52
+ }
53
+
54
+ unsigned int bitRate = static_cast<unsigned int>(info[0].As<Napi::Number>().ToNumber());
55
+
56
+ mSessionPtr->requestBitrate(bitRate);
57
+ }
58
+
59
+ Napi::Value RtcpReceivingSessionWrapper::requestKeyframe(const Napi::CallbackInfo &info)
60
+ {
61
+ Napi::Env env = info.Env();
62
+ return Napi::Boolean::New(env, mSessionPtr->requestKeyframe());
63
+ }
@@ -0,0 +1,36 @@
1
+ #ifndef MEDIA_RTCPRECEIVINGSESSION_WRAPPER_H
2
+ #define MEDIA_RTCPRECEIVINGSESSION_WRAPPER_H
3
+
4
+ #include <iostream>
5
+ #include <string>
6
+ #include <variant>
7
+ #include <memory>
8
+ #include <unordered_set>
9
+
10
+ #include <napi.h>
11
+ #include <rtc/rtc.hpp>
12
+
13
+ #include "thread-safe-callback.h"
14
+
15
+ class RtcpReceivingSessionWrapper : public Napi::ObjectWrap<RtcpReceivingSessionWrapper>
16
+ {
17
+ public:
18
+ static Napi::FunctionReference constructor;
19
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
20
+ RtcpReceivingSessionWrapper(const Napi::CallbackInfo &info);
21
+ ~RtcpReceivingSessionWrapper();
22
+ std::shared_ptr<rtc::RtcpReceivingSession> getSessionInstance();
23
+
24
+ // Functions
25
+ void requestBitrate(const Napi::CallbackInfo &info);
26
+ Napi::Value requestKeyframe(const Napi::CallbackInfo &info);
27
+
28
+ // Callbacks
29
+
30
+
31
+ private:
32
+ static std::unordered_set<RtcpReceivingSessionWrapper*> instances;
33
+ std::shared_ptr<rtc::RtcpReceivingSession> mSessionPtr = nullptr;
34
+ };
35
+
36
+ #endif // MEDIA_RTCPRECEIVINGSESSION_WRAPPER_H