11package sdk
22
33import (
4- "context"
54 "encoding/json"
65 "io"
76 "log"
87 "net/http"
98
10- "github.com/google/uuid"
119 "github.com/launchdarkly/ldcli/internal/dev_server/model"
12- "github.com/pkg/errors"
1310)
1411
15- func newSdkEventObserver (updateChan chan <- Message , ctx context.Context ) sdkEventObserver {
16- debugSessionKey := uuid .New ().String ()
17- db := model .EventStoreFromContext (ctx )
18- err := db .CreateDebugSession (ctx , debugSessionKey )
19- if err != nil {
20- log .Printf ("sdkEventObserver: error writting debug session: %v" , err )
21- }
22- return sdkEventObserver {
23- debugSessionKey : debugSessionKey ,
24- ctx : ctx ,
25- updateChan : updateChan ,
26- }
27- }
28-
2912type SDKEventBase struct {
3013 Kind string `json:"kind"`
3114}
3215
33- type sdkEventObserver struct {
34- ctx context.Context
35- debugSessionKey string
36- updateChan chan <- Message
37- }
38-
39- func (o sdkEventObserver ) Handle (message interface {}) {
40- str , ok := message .(json.RawMessage )
41- if ! ok {
42- return
43- }
44-
45- event := SDKEventBase {}
46- err := json .Unmarshal (str , & event )
47- if err != nil {
48- log .Printf ("sdkEventObserver: error unmarshaling event: %v" , err )
49- return
50- }
51-
52- db := model .EventStoreFromContext (o .ctx )
53-
54- err = db .WriteEvent (o .ctx , o .debugSessionKey , event .Kind , str )
55- if err != nil {
56- log .Printf ("sdkEventObserver: error writting event: %v" , err )
57- return
58- }
59-
60- o .updateChan <- Message {Event : TYPE_PUT , Data : str }
61- }
62-
63- var observers * model.Observers = model .NewObservers ()
64-
6516func SdkEventsReceiveHandler (writer http.ResponseWriter , request * http.Request ) {
6617 bodyStr , err := io .ReadAll (request .Body )
6718 if err != nil {
6819 log .Printf ("SdkEventsReceiveHandler: error reading request body: %v" , err )
6920 return
7021 }
22+ observers := model .GetObserversFromContext (request .Context ())
7123
7224 var arr []json.RawMessage
7325 err = json .Unmarshal (bodyStr , & arr )
@@ -83,26 +35,3 @@ func SdkEventsReceiveHandler(writer http.ResponseWriter, request *http.Request)
8335 writer .Header ().Set ("Content-Type" , "application/json" )
8436 writer .WriteHeader (http .StatusAccepted )
8537}
86-
87- func SdkEventsTeeHandler (writer http.ResponseWriter , request * http.Request ) {
88- updateChan , errChan := OpenStream (
89- writer ,
90- request .Context ().Done (),
91- Message {Event : TYPE_PUT , Data : []byte {}},
92- )
93- defer close (updateChan )
94-
95- observerId := observers .RegisterObserver (newSdkEventObserver (updateChan , request .Context ()))
96- defer func () {
97- ok := observers .DeregisterObserver (observerId )
98- if ! ok {
99- log .Printf ("unable to remove observer" )
100- }
101- }()
102-
103- err := <- errChan
104- if err != nil {
105- WriteError (request .Context (), writer , errors .Wrap (err , "stream failure" ))
106- return
107- }
108- }
0 commit comments