mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-08-31 14:54:01 +03:00
Create internal DC package
This commit is contained in:
+26
-13
@@ -10,11 +10,11 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/9seconds/mtg/v2/essentials"
|
||||
"github.com/9seconds/mtg/v2/mtglib/internal/dc"
|
||||
"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
|
||||
"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
|
||||
"github.com/9seconds/mtg/v2/mtglib/internal/obfuscated2"
|
||||
"github.com/9seconds/mtg/v2/mtglib/internal/relay"
|
||||
"github.com/9seconds/mtg/v2/mtglib/internal/telegram"
|
||||
"github.com/panjf2000/ants/v2"
|
||||
)
|
||||
|
||||
@@ -28,7 +28,7 @@ type Proxy struct {
|
||||
tolerateTimeSkewness time.Duration
|
||||
domainFrontingPort int
|
||||
workerPool *ants.PoolWithFunc
|
||||
telegram *telegram.Telegram
|
||||
telegram *dc.Telegram
|
||||
|
||||
secret Secret
|
||||
network Network
|
||||
@@ -144,7 +144,6 @@ func (p *Proxy) Shutdown() {
|
||||
p.ctxCancel()
|
||||
p.streamWaitGroup.Wait()
|
||||
p.workerPool.Release()
|
||||
p.telegram.Shutdown()
|
||||
|
||||
p.allowlist.Shutdown()
|
||||
p.blocklist.Shutdown()
|
||||
@@ -220,18 +219,26 @@ func (p *Proxy) doObfuscated2Handshake(ctx *streamContext) error {
|
||||
}
|
||||
|
||||
func (p *Proxy) doTelegramCall(ctx *streamContext) error {
|
||||
dc := ctx.dc
|
||||
|
||||
if p.allowFallbackOnUnknownDC && !p.telegram.IsKnownDC(dc) {
|
||||
dc = p.telegram.GetFallbackDC()
|
||||
ctx.logger = ctx.logger.BindInt("fallback_dc", dc)
|
||||
dcid := ctx.dc
|
||||
|
||||
addresses := p.telegram.GetAddresses(dcid)
|
||||
if len(addresses) == 0 && p.allowFallbackOnUnknownDC {
|
||||
ctx.logger = ctx.logger.BindInt("fallback_dc", dc.DefaultDC)
|
||||
ctx.logger.Warning("unknown DC, fallbacks")
|
||||
addresses = p.telegram.GetAddresses(dc.DefaultDC)
|
||||
}
|
||||
|
||||
conn, err := p.telegram.Dial(ctx, dc)
|
||||
var conn essentials.Conn
|
||||
var err error
|
||||
|
||||
for _, addr := range addresses {
|
||||
conn, err = p.network.Dial(addr.Network, addr.Address)
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return fmt.Errorf("cannot dial to Telegram: %w", err)
|
||||
return fmt.Errorf("no addresses to call: %w", err)
|
||||
}
|
||||
|
||||
encryptor, decryptor, err := obfuscated2.ServerHandshake(conn)
|
||||
@@ -293,9 +300,15 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
|
||||
return nil, fmt.Errorf("invalid settings: %w", err)
|
||||
}
|
||||
|
||||
tg, err := telegram.New(opts.Network, opts.getPreferIP())
|
||||
logger := opts.getLogger("proxy")
|
||||
|
||||
tg, err := dc.New(
|
||||
logger.Named("telegram"),
|
||||
opts.getPreferIP(),
|
||||
map[int][]string{},
|
||||
) // TODO: propagate value
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot build telegram dialer: %w", err)
|
||||
return nil, fmt.Errorf("cannot build telegram dc fetcher: %w", err)
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
@@ -315,7 +328,7 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
|
||||
telegram: tg,
|
||||
}
|
||||
|
||||
go tg.Run(proxy.logger.Named("telegram"), 0)
|
||||
go tg.Run(ctx, 0) // TODO: propagate value
|
||||
|
||||
pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),
|
||||
func(arg interface{}) {
|
||||
|
||||
Reference in New Issue
Block a user