summaryrefslogtreecommitdiffhomepage
path: root/pkg/client/event.go
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-05-19 15:43:14 -0400
committerDax Raad <[email protected]>2025-05-26 12:40:17 -0400
commit652429377b99085d686d6b907c2f550c304e6b98 (patch)
treee4fa0de6b0503885c76bb77e1e0d0e7d56e5117e /pkg/client/event.go
parent99af6146d5def31c59993636d60eb75a483a283b (diff)
downloadopencode-652429377b99085d686d6b907c2f550c304e6b98.tar.gz
opencode-652429377b99085d686d6b907c2f550c304e6b98.zip
sync
Diffstat (limited to 'pkg/client/event.go')
-rw-r--r--pkg/client/event.go74
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
+}