mirror of
https://github.com/sigcn/pg.git
synced 2025-09-27 10:42:08 +08:00
disco: add ControllerManager
This commit is contained in:
12
disco/control.go
Normal file
12
disco/control.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package disco
|
||||||
|
|
||||||
|
type Controller interface {
|
||||||
|
Handle(b []byte)
|
||||||
|
Name() string
|
||||||
|
Type() uint8
|
||||||
|
}
|
||||||
|
|
||||||
|
type ControllerManager interface {
|
||||||
|
Register(Controller)
|
||||||
|
Unregister(Controller)
|
||||||
|
}
|
@@ -75,6 +75,7 @@ func (d *Disco) magic() []byte {
|
|||||||
|
|
||||||
type PeerStore interface {
|
type PeerStore interface {
|
||||||
FindPeer(peer.ID) (*PeerContext, bool)
|
FindPeer(peer.ID) (*PeerContext, bool)
|
||||||
|
Peers() []PeerState
|
||||||
}
|
}
|
||||||
|
|
||||||
type PeerContext struct {
|
type PeerContext struct {
|
||||||
|
57
disco/ws.go
57
disco/ws.go
@@ -22,24 +22,27 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ io.ReadWriter = (*WSConn)(nil)
|
_ io.ReadWriter = (*WSConn)(nil)
|
||||||
|
_ ControllerManager = (*WSConn)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
type WSConn struct {
|
type WSConn struct {
|
||||||
*websocket.Conn
|
*websocket.Conn
|
||||||
server *peer.Peermap
|
server *peer.Peermap
|
||||||
connectedServer string
|
connectedServer string
|
||||||
peerID peer.ID
|
peerID peer.ID
|
||||||
metadata url.Values
|
metadata url.Values
|
||||||
closedSig chan int
|
closedSig chan int
|
||||||
datagrams chan *Datagram
|
datagrams chan *Datagram
|
||||||
peers chan *PeerFindEvent
|
peers chan *PeerFindEvent
|
||||||
peersUDPAddrs chan *PeerUDPAddrEvent
|
peersUDPAddrs chan *PeerUDPAddrEvent
|
||||||
nonce byte
|
nonce byte
|
||||||
stuns []string
|
stuns []string
|
||||||
activeTime atomic.Int64
|
activeTime atomic.Int64
|
||||||
writeMutex sync.Mutex
|
writeMutex sync.Mutex
|
||||||
rateLimiter *rate.Limiter
|
rateLimiter *rate.Limiter
|
||||||
|
controllersMutex sync.RWMutex
|
||||||
|
controllers map[uint8][]Controller
|
||||||
|
|
||||||
connData chan []byte
|
connData chan []byte
|
||||||
connBuf []byte
|
connBuf []byte
|
||||||
@@ -135,6 +138,24 @@ func (c *WSConn) ServerURL() string {
|
|||||||
return c.connectedServer
|
return c.connectedServer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *WSConn) Register(ctr Controller) {
|
||||||
|
c.controllersMutex.Lock()
|
||||||
|
defer c.controllersMutex.Unlock()
|
||||||
|
c.controllers[ctr.Type()] = append(c.controllers[ctr.Type()], ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *WSConn) Unregister(ctr Controller) {
|
||||||
|
c.controllersMutex.Lock()
|
||||||
|
defer c.controllersMutex.Unlock()
|
||||||
|
var filterd []Controller
|
||||||
|
for _, ct := range c.controllers[ctr.Type()] {
|
||||||
|
if ct.Name() != ctr.Name() {
|
||||||
|
filterd = append(filterd, ct)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.controllers[ctr.Type()] = filterd
|
||||||
|
}
|
||||||
|
|
||||||
func (c *WSConn) dial(ctx context.Context, server string) error {
|
func (c *WSConn) dial(ctx context.Context, server string) error {
|
||||||
networkSecret, err := c.server.SecretStore().NetworkSecret()
|
networkSecret, err := c.server.SecretStore().NetworkSecret()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -343,6 +364,13 @@ func (c *WSConn) handleEvents(b []byte) {
|
|||||||
go c.updateNetworkSecret(secret)
|
go c.updateNetworkSecret(secret)
|
||||||
case peer.CONTROL_CONN:
|
case peer.CONTROL_CONN:
|
||||||
c.connData <- b[1:]
|
c.connData <- b[1:]
|
||||||
|
default:
|
||||||
|
c.controllersMutex.RLock()
|
||||||
|
ctrs := c.controllers[b[0]]
|
||||||
|
c.controllersMutex.RUnlock()
|
||||||
|
for _, ctr := range ctrs {
|
||||||
|
ctr.Handle(b)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,6 +412,7 @@ func DialPeermap(ctx context.Context, server *peer.Peermap, peerID peer.ID, meta
|
|||||||
peers: make(chan *PeerFindEvent, 20),
|
peers: make(chan *PeerFindEvent, 20),
|
||||||
peersUDPAddrs: make(chan *PeerUDPAddrEvent, 20),
|
peersUDPAddrs: make(chan *PeerUDPAddrEvent, 20),
|
||||||
connData: make(chan []byte, 128),
|
connData: make(chan []byte, 128),
|
||||||
|
controllers: make(map[uint8][]Controller),
|
||||||
}
|
}
|
||||||
if err := wsConn.dial(ctx, ""); err != nil {
|
if err := wsConn.dial(ctx, ""); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
16
p2p/conn.go
16
p2p/conn.go
@@ -185,11 +185,6 @@ func (c *PeerPacketConn) TryLeadDisco(peerID peer.ID) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// UDPConn return the os udp socket
|
|
||||||
func (c *PeerPacketConn) UDPConn() net.PacketConn {
|
|
||||||
return c.udpConn
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServerStream is the connection stream to the peermap server
|
// ServerStream is the connection stream to the peermap server
|
||||||
func (c *PeerPacketConn) ServerStream() io.ReadWriter {
|
func (c *PeerPacketConn) ServerStream() io.ReadWriter {
|
||||||
return c.wsConn
|
return c.wsConn
|
||||||
@@ -200,9 +195,14 @@ func (c *PeerPacketConn) ServerURL() string {
|
|||||||
return c.wsConn.ServerURL()
|
return c.wsConn.ServerURL()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Peers return the found peers
|
// ControllerManager makes changes attempting to move the current state towards the desired state
|
||||||
func (c *PeerPacketConn) Peers() []disco.PeerState {
|
func (c *PeerPacketConn) ControllerManager() disco.ControllerManager {
|
||||||
return c.udpConn.Peers()
|
return c.wsConn
|
||||||
|
}
|
||||||
|
|
||||||
|
// PeerStore stores the found peers
|
||||||
|
func (c *PeerPacketConn) PeerStore() disco.PeerStore {
|
||||||
|
return c.udpConn
|
||||||
}
|
}
|
||||||
|
|
||||||
// runControlEventLoop events control loop
|
// runControlEventLoop events control loop
|
||||||
|
Reference in New Issue
Block a user