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