From aa914ca5d6bfd4f489e4840058bf29393b3e9f69 Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Thu, 30 Apr 2020 21:47:24 +0200 Subject: [PATCH] openvidu-server: OPENVIDU_PUBLICURL to DOMAIN_OR_PUBLIC_IP and HTTPS_PORT --- .../openvidu-server-kms/supervisord.conf | 2 +- .../io/openvidu/server/OpenViduServer.java | 37 +++++- .../server/config/OpenviduConfig.java | 124 +++++++----------- .../server/rest/ConfigRestController.java | 2 + ...itional-spring-configuration-metadata.json | 21 +-- .../application-container.properties | 1 + .../resources/application-docker.properties | 22 ---- .../src/main/resources/application.properties | 5 +- .../src/test/resources/application.properties | 8 +- .../resources/integration-test.properties | 5 +- openvidu-test-e2e/jenkins/Jenkinsfile | 4 +- .../test/e2e/OpenViduTestAppE2eTest.java | 2 +- 12 files changed, 107 insertions(+), 126 deletions(-) create mode 100644 openvidu-server/src/main/resources/application-container.properties delete mode 100644 openvidu-server/src/main/resources/application-docker.properties diff --git a/openvidu-server/docker/openvidu-server-kms/supervisord.conf b/openvidu-server/docker/openvidu-server-kms/supervisord.conf index 4287faae..5a87c5ae 100644 --- a/openvidu-server/docker/openvidu-server-kms/supervisord.conf +++ b/openvidu-server/docker/openvidu-server-kms/supervisord.conf @@ -9,5 +9,5 @@ command=/bin/bash /kms.sh redirect_stderr=true [program:openvidu-server] -command=/bin/bash -c "java -jar -Dspring.profiles.active=docker /openvidu-server.jar" +command=/bin/bash -c "java -jar -Dspring.config.additional-location=classpath:/application-container.properties /openvidu-server.jar" redirect_stderr=true diff --git a/openvidu-server/src/main/java/io/openvidu/server/OpenViduServer.java b/openvidu-server/src/main/java/io/openvidu/server/OpenViduServer.java index de9b8fa0..f879a23e 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/OpenViduServer.java +++ b/openvidu-server/src/main/java/io/openvidu/server/OpenViduServer.java @@ -86,7 +86,6 @@ public class OpenViduServer implements JsonRpcConfigurer { private static final Logger log = LoggerFactory.getLogger(OpenViduServer.class); public static final String WS_PATH = "/openvidu"; - public static String publicurlType; public static String wsUrl; public static String httpUrl; @@ -221,7 +220,32 @@ public class OpenViduServer implements JsonRpcConfigurer { public static void main(String[] args) throws Exception { - checkConfigProperties(OpenviduConfig.class); + Map CONFIG_PROPS = checkConfigProperties(OpenviduConfig.class); + + if (CONFIG_PROPS.get("SERVER_PORT") != null) { + + // Configuration property SERVER_PORT has been explicitly defined. + // Must initialize the application in that port on the host regardless of what + // HTTPS_PORT says. HTTPS_PORT does get used in the public URL. + + System.setProperty("server.port", CONFIG_PROPS.get("SERVER_PORT")); + + log.warn( + "You have set property server.port (or SERVER_PORT). This will serve OpenVidu Server on your host at port " + + CONFIG_PROPS.get("SERVER_PORT") + ". But property HTTPS_PORT (" + + CONFIG_PROPS.get("HTTPS_PORT") + + ") still configures the port that should be used to connect to OpenVidu Server from outside. " + + "Bear this in mind when configuring a proxy in front of OpenVidu Server"); + + } else if (CONFIG_PROPS.get("HTTPS_PORT") != null) { + + // Configuration property SERVER_PORT has NOT been explicitly defined. + // Must initialize the application in port HTTPS_PORT on the host. HTTPS_PORT + // does get used in the public URL as well. + + System.setProperty("server.port", CONFIG_PROPS.get("HTTPS_PORT")); + + } log.info("Using /dev/urandom for secure random generation"); System.setProperty("java.security.egd", "file:/dev/./urandom"); @@ -229,7 +253,7 @@ public class OpenViduServer implements JsonRpcConfigurer { } - public static void checkConfigProperties(Class configClass) throws InterruptedException { + public static Map checkConfigProperties(Class configClass) throws InterruptedException { ConfigurableApplicationContext app = SpringApplication.run(configClass, new String[] { "--spring.main.web-application-type=none" }); @@ -270,18 +294,21 @@ public class OpenViduServer implements JsonRpcConfigurer { String msg = "\n\n\n" + " Configuration properties\n" + " ------------------------\n" + "\n"; - Map configProps = config.getConfigProps(); + final Map CONFIG_PROPS = config.getConfigProps(); List configPropNames = new ArrayList<>(config.getUserProperties()); Collections.sort(configPropNames); for (String property : configPropNames) { - String value = configProps.get(property); + String value = CONFIG_PROPS.get(property); msg += " * " + config.getPropertyName(property) + "=" + (value == null ? "" : value) + "\n"; } msg += "\n\n"; log.info(msg); + + return CONFIG_PROPS; } + return null; } @EventListener(ApplicationReadyEvent.class) 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 d0b892cf..574fbf18 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 @@ -95,8 +95,6 @@ public class OpenviduConfig { private static final boolean SHOW_PROPERTIES_AS_ENV_VARS = true; - public static final List OPENVIDU_VALID_PUBLICURL_VALUES = Arrays.asList("local", "docker"); - private List configErrors = new ArrayList<>(); private Map configProps = new HashMap<>(); @@ -153,13 +151,15 @@ public class OpenviduConfig { private List kmsUrisList; - private String openviduSecret; + private String domainOrPublicIp; private String openviduPublicUrl; - private String openviduRecordingComposedUrl; + private Integer httpsPort; - private int serverPort; + private String openviduSecret; + + private String openviduRecordingComposedUrl; private String coturnRedisDbname; @@ -183,10 +183,6 @@ public class OpenviduConfig { // Plain config properties getters - public int getServerPort() { - return this.serverPort; - } - public String getCoturnDatabaseDbname() { return this.coturnRedisDbname; } @@ -195,10 +191,18 @@ public class OpenviduConfig { return kmsUrisList; } + public String getDomainOrPublicIp() { + return this.domainOrPublicIp; + } + public String getOpenViduPublicUrl() { return this.openviduPublicUrl; } + public Integer getHttpsPort() { + return this.httpsPort; + } + public String getOpenViduSecret() { return this.openviduSecret; } @@ -441,7 +445,7 @@ public class OpenviduConfig { } protected List getNonUserProperties() { - return Arrays.asList("server.port", "SERVER_PORT", "DOTENV_PATH", "COTURN_IP", "COTURN_REDIS_IP", "KMS_URIS", + return Arrays.asList("server.port", "SERVER_PORT", "DOTENV_PATH", "COTURN_IP", "COTURN_REDIS_IP", "COTURN_REDIS_DBNAME", "COTURN_REDIS_PASSWORD", "COTURN_REDIS_CONNECT_TIMEOUT"); } @@ -455,7 +459,8 @@ public class OpenviduConfig { } checkHttpsPort(); - checkOpenviduPublicurl(); + checkDomainOrPublicIp(); + populateSpringServerPort(); coturnRedisDbname = getValue("COTURN_REDIS_DBNAME"); @@ -545,34 +550,19 @@ public class OpenviduConfig { } } - private void checkOpenviduPublicurl() { - final String property = "OPENVIDU_DOMAIN_OR_PUBLIC_IP"; - String domain = getValue(property); + private void checkDomainOrPublicIp() { + final String property = "DOMAIN_OR_PUBLIC_IP"; + String domain = asOptionalInetAddress(property); if (domain != null && !domain.isEmpty()) { + this.domainOrPublicIp = domain; this.openviduPublicUrl = "https://" + domain; - if (this.serverPort != 443) { - this.openviduPublicUrl += (":" + this.serverPort); + if (this.httpsPort != 443) { + this.openviduPublicUrl += (":" + this.httpsPort); } - } else { - final String urlProperty = "OPENVIDU_PUBLICURL"; - String publicurl = getValue(urlProperty); - if (publicurl == null || publicurl.isEmpty()) { - addError(property, "Cannot be empty"); - } else { - if (!OPENVIDU_VALID_PUBLICURL_VALUES.contains(publicurl)) { - try { - checkUrl(publicurl); - } catch (Exception e) { - addError(property, "Is not a valid URL. " + e.getMessage()); - } - } - this.openviduPublicUrl = publicurl; - } - } - - if (openviduPublicUrl != null && !openviduPublicUrl.isEmpty()) { calculatePublicUrl(); + } else { + addError(property, "Cannot be empty"); } } @@ -580,17 +570,7 @@ public class OpenviduConfig { String property = "HTTPS_PORT"; String httpsPort = getValue(property); if (httpsPort == null) { - // This should only occur on dev container - property = "SERVER_PORT"; - httpsPort = getValue(property); - if (httpsPort == null) { - property = "server.port"; - httpsPort = getValue(property, false); - if (httpsPort == null || httpsPort.isEmpty()) { - addError(property, "Cannot be undefined"); - return; - } - } + addError(property, "Cannot be undefined"); } int httpsPortNumber = 0; try { @@ -599,55 +579,43 @@ public class OpenviduConfig { addError(property, "Is not a valid port. Must be an integer. " + e.getMessage()); return; } - if (httpsPortNumber > 0 && httpsPortNumber <= 65535) { - serverPort = httpsPortNumber; + this.httpsPort = httpsPortNumber; } else { addError(property, "Is not a valid port. Valid port range exceeded with value " + httpsPortNumber); return; } } - private void calculatePublicUrl() { - String publicUrl = this.getOpenViduPublicUrl(); - - String type = ""; - switch (publicUrl) { - case "docker": - try { - String containerIp = OpenViduServer.getContainerIp(); - OpenViduServer.wsUrl = "wss://" + containerIp + ":" + this.getServerPort(); - } catch (Exception e) { - log.error("Docker container IP was configured, but there was an error obtaining IP: " - + e.getClass().getName() + " " + e.getMessage()); - log.error("Fallback to local URL"); - OpenViduServer.wsUrl = null; - } - break; - case "local": - break; - case "": - break; - default: - if (publicUrl.startsWith("https://")) { - OpenViduServer.wsUrl = publicUrl.replace("https://", "wss://"); - } else if (publicUrl.startsWith("http://")) { - OpenViduServer.wsUrl = publicUrl.replace("http://", "wss://"); - } + /** + * Will add to collection of configuration properties the property "SERVER_PORT" + * only if property "SERVER_PORT" or "server.port" was explicitly defined. This + * doesn't mean this property won't have a default value if not explicitly + * defined (8080 is the default value given by Spring) + */ + private void populateSpringServerPort() { + String springServerPort = getValue("server.port", false); + if (springServerPort == null) { + springServerPort = getValue("SERVER_PORT", false); } + if (springServerPort != null) { + this.configProps.put("SERVER_PORT", springServerPort); + } + } - if (OpenViduServer.wsUrl == null) { - type = "local"; - OpenViduServer.wsUrl = "wss://localhost:" + this.getServerPort(); + private void calculatePublicUrl() { + final String publicUrl = this.getOpenViduPublicUrl(); + if (publicUrl.startsWith("https://")) { + OpenViduServer.wsUrl = publicUrl.replace("https://", "wss://"); + } else if (publicUrl.startsWith("http://")) { + OpenViduServer.wsUrl = publicUrl.replace("http://", "wss://"); } if (OpenViduServer.wsUrl.endsWith("/")) { OpenViduServer.wsUrl = OpenViduServer.wsUrl.substring(0, OpenViduServer.wsUrl.length() - 1); } - String finalUrl = OpenViduServer.wsUrl.replaceFirst("wss://", "https://").replaceFirst("ws://", "http://"); this.setFinalUrl(finalUrl); OpenViduServer.httpUrl = this.getFinalUrl(); - OpenViduServer.publicurlType = type; } public List checkKmsUris() { diff --git a/openvidu-server/src/main/java/io/openvidu/server/rest/ConfigRestController.java b/openvidu-server/src/main/java/io/openvidu/server/rest/ConfigRestController.java index 16a5d62d..3b273fe8 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/rest/ConfigRestController.java +++ b/openvidu-server/src/main/java/io/openvidu/server/rest/ConfigRestController.java @@ -103,6 +103,8 @@ public class ConfigRestController { json.addProperty("VERSION", openviduBuildInfo.getVersion()); JsonArray kmsUris = new JsonArray(); openviduConfig.getKmsUris().forEach(uri -> kmsUris.add(uri)); + json.addProperty("DOMAIN_OR_PUBLIC_IP", openviduConfig.getDomainOrPublicIp()); + json.addProperty("HTTPS_PORT", openviduConfig.getHttpsPort()); json.add("KMS_URIS", kmsUris); json.addProperty("OPENVIDU_PUBLICURL", openviduConfig.getOpenViduPublicUrl()); json.addProperty("OPENVIDU_CDR", openviduConfig.isCdrEnabled()); diff --git a/openvidu-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/openvidu-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 3def7e65..700e38be 100644 --- a/openvidu-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/openvidu-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -3,7 +3,18 @@ { "name": "DOTENV_PATH", "type": "java.lang.String", - "description": "Path to the .env configuration file" + "description": "Path to the .env configuration file", + "defaultValue": "." + }, + { + "name": "DOMAIN_OR_PUBLIC_IP", + "type": "java.lang.String", + "description": "Public domain or ip where OpenVidu Server will be accessible" + }, + { + "name": "HTTPS_PORT", + "type": "java.lang.Integer", + "description": "Secure port where OpenVidu Server will listen" }, { "name": "KMS_URIS", @@ -17,12 +28,6 @@ "description": "Secret used to connect to OpenVidu Server. This value is required when using the REST API or any server client, as well as when connecting to openvidu-server dashboard", "defaultValue": "MY_SECRET" }, - { - "name": "OPENVIDU_PUBLICURL", - "type": "java.lang.String", - "description": "URL to connect clients to OpenVidu Server. This must be the full IP of your OpenVidu Server, including protocol, host and port (for example: https://my.openvidu.server.ip:4443). If no port argument is provided, 'server.port' param will be appended to it", - "defaultValue": "local" - }, { "name": "OPENVIDU_CDR", "type": "java.lang.Boolean", @@ -79,7 +84,7 @@ { "name": "OPENVIDU_RECORDING_COMPOSED_URL", "type": "java.lang.String", - "description": "URL the composed-video recording dockerized Chrome will use to connect to the recording layouts inside OpenVidu Server host. This will affect all video recording layouts (default one BEST_FIT, all CUSTOM layouts). This allows changing the default URL, which is 'OPENVIDU_PUBLICURL', for those cases where OpenVidu Server host does not allow back and forth connections using the public url from inside the host", + "description": "URL the composed-video recording dockerized Chrome will use to connect to the recording layouts inside OpenVidu Server host. This will affect all video recording layouts (default one BEST_FIT, all CUSTOM layouts). This allows changing the default URL, which is the public URL 'https://DOMAIN_OR_PUBLIC_IP:HTTPS_PORT/', for those cases where OpenVidu Server host does not allow back and forth connections using the public url from inside the host", "defaultValue": "" }, { diff --git a/openvidu-server/src/main/resources/application-container.properties b/openvidu-server/src/main/resources/application-container.properties new file mode 100644 index 00000000..f78c73c5 --- /dev/null +++ b/openvidu-server/src/main/resources/application-container.properties @@ -0,0 +1 @@ +HTTPS_PORT=4443 \ No newline at end of file diff --git a/openvidu-server/src/main/resources/application-docker.properties b/openvidu-server/src/main/resources/application-docker.properties deleted file mode 100644 index 7730567d..00000000 --- a/openvidu-server/src/main/resources/application-docker.properties +++ /dev/null @@ -1,22 +0,0 @@ -spring.profiles.active: docker -server.address: 0.0.0.0 -server.port: 4443 -server.ssl.enabled: true -server.ssl.key-store: classpath:openvidu-selfsigned.jks -server.ssl.key-store-password: openvidu -server.ssl.key-store-type: JKS -server.ssl.key-alias: openvidu-selfsigned - -KMS_URIS=["ws://localhost:8888/kurento"] - -OPENVIDU_SECRET: MY_SECRET -OPENVIDU_PUBLICURL: local -OPENVIDU_CDR: false - -OPENVIDU_RECORDING: false -OPENVIDU_RECORDING_VERSION: 2.9.0 -OPENVIDU_RECORDING_PATH: /opt/openvidu/recordings -OPENVIDU_RECORDING_PUBLIC_ACCESS: false -OPENVIDU_RECORDING_NOTIFICATION: publisher_moderator -OPENVIDU_RECORDING_CUSTOM_LAYOUT: /opt/openvidu/custom-layout -OPENVIDU_RECORDING_AUTOSTOP_TIMEOUT: 120 \ No newline at end of file diff --git a/openvidu-server/src/main/resources/application.properties b/openvidu-server/src/main/resources/application.properties index 6ed83df9..51a7a76c 100644 --- a/openvidu-server/src/main/resources/application.properties +++ b/openvidu-server/src/main/resources/application.properties @@ -1,6 +1,5 @@ server.address=0.0.0.0 server.ssl.enabled=true -server.port=4443 server.ssl.key-store=classpath:openvidu-selfsigned.jks server.ssl.key-store-password=openvidu server.ssl.key-store-type=JKS @@ -10,11 +9,11 @@ logging.level.root=info spring.main.allow-bean-definition-overriding=true DOTENV_PATH=. - +DOMAIN_OR_PUBLIC_IP=localhost +HTTPS_PORT=443 CERTIFICATE_TYPE=selfsigned KMS_URIS=["ws://localhost:8888/kurento"] -OPENVIDU_PUBLICURL=local OPENVIDU_SECRET=MY_SECRET OPENVIDU_CDR=false diff --git a/openvidu-server/src/test/resources/application.properties b/openvidu-server/src/test/resources/application.properties index 3bfadaa4..e8001c24 100644 --- a/openvidu-server/src/test/resources/application.properties +++ b/openvidu-server/src/test/resources/application.properties @@ -1,8 +1,8 @@ -server.port: 4443 server.address: 0.0.0.0 server.ssl.enabled: false -KMS_URIS=[\"ws://localhost:8888/kurento\"] +DOMAIN_OR_PUBLIC_IP=localhost +HTTPS_PORT=4443 +OPENVIDU_SECRET=MY_SECRET -OPENVIDU_SECRET: MY_SECRET -OPENVIDU_PUBLICURL: local \ No newline at end of file +KMS_URIS=[\"ws://localhost:8888/kurento\"] \ No newline at end of file diff --git a/openvidu-server/src/test/resources/integration-test.properties b/openvidu-server/src/test/resources/integration-test.properties index 24991179..5846edd0 100644 --- a/openvidu-server/src/test/resources/integration-test.properties +++ b/openvidu-server/src/test/resources/integration-test.properties @@ -1,6 +1,5 @@ server.address=0.0.0.0 server.ssl.enabled=true -server.port=4443 server.ssl.key-store=classpath:openvidu-selfsigned.jks server.ssl.key-store-password=openvidu server.ssl.key-store-type=JKS @@ -11,7 +10,9 @@ spring.main.allow-bean-definition-overriding=true KMS_URIS=["ws://localhost:8888/kurento"] -OPENVIDU_PUBLICURL=local +DOMAIN_OR_PUBLIC_IP=localhost +HTTPS_PORT=4443 + OPENVIDU_SECRET=MY_SECRET OPENVIDU_CDR=false diff --git a/openvidu-test-e2e/jenkins/Jenkinsfile b/openvidu-test-e2e/jenkins/Jenkinsfile index a12b604f..008f9554 100644 --- a/openvidu-test-e2e/jenkins/Jenkinsfile +++ b/openvidu-test-e2e/jenkins/Jenkinsfile @@ -70,10 +70,10 @@ node('container') { sh(script: '''#!/bin/bash if [ "$DOCKER_RECORDING_VERSION" != "default" ]; then echo "Using custom openvidu-recording tag: $DOCKER_RECORDING_VERSION" - cd openvidu/openvidu-server/target && java -jar -DOPENVIDU_PUBLICURL=https://172.17.0.1:4443/ -DOPENVIDU_RECORDING=true -DOPENVIDU_RECORDING_VERSION=$DOCKER_RECORDING_VERSION -DOPENVIDU_WEBHOOK=true -DOPENVIDU_WEBHOOK_ENDPOINT=http://127.0.0.1:7777/webhook openvidu-server-*.jar &> openvidu-server.log & + cd openvidu/openvidu-server/target && java -jar -DDOMAIN_OR_PUBLIC_IP=172.17.0.1 -DHTTPS_PORT=4443 -DOPENVIDU_RECORDING=true -DOPENVIDU_RECORDING_VERSION=$DOCKER_RECORDING_VERSION -DOPENVIDU_WEBHOOK=true -DOPENVIDU_WEBHOOK_ENDPOINT=http://127.0.0.1:7777/webhook openvidu-server-*.jar &> openvidu-server.log & else echo "Using default openvidu-recording tag" - cd openvidu/openvidu-server/target && java -jar -DOPENVIDU_PUBLICURL=https://172.17.0.1:4443/ -DOPENVIDU_RECORDING=true -DOPENVIDU_WEBHOOK=true -DOPENVIDU_WEBHOOK_ENDPOINT=http://127.0.0.1:7777/webhook openvidu-server-*.jar &> openvidu-server.log & + cd openvidu/openvidu-server/target && java -jar -DDOMAIN_OR_PUBLIC_IP=172.17.0.1 -DHTTPS_PORT=4443 -DOPENVIDU_RECORDING=true -DOPENVIDU_WEBHOOK=true -DOPENVIDU_WEBHOOK_ENDPOINT=http://127.0.0.1:7777/webhook openvidu-server-*.jar &> openvidu-server.log & fi '''.stripIndent()) sh 'until $(curl --insecure --output /dev/null --silent --head --fail https://OPENVIDUAPP:MY_SECRET@localhost:4443/); do echo "Waiting for openvidu-server..."; sleep 2; done' diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java index ba7cf413..01d9ee06 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java @@ -2636,7 +2636,7 @@ public class OpenViduTestAppE2eTest { /** GET /config **/ restClient.rest(HttpMethod.GET, "/config", null, HttpStatus.SC_OK, true, - "{'VERSION':'STR','OPENVIDU_PUBLICURL':'STR','OPENVIDU_CDR':false,'OPENVIDU_STREAMS_VIDEO_MAX_RECV_BANDWIDTH':0,'OPENVIDU_STREAMS_VIDEO_MIN_RECV_BANDWIDTH':0," + "{'VERSION':'STR','DOMAIN_OR_PUBLIC_IP':'STR','HTTPS_PORT':0,'OPENVIDU_PUBLICURL':'STR','OPENVIDU_CDR':false,'OPENVIDU_STREAMS_VIDEO_MAX_RECV_BANDWIDTH':0,'OPENVIDU_STREAMS_VIDEO_MIN_RECV_BANDWIDTH':0," + "'OPENVIDU_STREAMS_VIDEO_MAX_SEND_BANDWIDTH':0,'OPENVIDU_STREAMS_VIDEO_MIN_SEND_BANDWIDTH':0,'OPENVIDU_SESSIONS_GARBAGE_INTERVAL':0,'OPENVIDU_SESSIONS_GARBAGE_THRESHOLD':0," + "'OPENVIDU_RECORDING':false,'OPENVIDU_RECORDING_VERSION':'STR','OPENVIDU_RECORDING_PATH':'STR','OPENVIDU_RECORDING_PUBLIC_ACCESS':false,'OPENVIDU_RECORDING_NOTIFICATION':'STR'," + "'OPENVIDU_RECORDING_CUSTOM_LAYOUT':'STR','OPENVIDU_RECORDING_AUTOSTOP_TIMEOUT':0,'OPENVIDU_WEBHOOK':false,'OPENVIDU_WEBHOOK_ENDPOINT':'STR','OPENVIDU_WEBHOOK_HEADERS':[],"