@@ -726,7 +726,7 @@ class RTCSession extends EventManager implements Owner {
726
726
/**
727
727
* Terminate the call.
728
728
*/
729
- void terminate ([Map <String , dynamic >? options]) {
729
+ void terminate ([Map <String , dynamic >? options]) async {
730
730
logger.d ('terminate()' );
731
731
732
732
options = options ?? < String , dynamic > {};
@@ -844,6 +844,9 @@ class RTCSession extends EventManager implements Owner {
844
844
}
845
845
});
846
846
847
+ //write call statistics to the log
848
+ await _logCallStat ();
849
+
847
850
_ended (
848
851
Originator .local,
849
852
null ,
@@ -863,6 +866,10 @@ class RTCSession extends EventManager implements Owner {
863
866
< String , dynamic > {'extraHeaders' : extraHeaders, 'body' : body});
864
867
reason_phrase = reason_phrase ?? 'Terminated by local' ;
865
868
status_code = status_code ?? 200 ;
869
+
870
+ //write call statistics to the log
871
+ await _logCallStat ();
872
+
866
873
_ended (
867
874
Originator .local,
868
875
null ,
@@ -1359,6 +1366,10 @@ class RTCSession extends EventManager implements Owner {
1359
1366
case SipMethod .BYE :
1360
1367
if (_state == RtcSessionState .confirmed) {
1361
1368
request.reply (200 );
1369
+
1370
+ //write call statistics to the log
1371
+ await _logCallStat ();
1372
+
1362
1373
_ended (
1363
1374
Originator .remote,
1364
1375
request,
@@ -1369,6 +1380,10 @@ class RTCSession extends EventManager implements Owner {
1369
1380
} else if (_state == RtcSessionState .inviteReceived) {
1370
1381
request.reply (200 );
1371
1382
_request.reply (487 , 'BYE Received' );
1383
+
1384
+ //write call statistics to the log
1385
+ await _logCallStat ();
1386
+
1372
1387
_ended (
1373
1388
Originator .remote,
1374
1389
request,
@@ -3442,4 +3457,53 @@ class RTCSession extends EventManager implements Owner {
3442
3457
logger.d ('emit "unmuted"' );
3443
3458
emit (EventCallUnmuted (session: this , audio: audio, video: video));
3444
3459
}
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
+ }
3445
3509
}
0 commit comments