@@ -22,24 +22,27 @@ import (
22
22
)
23
23
24
24
var (
25
- _ io.ReadWriter = (* WSConn )(nil )
25
+ _ io.ReadWriter = (* WSConn )(nil )
26
+ _ ControllerManager = (* WSConn )(nil )
26
27
)
27
28
28
29
type WSConn struct {
29
30
* websocket.Conn
30
- server * peer.Peermap
31
- connectedServer string
32
- peerID peer.ID
33
- metadata url.Values
34
- closedSig chan int
35
- datagrams chan * Datagram
36
- peers chan * PeerFindEvent
37
- peersUDPAddrs chan * PeerUDPAddrEvent
38
- nonce byte
39
- stuns []string
40
- activeTime atomic.Int64
41
- writeMutex sync.Mutex
42
- rateLimiter * rate.Limiter
31
+ server * peer.Peermap
32
+ connectedServer string
33
+ peerID peer.ID
34
+ metadata url.Values
35
+ closedSig chan int
36
+ datagrams chan * Datagram
37
+ peers chan * PeerFindEvent
38
+ peersUDPAddrs chan * PeerUDPAddrEvent
39
+ nonce byte
40
+ stuns []string
41
+ activeTime atomic.Int64
42
+ writeMutex sync.Mutex
43
+ rateLimiter * rate.Limiter
44
+ controllersMutex sync.RWMutex
45
+ controllers map [uint8 ][]Controller
43
46
44
47
connData chan []byte
45
48
connBuf []byte
@@ -135,6 +138,24 @@ func (c *WSConn) ServerURL() string {
135
138
return c .connectedServer
136
139
}
137
140
141
+ func (c * WSConn ) Register (ctr Controller ) {
142
+ c .controllersMutex .Lock ()
143
+ defer c .controllersMutex .Unlock ()
144
+ c .controllers [ctr .Type ()] = append (c .controllers [ctr .Type ()], ctr )
145
+ }
146
+
147
+ func (c * WSConn ) Unregister (ctr Controller ) {
148
+ c .controllersMutex .Lock ()
149
+ defer c .controllersMutex .Unlock ()
150
+ var filterd []Controller
151
+ for _ , ct := range c .controllers [ctr .Type ()] {
152
+ if ct .Name () != ctr .Name () {
153
+ filterd = append (filterd , ct )
154
+ }
155
+ }
156
+ c .controllers [ctr .Type ()] = filterd
157
+ }
158
+
138
159
func (c * WSConn ) dial (ctx context.Context , server string ) error {
139
160
networkSecret , err := c .server .SecretStore ().NetworkSecret ()
140
161
if err != nil {
@@ -343,6 +364,13 @@ func (c *WSConn) handleEvents(b []byte) {
343
364
go c .updateNetworkSecret (secret )
344
365
case peer .CONTROL_CONN :
345
366
c .connData <- b [1 :]
367
+ default :
368
+ c .controllersMutex .RLock ()
369
+ ctrs := c .controllers [b [0 ]]
370
+ c .controllersMutex .RUnlock ()
371
+ for _ , ctr := range ctrs {
372
+ ctr .Handle (b )
373
+ }
346
374
}
347
375
}
348
376
@@ -384,6 +412,7 @@ func DialPeermap(ctx context.Context, server *peer.Peermap, peerID peer.ID, meta
384
412
peers : make (chan * PeerFindEvent , 20 ),
385
413
peersUDPAddrs : make (chan * PeerUDPAddrEvent , 20 ),
386
414
connData : make (chan []byte , 128 ),
415
+ controllers : make (map [uint8 ][]Controller ),
387
416
}
388
417
if err := wsConn .dial (ctx , "" ); err != nil {
389
418
return nil , err
0 commit comments