Browse Source

refactor(client): extract importable core

Move the client implementation into pkg/clientcore so mobile wrappers can call Run(ctx, Config) directly while the CLI remains a thin wrapper.

Adapted from ios-clientcore-refactor on top of the current wrap implementation.
pull/162/head
Moroka8 3 weeks ago
parent
commit
9d46727be1
  1. 3198
      client/main.go
  2. 2
      pkg/clientcore/captcha_v2.go
  3. 2
      pkg/clientcore/captcha_v2_slider.go
  4. 65
      pkg/clientcore/cli.go
  5. 2
      pkg/clientcore/ish_listener_linux_386.go
  6. 2
      pkg/clientcore/ish_listener_other.go
  7. 3189
      pkg/clientcore/main.go
  8. 2
      pkg/clientcore/main_test.go
  9. 2
      pkg/clientcore/manual_captcha.go
  10. 2
      pkg/clientcore/manual_captcha_test.go
  11. 2
      pkg/clientcore/namegen.go
  12. 2
      pkg/clientcore/profiles.go
  13. 2
      pkg/clientcore/slider_captcha.go
  14. 2
      pkg/clientcore/slider_captcha_test.go
  15. 2
      pkg/clientcore/wrap.go
  16. 2
      pkg/clientcore/wrap_test.go

3198
client/main.go

File diff suppressed because it is too large

2
client/captcha_v2.go → pkg/clientcore/captcha_v2.go

@ -1,4 +1,4 @@
package main
package clientcore
import (
"bytes"

2
client/captcha_v2_slider.go → pkg/clientcore/captcha_v2_slider.go

@ -1,4 +1,4 @@
package main
package clientcore
import (
"bytes"

65
pkg/clientcore/cli.go

@ -0,0 +1,65 @@
//go:build !ios
package clientcore
import (
"context"
"flag"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
)
func RunCLI() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT)
go func() {
<-signalChan
log.Printf("Terminating...\n")
cancel()
select {
case <-signalChan:
case <-time.After(5 * time.Second):
}
log.Fatalf("Exit...\n")
}()
cfg := Config{}
genWrapKey := flag.Bool("gen-wrap-key", false, "print a fresh 64-character hex key for -wrap-key and exit")
flag.StringVar(&cfg.TURNHost, "turn", "", "override TURN server ip")
flag.StringVar(&cfg.TURNPort, "port", "", "override TURN port")
flag.StringVar(&cfg.Listen, "listen", "127.0.0.1:9000", "listen on ip:port")
flag.StringVar(&cfg.VKLink, "vk-link", "", "VK calls invite link \"https://vk.com/call/join/...\"")
flag.StringVar(&cfg.YandexLink, "yandex-link", "", "Yandex telemost invite link \"https://telemost.yandex.ru/j/...\"")
flag.StringVar(&cfg.PeerAddr, "peer", "", "peer server address (host:port)")
flag.IntVar(&cfg.NumStreams, "n", 0, "connections to TURN (default 10 for VK, 1 for Yandex)")
flag.BoolVar(&cfg.UseUDP, "udp", false, "connect to TURN with UDP")
flag.BoolVar(&cfg.NoDTLS, "no-dtls", false, "connect without obfuscation. DO NOT USE")
flag.BoolVar(&cfg.VLESSMode, "vless", false, "VLESS mode: forward TCP connections (for VLESS) instead of UDP packets")
flag.BoolVar(&cfg.VLESSBond, "vless-bond", false, "bond one VLESS TCP connection across all active smux sessions")
flag.BoolVar(&cfg.WrapMode, "wrap", false, "WRAP mode: SRTP-like AEAD obfuscation for DTLS packets before they reach TURN ChannelData")
flag.StringVar(&cfg.WrapKeyHex, "wrap-key", "", "32-byte hex-encoded shared key for -wrap (64 hex chars)")
flag.IntVar(&cfg.StreamsPerCred, "streams-per-cred", streamsPerCache, "number of TURN streams sharing one VK credential cache")
flag.BoolVar(&cfg.Debug, "debug", false, "enable debug logging")
flag.BoolVar(&cfg.ManualCaptcha, "manual-captcha", false, "skip auto captcha solving, use manual mode immediately")
flag.StringVar(&cfg.CaptchaSolver, "captcha-solver", "v2", "auto captcha solver implementation: v1|v2")
flag.Parse()
if *genWrapKey {
key, err := genWrapKeyHex()
if err != nil {
log.Panicf("%v", err)
}
fmt.Println(key)
return
}
if err := Run(ctx, cfg); err != nil {
log.Panicf("%v", err)
}
}

2
client/ish_listener_linux_386.go → pkg/clientcore/ish_listener_linux_386.go

@ -1,6 +1,6 @@
//go:build linux && 386
package main
package clientcore
import (
"io"

2
client/ish_listener_other.go → pkg/clientcore/ish_listener_other.go

@ -1,6 +1,6 @@
//go:build !(linux && 386)
package main
package clientcore
import "net"

3189
pkg/clientcore/main.go

File diff suppressed because it is too large

2
client/main_test.go → pkg/clientcore/main_test.go

@ -1,4 +1,4 @@
package main
package clientcore
import "testing"

2
client/manual_captcha.go → pkg/clientcore/manual_captcha.go

@ -1,4 +1,4 @@
package main
package clientcore
import (
"bytes"

2
client/manual_captcha_test.go → pkg/clientcore/manual_captcha_test.go

@ -1,4 +1,4 @@
package main
package clientcore
import (
"net/url"

2
client/namegen.go → pkg/clientcore/namegen.go

@ -1,4 +1,4 @@
package main
package clientcore
import (
"fmt"

2
client/profiles.go → pkg/clientcore/profiles.go

@ -1,4 +1,4 @@
package main
package clientcore
import (
"encoding/json"

2
client/slider_captcha.go → pkg/clientcore/slider_captcha.go

@ -1,4 +1,4 @@
package main
package clientcore
import (
"bytes"

2
client/slider_captcha_test.go → pkg/clientcore/slider_captcha_test.go

@ -1,4 +1,4 @@
package main
package clientcore
import (
"bytes"

2
client/wrap.go → pkg/clientcore/wrap.go

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
package main
package clientcore
import (
"crypto/cipher"

2
client/wrap_test.go → pkg/clientcore/wrap_test.go

@ -1,4 +1,4 @@
package main
package clientcore
import (
"bytes"
Loading…
Cancel
Save