cli/session.go
2021-07-06 09:12:43 -04:00

60 lines
1.3 KiB
Go

package liveshare
import (
"context"
"fmt"
"net/url"
"strings"
"golang.org/x/sync/errgroup"
)
type session struct {
api *api
workspaceAccess *workspaceAccessResponse
workspaceInfo *workspaceInfoResponse
}
func newSession(api *api) *session {
return &session{api: api}
}
func (s *session) init(ctx context.Context) error {
g, ctx := errgroup.WithContext(ctx)
g.Go(func() error {
workspaceAccess, err := s.api.workspaceAccess()
if err != nil {
return fmt.Errorf("error getting workspace access: %v", err)
}
s.workspaceAccess = workspaceAccess
return nil
})
g.Go(func() error {
workspaceInfo, err := s.api.workspaceInfo()
if err != nil {
return fmt.Errorf("error getting workspace info: %v", err)
}
s.workspaceInfo = workspaceInfo
return nil
})
if err := g.Wait(); err != nil {
return err
}
return nil
}
// Reference:
// https://github.com/Azure/azure-relay-node/blob/7b57225365df3010163bf4b9e640868a02737eb6/hyco-ws/index.js#L107-L137
func (s *session) relayURI(action string) string {
relaySas := url.QueryEscape(s.workspaceAccess.RelaySas)
relayURI := s.workspaceAccess.RelayLink
relayURI = strings.Replace(relayURI, "sb:", "wss:", -1)
relayURI = strings.Replace(relayURI, ".net/", ".net:443/$hc/", 1)
relayURI = relayURI + "?sb-hc-action=" + action + "&sb-hc-token=" + relaySas
return relayURI
}