From 0e7c55f7ab8d496e81a3dbd53f14e0c46cb27fa6 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 4 Sep 2023 18:08:59 +0200 Subject: refactor: server environemntal variables * Prefix each variable with REFINERY_ * If not public host is specified, allow all origings and compute the WebSocket address on the client from the origin. --- docker/Dockerfile | 2 +- .../frontend/config/detectDevModeOptions.ts | 4 ++-- subprojects/frontend/src/xtext/BackendConfig.ts | 2 +- .../frontend/src/xtext/XtextWebSocketClient.ts | 5 ++++- subprojects/language-web/build.gradle.kts | 12 ++++++++++- .../refinery/language/web/ServerLauncher.java | 24 ++++++++++------------ .../language/web/config/BackendConfigServlet.java | 3 --- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index ac164cb7..1485e95b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -39,7 +39,7 @@ FROM refinery-$TARGETARCH # Layer with platform-independent application jars. ADD --link app_lib /app/lib # Common settings added on top. -ENV LISTEN_ADDRESS=0.0.0.0 LISTEN_PORT=8888 PUBLIC_HOST=localhost PUBLIC_PORT=8888 +ENV REFINERY_LISTEN_HOST=0.0.0.0 REFINERY_LISTEN_PORT=8888 EXPOSE 8888 USER 1000 WORKDIR /app diff --git a/subprojects/frontend/config/detectDevModeOptions.ts b/subprojects/frontend/config/detectDevModeOptions.ts index 665204dc..6052e047 100644 --- a/subprojects/frontend/config/detectDevModeOptions.ts +++ b/subprojects/frontend/config/detectDevModeOptions.ts @@ -30,8 +30,8 @@ function detectListenOptions( fallbackHost: string, fallbackPort: number, ): ListenOptions { - const host = process.env[`${name}_HOST`] ?? fallbackHost; - const rawPort = process.env[`${name}_PORT`]; + const host = process.env[`REFINERY_${name}_HOST`] ?? fallbackHost; + const rawPort = process.env[`REFINERY_${name}_PORT`]; const port = rawPort === undefined ? fallbackPort : parseInt(rawPort, 10); const secure = port === 443; return { host, port, secure }; diff --git a/subprojects/frontend/src/xtext/BackendConfig.ts b/subprojects/frontend/src/xtext/BackendConfig.ts index 4c7eac5f..e7043bd5 100644 --- a/subprojects/frontend/src/xtext/BackendConfig.ts +++ b/subprojects/frontend/src/xtext/BackendConfig.ts @@ -11,7 +11,7 @@ import { z } from 'zod'; export const ENDPOINT = 'config.json'; const BackendConfig = z.object({ - webSocketURL: z.string().url(), + webSocketURL: z.string().url().optional(), }); type BackendConfig = z.infer; diff --git a/subprojects/frontend/src/xtext/XtextWebSocketClient.ts b/subprojects/frontend/src/xtext/XtextWebSocketClient.ts index 6bb7eec8..963c1d4c 100644 --- a/subprojects/frontend/src/xtext/XtextWebSocketClient.ts +++ b/subprojects/frontend/src/xtext/XtextWebSocketClient.ts @@ -282,7 +282,10 @@ export default class XtextWebSocketClient { log.debug('Creating WebSocket'); (async () => { - const { webSocketURL } = await fetchBackendConfig(); + let { webSocketURL } = await fetchBackendConfig(); + if (webSocketURL === undefined) { + webSocketURL = `${window.origin.replace(/^http/, 'ws')}/xtext-service`; + } this.openWebSocketWithURL(webSocketURL); })().catch((error) => { log.error('Error while initializing connection', error); diff --git a/subprojects/language-web/build.gradle.kts b/subprojects/language-web/build.gradle.kts index 9f772d41..88dccdf3 100644 --- a/subprojects/language-web/build.gradle.kts +++ b/subprojects/language-web/build.gradle.kts @@ -64,8 +64,18 @@ tasks { classpath(mainRuntimeClasspath) mainClass.set(application.mainClass) standardInput = System.`in` - environment("BASE_RESOURCE", webapp.singleFile) + environment("REFINERY_BASE_RESOURCE", webapp.singleFile) group = "run" description = "Start a Jetty web server serving the Xtext API and assets." } + + register("serveBackendOnly") { + val mainRuntimeClasspath = sourceSets.main.map { it.runtimeClasspath } + dependsOn(mainRuntimeClasspath) + classpath(mainRuntimeClasspath) + mainClass.set(application.mainClass) + standardInput = System.`in` + group = "run" + description = "Start a Jetty web server serving the Xtext API without assets." + } } diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java index 3e1d811b..d633b3fc 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java @@ -33,7 +33,7 @@ import java.util.EnumSet; import java.util.Set; public class ServerLauncher { - public static final String DEFAULT_LISTEN_ADDRESS = "localhost"; + public static final String DEFAULT_LISTEN_HOST = "localhost"; public static final int DEFAULT_LISTEN_PORT = 1312; @@ -105,7 +105,7 @@ public class ServerLauncher { private Resource getBaseResource() { var factory = ResourceFactory.of(server); - var baseResourceOverride = System.getenv("BASE_RESOURCE"); + var baseResourceOverride = System.getenv("REFINERY_BASE_RESOURCE"); if (baseResourceOverride != null) { // If a user override is provided, use it. return factory.newResource(baseResourceOverride); @@ -155,15 +155,15 @@ public class ServerLauncher { } private static String getListenAddress() { - var listenAddress = System.getenv("LISTEN_ADDRESS"); + var listenAddress = System.getenv("REFINERY_LISTEN_HOST"); if (listenAddress == null) { - return DEFAULT_LISTEN_ADDRESS; + return DEFAULT_LISTEN_HOST; } return listenAddress; } private static int getListenPort() { - var portStr = System.getenv("LISTEN_PORT"); + var portStr = System.getenv("REFINERY_LISTEN_PORT"); if (portStr != null) { return Integer.parseInt(portStr); } @@ -177,7 +177,7 @@ public class ServerLauncher { } private static String getPublicHost() { - var publicHost = System.getenv("PUBLIC_HOST"); + var publicHost = System.getenv("REFINERY_PUBLIC_HOST"); if (publicHost != null) { return publicHost.toLowerCase(); } @@ -185,7 +185,7 @@ public class ServerLauncher { } private static int getPublicPort() { - var portStr = System.getenv("PUBLIC_PORT"); + var portStr = System.getenv("REFINERY_PUBLIC_PORT"); if (portStr != null) { return Integer.parseInt(portStr); } @@ -193,7 +193,7 @@ public class ServerLauncher { } private static String[] getAllowedOrigins() { - var allowedOrigins = System.getenv("ALLOWED_ORIGINS"); + var allowedOrigins = System.getenv("REFINERY_ALLOWED_ORIGINS"); if (allowedOrigins != null) { return allowedOrigins.split(ALLOWED_ORIGINS_SEPARATOR); } @@ -222,12 +222,10 @@ public class ServerLauncher { int port; var publicHost = getPublicHost(); if (publicHost == null) { - host = getListenAddress(); - port = getListenPort(); - } else { - host = publicHost; - port = getPublicPort(); + return null; } + host = publicHost; + port = getPublicPort(); var scheme = port == HTTPS_DEFAULT_PORT ? "wss" : "ws"; return String.format("%s://%s:%d/xtext-service", scheme, host, port); } diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfigServlet.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfigServlet.java index a2f04e34..7d0a5122 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfigServlet.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/config/BackendConfigServlet.java @@ -25,9 +25,6 @@ public class BackendConfigServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); var webSocketUrl = config.getInitParameter(WEBSOCKET_URL_INIT_PARAM); - if (webSocketUrl == null) { - throw new IllegalArgumentException("Init parameter " + WEBSOCKET_URL_INIT_PARAM + " is mandatory"); - } var backendConfig = new BackendConfig(webSocketUrl); var gson = new Gson(); serializedConfig = gson.toJson(backendConfig); -- cgit v1.2.3-70-g09d2