package channels import ( "errors" "sync" ) type ChannelManager struct { channels map[string]*Channel channelsLock sync.RWMutex } 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 } 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 } channel = new(Channel) manager.channels[uuid] = channel return }