mediasoup 3.19.0 → 3.19.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.
@@ -1 +1 @@
1
- {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"}
@@ -644,6 +644,8 @@ class RouterImpl extends enhancedEvents_1.EnhancedEventEmitter {
644
644
  }
645
645
  }
646
646
  else {
647
+ // NOTE: This cannot happen since it's guaranteed that producer or
648
+ // dataProducer exists, but TypeScript is not that smart.
647
649
  throw new Error('internal error');
648
650
  }
649
651
  }
@@ -929,3 +929,21 @@ test('router.pipeToRouter() called in two Routers passing one to each other as a
929
929
  expect(pipeTransportsA.size).toBe(0);
930
930
  expect(pipeTransportsB.size).toBe(0);
931
931
  }, 2000);
932
+ test('router.pipeToRouter() with neither producerId nor dataProducerId fails', async () => {
933
+ const router1bis = await ctx.worker1.createRouter({
934
+ mediaCodecs: ctx.mediaCodecs,
935
+ });
936
+ await expect(ctx.router1.pipeToRouter({
937
+ router: router1bis,
938
+ })).rejects.toThrow(Error);
939
+ }, 2000);
940
+ test('router.pipeToRouter() with both producerId and dataProducerId fails', async () => {
941
+ const router1bis = await ctx.worker1.createRouter({
942
+ mediaCodecs: ctx.mediaCodecs,
943
+ });
944
+ await expect(ctx.router1.pipeToRouter({
945
+ producerId: '1234',
946
+ dataProducerId: '5678',
947
+ router: router1bis,
948
+ })).rejects.toThrow(Error);
949
+ }, 2000);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mediasoup",
3
- "version": "3.19.0",
3
+ "version": "3.19.2",
4
4
  "description": "Cutting Edge WebRTC Video Conferencing",
5
5
  "contributors": [
6
6
  "Iñaki Baz Castillo <ibc@aliax.net> (https://inakibaz.me)",
@@ -100,17 +100,17 @@
100
100
  "tar": "^7.4.3"
101
101
  },
102
102
  "devDependencies": {
103
- "@eslint/js": "^9.34.0",
103
+ "@eslint/js": "^9.35.0",
104
104
  "@octokit/rest": "^22.0.0",
105
105
  "@types/debug": "^4.1.12",
106
106
  "@types/jest": "^30.0.0",
107
- "@types/node": "^24.3.0",
108
- "eslint": "^9.34.0",
107
+ "@types/node": "^24.3.1",
108
+ "eslint": "^9.35.0",
109
109
  "eslint-config-prettier": "^10.1.8",
110
110
  "eslint-plugin-jest": "^29.0.1",
111
111
  "eslint-plugin-prettier": "^5.5.4",
112
112
  "globals": "^16.3.0",
113
- "jest": "^30.1.1",
113
+ "jest": "^30.1.3",
114
114
  "marked": "^16.2.1",
115
115
  "open-cli": "^8.0.0",
116
116
  "pick-port": "^2.1.2",
@@ -118,6 +118,6 @@
118
118
  "sctp": "^1.0.0",
119
119
  "ts-jest": "^29.4.1",
120
120
  "typescript": "^5.9.2",
121
- "typescript-eslint": "^8.41.0"
121
+ "typescript-eslint": "^8.42.0"
122
122
  }
123
123
  }
@@ -9,6 +9,7 @@
9
9
  #include "handles/TimerHandle.hpp"
10
10
  #include <list>
11
11
  #include <string>
12
+ #include <unordered_map>
12
13
 
13
14
  namespace RTC
14
15
  {
@@ -23,10 +24,6 @@ namespace RTC
23
24
  DISCONNECTED,
24
25
  };
25
26
 
26
- public:
27
- static IceState RoleFromFbs(FBS::WebRtcTransport::IceState state);
28
- static FBS::WebRtcTransport::IceState IceStateToFbs(IceState state);
29
-
30
27
  public:
31
28
  class Listener
32
29
  {
@@ -54,6 +51,13 @@ namespace RTC
54
51
  virtual void OnIceServerDisconnected(const RTC::IceServer* iceServer) = 0;
55
52
  };
56
53
 
54
+ public:
55
+ static const std::string& IceStateToString(IceState iceState);
56
+ static FBS::WebRtcTransport::IceState IceStateToFbs(IceState state);
57
+
58
+ private:
59
+ static std::unordered_map<IceState, std::string> iceStateToString;
60
+
57
61
  public:
58
62
  IceServer(
59
63
  Listener* listener,
@@ -63,6 +67,7 @@ namespace RTC
63
67
  ~IceServer() override;
64
68
 
65
69
  public:
70
+ void Dump(int indentation = 0) const;
66
71
  void ProcessStunPacket(RTC::StunPacket* packet, RTC::TransportTuple* tuple);
67
72
  const std::string& GetUsernameFragment() const
68
73
  {
@@ -138,7 +143,6 @@ namespace RTC
138
143
  std::list<RTC::TransportTuple> tuples;
139
144
  RTC::TransportTuple* selectedTuple{ nullptr };
140
145
  TimerHandle* consentCheckTimer{ nullptr };
141
- uint64_t lastConsentRequestReceivedAtMs{ 0u };
142
146
  bool isRemovingTuples{ false };
143
147
  };
144
148
  } // namespace RTC
@@ -30,6 +30,8 @@ namespace RTC
30
30
  uint16_t sequenceNumber{ 0u };
31
31
  // Correct timestamp since original packet may not have the same.
32
32
  uint32_t timestamp{ 0u };
33
+ // Correct marker bit since original packet may not have the same.
34
+ bool marker{ false };
33
35
  // Last time this packet was resent.
34
36
  uint64_t resentAtMs{ 0u };
35
37
  // Number of times this packet was resent.
@@ -55,7 +55,7 @@ namespace RTC
55
55
 
56
56
  flatbuffers::Offset<FBS::Transport::Tuple> FillBuffer(flatbuffers::FlatBufferBuilder& builder) const;
57
57
 
58
- void Dump() const;
58
+ void Dump(int indentation = 0) const;
59
59
 
60
60
  void StoreUdpRemoteAddress()
61
61
  {
@@ -15,37 +15,31 @@ namespace RTC
15
15
  static constexpr uint8_t ConsentCheckMinTimeoutSec{ 10u };
16
16
  static constexpr uint8_t ConsentCheckMaxTimeoutSec{ 60u };
17
17
 
18
- /* Class methods. */
19
- IceServer::IceState IceStateFromFbs(FBS::WebRtcTransport::IceState state)
20
- {
21
- switch (state)
22
- {
23
- case FBS::WebRtcTransport::IceState::NEW:
24
- {
25
- return IceServer::IceState::NEW;
26
- }
18
+ /* Class variables. */
27
19
 
28
- case FBS::WebRtcTransport::IceState::CONNECTED:
29
- {
30
- return IceServer::IceState::CONNECTED;
31
- }
20
+ // clang-format off
21
+ std::unordered_map<IceServer::IceState, std::string> IceServer::iceStateToString =
22
+ {
23
+ { IceServer::IceState::NEW, "new" },
24
+ { IceServer::IceState::CONNECTED, "connected" },
25
+ { IceServer::IceState::COMPLETED, "completed" },
26
+ { IceServer::IceState::DISCONNECTED, "disconnected" },
27
+ };
28
+ // clang-format on
32
29
 
33
- case FBS::WebRtcTransport::IceState::COMPLETED:
34
- {
35
- return IceServer::IceState::COMPLETED;
36
- }
30
+ /* Class methods. */
37
31
 
38
- case FBS::WebRtcTransport::IceState::DISCONNECTED:
39
- {
40
- return IceServer::IceState::DISCONNECTED;
41
- }
32
+ const std::string& IceServer::IceStateToString(IceState iceState)
33
+ {
34
+ MS_TRACE();
42
35
 
43
- NO_DEFAULT_GCC();
44
- }
36
+ return IceServer::iceStateToString.at(iceState);
45
37
  }
46
38
 
47
39
  FBS::WebRtcTransport::IceState IceServer::IceStateToFbs(IceServer::IceState state)
48
40
  {
41
+ MS_TRACE();
42
+
49
43
  switch (state)
50
44
  {
51
45
  case IceServer::IceState::NEW:
@@ -152,6 +146,27 @@ namespace RTC
152
146
  this->consentCheckTimer = nullptr;
153
147
  }
154
148
 
149
+ void IceServer::Dump(int indentation) const
150
+ {
151
+ MS_TRACE();
152
+
153
+ MS_DUMP_CLEAN(indentation, "<IceServer>");
154
+ MS_DUMP_CLEAN(indentation, " state: %s", IceServer::IceStateToString(this->state).c_str());
155
+ MS_DUMP_CLEAN(indentation, " tuples:");
156
+ for (const auto& tuple : this->tuples)
157
+ {
158
+ tuple.Dump(indentation + 2);
159
+ }
160
+ if (this->selectedTuple)
161
+ {
162
+ MS_DUMP_CLEAN(indentation, " selected tuple:");
163
+ this->selectedTuple->Dump(indentation + 2);
164
+ }
165
+ MS_DUMP_CLEAN(indentation, " consent timeout (ms): %" PRIu16, this->consentTimeoutMs);
166
+ MS_DUMP_CLEAN(indentation, " remote nomination: %" PRIu32, this->remoteNomination);
167
+ MS_DUMP_CLEAN(indentation, "</IceServer>");
168
+ }
169
+
155
170
  void IceServer::ProcessStunPacket(RTC::StunPacket* packet, RTC::TransportTuple* tuple)
156
171
  {
157
172
  MS_TRACE();
@@ -587,9 +602,10 @@ namespace RTC
587
602
  else
588
603
  {
589
604
  // Store the tuple.
590
- auto* storedTuple = AddTuple(tuple);
605
+ auto* storedTuple = AddTuple(tuple);
606
+ const auto isNewNomination = hasNomination && nomination > this->remoteNomination;
591
607
 
592
- if ((hasNomination && nomination > this->remoteNomination) || !hasNomination)
608
+ if (isNewNomination || !hasNomination)
593
609
  {
594
610
  MS_DEBUG_TAG(
595
611
  ice,
@@ -606,7 +622,7 @@ namespace RTC
606
622
  SetSelectedTuple(storedTuple);
607
623
 
608
624
  // Update nomination.
609
- if (hasNomination && nomination > this->remoteNomination)
625
+ if (isNewNomination)
610
626
  {
611
627
  this->remoteNomination = nomination;
612
628
  }
@@ -649,9 +665,10 @@ namespace RTC
649
665
  else
650
666
  {
651
667
  // Store the tuple.
652
- auto* storedTuple = AddTuple(tuple);
668
+ auto* storedTuple = AddTuple(tuple);
669
+ const auto isNewNomination = hasNomination && nomination > this->remoteNomination;
653
670
 
654
- if ((hasNomination && nomination > this->remoteNomination) || !hasNomination)
671
+ if (isNewNomination || !hasNomination)
655
672
  {
656
673
  MS_DEBUG_TAG(
657
674
  ice,
@@ -668,7 +685,7 @@ namespace RTC
668
685
  SetSelectedTuple(storedTuple);
669
686
 
670
687
  // Update nomination.
671
- if (hasNomination && nomination > this->remoteNomination)
688
+ if (isNewNomination)
672
689
  {
673
690
  this->remoteNomination = nomination;
674
691
  }
@@ -705,9 +722,10 @@ namespace RTC
705
722
  nomination);
706
723
 
707
724
  // Store the tuple.
708
- auto* storedTuple = AddTuple(tuple);
725
+ auto* storedTuple = AddTuple(tuple);
726
+ const auto isNewNomination = hasNomination && nomination > this->remoteNomination;
709
727
 
710
- if ((hasNomination && nomination > this->remoteNomination) || !hasNomination)
728
+ if (isNewNomination || !hasNomination)
711
729
  {
712
730
  // Update state.
713
731
  this->state = IceState::COMPLETED;
@@ -716,7 +734,7 @@ namespace RTC
716
734
  SetSelectedTuple(storedTuple);
717
735
 
718
736
  // Update nomination.
719
- if (hasNomination && nomination > this->remoteNomination)
737
+ if (isNewNomination)
720
738
  {
721
739
  this->remoteNomination = nomination;
722
740
  }
@@ -745,17 +763,18 @@ namespace RTC
745
763
  else
746
764
  {
747
765
  // Store the tuple.
748
- auto* storedTuple = AddTuple(tuple);
766
+ auto* storedTuple = AddTuple(tuple);
767
+ const auto isNewNomination = hasNomination && nomination > this->remoteNomination;
749
768
 
750
- // When in completed state, only update selected tuple if there is ICE
751
- // nomination.
752
- if (hasNomination && nomination > this->remoteNomination)
769
+ // When in completed state, update selected tuple if there is ICE
770
+ // nomination or useCandidate.
771
+ if (isNewNomination || hasUseCandidate)
753
772
  {
754
773
  // Mark it as selected tuple.
755
774
  SetSelectedTuple(storedTuple);
756
775
 
757
776
  // Update nomination.
758
- if (hasNomination && nomination > this->remoteNomination)
777
+ if (isNewNomination)
759
778
  {
760
779
  this->remoteNomination = nomination;
761
780
  }
@@ -26,6 +26,7 @@ namespace RTC
26
26
  item->ssrc = packet->GetSsrc();
27
27
  item->sequenceNumber = packet->GetSequenceNumber();
28
28
  item->timestamp = packet->GetTimestamp();
29
+ item->marker = packet->HasMarker();
29
30
 
30
31
  return item;
31
32
  }
@@ -173,12 +173,14 @@ namespace RTC
173
173
  auto origSsrc = packet->GetSsrc();
174
174
  auto origSeq = packet->GetSequenceNumber();
175
175
  auto origTimestamp = packet->GetTimestamp();
176
+ auto origMarker = packet->HasMarker();
176
177
  std::string origMid;
177
178
 
178
179
  // Put correct info into the packet.
179
180
  packet->SetSsrc(item->ssrc);
180
181
  packet->SetSequenceNumber(item->sequenceNumber);
181
182
  packet->SetTimestamp(item->timestamp);
183
+ packet->SetMarker(item->marker);
182
184
 
183
185
  if (item->encoder != nullptr)
184
186
  {
@@ -237,6 +239,7 @@ namespace RTC
237
239
  packet->SetSsrc(origSsrc);
238
240
  packet->SetSequenceNumber(origSeq);
239
241
  packet->SetTimestamp(origTimestamp);
242
+ packet->SetMarker(origMarker);
240
243
  }
241
244
  }
242
245
 
@@ -794,10 +794,7 @@ namespace RTC
794
794
  packet->logger.sendSeqNumber = seq;
795
795
  #endif
796
796
 
797
- if (marker)
798
- {
799
- packet->SetMarker(true);
800
- }
797
+ packet->SetMarker(marker);
801
798
 
802
799
  if (isSyncPacket)
803
800
  {
@@ -90,11 +90,11 @@ namespace RTC
90
90
  protocol);
91
91
  }
92
92
 
93
- void TransportTuple::Dump() const
93
+ void TransportTuple::Dump(int indentation) const
94
94
  {
95
95
  MS_TRACE();
96
96
 
97
- MS_DUMP("<TransportTuple>");
97
+ MS_DUMP_CLEAN(indentation, "<TransportTuple>");
98
98
 
99
99
  int family;
100
100
  std::string ip;
@@ -102,32 +102,32 @@ namespace RTC
102
102
 
103
103
  Utils::IP::GetAddressInfo(GetLocalAddress(), family, ip, port);
104
104
 
105
- MS_DUMP(" localIp: %s", ip.c_str());
106
- MS_DUMP(" localPort: %" PRIu16, port);
105
+ MS_DUMP_CLEAN(indentation, " localIp: %s", ip.c_str());
106
+ MS_DUMP_CLEAN(indentation, " localPort: %" PRIu16, port);
107
107
 
108
108
  Utils::IP::GetAddressInfo(GetRemoteAddress(), family, ip, port);
109
109
 
110
- MS_DUMP(" remoteIp: %s", ip.c_str());
111
- MS_DUMP(" remotePort: %" PRIu16, port);
110
+ MS_DUMP_CLEAN(indentation, " remoteIp: %s", ip.c_str());
111
+ MS_DUMP_CLEAN(indentation, " remotePort: %" PRIu16, port);
112
112
 
113
113
  switch (GetProtocol())
114
114
  {
115
115
  case Protocol::UDP:
116
116
  {
117
- MS_DUMP(" protocol: udp");
117
+ MS_DUMP_CLEAN(indentation, " protocol: udp");
118
118
 
119
119
  break;
120
120
  }
121
121
 
122
122
  case Protocol::TCP:
123
123
  {
124
- MS_DUMP(" protocol: tcp");
124
+ MS_DUMP_CLEAN(indentation, " protocol: tcp");
125
125
 
126
126
  break;
127
127
  }
128
128
  }
129
129
 
130
- MS_DUMP("</TransportTuple>");
130
+ MS_DUMP_CLEAN(indentation, "</TransportTuple>");
131
131
  }
132
132
 
133
133
  void TransportTuple::GenerateHash()
@@ -44,11 +44,12 @@ static void SendRtpPacket(std::vector<std::pair<RtpStreamSend*, uint32_t>> strea
44
44
  }
45
45
  }
46
46
 
47
- static void CheckRtxPacket(RtpPacket* packet, uint16_t seq, uint32_t timestamp)
47
+ static void CheckRtxPacket(RtpPacket* rtxPacket, RtpPacket* origPacket)
48
48
  {
49
- REQUIRE(packet);
50
- REQUIRE(packet->GetSequenceNumber() == seq);
51
- REQUIRE(packet->GetTimestamp() == timestamp);
49
+ REQUIRE(rtxPacket);
50
+ REQUIRE(rtxPacket->GetSequenceNumber() == origPacket->GetSequenceNumber());
51
+ REQUIRE(rtxPacket->GetTimestamp() == origPacket->GetTimestamp());
52
+ REQUIRE(rtxPacket->HasMarker() == origPacket->HasMarker());
52
53
  }
53
54
 
54
55
  SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
@@ -94,12 +95,14 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
94
95
  auto packet1(CreateRtpPacket(rtpBuffer1, sizeof(rtpBuffer1), 21006, 1533790901));
95
96
  // packet2 [pt:123, seq:21007, timestamp:1533790901]
96
97
  auto packet2(CreateRtpPacket(rtpBuffer2, sizeof(rtpBuffer2), 21007, 1533790901));
98
+ packet2->SetMarker(true);
97
99
  // packet3 [pt:123, seq:21008, timestamp:1533793871]
98
100
  auto packet3(CreateRtpPacket(rtpBuffer3, sizeof(rtpBuffer3), 21008, 1533793871));
99
101
  // packet4 [pt:123, seq:21009, timestamp:1533793871]
100
102
  auto packet4(CreateRtpPacket(rtpBuffer4, sizeof(rtpBuffer4), 21009, 1533793871));
101
103
  // packet5 [pt:123, seq:21010, timestamp:1533796931]
102
104
  auto packet5(CreateRtpPacket(rtpBuffer5, sizeof(rtpBuffer5), 21010, 1533796931));
105
+ packet5->SetMarker(true);
103
106
 
104
107
  // Create a RtpStreamSend instance.
105
108
  TestRtpStreamListener testRtpStreamListener;
@@ -144,11 +147,11 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
144
147
 
145
148
  testRtpStreamListener.retransmittedPackets.clear();
146
149
 
147
- CheckRtxPacket(rtxPacket1, packet1->GetSequenceNumber(), packet1->GetTimestamp());
148
- CheckRtxPacket(rtxPacket2, packet2->GetSequenceNumber(), packet2->GetTimestamp());
149
- CheckRtxPacket(rtxPacket3, packet3->GetSequenceNumber(), packet3->GetTimestamp());
150
- CheckRtxPacket(rtxPacket4, packet4->GetSequenceNumber(), packet4->GetTimestamp());
151
- CheckRtxPacket(rtxPacket5, packet5->GetSequenceNumber(), packet5->GetTimestamp());
150
+ CheckRtxPacket(rtxPacket1, packet1.get());
151
+ CheckRtxPacket(rtxPacket2, packet2.get());
152
+ CheckRtxPacket(rtxPacket3, packet3.get());
153
+ CheckRtxPacket(rtxPacket4, packet4.get());
154
+ CheckRtxPacket(rtxPacket5, packet5.get());
152
155
  }
153
156
 
154
157
  SECTION("receive NACK and get zero retransmitted packets if useNack is not set")
@@ -306,8 +309,8 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
306
309
 
307
310
  testRtpStreamListener1.retransmittedPackets.clear();
308
311
 
309
- CheckRtxPacket(rtxPacket1, packet1->GetSequenceNumber(), packet1->GetTimestamp());
310
- CheckRtxPacket(rtxPacket2, packet2->GetSequenceNumber(), packet2->GetTimestamp());
312
+ CheckRtxPacket(rtxPacket1, packet1.get());
313
+ CheckRtxPacket(rtxPacket2, packet2.get());
311
314
 
312
315
  // Process the NACK packet on stream2.
313
316
  stream2->ReceiveNack(&nackPacket);
@@ -319,8 +322,8 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
319
322
 
320
323
  testRtpStreamListener2.retransmittedPackets.clear();
321
324
 
322
- CheckRtxPacket(rtxPacket1, packet1->GetSequenceNumber(), packet1->GetTimestamp());
323
- CheckRtxPacket(rtxPacket2, packet2->GetSequenceNumber(), packet2->GetTimestamp());
325
+ CheckRtxPacket(rtxPacket1, packet1.get());
326
+ CheckRtxPacket(rtxPacket2, packet2.get());
324
327
  }
325
328
 
326
329
  SECTION("retransmitted packets are correctly encoded")
@@ -531,8 +534,8 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
531
534
 
532
535
  testRtpStreamListener.retransmittedPackets.clear();
533
536
 
534
- CheckRtxPacket(rtxPacket1, packet1->GetSequenceNumber(), packet1->GetTimestamp());
535
- CheckRtxPacket(rtxPacket2, packet2->GetSequenceNumber(), packet2->GetTimestamp());
537
+ CheckRtxPacket(rtxPacket1, packet1.get());
538
+ CheckRtxPacket(rtxPacket2, packet2.get());
536
539
  }
537
540
 
538
541
  SECTION("packets don't get retransmitted if MaxRetransmissionDelayForVideoMs is exceeded")
@@ -585,7 +588,7 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
585
588
 
586
589
  testRtpStreamListener.retransmittedPackets.clear();
587
590
 
588
- CheckRtxPacket(rtxPacket2, packet2->GetSequenceNumber(), packet2->GetTimestamp());
591
+ CheckRtxPacket(rtxPacket2, packet2.get());
589
592
  }
590
593
 
591
594
  SECTION("packets get removed from the retransmission buffer if seq number of the stream is reset")