long poll helper first draft - untested
This commit is contained in:
@ -1,11 +1,13 @@
|
|||||||
package helpers
|
package helpers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"forge.redroom.link/yves/meowlib"
|
"forge.redroom.link/yves/meowlib"
|
||||||
@ -188,3 +190,50 @@ func ReadMessage(messageFilename string) ([]string, []string, string, error) {
|
|||||||
// list of messages & detached files
|
// list of messages & detached files
|
||||||
return messagesOverview, filenames, "", nil
|
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