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