@@ -3,7 +3,10 @@ package sse
3
3
import (
4
4
"context"
5
5
"io"
6
+ "net"
6
7
"net/http"
8
+ "strconv"
9
+ "sync"
7
10
"time"
8
11
9
12
foxyevent "github.com/strowk/foxy-contexts/pkg/foxy_event"
@@ -41,8 +44,8 @@ func NewTransport(options ...SSETransportOption) server.Transport {
41
44
type sseTransport struct {
42
45
keepAliveInterval time.Duration
43
46
e * echo.Echo
44
-
45
- sessionManager * session.SessionManager
47
+ port int
48
+ sessionManager * session.SessionManager
46
49
}
47
50
48
51
func newResponseEvent (res jsonrpc2.JsonRpcResponse ) (* Event , error ) {
@@ -67,14 +70,14 @@ func (s *sseTransport) Run(
67
70
68
71
// e.Use(middleware.Logger())
69
72
70
- servers := map [uuid. UUID ]server. Server {}
73
+ servers := sync. Map {}
71
74
72
75
postEndpoint := "/message"
73
76
74
77
e .GET ("/sse" , func (c echo.Context ) error {
75
78
sessionId := uuid .New ()
76
79
srv := server .NewServer (capabilities , serverInfo , options ... )
77
- servers [ sessionId ] = srv
80
+ servers . Store ( sessionId , srv )
78
81
w := c .Response ()
79
82
w .Header ().Set ("Content-Type" , "text/event-stream" )
80
83
w .Header ().Set ("Cache-Control" , "no-cache" )
@@ -103,10 +106,10 @@ func (s *sseTransport) Run(
103
106
// Protocol does not seem to have a way to notify client about server initiated shutdown
104
107
// so we would just close the connection to allow server to shutdown and client to reconnect
105
108
// to, hopefully, a new server instance started by orchestrator
106
- delete ( servers , sessionId )
109
+ servers . Delete ( sessionId )
107
110
return nil
108
111
case <- c .Request ().Context ().Done ():
109
- delete ( servers , sessionId )
112
+ servers . Delete ( sessionId )
110
113
srv .GetLogger ().LogEvent (foxyevent.SSEClientDisconnected {ClientIP : c .RealIP ()})
111
114
return nil
112
115
case res := <- srv .GetResponses ():
@@ -141,7 +144,7 @@ func (s *sseTransport) Run(
141
144
return c .String (http .StatusBadRequest , "sessionId is not a valid UUID" )
142
145
}
143
146
144
- r , ok := servers [ parsedSessionId ]
147
+ r , ok := servers . Load ( parsedSessionId )
145
148
if ! ok {
146
149
return c .String (http .StatusNotFound , "session not found" )
147
150
}
@@ -156,11 +159,11 @@ func (s *sseTransport) Run(
156
159
return c .String (http .StatusNotFound , "failed to resolve session" )
157
160
}
158
161
159
- r .Handle (ctx , b )
162
+ r .(server. Server ). Handle (ctx , b )
160
163
return c .JSON (http .StatusAccepted , "Accepted" )
161
164
})
162
165
163
- return e .Start ("127.0.0.1:1323" )
166
+ return e .Start (net . JoinHostPort ( "127.0.0.1" , strconv . Itoa ( s . port )) )
164
167
}
165
168
166
169
func (s * sseTransport ) Shutdown (ctx context.Context ) error {
0 commit comments