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