Merge branch 'master' into feat/info

This commit is contained in:
Carlos Valente
2021-06-13 14:34:20 +02:00
committed by GitHub
71 changed files with 6100 additions and 754 deletions
+64 -19
View File
@@ -3,9 +3,15 @@ import { config } from './config/config.js';
// init database
import { Low, JSONFile } from 'lowdb';
import { join } from 'path';
const file = join('data/', config.database.filename);
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const env = process.env.NODE_ENV || 'prod';
const file = path.join(__dirname, 'data/', config.database.filename);
const adapter = new JSONFile(file);
export const db = new Low(adapter);
@@ -34,9 +40,6 @@ import { router as eventsRouter } from './routes/eventsRouter.js';
import { router as eventRouter } from './routes/eventRouter.js';
import { router as ontimeRouter } from './routes/ontimeRouter.js';
// Setup default port
const port = process.env.PORT || config.server.port;
// Global Objects
import { EventTimer } from './classes/EventTimer.js';
@@ -60,30 +63,72 @@ app.use('/events', eventsRouter);
app.use('/event', eventRouter);
app.use('/ontime', ontimeRouter);
// implement general router
app.get('/', (req, res) => {
res.send('ontime API');
// serve react
app.use(
express.static(
path.join(__dirname, env == 'prod' ? '../' : '../../', 'client/build')
)
);
app.get('*', (req, res) => {
res.sendFile(
path.resolve(
__dirname,
env == 'prod' ? '../' : '../../',
'client',
'build',
'index.html'
)
);
});
// Implement route for errors
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
res.status(500).send(err.stack);
});
// create HTTP server
const server = http.createServer(app);
// init timer
global.timer = new EventTimer(server, config);
global.timer.setupWithEventList(data.events);
export const startServer = (overrideConfig = null) => {
// Setup default port
const serverPort = overrideConfig?.port || config.server.port;
// Start server
server.listen(port, () =>
console.log(`HTTP Server is listening on port ${port}`)
);
// Start server
const returnMessage = `HTTP Server is listening on port ${serverPort}`;
server.listen(serverPort, '0.0.0.0', () => console.log(returnMessage));
// init timer
global.timer = new EventTimer(server, config);
global.timer.setupWithEventList(data.events);
return returnMessage;
};
// Start OSC server
import { initiateOSC } from './controllers/OscController.js';
import { initiateOSC, shutdownOSCServer } from './controllers/OscController.js';
initiateOSC(config.osc);
export const startOSCServer = (overrideConfig = null) => {
// Setup default port
const oscInPort = overrideConfig?.port || config.osc.port;
initiateOSC(config.osc);
};
export const startOSCClient = (overrideConfig = null) => {
// Setup default port
const oscOutPort = overrideConfig?.port || config.osc.portOut;
console.log('initialise OSC Client at port: ', oscOutPort);
};
export const shutdown = () => {
console.log('Node service shutdown');
// shutdown express server
server.close();
// shutdown OSC Server
shutdownOSCServer();
// shutdown OSC Client
// shutdown timer
global.timer.shutdown();
};
+8
View File
@@ -83,6 +83,14 @@ export class EventTimer extends Timer {
this._listenToConnections();
}
/**
* @description Shutdown process
*/
shutdown() {
console.log('Closing socket server');
this.io.close();
}
// send current timer
broadcastTimer() {
this.io.emit('timer', this.getObject());
+1
View File
@@ -11,5 +11,6 @@ export const config = {
},
osc: {
port: 8888,
portOut: 8889,
},
};
+7 -1
View File
@@ -1,7 +1,13 @@
import { Server } from 'node-osc';
let oscServer = null;
export const shutdownOSCServer = () => {
if (oscServer != null) oscServer.close();
};
export const initiateOSC = (config) => {
const oscServer = new Server(config.port, '0.0.0.0', () => {
oscServer = new Server(config.port, '0.0.0.0', () => {
console.log(`OSC Server is listening on port ${config.port}`);
});
+40 -13
View File
@@ -1,6 +1,9 @@
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
// get database
import { db, data } from '../app.js';
import fs from 'fs';
import {
event as eventDef,
delay as delayDef,
@@ -9,6 +12,9 @@ import {
import { dbModel } from '../data/dataModel.js';
import { networkInterfaces } from 'os';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
function getEventTitle() {
return data.event.title;
}
@@ -24,6 +30,7 @@ async function deleteFile(file) {
// parses version 1 of the data system
async function parsev1(jsonData) {
let numEntries = 0;
if ('events' in jsonData) {
let events = [];
let ids = [];
@@ -46,15 +53,19 @@ async function parsev1(jsonData) {
isPublic: e.isPublic,
id: e.id,
});
numEntries++;
} else if (e.type === 'delay') {
events.push({ ...delayDef, duration: e.duration });
numEntries++;
} else if (e.type === 'block') {
events.push({ ...blockDef });
numEntries++;
}
}
// write to db
db.data.events = events;
db.write();
console.log(`Uploaded file with ${numEntries} entries`);
}
if ('event' in jsonData) {
@@ -83,7 +94,9 @@ async function parsev1(jsonData) {
// Returns -
export const dbDownload = async (req, res) => {
const fileTitle = getEventTitle() || 'ontime events';
res.download('db.json', `${fileTitle}.json`, (err) => {
const dbFile = path.resolve(__dirname, '../', 'data/db.json');
res.download(dbFile, `${fileTitle}.json`, (err) => {
if (err) {
res.status(500).send({
message: 'Could not download the file. ' + err,
@@ -92,15 +105,7 @@ export const dbDownload = async (req, res) => {
});
};
// Create controller for POST request to '/ontime/db'
// Returns -
export const dbUpload = async (req, res) => {
if (!req.file) {
res.status(400).send({ message: 'File not found' });
return;
}
const file = req.file.path;
const upload = async (file, req, res) => {
if (!fs.existsSync(file)) {
res.status(500).send({ message: 'Upload failed' });
return;
@@ -108,8 +113,8 @@ export const dbUpload = async (req, res) => {
try {
// get file
let rawdata = fs.readFileSync(file);
let uploadedJson = JSON.parse(rawdata);
const rawdata = fs.readFileSync(file);
const uploadedJson = JSON.parse(rawdata);
// delete file
deleteFile(file);
@@ -158,4 +163,26 @@ export const getInfo = async (req, res) => {
res.status(200).send({
networkInterfaces: ni,
});
// Create controller for POST request to '/ontime/db'
// Returns -
export const dbUpload = async (req, res) => {
if (!req.file) {
res.status(400).send({ message: 'File not found' });
return;
}
const file = req.file.path;
upload(file, req, res);
};
// Create controller for POST request to '/ontime/dbpath'
// Returns -
export const dbPathToUpload = async (req, res) => {
if (!req.body.path) {
res.status(400).send({ message: 'Path to file not found' });
return;
}
upload(req.body.path, req, res);
};
+28
View File
@@ -0,0 +1,28 @@
{
"type": "module",
"dependencies": {
"body-parser": "~1.19.0",
"express": "~4.17.1",
"express-session": "~1.17.1",
"lowdb": "2.1.0",
"multer": "^1.4.2",
"nanoid": "^3.1.22",
"node-osc": "6.0.2",
"passport": "~0.4.1",
"passport-local": "~1.0.0",
"socket.io": "^4.0.0"
},
"devDependencies": {
"eslint": "^7.26.0",
"eslint-config-airbnb": "^18.2.1",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-react": "^7.23.2",
"eslint-plugin-react-hooks": "^4.2.0",
"eslint-plugin-simple-import-sort": "^7.0.0"
},
"scripts": {
"nodestart": "nodemon app.js",
"start": "node app.js"
}
}
+4
View File
@@ -6,6 +6,7 @@ import {
dbDownload,
dbUpload,
getInfo,
dbPathToUpload,
} from '../controllers/ontimeController.js';
// create route between controller and '/ontime/db' endpoint
@@ -16,3 +17,6 @@ router.post('/db', uploadJson, dbUpload);
// create route between controller and '/ontime/info' endpoint
router.get('/info', uploadJson, getInfo);
// create route between controller and '/ontime/dbpath' endpoint
router.post('/dbpath', dbPathToUpload);
+2189
View File
File diff suppressed because it is too large Load Diff