1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

use common vars in router, minor clean up (#551)

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2020-07-02 17:21:38 +03:00 committed by GitHub
parent 336daea333
commit d90be46a1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 53 additions and 35 deletions

View File

@ -28,7 +28,6 @@ export const staticProto = "static://"
export const apiPrefix = { export const apiPrefix = {
BASE: '/api', BASE: '/api',
TERMINAL: '/api-terminal', // terminal api
KUBE_BASE: '/api-kube', // kubernetes cluster api KUBE_BASE: '/api-kube', // kubernetes cluster api
KUBE_HELM: '/api-helm', // helm charts api KUBE_HELM: '/api-helm', // helm charts api
KUBE_RESOURCE_APPLIER: "/api-resource", KUBE_RESOURCE_APPLIER: "/api-resource",

View File

@ -2,7 +2,7 @@ import Call from "@hapi/call"
import Subtext from "@hapi/subtext" import Subtext from "@hapi/subtext"
import http from "http" import http from "http"
import path from "path" import path from "path"
import { readFile } from "fs" import { readFile } from "fs-extra"
import { Cluster } from "./cluster" import { Cluster } from "./cluster"
import { configRoute } from "./routes/config" import { configRoute } from "./routes/config"
import { helmApi } from "./helm-api" import { helmApi } from "./helm-api"
@ -11,9 +11,9 @@ import { kubeconfigRoute } from "./routes/kubeconfig"
import { metricsRoute } from "./routes/metrics" import { metricsRoute } from "./routes/metrics"
import { watchRoute } from "./routes/watch" import { watchRoute } from "./routes/watch"
import { portForwardRoute } from "./routes/port-forward" import { portForwardRoute } from "./routes/port-forward"
import { outDir, reactAppName } from "../common/vars"; import { apiPrefix, outDir, reactAppName } from "../common/vars";
const mimeTypes: {[key: string]: string} = { const mimeTypes: Record<string, string> = {
"html": "text/html", "html": "text/html",
"txt": "text/plain", "txt": "text/plain",
"css": "text/css", "css": "text/css",
@ -82,22 +82,30 @@ export class Router {
return request return request
} }
protected handleStaticFile(filePath: string, response: http.ServerResponse) { protected getMimeType(filename: string) {
return mimeTypes[path.extname(filename).slice(1)] || "text/plain"
}
protected async handleStaticFile(filePath: string, response: http.ServerResponse) {
const asset = path.resolve(outDir, filePath); const asset = path.resolve(outDir, filePath);
readFile(asset, (err, data) => { try {
if (err) { const data = await readFile(asset);
// default to index.html so that react routes work when page is refreshed response.setHeader("Content-Type", this.getMimeType(asset));
this.handleStaticFile(`${reactAppName}.html`, response)
} else {
const type = mimeTypes[path.extname(asset).slice(1)] || "text/plain";
response.setHeader("Content-Type", type);
response.write(data) response.write(data)
response.end() response.end()
} catch (err) {
// default to index.html so that react routes work when page is refreshed
this.handleStaticFile(`${reactAppName}.html`, response)
} }
})
} }
protected addRoutes() { protected addRoutes() {
const {
BASE: apiBase,
KUBE_HELM: apiHelm,
KUBE_RESOURCE_APPLIER: apiResource,
} = apiPrefix;
// Static assets // Static assets
this.router.add({ method: 'get', path: '/{path*}' }, (request: LensApiRequest) => { this.router.add({ method: 'get', path: '/{path*}' }, (request: LensApiRequest) => {
const { response, params } = request const { response, params } = request
@ -105,33 +113,33 @@ export class Router {
this.handleStaticFile(file, response) this.handleStaticFile(file, response)
}) })
this.router.add({ method: 'get', path: '/api/config' }, configRoute.routeConfig.bind(configRoute)) this.router.add({ method: "get", path: `${apiBase}/config` }, configRoute.routeConfig.bind(configRoute))
this.router.add({ method: 'get', path: '/api/kubeconfig/service-account/{namespace}/{account}' }, kubeconfigRoute.routeServiceAccountRoute.bind(kubeconfigRoute)) this.router.add({ method: "get", path: `${apiBase}/kubeconfig/service-account/{namespace}/{account}` }, kubeconfigRoute.routeServiceAccountRoute.bind(kubeconfigRoute))
// Watch API // Watch API
this.router.add({ method: 'get', path: '/api/watch' }, watchRoute.routeWatch.bind(watchRoute)) this.router.add({ method: "get", path: `${apiBase}/watch` }, watchRoute.routeWatch.bind(watchRoute))
// Metrics API // Metrics API
this.router.add({ method: 'post', path: '/api/metrics' }, metricsRoute.routeMetrics.bind(metricsRoute)) this.router.add({ method: "post", path: `${apiBase}/metrics` }, metricsRoute.routeMetrics.bind(metricsRoute))
// Port-forward API // Port-forward API
this.router.add({ method: 'post', path: '/api/services/{namespace}/{service}/port-forward/{port}' }, portForwardRoute.routeServicePortForward.bind(portForwardRoute)) this.router.add({ method: "post", path: `${apiBase}/services/{namespace}/{service}/port-forward/{port}` }, portForwardRoute.routeServicePortForward.bind(portForwardRoute))
// Helm API // Helm API
this.router.add({ method: 'get', path: '/api-helm/v2/charts' }, helmApi.listCharts.bind(helmApi)) this.router.add({ method: "get", path: `${apiHelm}/v2/charts` }, helmApi.listCharts.bind(helmApi))
this.router.add({ method: 'get', path: '/api-helm/v2/charts/{repo}/{chart}' }, helmApi.getChart.bind(helmApi)) this.router.add({ method: "get", path: `${apiHelm}/v2/charts/{repo}/{chart}` }, helmApi.getChart.bind(helmApi))
this.router.add({ method: 'get', path: '/api-helm/v2/charts/{repo}/{chart}/values' }, helmApi.getChartValues.bind(helmApi)) this.router.add({ method: "get", path: `${apiHelm}/v2/charts/{repo}/{chart}/values` }, helmApi.getChartValues.bind(helmApi))
this.router.add({ method: 'post', path: '/api-helm/v2/releases' }, helmApi.installChart.bind(helmApi)) this.router.add({ method: "post", path: `${apiHelm}/v2/releases` }, helmApi.installChart.bind(helmApi))
this.router.add({ method: 'put', path: '/api-helm/v2/releases/{namespace}/{release}' }, helmApi.updateRelease.bind(helmApi)) this.router.add({ method: `put`, path: `${apiHelm}/v2/releases/{namespace}/{release}` }, helmApi.updateRelease.bind(helmApi))
this.router.add({ method: 'put', path: '/api-helm/v2/releases/{namespace}/{release}/rollback' }, helmApi.rollbackRelease.bind(helmApi)) this.router.add({ method: `put`, path: `${apiHelm}/v2/releases/{namespace}/{release}/rollback` }, helmApi.rollbackRelease.bind(helmApi))
this.router.add({ method: 'get', path: '/api-helm/v2/releases/{namespace?}' }, helmApi.listReleases.bind(helmApi)) this.router.add({ method: "get", path: `${apiHelm}/v2/releases/{namespace?}` }, helmApi.listReleases.bind(helmApi))
this.router.add({ method: 'get', path: '/api-helm/v2/releases/{namespace}/{release}' }, helmApi.getRelease.bind(helmApi)) this.router.add({ method: "get", path: `${apiHelm}/v2/releases/{namespace}/{release}` }, helmApi.getRelease.bind(helmApi))
this.router.add({ method: 'get', path: '/api-helm/v2/releases/{namespace}/{release}/values' }, helmApi.getReleaseValues.bind(helmApi)) this.router.add({ method: "get", path: `${apiHelm}/v2/releases/{namespace}/{release}/values` }, helmApi.getReleaseValues.bind(helmApi))
this.router.add({ method: 'get', path: '/api-helm/v2/releases/{namespace}/{release}/history' }, helmApi.getReleaseHistory.bind(helmApi)) this.router.add({ method: "get", path: `${apiHelm}/v2/releases/{namespace}/{release}/history` }, helmApi.getReleaseHistory.bind(helmApi))
this.router.add({ method: 'delete', path: '/api-helm/v2/releases/{namespace}/{release}' }, helmApi.deleteRelease.bind(helmApi)) this.router.add({ method: "delete", path: `${apiHelm}/v2/releases/{namespace}/{release}` }, helmApi.deleteRelease.bind(helmApi))
// Resource Applier API // Resource Applier API
this.router.add({ method: 'post', path: '/api-resource/stack' }, resourceApplierApi.applyResource.bind(resourceApplierApi)) this.router.add({ method: "post", path: `${apiResource}/stack` }, resourceApplierApi.applyResource.bind(resourceApplierApi))
} }
} }

View File

@ -50,7 +50,6 @@ export class TerminalApi extends WebSocketApi {
async getUrl(token: string) { async getUrl(token: string) {
const { hostname, protocol } = location; const { hostname, protocol } = location;
let { port } = location; let { port } = location;
const prefix = apiPrefix.TERMINAL;
const { id, node } = this.options; const { id, node } = this.options;
const wss = `ws${protocol === "https:" ? "s" : ""}://`; const wss = `ws${protocol === "https:" ? "s" : ""}://`;
const queryParams = { token, id }; const queryParams = { token, id };
@ -63,7 +62,7 @@ export class TerminalApi extends WebSocketApi {
type: "node" type: "node"
}); });
} }
return `${wss}${hostname}${port}${prefix}/api?${stringify(queryParams)}`; return `${wss}${hostname}${port}/api?${stringify(queryParams)}`;
} }
async connect() { async connect() {

12
types/mocks.d.ts vendored
View File

@ -1,5 +1,17 @@
// Black-boxed modules without type safety
declare module "electron-promise-ipc" declare module "electron-promise-ipc"
declare module "mac-ca" declare module "mac-ca"
declare module "win-ca" declare module "win-ca"
declare module "@hapi/call" declare module "@hapi/call"
declare module "@hapi/subtext" declare module "@hapi/subtext"
// Support import for custom module extensions
// https://www.typescriptlang.org/docs/handbook/modules.html#wildcard-module-declarations
declare module "*.scss" {
const content: string;
export = content;
}
declare module "*.ttf" {
const content: string;
export = content;
}