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

Skip to content

Commit 8217678

Browse files
authored
feat: add getBufferedAmount for DataChannel. (#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

+17
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

+12
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

+3
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

+7
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

+23
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

+3
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

+12
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

+8-1
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

+11-7
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

+11
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

+2-2
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

+7
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

+2-1
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