Recv/index.js

129 lines
3.4 KiB
JavaScript

'use strict'
const fs = require('fs');
const _ = require('lodash');
let configDefaults = require('./config.defaults');
if (fs.existsSync('./config.js'))
{
let configChanges = require('./config');
global.config = _.merge(configDefaults, configChanges);
}
else
global.config = configDefaults;
const Repository = require('./lib/repository');
const NotificationWorker = require('./lib/workers/notification');
const ExpirationWorker = require('./lib/workers/expiration');
const express = require('express');
const bodyParser = require('body-parser');
const tus = require('tus-node-server');
const jwt = require('jsonwebtoken');
const path = require('path');
const resolvePath = require('resolve-path');
const cookieParser = require('cookie-parser');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require('webpack-hot-middleware');
const webpackConfigFactory = require('./webpack.config.js');
(async () =>
{
try
{
const isDevelopment = process.env.NODE_ENV !== 'production';
console.log('Running in ' + (isDevelopment ? 'development' : 'production') + ' mode');
const repository = new Repository(config.database);
await repository.load();
const tusServer = new tus.Server();
tusServer.datastore = new tus.FileStore({
path: config.fileUpload.url,
directory: config.fileUpload.path
});
const app = express();
app.disable('x-powered-by');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use('/', require('./lib/api/upload')(repository, tusServer));
app.use('/token', require('./lib/api/token')(repository));
app.use('/admin', require('./lib/api/admin')(repository));
// Frontend
if (isDevelopment)
{
const webpackConfig = webpackConfigFactory(process.env, { mode: 'development' });
const compiler = webpack(webpackConfig);
app.use(webpackDevMiddleware(compiler, {
publicPath: webpackConfig.output.publicPath
}));
app.use(webpackHotMiddleware(compiler));
}
// Automatic fallback support for file icons
app.get('/images/fileicons/:format/:filename', (req, res) =>
{
var basePath;
var filePath;
try
{
basePath = resolvePath('./public/dist/images/fileicons/', req.params.format);
filePath = resolvePath(basePath, req.params.filename);
}
catch (err)
{
res.sendStatus(404);
}
fs.stat(filePath, (err, stat) =>
{
if (err)
res.sendFile(resolvePath(basePath, '_blank.png'));
else
res.sendFile(filePath);
});
});
app.use(express.static(path.join(__dirname, 'custom')));
app.use(express.static(path.join(__dirname, 'public', 'dist')));
// Redirect to make Vue-router URLs less quirky
app.get('/c/:code', (req, res) => { res.redirect(301, '/#/c/' + req.params.code) });
// Background workers
var notificationWorker = new NotificationWorker(repository);
notificationWorker.start(config.notifications.interval * 1000);
var expirationWorker = new ExpirationWorker(repository);
expirationWorker.start(config.cleanupInterval * 1000);
var server = app.listen(config.port, () => console.log('Recv running on port ' + server.address().port));
}
catch (e)
{
console.log(e);
process.exit(1);
}
})();