@@ -2,6 +2,7 @@ package main
2
2
3
3
import (
4
4
"fmt"
5
+ "net"
5
6
"os"
6
7
"os/exec"
7
8
"strings"
@@ -78,80 +79,71 @@ func runClient(url string, args []string, runtime string, typescript bool) error
78
79
return fmt .Errorf ("Failed to run 'CG_GAME_URL=%s node %s'." , url , strings .Join (cmdArgs , " " ))
79
80
}
80
81
} else {
81
- if _ , err := exec .LookPath ("npx" ); err != nil {
82
- return fmt .Errorf ("'npx' ist not installed!" )
83
- }
84
82
var cmdArgs []string
85
83
if runtime == "bundler" {
86
84
cmdArgs = []string {"parcel" , "--watch-for-stdin" , "-p" , "5000" , "src/index.html" }
87
85
} else {
88
86
cmdArgs = []string {"serve" , "-n" , "--no-port-switching" , "-p" , "5000" , "." }
89
87
}
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 , "\n Commands:\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
- }
110
88
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 , "\n Commands:\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
+ }
117
101
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 )
122
108
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 )
131
112
}
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
+ }
134
133
}
135
- if pflag .NArg () > 3 {
136
- queryParams += "&join_secret=" + pflag .Arg (3 )
134
+
135
+ if public {
136
+ queryParams += "&public=true"
137
137
}
138
- case "spectate" :
139
- if pflag .NArg () > 1 {
140
- queryParams += "&game_id=" + pflag .Arg (1 )
138
+ if protected {
139
+ queryParams += "&protected=true"
141
140
}
142
- }
143
-
144
- if public {
145
- queryParams += "&public=true"
146
- }
147
- if protected {
148
- queryParams += "&protected=true"
149
- }
150
141
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 )
152
144
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 )
155
147
if err != nil {
156
148
return fmt .Errorf ("Failed to run '%s': %s" , strings .Join (cmdArgs , " " ), err )
157
149
}
@@ -160,6 +152,25 @@ func runClient(url string, args []string, runtime string, typescript bool) error
160
152
return nil
161
153
}
162
154
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
+
163
174
func runServer (args []string , typescript bool ) error {
164
175
panic ("not implemented" )
165
176
return nil
0 commit comments