-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
109 lines (93 loc) · 2.96 KB
/
server.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
const http = require( "http" );
const formBody = require( "body/form" );
const pa = require( 'path' );
const fs = require( 'fs' );
const hostname = process.env.IP || '0.0.0.0'; // container friendly ip
const port = process.env.PORT || 8080 ;
const real = process.env.DEPLOYED === true ;
const root = __dirname ;
const serverMiddle = (req, res) => {
let url = req.url ;
if( url === "/" ){
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html');
let index =( real ? "." : "./dist" ) + "/index.html" ;
res.write( fs.readFileSync( pa.join( root , index ) ) );
res.end();
} else if( url === "/api" ){ // api call
formBody(req, res, (err, body) => {
// err probably means invalid HTTP protocol or some shiz.
if (err) {
res.statusCode = 500
res.setHeader('Content-Type', 'text/plain');
return res.end("server error")
}
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain');
require( "./src/server/api" )( body , res );
});
} else { // stream - download - ....
if( ! real )
url = "/dist" + url ;
let ext = pa.extname( url );
let mat = {
".css" : "text/css" ,
".js" : "text/javascript" ,
".png" : "image/png" ,
".jpg" : "image/jpg" ,
".jpeg" : "image/jpeg" ,
".svg" : "image/svg+xml" ,
".mp3" : "audio/mp3" ,
".mp4" : "video/mp4" ,
".mkv" : "video/mkv" ,
".webm" : "video/webm"
}; let mime = "" ;
for( let exn in mat ){
if( exn === ext )
mime = mat[exn] ;
} if( mime !== "" ){
res.setHeader('Content-Type', mime );
if( mime.indexOf( "audio" ) >= 0 || mime.indexOf( "video" ) >= 0 ){
// Video And Audio Range Handling
let file = pa.join( root , url );
fs.stat(file, function(err, stats) {
if (err) {
if (err.code === 'ENOENT') {
// 404 Error if file not found
return res.sendStatus(404);
}
return res.end(err);
}
let range = req.headers.range;
if (!range) {
// 416 Wrong range
return res.statusCode(416);
}
var positions = range.replace(/bytes=/, "").split("-");
var start = parseInt(positions[0], 10);
var total = stats.size;
var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
var chunksize = (end - start) + 1;
res.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + total);
res.setHeader("Accept-Ranges", "bytes");
res.setHeader("Content-Length", chunksize);
var stream = fs.createReadStream(file, {start: start, end: end})
.on("open", function () {
stream.pipe(res);
}).on("error", function (err) {
res.end(err);
});
});
return;
} res.write( fs.readFileSync( pa.join( root , url ) ) );
res.end();
} else {
res.setHeader('Content-Type', "text/html" );
res.end( '404 : File Not Found - OR - Mime Not Listed' );
}
}
}
const server = http.createServer( serverMiddle );
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});