From 284207e9e8042ab302c1e5b9cf0a24ea1dc4f7dd Mon Sep 17 00:00:00 2001 From: Maxime Boissonneault Date: Mon, 21 Jul 2025 16:32:49 +0000 Subject: [PATCH 1/2] add support for multiple endpoints, configured via JUPYTER_REMOTE_DESKTOP_ENDPOINTS --- js/index.js | 5 ++- .../server_extension.py | 34 +++++++++++-------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/js/index.js b/js/index.js index 10319905..0c7c4af9 100644 --- a/js/index.js +++ b/js/index.js @@ -45,7 +45,10 @@ function status(text) { // This page is served under the /desktop/, and the websockify websocket is served // under /desktop-websockify/ with the same base url as /desktop/. We resolve it relatively // this way. -let websockifyUrl = new URL("../desktop-websockify/", window.location); +let websockifyUrl = new URL( + window.location.pathname.replace(/\/+$/, "") + "-websockify/", + window.location, +); websockifyUrl.protocol = window.location.protocol === "https:" ? "wss" : "ws"; let retryCount = 0; diff --git a/jupyter_remote_desktop_proxy/server_extension.py b/jupyter_remote_desktop_proxy/server_extension.py index a998f2a7..dadea29d 100644 --- a/jupyter_remote_desktop_proxy/server_extension.py +++ b/jupyter_remote_desktop_proxy/server_extension.py @@ -1,3 +1,4 @@ +import os from pathlib import Path from jupyter_server.base.handlers import AuthenticatedFileHandler @@ -15,18 +16,21 @@ def load_jupyter_server_extension(server_app): """ base_url = server_app.web_app.settings["base_url"] - server_app.web_app.add_handlers( - ".*", - [ - # Serve our own static files - ( - url_path_join(base_url, "/desktop/static/(.*)"), - AuthenticatedFileHandler, - {"path": (str(HERE / "static"))}, - ), - # To simplify URL mapping, we make sure that /desktop/ always - # has a trailing slash - (url_path_join(base_url, "/desktop"), AddSlashHandler), - (url_path_join(base_url, "/desktop/"), DesktopHandler), - ], - ) + jupyter_remote_desktop_endpoints = os.getenv('JUPYTER_REMOTE_DESKTOP_ENDPOINTS', '') + endpoints = ['desktop'] + jupyter_remote_desktop_endpoints.split(',') + for endpoint in endpoints: + server_app.web_app.add_handlers( + ".*", + [ + # Serve our own static files + ( + url_path_join(base_url, f"/{endpoint}/static/(.*)"), + AuthenticatedFileHandler, + {"path": (str(HERE / "static"))}, + ), + # To simplify URL mapping, we make sure that /desktop/ always + # has a trailing slash + (url_path_join(base_url, f"/{endpoint}"), AddSlashHandler), + (url_path_join(base_url, f"/{endpoint}/"), DesktopHandler), + ], + ) From 85595109ac3c0c0db3865a7c959909002d37e279 Mon Sep 17 00:00:00 2001 From: Maxime Boissonneault Date: Tue, 22 Jul 2025 12:43:03 +0000 Subject: [PATCH 2/2] handle the case where JUPYTER_REMOTE_DESKTOP_ENDPOINTS is empty --- jupyter_remote_desktop_proxy/server_extension.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jupyter_remote_desktop_proxy/server_extension.py b/jupyter_remote_desktop_proxy/server_extension.py index dadea29d..2dd9f944 100644 --- a/jupyter_remote_desktop_proxy/server_extension.py +++ b/jupyter_remote_desktop_proxy/server_extension.py @@ -16,8 +16,11 @@ def load_jupyter_server_extension(server_app): """ base_url = server_app.web_app.settings["base_url"] + endpoints = ['desktop'] jupyter_remote_desktop_endpoints = os.getenv('JUPYTER_REMOTE_DESKTOP_ENDPOINTS', '') - endpoints = ['desktop'] + jupyter_remote_desktop_endpoints.split(',') + if jupyter_remote_desktop_endpoints: + endpoints.extend(jupyter_remote_desktop_endpoints.split(',')) + for endpoint in endpoints: server_app.web_app.add_handlers( ".*",