deprecated_overflow_gateway.../server/socket_manager.go
2017-09-11 11:24:18 +09:00

144 lines
2.8 KiB
Go

package server
import (
uch "git.loafle.net/commons_go/util/channel"
ogw "git.loafle.net/overflow/overflow_gateway_websocket"
)
type socketsChannelAction struct {
uch.Action
path string
uid string
soc ogw.Socket
}
type sockets struct {
s map[string]ogw.Socket
sr map[ogw.Socket]string
}
func (s *sockets) addSocket(uid string, soc ogw.Socket) {
s.s[uid] = soc
s.sr[soc] = uid
}
func (s *sockets) removeSocket(soc ogw.Socket) {
var uid string
var ok bool
if uid, ok = s.sr[soc]; !ok {
return
}
delete(s.s, uid)
delete(s.sr, soc)
}
func (s *sockets) getSocket(uid string) ogw.Socket {
return s.s[uid]
}
func (s *sockets) getUID(soc ogw.Socket) string {
return s.sr[soc]
}
type SocketManager interface {
AddSocket(path string, uid string, soc ogw.Socket)
RemoveSocket(path string, soc ogw.Socket)
GetSocket(path string, uid string) ogw.Socket
GetUID(path string, soc ogw.Socket) string
}
type socketManager struct {
sMap map[string]*sockets
sCh chan socketsChannelAction
}
var _m SocketManager
func init() {
_m = New()
}
func New() SocketManager {
m := &socketManager{
sMap: make(map[string]*sockets),
sCh: make(chan socketsChannelAction),
}
go m.listenChannel()
return m
}
func AddSocket(path string, uid string, soc ogw.Socket) { _m.AddSocket(path, uid, soc) }
func (m *socketManager) AddSocket(path string, uid string, soc ogw.Socket) {
ca := socketsChannelAction{
path: path,
uid: uid,
soc: soc,
}
ca.Type = uch.ActionTypeCreate
m.sCh <- ca
}
func RemoveSocket(path string, soc ogw.Socket) { _m.RemoveSocket(path, soc) }
func (m *socketManager) RemoveSocket(path string, soc ogw.Socket) {
ca := socketsChannelAction{
path: path,
soc: soc,
}
ca.Type = uch.ActionTypeDelete
m.sCh <- ca
}
func GetSocket(path string, uid string) ogw.Socket { return _m.GetSocket(path, uid) }
func (m *socketManager) GetSocket(path string, uid string) ogw.Socket {
var s *sockets
var ok bool
if s, ok = m.sMap[path]; !ok {
return nil
}
return s.getSocket(uid)
}
func GetUID(path string, soc ogw.Socket) string { return _m.GetUID(path, soc) }
func (m *socketManager) GetUID(path string, soc ogw.Socket) string {
var s *sockets
var ok bool
if s, ok = m.sMap[path]; !ok {
return ""
}
return s.getUID(soc)
}
func (m *socketManager) listenChannel() {
for {
select {
case ca := <-m.sCh:
switch ca.Type {
case uch.ActionTypeCreate:
var s *sockets
var ok bool
if s, ok = m.sMap[ca.path]; !ok {
s = &sockets{
s: make(map[string]ogw.Socket),
sr: make(map[ogw.Socket]string),
}
m.sMap[ca.path] = s
}
s.addSocket(ca.uid, ca.soc)
break
case uch.ActionTypeDelete:
var s *sockets
var ok bool
if s, ok = m.sMap[ca.path]; !ok {
return
}
s.removeSocket(ca.soc)
break
}
}
}
}