-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
135 lines (111 loc) · 3.56 KB
/
index.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
const Express = require('express');
const fileUpload = require('express-fileupload');
const http = require('http');
const path = require('path');
const opn = require('open');
const pf = require('portfinder');
const { argv } = require('process');
const { WebSocketServer } = require('ws');
let bodyParser = require('body-parser');
// include scripts
const { CheckFiles, FilterRoms, CopyRoms, CheckPrevJson } = require('./events/index.js');
// creat app
const app = Express();
const server = http.createServer(app);
const wsServer = new WebSocketServer({ server });
app.use(fileUpload());
app.use(bodyParser.json()); // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
extended: true
}));
app.use(Express.static(path.join(__dirname, 'public')));
// check if files were already uploaded
app.post('/checkFile', function (req, res) {
const data = CheckFiles(req.body.emulator, req.body.useDefaultIni);
res.send(data);
});
// check for previous json filtered roms
app.post('/checkPrevJson', function (req, res) {
const data = CheckPrevJson(req.body.emulator);
res.send(data);
});
// upload file
app.post('/upload-file', function (req, res) {
if (!req.files || Object.keys(req.files).length === 0) {
return res.status(400).send('No files were uploaded.');
}
const file = req.files.file;
const ext = file.name.split(".");
const fileName = req.body.emulator + '.' + ext[ext.length - 1];
const uploadPath = path.resolve('./' + fileName);
// Use the mv() method to place the file somewhere on your server
file.mv(uploadPath, function (err) {
if (err) {
console.log(err)
return res.status(500).send(err);
}
console.log(`Uploaded file ${file.name} to ${fileName}`)
res.send(fileName);
});
});
const open = async (PORT) => {
opn(`http://localhost:${PORT}`);
};
const listen = (PORT) => {
server.listen(PORT, () => {
if (argv.includes('--no-open')) {
console.log(`The webserver is now running at http://localhost:${PORT}`);
} else {
console.log('The webserver is now running!');
try {
console.log('Opening the app in the default browser...');
open(PORT);
console.log('Done. Check if a browser window has opened');
} catch (e) {
console.log(`Failed. Open up http://localhost:${PORT} manually in your browser.`);
}
}
});
};
// exit app
const cleanExit = async (svr) => {
console.log('Killing any dangling processes...');
console.log('Stopping the server...');
svr.close(() => console.log('Done'));
setTimeout(() => process.exit(0), 2500);
};
// start app
pf.getPortPromise()
.then((port) => {
console.log(`Listening at port ${port}`);
listen(port);
})
.catch((err) => {
console.log(`Unable to determine free ports.\nReason: ${err}`);
console.log('Falling back to 8080.');
listen(8080);
});
process.on('uncaughtException', (reason) => {
console.log(`An error occured.\n${reason.stack}`);
});
process.on('unhandledRejection', (reason) => {
console.log(`An error occured.\n${reason.stack}`);
});
process.on('SIGTERM', () => cleanExit(server));
wsServer.on('connection', (ws) => {
ws.on('message', async (msg) => {
/** @type {Record<string, any>} */
const message = JSON.parse(msg);
// Theres no file handler, soo...
switch (message.event) {
case 'filterRoms':
await FilterRoms(message.data, ws);
break;
case 'copyRoms':
await CopyRoms(message.data, ws);
break;
case 'exit':
process.kill(process.pid, 'SIGTERM');
}
});
});