Support remote workspace service links

This commit is contained in:
Mohamed Boudra
2026-04-11 10:15:10 +07:00
parent 2bbdc7ed86
commit 3b8cfcbec6
15 changed files with 235 additions and 29 deletions
@@ -0,0 +1,64 @@
import { parseHostPort } from "@server/shared/daemon-endpoints";
import type { WorkspaceScriptPayload } from "@server/shared/messages";
import type { ActiveConnection } from "@/runtime/host-runtime";
export type ResolvedWorkspaceScriptLink = {
openUrl: string | null;
labelUrl: string | null;
};
function isLoopbackHost(host: string): boolean {
const normalizedHost = host.trim().toLowerCase();
return normalizedHost === "localhost" || normalizedHost === "127.0.0.1" || normalizedHost === "::1";
}
function buildDirectServiceUrl(endpoint: string, port: number): string | null {
try {
const { host, isIpv6 } = parseHostPort(endpoint);
const base = isIpv6 ? `[${host}]` : host;
return `http://${base}:${port}`;
} catch {
return null;
}
}
export function resolveWorkspaceScriptLink(input: {
script: WorkspaceScriptPayload;
activeConnection: ActiveConnection | null;
}): ResolvedWorkspaceScriptLink {
const { script, activeConnection } = input;
if (script.type !== "service" || script.lifecycle !== "running") {
return { openUrl: null, labelUrl: null };
}
if (!activeConnection) {
return { openUrl: null, labelUrl: script.proxyUrl };
}
if (activeConnection.type === "relay") {
return { openUrl: null, labelUrl: script.proxyUrl };
}
if (activeConnection.type === "directSocket" || activeConnection.type === "directPipe") {
return { openUrl: script.proxyUrl, labelUrl: script.proxyUrl };
}
try {
const { host } = parseHostPort(activeConnection.endpoint);
if (isLoopbackHost(host)) {
return { openUrl: script.proxyUrl, labelUrl: script.proxyUrl };
}
} catch {
return { openUrl: null, labelUrl: script.proxyUrl };
}
if (script.port === null) {
return { openUrl: null, labelUrl: script.proxyUrl };
}
const directUrl = buildDirectServiceUrl(activeConnection.endpoint, script.port);
return {
openUrl: directUrl,
labelUrl: directUrl ?? script.proxyUrl,
};
}