61 lines
1.2 KiB
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
|
|
}
|