UNPKG

1.84 kBJavaScriptView Raw
1/*
2 * FAB Wrapper
3 *
4 * Entry point for the FAB Webpack build
5 * Maps the simplified index.fab.js to the FAB spec
6 *
7 * */
8
9const url = require('url')
10const render_app = require('app-index').render
11const production_settings = require('production-settings.json')
12const rewrites = FAB_REWRITES
13const mime = require('mime-types')
14
15const getContentType = pathname => {
16 const mimeType = mime.lookup(pathname)
17 return (mimeType && mime.contentType(mimeType)) || 'text/html; charset=utf-8'
18}
19
20const excludedHeaders = new Set([
21 'cache-control',
22 'connection',
23 'expect',
24 'keep-alive',
25 'proxy-authenticate',
26 'proxy-authorization',
27 'proxy-connection',
28 'trailer',
29 'upgrade',
30 'x-accel-buffering',
31 'x-accel-charset',
32 'x-accel-limit-rate',
33 'x-accel-redirect',
34 'x-cache',
35 'x-forwarded-proto',
36 'x-real-ip'
37])
38const excludedHeaderPrefixes = [/^x-amz-cf-/i, /^x-amzn-/i, /^x-edge-/i]
39
40const render = async (req, settings) => {
41 const parsed = url.parse(req.url)
42 const { path, protocol, host } = parsed
43
44 const rewrite = rewrites[path]
45 if (rewrite) {
46 const response = await fetch(`${protocol}//${host}${rewrite}`)
47
48 // Delete excluded headers
49 const headers = {}
50 for (const [header, value] of response.headers.entries()) {
51 if (excludedHeaders.has(header.toLowerCase())) continue
52 if (excludedHeaderPrefixes.some(prefix => prefix.exec(header))) continue
53 headers[header] = value
54 }
55
56 // Add mime types if not already present
57 if (!headers['content-type']) headers['content-type'] = getContentType(path)
58
59 return new Response(await response.body, {
60 status: response.status,
61 statusText: response.statusText,
62 headers
63 })
64 }
65 return await render_app(req, settings)
66}
67
68module.exports = {
69 render,
70 getProdSettings() {
71 return production_settings
72 }
73}