-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserver.mjs
More file actions
83 lines (74 loc) · 2.03 KB
/
server.mjs
File metadata and controls
83 lines (74 loc) · 2.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { createRequestHandler } from '@react-router/express'
import compression from 'compression'
import { consola } from 'consola'
import express from 'express'
import morgan from 'morgan'
import { createJobScheduler } from './build/job-scheduler.js'
const viteDevServer =
process.env.NODE_ENV === 'production'
? undefined
: await import('vite').then((vite) =>
vite.createServer({
server: { middlewareMode: true },
}),
)
const app = express()
app.use((req, res, next) => {
// helpful headers:
res.set('x-fly-region', process.env.FLY_REGION ?? 'unknown')
res.set('Strict-Transport-Security', `max-age=${60 * 60 * 24 * 365 * 100}`)
// /clean-urls/ -> /clean-urls
if (req.path.endsWith('/') && req.path.length > 1) {
const query = req.url.slice(req.path.length)
const safepath = req.path.slice(0, -1).replace(/\/+/g, '/')
res.redirect(301, safepath + query)
return
}
next()
})
app.use(compression())
app.disable('x-powered-by')
app.use(express.static('public', { maxAge: '1h' }))
app.use(
morgan('tiny', {
skip: (req) => req.url === '/healthcheck',
}),
)
// handle asset requests
if (viteDevServer) {
app.use(viteDevServer.middlewares)
} else {
app.use(
'/assets',
express.static('build/client/assets', {
immutable: true,
maxAge: '1y',
}),
)
}
app.use(express.static('build/client', { maxAge: '1h' }))
// handle SSR requests
app.all(
/.*/,
createRequestHandler({
build: viteDevServer
? () => viteDevServer.ssrLoadModule('virtual:react-router/server-build')
: await import('./build/server/index.js'),
}),
)
const port = process.env.PORT || 3000
const server = app.listen(port, () => {
consola.info(`Express server listening on port ${port}`)
})
// Graceful shutdown
function shutdown() {
consola.info('Shutting down...')
server.close()
process.exit(0)
}
process.on('SIGINT', shutdown)
process.on('SIGTERM', shutdown)
if (process.env.NODE_ENV === 'production') {
const { startScheduler } = createJobScheduler()
startScheduler()
}