refactor: make link selectable at runtime

This commit is contained in:
zarazaex69
2026-04-20 20:18:23 +03:00
parent 033bdcdac5
commit ea249091c4
6 changed files with 39 additions and 5 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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
}

View File

@@ -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,

View File

@@ -109,6 +109,7 @@ func Start(roomID, keyHex string, socksPort int, socksUser, socksPass string) er
err := client.RunWithReady(
ctx,
"direct",
"datachannel",
"telemost",
roomURL,