This repository was archived by the owner on Dec 17, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathControllerWebServer.js
140 lines (118 loc) · 4.14 KB
/
ControllerWebServer.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
133
134
135
136
137
138
139
140
import express from 'express'
import { EventEmitter } from 'inf-ee'
import debug from 'debug'
import detectPort from 'detect-port'
const log = debug('sio:webserver')
export class ControllerWebServer extends EventEmitter {
constructor(options = {}) {
super()
console.log('Constructing WebServer Controller')
this.componentName = 'WebServer Controller'
this.config = options.config || undefined
this.sessionId = -1
this.app = undefined
this.server = undefined
this._port = undefined
this._address = undefined
this._hostname = undefined
this._protocol = 'http'
}
async connect(options = {}) {
this.app = express()
this._port = options.port || 3333
this._address = options.address || '127.0.0.1'
this._hostname = options.hostname || 'localhost'
this._protocol = options.protocol || 'http'
this.app.get('/', (request, response) => {
response.send('Hello World!')
})
this.app.get('/server/stop', (request, response) => {
this.stopServer()
response.send('Shutting down the WebServer')
})
// Test if a port is available and can be bound as the new port for the web interface
this.app.get('/server/testport', async (request, response) => {
const portRequested = Number.parseInt(request.query.port, 10)
const portAvailable = await this.testPort(portRequested)
return response.json({
portRequested,
portAvailable,
isAvailable: portAvailable === portRequested,
})
})
// API Route to Restart the Webserver on a new Port
// Makes it possible to change the port from the frontend
this.app.get('/server/newport', async (request, response) => {
const portRequested = Number.parseInt(request.query.port, 10)
const portAvailable = await this.testPort(portRequested)
if (portRequested !== portAvailable) {
return response.json({
success: false,
msg: 'Requested port not available. Not restarting! Choose a different port.',
})
}
this._port = portRequested
response.json({
success: true,
msg: 'server restarted on new port',
})
const serverOld = this.server
setTimeout(async () => {
this.log(`Stopping the old server on ${serverOld.address()}`)
await this.stopServer(serverOld)
this.log('Old Server Completely Stopped')
}, 10 * 1000) // 10 seconds
await this.startServer()
this.emit('connect')
})
await this.startServer()
}
async disconnect() {
await this.stopServer()
this.emit('disconnect')
}
async startServer() {
/* eslint-disable-next-line no-async-promise-executor */
return new Promise(async (resolve) => {
const port = await this.testPort(this._port, this._address)
if (port !== this._port) {
this.log('error', `The configured port ${this._port} is not available on ${this._address} and you should set a different one in the config file.`)
return
}
this.server = this.app.listen(this._port, this._address)
this.server.on('listening', () => {
this.log('info', this.server.address())
this.log('info', 'WebServer Listening', `${this._protocol}://${this._address}:${this._port}`, `${this._protocol}://${this._hostname}:${this._port}`)
this.emit('webServerStarted')
resolve()
})
this.server.on('error', (message) => {
this.log('error', 'WebServer Startup Error', message)
})
})
}
stopServer(server) {
server = server || this.server
return new Promise((resolve) => {
if (server) {
server.close(() => {
this.log('info', 'WebServer Shutdown')
this.emit('webServerStopped')
return resolve()
})
} else {
this.log('No WebServer to Shutdown')
resolve()
}
})
}
async testPort(port, host) {
port = Number.parseInt(port, 10) || 80
return detectPort(port, host)
}
log(level, ...args) {
this.emit('log', { component: this.componentName, level: level.toLowerCase(), message: args })
log(`${level.toLowerCase()}: ${args}`)
}
}
export default ControllerWebServer