long poll helper first draft - untested
This commit is contained in:
		@@ -1,11 +1,13 @@
 | 
			
		||||
package helpers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"log"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"forge.redroom.link/yves/meowlib"
 | 
			
		||||
@@ -188,3 +190,50 @@ func ReadMessage(messageFilename string) ([]string, []string, string, error) {
 | 
			
		||||
	//  list of messages & detached files
 | 
			
		||||
	return messagesOverview, filenames, "", nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckForMessages checks for messages on a single server
 | 
			
		||||
func LongPollForMessages(storage_path string, jobs []client.RequestsJob, timeout int, longPoll bool) (int, string, error) {
 | 
			
		||||
 | 
			
		||||
	ctx, cancel := context.WithCancel(context.Background())
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	resultChan := make(chan int, len(jobs)) // We'll just send counts here
 | 
			
		||||
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
 | 
			
		||||
	for _, job := range jobs {
 | 
			
		||||
		wg.Add(1)
 | 
			
		||||
		go func(job client.RequestsJob) {
 | 
			
		||||
			defer wg.Done()
 | 
			
		||||
 | 
			
		||||
			for {
 | 
			
		||||
				select {
 | 
			
		||||
				case <-ctx.Done():
 | 
			
		||||
					return
 | 
			
		||||
				default:
 | 
			
		||||
					cnt, _, err := CheckForMessages(storage_path, &job, timeout, true)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						continue // Optionally handle/log error
 | 
			
		||||
					}
 | 
			
		||||
					if cnt > 0 {
 | 
			
		||||
						select {
 | 
			
		||||
						case resultChan <- cnt:
 | 
			
		||||
						case <-ctx.Done():
 | 
			
		||||
						}
 | 
			
		||||
						cancel()
 | 
			
		||||
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}(job)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Wait for a result or context timeout
 | 
			
		||||
	select {
 | 
			
		||||
	case cnt := <-resultChan:
 | 
			
		||||
		return cnt, "", nil
 | 
			
		||||
	case <-ctx.Done():
 | 
			
		||||
		return 0, "", nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user