// // Instance routing. Repositories are matched to a configured Gitea instance by // their git remote's host; anything unmatched falls back to the default one. // const config = require("../util/config.js"); const credentials = require("./credentials.js"); const remotes = require("./remotes.js"); const { GiteaClient } = require("./client.js"); const { GiteaApi } = require("./api.js"); class InstanceRouter { constructor() { this.apis = new Map(); } /** Base URLs of every configured instance, default first. */ get baseUrls() { return config.instances(); } apiFor(baseUrl) { const normalized = config.normalizeBaseUrl(baseUrl); if (!normalized) return null; let api = this.apis.get(normalized); if (!api) { api = new GiteaApi(new GiteaClient(normalized, credentials.getToken)); this.apis.set(normalized, api); } return api; } get defaultApi() { const urls = this.baseUrls; return urls.length ? this.apiFor(urls[0]) : null; } /** The instance whose host matches `host`, or null when none does. */ baseUrlForHost(host) { if (!host) return null; const target = host.toLowerCase(); for (const baseUrl of this.baseUrls) { if (remotes.hostOf(baseUrl) === target) return baseUrl; } return null; } apiForHost(host) { const baseUrl = this.baseUrlForHost(host); return baseUrl ? this.apiFor(baseUrl) : null; } /** Drops cached clients and tokens so the next call re-reads preferences. */ invalidate() { this.apis.clear(); credentials.invalidate(); } } exports.InstanceRouter = InstanceRouter;