Files
Meshray-Manager/pkg/contract/contract.go
T
zkcoi 59e3059246 rebuild: split core into separate repo; move wg-go integration to internal/ctr/corebind
- go.mod: require git.zkcoi.com/zkcoi/meshray/core, replace => ../Meshray
- internal/ctr/corebind: EnhancedBind + registry + adapter (wg-go integration isolated)
- cmd/mr-wg migrated from old core/cmd/meshray-core
- core/ removed; CHANGELOG updated; fix checkdb vet warning
2026-07-15 16:08:13 +08:00

187 lines
5.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Package contract 定义 Meshray 开源管理器与闭源 meshray-core 增强层之间的契约。
//
// 本包为开源叶子模块:不依赖管理器(meshray)也不依赖增强层(meshray-core),
// 二者均 import 本包,从而避免 module 级循环依赖。
//
// 设计目标(来自架构决策:多仓解耦 + 编译期注入):
// - 管理器默认构建不 import meshray-core,因此可独立编译、以标准 WireGuard 直连运行;
// - 增强构建(go build -tags meshray_core)空白导入 meshray-core,触发其 init() 把
// 自定义 conn.Bind 工厂与 EngineProvider 注册到本包的全局注册表;
// - 无 meshray-core 时,GetBindFactory(false) 返回 wireguard-go 默认 Bind(原生直连),
// NewEngineController 返回 ErrCoreNotAvailable(增强模式优雅降级)。
package contract
import (
"errors"
"go.uber.org/zap"
"golang.zx2c4.com/wireguard/conn"
)
// ===== 候选地址与传输层 =====
// Candidate 对端候选地址(由信令层经 meshray-core 转发下发)
type Candidate struct {
Addr string `json:"addr"` // 候选地址(ip:port
Type string `json:"type"` // 候选类型:host/srflx/relay
Priority int `json:"priority"` // 优先级
Protocol string `json:"protocol"` // 协议:udp/tcp
}
// Layer 传输层类型(9 层策略),数值与 meshray-core 内部 connect.Layer 对齐
type Layer int
const (
LayerDirectUDP Layer = iota
LayerFakeTCP
LayerRealTCP
LayerTURNUDP
LayerTURNQUIC
LayerTURNTCP
LayerTURNTLS
LayerWebRTC
LayerWS
LayerCount
)
// String 实现 Stringer
func (l Layer) String() string {
switch l {
case LayerDirectUDP:
return "Direct-UDP"
case LayerFakeTCP:
return "Direct-FakeTCP"
case LayerRealTCP:
return "Direct-RealTCP"
case LayerTURNUDP:
return "TURN-UDP"
case LayerTURNQUIC:
return "TURN-QUIC"
case LayerTURNTCP:
return "TURN-TCP"
case LayerTURNTLS:
return "TURN-TLS"
case LayerWebRTC:
return "WebRTC"
case LayerWS:
return "WS/WSS"
default:
return "Unknown"
}
}
// DefaultLayerOrder 默认优先级顺序(从最优到兜底)
var DefaultLayerOrder = []Layer{
LayerDirectUDP,
LayerFakeTCP,
LayerRealTCP,
LayerTURNUDP,
LayerTURNQUIC,
LayerTURNTCP,
LayerTURNTLS,
LayerWebRTC,
LayerWS,
}
// ICEConfig ICE 配置(STUN/TURN 服务器),用于 WebRTC 等传输层
type ICEConfig struct {
STUNServers []string
TURNServers []string
}
// ===== 状态 =====
// PeerStatus 单 Peer 状态
type PeerStatus struct {
PeerKey string `json:"peer_key"`
Connected bool `json:"connected"`
Layer string `json:"layer,omitempty"`
}
// EngineStatus 增强引擎状态
type EngineStatus struct {
PeerCount int `json:"peer_count"`
Peers map[string]*PeerStatus `json:"peers"`
ActiveConnections int64 `json:"active_connections"`
TotalConnections int64 `json:"total_connections"`
BytesSent uint64 `json:"bytes_sent"`
BytesReceived uint64 `json:"bytes_received"`
StrategyFallbacks int64 `json:"strategy_fallbacks"`
LastSwitchTime int64 `json:"last_switch_time"`
}
// ===== 增强引擎控制面契约 =====
//
// EngineController 由 meshray-core 实现,供管理器(开源)在 enhanced 模式调用。
type EngineController interface {
Start() error
Stop() error
// NotifyPeerCandidates 由信令层调用:注入对端候选地址并触发 P2P 建连
NotifyPeerCandidates(peerKey string, candidates []Candidate) error
// SetICEConfig 更新 ICE/STUN/TURN 配置
SetICEConfig(cfg ICEConfig) error
// SetLayerOrder 设置传输层优先级顺序(策略核心配置)
SetLayerOrder(order []Layer) error
// GetStatus 查询引擎状态
GetStatus() (*EngineStatus, error)
}
// EngineProvider 创建 EngineController 的工厂(由 meshray-core 注册)
type EngineProvider func(networkID string, logger *zap.Logger) (EngineController, error)
var (
engineProvider EngineProvider
errCoreNotAvail = errors.New("meshray-core 未启用:增强模式不可用(仅原生直连可用)")
)
// RegisterEngineProvider 由 meshray-core 在 init 中注册
func RegisterEngineProvider(p EngineProvider) {
engineProvider = p
}
// EngineProviderRegistered 是否已注册增强引擎提供方
func EngineProviderRegistered() bool {
return engineProvider != nil
}
// NewEngineController 创建增强引擎;未注册 core 时返回 errCoreNotAvail
func NewEngineController(networkID string, logger *zap.Logger) (EngineController, error) {
if engineProvider == nil {
return nil, errCoreNotAvail
}
return engineProvider(networkID, logger)
}
// ===== WireGuard conn.Bind 工厂契约 =====
//
// BindFactory 创建接管 WG 收发的 conn.Bind。原生模式用 wireguard-go 默认 Bind
// 增强模式由 meshray-core 注册自定义 Bind(在 Send/Recv 中插入 9 层传输与打洞)。
type BindFactory func(listenPort int, networkID string, logger *zap.Logger) (conn.Bind, error)
var (
nativeBindFactory = func(listenPort int, networkID string, logger *zap.Logger) (conn.Bind, error) {
return conn.NewDefaultBind(), nil
}
enhancedBindFactory BindFactory
errBindNotEnhanced = errors.New("meshray-core 未启用:enhanced 模式无法创建自定义 Bind")
)
// RegisterEnhancedBindFactory 由 meshray-core 在 init 中注册
func RegisterEnhancedBindFactory(f BindFactory) {
enhancedBindFactory = f
}
// GetBindFactory 获取 Bind 工厂:
// - enhanced=true 且已注册 core → 返回 core 的自定义 Bind 工厂;
// - enhanced=true 但未注册 core → 返回 errBindNotEnhanced
// - enhanced=false → 返回 wireguard-go 默认 Bind(原生直连)。
func GetBindFactory(enhanced bool) (BindFactory, error) {
if enhanced {
if enhancedBindFactory == nil {
return nil, errBindNotEnhanced
}
return enhancedBindFactory, nil
}
return nativeBindFactory, nil
}