mirror of https://github.com/stashapp/stash.git
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package api
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/stashapp/stash/pkg/job"
|
|
"github.com/stashapp/stash/pkg/manager"
|
|
"github.com/stashapp/stash/pkg/models"
|
|
)
|
|
|
|
type throttledUpdate struct {
|
|
id int
|
|
pendingUpdate *job.Job
|
|
lastUpdate time.Time
|
|
broadcastTimer *time.Timer
|
|
killTimer *time.Timer
|
|
}
|
|
|
|
func (tu *throttledUpdate) broadcast(output chan *models.JobStatusUpdate) {
|
|
tu.lastUpdate = time.Now()
|
|
output <- &models.JobStatusUpdate{
|
|
Type: models.JobStatusUpdateTypeUpdate,
|
|
Job: jobToJobModel(*tu.pendingUpdate),
|
|
}
|
|
|
|
tu.broadcastTimer = nil
|
|
tu.pendingUpdate = nil
|
|
}
|
|
|
|
func makeJobStatusUpdate(t models.JobStatusUpdateType, j job.Job) *models.JobStatusUpdate {
|
|
return &models.JobStatusUpdate{
|
|
Type: t,
|
|
Job: jobToJobModel(j),
|
|
}
|
|
}
|
|
|
|
func (r *subscriptionResolver) JobsSubscribe(ctx context.Context) (<-chan *models.JobStatusUpdate, error) {
|
|
msg := make(chan *models.JobStatusUpdate, 100)
|
|
|
|
subscription := manager.GetInstance().JobManager.Subscribe(ctx)
|
|
|
|
go func() {
|
|
for {
|
|
select {
|
|
case j := <-subscription.NewJob:
|
|
msg <- makeJobStatusUpdate(models.JobStatusUpdateTypeAdd, j)
|
|
case j := <-subscription.RemovedJob:
|
|
msg <- makeJobStatusUpdate(models.JobStatusUpdateTypeRemove, j)
|
|
case j := <-subscription.UpdatedJob:
|
|
msg <- makeJobStatusUpdate(models.JobStatusUpdateTypeUpdate, j)
|
|
case <-ctx.Done():
|
|
close(msg)
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
|
|
return msg, nil
|
|
}
|
|
|
|
func (r *subscriptionResolver) ScanCompleteSubscribe(ctx context.Context) (<-chan bool, error) {
|
|
return manager.GetInstance().ScanSubscribe(ctx), nil
|
|
}
|