@@ -726,7 +726,7 @@ class RTCSession extends EventManager implements Owner {
726726 /**
727727 * Terminate the call.
728728 */
729- void terminate ([Map <String , dynamic >? options]) {
729+ void terminate ([Map <String , dynamic >? options]) async {
730730 logger.d ('terminate()' );
731731
732732 options = options ?? < String , dynamic > {};
@@ -844,6 +844,9 @@ class RTCSession extends EventManager implements Owner {
844844 }
845845 });
846846
847+ //write call statistics to the log
848+ await _logCallStat ();
849+
847850 _ended (
848851 Originator .local,
849852 null ,
@@ -863,6 +866,10 @@ class RTCSession extends EventManager implements Owner {
863866 < String , dynamic > {'extraHeaders' : extraHeaders, 'body' : body});
864867 reason_phrase = reason_phrase ?? 'Terminated by local' ;
865868 status_code = status_code ?? 200 ;
869+
870+ //write call statistics to the log
871+ await _logCallStat ();
872+
866873 _ended (
867874 Originator .local,
868875 null ,
@@ -1359,6 +1366,10 @@ class RTCSession extends EventManager implements Owner {
13591366 case SipMethod .BYE :
13601367 if (_state == RtcSessionState .confirmed) {
13611368 request.reply (200 );
1369+
1370+ //write call statistics to the log
1371+ await _logCallStat ();
1372+
13621373 _ended (
13631374 Originator .remote,
13641375 request,
@@ -1369,6 +1380,10 @@ class RTCSession extends EventManager implements Owner {
13691380 } else if (_state == RtcSessionState .inviteReceived) {
13701381 request.reply (200 );
13711382 _request.reply (487 , 'BYE Received' );
1383+
1384+ //write call statistics to the log
1385+ await _logCallStat ();
1386+
13721387 _ended (
13731388 Originator .remote,
13741389 request,
@@ -3442,4 +3457,53 @@ class RTCSession extends EventManager implements Owner {
34423457 logger.d ('emit "unmuted"' );
34433458 emit (EventCallUnmuted (session: this , audio: audio, video: video));
34443459 }
3460+
3461+ Future <void > _logCallStat () async {
3462+ if (! ua.configuration.log_call_statistics) return ;
3463+
3464+ try {
3465+ List <RTCRtpSender >? senders = await connection? .senders;
3466+ List <RTCRtpReceiver >? receivers = await connection? .receivers;
3467+
3468+ RTCRtpReceiver ? receiver = receivers? .firstOrNull;
3469+ RTCRtpSender ? sender = senders? .firstOrNull;
3470+
3471+ List <StatsReport > senderStats = < StatsReport > [];
3472+ List <StatsReport > receiverStats = < StatsReport > [];
3473+
3474+ if (sender != null ) {
3475+ senderStats = await sender.getStats ();
3476+ }
3477+
3478+ if (receiver != null ) {
3479+ receiverStats = await receiver.getStats ();
3480+ }
3481+
3482+ String senderStat = 'Sender stats: \n ' ;
3483+
3484+ for (StatsReport s in senderStats) {
3485+ senderStat += ' ${s .timestamp } ${s .id } ${s .type }:\n ' ;
3486+ s.values.forEach ((key, value) {
3487+ senderStat += ' $key : $value \n ' ;
3488+ });
3489+ senderStat += '\r ' ;
3490+ }
3491+
3492+ logger.d (senderStat);
3493+
3494+ String receiverStat = 'Receiver stats: \n ' ;
3495+
3496+ for (StatsReport s in receiverStats) {
3497+ receiverStat += ' ${s .timestamp } ${s .id } ${s .type }\n ' ;
3498+ s.values.forEach ((key, value) {
3499+ receiverStat += ' $key : $value \n ' ;
3500+ });
3501+ receiverStat += '\r ' ;
3502+ }
3503+
3504+ logger.d (receiverStat);
3505+ } catch (e) {
3506+ return ;
3507+ }
3508+ }
34453509}
0 commit comments