UNPKG

3.78 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const Router = require("koa-router");
4const Koa = require("Koa");
5const url = require("url");
6const httpProxy = require("http-proxy");
7const http = require("http");
8const pathToRegexp = require("path-to-regexp");
9const sbase = require("@nodeswork/sbase");
10const logger = require("@nodeswork/logger");
11const applet = require("@nodeswork/applet");
12const utils_1 = require("@nodeswork/utils");
13const LOG = logger.getLogger();
14class Application extends Koa {
15}
16exports.Application = Application;
17const bodyParser = require('koa-bodyparser');
18const statuses = require('statuses');
19exports.app = new Application();
20const router = new Router();
21const version = require('../package.json').version;
22const proxy = httpProxy.createProxyServer({});
23statuses['470'] = 'Permission Denied';
24router
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});
49exports.app
50 .use(bodyParser())
51 .use(router.routes())
52 .use(router.allowedMethods());
53const routerPathRegex = pathToRegexp('/applets/:appletId/:naType/:naVersion/:packageName/:version/:path*');
54const callback = exports.app.callback();
55const 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};
102exports.server = http.createServer(httpServerCallback);
103async 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//# sourceMappingURL=server.js.map