diff --git a/backend/windmill-api-settings/src/lib.rs b/backend/windmill-api-settings/src/lib.rs index 252c21580e..e026386474 100644 --- a/backend/windmill-api-settings/src/lib.rs +++ b/backend/windmill-api-settings/src/lib.rs @@ -45,6 +45,7 @@ use windmill_common::{ APP_WORKSPACED_ROUTE_SETTING, AUTOMATE_USERNAME_CREATION_SETTING, CRITICAL_ALERT_MUTE_UI_SETTING, DEFAULT_TAGS_WORKSPACES_SETTING, DISABLE_HUB_SETTING, EMAIL_DOMAIN_SETTING, ENV_SETTINGS, HUB_ACCESSIBLE_URL_SETTING, HUB_BASE_URL_SETTING, + WS_BASE_URL_SETTING, }, instance_config::{self, ApplyMode, InstanceConfig}, server::Smtp, @@ -526,6 +527,7 @@ pub async fn get_global_setting( && key != DISABLE_HUB_SETTING && key != EMAIL_DOMAIN_SETTING && key != APP_WORKSPACED_ROUTE_SETTING + && key != WS_BASE_URL_SETTING { require_super_admin(&db, &authed.email).await?; } diff --git a/backend/windmill-common/src/global_settings.rs b/backend/windmill-common/src/global_settings.rs index 1d2aeafce8..fc984096c3 100644 --- a/backend/windmill-common/src/global_settings.rs +++ b/backend/windmill-common/src/global_settings.rs @@ -2,6 +2,7 @@ pub const CUSTOM_TAGS_SETTING: &str = "custom_tags"; pub const DEFAULT_TAGS_PER_WORKSPACE_SETTING: &str = "default_tags_per_workspace"; pub const DEFAULT_TAGS_WORKSPACES_SETTING: &str = "default_tags_workspaces"; pub const BASE_URL_SETTING: &str = "base_url"; +pub const WS_BASE_URL_SETTING: &str = "ws_base_url"; pub const OAUTH_SETTING: &str = "oauths"; pub const RETENTION_PERIOD_SECS_SETTING: &str = "retention_period_secs"; pub const AUDIT_LOG_RETENTION_DAYS_SETTING: &str = "audit_log_retention_days"; diff --git a/backend/windmill-common/src/instance_config.rs b/backend/windmill-common/src/instance_config.rs index fb70db90ae..e8c1a8479f 100644 --- a/backend/windmill-common/src/instance_config.rs +++ b/backend/windmill-common/src/instance_config.rs @@ -245,6 +245,8 @@ pub struct GlobalSettings { // String settings #[serde(skip_serializing_if = "Option::is_none")] + pub ws_base_url: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub email_domain: Option, #[serde(skip_serializing_if = "Option::is_none")] pub hub_base_url: Option, diff --git a/debugger/dap_debug_service.ts b/debugger/dap_debug_service.ts index 2a7a8fc727..2043dd138e 100644 --- a/debugger/dap_debug_service.ts +++ b/debugger/dap_debug_service.ts @@ -1076,10 +1076,14 @@ const server = Bun.serve({ if (path === '/health') { return new Response(JSON.stringify({ status: 'ok', + service: 'debugger', endpoints: ['/python', '/typescript', '/bun'], nsjail: config.nsjail.enabled }), { - headers: { 'Content-Type': 'application/json' } + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*' + } }) } @@ -1096,6 +1100,13 @@ const server = Bun.serve({ path = path.slice('/ws_debug'.length) } + // Handle ping test — respond and close immediately + if (path === '/ping') { + ws.send(JSON.stringify({ type: 'pong', service: 'debugger' })) + ws.close() + return + } + logger.info(`New client connected: ${path}`) // Create appropriate session based on path diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index 779bc2bf93..709688f9a2 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -7,6 +7,7 @@ diff --git a/frontend/src/lib/components/InstanceSetting.svelte b/frontend/src/lib/components/InstanceSetting.svelte index 1c69ac8a80..8caacaa553 100644 --- a/frontend/src/lib/components/InstanceSetting.svelte +++ b/frontend/src/lib/components/InstanceSetting.svelte @@ -23,6 +23,7 @@ import SmtpSettings from './instanceSettings/SmtpSettings.svelte' import SecretBackendConfig from './instanceSettings/SecretBackendConfig.svelte' import GhesAppSettings from './instanceSettings/GhesAppSettings.svelte' + import WsConnectivityTest from './instanceSettings/WsConnectivityTest.svelte' import IndexerMemorySettings from './instanceSettings/IndexerMemorySettings.svelte' import IndexerJobIndexSettings from './instanceSettings/IndexerJobIndexSettings.svelte' import IndexerLogIndexSettings from './instanceSettings/IndexerLogIndexSettings.svelte' @@ -285,12 +286,16 @@ {:else} {:else if setting.fieldType == 'github_enterprise_app'} + {:else if setting.fieldType == 'ws_connectivity'} + {/if} {#if hasError} diff --git a/frontend/src/lib/components/ScriptEditor.svelte b/frontend/src/lib/components/ScriptEditor.svelte index 600dfde5af..4324b45ba6 100644 --- a/frontend/src/lib/components/ScriptEditor.svelte +++ b/frontend/src/lib/components/ScriptEditor.svelte @@ -1,6 +1,5 @@ + +
+
+ +
+ + {#if results.length > 0} +
+ {#each results as result (result.name)} +
+ {result.name} + + {#if result.http === 'pending'} + + {:else if result.http === 'ok'} + + {:else} + + {/if} + HTTP + + + {#if result.ws === 'pending'} + + {:else if result.ws === 'ok'} + + {:else} + + {/if} + WebSocket + +
+ {/each} +
+ {/if} + +
+ +
+ + {#if enabled} + + {@const val = $values['ws_base_url']} + {#if val && (!val.startsWith('ws') || !val.includes('://') || val.endsWith('/') || val.endsWith(' '))} + + Must start with ws:// or wss:// and not end with / or a space + + {/if} + {/if} +
diff --git a/frontend/src/lib/components/sidebar/MultiplayerMenu.svelte b/frontend/src/lib/components/sidebar/MultiplayerMenu.svelte index 81057f0f77..b4665026fb 100644 --- a/frontend/src/lib/components/sidebar/MultiplayerMenu.svelte +++ b/frontend/src/lib/components/sidebar/MultiplayerMenu.svelte @@ -1,16 +1,14 @@