mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-08-31 15:34:01 +03:00
FILE / ScuroNeko/mtg
hub/hub.go
Исходный файл и его история в репозитории.
49 lines
1.0 KiB
Go
49 lines
1.0 KiB
Go
package hub
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
|
|
"github.com/9seconds/mtg/conntypes"
|
|
"github.com/9seconds/mtg/protocol"
|
|
)
|
|
|
|
type Concentrator struct {
|
|
hubs sync.Map
|
|
}
|
|
|
|
func (c *Concentrator) Write(packet conntypes.Packet, req *protocol.TelegramRequest) error {
|
|
hub := c.getHub(req)
|
|
connectionChan := make(chan *connection)
|
|
hub.connectionRequestsChan <- &connectionHubRequest{
|
|
req: req,
|
|
responseChan: connectionChan,
|
|
}
|
|
|
|
conn, ok := <-connectionChan
|
|
if !ok {
|
|
return errors.New("cannot establish connection to telegram")
|
|
}
|
|
}
|
|
|
|
func (c *Concentrator) getHub(req *protocol.TelegramRequest) *connectionHub {
|
|
dcMapRaw, ok := c.hubs.Load(req.ClientProtocol.DC())
|
|
if !ok {
|
|
dcMapRaw, _ = c.hubs.LoadOrStore(req.ClientProtocol.DC(), &sync.Map{})
|
|
}
|
|
dcMap := dcMapRaw.(*sync.Map)
|
|
|
|
loaded := true
|
|
hubRaw, ok := dcMap.Load(req.ClientProtocol.ConnectionProtocol())
|
|
if !ok {
|
|
hubRaw, loaded = dcMap.LoadOrStore(req.ClientProtocol.ConnectionProtocol(),
|
|
newConnectionHub())
|
|
}
|
|
hub := hubRaw.(*connectionHub)
|
|
if !loaded {
|
|
go hub.run()
|
|
}
|
|
|
|
return hub
|
|
}
|