Repository navigation
Expand file tree
/
Copy pathdev_server.mjs
More file actions
66 lines (48 loc) · 1.6 KB
/
Copy pathdev_server.mjs
File metadata and controls
66 lines (48 loc) · 1.6 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
import express from 'express'
import fetch from 'node-fetch'
import urlJoin from 'url-join'
import nocache from 'nocache'
import rateLimit from 'express-rate-limit'
let server = express()
const pageLimiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 200,
standardHeaders: true,
legacyHeaders: false,
})
server.use(nocache())
if(process.env.ZOOMA_DEV_BACKEND_PROXY_URL === undefined) {
throw new Error('please set ZOOMA_DEV_BACKEND_PROXY_URL before running dev server')
}
// Parse JSON bodies for API proxy (needed to forward POST bodies)
server.use(/^\/v[23].*/, express.json({ limit: '10mb' }))
server.use(/^\/v[23].*/, async (req, res) => {
let backendUrl = urlJoin(process.env.ZOOMA_DEV_BACKEND_PROXY_URL, req.originalUrl)
console.log('forwarding api request to: ' + backendUrl)
try {
let body = undefined
let headers = {}
if (req.method !== 'GET' && req.method !== 'HEAD' && req.body) {
body = JSON.stringify(req.body)
headers['content-type'] = 'application/json'
}
let apiResponse = await fetch(backendUrl, {
redirect: 'follow',
method: req.method,
body,
headers,
// 10 min timeout for streaming endpoints where individual properties can take a while
timeout: 600000,
})
res.header('content-type', apiResponse.headers.get('content-type'))
res.status(apiResponse.status)
apiResponse.body.pipe(res)
} catch(e) {
console.log(e)
}
})
server.use(express.static('dist'))
server.get(/^(?!\/api).*$/, pageLimiter, (req, res) => {
res.sendFile(process.cwd() + '/dist/index.html')
})
server.listen(3000)