unleash-server
Version:
Unleash is an enterprise ready feature toggles service. It provides different strategies for handling feature toggles.
119 lines • 4.7 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const controller_1 = __importDefault(require("../controller"));
const types_1 = require("../../types");
const openapi_1 = require("../../openapi");
const proxy_1 = require("../../proxy");
const middleware_1 = require("../../middleware");
class ProxyController extends controller_1.default {
constructor(config, services, flagResolver) {
super(config);
this.logger = config.getLogger('proxy-api/index.ts');
this.services = services;
this.flagResolver = flagResolver;
// Support CORS requests for the frontend endpoints.
// Preflight requests are handled in `app.ts`.
this.app.use((0, middleware_1.corsOriginMiddleware)(services, config));
this.route({
method: 'get',
path: '',
handler: this.getProxyFeatures,
permission: types_1.NONE,
middleware: [
this.services.openApiService.validPath({
tags: ['Unstable'],
operationId: 'getFrontendFeatures',
responses: {
200: (0, openapi_1.createResponseSchema)('proxyFeaturesSchema'),
},
}),
],
});
this.route({
method: 'post',
path: '',
handler: ProxyController.endpointNotImplemented,
permission: types_1.NONE,
});
this.route({
method: 'get',
path: '/client/features',
handler: ProxyController.endpointNotImplemented,
permission: types_1.NONE,
});
this.route({
method: 'post',
path: '/client/metrics',
handler: this.registerProxyMetrics,
permission: types_1.NONE,
middleware: [
this.services.openApiService.validPath({
tags: ['Unstable'],
operationId: 'registerFrontendMetrics',
requestBody: (0, openapi_1.createRequestSchema)('proxyMetricsSchema'),
responses: { 200: openapi_1.emptyResponse },
}),
],
});
this.route({
method: 'post',
path: '/client/register',
handler: ProxyController.registerProxyClient,
permission: types_1.NONE,
middleware: [
this.services.openApiService.validPath({
tags: ['Unstable'],
operationId: 'registerFrontendClient',
requestBody: (0, openapi_1.createRequestSchema)('proxyClientSchema'),
responses: { 200: openapi_1.emptyResponse },
}),
],
});
this.route({
method: 'get',
path: '/health',
handler: ProxyController.endpointNotImplemented,
permission: types_1.NONE,
});
this.route({
method: 'get',
path: '/internal-backstage/prometheus',
handler: ProxyController.endpointNotImplemented,
permission: types_1.NONE,
});
}
static async endpointNotImplemented(req, res) {
res.status(405).json({
message: 'The frontend API does not support this endpoint.',
});
}
async getProxyFeatures(req, res) {
let toggles;
if (this.flagResolver.isEnabled('proxyReturnAllToggles')) {
toggles = await this.services.proxyService.getAllProxyFeatures(req.user, ProxyController.createContext(req));
}
else {
toggles = await this.services.proxyService.getProxyFeatures(req.user, ProxyController.createContext(req));
}
res.set('Cache-control', 'public, max-age=2');
this.services.openApiService.respondWithValidation(200, res, openapi_1.proxyFeaturesSchema.$id, { toggles });
}
async registerProxyMetrics(req, res) {
await this.services.proxyService.registerProxyMetrics(req.user, req.body, req.ip);
res.sendStatus(200);
}
static async registerProxyClient(req, res) {
// Client registration is not yet supported by @unleash/proxy,
// but proxy clients may still expect a 200 from this endpoint.
res.sendStatus(200);
}
static createContext(req) {
const { query } = req;
return (0, proxy_1.enrichContextWithIp)(query, req.ip);
}
}
exports.default = ProxyController;
//# sourceMappingURL=index.js.map