mediasoup 3.9.4 → 3.9.5
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/node/lib/Worker.js +1 -1
- package/node/lib/index.d.ts +1 -1
- package/node/lib/index.js +1 -1
- package/package.json +3 -3
- package/worker/Makefile +28 -14
- package/worker/include/RTC/IceServer.hpp +7 -5
- package/worker/include/RTC/StunPacket.hpp +24 -5
- package/worker/meson.build +8 -0
- package/worker/src/RTC/IceServer.cpp +93 -33
- package/worker/src/RTC/StunPacket.cpp +17 -0
- package/worker/src/RTC/WebRtcTransport.cpp +1 -2
- package/worker/subprojects/libuv.wrap +7 -7
package/node/lib/Worker.js
CHANGED
|
@@ -81,7 +81,7 @@ class Worker extends EnhancedEventEmitter_1.EnhancedEventEmitter {
|
|
|
81
81
|
// options
|
|
82
82
|
{
|
|
83
83
|
env: {
|
|
84
|
-
MEDIASOUP_VERSION: '3.9.
|
|
84
|
+
MEDIASOUP_VERSION: '3.9.5',
|
|
85
85
|
// Let the worker process inherit all environment variables, useful
|
|
86
86
|
// if a custom and not in the path GCC is used so the user can set
|
|
87
87
|
// LD_LIBRARY_PATH environment variable for runtime.
|
package/node/lib/index.d.ts
CHANGED
package/node/lib/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mediasoup",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.5",
|
|
4
4
|
"description": "Cutting Edge WebRTC Video Conferencing",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"Iñaki Baz Castillo <ibc@aliax.net> (https://inakibaz.me)",
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
"@types/debug": "^4.1.7",
|
|
81
81
|
"@types/random-number": "^0.0.1",
|
|
82
82
|
"@types/uuid": "^8.3.4",
|
|
83
|
-
"@typescript-eslint/eslint-plugin": "^5.9.
|
|
84
|
-
"@typescript-eslint/parser": "^5.9.
|
|
83
|
+
"@typescript-eslint/eslint-plugin": "^5.9.1",
|
|
84
|
+
"@typescript-eslint/parser": "^5.9.1",
|
|
85
85
|
"eslint": "^8.6.0",
|
|
86
86
|
"eslint-plugin-jest": "^25.3.4",
|
|
87
87
|
"jest": "^27.4.7",
|
package/worker/Makefile
CHANGED
|
@@ -12,6 +12,7 @@ GULP = ./scripts/node_modules/.bin/gulp
|
|
|
12
12
|
LCOV = ./deps/lcov/bin/lcov
|
|
13
13
|
DOCKER ?= docker
|
|
14
14
|
PIP_DIR = $(MEDIASOUP_OUT_DIR)/pip
|
|
15
|
+
INSTALL_DIR ?= $(MEDIASOUP_OUT_DIR)/$(MEDIASOUP_BUILDTYPE)
|
|
15
16
|
BUILD_DIR ?= $(MEDIASOUP_OUT_DIR)/$(MEDIASOUP_BUILDTYPE)/build
|
|
16
17
|
MESON ?= $(PIP_DIR)/bin/meson
|
|
17
18
|
MESON_ARGS ?= ""
|
|
@@ -71,6 +72,9 @@ setup: meson-ninja
|
|
|
71
72
|
# https://github.com/ninja-build/ninja/issues/1997
|
|
72
73
|
ifeq ($(MEDIASOUP_BUILDTYPE),Release)
|
|
73
74
|
$(MESON) setup \
|
|
75
|
+
--prefix $(INSTALL_DIR) \
|
|
76
|
+
--bindir '' \
|
|
77
|
+
--libdir '' \
|
|
74
78
|
--buildtype release \
|
|
75
79
|
-Db_ndebug=true \
|
|
76
80
|
-Db_pie=true \
|
|
@@ -79,6 +83,9 @@ ifeq ($(MEDIASOUP_BUILDTYPE),Release)
|
|
|
79
83
|
$(MESON_ARGS) \
|
|
80
84
|
$(BUILD_DIR) || \
|
|
81
85
|
$(MESON) setup \
|
|
86
|
+
--prefix $(INSTALL_DIR) \
|
|
87
|
+
--bindir '' \
|
|
88
|
+
--libdir '' \
|
|
82
89
|
--buildtype release \
|
|
83
90
|
-Db_ndebug=true \
|
|
84
91
|
-Db_pie=true \
|
|
@@ -88,6 +95,9 @@ ifeq ($(MEDIASOUP_BUILDTYPE),Release)
|
|
|
88
95
|
else
|
|
89
96
|
ifeq ($(MEDIASOUP_BUILDTYPE),Debug)
|
|
90
97
|
$(MESON) setup \
|
|
98
|
+
--prefix $(INSTALL_DIR) \
|
|
99
|
+
--bindir '' \
|
|
100
|
+
--libdir '' \
|
|
91
101
|
--buildtype debug \
|
|
92
102
|
-Db_pie=true \
|
|
93
103
|
-Db_staticpic=true \
|
|
@@ -95,6 +105,9 @@ ifeq ($(MEDIASOUP_BUILDTYPE),Debug)
|
|
|
95
105
|
$(MESON_ARGS) \
|
|
96
106
|
$(BUILD_DIR) || \
|
|
97
107
|
$(MESON) setup \
|
|
108
|
+
--prefix $(INSTALL_DIR) \
|
|
109
|
+
--bindir '' \
|
|
110
|
+
--libdir '' \
|
|
98
111
|
--buildtype debug \
|
|
99
112
|
-Db_pie=true \
|
|
100
113
|
-Db_staticpic=true \
|
|
@@ -102,6 +115,9 @@ ifeq ($(MEDIASOUP_BUILDTYPE),Debug)
|
|
|
102
115
|
$(BUILD_DIR)
|
|
103
116
|
else
|
|
104
117
|
$(MESON) setup \
|
|
118
|
+
--prefix $(INSTALL_DIR) \
|
|
119
|
+
--bindir '' \
|
|
120
|
+
--libdir '' \
|
|
105
121
|
--buildtype $(MEDIASOUP_BUILDTYPE) \
|
|
106
122
|
-Db_ndebug=if-release \
|
|
107
123
|
-Db_pie=true \
|
|
@@ -110,6 +126,9 @@ else
|
|
|
110
126
|
$(MESON_ARGS) \
|
|
111
127
|
$(BUILD_DIR) || \
|
|
112
128
|
$(MESON) setup \
|
|
129
|
+
--prefix $(INSTALL_DIR) \
|
|
130
|
+
--bindir '' \
|
|
131
|
+
--libdir '' \
|
|
113
132
|
--buildtype $(MEDIASOUP_BUILDTYPE) \
|
|
114
133
|
-Db_ndebug=if-release \
|
|
115
134
|
-Db_pie=true \
|
|
@@ -120,7 +139,7 @@ endif
|
|
|
120
139
|
endif
|
|
121
140
|
|
|
122
141
|
clean:
|
|
123
|
-
$(RM) -rf $(
|
|
142
|
+
$(RM) -rf $(INSTALL_DIR)
|
|
124
143
|
|
|
125
144
|
clean-build:
|
|
126
145
|
$(RM) -rf $(BUILD_DIR)
|
|
@@ -136,12 +155,8 @@ clean-all: clean-subprojects
|
|
|
136
155
|
|
|
137
156
|
mediasoup-worker: setup
|
|
138
157
|
ifeq ($(MEDIASOUP_WORKER_BIN),)
|
|
139
|
-
$(MESON) compile -
|
|
140
|
-
|
|
141
|
-
ifeq ($(OS),Windows_NT)
|
|
142
|
-
cp $(BUILD_DIR)/mediasoup-worker.exe $(MEDIASOUP_OUT_DIR)/$(MEDIASOUP_BUILDTYPE)/mediasoup-worker.exe
|
|
143
|
-
else
|
|
144
|
-
cp $(BUILD_DIR)/mediasoup-worker $(MEDIASOUP_OUT_DIR)/$(MEDIASOUP_BUILDTYPE)/mediasoup-worker
|
|
158
|
+
$(MESON) compile -C $(BUILD_DIR) -j $(CORES) mediasoup-worker
|
|
159
|
+
$(MESON) install -C $(BUILD_DIR) --no-rebuild --tags mediasoup-worker
|
|
145
160
|
endif
|
|
146
161
|
|
|
147
162
|
xcode: setup
|
|
@@ -154,8 +169,8 @@ format:
|
|
|
154
169
|
$(GULP) --gulpfile ./scripts/gulpfile.js format:worker
|
|
155
170
|
|
|
156
171
|
test: setup
|
|
157
|
-
|
|
158
|
-
$(MESON)
|
|
172
|
+
$(MESON) compile -C $(BUILD_DIR) -j $(CORES) mediasoup-worker-test
|
|
173
|
+
$(MESON) install -C $(BUILD_DIR) --no-rebuild --tags mediasoup-worker-test
|
|
159
174
|
# On Windows lcov doesn't work (at least not yet) and we need to add `.exe` to
|
|
160
175
|
# the binary path.
|
|
161
176
|
ifeq ($(OS),Windows_NT)
|
|
@@ -164,7 +179,6 @@ else
|
|
|
164
179
|
$(LCOV) --directory ./ --zerocounters
|
|
165
180
|
$(BUILD_DIR)/mediasoup-worker-test --invisibles --use-colour=yes $(MEDIASOUP_TEST_TAGS)
|
|
166
181
|
endif
|
|
167
|
-
endif
|
|
168
182
|
|
|
169
183
|
tidy:
|
|
170
184
|
$(PYTHON) ./scripts/clang-tidy.py \
|
|
@@ -177,9 +191,8 @@ tidy:
|
|
|
177
191
|
-quiet
|
|
178
192
|
|
|
179
193
|
fuzzer: setup
|
|
180
|
-
|
|
181
|
-
$(MESON)
|
|
182
|
-
endif
|
|
194
|
+
$(MESON) compile -C $(BUILD_DIR) -j $(CORES) mediasoup-worker-fuzzer
|
|
195
|
+
$(MESON) install -C $(BUILD_DIR) --no-rebuild --tags mediasoup-worker-fuzzer
|
|
183
196
|
|
|
184
197
|
fuzzer-run-all:
|
|
185
198
|
LSAN_OPTIONS=verbosity=1:log_threads=1 ./$(BUILD_DIR)/mediasoup-worker-fuzzer -artifact_prefix=fuzzer/reports/ -max_len=1400 fuzzer/new-corpus deps/webrtc-fuzzer-corpora/corpora/stun-corpus deps/webrtc-fuzzer-corpora/corpora/rtp-corpus deps/webrtc-fuzzer-corpora/corpora/rtcp-corpus
|
|
@@ -200,4 +213,5 @@ docker-run:
|
|
|
200
213
|
mediasoup/docker:latest
|
|
201
214
|
|
|
202
215
|
libmediasoup-worker: setup
|
|
203
|
-
$(MESON) compile -
|
|
216
|
+
$(MESON) compile -C $(BUILD_DIR) -j $(CORES) libmediasoup-worker
|
|
217
|
+
$(MESON) install -C $(BUILD_DIR) --no-rebuild --tags libmediasoup-worker
|
|
@@ -61,15 +61,15 @@ namespace RTC
|
|
|
61
61
|
{
|
|
62
62
|
return this->selectedTuple;
|
|
63
63
|
}
|
|
64
|
-
void
|
|
64
|
+
void RestartIce(const std::string& usernameFragment, const std::string& password)
|
|
65
65
|
{
|
|
66
66
|
this->oldUsernameFragment = this->usernameFragment;
|
|
67
67
|
this->usernameFragment = usernameFragment;
|
|
68
|
-
|
|
69
|
-
void SetPassword(const std::string& password)
|
|
70
|
-
{
|
|
68
|
+
|
|
71
69
|
this->oldPassword = this->password;
|
|
72
70
|
this->password = password;
|
|
71
|
+
|
|
72
|
+
this->remoteNomination = 0u;
|
|
73
73
|
}
|
|
74
74
|
bool IsValidTuple(const RTC::TransportTuple* tuple) const;
|
|
75
75
|
void RemoveTuple(RTC::TransportTuple* tuple);
|
|
@@ -78,7 +78,8 @@ namespace RTC
|
|
|
78
78
|
void ForceSelectedTuple(const RTC::TransportTuple* tuple);
|
|
79
79
|
|
|
80
80
|
private:
|
|
81
|
-
void HandleTuple(
|
|
81
|
+
void HandleTuple(
|
|
82
|
+
RTC::TransportTuple* tuple, bool hasUseCandidate, bool hasNomination, uint32_t nomination);
|
|
82
83
|
/**
|
|
83
84
|
* Store the given tuple and return its stored address.
|
|
84
85
|
*/
|
|
@@ -101,6 +102,7 @@ namespace RTC
|
|
|
101
102
|
std::string password;
|
|
102
103
|
std::string oldUsernameFragment;
|
|
103
104
|
std::string oldPassword;
|
|
105
|
+
uint32_t remoteNomination{ 0u };
|
|
104
106
|
IceState state{ IceState::NEW };
|
|
105
107
|
std::list<RTC::TransportTuple> tuples;
|
|
106
108
|
RTC::TransportTuple* selectedTuple{ nullptr };
|
|
@@ -41,7 +41,8 @@ namespace RTC
|
|
|
41
41
|
ALTERNATE_SERVER = 0x8023,
|
|
42
42
|
FINGERPRINT = 0x8028,
|
|
43
43
|
ICE_CONTROLLED = 0x8029,
|
|
44
|
-
ICE_CONTROLLING = 0x802A
|
|
44
|
+
ICE_CONTROLLING = 0x802A,
|
|
45
|
+
NOMINATION = 0xC001
|
|
45
46
|
};
|
|
46
47
|
|
|
47
48
|
// Authentication result.
|
|
@@ -114,6 +115,10 @@ namespace RTC
|
|
|
114
115
|
{
|
|
115
116
|
this->hasUseCandidate = true;
|
|
116
117
|
}
|
|
118
|
+
void SetNomination(uint32_t nomination)
|
|
119
|
+
{
|
|
120
|
+
this->nomination = nomination;
|
|
121
|
+
}
|
|
117
122
|
void SetXorMappedAddress(const struct sockaddr* xorMappedAddress)
|
|
118
123
|
{
|
|
119
124
|
this->xorMappedAddress = xorMappedAddress;
|
|
@@ -150,6 +155,18 @@ namespace RTC
|
|
|
150
155
|
{
|
|
151
156
|
return this->hasUseCandidate;
|
|
152
157
|
}
|
|
158
|
+
void SetHasNomination()
|
|
159
|
+
{
|
|
160
|
+
this->hasNomination = true;
|
|
161
|
+
}
|
|
162
|
+
bool HasNomination() const
|
|
163
|
+
{
|
|
164
|
+
return this->hasNomination;
|
|
165
|
+
}
|
|
166
|
+
uint32_t GetNomination() const
|
|
167
|
+
{
|
|
168
|
+
return this->nomination;
|
|
169
|
+
}
|
|
153
170
|
uint16_t GetErrorCode() const
|
|
154
171
|
{
|
|
155
172
|
return this->errorCode;
|
|
@@ -177,10 +194,12 @@ namespace RTC
|
|
|
177
194
|
uint8_t* data{ nullptr }; // Pointer to binary data.
|
|
178
195
|
size_t size{ 0u }; // The full message size (including header).
|
|
179
196
|
// STUN attributes.
|
|
180
|
-
std::string username;
|
|
181
|
-
uint32_t priority{ 0u };
|
|
182
|
-
uint64_t iceControlling{ 0u };
|
|
183
|
-
uint64_t iceControlled{ 0u };
|
|
197
|
+
std::string username; // Less than 513 bytes.
|
|
198
|
+
uint32_t priority{ 0u }; // 4 bytes unsigned integer.
|
|
199
|
+
uint64_t iceControlling{ 0u }; // 8 bytes unsigned integer.
|
|
200
|
+
uint64_t iceControlled{ 0u }; // 8 bytes unsigned integer.
|
|
201
|
+
bool hasNomination{ false };
|
|
202
|
+
uint32_t nomination{ 0u }; // 4 bytes unsigned integer.
|
|
184
203
|
bool hasUseCandidate{ false }; // 0 bytes.
|
|
185
204
|
const uint8_t* messageIntegrity{ nullptr }; // 20 bytes.
|
|
186
205
|
bool hasFingerprint{ false }; // 4 bytes.
|
package/worker/meson.build
CHANGED
|
@@ -233,6 +233,8 @@ libmediasoup_worker = library(
|
|
|
233
233
|
'libmediasoup-worker',
|
|
234
234
|
name_prefix: '',
|
|
235
235
|
build_by_default: false,
|
|
236
|
+
install: true,
|
|
237
|
+
install_tag: 'libmediasoup-worker',
|
|
236
238
|
dependencies: dependencies,
|
|
237
239
|
sources: common_sources,
|
|
238
240
|
include_directories: include_directories('include'),
|
|
@@ -243,6 +245,8 @@ libmediasoup_worker = library(
|
|
|
243
245
|
executable(
|
|
244
246
|
'mediasoup-worker',
|
|
245
247
|
build_by_default: true,
|
|
248
|
+
install: true,
|
|
249
|
+
install_tag: 'mediasoup-worker',
|
|
246
250
|
dependencies: dependencies,
|
|
247
251
|
sources: common_sources + ['src/main.cpp'],
|
|
248
252
|
include_directories: include_directories('include'),
|
|
@@ -252,6 +256,8 @@ executable(
|
|
|
252
256
|
mediasoup_worker_test = executable(
|
|
253
257
|
'mediasoup-worker-test',
|
|
254
258
|
build_by_default: false,
|
|
259
|
+
install: true,
|
|
260
|
+
install_tag: 'mediasoup-worker-test',
|
|
255
261
|
dependencies: dependencies + [
|
|
256
262
|
catch2_proj.get_variable('catch2_dep'),
|
|
257
263
|
],
|
|
@@ -314,6 +320,8 @@ if host_machine.system() == 'linux'
|
|
|
314
320
|
executable(
|
|
315
321
|
'mediasoup-worker-fuzzer',
|
|
316
322
|
build_by_default: false,
|
|
323
|
+
install: true,
|
|
324
|
+
install_tag: 'mediasoup-worker-fuzzer',
|
|
317
325
|
dependencies: dependencies,
|
|
318
326
|
sources: common_sources + [
|
|
319
327
|
'fuzzer/src/fuzzer.cpp',
|
|
@@ -198,8 +198,13 @@ namespace RTC
|
|
|
198
198
|
|
|
199
199
|
delete response;
|
|
200
200
|
|
|
201
|
+
uint32_t nomination{ 0u };
|
|
202
|
+
|
|
203
|
+
if (packet->HasNomination())
|
|
204
|
+
nomination = packet->GetNomination();
|
|
205
|
+
|
|
201
206
|
// Handle the tuple.
|
|
202
|
-
HandleTuple(tuple, packet->HasUseCandidate());
|
|
207
|
+
HandleTuple(tuple, packet->HasUseCandidate(), packet->HasNomination(), nomination);
|
|
203
208
|
|
|
204
209
|
break;
|
|
205
210
|
}
|
|
@@ -301,7 +306,8 @@ namespace RTC
|
|
|
301
306
|
SetSelectedTuple(storedTuple);
|
|
302
307
|
}
|
|
303
308
|
|
|
304
|
-
void IceServer::HandleTuple(
|
|
309
|
+
void IceServer::HandleTuple(
|
|
310
|
+
RTC::TransportTuple* tuple, bool hasUseCandidate, bool hasNomination, uint32_t nomination)
|
|
305
311
|
{
|
|
306
312
|
MS_TRACE();
|
|
307
313
|
|
|
@@ -316,9 +322,15 @@ namespace RTC
|
|
|
316
322
|
// There shouldn't be a selected tuple.
|
|
317
323
|
MS_ASSERT(!this->selectedTuple, "state is 'new' but there is selected tuple");
|
|
318
324
|
|
|
319
|
-
if (!hasUseCandidate)
|
|
325
|
+
if (!hasUseCandidate && !hasNomination)
|
|
320
326
|
{
|
|
321
|
-
MS_DEBUG_TAG(
|
|
327
|
+
MS_DEBUG_TAG(
|
|
328
|
+
ice,
|
|
329
|
+
"transition from state 'new' to 'connected' [hasUseCandidate:%s, hasNomination:%s, nomination:%" PRIu32
|
|
330
|
+
"]",
|
|
331
|
+
hasUseCandidate ? "true" : "false",
|
|
332
|
+
hasNomination ? "true" : "false",
|
|
333
|
+
nomination);
|
|
322
334
|
|
|
323
335
|
// Store the tuple.
|
|
324
336
|
auto* storedTuple = AddTuple(tuple);
|
|
@@ -332,17 +344,29 @@ namespace RTC
|
|
|
332
344
|
}
|
|
333
345
|
else
|
|
334
346
|
{
|
|
335
|
-
MS_DEBUG_TAG(ice, "transition from state 'new' to 'completed'");
|
|
336
|
-
|
|
337
347
|
// Store the tuple.
|
|
338
348
|
auto* storedTuple = AddTuple(tuple);
|
|
339
349
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
350
|
+
if ((hasNomination && nomination > this->remoteNomination) || !hasNomination)
|
|
351
|
+
{
|
|
352
|
+
MS_DEBUG_TAG(
|
|
353
|
+
ice,
|
|
354
|
+
"transition from state 'new' to 'completed' [hasUseCandidate:%s, hasNomination:%s, nomination:%" PRIu32
|
|
355
|
+
"]",
|
|
356
|
+
hasUseCandidate ? "true" : "false",
|
|
357
|
+
hasNomination ? "true" : "false",
|
|
358
|
+
nomination);
|
|
359
|
+
|
|
360
|
+
// Mark it as selected tuple.
|
|
361
|
+
SetSelectedTuple(storedTuple);
|
|
362
|
+
// Update state.
|
|
363
|
+
this->state = IceState::COMPLETED;
|
|
364
|
+
// Update nomination.
|
|
365
|
+
if (hasNomination && nomination > this->remoteNomination)
|
|
366
|
+
this->remoteNomination = nomination;
|
|
367
|
+
// Notify the listener.
|
|
368
|
+
this->listener->OnIceServerCompleted(this);
|
|
369
|
+
}
|
|
346
370
|
}
|
|
347
371
|
|
|
348
372
|
break;
|
|
@@ -359,9 +383,15 @@ namespace RTC
|
|
|
359
383
|
// There shouldn't be a selected tuple.
|
|
360
384
|
MS_ASSERT(!this->selectedTuple, "state is 'disconnected' but there is selected tuple");
|
|
361
385
|
|
|
362
|
-
if (!hasUseCandidate)
|
|
386
|
+
if (!hasUseCandidate && !hasNomination)
|
|
363
387
|
{
|
|
364
|
-
MS_DEBUG_TAG(
|
|
388
|
+
MS_DEBUG_TAG(
|
|
389
|
+
ice,
|
|
390
|
+
"transition from state 'disconnected' to 'connected' [hasUseCandidate:%s, hasNomination:%s, nomination:%" PRIu32
|
|
391
|
+
"]",
|
|
392
|
+
hasUseCandidate ? "true" : "false",
|
|
393
|
+
hasNomination ? "true" : "false",
|
|
394
|
+
nomination);
|
|
365
395
|
|
|
366
396
|
// Store the tuple.
|
|
367
397
|
auto* storedTuple = AddTuple(tuple);
|
|
@@ -375,17 +405,29 @@ namespace RTC
|
|
|
375
405
|
}
|
|
376
406
|
else
|
|
377
407
|
{
|
|
378
|
-
MS_DEBUG_TAG(ice, "transition from state 'disconnected' to 'completed'");
|
|
379
|
-
|
|
380
408
|
// Store the tuple.
|
|
381
409
|
auto* storedTuple = AddTuple(tuple);
|
|
382
410
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
411
|
+
if ((hasNomination && nomination > this->remoteNomination) || !hasNomination)
|
|
412
|
+
{
|
|
413
|
+
MS_DEBUG_TAG(
|
|
414
|
+
ice,
|
|
415
|
+
"transition from state 'disconnected' to 'completed' [hasUseCandidate:%s, hasNomination:%s, nomination:%" PRIu32
|
|
416
|
+
"]",
|
|
417
|
+
hasUseCandidate ? "true" : "false",
|
|
418
|
+
hasNomination ? "true" : "false",
|
|
419
|
+
nomination);
|
|
420
|
+
|
|
421
|
+
// Mark it as selected tuple.
|
|
422
|
+
SetSelectedTuple(storedTuple);
|
|
423
|
+
// Update state.
|
|
424
|
+
this->state = IceState::COMPLETED;
|
|
425
|
+
// Update nomination.
|
|
426
|
+
if (hasNomination && nomination > this->remoteNomination)
|
|
427
|
+
this->remoteNomination = nomination;
|
|
428
|
+
// Notify the listener.
|
|
429
|
+
this->listener->OnIceServerCompleted(this);
|
|
430
|
+
}
|
|
389
431
|
}
|
|
390
432
|
|
|
391
433
|
break;
|
|
@@ -399,7 +441,7 @@ namespace RTC
|
|
|
399
441
|
// There should be a selected tuple.
|
|
400
442
|
MS_ASSERT(this->selectedTuple, "state is 'connected' but there is not selected tuple");
|
|
401
443
|
|
|
402
|
-
if (!hasUseCandidate)
|
|
444
|
+
if (!hasUseCandidate && !hasNomination)
|
|
403
445
|
{
|
|
404
446
|
// If a new tuple store it.
|
|
405
447
|
if (!HasTuple(tuple))
|
|
@@ -407,7 +449,13 @@ namespace RTC
|
|
|
407
449
|
}
|
|
408
450
|
else
|
|
409
451
|
{
|
|
410
|
-
MS_DEBUG_TAG(
|
|
452
|
+
MS_DEBUG_TAG(
|
|
453
|
+
ice,
|
|
454
|
+
"transition from state 'connected' to 'completed' [hasUseCandidate:%s, hasNomination:%s, nomination:%" PRIu32
|
|
455
|
+
"]",
|
|
456
|
+
hasUseCandidate ? "true" : "false",
|
|
457
|
+
hasNomination ? "true" : "false",
|
|
458
|
+
nomination);
|
|
411
459
|
|
|
412
460
|
auto* storedTuple = HasTuple(tuple);
|
|
413
461
|
|
|
@@ -415,12 +463,18 @@ namespace RTC
|
|
|
415
463
|
if (!storedTuple)
|
|
416
464
|
storedTuple = AddTuple(tuple);
|
|
417
465
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
466
|
+
if ((hasNomination && nomination > this->remoteNomination) || !hasNomination)
|
|
467
|
+
{
|
|
468
|
+
// Mark it as selected tuple.
|
|
469
|
+
SetSelectedTuple(storedTuple);
|
|
470
|
+
// Update state.
|
|
471
|
+
this->state = IceState::COMPLETED;
|
|
472
|
+
// Update nomination.
|
|
473
|
+
if (hasNomination && nomination > this->remoteNomination)
|
|
474
|
+
this->remoteNomination = nomination;
|
|
475
|
+
// Notify the listener.
|
|
476
|
+
this->listener->OnIceServerCompleted(this);
|
|
477
|
+
}
|
|
424
478
|
}
|
|
425
479
|
|
|
426
480
|
break;
|
|
@@ -434,7 +488,7 @@ namespace RTC
|
|
|
434
488
|
// There should be a selected tuple.
|
|
435
489
|
MS_ASSERT(this->selectedTuple, "state is 'completed' but there is not selected tuple");
|
|
436
490
|
|
|
437
|
-
if (!hasUseCandidate)
|
|
491
|
+
if (!hasUseCandidate && !hasNomination)
|
|
438
492
|
{
|
|
439
493
|
// If a new tuple store it.
|
|
440
494
|
if (!HasTuple(tuple))
|
|
@@ -448,8 +502,14 @@ namespace RTC
|
|
|
448
502
|
if (!storedTuple)
|
|
449
503
|
storedTuple = AddTuple(tuple);
|
|
450
504
|
|
|
451
|
-
|
|
452
|
-
|
|
505
|
+
if ((hasNomination && nomination > this->remoteNomination) || !hasNomination)
|
|
506
|
+
{
|
|
507
|
+
// Mark it as selected tuple.
|
|
508
|
+
SetSelectedTuple(storedTuple);
|
|
509
|
+
// Update nomination.
|
|
510
|
+
if (hasNomination && nomination > this->remoteNomination)
|
|
511
|
+
this->remoteNomination = nomination;
|
|
512
|
+
}
|
|
453
513
|
}
|
|
454
514
|
|
|
455
515
|
break;
|
|
@@ -209,6 +209,23 @@ namespace RTC
|
|
|
209
209
|
break;
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
case Attribute::NOMINATION:
|
|
213
|
+
{
|
|
214
|
+
// Ensure attribute length is 4 bytes.
|
|
215
|
+
if (attrLength != 4)
|
|
216
|
+
{
|
|
217
|
+
MS_WARN_TAG(ice, "attribute NOMINATION must be 4 bytes length, packet discarded");
|
|
218
|
+
|
|
219
|
+
delete packet;
|
|
220
|
+
return nullptr;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
packet->SetHasNomination();
|
|
224
|
+
packet->SetNomination(Utils::Byte::Get4Bytes(attrValuePos, 0));
|
|
225
|
+
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
|
|
212
229
|
case Attribute::MESSAGE_INTEGRITY:
|
|
213
230
|
{
|
|
214
231
|
// Ensure attribute length is 20 bytes.
|
|
@@ -585,8 +585,7 @@ namespace RTC
|
|
|
585
585
|
std::string usernameFragment = Utils::Crypto::GetRandomString(16);
|
|
586
586
|
std::string password = Utils::Crypto::GetRandomString(32);
|
|
587
587
|
|
|
588
|
-
this->iceServer->
|
|
589
|
-
this->iceServer->SetPassword(password);
|
|
588
|
+
this->iceServer->RestartIce(usernameFragment, password);
|
|
590
589
|
|
|
591
590
|
MS_DEBUG_DEV(
|
|
592
591
|
"WebRtcTransport ICE usernameFragment and password changed [id:%s]", this->id.c_str());
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
[wrap-file]
|
|
2
|
-
directory = libuv-v1.
|
|
3
|
-
source_url = https://dist.libuv.org/dist/v1.
|
|
4
|
-
source_filename = libuv-v1.
|
|
5
|
-
source_hash =
|
|
6
|
-
patch_filename = libuv_1.
|
|
7
|
-
patch_url = https://wrapdb.mesonbuild.com/v2/libuv_1.
|
|
8
|
-
patch_hash =
|
|
2
|
+
directory = libuv-v1.43.0
|
|
3
|
+
source_url = https://dist.libuv.org/dist/v1.43.0/libuv-v1.43.0.tar.gz
|
|
4
|
+
source_filename = libuv-v1.43.0.tar.gz
|
|
5
|
+
source_hash = 90d72bb7ae18de2519d0cac70eb89c319351146b90cd3f91303a492707e693a4
|
|
6
|
+
patch_filename = libuv_1.43.0-1_patch.zip
|
|
7
|
+
patch_url = https://wrapdb.mesonbuild.com/v2/libuv_1.43.0-1/get_patch
|
|
8
|
+
patch_hash = 9bd241c95110c67f9486f1a77a988216bf5ec192dc3002651a6ccefb2e6aba5a
|
|
9
9
|
|
|
10
10
|
[provide]
|
|
11
11
|
libuv = libuv_dep
|