From cbe1dd506a37642bc8d3b18d599d2d6b2f8142ee Mon Sep 17 00:00:00 2001 From: Emmanuel Schmidbauer Date: Thu, 15 May 2025 08:54:38 -0400 Subject: [PATCH] session-timers fix --- lib/src/rtc_session.dart | 27 ++++++++++++++------------- lib/src/sip_ua_helper.dart | 13 +++++++++++-- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/lib/src/rtc_session.dart b/lib/src/rtc_session.dart index ac7c1cae..d156e85f 100644 --- a/lib/src/rtc_session.dart +++ b/lib/src/rtc_session.dart @@ -3281,19 +3281,20 @@ class RTCSession extends EventManager implements Owner { // I'm the refresher. if (_sessionTimers.refresher) { - _sessionTimers.timer = setTimeout(() { - if (_state == RtcSessionState.terminated) { - return; - } - - logger.d('runSessionTimer() | sending session refresh request'); - - if (_sessionTimers.refreshMethod == SipMethod.UPDATE) { - _sendUpdate(); - } else { - _sendReinvite(); - } - }, expires! * 500); // Half the given interval (as the RFC states). + final int delayMs = expires! * 500; + _sessionTimers.timer = Timer.periodic( + Duration(milliseconds: delayMs), + (_) { + if (_state == RtcSessionState.terminated) return; + logger.d( + 'runSessionTimer() | sending session refresh request with expires=$expires, delayMs=$delayMs'); + if (_sessionTimers.refreshMethod == SipMethod.UPDATE) { + _sendUpdate(); + } else { + _sendReinvite(); + } + }, + ); } // I'm not the refresher. else { diff --git a/lib/src/sip_ua_helper.dart b/lib/src/sip_ua_helper.dart index 288d5e60..28920915 100644 --- a/lib/src/sip_ua_helper.dart +++ b/lib/src/sip_ua_helper.dart @@ -182,7 +182,7 @@ class SIPUAHelper extends EventManager { _settings.session_timers = uaSettings.sessionTimers; _settings.ice_gathering_timeout = uaSettings.iceGatheringTimeout; _settings.session_timers_refresh_method = - uaSettings.sessionTimersRefreshMethod; + uaSettings.sessionTimersRefreshMethodEnum; _settings.instance_id = uaSettings.instanceId; _settings.registrar_server = uaSettings.registrarServer; _settings.contact_uri = uaSettings.contact_uri != null @@ -921,5 +921,14 @@ class UaSettings { /// Controls which kind of messages are to be sent to keep a SIP session /// alive. /// Defaults to "UPDATE" - DartSIP_C.SipMethod sessionTimersRefreshMethod = DartSIP_C.SipMethod.UPDATE; + String sessionTimersRefreshMethod = 'UPDATE'; + DartSIP_C.SipMethod get sessionTimersRefreshMethodEnum { + switch (sessionTimersRefreshMethod.toUpperCase()) { + case 'INVITE': + return DartSIP_C.SipMethod.INVITE; + case 'UPDATE': + default: + return DartSIP_C.SipMethod.UPDATE; + } + } }