From fae11e5a55c4bf903a3cbdf3847f365898de9b5c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 27 Dec 2025 00:07:19 +0100 Subject: [PATCH] fix(gateway): advertise reachable canvas host --- src/gateway/server.ts | 5 +++++ src/infra/bridge/server.ts | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/gateway/server.ts b/src/gateway/server.ts index 23a61bb86..0975d8053 100644 --- a/src/gateway/server.ts +++ b/src/gateway/server.ts @@ -3204,6 +3204,10 @@ export async function startGatewayServer( const machineDisplayName = await getMachineDisplayName(); const canvasHostPortForBridge = canvasHostServer?.port; + const canvasHostHostForBridge = + canvasHostServer && bridgeHost && bridgeHost !== "0.0.0.0" && bridgeHost !== "::" + ? bridgeHost + : undefined; if (bridgeEnabled && bridgePort > 0 && bridgeHost) { try { @@ -3212,6 +3216,7 @@ export async function startGatewayServer( port: bridgePort, serverName: machineDisplayName, canvasHostPort: canvasHostPortForBridge, + canvasHostHost: canvasHostHostForBridge, onRequest: (nodeId, req) => handleBridgeRequest(nodeId, req), onAuthenticated: async (node) => { const host = node.displayName?.trim() || node.nodeId; diff --git a/src/infra/bridge/server.ts b/src/infra/bridge/server.ts index 77681cb35..64c2df76b 100644 --- a/src/infra/bridge/server.ts +++ b/src/infra/bridge/server.ts @@ -138,6 +138,7 @@ export type NodeBridgeServerOpts = { port: number; // 0 = ephemeral pairingBaseDir?: string; canvasHostPort?: number; + canvasHostHost?: string; onEvent?: (nodeId: string, evt: BridgeEventFrame) => Promise | void; onRequest?: ( nodeId: string, @@ -187,10 +188,20 @@ export async function startNodeBridgeServer( ? opts.serverName.trim() : os.hostname(); + const isLoopbackHost = (host: string) => { + const normalized = host.trim().toLowerCase(); + if (normalized === "localhost") return true; + if (normalized === "::1") return true; + if (normalized === "0.0.0.0" || normalized === "::") return true; + return normalized.startsWith("127."); + }; + const buildCanvasHostUrl = (socket: net.Socket) => { const port = opts.canvasHostPort; if (!port) return undefined; - const host = socket.localAddress?.trim(); + const localHost = socket.localAddress?.trim() ?? ""; + const override = opts.canvasHostHost?.trim() ?? ""; + const host = !localHost || isLoopbackHost(localHost) ? override : localHost; if (!host) return undefined; const formatted = host.includes(":") ? `[${host}]` : host; return `http://${formatted}:${port}`;