feat: add ws_base_url instance setting for WebSocket URL override (#8405)
* feat: add ws_base_url instance setting to override WebSocket base URL Allow deployments behind reverse proxies to route WebSocket traffic (LSP, debugger, multiplayer) to a different host/port than the main frontend via a new instance setting. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: move ws_base_url to Advanced section with toggle and connectivity test - Move setting from Core to Advanced > WebSocket section - Render as toggle "Custom websocket base url from frontend to multiplayer/lsp/debugger" with conditional URL text field - Add Test connectivity button (always visible) that checks HTTP health and WebSocket ping for all three services (LSP, Multiplayer, Debugger) - Add /ws/ping and /ws/health endpoints to LSP service - Add /ws_mp/health HTTP and __ping__ WS handlers to multiplayer service - Add /ping WS handler to debugger service - Add CORS headers to health endpoints for cross-origin testing Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: toggle enabled check and testWs promise resolution - Fix enabled derived to check only for null (not empty string), otherwise the toggle never turns on since toggleEnabled sets '' - Fix testWs onclose handler to resolve(false) so the promise doesn't hang if the server closes without sending a message Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: make connectivity test work with existing services - HTTP test: accept plain text "ok"/"okay" (old services) in addition to JSON {"status": "ok"} (new services), reject HTML (SPA fallback) - WS test: resolve on onopen (connection established) instead of waiting for a specific pong message, so the test works even with services that don't have the new /ping handler yet Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -90,6 +90,26 @@ class MainHandler(web.RequestHandler):
|
||||
def get(self):
|
||||
self.write("ok")
|
||||
|
||||
class HealthHandler(web.RequestHandler):
|
||||
def set_default_headers(self):
|
||||
self.set_header("Access-Control-Allow-Origin", "*")
|
||||
self.set_header("Content-Type", "application/json")
|
||||
|
||||
def get(self):
|
||||
self.write(json.dumps({"status": "ok", "service": "lsp"}))
|
||||
|
||||
def options(self):
|
||||
self.set_status(204)
|
||||
self.finish()
|
||||
|
||||
class PingHandler(websocket.WebSocketHandler):
|
||||
def open(self):
|
||||
self.write_message(json.dumps({"type": "pong", "service": "lsp"}))
|
||||
self.close()
|
||||
|
||||
def check_origin(self, origin):
|
||||
return True
|
||||
|
||||
if __name__ == "__main__":
|
||||
monaco_path = "/tmp/monaco"
|
||||
os.makedirs(monaco_path, exist_ok=True)
|
||||
@@ -107,8 +127,10 @@ if __name__ == "__main__":
|
||||
(r"/ws/ruff", RuffLS),
|
||||
(r"/ws/deno", DenoLS),
|
||||
(r"/ws/go", GoLS),
|
||||
(r"/ws/ping", PingHandler),
|
||||
(r"/ws/health", HealthHandler),
|
||||
(r"/", MainHandler),
|
||||
(r"/health", MainHandler),
|
||||
(r"/health", HealthHandler),
|
||||
]
|
||||
)
|
||||
app.listen(port, address="0.0.0.0")
|
||||
|
||||
Reference in New Issue
Block a user