feat(provider): abstract provider interface and add jazz support

This commit is contained in:
zarazaex69
2026-04-14 01:10:57 +03:00
parent eca3fcad93
commit 6e6265799a
11 changed files with 933 additions and 38 deletions

View File

@@ -16,6 +16,9 @@ import (
"github.com/openlibrecommunity/olcrtc/internal/client"
"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/server"
)
@@ -34,9 +37,10 @@ type config struct {
}
var (
errUnsupportedProvider = errors.New("only telemost provider supported")
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")
)
func main() {
@@ -86,8 +90,8 @@ func parseFlags() config {
cfg := config{}
flag.StringVar(&cfg.mode, "mode", "", "Mode: srv or cnc")
flag.StringVar(&cfg.roomID, "id", "", "Telemost room ID")
flag.StringVar(&cfg.provider, "provider", "telemost", "Provider (telemost only)")
flag.StringVar(&cfg.roomID, "id", "", "Room ID")
flag.StringVar(&cfg.provider, "provider", "", "Provider: telemost or jazz (required)")
flag.IntVar(&cfg.socksPort, "socks-port", 1080, "SOCKS5 port (client only)")
flag.StringVar(&cfg.socksHost, "socks-host", "127.0.0.1", "SOCKS5 listen host (client only)")
flag.StringVar(&cfg.keyHex, "key", "", "Shared encryption key (hex)")
@@ -112,9 +116,20 @@ func configureLogging(debug bool) {
}
func validateConfig(cfg config) error {
available := provider.Available()
validProvider := false
for _, p := range available {
if cfg.provider == p {
validProvider = true
break
}
}
switch {
case cfg.provider != "telemost":
return errUnsupportedProvider
case cfg.provider == "":
return errProviderRequired
case !validProvider:
return fmt.Errorf("%w: %s (available: %v)", errUnsupportedProvider, cfg.provider, available)
case cfg.roomID == "":
return errRoomIDRequired
case cfg.mode != "srv" && cfg.mode != "cnc":
@@ -148,12 +163,13 @@ func loadNames(dataDir string) error {
}
func runMode(ctx context.Context, cfg config, errCh chan<- error) {
roomURL := "https://telemost.yandex.ru/j/" + cfg.roomID
roomURL := buildRoomURL(cfg.provider, cfg.roomID)
switch cfg.mode {
case "srv":
errCh <- server.Run(
ctx,
cfg.provider,
roomURL,
cfg.keyHex,
cfg.dnsServer,
@@ -163,6 +179,7 @@ func runMode(ctx context.Context, cfg config, errCh chan<- error) {
case "cnc":
errCh <- client.Run(
ctx,
cfg.provider,
roomURL,
cfg.keyHex,
cfg.socksPort,
@@ -173,6 +190,17 @@ func runMode(ctx context.Context, cfg config, errCh chan<- error) {
}
}
func buildRoomURL(providerName, roomID string) string {
switch providerName {
case "telemost":
return "https://telemost.yandex.ru/j/" + roomID
case "jazz":
return roomID
default:
return roomID
}
}
func waitForShutdown(errCh <-chan error) error {
done := make(chan error, 1)
go func() {