Create internal DC package

This commit is contained in:
9seconds
2026-02-16 14:15:38 +01:00
parent 852ca713c8
commit 0a5a45b32d
13 changed files with 440 additions and 452 deletions
+26 -13
View File
@@ -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{}) {