Skip to content

Commit dbe2abc

Browse files
committed
observer pattern
1 parent 026d81a commit dbe2abc

File tree

1 file changed

+38
-12
lines changed

1 file changed

+38
-12
lines changed

internal/dev_server/sdk/sdk_events.go

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,67 @@
11
package sdk
22

33
import (
4-
"github.com/pkg/errors"
54
"io"
65
"log"
76
"net/http"
7+
"sync"
8+
9+
"github.com/launchdarkly/ldcli/internal/dev_server/model"
10+
"github.com/pkg/errors"
811
)
912

13+
type sdkEventObserver struct {
14+
updateChan chan<- Message
15+
}
16+
17+
func (o sdkEventObserver) Handle(message interface{}) {
18+
str, ok := message.(string)
19+
if !ok {
20+
return
21+
}
22+
o.updateChan <- Message{Event: TYPE_PUT, Data: []byte(str)}
23+
}
24+
25+
var observers *model.Observers
26+
var once sync.Once
27+
1028
func SdkEventsReceiveHandler(writer http.ResponseWriter, request *http.Request) {
11-
log.Println(request.URL.Path)
29+
once.Do(func() {
30+
observers = model.NewObservers()
31+
})
32+
1233
bodyStr, err := io.ReadAll(request.Body)
1334
if err != nil {
1435
log.Printf("SdkEventsReceiveHandler: error reading request body: %v", err)
1536
return
1637
}
17-
log.Println(string(bodyStr))
38+
if observers != nil {
39+
observers.Notify(string(bodyStr))
40+
}
1841

1942
writer.Header().Set("Content-Type", "application/json")
2043
writer.WriteHeader(http.StatusAccepted)
2144
}
2245

2346
func SdkEventsTeeHandler(writer http.ResponseWriter, request *http.Request) {
24-
// Initialize SSE
47+
once.Do(func() {
48+
observers = model.NewObservers()
49+
})
50+
2551
updateChan, errChan := OpenStream(
2652
writer,
2753
request.Context().Done(),
28-
Message{Event: TYPE_PUT, Data: []byte("start")},
54+
Message{Event: TYPE_PUT, Data: []byte{}},
2955
)
3056
defer close(updateChan)
3157

32-
// Use updateChan to continually send messages back to the client. OpenStream, above,
33-
// takes care of flushing the data.
34-
//
35-
// If the client cancels the request, OpenStream will notice via request.Context.Done().
36-
// Otherwise, this connection is never explicitly closed by us.
37-
updateChan <- Message{Event: TYPE_PUT, Data: []byte("data1")}
38-
updateChan <- Message{Event: TYPE_PUT, Data: []byte("data2")}
58+
observerId := observers.RegisterObserver(sdkEventObserver{updateChan})
59+
defer func() {
60+
ok := observers.DeregisterObserver(observerId)
61+
if !ok {
62+
log.Printf("unable to remove observer")
63+
}
64+
}()
3965

4066
err := <-errChan
4167
if err != nil {

0 commit comments

Comments
 (0)