Commit Graph

22 Commits

Author SHA1 Message Date
samosvalishe f54f59bff9 fix(bondserver): отмена при spin из-за потери lane
writeToNextLane теперь зовёт c.cancel() сразу, когда removeLane возвращает
left==0, вместо ожидания таймаута через 10ms sleep-loop. Убирает spin, когда
все lane пропали, а readLane уже отменил контекст.
2026-05-21 01:09:54 +03:00
samosvalishe 9090d5894a fix(udprelay): параллельный старт стримов
Все N стримов теперь стартуют конкурентно. okchan оставлен только как лог-сигнал
первого успешного handshake; стримы 2..N больше не ждут завершения
DTLS-handshake стрима 1.
2026-05-21 01:09:49 +03:00
samosvalishe ac695603b7 fix(bondclient): слать Hello с реальным числом lane после фильтрации
Открыть все кандидатные стримы сначала, затем писать Hello с len(opened), чтобы
bondserver.waitForInitialLanes не зависал на lane, которые никогда не
открывались (закрыты/ошибка). Также документирует, почему клиентский write-retry
не зацикливается как серверный: набор lane клиента фиксирован на время жизни
Handle.
2026-05-21 00:43:48 +03:00
samosvalishe 6588544368 fix(udprelay): инкремент ConnectedStreams до ResetErrors
Конкурентные вызыватели HandleAuthError могли видеть устаревшие счётчики ошибок,
очищенные до того, как стрим стал виден в connected-счётчике. Переупорядочено
так, что снимок stream-alive идёт первым.
2026-05-21 00:43:42 +03:00
samosvalishe 242862397a chore: переименовать модуль в github.com/samosvalishe/btp; обновить зависимости
- путь модуля: github.com/cacggghp/vk-turn-proxy → github.com/samosvalishe/btp
- директории cmd: cmd/vk-turn-{client,server} → cmd/{client,server}
- зависимости: pion/turn v5.0.4, kcp-go v5.6.72, smux v1.5.57, x/crypto v0.51,
  klauspost/{compress,cpuid,reedsolomon}, x/{net,sys,text,tools,mod,time}
- README, workflows, GLOSSARY обновлены под новые пути
2026-05-20 12:39:26 +03:00
samosvalishe 4a962d8264 refactor(bondframe): вынести Reorder; разделить между bondclient и bondserver 2026-05-20 11:55:35 +03:00
samosvalishe 7b4d6be1d8 refactor(netconn): вынести BiCopy; использовать в tcpfwd и tcpfwdserver 2026-05-20 11:54:00 +03:00
samosvalishe 483e45d68a refactor(kcptun): передавать Profile/FEC явно через config вместо process-wide env 2026-05-20 11:52:27 +03:00
samosvalishe 9459e94066 perf(bondserver): убрать аллокацию snapshotLanes на каждый retry записи 2026-05-20 11:49:50 +03:00
samosvalishe 2b24471553 refactor(tcpfwd): заменить busy-loop poll пула на Ready-канал; тихий accept-цикл при shutdown 2026-05-20 11:49:21 +03:00
samosvalishe 1459f39551 fix(udprelay): ctx-aware jitter-паузы; учёт listener в WaitGroup; всплытие ошибки записи DTLS 2026-05-20 11:48:44 +03:00
samosvalishe 9d7d754740 refactor(logging): унифицировать stdlib log.* в logx по client/cmd
internal/client/captcha, captcha/manual, dnsdial: добавить package-level Log +
SetLogger; убрать прямой обход -debug через stdlib log.Printf. cmd/{client,
server}/main.go: сначала строить logger, весь вывод через logger.{Info,Warn,
Error}f; оставлен один log.Fatalf только для сбоя разбора конфига до логгера.
dnsdial: log.Panicf → panic(fmt.Sprintf).

Исправлены уровни:
- vkauth/token.go: пути [FATAL] теперь Errorf; Auto/Manual captcha failed →
  Warnf; ignored-cleanup-error → Debugf.
- vkauth/client.go: HandleAuthError/cache invalidated → Warnf; throttle wait →
  Debugf; Failed-with-client_id → Warnf.
- udprelay: "Backing off 60s" + SetDeadline failed → Warnf.
- captcha: PoW/show_type/check status/debug_info → Debugf; endSession/close-body/
  script-drift → Warnf.

Префиксы нормализованы к [STREAM %d] [Pkg] msg / [Pkg] msg.
2026-05-20 11:26:21 +03:00
samosvalishe 52e7cb83e6 fix: утечки, уровни logx, обход логгера
- logx: добавить префиксы [DEBUG]/[INFO]/[WARN]/[ERROR]; уровни были
  неразличимы в выводе (всё шло через голый log.Printf).
- logx: добавить хелпер OrNop для nil-проверок на стороне конструктора.
- vkauth/{client,token}.go: заменить прямой log.Printf на c.log.Infof
  (97 мест обходили унифицированный логгер после прошлого рефакторинга).
- udprelay.oneTURN: буферизовать error chan (cap 1) + select на ctx.Done в
  TURNLoop — небуферизованный send блокировался навсегда, когда TURNLoop
  выходил по ctx до чтения, утекали горутина + TURN-стрим.

- udprelay: перенести write-цикл conn2->relay в wg.Go (был голый go func, мог
  пережить wg.Wait и читать из закрытого conn).
- udprelay.TURNLoop: заменить time.Sleep(2s) на select+ctx, чтобы shutdown не
  блокировался per-stream.
- udprelay.Run / tcpfwd.Run: возвращать error вместо log.Panicf при сбое listen;
  cmd/* теперь log.Fatalf на всплывшей ошибке.
- cmd/*: log.Panicf → log.Fatalf для CLI-ошибок (без stack trace на плохой флаг).
- kcptun.NewKCPOverDTLS: закрывать серверный kcp.Listener на error-путях после
  SetDeadline/AcceptKCP (утекал при любом сбое).
- doc пакета udprelay: переписать устаревшее утверждение "avoid importing
  vkauth" (файл импортирует vkauth ради sentinel-ошибок).
- udprelay: lifecycle-сообщения ("Established/Closed DTLS connection")
  Errorf → Infof; строка "relayed-address" под DebugEnabled использует Debugf.
- tcpfwd: lifecycle-сообщения ("connected/disconnected/waiting/listening")
  Errorf → Infof, "failed to wrap listener" → Warnf.
- tcpfwd.maintainSession doc: "fixed 2-3s backoff" было неверно (3s при сбое
  setup, 2s после disconnect).
- pool.go doc: "bond client (in main)" → internal/proxy/bondclient.
- srtpmimicry.Unwrap: doc предупреждает, что AEAD открывает in-place внутри
  wire, поэтому вызыватели должны считать wire потреблённым.
- комментарии-алиасы GetCredsFunc udprelay/tcpfwd: убрать фикцию "cmd/main
  wiring stability" (всё в internal/).

Build чисто, go vet чисто, все тесты проходят.
2026-05-19 22:24:21 +03:00
samosvalishe aff95e87d3 refactor: унифицировать логирование в internal/proxy/* через logx.Logger
Заменяет прямой log.Printf на logger.Errorf/Debugf в каждом proxy-пакете
(udprelay, tcpfwd, bondclient, bondserver, udpserver, tcpfwdserver). Вывод
остаётся совместимым (под капотом stdlib log), но теперь может быть глобально
перенаправлен сменой реализации Logger.

Тесты + lint проходят.
2026-05-19 21:57:33 +03:00
samosvalishe 51bda46446 refactor: симметрия, вынос серверных хендлеров
- internal/proxy/udpserver: handleUDPConnection вынесен из server-main
- internal/proxy/tcpfwdserver: handleVLESSConnection + prefixedConn + pipeConn
  вынесены из server-main
- cmd/vk-turn-server/main.go: 396 → 134 строк, глобалы убраны
- internal/proxy/udprelay: добавлен entrypoint Run() симметрично tcpfwd.Run;
  Pool → packetPool (unexported); listener+fan-in вынесены из client-main
- cmd/vk-turn-client/main.go: 262 → 130 строк, package-глобалы убраны
- dtlsdial.Dialer: кеш self-signed сертификата на Dialer (sync.Once) вместо
  регенерации на каждый handshake
- captcha.solveCaptchaPoW: переиспользование буфера (вместо 10M конкатенаций
  строк), ctx-проверка каждые 1024 итерации (было 4096)

Тесты + lint проходят.
2026-05-19 21:53:13 +03:00
samosvalishe ed6825976a fix: исправить баги, sentinel-ошибки, устаревшие доки
Баги:
- udprelay: errors.Is(DeadlineExceeded) вместо сравнения строк; короткий
  backoff в ветке lockout; обернуть DTLS-ошибку через %w
- bondserver.copyBondToBackend: лимит pending-map в 1024 (паритет с bondclient)
- srtpmimicry.RelayPacketConn: bufPool для горячего UDP-пути (паритет с listen.go)
- vkauth.token.go: ручной солвер под ctx.WithTimeout(ctx, ...) вместо Background
  — нет утечки горутины при shutdown

Гигиена:
- sentinel-ошибки vkauth как var = errors.New(...); вызыватели используют errors.Is
- убраны устаревшие комментарии этапов рефакторинга (Pion SPDX, "Package bond",
  internal/bond, удалённый файл заметок)
- .gitignore: *.exe, *.so

Тесты + lint проходят.
2026-05-19 21:47:48 +03:00
samosvalishe e212465f83 refactor(proxy): вынести общие хелперы (минимальный объём)
Исходный план просил proxy.Engine + интерфейс Handler, объединяющий udprelay и
tcpfwd. После разбора кода заявленные ~70% пересечения оказались ближе к ~30
строкам: udprelay (WG → DTLS-terminate → wrap → TURN) и tcpfwd (TCP → smux →
KCP → DTLS → wrap → TURN) наслаивают wrap/DTLS по-разному и имеют разные
жизненные циклы. Engine с двумя if-ветками просто загнал бы дублирование внутрь,
а не убрал.

Объём минимальный: новый пакет internal/proxy/common с тем, что реально
идентично:

  - тип GetCredsFunc (дублировался в обоих пакетах).
  - DialTURN(ctx, host, port, udp, peer, link, streamID, getCreds) — берёт creds
    и открывает turndial-стрим. Политика retry на auth-ошибке остаётся в udprelay.
  - NewClientWrap(key) — возвращает (nil, nil) при пустом/коротком ключе, иначе
    srtpmimicry.NewConn(key, false).

udprelay и tcpfwd теперь импортируют common.DialTURN / common.NewClientWrap.
Их локальные объявления GetCredsFunc становятся type alias на
common.GetCredsFunc, чтобы связка cmd/vk-turn-client компилировалась без churn.

bond-as-tcpfwd-option отменён вместе с интерфейсом Handler; bondclient остаётся
отдельным пакетом, подключённым через Deps.BondHandler.

Без изменений wire-формата, флагов CLI и поведения. go build / go vet /
go test / gofmt чисто.
2026-05-19 20:52:02 +03:00
samosvalishe 1fb869b3e1 refactor(layout): переименовать пакеты (split wire/transport/proxy)
internal/wrap → internal/wire/srtpmimicry; правки doc ("обфускация, не security").
internal/bond/{frame,client,server} → internal/wire/bondframe,
internal/proxy/bondclient, internal/proxy/bondserver.
internal/netadapt → internal/netconn.
internal/turnpipe → internal/transport/turndial; internal/dtlsdial →
internal/transport/dtlsdial.
tcputil → internal/transport/kcptun; selectedKCPProfile и selectedFEC теперь
кешируются через sync.Once (env читается один раз вместо per-connection).
internal/proxy/udp → internal/proxy/udprelay; internal/proxy/vless →
internal/proxy/tcpfwd. Флаг CLI -vless сохранён.
internal/ish → internal/client/ish; doc пакета расширен (iSH = Linux user-mode
эмулятор на iOS, только linux/386).

Чисто механическое переименование + обновление import-путей/идентификаторов.
Wire-формат, флаги CLI и поведение не изменены. go build + go test зелёные.
2026-05-19 20:42:46 +03:00
samosvalishe 7fd2d9594d refactor(logx): заменить Deps{Debug,Debugf} на интерфейс logx.Logger
Добавляет internal/logx с Debugf/Infof/Warnf/Errorf + DebugEnabled().
Протягивает logx.Logger через bondclient, bondserver, proxy/udp, proxy/vless,
vkauth. Убирает глобалы isDebug/debugf из обоих бинарей. Переносит
globalBondRegistry из package init в main (инициализация после
config.ParseServer), закрывая давний footgun "Debug=false на init".
2026-05-19 17:54:19 +03:00
samosvalishe 2167ba990b refactor(layout): переезд в cmd/, свернуть client/internal в internal/client
- server/main.go → cmd/vk-turn-server/main.go. Несёт остаточные правки сервера
  (drop параметра useBond, убрано поле startup-лога).
- client/internal/{browserprofile,captcha,dnsdial,namegen,vkauth} →
  internal/client/* (единая иерархия internal/; параллельное дерево
  client/internal/ убрано). Все Go import-пути обновлены.
- .github/workflows/{ci,release}.yml, Dockerfile, README.md — пути сборки
  переключены на ./cmd/vk-turn-client и ./cmd/vk-turn-server.
- README: убран устаревший пример "server -vless-bond" (флаг удалён ранее);
  добавлены рецепты сборки .so для Android arm64 + Linux arm64/amd64 под
  ручную упаковку для мобилок.
- internal/proxy/udp/udp.go, internal/config/config.go: обновлены устаревшие
  ссылки client/internal/* в doc-комментариях.
- notes/GLOSSARY.md (новый, ~20 терминов): фиксирует DTLS-как-обфускацию,
  wrap=AEAD-не-XOR, четыре значения "client", три значения "stream", пять
  ортогональных переключателей "mode", заметки по сборке libvkturn.so, iSH,
  хрупкость init globalBondRegistry и удаления флагов.

cmd/vk-turn-client/ намеренно оставлен вне этого коммита; сворачивается вместе
с извлечением ручной captcha в следующем коммите, т.к. переименование и правки
импортов manualcaptcha.* попадают в один файл.

Wire-форматы не тронуты. Поведение не изменено кроме уже закоммиченных
удалений CLI.
2026-05-19 17:20:26 +03:00
samosvalishe 09096568ff refactor: вынести VLESS-режим в internal/proxy/vless
Переносит runVLESSMode/maintainVLESSSession/createSmuxSession/pipe и sessionPool
в internal/proxy/vless. Клиентская половина bond (handleBondedTCP, copyTCPToBond,
copyBondToTCP, bondClientLane) остаётся в client/main.go до этапа 5.1 —
инжектится в vless через Deps.BondHandler.

sessionPool/pooledSession экспортированы как SessionPool/PooledSession, чтобы
половина bond работала со счётчиками lane (ID/Sess/Opened/Active/Closed/
ToSession/FromSession).

Также дедуплицирует iSH (linux/386) listener-shim в новый пакет internal/ish;
client/manual_captcha.go и internal/proxy/vless импортируют его через
ish.WrapListener.

client/main.go: 895 → 552 (-343). Wire-формат и CLI не изменены.
2026-05-19 11:21:48 +03:00
samosvalishe 82f231d5e0 refactor: вынести UDP proxy-цикл в internal/proxy/udp
Переносит oneDtlsConnection/oneTurnConnection и их retry-циклы из client/main.go
в internal/proxy/udp, за интерфейс AuthHandler, чтобы пакет оставался вне
client/internal/. UDPPacket/packetPool становятся udp.Packet/udp.Pool. Глобал
globalAppCancel убран в пользу Deps.AppCancel. turnParams пока остаётся в
client/main.go, т.к. vless ещё его использует; переедет с этапом 4.2.

client/main.go: 1195 → 895. Wire-формат и CLI не изменены.
2026-05-19 10:37:21 +03:00