marrow-cells / src /server.ts
lysine's picture
Enable clustering
d90b33f
import 'dotenv/config';
import express, { Request, Response, NextFunction } from 'express';
import marrowCellApi from './lib/marrow-cells/api';
import { readData, cellImages } from './lib/marrow-cells/data';
import cors from 'cors';
import { isBoom } from '@hapi/boom';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import { log } from './lib/helper';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const { PORT = 7860 } = process.env;
const app = express();
// Enable cross-origin resource sharing
app.use(cors());
// Middleware that parses json and looks at requests where the Content-Type header matches the type option.
app.use(express.json());
// Serve API requests from the router
app.use('/api/marrow-cells', marrowCellApi);
// Serve app production bundle
app.use(express.static('dist/app'));
app.use((err: unknown, _req: Request, res: Response, next: NextFunction) => {
if (res.headersSent) {
return next(err);
}
if (isBoom(err)) {
return res.status(err.output.statusCode).json(err.output.payload);
}
next(err);
});
// Handle client routing, return all requests to the app
app.get('*', (_req, res) => {
res.sendFile(join(__dirname, 'app/index.html'));
});
Promise.all([
(async () => {
await readData();
log(
`Marrow cells: ${
Object.keys(cellImages).length
} cell types and ${Object.values(cellImages).reduce(
(prev, curr) => prev + curr.length,
0
)} cell images loaded`
);
})(),
]).then(() => {
app.listen(PORT, () => {
log(`Server listening at http://localhost:${PORT}`);
});
});