``` func getWallethandler() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if pusher, ok := w.(http.Pusher); ok { options := &http.PushOptions{} if err := pusher.Push("/account/user", options); err != nil { log.Printf("Failed to push: %v", err) } if err := pusher.Push("/wallet/balance", options); err != nil { log.Printf("Failed to push: %v", err) } if err := pusher.Push("/wallet/history", options); err != nil { log.Printf("Failed to push: %v", err) } if err := pusher.Push("/wallet/deposit", options); err != nil { log.Printf("Failed to push: %v", err) } if err := pusher.Push("/wallet/rate", nil); err != nil { log.Printf("Failed to push: %v", err) } services.JSONResponse(w, http.StatusOK, &services.Response{Success: true, Message: "Push supported", Data: nil}) return } services.JSONResponse(w, http.StatusOK, &services.Response{Success: false, Message: "Push not supported", Data: nil}) } } func getWalletUpdatehandler() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if _, ok := w.(http.Flusher); ok { w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") w.Header().Set("Access-Control-Allow-Origin", "*") writeRate(w, r) services.JSONResponse(w, http.StatusOK, &services.Response{Success: true, Message: "Push supported", Data: nil}) return } services.JSONResponse(w, http.StatusBadRequest, &services.Response{Success: false, Message: "Push not supported", Data: nil}) } } type flushWriter struct { w io.Writer } func (fw flushWriter) Write(p []byte) (n int, err error) { n, err = fw.w.Write(p) if f, ok := fw.w.(http.Flusher); ok { f.Flush() } return } func writeRate(w http.ResponseWriter, r *http.Request) { f := flushWriter{w: w} c2 := make(chan interface{}) res := services.GetRateReq{} n := 0 go func() { for range time.Tick(time.Second * 5) { _, _, rates, _ := res.Controller() c2 <- rates } }() for { select { case rate := <-c2: fmt.Println("writing ", n) out, _ := json.Marshal(rate) f.Write([]byte(fmt.Sprintf("data: %s\n\n", string(out)))) case <-r.Context().Done(): fmt.Println("Breaking") return } n++ } } ```