@@ -12,15 +12,16 @@ import (
12
12
"runtime/debug"
13
13
"time"
14
14
15
+ "github.com/gorilla/websocket"
15
16
"github.com/sourcegraph/go-langserver/langserver"
16
17
"github.com/sourcegraph/jsonrpc2"
17
18
18
19
_ "net/http/pprof"
19
20
)
20
21
21
22
var (
22
- mode = flag .String ("mode" , "stdio" , "communication mode (stdio|tcp)" )
23
- addr = flag .String ("addr" , ":4389" , "server listen address (tcp)" )
23
+ mode = flag .String ("mode" , "stdio" , "communication mode (stdio|tcp|websocket )" )
24
+ addr = flag .String ("addr" , ":4389" , "server listen address (tcp or websocket )" )
24
25
trace = flag .Bool ("trace" , false , "print all requests and responses" )
25
26
logfile = flag .String ("logfile" , "" , "also log to this file (in addition to stderr)" )
26
27
printVersion = flag .Bool ("version" , false , "print version and exit" )
@@ -111,7 +112,7 @@ func run(cfg langserver.Config) error {
111
112
}
112
113
defer lis .Close ()
113
114
114
- log .Println ("langserver-go: listening on" , * addr )
115
+ log .Println ("langserver-go: listening for TCP connections on" , * addr )
115
116
for {
116
117
conn , err := lis .Accept ()
117
118
if err != nil {
@@ -120,6 +121,24 @@ func run(cfg langserver.Config) error {
120
121
jsonrpc2 .NewConn (context .Background (), jsonrpc2 .NewBufferedStream (conn , jsonrpc2.VSCodeObjectCodec {}), handler , connOpt ... )
121
122
}
122
123
124
+ case "websocket" :
125
+ mux := http .NewServeMux ()
126
+
127
+ mux .HandleFunc ("/" , func (responseWriter http.ResponseWriter , request * http.Request ) {
128
+ var upgrader = websocket.Upgrader {}
129
+ connection , err := upgrader .Upgrade (responseWriter , request , nil )
130
+ if err != nil {
131
+ log .Println ("error upgrading HTTP to WebSocket:" , err )
132
+ }
133
+ defer connection .Close ()
134
+ jc := jsonrpc2 .NewConn (context .Background (), NewObjectStream (connection ), handler , connOpt ... )
135
+ <- jc .DisconnectNotify ()
136
+ })
137
+
138
+ log .Println ("PRE langserver-go: listening for WebSocket connections on" , * addr )
139
+ http .ListenAndServe (* addr , mux )
140
+ return nil
141
+
123
142
case "stdio" :
124
143
log .Println ("langserver-go: reading on stdin, writing on stdout" )
125
144
<- jsonrpc2 .NewConn (context .Background (), jsonrpc2 .NewBufferedStream (stdrwc {}, jsonrpc2.VSCodeObjectCodec {}), handler , connOpt ... ).DisconnectNotify ()
0 commit comments