Fix: sse updates
This commit is contained in:
		| @@ -52,11 +52,20 @@ func (broker *Broker) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 	w.Header().Set("Content-Type", "text/event-stream") | 	w.Header().Set("Content-Type", "text/event-stream") | ||||||
| 	w.Header().Set("Cache-Control", "no-cache") | 	w.Header().Set("Cache-Control", "no-cache") | ||||||
| 	w.Header().Set("Connection", "keep-alive") | 	w.Header().Set("Connection", "keep-alive") | ||||||
| 	w.Header().Set("Access-Control-Allow-Origin", "*") | 	// w.Header().Set("Access-Control-Allow-Origin", "*") | ||||||
|  | 	origin := r.Header.Get("Origin") | ||||||
|  | 	if origin == "" { | ||||||
|  | 		origin = "*" // Fallback for non-browser clients | ||||||
|  | 	} | ||||||
|  | 	w.Header().Set("Access-Control-Allow-Origin", origin) | ||||||
|  | 	w.Header().Set("Access-Control-Allow-Credentials", "true") | ||||||
| 	messageChan := make(NotifierChan) | 	messageChan := make(NotifierChan) | ||||||
| 	broker.newClients <- messageChan | 	broker.newClients <- messageChan | ||||||
| 	defer func() { broker.closingClients <- messageChan }() | 	defer func() { broker.closingClients <- messageChan }() | ||||||
| 	ctx := r.Context() | 	ctx := r.Context() | ||||||
|  | 	// browser can close sse on its own | ||||||
|  | 	heartbeat := time.NewTicker(15 * time.Second) | ||||||
|  | 	defer heartbeat.Stop() | ||||||
| 	for { | 	for { | ||||||
| 		select { | 		select { | ||||||
| 		case <-ctx.Done(): | 		case <-ctx.Done(): | ||||||
| @@ -70,6 +79,12 @@ func (broker *Broker) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| 			w.(http.Flusher).Flush() | 			w.(http.Flusher).Flush() | ||||||
|  | 		case <-heartbeat.C: | ||||||
|  | 			// Send SSE heartbeat comment | ||||||
|  | 			if _, err := w.Write([]byte(": heartbeat\n\n")); err != nil { | ||||||
|  | 				return // Client disconnected | ||||||
|  | 			} | ||||||
|  | 			w.(http.Flusher).Flush() | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -95,7 +110,8 @@ func (broker *Broker) Listen() { | |||||||
| 				select { | 				select { | ||||||
| 				case clientMessageChan <- event: | 				case clientMessageChan <- event: | ||||||
| 				case <-time.After(patience): | 				case <-time.After(patience): | ||||||
| 					slog.Info("Client was skipped", "clients listening", len(broker.clients)) | 					delete(broker.clients, clientMessageChan) | ||||||
|  | 					slog.Info("Client was removed", "clients listening", len(broker.clients)) | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder