- else if (routeName in routes) {
- const route = routes[routeName]
- response.writeHead(200, { 'Content-Type': 'text/html' })
- response.write(`${skelPage[0]}${clientJS}${skelPage[1]}`)
- response.end()
- //TODO: if route.socket == undefined: have server delay this send until host connects
- // (this happens when a client connects to an active route with no currently-online host)
- route.socket.send(request.headers['x-forwarded-for'] || request.connection.remoteAddress)
- }
- else {
- routes[routeName] = true
- const newRoute = {}
- newRoute.host = request.headers['x-forwarded-for'] || request.connection.remoteAddress
- getport().then( (port) => {
- newRoute.port = port
- if (opts['no-tls'])
- newRoute.httpd = http.createServer()
- else
- newRoute.httpd = https.createServer(httpsOpts)
- newRoute.httpd.listen(newRoute.port)
- newRoute.wsd = new ws.Server( { server: newRoute.httpd } )
- newRoute.wsd.on('connection', (sock) => {
- newRoute.socket = sock
- sock.on('message', (msg) => { console.log(`[${newRoute.host}] ${msg}`) })
- })
- console.log(`Listening for websocket ${newRoute.host} on port ${newRoute.port}`)
- routes[routeName] = newRoute
- }).then(() => {
- response.writeHead(200, { 'Content-Type': 'text/html' })
- response.write(`${skelPage[0]}const _strapp_port = ${newRoute.port}\n${hostJS}\n${skelPage[1]}`)
- response.end()
+
+ /**
+ * @summary Boot up the router. With TLS, we must wait for file reads to sync.
+ */
+ if (!opts['no-tls']) {
+ console.log('tls')
+ let filesRead = 0
+ let key = undefined
+ let cert = undefined
+ const syncRead = () => {
+ if (++filesRead == 2) {
+ if (key == undefined)
+ console.log(`ERR: Key ${opts['ca-key']} inaccessible, tls will fail`)
+ if(cert == undefined)
+ console.log(`ERR: Cert ${opts['ca-cert']} inaccessible, tls will fail`)
+ else if (key != undefined) {
+ router.httpsOpts = { cert: cert, key: key}
+ router.httpd = https.createServer(router.httpsOpts, router.respond)
+ .listen(opts['port'])
+ }
+ }
+ }
+ fs.readFile(opts['ca-key'], { encoding: 'utf8' }, (err, data) => {
+ if (!err) key = data
+ syncRead()
+ })
+ fs.readFile(opts['ca-cert'], { encoding: 'utf8' }, (err, data) => {
+ if (!err) cert = data
+ syncRead()