2 * @file Node entry and main driver
3 * @author Jordan Lavatai, Ken Grimes
6 * @copyright jk software 2017
7 * @summary HTTP(S) Router that uses the first directory in the requested URL
10 const fs
= require('fs')
11 const ws
= require('ws')
12 const path
= require('path')
13 const http
= require('http')
14 const https
= require('https')
15 const getport
= require('get-port')
16 const mime
= require('mime')
17 const opts
= require('./opts.js')
19 const skelPage
= fs
.readFileSync('./skel.html', { encoding
: 'utf8' }).split('<!--STRAPP_SRC-->')
20 const clientJS
= fs
.readFileSync(opts
['client-js'])
21 const hostJS
= fs
.readFileSync(opts
['host-js'])
23 const httpsOpts
= (opts
['no-tls'] ?
26 key
: fs
.readFileSync(opts
['ca-key']),
27 cert
: fs
.readFileSync(opts
['ca-cert'])
30 const routeConnection
= (request
,response
) => {
31 const serveFile
= (fPath
) => {
32 fs
.readFile(fPath
, { encoding
: 'utf8' }, (err
, data
) => {
33 if (err
|| data
== undefined) {
34 response
.writeHead(404)
38 response
.writeHead(200, { 'Content-Type': mime
.lookup(fPath
) })
44 const htArgv
= request
.url
.slice(1).split("?")
45 let routePath
= htArgv
[0].split('/')
46 let routeName
= routePath
[0]
47 if (routeName
=== '' || routeName
=== 'index.html')
48 serveFile(opts
['index'])
49 else if (routeName
in opts
['bindings']) {
50 let localPath
= path
.normalize(opts
['bindings'][routeName
].concat(path
.sep
+ routePath
.slice(1).join(path
.sep
)))
51 if (localPath
.includes(opts
['bindings'][routeName
])) {
52 fs
.readdir(localPath
, (err
, files
) => {
56 serveFile(`${localPath}/index.html`)
60 console
.log(`SEC: ${localPath} references files not in route`)
63 else if (routeName
in routes
) {
64 const route
= routes
[routeName
]
65 response
.writeHead(200, { 'Content-Type': 'text/html' })
66 response
.write(`${skelPage[0]}${clientJS}${skelPage[1]}`)
68 route
.socket
.send(request
.headers
['x-forwarded-for'] || request
.connection
.remoteAddress
)
71 routes
[htArgv
[0]] = true
73 newRoute
.host
= request
.headers
['x-forwarded-for'] || request
.connection
.remoteAddress
74 getport().then( (port
) => {
77 newRoute
.httpd
= http
.createServer()
79 newRoute
.httpd
= https
.createServer(httpsOpts
)
80 newRoute
.httpd
.listen(newRoute
.port
)
81 newRoute
.ws
= new ws
.Server( { server
: newRoute
.httpd
} )
82 newRoute
.ws
.on('connection', (ws
) => { console
.log("socket connected"); newRoute
.socket
= ws
; ws
.send("CONNECTED") } )
83 newRoute
.ws
.on('message', (msg
) => { console
.log("Received message" + msg
) })
84 console
.log("Listening for websocket " + newRoute
.host
+ " on port " + newRoute
.port
)
85 routes
[htArgv
[0]] = newRoute
87 response
.writeHead(200, { 'Content-Type': 'text/html' })
88 response
.write(skelPage
[0] + 'const _strapp_port = \'' + newRoute
.port
+ '\'\n' + hostJS
+ skelPage
[1])
94 const router
= ((opts
['no-tls']) ?
95 http
.createServer(routeConnection
) :
96 https
.createServer(httpsOpts
, routeConnection
))
99 //TODO: if ("electron" in process.versions) open a local renderwindow, and route to it