| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | package systemimport (	"time"	"io"	"github.com/0xJacky/Nginx-UI/api"	"github.com/0xJacky/Nginx-UI/internal/cache"	"github.com/0xJacky/Nginx-UI/internal/cert"	"github.com/0xJacky/Nginx-UI/internal/kernel"	"github.com/gin-gonic/gin")type ProcessingStatus struct {	IndexScanning      bool `json:"index_scanning"`	AutoCertProcessing bool `json:"auto_cert_processing"`}// GetProcessingStatus is an SSE endpoint that sends real-time processing status updatesfunc GetProcessingStatus(c *gin.Context) {	api.SetSSEHeaders(c)	notify := c.Writer.CloseNotify()	indexScanning := cache.SubscribeScanningStatus()	defer cache.UnsubscribeScanningStatus(indexScanning)	autoCert := cert.SubscribeProcessingStatus()	defer cert.UnsubscribeProcessingStatus(autoCert)	// Track current status	status := ProcessingStatus{		IndexScanning:      false,		AutoCertProcessing: false,	}	sendStatus := func() {		c.Stream(func(w io.Writer) bool {			c.SSEvent("message", status)			return false		})	}	for {		select {		case indexStatus, ok := <-indexScanning:			if !ok {				return			}			status.IndexScanning = indexStatus			sendStatus()		case certStatus, ok := <-autoCert:			if !ok {				return			}			status.AutoCertProcessing = certStatus			sendStatus()		case <-time.After(30 * time.Second):			c.Stream(func(w io.Writer) bool {				c.SSEvent("heartbeat", "")				return false			})		case <-kernel.Context.Done():			return		case <-notify:			// Client disconnected			return		}	}}
 |