48 lines
1.0 KiB
Go
48 lines
1.0 KiB
Go
package internal
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/marcopeocchi/yt-dlp-web-ui/server/config"
|
|
)
|
|
|
|
type MessageQueue struct {
|
|
producerCh chan *Process
|
|
consumerCh chan struct{}
|
|
}
|
|
|
|
// Creates a new message queue.
|
|
// By default it will be created with a size equals to nthe number of logical
|
|
// CPU cores.
|
|
// The queue size can be set via the qs flag.
|
|
func NewMessageQueue() *MessageQueue {
|
|
size := config.Instance().GetConfig().QueueSize
|
|
|
|
if size <= 0 {
|
|
log.Fatalln("invalid queue size")
|
|
}
|
|
|
|
return &MessageQueue{
|
|
producerCh: make(chan *Process, size),
|
|
consumerCh: make(chan struct{}, size),
|
|
}
|
|
}
|
|
|
|
// Publish a message to the queue and set the task to a peding state.
|
|
func (m *MessageQueue) Publish(p *Process) {
|
|
go p.SetPending()
|
|
m.producerCh <- p
|
|
}
|
|
|
|
// Setup the consumer listener which subscribes to the changes to the producer
|
|
// channel and triggers the "download" action.
|
|
func (m *MessageQueue) Subscriber() {
|
|
for msg := range m.producerCh {
|
|
m.consumerCh <- struct{}{}
|
|
go func(p *Process) {
|
|
p.Start()
|
|
<-m.consumerCh
|
|
}(msg)
|
|
}
|
|
}
|