Skip to content

Commit a9193d3

Browse files
authored
follow up PR for nodejs modernization (#142)
1 parent 0152717 commit a9193d3

File tree

11 files changed

+347
-298
lines changed

11 files changed

+347
-298
lines changed

src/services/nodejs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"supertest": "^7.0.0"
1616
},
1717
"scripts": {
18-
"test": "node --test tests/**/*.js"
18+
"test": "node --test tests/*.js"
1919
},
2020
"type": "module"
2121
}

src/services/nodejs/src/app.js

Lines changed: 74 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,97 @@
1-
21
import express from "express";
32
import bodyParser from "body-parser";
43
import url from "url";
54
import { msleep } from "./sleep.js";
65
import processCall from "./processCall.js";
76

8-
97
function createApp(config, logger, customCodeDir) {
8+
const endpoints = config.endpoints.http;
109

11-
const endpoints = config.endpoints.http;
12-
13-
14-
Object.keys(endpoints).forEach(function (key) {
15-
if (!key.startsWith("/")) {
16-
endpoints["/" + key] = endpoints[key];
17-
delete endpoints[key];
18-
}
19-
});
10+
Object.keys(endpoints).forEach(function (key) {
11+
if (!key.startsWith("/")) {
12+
endpoints["/" + key] = endpoints[key];
13+
delete endpoints[key];
14+
}
15+
});
2016

21-
const app = express();
17+
const app = express();
2218

23-
app.use(bodyParser.json()); // for parsing application/json
24-
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
19+
app.use(bodyParser.json()); // for parsing application/json
20+
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
2521

26-
app.use((req, res, next) => {
27-
const start = process.hrtime();
28-
res.on('finish', () => {
29-
const duration = process.hrtime(start);
30-
const responseTime = duration[0] * 1000 + duration[1] / 1e6;
31-
const logMessage = `${req.ip} - "${req.method} ${req.originalUrl} HTTP/${req.httpVersion}" ${res.statusCode} ${res.get('Content-Length') || 0} "${req.headers['user-agent']}" - ${responseTime.toFixed(3)} ms`;
32-
logger.debug(logMessage);
33-
});
34-
next();
22+
app.use((req, res, next) => {
23+
const start = process.hrtime();
24+
res.on("finish", () => {
25+
const duration = process.hrtime(start);
26+
const responseTime = duration[0] * 1000 + duration[1] / 1e6;
27+
const logMessage = `${req.ip} - "${req.method} ${req.originalUrl} HTTP/${req.httpVersion}" ${res.statusCode} ${res.get("Content-Length") || 0} "${req.headers["user-agent"]}" - ${responseTime.toFixed(3)} ms`;
28+
logger.debug(logMessage);
3529
});
36-
37-
async function processRequest(req, res, params) {
38-
const path = new URL(req.url, `http://${req.headers.host}`).pathname;
39-
logger.info("Request Headers:", req.headers);
40-
if (endpoints.hasOwnProperty(path)) {
41-
try {
42-
const results = [];
43-
for (let i = 0; i < endpoints[path].length; i++) {
44-
const call = endpoints[path][i];
45-
results.push(await processCall(call, req, logger, customCodeDir));
46-
}
47-
if (req.query.output && req.query.output === "javascript") {
48-
res.send(results);
49-
} else {
50-
res.send(results);
51-
}
52-
} catch (reason) {
53-
logger.error(reason);
54-
res
55-
.status(typeof reason.code === "number" ? reason.code : 500)
56-
.send(reason.message);
57-
}
30+
next();
31+
});
32+
33+
async function processRequest(req, res, params) {
34+
const path = new URL(req.url, `http://${req.headers.host}`).pathname;
35+
logger.info("Request Headers:", req.headers);
36+
if (endpoints.hasOwnProperty(path)) {
37+
try {
38+
const results = [];
39+
for (let i = 0; i < endpoints[path].length; i++) {
40+
const call = endpoints[path][i];
41+
results.push(await processCall(call, req, logger, customCodeDir));
42+
}
43+
if (req.query.output && req.query.output === "javascript") {
44+
res.send(results);
5845
} else {
59-
res.status(404).send("404");
46+
res.send(results);
6047
}
48+
} catch (reason) {
49+
logger.error(reason);
50+
res
51+
.status(typeof reason.code === "number" ? reason.code : 500)
52+
.send(reason.message);
53+
}
54+
} else {
55+
res.status(404).send("404");
6156
}
57+
}
6258

59+
app.get("/**", function (req, res) {
60+
processRequest(req, res, req.query);
61+
});
6362

63+
app.post("/**", function (req, res) {
64+
processRequest(req, res, req.body);
65+
});
6466

65-
66-
app.get("/**", function (req, res) {
67-
processRequest(req, res, req.query);
68-
});
69-
70-
app.post("/**", function (req, res) {
71-
processRequest(req, res, req.body);
72-
});
73-
74-
75-
return app;
67+
return app;
7668
}
7769

7870
function startServer(config, logger, customCodeDir, port = 8080) {
79-
80-
const app = createApp(config, logger, customCodeDir)
81-
82-
const server = app.listen(port, () =>
83-
logger.info(`Running ${config.name} (type: ${config.type}) on port ${port}`),
84-
);
85-
logger.debug(`Configuration:`);
86-
logger.debug(JSON.stringify(config));
87-
88-
if (config.hasOwnProperty("options")) {
89-
server.on("connection", (socket) => {
90-
if (config.options.hasOwnProperty("connectionDelay")) {
91-
msleep(config.options.connectionDelay);
92-
}
93-
if (
94-
config.options.hasOwnProperty("lossRate") &&
95-
parseFloat(config.options.lossRate) >= Math.random()
96-
) {
97-
socket.end();
98-
throw new Error("An error occurred");
99-
}
100-
});
101-
}
71+
const app = createApp(config, logger, customCodeDir);
72+
73+
const server = app.listen(port, () =>
74+
logger.info(
75+
`Running ${config.name} (type: ${config.type}) on port ${port}`,
76+
),
77+
);
78+
logger.debug(`Configuration:`);
79+
logger.debug(JSON.stringify(config));
80+
81+
if (config.hasOwnProperty("options")) {
82+
server.on("connection", (socket) => {
83+
if (config.options.hasOwnProperty("connectionDelay")) {
84+
msleep(config.options.connectionDelay);
85+
}
86+
if (
87+
config.options.hasOwnProperty("lossRate") &&
88+
parseFloat(config.options.lossRate) >= Math.random()
89+
) {
90+
socket.end();
91+
throw new Error("An error occurred");
92+
}
93+
});
94+
}
10295
}
10396

104-
export { createApp, startServer };
97+
export { createApp, startServer };

src/services/nodejs/src/app.test.js

Whitespace-only changes.
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
function buildResponse(timeout) {
2-
const start = process.hrtime();
3-
let elapsed = process.hrtime(start);
4-
let response = "";
5-
while (elapsed[0] * 1000000000 + elapsed[1] < timeout * 1000000) {
6-
response += " ";
7-
elapsed = process.hrtime(start);
8-
}
9-
return response.length + " slow response";
2+
const start = process.hrtime();
3+
let elapsed = process.hrtime(start);
4+
let response = "";
5+
while (elapsed[0] * 1000000000 + elapsed[1] < timeout * 1000000) {
6+
response += " ";
7+
elapsed = process.hrtime(start);
8+
}
9+
return response.length + " slow response";
1010
}
1111

12-
export default buildResponse;
12+
export default buildResponse;

src/services/nodejs/src/commands/callRemoteService.js

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,41 +3,41 @@ import https from "https";
33
import { URL } from "url";
44

55
function callRemoteService(
6-
call,
7-
catchExceptions,
8-
remoteTimeout,
9-
req,
10-
resolve,
11-
reject,
6+
call,
7+
catchExceptions,
8+
remoteTimeout,
9+
req,
10+
resolve,
11+
reject,
1212
) {
13-
let headers = {
14-
"Content-Type": "application/json",
15-
};
16-
// removed logic to decide what happens w/ w/o agent
17-
headers = req.headers;
18-
const opts = {
19-
...new URL(call),
20-
headers,
21-
};
13+
let headers = {
14+
"Content-Type": "application/json",
15+
};
16+
// removed logic to decide what happens w/ w/o agent
17+
headers = req.headers;
18+
const opts = {
19+
...new URL(call),
20+
headers,
21+
};
2222

23-
const h = opts.protocol === "https:" ? https : http;
23+
const h = opts.protocol === "https:" ? https : http;
2424

25-
const r = h
26-
.get(opts, function (res, req) {
27-
const body = [];
28-
res.on("data", (chunk) => body.push(chunk));
29-
res.on("end", () => resolve(body.join("")));
30-
})
31-
.on("error", function (err) {
32-
if (catchExceptions) {
33-
resolve(err);
34-
} else {
35-
reject(err);
36-
}
37-
});
38-
r.setTimeout(remoteTimeout, function () {
39-
reject({ code: 500, message: "Read timed out" });
25+
const r = h
26+
.get(opts, function (res, req) {
27+
const body = [];
28+
res.on("data", (chunk) => body.push(chunk));
29+
res.on("end", () => resolve(body.join("")));
30+
})
31+
.on("error", function (err) {
32+
if (catchExceptions) {
33+
resolve(err);
34+
} else {
35+
reject(err);
36+
}
4037
});
38+
r.setTimeout(remoteTimeout, function () {
39+
reject({ code: 500, message: "Read timed out" });
40+
});
4141
}
4242

43-
export default callRemoteService;
43+
export default callRemoteService;
Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,30 @@
1-
2-
import { msleep } from "../sleep.js"
1+
import { msleep } from "../sleep.js";
32
import path from "path";
43
import Chance from "chance";
54

65
const chance = new Chance();
76

87
function executeCustomScript(customCodeDir, script, req, resolve, reject) {
9-
var r = require(path.join(customCodeDir, script))({
10-
logger: logger,
11-
req: req,
12-
cronmatch: cronmatch,
13-
sleep: msleep,
14-
chance: chance,
15-
});
16-
if (r === false) {
17-
reject(`Script ${script} was not executed successfully`);
18-
} else if (
19-
typeof r === "object" &&
20-
r.hasOwnProperty("code") &&
21-
r.hasOwnProperty("code")
22-
) {
23-
reject({ code: r.code, message: r.message });
24-
} else if (typeof r === "string") {
25-
resolve(r);
26-
} else {
27-
resolve(`Script ${script} was executed successfully`);
28-
}
8+
var r = require(path.join(customCodeDir, script))({
9+
logger: logger,
10+
req: req,
11+
cronmatch: cronmatch,
12+
sleep: msleep,
13+
chance: chance,
14+
});
15+
if (r === false) {
16+
reject(`Script ${script} was not executed successfully`);
17+
} else if (
18+
typeof r === "object" &&
19+
r.hasOwnProperty("code") &&
20+
r.hasOwnProperty("code")
21+
) {
22+
reject({ code: r.code, message: r.message });
23+
} else if (typeof r === "string") {
24+
resolve(r);
25+
} else {
26+
resolve(`Script ${script} was executed successfully`);
27+
}
2928
}
3029

31-
export default executeCustomScript;
30+
export default executeCustomScript;
Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
21
function logMessage(logger, level, message) {
3-
if (logger.hasOwnProperty(level)) {
4-
logger[level](message);
5-
} else {
6-
logger.info(message);
7-
}
8-
return "Logged (" + level + "): " + message;
2+
if (logger.hasOwnProperty(level)) {
3+
logger[level](message);
4+
} else {
5+
logger.info(message);
96
}
7+
return "Logged (" + level + "): " + message;
8+
}
109

11-
export default logMessage;
10+
export default logMessage;

src/services/nodejs/src/logger.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import log4js from "log4js";
22

3-
export const logDir = process.env.LOG_DIRECTORY ? process.env.LOG_DIRECTORY : ".";
3+
export const logDir = process.env.LOG_DIRECTORY
4+
? process.env.LOG_DIRECTORY
5+
: ".";
46

57
log4js.configure({
68
appenders: {
@@ -9,14 +11,14 @@ log4js.configure({
911
filename: `${logDir}/node.log`,
1012
layout: {
1113
type: "pattern",
12-
pattern: "%d{yyyy-MM-dd hh:mm:ss,SSS} [%z] [%X{AD.requestGUID}] %p %c - %m",
14+
pattern: "%d{yyyy-MM-dd hh:mm:ss,SSS} [%z] %p %c - %m",
1315
},
1416
},
1517
CONSOLE: {
1618
type: "stdout",
1719
layout: {
1820
type: "pattern",
19-
pattern: "%d{yyyy-MM-dd hh:mm:ss,SSS} [%z] [%X{AD.requestGUID}] %p %c - %m",
21+
pattern: "%d{yyyy-MM-dd hh:mm:ss,SSS} [%z] %p %c - %m",
2022
},
2123
},
2224
},
@@ -26,4 +28,4 @@ log4js.configure({
2628
var logger = log4js.getLogger();
2729
logger.level = "debug";
2830

29-
export default logger;
31+
export default logger;

0 commit comments

Comments
 (0)