mirror of https://github.com/tycrek/ass
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.5 KiB
99 lines
3.5 KiB
3 years ago
|
import { AssRequest, AssResponse, ErrWrap } from './definitions';
|
||
|
|
||
3 years ago
|
let doSetup = null;
|
||
4 years ago
|
try {
|
||
|
// Check if config.json exists
|
||
3 years ago
|
require('../config.json');
|
||
4 years ago
|
} catch (err) {
|
||
3 years ago
|
doSetup = require('./setup').doSetup;
|
||
|
}
|
||
|
|
||
|
// Run first time setup if using Docker (pseudo-process, setup will be run with docker exec)
|
||
3 years ago
|
if (doSetup) doSetup();
|
||
4 years ago
|
|
||
|
// Load the config
|
||
3 years ago
|
const { host, port, useSsl, isProxied, s3enabled, frontendName, indexFile } = require('../config.json');
|
||
4 years ago
|
|
||
|
//#region Imports
|
||
3 years ago
|
import fs from 'fs-extra';
|
||
|
import express from 'express';
|
||
3 years ago
|
const nofavicon = require('@tycrek/express-nofavicon');
|
||
3 years ago
|
import helmet from 'helmet';
|
||
|
import marked from 'marked';
|
||
|
import uploadRouter from './routers/upload';
|
||
|
import resourceRouter from './routers/resource';
|
||
|
import { path, log, getTrueHttp, getTrueDomain } from './utils';
|
||
3 years ago
|
const { CODE_INTERNAL_SERVER_ERROR } = require('../MagicNumbers.json');
|
||
|
const { name: ASS_NAME, version: ASS_VERSION } = require('../package.json');
|
||
4 years ago
|
//#endregion
|
||
4 years ago
|
|
||
3 years ago
|
// Welcome :D
|
||
3 years ago
|
log.blank().info(`* ${ASS_NAME} v${ASS_VERSION} *`).blank();
|
||
3 years ago
|
|
||
4 years ago
|
//#region Variables, module setup
|
||
4 years ago
|
const app = express();
|
||
3 years ago
|
const ROUTERS = {
|
||
|
upload: uploadRouter,
|
||
|
resource: resourceRouter
|
||
|
};
|
||
4 years ago
|
|
||
3 years ago
|
// Read users and data
|
||
|
const users = require('./auth');
|
||
|
const data = require('./data');
|
||
4 years ago
|
//#endregion
|
||
4 years ago
|
|
||
3 years ago
|
// Enable/disable Express features
|
||
|
app.enable('case sensitive routing');
|
||
|
app.disable('x-powered-by');
|
||
|
|
||
|
// Set Express variables
|
||
|
app.set('trust proxy', isProxied);
|
||
|
app.set('view engine', 'pug');
|
||
|
|
||
3 years ago
|
// Express logger middleware
|
||
|
app.use(log.express(true));
|
||
|
|
||
3 years ago
|
// Helmet security middleware
|
||
|
app.use(helmet.noSniff());
|
||
|
app.use(helmet.ieNoOpen());
|
||
|
app.use(helmet.xssFilter());
|
||
|
app.use(helmet.referrerPolicy());
|
||
|
app.use(helmet.dnsPrefetchControl());
|
||
|
useSsl && app.use(helmet.hsts({ preload: true })); // skipcq: JS-0093
|
||
|
|
||
3 years ago
|
// Don't process favicon requests
|
||
|
app.use(nofavicon);
|
||
3 years ago
|
|
||
3 years ago
|
// Use custom index, otherwise render README.md
|
||
3 years ago
|
const ASS_INDEX = indexFile !== '' && fs.existsSync(`../${indexFile}`) && require(`../${indexFile}`);
|
||
3 years ago
|
app.get('/', (req, res, next) => ASS_INDEX // skipcq: JS-0229
|
||
3 years ago
|
? ASS_INDEX(req, res, next)
|
||
|
: fs.readFile(path('README.md'))
|
||
|
.then((bytes) => bytes.toString())
|
||
3 years ago
|
.then((data) => marked(data))
|
||
3 years ago
|
.then((d) => res.render('index', { data: d }))
|
||
|
.catch(next));
|
||
3 years ago
|
|
||
|
// Upload router
|
||
3 years ago
|
app.use('/', ROUTERS.upload);
|
||
3 years ago
|
|
||
3 years ago
|
// Set up custom frontend
|
||
3 years ago
|
const ASS_FRONTEND = fs.existsSync(path(`./${frontendName}/package.json`)) ? (require('submodule'), require(`../${frontendName}`)) : { enabled: false }; // todo: update with src/
|
||
3 years ago
|
ASS_FRONTEND.enabled && app.use(ASS_FRONTEND.endpoint, ASS_FRONTEND.router); // skipcq: JS-0093
|
||
3 years ago
|
|
||
|
// '/:resouceId' always needs to be LAST since it's a catch-all route
|
||
3 years ago
|
app.use('/:resourceId', (req: AssRequest, _res, next) => (req.resourceId = req.params.resourceId, next()), ROUTERS.resource); // skipcq: JS-0086, JS-0090
|
||
3 years ago
|
|
||
3 years ago
|
// Error handler
|
||
3 years ago
|
app.use((err: ErrWrap, _req: AssRequest, res: AssResponse, _next: Function) => log.error(err).err(err).callback(() => res.sendStatus(CODE_INTERNAL_SERVER_ERROR))); // skipcq: JS-0128
|
||
3 years ago
|
|
||
3 years ago
|
// Host the server
|
||
3 years ago
|
log
|
||
|
.info('Users', `${Object.keys(users).length}`)
|
||
|
.info('Files', `${data.size}`)
|
||
3 years ago
|
.info('Data engine', data.name, data.type)
|
||
3 years ago
|
.info('Frontend', ASS_FRONTEND.enabled ? ASS_FRONTEND.brand : 'disabled', `${ASS_FRONTEND.enabled ? `${getTrueHttp()}${getTrueDomain()}${ASS_FRONTEND.endpoint}` : ''}`)
|
||
3 years ago
|
.info('Custom index', ASS_INDEX ? `enabled` : 'disabled')
|
||
3 years ago
|
.blank()
|
||
|
.express().Host(app, port, host, () => log.success('Ready for uploads', `Storing resources ${s3enabled ? 'in S3' : 'on disk'}`));
|