From f4ad0383cd9c1165c27e98d5f43cd8c7961a058d Mon Sep 17 00:00:00 2001 From: Pierre Date: Sun, 19 Apr 2026 20:16:52 +0200 Subject: [PATCH] fix sevice discovery --- Dockerfile | 2 +- docker/welcome.html | 2 ++ packages/meta-fuse-core/src/api/APIServer.ts | 35 +++++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 docker/welcome.html diff --git a/Dockerfile b/Dockerfile index 440a7d3..36bdcb8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,7 +39,7 @@ COPY packages/meta-fuse-core/src/ ./src/ RUN npm run build # Stage 3: Build FUSE Driver -FROM rust:1.83-bookworm AS fuse-builder +FROM rust:1.86-bookworm AS fuse-builder WORKDIR /build diff --git a/docker/welcome.html b/docker/welcome.html new file mode 100644 index 0000000..7acc16f --- /dev/null +++ b/docker/welcome.html @@ -0,0 +1,2 @@ + +MetaFuse

MetaFuse

diff --git a/packages/meta-fuse-core/src/api/APIServer.ts b/packages/meta-fuse-core/src/api/APIServer.ts index f2492d9..4d59503 100644 --- a/packages/meta-fuse-core/src/api/APIServer.ts +++ b/packages/meta-fuse-core/src/api/APIServer.ts @@ -85,7 +85,40 @@ export class APIServer { this.app.post('/api/fuse/rules/validate', this.handleValidateRule.bind(this)); this.app.get('/api/fuse/rules/variables', this.handleGetVariables.bind(this)); - // Note: /api/services is handled by nginx proxy to meta-core (centralized service discovery) + // Service discovery — proxies to meta-core's /api/services, resolving the + // current leader's URL via LeaderClient (no hardcoded hostname). + this.app.get('/api/services', this.handleServices.bind(this)); + } + + /** + * Proxy handler that forwards /api/services to meta-core's canonical + * registry endpoint using LeaderClient for discovery. + */ + private async handleServices(_req: FastifyRequest, reply: FastifyReply): Promise { + try { + const leaderClient = this.kvManager?.getLeaderClient(); + if (!leaderClient) { + reply.status(503).send({ error: 'KVManager not initialized' }); + return; + } + const apiUrl = await leaderClient.getApiUrl(); + if (!apiUrl) { + reply.status(503).send({ error: 'Leader not available yet' }); + return; + } + const response = await fetch(`${apiUrl}/api/services`, { + signal: AbortSignal.timeout(5000), + }); + if (!response.ok) { + reply.status(response.status).send({ + error: `Upstream ${apiUrl} returned ${response.status}`, + }); + return; + } + reply.send(await response.json()); + } catch (err: any) { + reply.status(502).send({ error: err?.message ?? String(err) }); + } } /**