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 { 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 { *internal.Stream }