1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const Router = require("koa-router");
|
4 | const Koa = require("koa");
|
5 | const url = require("url");
|
6 | const httpProxy = require("http-proxy");
|
7 | const http = require("http");
|
8 | const pathToRegexp = require("path-to-regexp");
|
9 | const sbase = require("@nodeswork/sbase");
|
10 | const logger = require("@nodeswork/logger");
|
11 | const applet = require("@nodeswork/applet");
|
12 | const utils_1 = require("@nodeswork/utils");
|
13 | const LOG = logger.getLogger();
|
14 | class Application extends Koa {
|
15 | }
|
16 | exports.Application = Application;
|
17 | const bodyParser = require('koa-bodyparser');
|
18 | exports.app = new Application();
|
19 | const router = new Router();
|
20 | const version = require('../package.json').version;
|
21 | const proxy = httpProxy.createProxyServer({});
|
22 | router
|
23 | .get('/sstats', sstats)
|
24 | .post('/executions/:executionId/metrics', async (ctx) => {
|
25 | const appletId = ctx.request.get(applet.constants.headers.request.APPLET_ID);
|
26 | if (appletId == null) {
|
27 | throw utils_1.NodesworkError.badRequest('applet id is missing');
|
28 | }
|
29 | ctx.body = await exports.app.appletManager.updateExecutionMetrics(ctx.params.executionId, {
|
30 | dimensions: ctx.request.body.dimensions,
|
31 | name: ctx.request.body.name,
|
32 | value: ctx.request.body.value,
|
33 | });
|
34 | })
|
35 | .post('/accounts/:accountId/operate', async (ctx) => {
|
36 | const appletId = ctx.request.get(applet.constants.headers.request.APPLET_ID);
|
37 | if (appletId == null) {
|
38 | throw utils_1.NodesworkError.badRequest('applet id is missing');
|
39 | }
|
40 | const operateOptions = {
|
41 | accountId: ctx.params.accountId,
|
42 | appletId,
|
43 | body: ctx.request.body,
|
44 | };
|
45 | try {
|
46 | ctx.body = await exports.app.appletManager.operateAccount(operateOptions);
|
47 | }
|
48 | catch (e) {
|
49 | if (e.name === 'StatusCodeError') {
|
50 | ctx.status = e.statusCode;
|
51 | ctx.body = e.error;
|
52 | }
|
53 | else {
|
54 | throw e;
|
55 | }
|
56 | }
|
57 | });
|
58 | exports.app
|
59 | .use(bodyParser())
|
60 | .use(router.routes())
|
61 | .use(router.allowedMethods());
|
62 | const routerPathRegex = pathToRegexp('/applets/:appletId/:naType/:naVersion/:packageName/:version/:path*');
|
63 | const callback = exports.app.callback();
|
64 | const httpServerCallback = async function (req, res) {
|
65 | LOG.info('Receiving request', {
|
66 | url: req.url,
|
67 | method: req.method,
|
68 | headers: req.headers,
|
69 | });
|
70 | const path = url.parse(req.url);
|
71 | const result = routerPathRegex.exec(path.pathname);
|
72 | if (result != null) {
|
73 | const appletId = result[1];
|
74 | const naType = result[2];
|
75 | const naVersion = result[3];
|
76 | const packageName = result[4];
|
77 | const version = result[5];
|
78 | const newPath = result[6] || '';
|
79 | const route = await exports.app.appletManager.route({
|
80 | appletId, naType, naVersion, packageName, version,
|
81 | });
|
82 | LOG.debug('Got routes', route);
|
83 | if (newPath === 'sstruct') {
|
84 | const origin = req.headers.origin;
|
85 | if (origin != null) {
|
86 | res.setHeader('Access-Control-Allow-Origin', origin);
|
87 | res.setHeader('Access-Control-Allow-Credentials', 'true');
|
88 | }
|
89 | }
|
90 | if (route != null) {
|
91 | req.url = newPath;
|
92 | req.headers[sbase.constants.headers.request.NODESWORK_FORWARDED_TO] = (route.route);
|
93 | proxy.web(req, res, {
|
94 | target: route.target,
|
95 | xfwd: true,
|
96 | toProxy: true,
|
97 | }, (e) => {
|
98 | res.writeHead(500, { 'Content-Type': 'text/plain' });
|
99 | const message = 'Routing Error in nam.';
|
100 | res.end(message);
|
101 | console.error(message, e);
|
102 | });
|
103 | return;
|
104 | }
|
105 | else {
|
106 | LOG.warn('Route not found', { path: result[0] });
|
107 | }
|
108 | }
|
109 | callback(req, res);
|
110 | };
|
111 | exports.server = http.createServer(httpServerCallback);
|
112 | async function sstats(ctx) {
|
113 | ctx.body = {
|
114 | app: {
|
115 | name: 'nam',
|
116 | version,
|
117 | },
|
118 | applets: {
|
119 | status: await exports.app.appletManager.ps(),
|
120 | },
|
121 | };
|
122 | }
|
123 |
|
124 |
|