65 lines
1.5 KiB
TypeScript
65 lines
1.5 KiB
TypeScript
import express from 'express';
|
|
import { ApolloServer } from '@apollo/server';
|
|
import { expressMiddleware } from '@apollo/server/express4';
|
|
import { json } from 'body-parser';
|
|
import { typeDefs } from './graphql/schema';
|
|
import { resolvers } from './graphql/resolvers';
|
|
import { createDb } from './db';
|
|
import logger from './logger';
|
|
import { TestPrinter } from './printer/test-printer';
|
|
import cors from 'cors';
|
|
|
|
const app = express();
|
|
const port = process.env.PORT || 4000;
|
|
|
|
async function startServer() {
|
|
const db = createDb();
|
|
const printer = new TestPrinter();
|
|
|
|
const server = new ApolloServer({
|
|
typeDefs,
|
|
resolvers,
|
|
});
|
|
|
|
await server.start();
|
|
|
|
// Enable CORS for the frontend
|
|
app.use(cors({
|
|
origin: 'http://localhost:5173',
|
|
credentials: true
|
|
}));
|
|
|
|
app.use(json());
|
|
app.use(
|
|
'/graphql',
|
|
expressMiddleware(server, {
|
|
context: async () => ({ db, printer }),
|
|
})
|
|
);
|
|
|
|
const httpServer = app.listen(port, () => {
|
|
logger.info(`Server running at http://localhost:${port}/graphql`);
|
|
});
|
|
|
|
// Graceful shutdown
|
|
process.on('SIGTERM', () => {
|
|
logger.info('SIGTERM received. Shutting down gracefully...');
|
|
httpServer.close(() => {
|
|
logger.info('Server closed');
|
|
process.exit(0);
|
|
});
|
|
});
|
|
|
|
process.on('SIGINT', () => {
|
|
logger.info('SIGINT received. Shutting down gracefully...');
|
|
httpServer.close(() => {
|
|
logger.info('Server closed');
|
|
process.exit(0);
|
|
});
|
|
});
|
|
}
|
|
|
|
startServer().catch((error) => {
|
|
logger.error('Failed to start server:', error);
|
|
process.exit(1);
|
|
}); |