mirror of
https://github.com/openlibrecommunity/olcrtc.git
synced 2026-05-31 01:19:43 +00:00
refactor: make link selectable at runtime
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -109,6 +109,7 @@ func Start(roomID, keyHex string, socksPort int, socksUser, socksPass string) er
|
||||
|
||||
err := client.RunWithReady(
|
||||
ctx,
|
||||
"direct",
|
||||
"datachannel",
|
||||
"telemost",
|
||||
roomURL,
|
||||
|
||||
Reference in New Issue
Block a user