1 | "use strict";
|
2 | var __importStar = (this && this.__importStar) || function (mod) {
|
3 | if (mod && mod.__esModule) return mod;
|
4 | var result = {};
|
5 | if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
6 | result["default"] = mod;
|
7 | return result;
|
8 | };
|
9 | Object.defineProperty(exports, "__esModule", { value: true });
|
10 | const fs = __importStar(require("fs"));
|
11 | const akala = __importStar(require("@akala/core"));
|
12 | const path_1 = require("path");
|
13 | const router_1 = require("./router");
|
14 | var log = akala.log('akala:master');
|
15 | const microservice_1 = require("./microservice");
|
16 | const config_1 = require("./config");
|
17 | const master_meta_1 = require("./master-meta");
|
18 | var httpPackage = 'http';
|
19 | var port = process.env.PORT || '5678';
|
20 | akala.register('$updateConfig', new Proxy(config_1.updateConfig, {
|
21 | get: function (uc, key) {
|
22 | return function (config, subKey) {
|
23 | return uc(config, key + '.' + subKey);
|
24 | };
|
25 | }
|
26 | }));
|
27 | akala.registerFactory('$config', new Proxy(config_1.getConfig, {
|
28 | get: function (c, key) {
|
29 | return function () {
|
30 | return c().then(function (config) { return config[key]; });
|
31 | };
|
32 | }
|
33 | }));
|
34 | var lateBoundRoutes = router_1.router();
|
35 | var preAuthenticatedRouter = router_1.router();
|
36 | var authenticationRouter = router_1.router();
|
37 | var app = router_1.router();
|
38 | akala.register('$preAuthenticationRouter', preAuthenticatedRouter);
|
39 | akala.register('$authenticationRouter', authenticationRouter);
|
40 | akala.register('$router', lateBoundRoutes);
|
41 | var masterRouter = router_1.router();
|
42 | masterRouter.use(preAuthenticatedRouter.router);
|
43 | masterRouter.use(authenticationRouter.router);
|
44 | masterRouter.use(lateBoundRoutes.router);
|
45 | masterRouter.use(app.router);
|
46 | var root;
|
47 | var index;
|
48 | var privateKey;
|
49 | var fullchain;
|
50 | var configFile = fs.realpathSync('./config.json');
|
51 | fs.exists(configFile, function (exists) {
|
52 | var config = exists && require(configFile) || {};
|
53 | root = config && config['@akala/server'] && config['@akala/server'].root;
|
54 | index = config && config['@akala/server'] && config['@akala/server'].index;
|
55 | port = config && config['@akala/server'] && config['@akala/server'].port || port;
|
56 | privateKey = config && config['@akala/server'] && config['@akala/server'].privateKey || 'privkey.pem';
|
57 | fullchain = config && config['@akala/server'] && config['@akala/server'].fullchain || 'fullchain.pem';
|
58 | if (fs.existsSync(privateKey) && fs.existsSync(fullchain))
|
59 | httpPackage = 'https';
|
60 | var dn = config && config['@akala/server'] && config['@akala/server'].dn || 'localhost';
|
61 | akala.register('$rootUrl', httpPackage + '://' + dn + ':' + port);
|
62 | var sourcesFile = './sources.list';
|
63 | fs.readFile(sourcesFile, 'utf8', function (error, sourcesFileContent) {
|
64 | var sources = [];
|
65 | var modules = [];
|
66 | if (error && error.code == 'ENOENT') {
|
67 | var pkg = require(path_1.join(process.cwd(), './package.json'));
|
68 | var [source, folder] = pkg.name.split('/');
|
69 | microservice_1.microservice(pkg.name, source, [source], config);
|
70 | modules.push(pkg.name);
|
71 | }
|
72 | else {
|
73 | sources = JSON.parse(sourcesFileContent);
|
74 | }
|
75 | akala.eachAsync(sources, function (source, i, next) {
|
76 | fs.readdir('node_modules/' + source, function (err, dirModules) {
|
77 | if (err) {
|
78 | console.error(err);
|
79 | return;
|
80 | }
|
81 | dirModules.forEach(function (folder) {
|
82 | microservice_1.microservice(source + '/' + folder, source, [source], config);
|
83 | modules.push(source + '/' + folder);
|
84 | });
|
85 | next();
|
86 | });
|
87 | }, function (error) {
|
88 | if (error) {
|
89 | console.error(error);
|
90 | return;
|
91 | }
|
92 | akala.register('$$modules', modules);
|
93 | log(modules);
|
94 | akala.module('bootstrap', ...modules).activate([], function () {
|
95 | log('registering error handler');
|
96 | var serveRoot = master_meta_1.serveStatic(root, { index: index || undefined });
|
97 | preAuthenticatedRouter.use(master_meta_1.serveStatic(root, { index: index || undefined, fallthrough: true }));
|
98 | preAuthenticatedRouter.get('/favicon.ico', master_meta_1.serveStatic(root, { index: index || undefined, fallthrough: false }));
|
99 | preAuthenticatedRouter.get('/manifest.json', master_meta_1.serveStatic(root, { index: index || undefined, fallthrough: false }));
|
100 | app.get('/@akala/client', function (_req, res) {
|
101 | res.json(modules.map(m => { return { name: m, dep: akala.module(m).dep }; }));
|
102 | });
|
103 | app.get('*', function (request, response) {
|
104 | if (request.url.endsWith('.map')) {
|
105 | response.sendStatus(404);
|
106 | }
|
107 | else
|
108 | serveRoot(request, response, function () {
|
109 | fs.createReadStream(root + '/index.html').pipe(response);
|
110 | });
|
111 | });
|
112 | masterRouter.use(function (err, req, res, next) {
|
113 | try {
|
114 | if (err) {
|
115 | console.error('error occurred on ' + req.url);
|
116 | console.error(err.stack);
|
117 | res.statusCode = 500;
|
118 | res.write(JSON.stringify(err));
|
119 | res.end();
|
120 | }
|
121 | else
|
122 | res.sendStatus(404);
|
123 | }
|
124 | catch (e) {
|
125 | console.error(e.stack);
|
126 | res.statusCode = 500;
|
127 | res.end();
|
128 | }
|
129 | });
|
130 | });
|
131 | akala.module('bootstrap').activate(['$rootUrl'], function (url) {
|
132 | console.log('server ready and listening on ' + url + '...');
|
133 | });
|
134 | akala.module('bootstrap').start();
|
135 | });
|
136 | });
|
137 | switch (httpPackage) {
|
138 | case 'http':
|
139 | const http = require('http');
|
140 | var server = http.createServer();
|
141 | break;
|
142 | case 'https':
|
143 |
|
144 |
|
145 | const https = require(httpPackage);
|
146 | var server = https.createServer({ key: fs.readFileSync(privateKey), cert: fs.readFileSync(fullchain) });
|
147 | break;
|
148 | }
|
149 | server.listen(port, dn);
|
150 | akala.register('$server', server);
|
151 | masterRouter.attachTo(server);
|
152 | });
|
153 |
|
\ | No newline at end of file |