diff options
| author | Dax Raad <[email protected]> | 2025-05-19 15:43:14 -0400 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-05-26 12:40:17 -0400 |
| commit | 652429377b99085d686d6b907c2f550c304e6b98 (patch) | |
| tree | e4fa0de6b0503885c76bb77e1e0d0e7d56e5117e /pkg/client/event.go | |
| parent | 99af6146d5def31c59993636d60eb75a483a283b (diff) | |
| download | opencode-652429377b99085d686d6b907c2f550c304e6b98.tar.gz opencode-652429377b99085d686d6b907c2f550c304e6b98.zip | |
sync
Diffstat (limited to 'pkg/client/event.go')
| -rw-r--r-- | pkg/client/event.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/pkg/client/event.go b/pkg/client/event.go new file mode 100644 index 000000000..a6d7798fa --- /dev/null +++ b/pkg/client/event.go @@ -0,0 +1,74 @@ +package client + +import ( + "bufio" + "context" + "encoding/json" + "net/http" + "reflect" + "strings" +) + +var EventMap = map[string]any{ + "storage.write": StorageWrite{}, +} + +type EventMessage struct { + Type string `json:"type"` + Properties json.RawMessage `json:"properties"` +} + +func (c *Client) Event(ctx context.Context) (<-chan any, error) { + events := make(chan any) + req, err := http.NewRequestWithContext(ctx, "GET", c.Server+"/event", nil) + if err != nil { + return nil, err + } + + go func() { + defer close(events) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return + } + defer resp.Body.Close() + + scanner := bufio.NewScanner(resp.Body) + for scanner.Scan() { + line := scanner.Text() + if strings.HasPrefix(line, "data: ") { + data := strings.TrimPrefix(line, "data: ") + + var eventMsg EventMessage + if err := json.Unmarshal([]byte(data), &eventMsg); err != nil { + continue + } + + eventTemplate, exists := EventMap[eventMsg.Type] + if !exists { + select { + case events <- eventMsg: + case <-ctx.Done(): + return + } + continue + } + + eventValue := reflect.New(reflect.TypeOf(eventTemplate)).Interface() + + if err := json.Unmarshal(eventMsg.Properties, eventValue); err != nil { + continue + } + + select { + case events <- eventValue: + case <-ctx.Done(): + return + } + } + } + }() + + return events, nil +} |
