34 lines
864 B
TypeScript
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},
|
|
)
|
|
})
|
|
}
|