Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for custom host in serve api #563

Merged
merged 1 commit into from
Nov 26, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/esbuild/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Options:
--outdir=... The output directory (for multiple entry points)
--outfile=... The output file (for one entry point)
--platform=... Platform target (browser | node, default browser)
--serve=... Start a local HTTP server on this port for outputs
--serve=... Start a local HTTP server on this [host]:port for outputs
--sourcemap Emit a source map
--splitting Enable code splitting (currently only for esm)
--target=... Environment target (e.g. es2017, chrome58, firefox57,
Expand Down
4 changes: 4 additions & 0 deletions cmd/esbuild/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,9 @@ func (service *serviceType) handleBuildRequest(id uint32, request map[string]int
if port, ok := serve["port"]; ok {
serveOptions.Port = uint16(port.(int))
}
if host, ok := serve["host"]; ok {
serveOptions.Host = host.(string)
}
serveOptions.OnRequest = func(args api.ServeOnRequestArgs) {
service.sendRequest(map[string]interface{}{
"command": "serve-request",
Expand All @@ -527,6 +530,7 @@ func (service *serviceType) handleBuildRequest(id uint32, request map[string]int
}
response := map[string]interface{}{
"port": int(result.Port),
"host": result.Host,
}

// Asynchronously wait for the server to stop, then fulfil the "wait" promise
Expand Down
3 changes: 3 additions & 0 deletions lib/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,7 @@ export function createChannel(streamIn: StreamIn): StreamOut {
let buildServeData = (options: types.ServeOptions, request: protocol.BuildRequest): ServeData => {
let keys: OptionKeys = {};
let port = getFlag(options, keys, 'port', mustBeInteger);
let host = getFlag(options, keys, 'host', mustBeString);
let onRequest = getFlag(options, keys, 'onRequest', mustBeFunction);
let serveID = nextServeID++;
let onWait: ServeCallbacks['onWait'];
Expand All @@ -578,6 +579,7 @@ export function createChannel(streamIn: StreamIn): StreamOut {
request.serve = { serveID };
checkForInvalidFlags(options, keys);
if (port !== void 0) request.serve.port = port;
if (host !== void 0) request.serve.host = host;
serveCallbacks.set(serveID, {
onRequest,
onWait: onWait!,
Expand Down Expand Up @@ -653,6 +655,7 @@ export function createChannel(streamIn: StreamIn): StreamOut {
let serveResponse = response as any as protocol.ServeResponse;
let result: types.ServeResult = {
port: serveResponse.port,
host: serveResponse.host,
wait: serve.wait,
stop: serve.stop,
};
Expand Down
2 changes: 2 additions & 0 deletions lib/stdio_protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@ export interface BuildRequest {
export interface ServeRequest {
serveID: number;
port?: number;
host?: string;
}

export interface ServeResponse {
port: number;
host: string;
}

export interface ServeStopRequest {
Expand Down
2 changes: 2 additions & 0 deletions lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ export interface BuildFailure extends Error {

export interface ServeOptions {
port?: number;
host?: string;
onRequest?: (args: ServeOnRequestArgs) => void;
}

Expand All @@ -114,6 +115,7 @@ export interface ServeOnRequestArgs {

export interface ServeResult {
port: number;
host: string;
wait: Promise<void>;
stop: () => void;
}
Expand Down
2 changes: 2 additions & 0 deletions pkg/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ func Transform(input string, options TransformOptions) TransformResult {

type ServeOptions struct {
Port uint16
Host string
OnRequest func(ServeOnRequestArgs)
}

Expand All @@ -338,6 +339,7 @@ type ServeOnRequestArgs struct {

type ServeResult struct {
Port uint16
Host string
Wait func() error
Stop func()
}
Expand Down
6 changes: 5 additions & 1 deletion pkg/api/api_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -1151,6 +1151,9 @@ func serveImpl(serveOptions ServeOptions, buildOptions BuildOptions) (ServeResul
// Pick the port
var listener net.Listener
host := "127.0.0.1"
if serveOptions.Host != "" {
host = serveOptions.Host
}
if serveOptions.Port == 0 {
// Default to picking a "800X" port
for port := 8000; port <= 8009; port++ {
Expand All @@ -1174,9 +1177,10 @@ func serveImpl(serveOptions ServeOptions, buildOptions BuildOptions) (ServeResul

// Extract the real port in case we passed a port of "0"
var result ServeResult
if _, text, err := net.SplitHostPort(addr); err == nil {
if host, text, err := net.SplitHostPort(addr); err == nil {
if port, err := strconv.ParseInt(text, 10, 32); err == nil {
result.Port = uint16(port)
result.Host = host
}
}

Expand Down
14 changes: 10 additions & 4 deletions pkg/cli/cli_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package cli
import (
"fmt"
"io/ioutil"
"net"
"os"
"sort"
"strconv"
Expand Down Expand Up @@ -502,7 +503,7 @@ func runImpl(osArgs []string) int {
// Special-case running a server
for i, arg := range osArgs {
if arg == "--serve" {
arg = "--serve=0"
arg = "--serve=:0"
}
if strings.HasPrefix(arg, "--serve=") {
serve := arg[len("--serve="):]
Expand Down Expand Up @@ -575,7 +576,11 @@ func runImpl(osArgs []string) int {
return 0
}

func serveImpl(portText string, osArgs []string) error {
func serveImpl(serveText string, osArgs []string) error {
host, portText, err := net.SplitHostPort(serveText)
if err != nil {
return err
}
port, err := strconv.ParseInt(portText, 10, 32)
if err != nil {
return err
Expand All @@ -597,6 +602,7 @@ func serveImpl(portText string, osArgs []string) error {

serveOptions := api.ServeOptions{
Port: uint16(port),
Host: host,
OnRequest: func(args api.ServeOnRequestArgs) {
logger.PrintTextToStderr(logger.LevelInfo, osArgs, func(colors logger.Colors) string {
statusColor := colors.Red
Expand All @@ -617,8 +623,8 @@ func serveImpl(portText string, osArgs []string) error {

// Show what actually got bound if the port was 0
logger.PrintTextToStderr(logger.LevelInfo, osArgs, func(colors logger.Colors) string {
return fmt.Sprintf("%s\n > %shttp://localhost:%d/%s\n\n",
colors.Default, colors.Underline, result.Port, colors.Default)
return fmt.Sprintf("%s\n > %shttp://%s:%d/%s\n\n",
colors.Default, colors.Underline, result.Host, result.Port, colors.Default)
})
return result.Wait()
}