long poll helper first draft - untested

This commit is contained in:
ycc
2025-05-04 22:34:20 +02:00
parent 3af112b860
commit 839fb7c0f9

View File

@ -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
}
}