mirror of
https://github.com/nexu-io/open-design.git
synced 2026-10-27 09:51:12 +01:00
* fix(tools-dev): preserve web origin trust on web start Restart daemon/web when the trusted web port is missing, and reuse the active web port during repeated starts so run web and start web keep app-config origin checks aligned. Generated-By: looper 0.0.0-dev (runner=worker, agent=opencode) * fix(plugins): refresh official registry bundled count Generated-By: looper 0.0.0-dev (runner=fixer, agent=opencode) * fix(tools-dev): preserve daemon/web reserved ports Generated-By: looper 0.0.0-dev (runner=fixer, agent=opencode) * fix(tools-dev): preserve daemon reuse on web start Generated-By: looper 0.0.0-dev (runner=fixer, agent=opencode) * fix(tools-dev): preserve running daemon port on web reuse Generated-By: looper 0.0.0-dev (runner=fixer, agent=opencode) * fix(tools-dev): reserve explicit web port before daemon allocation Generated-By: looper 0.0.0-dev (runner=fixer, agent=opencode) * test(web): stabilize media provider reload flash timing Generated-By: looper 0.0.0-dev (runner=fixer, agent=opencode) * fix(web): restore merged reattach workspace coverage Generated-By: looper 0.0.0-dev (runner=fixer, agent=opencode) * fix(tools-dev): reserve allocated daemon port Generated-By: looper 0.0.0-dev (runner=fixer, agent=opencode) * test(e2e): wait for artifact manifest persistence Generated-By: looper 0.0.0-dev (runner=fixer, agent=opencode)
70 lines
2.5 KiB
TypeScript
70 lines
2.5 KiB
TypeScript
import { allocatePort } from "@open-design/sidecar";
|
|
import { APP_KEYS } from "@open-design/sidecar-proto";
|
|
|
|
import { parsePortOption, type ToolDevAppName, type ToolDevOptions } from "./config.js";
|
|
|
|
type RunningUrlLookup = () => Promise<string | null | undefined>;
|
|
type AllocatePortFn = typeof allocatePort;
|
|
|
|
function portFromUrl(url: string | null | undefined): number | null {
|
|
if (url == null) return null;
|
|
const parsed = new URL(url);
|
|
if (parsed.port.length > 0) return Number(parsed.port);
|
|
return parsed.protocol === "https:" ? 443 : 80;
|
|
}
|
|
|
|
export async function ensureSharedPortsResolved(
|
|
targets: readonly ToolDevAppName[],
|
|
options: Pick<ToolDevOptions, "daemonPort" | "webPort">,
|
|
runningWebUrl?: string | null,
|
|
runningDaemonUrl?: string | null,
|
|
allocate: AllocatePortFn = allocatePort,
|
|
): Promise<void> {
|
|
if (!targets.includes(APP_KEYS.WEB)) return;
|
|
const daemonRequested = targets.includes(APP_KEYS.DAEMON);
|
|
const reserved = new Set<number>();
|
|
const webPort = parsePortOption(options.webPort, "--web-port");
|
|
if (webPort != null) reserved.add(webPort);
|
|
let daemonPort = parsePortOption(options.daemonPort, "--daemon-port");
|
|
if (daemonRequested && daemonPort == null) {
|
|
daemonPort = portFromUrl(runningDaemonUrl);
|
|
if (daemonPort != null) {
|
|
options.daemonPort = String(daemonPort);
|
|
}
|
|
}
|
|
if (daemonPort != null) reserved.add(daemonPort);
|
|
if (daemonRequested && daemonPort == null) {
|
|
const allocation = await allocate({
|
|
host: "127.0.0.1",
|
|
label: "daemon",
|
|
reserved,
|
|
});
|
|
daemonPort = allocation.port;
|
|
reserved.add(daemonPort);
|
|
options.daemonPort = String(daemonPort);
|
|
}
|
|
if (webPort != null) return;
|
|
if (runningWebUrl != null) {
|
|
const url = new URL(runningWebUrl);
|
|
options.webPort = String(url.port || (url.protocol === "https:" ? 443 : 80));
|
|
return;
|
|
}
|
|
|
|
const { port } = await allocate({
|
|
host: "127.0.0.1",
|
|
label: "web",
|
|
reserved,
|
|
});
|
|
options.webPort = String(port);
|
|
}
|
|
|
|
export async function resolveSharedPortsFromRunningState(
|
|
targets: readonly ToolDevAppName[],
|
|
options: Pick<ToolDevOptions, "daemonPort" | "webPort">,
|
|
urls: { daemonUrl?: RunningUrlLookup; webUrl?: RunningUrlLookup },
|
|
): Promise<void> {
|
|
const runningDaemonUrl = targets.includes(APP_KEYS.DAEMON) ? ((await urls.daemonUrl?.()) ?? null) : null;
|
|
const runningWebUrl = targets.includes(APP_KEYS.WEB) ? ((await urls.webUrl?.()) ?? null) : null;
|
|
await ensureSharedPortsResolved(targets, options, runningWebUrl, runningDaemonUrl);
|
|
}
|