diff --git a/.changes/ping-rtt-tracking b/.changes/ping-rtt-tracking new file mode 100644 index 000000000..d180f4b30 --- /dev/null +++ b/.changes/ping-rtt-tracking @@ -0,0 +1 @@ +patch type="fixed" "Add signal RTT tracking via pingReq/pongResp" diff --git a/lib/src/core/signal_client.dart b/lib/src/core/signal_client.dart index 49c39a527..f579ea13e 100644 --- a/lib/src/core/signal_client.dart +++ b/lib/src/core/signal_client.dart @@ -53,8 +53,11 @@ class SignalClient extends Disposable with EventsEmittable { Timer? _pingIntervalTimer; int get pingCount => _pingCount; - int _pingCount = 0; + + /// Signal round-trip time in milliseconds, calculated from pingReq/pongResp. + int get rtt => _rtt; + int _rtt = 0; String? participantSid; int _requestId = 0; @@ -345,6 +348,11 @@ class SignalClient extends Disposable with EventsEmittable { _pingCount++; _resetPingTimeout(); break; + case lk_rtc.SignalResponse_Message.pongResp: + _rtt = DateTime.timestamp().millisecondsSinceEpoch - msg.pongResp.lastPingTimestamp.toInt(); + _pingCount++; + _resetPingTimeout(); + break; case lk_rtc.SignalResponse_Message.reconnect: events.emit(SignalReconnectResponseEvent(response: msg.reconnect)); break; @@ -379,7 +387,14 @@ class SignalClient extends Disposable with EventsEmittable { } void _sendPing() { - _sendRequest(lk_rtc.SignalRequest()..ping = Int64(DateTime.timestamp().millisecondsSinceEpoch)); + final now = DateTime.timestamp().millisecondsSinceEpoch; + // Send both ping and pingReq for compatibility with old and new servers + _sendRequest(lk_rtc.SignalRequest()..ping = Int64(now)); + _sendRequest(lk_rtc.SignalRequest() + ..pingReq = lk_rtc.Ping( + timestamp: Int64(now), + rtt: Int64(_rtt), + )); } void _startPingInterval() {