// The path the backend is served under, read from its base URL (SEMAPPS_HOME_URL): `/` when the // backend owns its origin (http://localhost:3005 locally), `/api/` when it shares the front end's // origin (https:///api/, the Coolify layout, where one base URL per environment keeps pull // request previews on a single host). The proxy in front passes the path through unchanged; SemApps // mounts every route it adds under the base path, except the `/.well-known` ones, which stay at the // origin root. Festipod's own routes and its public-surface allow-list follow the same split. const urlJoin = require('url-join'); /** basePathOf(baseUrl) → the base URL's path, always ending with `/` (`/` when it has none or is unset). */ function basePathOf(baseUrl) { if (!baseUrl) return '/'; const { pathname } = new URL(baseUrl); return pathname.endsWith('/') ? pathname : `${pathname}/`; } /** underBasePath(basePath, path) → the absolute `path` (e.g. `/catalog`) as mounted under `basePath`. */ function underBasePath(basePath, path) { return basePath + path.replace(/^\/+/, ''); } /** * requestUri(baseUrl, requestPath) → the absolute URI a request was made to. `requestPath` is the raw * path the gateway received (moleculer-web's `originalUrl`), base path included: the base path is * taken off before joining it to the base URL, which would otherwise repeat it. Joining (rather than * resolving with `new URL`) keeps the base URL exactly as written — host case, explicit port — so the * result matches the URIs the backend mints from the same base URL, its actor's first. */ function requestUri(baseUrl, requestPath) { const basePath = basePathOf(baseUrl); const relative = requestPath.startsWith(basePath) ? requestPath.slice(basePath.length - 1) : requestPath; return urlJoin(baseUrl, relative); } module.exports = { basePathOf, underBasePath, requestUri };