diff --git a/transact/src/main/java/dev/dbos/transact/conductor/Conductor.java b/transact/src/main/java/dev/dbos/transact/conductor/Conductor.java index 32bb6af4..a379bea1 100644 --- a/transact/src/main/java/dev/dbos/transact/conductor/Conductor.java +++ b/transact/src/main/java/dev/dbos/transact/conductor/Conductor.java @@ -155,21 +155,31 @@ private Conductor(Builder builder) { String appName = dbosExecutor.appName(); Objects.requireNonNull(appName, "App Name must not be null to use Conductor"); - String domain = builder.domain; - if (domain == null) { + var hostname = builder.domain; + if (hostname == null) { String dbosDomain = System.getenv("DBOS_DOMAIN"); if (dbosDomain == null || dbosDomain.trim().isEmpty()) { - domain = "wss://cloud.dbos.dev"; + hostname = "cloud.dbos.dev"; } else { - domain = "wss://" + dbosDomain.trim(); + hostname = dbosDomain.trim(); } - domain += "/conductor/v1alpha1"; } else { // ensure there is no trailing slash - domain = domain.replaceAll("/$", ""); + hostname = hostname.replaceAll("/$", ""); } - this.url = domain + "/websocket/" + appName + "/" + builder.conductorKey; + // Determine protocol based on hostname (use ws for localhost, wss for others) + boolean isLocalHost = + "localhost".equals(hostname) + || hostname.startsWith("localhost:") + || "127.0.0.1".equals(hostname) + || hostname.startsWith("127.0.0.1:"); + var protocol = isLocalHost ? "ws" : "wss"; + + this.url = + String.format( + "%s://%s/conductor/v1alpha1/websocket/%s/%s", + protocol, hostname, appName, builder.conductorKey); this.pingPeriodMs = builder.pingPeriodMs; this.pingTimeoutMs = builder.pingTimeoutMs; diff --git a/transact/src/test/java/dev/dbos/transact/conductor/ConductorTest.java b/transact/src/test/java/dev/dbos/transact/conductor/ConductorTest.java index c3273d51..ba374eef 100644 --- a/transact/src/test/java/dev/dbos/transact/conductor/ConductorTest.java +++ b/transact/src/test/java/dev/dbos/transact/conductor/ConductorTest.java @@ -91,7 +91,7 @@ void beforeEach() throws Exception { int port = testServer.getPort(); assertTrue(port != 0, "Invalid Web Socket Server port"); - String domain = String.format("ws://localhost:%d", port); + String domain = String.format("localhost:%d", port); mockDB = mock(SystemDatabase.class); mockExec = mock(DBOSExecutor.class); @@ -126,7 +126,8 @@ public void onOpen(WebSocket conn, ClientHandshake handshake) { try (Conductor conductor = builder.build()) { conductor.start(); assertTrue(listener.latch.await(10, TimeUnit.SECONDS), "latch timed out"); - assertEquals("/websocket/test-app-name/conductor-key", listener.resourceDescriptor); + assertEquals( + "/conductor/v1alpha1/websocket/test-app-name/conductor-key", listener.resourceDescriptor); } }