Skip to content

Commit bca12c7

Browse files
committed
Wait for dev server to come online
1 parent 9858eee commit bca12c7

File tree

1 file changed

+70
-59
lines changed

1 file changed

+70
-59
lines changed

run.go

Lines changed: 70 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"fmt"
5+
"net"
56
"os"
67
"os/exec"
78
"strings"
@@ -78,80 +79,71 @@ func runClient(url string, args []string, runtime string, typescript bool) error
7879
return fmt.Errorf("Failed to run 'CG_GAME_URL=%s node %s'.", url, strings.Join(cmdArgs, " "))
7980
}
8081
} else {
81-
if _, err := exec.LookPath("npx"); err != nil {
82-
return fmt.Errorf("'npx' ist not installed!")
83-
}
8482
var cmdArgs []string
8583
if runtime == "bundler" {
8684
cmdArgs = []string{"parcel", "--watch-for-stdin", "-p", "5000", "src/index.html"}
8785
} else {
8886
cmdArgs = []string{"serve", "-n", "--no-port-switching", "-p", "5000", "."}
8987
}
90-
cmd := exec.Command("npx", cmdArgs...)
91-
cmd.Stdin = os.Stdin
92-
cmd.Stdout = os.Stdout
93-
cmd.Stderr = os.Stderr
94-
95-
err := cmd.Start()
96-
if err != nil {
97-
return fmt.Errorf("Failed to start '%s': %s", strings.Join(cmdArgs, " "), err)
98-
}
99-
100-
pflag.Usage = func() {
101-
fmt.Fprintf(os.Stdout, "Usage: %s [options] [command]\n\n", os.Args[0])
102-
fmt.Fprintf(os.Stdout, "Options:\n")
103-
pflag.PrintDefaults()
104-
fmt.Fprintf(os.Stdout, "\nCommands:\n")
105-
fmt.Fprintf(os.Stdout, " create [options] <username> Create and join a new game.\n")
106-
fmt.Fprintf(os.Stdout, " join [options] <game_id> <username> [join_secret] Join an existing game.\n")
107-
fmt.Fprintf(os.Stdout, " reconnect [options] <username> Reconnect to a game using a saved session.\n")
108-
fmt.Fprintf(os.Stdout, " spectate [options] [game_id] Spectate a new or existing game.\n")
109-
}
11088

111-
var queryParams string
112-
var public bool
113-
pflag.BoolVar(&public, "public", false, "Make the created game protected.")
114-
var protected bool
115-
pflag.BoolVar(&public, "protected", false, "Make the created game protected.")
116-
pflag.CommandLine.Parse(args)
89+
done := make(chan struct{})
90+
runWhenUP("localhost:5000", func() {
91+
pflag.Usage = func() {
92+
fmt.Fprintf(os.Stdout, "Usage: %s [options] [command]\n\n", os.Args[0])
93+
fmt.Fprintf(os.Stdout, "Options:\n")
94+
pflag.PrintDefaults()
95+
fmt.Fprintf(os.Stdout, "\nCommands:\n")
96+
fmt.Fprintf(os.Stdout, " create [options] <username> Create and join a new game.\n")
97+
fmt.Fprintf(os.Stdout, " join [options] <game_id> <username> [join_secret] Join an existing game.\n")
98+
fmt.Fprintf(os.Stdout, " reconnect [options] <username> Reconnect to a game using a saved session.\n")
99+
fmt.Fprintf(os.Stdout, " spectate [options] [game_id] Spectate a new or existing game.\n")
100+
}
117101

118-
var op string
119-
if pflag.NArg() > 0 {
120-
op = pflag.Arg(0)
121-
}
102+
var queryParams string
103+
var public bool
104+
pflag.BoolVar(&public, "public", false, "Make the created game protected.")
105+
var protected bool
106+
pflag.BoolVar(&public, "protected", false, "Make the created game protected.")
107+
pflag.CommandLine.Parse(args)
122108

123-
switch op {
124-
case "create", "reconnect":
125-
if pflag.NArg() > 1 {
126-
queryParams += "&username=" + pflag.Arg(1)
127-
}
128-
case "join":
129-
if pflag.NArg() > 1 {
130-
queryParams += "&game_id=" + pflag.Arg(1)
109+
var op string
110+
if pflag.NArg() > 0 {
111+
op = pflag.Arg(0)
131112
}
132-
if pflag.NArg() > 2 {
133-
queryParams += "&username=" + pflag.Arg(2)
113+
114+
switch op {
115+
case "create", "reconnect":
116+
if pflag.NArg() > 1 {
117+
queryParams += "&username=" + pflag.Arg(1)
118+
}
119+
case "join":
120+
if pflag.NArg() > 1 {
121+
queryParams += "&game_id=" + pflag.Arg(1)
122+
}
123+
if pflag.NArg() > 2 {
124+
queryParams += "&username=" + pflag.Arg(2)
125+
}
126+
if pflag.NArg() > 3 {
127+
queryParams += "&join_secret=" + pflag.Arg(3)
128+
}
129+
case "spectate":
130+
if pflag.NArg() > 1 {
131+
queryParams += "&game_id=" + pflag.Arg(1)
132+
}
134133
}
135-
if pflag.NArg() > 3 {
136-
queryParams += "&join_secret=" + pflag.Arg(3)
134+
135+
if public {
136+
queryParams += "&public=true"
137137
}
138-
case "spectate":
139-
if pflag.NArg() > 1 {
140-
queryParams += "&game_id=" + pflag.Arg(1)
138+
if protected {
139+
queryParams += "&protected=true"
141140
}
142-
}
143-
144-
if public {
145-
queryParams += "&public=true"
146-
}
147-
if protected {
148-
queryParams += "&protected=true"
149-
}
150141

151-
time.Sleep(2 * time.Second)
142+
cgExec.OpenBrowser(fmt.Sprintf("http://localhost:5000?game_url=%s&op=%s%s", url, op, queryParams))
143+
}, done)
152144

153-
cgExec.OpenBrowser(fmt.Sprintf("http://localhost:5000?game_url=%s&op=%s%s", url, op, queryParams))
154-
err = cmd.Wait()
145+
_, err := cgExec.Execute(false, "npx", cmdArgs...)
146+
close(done)
155147
if err != nil {
156148
return fmt.Errorf("Failed to run '%s': %s", strings.Join(cmdArgs, " "), err)
157149
}
@@ -160,6 +152,25 @@ func runClient(url string, args []string, runtime string, typescript bool) error
160152
return nil
161153
}
162154

155+
func runWhenUP(address string, fn func(), done <-chan struct{}) {
156+
go func() {
157+
for {
158+
select {
159+
case <-done:
160+
return
161+
default:
162+
}
163+
con, err := net.Dial("tcp", address)
164+
if err == nil {
165+
con.Close()
166+
break
167+
}
168+
time.Sleep(100 * time.Millisecond)
169+
}
170+
fn()
171+
}()
172+
}
173+
163174
func runServer(args []string, typescript bool) error {
164175
panic("not implemented")
165176
return nil

0 commit comments

Comments
 (0)