- internal/clientsdb: БД клиентов с hot-reload + length-prefixed ID wire
- internal/uri: parse/encode share-ссылок freeturn://
- internal/sub: загрузка и парсинг подписок (sub.md)
- client: флаги -auth, -client-id, -sub; позиционный URI; ID через crypto/rand
- server: подкоманда clients (add/remove/list), чтение ID под -clients-file
- запись/чтение ID учитывают DTLS record-orientation (буфер на запись целиком)
- docs: uri.md, sub.md; правки flags/deploy/quickstart
- снят UTF-8 BOM по всем исходникам
- bondserver: errors.Is для проверки smux.ErrGoAway (обёрнутые ошибки)
- bondserver: убрать лишнюю аллокацию в copyBackendToBond, зеркалит bondclient
- cmd/server: прерывать Accept-цикл при отмене ctx вместо warn-спама
- cmd/server: понизить лог выхода после таймаута с Error до Warn
Защищает от регрессии, где ключ map Registry откатывается с {Tenant, ConnID} к
голому ConnID. Один и тот же ConnID под двумя TenantID должен резолвиться в
разные serverConn.
Заменяет map[uint64]*serverConn на map[connKey]*serverConn, где connKey =
{auth.TenantID, uint64}. Предотвращает коллизии ConnID между tenant в будущих
multi-tenant развёртываниях. Все текущие вызовы передают auth.Anonymous, поэтому
поведение не изменено.
HandleStreamAfterMagic получает параметр tenant auth.TenantID; tcpfwdserver
передаёт auth.Anonymous, сохраняя single-tenant семантику. serverConn получает
поле tenantID под будущий per-tenant роутинг.
writeToNextLane теперь зовёт c.cancel() сразу, когда removeLane возвращает
left==0, вместо ожидания таймаута через 10ms sleep-loop. Убирает spin, когда
все lane пропали, а readLane уже отменил контекст.
Заменяет прямой log.Printf на logger.Errorf/Debugf в каждом proxy-пакете
(udprelay, tcpfwd, bondclient, bondserver, udpserver, tcpfwdserver). Вывод
остаётся совместимым (под капотом stdlib log), но теперь может быть глобально
перенаправлен сменой реализации Logger.
Тесты + lint проходят.
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 зелёные.