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
const http = require('http');

class PipelineBuilder {
	static build(functions, index = 0) {
		if (functions.length == index) return sett => {};

		let aggregateFunc = settings =>
			functions[index](settings, PipelineBuilder.build(functions, index + 1));

		return aggregateFunc;
	}
}

class SimpleHttpServer {
	constructor(port) {
		this.port = port;
		this.settings = {};
		this.requestHandlers = [];
		this.httpRequestPipelineHandler = null;
	}

	use(requestHandler) {
		this.requestHandlers.push(requestHandler);
	}

	useSetting(key, value) {
		this.settings[key] = value;
	}

	start() {
		this.httpRequestPipelineHandler = PipelineBuilder.build(
			this.requestHandlers
		);

		http
			.createServer(
				function(req, res) {
					let env = this.settings;

					env.req = req;

					env.res = res;

					this.httpRequestPipelineHandler(env);

					res.end(); //end the response
				}.bind(this)
			)
			.listen(this.port); //the server object listens on port 8080
	}
}

const httpServer = new SimpleHttpServer(8080);

httpServer.useSetting('Routes', {
	Default: '/{controller}/{action}',
	Route1: '/{controller}/{action}/{id}',
	Route2: '/{controller}/{action}/{name}/{id}'
});

httpServer.use((env, next) => {
	env.res.write("<p style='color:red'>Middleware1 executed</p>"); //write a response to the client

	env.res.write(
		'<p>Routes coming from initial settings</p>' + JSON.stringify(env.Routes)
	); //write a response to the client

	env.sessionKey = 'TestSession';

	next(env);
});

httpServer.use((env, next) => {
	env.res.write("<p style='color:red'>Middleware2 executed</p>"); //write a response to the client

	env.res.write('<p>sessionKey coming from Middleware1</p>', env.sessionKey); //write a response to the client

	env.IsSessionValid = true;

	next(env);
});

httpServer.use((env, next) => {
	env.res.write("<p style='color:red'>Middleware3 executed</p>"); //write a response to the client

	if (env.IsSessionValid) {
		env.res.write('<p>Session is valid</p>'); //write a response to the client
	}

	//next(env);
});

httpServer.start();
node v9.7.1 linux/amd64