8000 feat: add getBufferedAmount for DataChannel. (#1796) · lonelyxmas/flutter-webrtc@8217678 · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 8217678

Browse files
authored
feat: add getBufferedAmount for DataChannel. (flutter-webrtc#1796)
* feat: add getBufferedAmount for DataChannel. * update. * update. * fix. * update binary for linux.
1 parent 1c2ff6f commit 8217678

File tree

16 files changed

+118
-11
lines changed

16 files changed

+118
-11
lines changed

android/src/main/java/com/cloudwebrtc/webrtc/MethodCallHandlerImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,12 @@ public void onMethodCall(MethodCall call, @NonNull Result notSafeResult) {
482482
createDataChannel(peerConnectionId, label, new ConstraintsMap(dataChannelDict), result);
483483
break;
484484
}
485+
case "dataChannelGetBufferedAmount": {
486+
String peerConnectionId = call.argument("peerConnectionId");
487+
String dataChannelId = call.argument("dataChannelId");
488+
dataChannelGetBufferedAmount(peerConnectionId, dataChannelId, result);
489+
break;
490+
}
485491
case "dataChannelSend": {
486492
String peerConnectionId = call.argument("peerConnectionId");
487493
String dataChannelId = call.argument("dataChannelId");
@@ -2039,6 +2045,17 @@ public void dataChannelSend(String peerConnectionId, String dataChannelId, ByteB
20392045
}
20402046
}
20412047

2048+
public void dataChannelGetBufferedAmount(String peerConnectionId, String dataChannelId, Result result) {
2049+
PeerConnectionObserver pco
2050+
= mPeerConnectionObservers.get(peerConnectionId);
2051+
if (pco == null || pco.getPeerConnection() == null) {
2052+
Log.d(TAG, "dataChannelGetBufferedAmount() peerConnection is null");
2053+
resultError("dataChannelGetBufferedAmount", "peerConnection is null", result);
2054+
} else {
2055+
pco.dataChannelGetBufferedAmount(dataChannelId, result);
2056+
}
2057+
}
2058+
20422059
public void dataChannelClose(String peerConnectionId, String dataChannelId) {
20432060
// Forward to PeerConnectionObserver which deals with DataChannels
20442061
// because DataChannel is owned by PeerConnection.

android/src/main/java/com/cloudwebrtc/webrtc/PeerConnectionObserver.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,18 @@ void dataChannelSend(String dataChannelId, ByteBuffer byteBuffer, Boolean isBina
168168
}
169169
}
170170

171+
void dataChannelGetBufferedAmount(String dataChannelId, Result result) {
172+
DataChannel dataChannel = dataChannels.get(dataChannelId);
173+
if (dataChannel != null) {
174+
ConstraintsMap params = new ConstraintsMap();
175+
params.putLong("bufferedAmount", dataChannel.bufferedAmount());
176+
result.success(params.toMap());
177+
} else {
178+
Log.d(TAG, "dataChannelGetBufferedAmount() dataChannel is null");
179+
resultError("dataChannelGetBufferedAmount", "DataChannel is null", result);
180+
}
181+
}
182+
171183
RtpTransceiver getRtpTransceiverById(String id) {
172184
RtpTransceiver transceiver = transceivers.get(id);
173185
if (null == transceiver) {

common/cpp/include/flutter_data_channel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ class FlutterDataChannel {
4040
const EncodableValue& data,
4141
std::unique_ptr<MethodResultProxy>);
4242

43+
void DataChannelGetBufferedAmount(RTCDataChannel* data_channel,
44+
std::unique_ptr<MethodResultProxy> result);
45+
4346
void DataChannelClose(RTCDataChannel* data_channel,
4447
const std::string& data_channel_uuid,
4548
std::unique_ptr<MethodResultProxy>);

common/cpp/src/flutter_data_channel.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,13 @@ void FlutterDataChannel::DataChannelSend(
8787
result->Success();
8888
}
8989

90+
void FlutterDataChannel::DataChannelGetBufferedAmount(RTCDataChannel* data_channel,
91+
std::unique_ptr<MethodResultProxy> result) {
92+
EncodableMap params;
93+
params[EncodableValue("bufferedAmount")] = EncodableValue((int64_t)data_channel->buffered_amount());
94+
result->Success(EncodableValue(params));
95+
}
96+
9097
void FlutterDataChannel::DataChannelClose(
9198
RTCDataChannel* data_channel,
9299
const std::string& data_channel_uuid,

common/cpp/src/flutter_webrtc.cc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,29 @@ void FlutterWebRTC::HandleMethodCall(
352352
return;
353353
}
354354
DataChannelSend(data_channel, type, data, std::move(result));
355+
} else if (method_call.method_name().compare("dataChannelGetBufferedAmount") == 0) {
356+
if (!method_call.arguments()) {
357+
result->Error("Bad Arguments", "Null constraints arguments received");
358+
return;
359+
}
360+
const EncodableMap params =
361+
GetValue<EncodableMap>(*method_call.arguments());
362+
const std::string peerConnectionId = findString(params, "peerConnectionId");
363+
RTCPeerConnection* pc = PeerConnectionForId(peerConnectionId);
364+
if (pc == nullptr) {
365+
result->Error("dataChannelGetBufferedAmountFailed",
366+
"dataChannelGetBufferedAmount() peerConnection is null");
367+
return;
368+
}
369+
370+
const std::string dataChannelId = findString(params, "dataChannelId");
371+
RTCDataChannel* data_channel = DataChannelForId(dataChannelId);
372+
if (data_channel == nullptr) {
373+
result->Error("dataChannelGetBufferedAmountFailed",
374+
"dataChannelGetBufferedAmount() data_channel is null");
375+
return;
376+
}
377+
DataChannelGetBufferedAmount(data_channel, std::move(result));
355378
} else if (method_call.method_name().compare("dataChannelClose") == 0) {
356379
if (!method_call.arguments()) {
357380
result->Error("Bad Arguments", "Null constraints arguments received");

common/darwin/Classes/FlutterRTCDataChannel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,7 @@
2424
data:(nonnull NSString*)data
2525
type:(nonnull NSString*)type;
2626

27+
- (void)dataChannelGetBufferedAmount:(nonnull NSString*)peerConnectionId
28+
dataChannelId:(nonnull NSString*)dataChannelId
29+
result:(nonnull FlutterResult)result;
2730
@end

common/darwin/Classes/FlutterRTCDataChannel.m

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,18 @@ - (void)dataChannelClose:(nonnull NSString*)peerConnectionId
118118
}
119119
}
120120

121+
- (void)dataChannelGetBufferedAmount:(nonnull NSString*)peerConnectionId
122+
dataChannelId:(nonnull NSString*)dataChannelId
123+
result:(nonnull FlutterResult)result {
124+
RTCPeerConnection* peerConnection = self.peerConnections[peerConnectionId];
125+
RTCDataChannel* dataChannel = peerConnection.dataChannels[dataChannelId];
126+
if(dataChannel == NULL || dataChannel.readyState != RTCDataChannelStateOpen) {
127+
result(@{@"bufferedAmount": @(-1)});
128+
} else {
129+
result(@{@"bufferedAmount": @(dataChannel.bufferedAmount)});
130+
}
131+
}
132+
121133
- (void)dataChannelSend:(nonnull NSString*)peerConnectionId
122134
dataChannelId:(nonnull NSString*)dataChannelId
123135
data:(id)data

common/darwin/Classes/FlutterWebRTCPlugin.m

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,14 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
570570

571571
[self dataChannelSend:peerConnectionId dataChannelId:dataChannelId data:data type:type];
572572
result(nil);
573-
} else if ([@"dataChannelClose" isEqualToString:call.method]) {
573+
} else if ([@"dataChannelGetBufferedAmount" isEqualToString:call.method]) {
574+
NSDictionary* argsMap = call.arguments;
575+
NSString* peerConnectionId = argsMap[@"peerConnectionId"];
576+
NSString* dataChannelId = argsMap[@"dataChannelId"];
577+
578+
[self dataChannelGetBufferedAmount:peerConnectionId dataChannelId:dataChannelId result:result];
579+
}
580+
else if ([@"dataChannelClose" isEqualToString:call.method]) {
574581
NSDictionary* argsMap = call.arguments;
575582
NSString* peerConnectionId = argsMap[@"peerConnectionId"];
576583
NSString* dataChannelId = argsMap[@"dataChannelId"];

example/lib/src/loopback_data_channel_sample.dart

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,14 @@ class _DataChannelLoopBackSampleState extends State<DataChannelLoopBackSample> {
4949
_dataChannel2Status += '\ndataChannel2: state: ${state.toString()}';
5050
});
5151
};
52-
_dataChannel2!.onMessage = (data) {
52+
_dataChannel2!.onMessage = (data) async {
53+
var bufferedAmount = await _dataChannel2!.getBufferedAmount();
5354
setState(() {
5455
_dataChannel2Status +=
55-
'\ndataChannel2: Received message: ${data.text}';
56+
'\ndataChannel2: Received message: ${data.text}, bufferedAmount: $bufferedAmount';
5657
});
57-
_dataChannel2!.send(RTCDataChannelMessage(
58+
59+
await _dataChannel2!.send(RTCDataChannelMessage(
5860
'(dataChannel2 ==> dataChannel1) Hello from dataChannel2 echo !!!'));
5961
};
6062
};
@@ -69,10 +71,12 @@ class _DataChannelLoopBackSampleState extends State<DataChannelLoopBackSample> {
6971
}
7072
};
7173

72-
_dataChannel1!.onMessage = (data) => setState(() {
73-
_dataChannel1Status +=
74-
'\ndataChannel1: Received message: ${data.text}';
75-
});
74+
_dataChannel1!.onMessage = (data) async {
75+
var bufferedAmount = await _dataChannel2!.getBufferedAmount();
76+
_dataChannel1Status +=
77+
'\ndataChannel1: Received message: ${data.text}, bufferedAmount: $bufferedAmount';
78+
setState(() {});
79+
};
7680

7781
var offer = await _peerConnection1!.createOffer({});
7882
print('peerConnection1 offer: ${offer.sdp}');

lib/src/native/rtc_data_channel_impl.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,17 @@ class RTCDataChannelNative extends RTCDataChannel {
109109
}
110110
}
111111

112+
@override
113+
Future<int> getBufferedAmount() async {
114+
final Map<dynamic, dynamic> response = await WebRTC.invokeMethod(
115+
'dataChannelGetBufferedAmount', <String, dynamic>{
116+
'peerConnectionId': _peerConnectionId,
117+
'dataChannelId': _flutterId
118+
});
119+
_bufferedAmount = response['bufferedAmount'];
120+
return _bufferedAmount;
121+
}
122+
112123
@override
113124
Future<void> send(RTCDataChannelMessage message) async {
114125
await WebRTC.invokeMethod('dataChannelSend', <String, dynamic>{

pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ environment:
88

99
dependencies:
1010
collection: ^1.17.0
11-
dart_webrtc: ^1.5.2+hotfix.1
11+
dart_webrtc: ^1.5.3
1212
flutter:
1313
sdk: flutter
1414
path_provider: ^2.0.2
1515
web: ^1.0.0
16-
webrtc_interface: ^1.2.1+hotfix.1
16+
webrtc_interface: ^1.2.2+hotfix.1
1717

1818
dev_dependencies:
1919
flutter_test:

third_party/libwebrtc/include/rtc_data_channel.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,13 @@ class RTCDataChannel : public RefCountInterface {
103103
*/
104104
virtual int id() const = 0;
105105

106+
/**
107+
* Returns the amount of data buffered in the data channel.
108+
*
109+
* @return uint64_t
110+
*/
111+
virtual uint64_t buffered_amount() const = 0;
112+
106113
/**
107114
* Returns the state of the data channel.
108115
*/

third_party/libwebrtc/include/rtc_ice_transport.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
#include "rtc_base/ref_count.h"
2222

2323
namespace libwebrtc {
24-
class IceTransport : public rtc::RefCountInterface {
24+
25+
class IceTransport : public RefCountInterface {
2526
public:
2627
virtual IceTransport* internal() = 0;
2728
};
-672 Bytes
Binary file not shown.
-432 Bytes
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)
0