theatre/packages/playground/devEnv/createProxyServer.ts

34 lines
864 B
TypeScript

import type {IncomingMessage, ServerResponse} from 'http'
import {createServer, request} from 'http'
// See example from https://esbuild.github.io/api/#customizing-server-behavior
export function createProxyServer(
handleRequest:
| ((req: IncomingMessage, res: ServerResponse) => boolean)
| undefined,
target: {hostname: string; port: number},
) {
return createServer((req, res) => {
const {url, method, headers} = req
if (handleRequest?.(req, res)) {
return
}
// Otherwise forward requests to target (e.g. ESBuild server)
req.pipe(
request(
{
...target,
path: url,
method,
headers,
},
(prxRes) => {
res.writeHead(prxRes.statusCode!, prxRes.headers)
prxRes.pipe(res, {end: true})
},
),
{end: true},
)
})
}