diff --git a/cmd/olcrtc/main.go b/cmd/olcrtc/main.go index 6306a0d..10b5068 100644 --- a/cmd/olcrtc/main.go +++ b/cmd/olcrtc/main.go @@ -18,6 +18,7 @@ import ( type config struct { mode string + link string transport string carrier string roomID string @@ -83,6 +84,7 @@ func parseFlags() config { cfg := config{} flag.StringVar(&cfg.mode, "mode", "", "Mode: srv or cnc") + flag.StringVar(&cfg.link, "link", "direct", "Link: direct") flag.StringVar(&cfg.transport, "transport", "datachannel", "Transport: datachannel") flag.StringVar(&cfg.carrier, "carrier", "", "Carrier: telemost, jazz, wb_stream") flag.StringVar(&cfg.roomID, "id", "", "Room ID") @@ -132,6 +134,7 @@ func loadNames(dataDir string) error { func toSessionConfig(cfg config) session.Config { return session.Config{ Mode: cfg.mode, + Link: cfg.link, Transport: cfg.transport, Carrier: firstNonEmpty(cfg.carrier, cfg.provider), RoomID: cfg.roomID, diff --git a/internal/app/session/session.go b/internal/app/session/session.go index 9127d26..2023c87 100644 --- a/internal/app/session/session.go +++ b/internal/app/session/session.go @@ -27,6 +27,8 @@ var ( ErrCarrierRequired = errors.New("carrier required (use -carrier telemost or -carrier jazz)") // ErrUnsupportedCarrier indicates that carrier is not registered. ErrUnsupportedCarrier = errors.New("unsupported carrier") + // ErrUnsupportedLink indicates that link is not registered. + ErrUnsupportedLink = errors.New("unsupported link") // ErrUnsupportedTransport indicates that transport is not registered. ErrUnsupportedTransport = errors.New("unsupported transport") ) @@ -34,6 +36,7 @@ var ( // Config holds runtime session settings. type Config struct { Mode string + Link string Transport string Carrier string RoomID string @@ -75,11 +78,22 @@ func Validate(cfg Config) error { } } + availableLinks := link.Available() + validLink := false + for _, l := range availableLinks { + if cfg.Link == l { + validLink = true + break + } + } + switch { case cfg.Carrier == "": return ErrCarrierRequired case !validCarrier: return fmt.Errorf("%w: %s (available: %v)", ErrUnsupportedCarrier, cfg.Carrier, availableCarriers) + case !validLink: + return fmt.Errorf("%w: %s (available: %v)", ErrUnsupportedLink, cfg.Link, availableLinks) case !validTransport: return fmt.Errorf("%w: %s (available: %v)", ErrUnsupportedTransport, cfg.Transport, availableTransports) case cfg.RoomID == "" && cfg.Carrier != "jazz": @@ -99,6 +113,7 @@ func Run(ctx context.Context, cfg Config) error { case "srv": return server.Run( ctx, + cfg.Link, cfg.Transport, cfg.Carrier, roomURL, @@ -110,6 +125,7 @@ func Run(ctx context.Context, cfg Config) error { case "cnc": return client.Run( ctx, + cfg.Link, cfg.Transport, cfg.Carrier, roomURL, diff --git a/internal/client/client.go b/internal/client/client.go index 0aa38a2..a38e564 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -58,6 +58,7 @@ type Client struct { // Run starts the client with the specified parameters. func Run( ctx context.Context, + linkName, transportName, providerName, roomURL, @@ -67,12 +68,13 @@ func Run( socksUser string, socksPass string, ) error { - return RunWithReady(ctx, transportName, providerName, roomURL, keyHex, localAddr, dnsServer, socksUser, socksPass, nil) + return RunWithReady(ctx, linkName, transportName, providerName, roomURL, keyHex, localAddr, dnsServer, socksUser, socksPass, nil) } // RunWithReady is like Run but accepts a callback that is called when the client is ready. func RunWithReady( ctx context.Context, + linkName, transportName, providerName, roomURL, @@ -109,7 +111,7 @@ func RunWithReady( const peerCount = 1 for i := range peerCount { - if err := c.addTransport(runCtx, transportName, providerName, roomURL, i, cancel, dnsServer, "", 0); err != nil { + if err := c.addTransport(runCtx, linkName, transportName, providerName, roomURL, i, cancel, dnsServer, "", 0); err != nil { return fmt.Errorf("addTransport failed: %w", err) } } @@ -187,6 +189,7 @@ func (c *Client) setupMux() { func (c *Client) addTransport( ctx context.Context, + linkName, transportName, providerName, roomURL string, @@ -196,7 +199,7 @@ func (c *Client) addTransport( socksProxyAddr string, socksProxyPort int, ) error { - ln, err := link.New(ctx, "direct", link.Config{ + ln, err := link.New(ctx, linkName, link.Config{ Transport: transportName, Carrier: providerName, RoomURL: roomURL, diff --git a/internal/link/link.go b/internal/link/link.go index 7d671c6..bb86890 100644 --- a/internal/link/link.go +++ b/internal/link/link.go @@ -53,3 +53,12 @@ func New(ctx context.Context, name string, cfg Config) (Link, error) { } return factory(ctx, cfg) } + +// Available returns a list of registered link names. +func Available() []string { + names := make([]string, 0, len(registry)) + for name := range registry { + names = append(names, name) + } + return names +} diff --git a/internal/server/server.go b/internal/server/server.go index e17c650..dc6b304 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -68,6 +68,7 @@ type ConnectRequest struct { // Run starts the server with the specified parameters. func Run( ctx context.Context, + linkName, transportName, providerName, roomURL, @@ -103,7 +104,7 @@ func Run( const peerCount = 1 for i := range peerCount { - if err := s.addTransport(runCtx, transportName, providerName, roomURL, i, cancel); err != nil { + if err := s.addTransport(runCtx, linkName, transportName, providerName, roomURL, i, cancel); err != nil { return fmt.Errorf("addTransport failed: %w", err) } } @@ -187,13 +188,14 @@ func (s *Server) setupMux() { func (s *Server) addTransport( ctx context.Context, + linkName, transportName, providerName, roomURL string, peerID int, cancel context.CancelFunc, ) error { - ln, err := link.New(ctx, "direct", link.Config{ + ln, err := link.New(ctx, linkName, link.Config{ Transport: transportName, Carrier: providerName, RoomURL: roomURL, diff --git a/mobile/mobile.go b/mobile/mobile.go index 3032534..9fc0bd9 100644 --- a/mobile/mobile.go +++ b/mobile/mobile.go @@ -109,6 +109,7 @@ func Start(roomID, keyHex string, socksPort int, socksUser, socksPass string) er err := client.RunWithReady( ctx, + "direct", "datachannel", "telemost", roomURL,