44 "context"
55 "fmt"
66 "io"
7+ "net"
78 "os"
89 "os/exec"
910 "os/signal"
@@ -15,7 +16,6 @@ import (
1516
1617 "github.com/foomo/webgrapple/pkg/clientconfig"
1718 "github.com/foomo/webgrapple/pkg/server"
18- "github.com/foomo/webgrapple/pkg/utils/freeport"
1919 "github.com/foomo/webgrapple/pkg/vo"
2020)
2121
@@ -71,20 +71,20 @@ func Run(
7171 // get some ports
7272 port := flagPort
7373 if port == 0 {
74- ports , errTakePort := freeport . Take ( 1 )
74+ ports , errTakePort := freeport ( )
7575 if errTakePort != nil {
7676 return errorWrap (errTakePort , "could not find a free port" )
7777 }
78- port = ports [ 0 ]
78+ port = ports
7979 }
8080
8181 var debugPort int
8282 if flagDebugServerPort == 0 && flagStartVSCode {
83- debugPorts , errTakeDebugPort := freeport . Take ( 1 )
83+ debugPorts , errTakeDebugPort := freeport ( )
8484 if errTakeDebugPort != nil {
8585 return errorWrap (errTakeDebugPort , "could not find a free debug port" )
8686 }
87- debugPort = debugPorts [ 0 ]
87+ debugPort = debugPorts
8888 } else {
8989 debugPort = flagDebugServerPort
9090 }
@@ -177,6 +177,26 @@ func Run(
177177 return nil
178178}
179179
180+ // freeport asks the kernel for a free open port that is ready to use.
181+ func freeport () (int , error ) {
182+ a , err := net .ResolveTCPAddr ("tcp" , "localhost:0" )
183+ if err != nil {
184+ return 0 , err
185+ }
186+
187+ l , err := net .ListenTCP ("tcp" , a )
188+ if err != nil {
189+ return 0 , err
190+ }
191+ defer l .Close ()
192+
193+ addr , ok := l .Addr ().(* net.TCPAddr )
194+ if ! ok {
195+ return 0 , errors .New ("could not resolve local address" )
196+ }
197+ return addr .Port , nil
198+ }
199+
180200func removeServices (ctx context.Context , l log.Logger , address string , config vo.ClientConfig ) {
181201 client := server .NewServiceGoTSRPCClient (address , server .DefaultEndPoint )
182202 var serviceIDs []vo.ServiceID
0 commit comments