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