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