47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
import 'dotenv/config'
|
|
import express from 'express'
|
|
import helmet from 'helmet'
|
|
import morgan from 'morgan'
|
|
import { initFirebase } from './config/firebase'
|
|
import { startAnswerListener } from './listeners/answerListener'
|
|
import { validateEnv } from './config/env'
|
|
import healthRouter from './routes/health'
|
|
import webhooksRouter from './routes/webhooks'
|
|
|
|
// Validate required env vars before starting
|
|
try {
|
|
validateEnv()
|
|
} catch (err) {
|
|
console.error('[startup] Env validation failed:')
|
|
console.error(err)
|
|
process.exit(1)
|
|
}
|
|
|
|
initFirebase()
|
|
|
|
const app = express()
|
|
const PORT = parseInt(process.env.PORT ?? '8080', 10)
|
|
|
|
app.use(helmet())
|
|
app.use(morgan('combined'))
|
|
app.use(express.json())
|
|
|
|
app.use('/health', healthRouter)
|
|
app.use('/webhooks', webhooksRouter)
|
|
|
|
const server = app.listen(PORT, () => {
|
|
console.log(`[server] listening on port ${PORT}`)
|
|
startAnswerListener()
|
|
})
|
|
|
|
// Graceful shutdown
|
|
process.on('SIGTERM', () => {
|
|
console.log('[server] SIGTERM received, shutting down')
|
|
server.close(() => process.exit(0))
|
|
})
|
|
|
|
process.on('SIGINT', () => {
|
|
console.log('[server] SIGINT received, shutting down')
|
|
server.close(() => process.exit(0))
|
|
})
|