v0.0.1
[henge/kiak.git] / main.js
1 /**
2 * @file Node entry and main driver
3 * @author Jordan Lavatai, Ken Grimes
4 * @version 0.0.1
5 * @license AGPL-3.0
6 * @copyright jk software 2017
7 * @summary HTTP(S) Router that uses the first directory in the requested URL
8 * as the route name
9 */
10 const fs = require('fs')
11 const ws = require('ws')
12 const http = require('http')
13 const https = require('https')
14 const getport = require('get-port')
15 const mime = require('mime')
16 const opts = require('./opts.js')
17
18 /* const routeConnection = (request,response) => {
19 const htArgv = request.url.slice(1).split("?")
20 let routeName = /[^\/]*/.match(htArgv[0])[0]
21 if (routeName === '')
22 routeName = opts['index']
23 if (routeName.indexOf('.') != -1) {
24 if (routeName in fileBuf) {
25 response.writeHead(200, { 'Content-Type': fileBuf[routeName].mime })
26 response.write(fileBuf[routeName].data)
27 }
28 else {
29 if ('404.html' in fileBuf) {
30 response.writeHead(404, fileBuf['404.html'].mime)
31 response.write(fileBuf['404.html'].data)
32 }
33 else
34 response.writeHead(404)
35 }
36 response.end()
37 }
38 else if (routeName in routes) {
39 const route = routes[routeName]
40 response.writeHead(200, { 'Content-Type': 'text/html' })
41 response.write(skelPage[0] + clientJS + skelPage[1])
42 response.end()
43 route.socket.send(request.headers['x-forwarded-for'] || request.connection.remoteAddress)
44 }
45 else {
46 routes[htArgv[0]] = true
47 const newRoute = {}
48 newRoute.host = request.headers['x-forwarded-for'] || request.connection.remoteAddress
49 getport().then( (port) => {
50 newRoute.port = port
51 newRoute.httpd = https.createServer(routerOpts, (request, response) => {
52 }).listen(newRoute.port)
53
54 newRoute.ws = new ws.Server( { server: newRoute.httpd } )
55 newRoute.ws.on('connection', (ws) => { console.log("socket connected"); newRoute.socket = ws; ws.send("CONNECTED") } )
56 newRoute.ws.on('message', (msg) => { console.log("Received message" + msg) })
57 console.log("Listening for websocket " + newRoute.host + " on port " + newRoute.port)
58 routes[htArgv[0]] = newRoute
59 }).then(() => {
60 response.writeHead(200, { 'Content-Type': 'text/html' })
61 response.write(skelPage[0] + 'const _strapp_port = \'' + newRoute.port + '\'\n' + hostJS + skelPage[1])
62 response.end()
63 })
64 }
65 }
66
67 if (!opts['no-tls']) {
68 router.httpd = http.createServer(router.listener)
69 }
70 else {
71 /* Setup TLS */
72 if (!fs.existsSync(opts['ca-key'])) {
73 console.log(`ERR: Key ${opts['ca-key']} inaccessible (required for tls)`)
74 process.exit()
75 }
76 if (!fs.existsSync(opts['ca-cert'])) {
77 console.log(`ERR: Cert ${opts['ca-cert']} inaccessible (required for tls)`)
78 process.exit()
79 }
80 router.opts = {
81 key: fs.readFileSync(opts['ca-key']),
82 cert: fs.readFileSync(opts['ca-cert'])
83 }
84 }
85
86 const skelPage = String(fs.readFileSync('skel.html')).split("<!--STRAPP_SRC-->")
87 const clientJS = fs.readFileSync(opts['client-js'])
88 const hostJS = fs.readFileSync(opts['host-js'])
89 const routes = {}
90 /*
91 const router = https.createServer(routerOpts, (request, response) => {
92 const htArgv = request.url.slice(1).split("?")
93 let routeName = htArgv[0].split('/')[0]
94 if (routeName === '')
95 routeName = 'index.html'
96 if (routeName.indexOf('.') != -1) {
97 if (routeName in fileBuf) {
98 response.writeHead(200, { 'Content-Type': fileBuf[routeName].mime })
99 response.write(fileBuf[routeName].data)
100 }
101 else {
102 if ('404.html' in fileBuf) {
103 response.writeHead(404, fileBuf['404.html'].mime)
104 response.write(fileBuf['404.html'].data)
105 }
106 else
107 response.writeHead(404)
108 }
109 response.end()
110 }
111 else if (routeName in routes) {
112 const route = routes[routeName]
113 response.writeHead(200, { 'Content-Type': 'text/html' })
114 response.write(skelPage[0] + clientJS + skelPage[1])
115 response.end()
116 route.socket.send(request.headers['x-forwarded-for'] || request.connection.remoteAddress)
117 }
118 else {
119 routes[htArgv[0]] = true
120 const newRoute = {}
121 newRoute.host = request.headers['x-forwarded-for'] || request.connection.remoteAddress
122 getport().then( (port) => {
123 newRoute.port = port
124 newRoute.httpd = https.createServer(routerOpts, (request, response) => {
125 }).listen(newRoute.port)
126
127 newRoute.ws = new ws.Server( { server: newRoute.httpd } )
128 newRoute.ws.on('connection', (ws) => { console.log("socket connected"); newRoute.socket = ws; ws.send("CONNECTED") } )
129 newRoute.ws.on('message', (msg) => { console.log("Received message" + msg) })
130 console.log("Listening for websocket " + newRoute.host + " on port " + newRoute.port)
131 routes[htArgv[0]] = newRoute
132 }).then(() => {
133 response.writeHead(200, { 'Content-Type': 'text/html' })
134 response.write(skelPage[0] + 'const _strapp_port = \'' + newRoute.port + '\'\n' + hostJS + skelPage[1])
135 response.end()
136 })
137 }
138 }).listen(argv['port'])
139 */
140 //TODO: if ("electron" in process.versions) open a local renderwindow, and route to it
141