uplink/app/channels/channel_manager.go

72 lines
1.3 KiB
Go
Raw Normal View History

2018-04-10 11:48:51 +00:00
package channels
import (
"errors"
"sync"
2018-04-11 07:33:22 +00:00
"github.com/cskr/pubsub"
2018-04-10 11:48:51 +00:00
)
type ChannelManager struct {
channels map[string]*Channel
channelsLock sync.RWMutex
2018-04-11 07:33:22 +00:00
pubsub *pubsub.PubSub
2018-04-10 11:48:51 +00:00
}
2018-04-10 15:08:40 +00:00
func NewChannelManager() *ChannelManager {
2018-04-11 07:33:22 +00:00
mgr := &ChannelManager{
pubsub: pubsub.New(1),
2018-04-10 15:08:40 +00:00
channels: map[string]*Channel{},
}
2018-04-11 07:36:27 +00:00
return mgr
2018-04-10 15:08:40 +00:00
}
2018-04-10 11:48:51 +00:00
func (manager *ChannelManager) Channel(uuid string) *Channel {
manager.channelsLock.RLock()
defer manager.channelsLock.RUnlock()
channel, ok := manager.channels[uuid]
if !ok {
return nil
}
return channel
}
func (manager *ChannelManager) Close(uuid string) (err error) {
manager.channelsLock.Lock()
defer manager.channelsLock.Unlock()
_, ok := manager.channels[uuid]
if !ok {
err = errors.New("channel uuid is not known")
return
}
2018-04-11 07:36:27 +00:00
manager.pubsub.Pub(manager.channels[uuid], "close")
2018-04-10 11:48:51 +00:00
delete(manager.channels, uuid)
return
}
func (manager *ChannelManager) Open(uuid string) (channel *Channel, err error) {
manager.channelsLock.Lock()
defer manager.channelsLock.Unlock()
if _, ok := manager.channels[uuid]; ok {
err = errors.New("channel uuid is already in use")
return
}
2018-04-11 07:33:22 +00:00
channel = &Channel{Id: uuid}
2018-04-10 11:48:51 +00:00
manager.channels[uuid] = channel
2018-04-11 07:36:27 +00:00
manager.pubsub.Pub(channel, "open")
2018-04-11 07:33:22 +00:00
2018-04-10 11:48:51 +00:00
return
}
2018-04-11 07:33:22 +00:00
func (manager *ChannelManager) Shutdown() {
manager.pubsub.Shutdown()
}