uplink/internal/channels/channel.go

61 lines
1.2 KiB
Go
Raw Normal View History

2018-04-10 11:48:51 +00:00
package channels
import (
"context"
"sync"
"git.icedream.tech/icedream/uplink/internal"
)
type Channel struct {
metadataLock sync.RWMutex
metadata map[string]string
metadataChannel chan map[string]string
Name string
Description string
MimeType string
InputStream *internal.Stream
OutputStreams map[string]ChannelOutputStream
}
func (channel *Channel) SetMetadata(data map[string]string) {
channel.metadataLock.Lock()
defer channel.metadataLock.Unlock()
channel.metadata = data
channel.metadataChannel <- data
}
func (channel *Channel) Metadata(ctx context.Context) <-chan map[string]string {
channel.metadataLock.Lock()
defer channel.metadataLock.Unlock()
metadataChan := make(chan map[string]string, 1)
if channel.metadata != nil {
metadataChan <- channel.metadata
}
go func() {
for {
select {
2018-04-10 13:56:42 +00:00
case data, ok := <-channel.metadataChannel:
if !ok {
return
}
metadataChan <- data
2018-04-10 11:48:51 +00:00
case <-ctx.Done():
2018-04-10 13:56:42 +00:00
return
2018-04-10 11:48:51 +00:00
}
}
}()
2018-04-10 13:56:42 +00:00
return metadataChan
2018-04-10 11:48:51 +00:00
}
func NewChannel() *Channel {
return &Channel{
metadataChannel: make(chan map[string]string),
2018-04-10 13:56:42 +00:00
OutputStreams: map[string]ChannelOutputStream{},
2018-04-10 11:48:51 +00:00
}
}
type ChannelOutputStream struct {
*internal.Stream
}