mirror of
https://github.com/openlibrecommunity/olcrtc.git
synced 2026-06-02 18:39:46 +00:00
refactor: extract session runtime wiring
This commit is contained in:
@@ -3,7 +3,6 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
@@ -12,16 +11,9 @@ import (
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/openlibrecommunity/olcrtc/internal/client"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/app/session"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/logger"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/names"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/provider"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/provider/jazz"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/provider/telemost"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/provider/wbstream"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/server"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/transport"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/transport/datachannel"
|
||||
)
|
||||
|
||||
type config struct {
|
||||
@@ -39,14 +31,6 @@ type config struct {
|
||||
socksProxyPort int
|
||||
}
|
||||
|
||||
var (
|
||||
errRoomIDRequired = errors.New("room ID required")
|
||||
errModeRequired = errors.New("specify -mode srv or -mode cnc")
|
||||
errProviderRequired = errors.New("provider required (use -provider telemost or -provider jazz)")
|
||||
errUnsupportedProvider = errors.New("unsupported provider")
|
||||
errUnsupportedTransport = errors.New("unsupported transport")
|
||||
)
|
||||
|
||||
func main() {
|
||||
if err := run(); err != nil {
|
||||
logger.Error(err)
|
||||
@@ -55,15 +39,12 @@ func main() {
|
||||
}
|
||||
|
||||
func run() error {
|
||||
provider.Register("jazz", jazz.New)
|
||||
provider.Register("telemost", telemost.New)
|
||||
provider.Register("wb_stream", wbstream.New)
|
||||
transport.Register("datachannel", datachannel.New)
|
||||
session.RegisterDefaults()
|
||||
|
||||
cfg := parseFlags()
|
||||
configureLogging(cfg.debug)
|
||||
|
||||
if err := validateConfig(cfg); err != nil {
|
||||
if err := session.Validate(toSessionConfig(cfg)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -83,7 +64,9 @@ func run() error {
|
||||
signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM)
|
||||
|
||||
errCh := make(chan error, 1)
|
||||
go runMode(ctx, cfg, errCh)
|
||||
go func() {
|
||||
errCh <- session.Run(ctx, toSessionConfig(cfg))
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-sigCh:
|
||||
@@ -121,41 +104,6 @@ func configureLogging(debug bool) {
|
||||
}
|
||||
}
|
||||
|
||||
func validateConfig(cfg config) error {
|
||||
availableProviders := provider.Available()
|
||||
validProvider := false
|
||||
for _, p := range availableProviders {
|
||||
if cfg.provider == p {
|
||||
validProvider = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
availableTransports := transport.Available()
|
||||
validTransport := false
|
||||
for _, t := range availableTransports {
|
||||
if cfg.transport == t {
|
||||
validTransport = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
switch {
|
||||
case cfg.provider == "":
|
||||
return errProviderRequired
|
||||
case !validProvider:
|
||||
return fmt.Errorf("%w: %s (available: %v)", errUnsupportedProvider, cfg.provider, availableProviders)
|
||||
case !validTransport:
|
||||
return fmt.Errorf("%w: %s (available: %v)", errUnsupportedTransport, cfg.transport, availableTransports)
|
||||
case cfg.roomID == "" && cfg.provider != "jazz":
|
||||
return errRoomIDRequired
|
||||
case cfg.mode != "srv" && cfg.mode != "cnc":
|
||||
return errModeRequired
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func resolveDataDir(dataDir string) (string, error) {
|
||||
if filepath.IsAbs(dataDir) {
|
||||
return dataDir, nil
|
||||
@@ -179,49 +127,18 @@ func loadNames(dataDir string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func runMode(ctx context.Context, cfg config, errCh chan<- error) {
|
||||
roomURL := buildRoomURL(cfg.provider, cfg.roomID)
|
||||
|
||||
switch cfg.mode {
|
||||
case "srv":
|
||||
errCh <- server.Run(
|
||||
ctx,
|
||||
cfg.transport,
|
||||
cfg.provider,
|
||||
roomURL,
|
||||
cfg.keyHex,
|
||||
cfg.dnsServer,
|
||||
cfg.socksProxyAddr,
|
||||
cfg.socksProxyPort,
|
||||
)
|
||||
case "cnc":
|
||||
errCh <- client.Run(
|
||||
ctx,
|
||||
cfg.transport,
|
||||
cfg.provider,
|
||||
roomURL,
|
||||
cfg.keyHex,
|
||||
fmt.Sprintf("%s:%d", cfg.socksHost, cfg.socksPort),
|
||||
cfg.dnsServer,
|
||||
"",
|
||||
"",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func buildRoomURL(providerName, roomID string) string {
|
||||
switch providerName {
|
||||
case "telemost":
|
||||
return "https://telemost.yandex.ru/j/" + roomID
|
||||
case "jazz":
|
||||
if roomID == "" {
|
||||
return "any"
|
||||
}
|
||||
return roomID
|
||||
case "wb_stream":
|
||||
return roomID
|
||||
default:
|
||||
return roomID
|
||||
func toSessionConfig(cfg config) session.Config {
|
||||
return session.Config{
|
||||
Mode: cfg.mode,
|
||||
Transport: cfg.transport,
|
||||
Provider: cfg.provider,
|
||||
RoomID: cfg.roomID,
|
||||
KeyHex: cfg.keyHex,
|
||||
SOCKSHost: cfg.socksHost,
|
||||
SOCKSPort: cfg.socksPort,
|
||||
DNSServer: cfg.dnsServer,
|
||||
SOCKSProxyAddr: cfg.socksProxyAddr,
|
||||
SOCKSProxyPort: cfg.socksProxyPort,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
138
internal/app/session/session.go
Normal file
138
internal/app/session/session.go
Normal file
@@ -0,0 +1,138 @@
|
||||
// Package session wires runtime configuration to application mode entrypoints.
|
||||
package session
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/openlibrecommunity/olcrtc/internal/client"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/provider"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/provider/jazz"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/provider/telemost"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/provider/wbstream"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/server"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/transport"
|
||||
"github.com/openlibrecommunity/olcrtc/internal/transport/datachannel"
|
||||
)
|
||||
|
||||
var (
|
||||
// ErrRoomIDRequired indicates that a room id is required for the selected provider.
|
||||
ErrRoomIDRequired = errors.New("room ID required")
|
||||
// ErrModeRequired indicates that mode is not one of the supported values.
|
||||
ErrModeRequired = errors.New("specify -mode srv or -mode cnc")
|
||||
// ErrProviderRequired indicates that no provider was selected.
|
||||
ErrProviderRequired = errors.New("provider required (use -provider telemost or -provider jazz)")
|
||||
// ErrUnsupportedProvider indicates that provider is not registered.
|
||||
ErrUnsupportedProvider = errors.New("unsupported provider")
|
||||
// ErrUnsupportedTransport indicates that transport is not registered.
|
||||
ErrUnsupportedTransport = errors.New("unsupported transport")
|
||||
)
|
||||
|
||||
// Config holds runtime session settings.
|
||||
type Config struct {
|
||||
Mode string
|
||||
Transport string
|
||||
Provider string
|
||||
RoomID string
|
||||
KeyHex string
|
||||
SOCKSHost string
|
||||
SOCKSPort int
|
||||
DNSServer string
|
||||
SOCKSProxyAddr string
|
||||
SOCKSProxyPort int
|
||||
}
|
||||
|
||||
// RegisterDefaults registers built-in providers and transports.
|
||||
func RegisterDefaults() {
|
||||
provider.Register("jazz", jazz.New)
|
||||
provider.Register("telemost", telemost.New)
|
||||
provider.Register("wb_stream", wbstream.New)
|
||||
|
||||
transport.Register("datachannel", datachannel.New)
|
||||
}
|
||||
|
||||
// Validate verifies that the runtime config refers to registered components.
|
||||
func Validate(cfg Config) error {
|
||||
availableProviders := provider.Available()
|
||||
validProvider := false
|
||||
for _, p := range availableProviders {
|
||||
if cfg.Provider == p {
|
||||
validProvider = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
availableTransports := transport.Available()
|
||||
validTransport := false
|
||||
for _, t := range availableTransports {
|
||||
if cfg.Transport == t {
|
||||
validTransport = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
switch {
|
||||
case cfg.Provider == "":
|
||||
return ErrProviderRequired
|
||||
case !validProvider:
|
||||
return fmt.Errorf("%w: %s (available: %v)", ErrUnsupportedProvider, cfg.Provider, availableProviders)
|
||||
case !validTransport:
|
||||
return fmt.Errorf("%w: %s (available: %v)", ErrUnsupportedTransport, cfg.Transport, availableTransports)
|
||||
case cfg.RoomID == "" && cfg.Provider != "jazz":
|
||||
return ErrRoomIDRequired
|
||||
case cfg.Mode != "srv" && cfg.Mode != "cnc":
|
||||
return ErrModeRequired
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// Run starts the configured mode.
|
||||
func Run(ctx context.Context, cfg Config) error {
|
||||
roomURL := buildRoomURL(cfg.Provider, cfg.RoomID)
|
||||
|
||||
switch cfg.Mode {
|
||||
case "srv":
|
||||
return server.Run(
|
||||
ctx,
|
||||
cfg.Transport,
|
||||
cfg.Provider,
|
||||
roomURL,
|
||||
cfg.KeyHex,
|
||||
cfg.DNSServer,
|
||||
cfg.SOCKSProxyAddr,
|
||||
cfg.SOCKSProxyPort,
|
||||
)
|
||||
case "cnc":
|
||||
return client.Run(
|
||||
ctx,
|
||||
cfg.Transport,
|
||||
cfg.Provider,
|
||||
roomURL,
|
||||
cfg.KeyHex,
|
||||
fmt.Sprintf("%s:%d", cfg.SOCKSHost, cfg.SOCKSPort),
|
||||
cfg.DNSServer,
|
||||
"",
|
||||
"",
|
||||
)
|
||||
default:
|
||||
return ErrModeRequired
|
||||
}
|
||||
}
|
||||
|
||||
func buildRoomURL(providerName, roomID string) string {
|
||||
switch providerName {
|
||||
case "telemost":
|
||||
return "https://telemost.yandex.ru/j/" + roomID
|
||||
case "jazz":
|
||||
if roomID == "" {
|
||||
return "any"
|
||||
}
|
||||
return roomID
|
||||
case "wb_stream":
|
||||
return roomID
|
||||
default:
|
||||
return roomID
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user