From 839fb7c0f964b49ef5974606b193bf40d2af3ede Mon Sep 17 00:00:00 2001 From: ycc Date: Sun, 4 May 2025 22:34:20 +0200 Subject: [PATCH] long poll helper first draft - untested --- client/helpers/backgroundHelper.go | 49 ++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/client/helpers/backgroundHelper.go b/client/helpers/backgroundHelper.go index 9f53225..5661c23 100644 --- a/client/helpers/backgroundHelper.go +++ b/client/helpers/backgroundHelper.go @@ -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 + } +}