- go.mod require/replace git.zkcoi.com/zkcoi/meshray/core -> git.zkcoi.com/zkcoi/meshray
- .go imports meshray/core/{engine,connect} -> meshray/{engine,connect} (5 files)
- sync CHANGELOG + adapter.go comments
81 lines
2.9 KiB
Go
81 lines
2.9 KiB
Go
// Package corebind 的契约注册:向开源契约(meshray-contract)注册增强 Bind 工厂与引擎提供方。
|
||
package corebind
|
||
|
||
import (
|
||
"sync"
|
||
|
||
"git.zkcoi.com/zkcoi/meshray-contract"
|
||
"git.zkcoi.com/zkcoi/meshray/engine"
|
||
"go.uber.org/zap"
|
||
"golang.zx2c4.com/wireguard/conn"
|
||
)
|
||
|
||
// engines 维护 networkID -> Engine 单例映射。
|
||
// EnhancedBind(收发接管)与 engineController(控制面)均通过 networkID 关联同一个 Engine,
|
||
// 使信令下发的候选地址、ICE 配置、层顺序都能落到接管该组网收发的 Engine 上。
|
||
var (
|
||
enginesMu sync.Mutex
|
||
engines = make(map[string]*core.Engine)
|
||
)
|
||
|
||
// getOrCreateEngine 获取或创建指定组网的 Engine 单例(线程安全)
|
||
func getOrCreateEngine(networkID string, logger *zap.Logger) *core.Engine {
|
||
enginesMu.Lock()
|
||
defer enginesMu.Unlock()
|
||
if e, ok := engines[networkID]; ok {
|
||
return e
|
||
}
|
||
e := core.NewEngine(logger, core.NewMetrics())
|
||
engines[networkID] = e
|
||
return e
|
||
}
|
||
|
||
// engineController 适配 contract.EngineController,以 networkID 关联 Engine 单例,
|
||
// 供管理器在 enhanced 模式调用,无需直接依赖本包具体类型。
|
||
type engineController struct {
|
||
networkID string
|
||
engine *core.Engine
|
||
}
|
||
|
||
func (c *engineController) Start() error { return c.engine.Start() }
|
||
|
||
func (c *engineController) Stop() error { return c.engine.Stop() }
|
||
|
||
// NotifyPeerCandidates 由信令层调用:注入对端候选地址并触发 P2P 建连
|
||
func (c *engineController) NotifyPeerCandidates(peerKey string, candidates []contract.Candidate) error {
|
||
return c.engine.NotifyPeerInfo(peerKey, toCoreCandidates(candidates))
|
||
}
|
||
|
||
// SetICEConfig 更新 ICE/STUN/TURN 配置
|
||
func (c *engineController) SetICEConfig(cfg contract.ICEConfig) error {
|
||
return c.engine.SetICEConfig(toCoreICEConfig(cfg))
|
||
}
|
||
|
||
// SetLayerOrder 设置传输层优先级顺序(策略核心配置)
|
||
func (c *engineController) SetLayerOrder(order []contract.Layer) error {
|
||
c.engine.SetLayerOrder(toCoreLayerOrder(order))
|
||
return nil
|
||
}
|
||
|
||
// GetStatus 查询引擎状态
|
||
func (c *engineController) GetStatus() (*contract.EngineStatus, error) {
|
||
st, err := c.engine.GetStatus()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return toContractStatus(st), nil
|
||
}
|
||
|
||
// init 向开源契约注册表注册增强 Bind 工厂与引擎提供方。
|
||
// 由管理器侧 core_enable.go 在 -tags meshray_core 构建下空白导入本包触发,
|
||
// 此时管理器侧 contract.GetBindFactory(true) / NewEngineController 才能取到实现;
|
||
// 默认构建不引入本包,原生直连(默认 Bind)始终可用。
|
||
func init() {
|
||
contract.RegisterEnhancedBindFactory(func(listenPort int, networkID string, logger *zap.Logger) (conn.Bind, error) {
|
||
return NewEnhancedBind(listenPort, networkID, logger)
|
||
})
|
||
contract.RegisterEngineProvider(func(networkID string, logger *zap.Logger) (contract.EngineController, error) {
|
||
return &engineController{networkID: networkID, engine: getOrCreateEngine(networkID, logger)}, nil
|
||
})
|
||
}
|