From 63439cd206aaf3548228e915bd1744389cd2fc54 Mon Sep 17 00:00:00 2001 From: Alexandre Jousset Date: Sun, 12 Nov 2023 13:58:01 +0100 Subject: XEP-0215: management of the field `expires` Add a field in `Xmpp.Xep.ExternalServiceDiscovery` to keep track of the `expires` TURN service value and use it (divided by 2) to restart periodically the external services discovery. --- plugins/ice/src/plugin.vala | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'plugins/ice') diff --git a/plugins/ice/src/plugin.vala b/plugins/ice/src/plugin.vala index ec4fe9cb..17090d26 100644 --- a/plugins/ice/src/plugin.vala +++ b/plugins/ice/src/plugin.vala @@ -22,10 +22,10 @@ public class Dino.Plugins.Ice.Plugin : RootInterface, Object { stream.get_module(JingleRawUdp.Module.IDENTITY).set_local_ip_address_handler(get_local_ip_addresses); } }); - app.stream_interactor.stream_negotiated.connect(on_stream_negotiated); + app.stream_interactor.stream_negotiated.connect(external_discovery_refresh_services); } - private async void on_stream_negotiated(Account account, XmppStream stream) { + private async void external_discovery_refresh_services(Account account, XmppStream stream) { Module? ice_udp_module = stream.get_module(JingleIceUdp.Module.IDENTITY) as Module; if (ice_udp_module == null) return; Gee.List services = yield ExternalServiceDiscovery.request_services(stream); @@ -59,6 +59,21 @@ public class Dino.Plugins.Ice.Plugin : RootInterface, Object { ice_udp_module.stun_ip = ip.to_string(); ice_udp_module.stun_port = 7886; } + + if (ice_udp_module.turn_service != null) { + DateTime? expires = ice_udp_module.turn_service.expires; + if (expires != null) { + uint delay = (uint) (expires.to_unix() - new DateTime.now_utc().to_unix()) / 2; + + debug("Next server external service discovery in %us (because of TURN credentials' expiring time)", delay); + + Timeout.add_seconds(delay, () => { + if (app.stream_interactor.connection_manager.get_state(account) != ConnectionManager.ConnectionState.CONNECTED) return false; + on_stream_negotiated.begin(account, stream); + return false; + }); + } + } } public void shutdown() { -- cgit v1.2.3-70-g09d2