uplink/app/channels/channel.go

61 lines
1.2 KiB
Go

package channels
import (
"context"
"sync"
"git.icedream.tech/icedream/uplink/app/streams"
)
type Channel struct {
metadataLock sync.RWMutex
metadata map[string]string
metadataChannel chan map[string]string
Name string
Description string
MimeType string
InputStream *streams.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 {
case data, ok := <-channel.metadataChannel:
if !ok {
return
}
metadataChan <- data
case <-ctx.Done():
return
}
}
}()
return metadataChan
}
func NewChannel() *Channel {
return &Channel{
metadataChannel: make(chan map[string]string),
OutputStreams: map[string]ChannelOutputStream{},
}
}
type ChannelOutputStream struct {
*streams.Stream
}