event.go 979 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package client
  2. import (
  3. "bufio"
  4. "context"
  5. "encoding/json"
  6. "net/http"
  7. "strings"
  8. )
  9. func (c *Client) Event(ctx context.Context) (<-chan any, error) {
  10. events := make(chan any)
  11. req, err := http.NewRequestWithContext(ctx, "GET", c.Server+"event", nil)
  12. if err != nil {
  13. return nil, err
  14. }
  15. resp, err := http.DefaultClient.Do(req)
  16. if err != nil {
  17. return nil, err
  18. }
  19. go func() {
  20. defer close(events)
  21. defer resp.Body.Close()
  22. scanner := bufio.NewScanner(resp.Body)
  23. scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024)
  24. for scanner.Scan() {
  25. line := scanner.Text()
  26. if strings.HasPrefix(line, "data: ") {
  27. data := strings.TrimPrefix(line, "data: ")
  28. var event Event
  29. if err := json.Unmarshal([]byte(data), &event); err != nil {
  30. continue
  31. }
  32. val, err := event.ValueByDiscriminator()
  33. if err != nil {
  34. continue
  35. }
  36. select {
  37. case events <- val:
  38. case <-ctx.Done():
  39. return
  40. }
  41. }
  42. }
  43. }()
  44. return events, nil
  45. }