Skip to content

Commit 495a644

Browse files
committed
Fix getStats.
1 parent ef84bc0 commit 495a644

File tree

7 files changed

+69
-17
lines changed

7 files changed

+69
-17
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Changelog
22

33
--------------------------------------------
4+
0.2.1
5+
6+
* Fix getStats.
7+
48
0.2.0
59

610
* Implement basic functions.

lib/src/rtc_peerconnection.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class RTCPeerConnectionJs {
119119
external List<RTCRtpTransceiver> getTransceivers();
120120
external RTCRtpTransceiver addTransceiver(
121121
dynamic trackOrKind, RTCRtpTransceiverInit init);
122-
external Map<String, RTCStats> getStats();
122+
external RTCStatsReportJs getStats();
123123
external void restartIce();
124124
external RTCDTMFSender createDTMFSender();
125125
external set onaddstream(Function(MediaStreamEvent stream) func);
@@ -176,7 +176,15 @@ class RTCPeerConnection {
176176
return RTCSessionDescription(type: desc.type, sdp: desc.sdp);
177177
}
178178

179-
Map<String, RTCStats> getStats() => _internal.getStats();
179+
Future<RTCStatsReport> getStats() async {
180+
try {
181+
var jsStats =
182+
await promiseToFuture<RTCStatsReportJs>(_internal.getStats());
183+
return RTCStatsReport(jsStats);
184+
} catch (e) {
185+
rethrow;
186+
}
187+
}
180188

181189
List<MediaStreamJs> getLocalStreams() => _internal.getLocalStreams();
182190

lib/src/rtc_rtp_receiver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ class RTCRtpReceiver {
1212
external factory RTCRtpReceiver();
1313
external MediaStreamTrack get track;
1414
external RTCRtpEncodingParameters getParameters();
15-
external RTCStatsReport getStats();
15+
external RTCStatsReportJs getStats();
1616
external static dynamic getCapabilities();
1717
}

lib/src/rtc_rtp_sender.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'media_stream.dart';
77
import 'media_stream_track.dart';
88
import 'rtc_dtmf_sender.dart';
99
import 'rtc_rtp_parameters.dart';
10+
import 'rtc_stats_resport.dart';
1011

1112
@JS('RTCRtpSender')
1213
class RTCRtpSender {
@@ -15,7 +16,7 @@ class RTCRtpSender {
1516
external RTCDTMFSender get dtmf;
1617
external RTCRtpEncodingParameters getParameters();
1718
external bool setParameters(RTCRtpEncodingParameters parameters);
18-
external dynamic getStats();
19+
external RTCStatsReportJs getStats();
1920
external void setStreams(List<MediaStream> streams);
2021
external void replaceTrack(MediaStreamTrack track);
2122
external static dynamic getCapabilities();

lib/src/rtc_stats_resport.dart

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,57 @@
11
@JS()
22
library dart_webrtc;
33

4-
import 'dart:collection';
4+
import 'dart:convert';
55

66
import 'package:js/js.dart';
77

8-
@JS('RTCStats')
9-
abstract class RTCStats extends Object {
10-
external dynamic get timestamp;
11-
external String get type;
12-
external String get id;
8+
class RTCStats {
9+
RTCStats({this.type, this.id, this.timestamp, this.values});
10+
factory RTCStats.fromMap(Map<String, dynamic> map) => RTCStats(
11+
id: map['id'],
12+
type: map['type'],
13+
timestamp: map['timestamp'],
14+
values: map);
15+
String type;
16+
17+
String id;
18+
19+
dynamic timestamp;
20+
21+
List<String> names() => values.entries.map((e) => e.key).toList();
22+
23+
Map<String, dynamic> values;
24+
}
25+
26+
class RTCStatsReport {
27+
RTCStatsReport(this._jsStats) {
28+
_jsStats.forEach(allowInterop((dynamic value, String key, dynamic array) {
29+
_stats[key] = RTCStats.fromMap(statsToMap(value));
30+
}));
31+
}
32+
final RTCStatsReportJs _jsStats;
33+
Map<String, RTCStats> _stats = {};
34+
35+
int get size => _jsStats.size;
36+
37+
RTCStats operator [](String key) => _stats[key];
38+
39+
List<String> keys() => _stats.entries.map((e) => e.key).toList();
40+
41+
Map<String, RTCStats> get values => _stats;
1342
}
1443

1544
@JS('RTCStatsReport')
16-
abstract class RTCStatsReport extends ListBase<RTCStats> {
45+
abstract class RTCStatsReportJs {
1746
external int get size;
47+
external void forEach(
48+
void Function(dynamic stats, String key, dynamic _) func);
1849
}
50+
51+
// Calls invoke JavaScript `JSON.stringify(obj)`.
52+
@JS('JSON.stringify')
53+
external String stringify(Object obj);
54+
final JsonDecoder decoder = JsonDecoder();
55+
56+
Map<String, dynamic> statsToMap(dynamic stats) =>
57+
decoder.convert(stringify(stats));

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: dart_webrtc
22
description: Use the dart/js library to re-wrap the webrtc js interface of the browser, to adapted common browsers.
3-
version: 0.2.0
3+
version: 0.2.1
44
homepage: https://github.com/flutter-webrtc/dart-webrtc
55

66
environment:

web/test_peerconnection.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ void addStateCallbacks(RTCPeerConnection pc, String title) {
3535
'$title: ontrack => ${event.track.id}, \nkind => ${event.track.kind}\nstream.length => ${event.streams.length}');
3636
var params = event.receiver.getParameters();
3737
print('reducedSize => ${params.rtcp.reducedSize}');
38-
var stats =
39-
await promiseToFuture<RTCStatsReport>(event.receiver.getStats());
38+
var stats = RTCStatsReport(
39+
await promiseToFuture<RTCStatsReportJs>(event.receiver.getStats()));
4040
print('getStats => ');
41-
stats.forEach((RTCStats report) {
41+
stats.values.forEach((String key, RTCStats stats) {
4242
print(
43-
' type => ${report.type}, id => ${report.id}, timestamp => ${report.timestamp}');
44-
print(' report => ${report.toString()}');
43+
' type => ${stats.type}, id => ${stats.id}, timestamp => ${stats.timestamp}');
44+
print(' report => ${stats.values.toString()}');
4545
});
4646
};
4747
}

0 commit comments

Comments
 (0)