From 2e4e3490ca40b516a4a1ec7d4f92d9b78f4086b9 Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Mon, 2 Aug 2021 10:20:23 +0000 Subject: [PATCH] Use ICE servers from API --- Makefile | 2 +- coder-sdk/interface.go | 6 +++++- coder-sdk/webrtc.go | 23 +++++++++++++++++++++++ internal/cmd/tunnel.go | 10 +++++++++- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 coder-sdk/webrtc.go diff --git a/Makefile b/Makefile index 24c3d13e..aa80df36 100644 --- a/Makefile +++ b/Makefile @@ -48,4 +48,4 @@ dev: build/linux -rm ./coder @echo "untarring..." @tar -xzf ./ci/bin/coder-cli-linux-amd64.tar.gz - @echo "new dev binary ready" \ No newline at end of file + @echo "new dev binary ready" diff --git a/coder-sdk/interface.go b/coder-sdk/interface.go index b28bfe84..6394b88b 100644 --- a/coder-sdk/interface.go +++ b/coder-sdk/interface.go @@ -5,6 +5,7 @@ import ( "net/url" "cdr.dev/wsep" + "github.com/pion/webrtc/v3" "nhooyr.io/websocket" ) @@ -242,7 +243,7 @@ type Client interface { // SetPolicyTemplate sets the workspace policy template SetPolicyTemplate(ctx context.Context, templateID string, templateScope TemplateScope, dryRun bool) (*SetPolicyTemplateResponse, error) - // satellites fetches all satellitess known to the Coder control plane. + // Satellites fetches all satellitess known to the Coder control plane. Satellites(ctx context.Context) ([]Satellite, error) // CreateSatellite creates a new satellite entity. @@ -253,4 +254,7 @@ type Client interface { // UpdateLastConnectionAt updates the last connection at attribute of a workspace. UpdateLastConnectionAt(ctx context.Context, workspaceID string) error + + // ICEServers fetches the list of ICE servers advertised by the deployment. + ICEServers(ctx context.Context) ([]webrtc.ICEServer, error) } diff --git a/coder-sdk/webrtc.go b/coder-sdk/webrtc.go new file mode 100644 index 00000000..4ea1713c --- /dev/null +++ b/coder-sdk/webrtc.go @@ -0,0 +1,23 @@ +package coder + +import ( + "context" + "net/http" + + "github.com/pion/webrtc/v3" +) + +type getICEServersRes struct { + Data []webrtc.ICEServer `json:"data"` +} + +// ICEServers fetches the list of ICE servers advertised by the deployment. +func (c *DefaultClient) ICEServers(ctx context.Context) ([]webrtc.ICEServer, error) { + var res getICEServersRes + err := c.requestBody(ctx, http.MethodGet, "/api/private/webrtc/ice", nil, &res) + if err != nil { + return nil, err + } + + return res.Data, nil +} diff --git a/internal/cmd/tunnel.go b/internal/cmd/tunnel.go index b3a4ad06..116ecfa0 100644 --- a/internal/cmd/tunnel.go +++ b/internal/cmd/tunnel.go @@ -75,11 +75,18 @@ coder tunnel my-dev 3000 3000 return xerrors.Errorf("No workspace found by name '%s'", args[0]) } + iceServers, err := sdk.ICEServers(ctx) + if err != nil { + return xerrors.Errorf("get ICE servers: %w", err) + } + log.Debug(ctx, "got ICE servers", slog.F("ice", iceServers)) + c := &tunnneler{ log: log, brokerAddr: &baseURL, token: sdk.Token(), workspaceID: workspaceID, + iceServers: iceServers, stdio: args[2] == "stdio", localPort: uint16(localPort), remotePort: uint16(remotePort), @@ -102,6 +109,7 @@ type tunnneler struct { brokerAddr *url.URL token string workspaceID string + iceServers []webrtc.ICEServer remotePort uint16 localPort uint16 stdio bool @@ -119,7 +127,7 @@ func (c *tunnneler) start(ctx context.Context) error { TURNProxyAuthToken: c.token, TURNRemoteProxyURL: c.brokerAddr, TURNLocalProxyURL: c.brokerAddr, - ICEServers: []webrtc.ICEServer{wsnet.TURNProxyICECandidate()}, + ICEServers: c.iceServers, }, nil, )