From 4d579cf8b3180628153155831e1b626a9681a2b3 Mon Sep 17 00:00:00 2001 From: cruizba Date: Sun, 13 Feb 2022 19:33:41 +0100 Subject: [PATCH] openvidu: Add OPENVIDU_WEBRTC_ICE_SERVERS configuration paramater --- openvidu-browser/src/OpenVidu/Session.ts | 2 + .../server/config/OpenviduConfig.java | 53 ++++++++++++++++++- .../server/rest/SessionRestController.java | 5 ++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/openvidu-browser/src/OpenVidu/Session.ts b/openvidu-browser/src/OpenVidu/Session.ts index cdd4da7c..5479400e 100644 --- a/openvidu-browser/src/OpenVidu/Session.ts +++ b/openvidu-browser/src/OpenVidu/Session.ts @@ -1516,9 +1516,11 @@ export class Session extends EventDispatcher { let rtcIceServer: RTCIceServer = { urls: [ iceServer.url ] } + logger.log("STUN/TURN server IP: " + iceServer.url); if (iceServer.username != null && iceServer.credential != null) { rtcIceServer.username = iceServer.username; rtcIceServer.credential = iceServer.credential; + logger.log('TURN credentials [' + iceServer.username + ':' + iceServer.credential + ']'); } this.openvidu.iceServers.push(rtcIceServer); } diff --git a/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java b/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java index e4cccc2f..d143691c 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java +++ b/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java @@ -38,6 +38,7 @@ import java.util.Map.Entry; import javax.annotation.PostConstruct; +import io.openvidu.java.client.IceServerProperties; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.validator.routines.DomainValidator; @@ -220,10 +221,12 @@ public class OpenviduConfig { private MediaServer mediaServerInfo = MediaServer.kurento; - // Media properties + // Webrtc properties private boolean webrtcSimulcast = false; + private List webrtcIceServers; + // Plain config properties getters public String getCoturnDatabaseDbname() { @@ -290,6 +293,10 @@ public class OpenviduConfig { return this.webrtcSimulcast; } + public List getWebrtcIceServers() { + return webrtcIceServers; + } + public String getOpenViduRecordingPath() { return this.openviduRecordingPath; } @@ -619,6 +626,8 @@ public class OpenviduConfig { checkCertificateType(); + webrtcIceServers = loadWebrtcIceServers("OPENVIDU_WEBRTC_ICE_SERVERS"); + } private void checkCertificateType() { @@ -1147,4 +1156,46 @@ public class OpenviduConfig { } } + private List loadWebrtcIceServers(String property) { + String rawIceServers = asOptionalString(property); + List webrtcIceServers = new ArrayList<>(); + if (rawIceServers == null || rawIceServers.isEmpty()) { + return webrtcIceServers; + } + List arrayIceServers = asJsonStringsArray(property); + for (String iceServerString : arrayIceServers) { + try { + IceServerProperties iceServerProperties = readIceServer(property, iceServerString); + webrtcIceServers.add(iceServerProperties); + } catch (Exception e) { + addError(property, iceServerString + " is not a valid webrtc ice server: " + e.getMessage()); + } + } + return webrtcIceServers; + } + + private IceServerProperties readIceServer(String property, String iceServerString) { + String url = null, username = null, credential = null; + String[] iceServerPropList = iceServerString.split(","); + for (String iceServerProp: iceServerPropList) { + String[] iceServerPropEntry = iceServerProp.split("="); + if (iceServerPropEntry.length == 2) { + if (iceServerProp.startsWith("url=")) { + url = iceServerPropEntry[1]; + } else if (iceServerProp.startsWith("username=")) { + username = iceServerPropEntry[1]; + } else if (iceServerProp.startsWith("credential=")) { + credential = iceServerPropEntry[1]; + } else { + addError(property, "Wrong parameter: " + iceServerProp); + } + } else { + addError(property, "Wrong parameter: " + iceServerProp); + } + } + IceServerProperties iceServerProperties = new IceServerProperties.Builder() + .url(url).username(username).credential(credential).build(); + return iceServerProperties; + } + } diff --git a/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java b/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java index 1e3bc555..121ed0dd 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java +++ b/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java @@ -934,6 +934,11 @@ public class SessionRestController { } catch (Exception e) { throw new Exception("Type error in some parameter of 'customIceServers': " + e.getMessage()); } + } else if(!openviduConfig.getWebrtcIceServers().isEmpty()){ + // If not defined in connection, check if defined in openvidu config + for (IceServerProperties iceServerProperties: openviduConfig.getWebrtcIceServers()) { + builder.addCustomIceServer(iceServerProperties); + } } // Build WEBRTC options