event.go 923 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. for scanner.Scan() {
  24. line := scanner.Text()
  25. if strings.HasPrefix(line, "data: ") {
  26. data := strings.TrimPrefix(line, "data: ")
  27. var event Event
  28. if err := json.Unmarshal([]byte(data), &event); err != nil {
  29. continue
  30. }
  31. val, err := event.ValueByDiscriminator()
  32. if err != nil {
  33. continue
  34. }
  35. select {
  36. case events <- val:
  37. case <-ctx.Done():
  38. return
  39. }
  40. }
  41. }
  42. }()
  43. return events, nil
  44. }