event.go 992 B

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