-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbase-app-loader.js
132 lines (116 loc) · 3.91 KB
/
base-app-loader.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
'use strict';
let Hapi = require('@hapi/hapi'),
nconf = require('nconf'),
_ = require('lodash'),
fs = require('fs'),
Errors = require('./lib/common/errors');
class BaseAppLoader {
constructor(repoInfo, ) {
let me = this;
nconf.argv().env();
me.cwd = process.cwd();
me.applicationData = {
dependencies: {},
serverObjects: {}
};
me.repoInfo = repoInfo;
}
async bootUpApp() {
let me = this;
try {
me.fetchBaseRoutes();
await me.fetchConfig();
me.updateConfigAndDependencies();
await me.createHapiServerInstances();
me.registerAuthStrategies();
await me.registerPublicRoutes();
await me.startServers();
}
catch (err) {
throw err;
}
}
fetchBaseRoutes() {
let me = this;
me.applicationData.publicRoutePrefix = `/v1/${me.repoInfo.name}`;
}
async createHapiServerInstances() {
let me = this;
for (const instanceConfig of me.applicationData.config.server.instances) {
let server = new Hapi.server({
port: instanceConfig.port,
routes: {
validate: {
failAction: async (request, h, err) => {
if (err.isJoi) {
return h.response(err.output.payload)
.code(400)
.takeover();
}
return h.response(err).takeover()
}
}
}
});
let plugins = me.getSpecificPlugins(instanceConfig, me.applicationData.config, me.applicationData.dependencies);
await server.register(plugins);
me.applicationData.serverObjects[instanceConfig.label] = server;
}
}
registerAuthStrategies() {
let me = this;
_.each(_.values(me.applicationData.serverObjects), (serverObject) => {
me.registerSpecificStrategies(serverObject, me.applicationData.dependencies, me.applicationData.config);
})
}
async registerPublicRoutes() {
let me = this;
let routeFile = `${me.cwd}/lib/routes/register-public-routes`;
if (fs.existsSync(`${routeFile}.js`)) {
let RegisterRoutes = require(routeFile);
let routes = new RegisterRoutes(me.applicationData.dependencies, me.applicationData.config);
let server = me.applicationData.serverObjects['public']
await routes.init(server);
routes.registerRoutes(server);
}
}
async startServers() {
let me = this;
let firstServer = _.first(_.values(me.applicationData.serverObjects));
_.tail(_.values(me.applicationData.serverObjects)).forEach(function (serverObj) {
firstServer.control(serverObj);
});
await firstServer.start();
_.values(me.applicationData.serverObjects).forEach(function (serverObj) {
serverObj.log('Server started at: ' + serverObj.info.uri);
});
}
/**
* This method replies success back to the hapi reply. If the message object has a statusCode, then use that.
* @memberof BaseHelper
* @param {string} h Hapi response toolkit
* @param {object} message The message in the response.
*/
replySuccess(h, message) {
let statusCode = 200;
if (message && message.statusCode) {
statusCode = message.statusCode
}
return h.response(message).code(statusCode);
}
/**
* This method replies an error back to the hapi reply. If the error object has a statusCode, then use that. Otherwise, a 500 will be used.
* @memberof BaseHelper
* @param {string} h Hapi response tool kit
* @param {object} error The error in the response.
* @param {options} error Options. options.returnRawJSON is the flag to return raw JSON.
*/
replyError(h, error, options) {
const returnRawJSON = options && options.returnRawJSON ? options.returnRawJSON : false;
if (!error.statusCode && !error.status) {
error = Errors.UnexpectedErrorOccurred;
}
return h.response(returnRawJSON ? error : JSON.stringify(error)).code(error.statusCode || error.status || 500);
}
}
module.exports = BaseAppLoader;