generated from Tanja-4732/ts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.ts
135 lines (114 loc) · 2.61 KB
/
server.ts
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
133
134
135
import Express from "express";
import { Routes } from "./routes/routes";
import { log } from "console";
import SlowDown from "express-slow-down";
import { version } from "./functions/version";
import { licenseNotice } from "./functions/license";
export class Server {
/**
* The internal Express server
*/
private server = Express();
/**
* Creates a new server instance for the application
*
* @param config The config for the server
*/
constructor(
private config: ServerConfig = {
mode: ServerModes.http_only,
ports: { http: 80, https: 443 },
enableSlowdown: false,
}
) {
// Allow reverse proxy operations
this.server.enable("trust proxy");
// Use a delay-based rate limit for all requests
if (config.enableSlowdown) {
this.server.use(
SlowDown({
windowMs: 15 * 60 * 1000,
delayAfter: 100,
delayMs: 500,
})
);
}
// Configure the routes
this.server.use(new Routes().router);
}
/**
* Start the server according to its config
*/
start = () => {
log(`DoubleNote backend version ${version} starting...`);
log(licenseNotice);
switch (this.config.mode) {
case ServerModes.http_only:
this.startHttpServer();
break;
case ServerModes.https_only:
this.startHttpsServer();
break;
case ServerModes.both:
this.startHttpServer();
this.startHttpsServer();
break;
case ServerModes.redirect:
this.startHttpsServer();
this.startRedirectServer();
break;
}
log(`\nDoubleNote backend version ${version} started.`);
};
/**
* Starts the HTTP server
*/
private startHttpServer = () => {
this.server.listen(this.config.ports.http);
log(`HTTP server listening on port ${this.config.ports.http}`);
};
/**
* Starts the HTTPS server
*/
private startHttpsServer = () => {
// TODO implement the HTTPS server
};
/**
* Starts the HTTP redirect server
*/
private startRedirectServer = () => {
// TODO implement the redirect server
};
}
/**
* The config for the server
*/
export interface ServerConfig {
ports: {
http: number;
https: number;
};
mode: ServerModes;
enableSlowdown: boolean;
}
/**
* The modes the server can operate in
*/
export enum ServerModes {
/**
* Only provide access via HTTP
*/
"http_only",
/**
* Only provide access via HTTPS
*/
"https_only",
/**
* Provide access via HTTP and HTTPS
*/
"both",
/**
* Provide access via HTTPS and redirect HTTP to HTTPS
*/
"redirect",
}