Skip to content

Commit 8570f41

Browse files
committed
sketch after API changes in go-liveshare#11
1 parent ef8dde4 commit 8570f41

File tree

6 files changed

+38
-67
lines changed

6 files changed

+38
-67
lines changed

cmd/ghcs/logs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func logs(ctx context.Context, tail bool, codespaceName string) error {
8888

8989
tunnelClosed := make(chan error, 1)
9090
go func() {
91-
tunnelClosed <- tunnel.Start(ctx) // error is non-nil
91+
tunnelClosed <- tunnel.Forward(ctx) // error is non-nil
9292
}()
9393

9494
cmdDone := make(chan error, 1)

cmd/ghcs/ports.go

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,15 @@ func ports(opts *portsOptions) error {
7676

7777
devContainerCh := getDevContainer(ctx, apiClient, codespace)
7878

79-
liveShareClient, err := codespaces.ConnectToLiveshare(ctx, log, apiClient, user.Login, token, codespace)
79+
session, err := codespaces.ConnectToLiveshare(ctx, log, apiClient, user.Login, token, codespace)
8080
if err != nil {
8181
return fmt.Errorf("error connecting to Live Share: %v", err)
8282
}
8383

8484
log.Println("Loading ports...")
85-
ports, err := getPorts(ctx, liveShareClient)
85+
ports, err := session.GetSharedServers(ctx)
8686
if err != nil {
87-
return fmt.Errorf("error getting ports: %v", err)
87+
return fmt.Errorf("error getting ports of shared servers: %v", err)
8888
}
8989

9090
devContainerResult := <-devContainerCh
@@ -116,20 +116,6 @@ func ports(opts *portsOptions) error {
116116
return nil
117117
}
118118

119-
func getPorts(ctx context.Context, lsclient *liveshare.Client) (liveshare.Ports, error) {
120-
server, err := liveshare.NewServer(lsclient)
121-
if err != nil {
122-
return nil, fmt.Errorf("error creating server: %v", err)
123-
}
124-
125-
ports, err := server.GetSharedServers(ctx)
126-
if err != nil {
127-
return nil, fmt.Errorf("error getting shared servers: %v", err)
128-
}
129-
130-
return ports, nil
131-
}
132-
133119
type devContainerResult struct {
134120
devContainer *devContainer
135121
err error
@@ -219,22 +205,17 @@ func updatePortVisibility(log *output.Logger, codespaceName, sourcePort string,
219205
return fmt.Errorf("error getting Codespace: %v", err)
220206
}
221207

222-
lsclient, err := codespaces.ConnectToLiveshare(ctx, log, apiClient, user.Login, token, codespace)
208+
session, err := codespaces.ConnectToLiveshare(ctx, log, apiClient, user.Login, token, codespace)
223209
if err != nil {
224210
return fmt.Errorf("error connecting to Live Share: %v", err)
225211
}
226212

227-
server, err := liveshare.NewServer(lsclient)
228-
if err != nil {
229-
return fmt.Errorf("error creating server: %v", err)
230-
}
231-
232213
port, err := strconv.Atoi(sourcePort)
233214
if err != nil {
234215
return fmt.Errorf("error reading port number: %v", err)
235216
}
236217

237-
if err := server.UpdateSharedVisibility(ctx, port, public); err != nil {
218+
if err := session.UpdateSharedVisibility(ctx, port, public); err != nil {
238219
return fmt.Errorf("error update port to public: %v", err)
239220
}
240221

@@ -285,36 +266,36 @@ func forwardPorts(log *output.Logger, codespaceName string, ports []string) erro
285266
return fmt.Errorf("error getting Codespace: %v", err)
286267
}
287268

288-
lsclient, err := codespaces.ConnectToLiveshare(ctx, log, apiClient, user.Login, token, codespace)
269+
session, err := codespaces.ConnectToLiveshare(ctx, log, apiClient, user.Login, token, codespace)
289270
if err != nil {
290271
return fmt.Errorf("error connecting to Live Share: %v", err)
291272
}
292273

293-
server, err := liveshare.NewServer(lsclient)
294-
if err != nil {
295-
return fmt.Errorf("error creating server: %v", err)
296-
}
297-
298274
g, gctx := errgroup.WithContext(ctx)
299275
for _, portPair := range portPairs {
300276
pp := portPair
301277

278+
// TODO(adonovan): fix data race on Session between
279+
// StartSharing and NewPortForwarder.
302280
srcstr := strconv.Itoa(portPair.src)
303-
if err := server.StartSharing(gctx, "share-"+srcstr, pp.src); err != nil {
281+
if err := session.StartSharing(gctx, "share-"+srcstr, pp.src); err != nil {
304282
return fmt.Errorf("start sharing port: %v", err)
305283
}
306284

307285
g.Go(func() error {
308286
log.Println("Forwarding port: " + srcstr + " ==> " + strconv.Itoa(pp.dst))
309-
portForwarder := liveshare.NewPortForwarder(lsclient, server, pp.dst)
310-
if err := portForwarder.Start(gctx); err != nil {
287+
portForwarder := liveshare.NewPortForwarder(session, pp.dst)
288+
if err := portForwarder.Forward(gctx); err != nil {
311289
return fmt.Errorf("error forwarding port: %v", err)
312290
}
313291

314292
return nil
315293
})
316294
}
317295

296+
// TODO(adonovan): fix: the waits for _all_ goroutines to terminate.
297+
// If there are multiple ports, one long-lived successful connection
298+
// will hide errors from any that fail.
318299
if err := g.Wait(); err != nil {
319300
return err
320301
}

cmd/ghcs/ssh.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,20 +56,17 @@ func ssh(ctx context.Context, sshProfile, codespaceName string, localSSHServerPo
5656
return fmt.Errorf("get or choose Codespace: %v", err)
5757
}
5858

59-
lsclient, err := codespaces.ConnectToLiveshare(ctx, log, apiClient, user.Login, token, codespace)
59+
session, err := codespaces.ConnectToLiveshare(ctx, log, apiClient, user.Login, token, codespace)
6060
if err != nil {
6161
return fmt.Errorf("error connecting to Live Share: %v", err)
6262
}
6363

64-
remoteSSHServerPort, sshUser, err := codespaces.StartSSHServer(ctx, lsclient, log)
64+
remoteSSHServerPort, sshUser, err := codespaces.StartSSHServer(ctx, session, log)
6565
if err != nil {
6666
return fmt.Errorf("error getting ssh server details: %v", err)
6767
}
6868

69-
terminal, err := liveshare.NewTerminal(lsclient)
70-
if err != nil {
71-
return fmt.Errorf("error creating Live Share terminal: %v", err)
72-
}
69+
terminal := liveshare.NewTerminal(session)
7370

7471
log.Print("Preparing SSH...")
7572
if sshProfile == "" {
@@ -93,7 +90,7 @@ func ssh(ctx context.Context, sshProfile, codespaceName string, localSSHServerPo
9390
}
9491
}
9592

96-
tunnel, err := codespaces.NewPortForwarder(ctx, lsclient, "sshd", localSSHServerPort, remoteSSHServerPort)
93+
tunnel, err := codespaces.NewPortForwarder(ctx, session, "sshd", localSSHServerPort, remoteSSHServerPort)
9794
if err != nil {
9895
return fmt.Errorf("make ssh tunnel: %v", err)
9996
}
@@ -105,7 +102,7 @@ func ssh(ctx context.Context, sshProfile, codespaceName string, localSSHServerPo
105102

106103
tunnelClosed := make(chan error)
107104
go func() {
108-
tunnelClosed <- tunnel.Start(ctx) // error is always non-nil
105+
tunnelClosed <- tunnel.Forward(ctx) // error is always non-nil
109106
}()
110107

111108
shellClosed := make(chan error)

internal/codespaces/codespaces.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func connectionReady(codespace *api.Codespace) bool {
7373
codespace.Environment.State == api.CodespaceEnvironmentStateAvailable
7474
}
7575

76-
func ConnectToLiveshare(ctx context.Context, log logger, apiClient *api.API, userLogin, token string, codespace *api.Codespace) (client *liveshare.Client, err error) {
76+
func ConnectToLiveshare(ctx context.Context, log logger, apiClient *api.API, userLogin, token string, codespace *api.Codespace) (*liveshare.Session, error) {
7777
var startedCodespace bool
7878
if codespace.Environment.State != api.CodespaceEnvironmentStateAvailable {
7979
startedCodespace = true
@@ -96,6 +96,7 @@ func ConnectToLiveshare(ctx context.Context, log logger, apiClient *api.API, use
9696
return nil, errors.New("timed out while waiting for the Codespace to start")
9797
}
9898

99+
var err error
99100
codespace, err = apiClient.GetCodespace(ctx, token, userLogin, codespace.Name)
100101
if err != nil {
101102
return nil, fmt.Errorf("error getting Codespace: %v", err)
@@ -117,14 +118,10 @@ func ConnectToLiveshare(ctx context.Context, log logger, apiClient *api.API, use
117118
}),
118119
)
119120
if err != nil {
120-
return nil, fmt.Errorf("error creating Live Share: %v", err)
121+
return nil, fmt.Errorf("error creating Live Share client: %v", err)
121122
}
122123

123-
if err := lsclient.Join(ctx); err != nil {
124-
return nil, fmt.Errorf("error joining Live Share client: %v", err)
125-
}
126-
127-
return lsclient, nil
124+
return lsclient.JoinWorkspace(ctx)
128125
}
129126

130127
func GetOrChooseCodespace(ctx context.Context, apiClient *api.API, user *api.User, codespaceName string) (codespace *api.Codespace, token string, err error) {

internal/codespaces/ssh.go

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,37 +32,33 @@ func UnusedPort() (int, error) {
3232
return l.Addr().(*net.TCPAddr).Port, nil
3333
}
3434

35-
// NewPortForwarder returns a new port forwarder for traffic between
36-
// the Live Share client and the specified local and remote ports.
35+
// NewPortForwarder returns a new port forwarder that forwards traffic between
36+
// the specified local and remote ports over the provided Live Share session.
3737
//
3838
// The session name is used (along with the port) to generate
3939
// names for streams, and may appear in error messages.
40-
func NewPortForwarder(ctx context.Context, client *liveshare.Client, sessionName string, localSSHPort, remoteSSHPort int) (*liveshare.PortForwarder, error) {
40+
func NewPortForwarder(ctx context.Context, session *liveshare.Session, sessionName string, localSSHPort, remoteSSHPort int) (*liveshare.PortForwarder, error) {
4141
if localSSHPort == 0 {
4242
return nil, fmt.Errorf("a local port must be provided")
4343
}
4444

45-
server, err := liveshare.NewServer(client)
46-
if err != nil {
47-
return nil, fmt.Errorf("new liveshare server: %v", err)
48-
}
45+
// TODO(adonovan): fix data race on Session between
46+
// StartSharing and NewPortForwarder. Perhaps combine the
47+
// operations in go-liveshare?
4948

50-
if err := server.StartSharing(ctx, "sshd", remoteSSHPort); err != nil {
49+
if err := session.StartSharing(ctx, "sshd", remoteSSHPort); err != nil {
5150
return nil, fmt.Errorf("sharing sshd port: %v", err)
5251
}
5352

54-
return liveshare.NewPortForwarder(client, server, localSSHPort), nil
53+
return liveshare.NewPortForwarder(session, localSSHPort), nil
5554
}
5655

5756
// StartSSHServer installs (if necessary) and starts the SSH in the codespace.
5857
// It returns the remote port where it is running, the user to log in with, or an error if something failed.
59-
func StartSSHServer(ctx context.Context, client *liveshare.Client, log logger) (serverPort int, user string, err error) {
58+
func StartSSHServer(ctx context.Context, session *liveshare.Session, log logger) (serverPort int, user string, err error) {
6059
log.Println("Fetching SSH details...")
6160

62-
sshServer, err := liveshare.NewSSHServer(client)
63-
if err != nil {
64-
return 0, "", fmt.Errorf("error creating live share: %v", err)
65-
}
61+
sshServer := session.SSHServer()
6662

6763
sshServerStartResult, err := sshServer.StartRemoteServer(ctx)
6864
if err != nil {

internal/codespaces/states.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func PollPostCreateStates(ctx context.Context, log logger, apiClient *api.API, u
4040
return fmt.Errorf("getting Codespace token: %v", err)
4141
}
4242

43-
lsclient, err := ConnectToLiveshare(ctx, log, apiClient, user.Login, token, codespace)
43+
session, err := ConnectToLiveshare(ctx, log, apiClient, user.Login, token, codespace)
4444
if err != nil {
4545
return fmt.Errorf("connect to Live Share: %v", err)
4646
}
@@ -50,19 +50,19 @@ func PollPostCreateStates(ctx context.Context, log logger, apiClient *api.API, u
5050
return err
5151
}
5252

53-
remoteSSHServerPort, sshUser, err := StartSSHServer(ctx, lsclient, log)
53+
remoteSSHServerPort, sshUser, err := StartSSHServer(ctx, session, log)
5454
if err != nil {
5555
return fmt.Errorf("error getting ssh server details: %v", err)
5656
}
5757

58-
fwd, err := NewPortForwarder(ctx, lsclient, "sshd", localSSHPort, remoteSSHServerPort)
58+
fwd, err := NewPortForwarder(ctx, session, "sshd", localSSHPort, remoteSSHServerPort)
5959
if err != nil {
6060
return fmt.Errorf("creating port forwarder: %v", err)
6161
}
6262

6363
tunnelClosed := make(chan error, 1) // buffered to avoid sender stuckness
6464
go func() {
65-
tunnelClosed <- fwd.Start(ctx) // error is non-nil
65+
tunnelClosed <- fwd.Forward(ctx) // error is non-nil
6666
}()
6767

6868
t := time.NewTicker(1 * time.Second)

0 commit comments

Comments
 (0)