Skip to content

Commit ef91441

Browse files
authored
Merge pull request #62 from dawedawe/add_websocket_support
Support JsonRpc via web sockets
2 parents e2045f0 + 931dc21 commit ef91441

File tree

1 file changed

+42
-10
lines changed

1 file changed

+42
-10
lines changed

src/LanguageServerProtocol.fs

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,12 @@ module Server =
113113
JsonRpcError.ErrorDetail(Code = JsonRpcErrorCode.ParseError, Message = ex.Message, Data = data)
114114
| _ -> ``base``.CreateErrorDetails(request, ex) }
115115

116-
let startWithSetup<'client when 'client :> Ionide.LanguageServerProtocol.ILspClient>
116+
let startWithSetupCore<'client when 'client :> Ionide.LanguageServerProtocol.ILspClient>
117117
(setupRequestHandlings: 'client -> Map<string, Delegate>)
118-
(input: Stream)
119-
(output: Stream)
118+
(jsonRpcHandler: IJsonRpcMessageHandler)
120119
(clientCreator: (ClientNotificationSender * ClientRequestSender) -> 'client)
121120
(customizeRpc: IJsonRpcMessageHandler -> JsonRpc)
122121
=
123-
124-
use jsonRpcHandler = new HeaderDelimitedMessageHandler(output, input, defaultJsonRpcFormatter ())
125122
// Without overriding isFatalException, JsonRpc serializes exceptions and sends them to the client.
126123
// This is particularly bad for notifications such as textDocument/didChange which don't require a response,
127124
// and thus any exception that happens during e.g. text sync gets swallowed.
@@ -209,6 +206,25 @@ module Server =
209206
| false, true -> LspCloseReason.ErrorExitWithoutShutdown
210207
| _ -> LspCloseReason.ErrorStreamClosed
211208

209+
let startWithSetup<'client when 'client :> Ionide.LanguageServerProtocol.ILspClient>
210+
(setupRequestHandlings: 'client -> Map<string, Delegate>)
211+
(input: Stream)
212+
(output: Stream)
213+
(clientCreator: (ClientNotificationSender * ClientRequestSender) -> 'client)
214+
(customizeRpc: IJsonRpcMessageHandler -> JsonRpc)
215+
=
216+
use jsonRpcHandler = new HeaderDelimitedMessageHandler(output, input, defaultJsonRpcFormatter ())
217+
startWithSetupCore setupRequestHandlings jsonRpcHandler clientCreator customizeRpc
218+
219+
let startWithSetupWs<'client when 'client :> Ionide.LanguageServerProtocol.ILspClient>
220+
(setupRequestHandlings: 'client -> Map<string, Delegate>)
221+
(socket: System.Net.WebSockets.WebSocket)
222+
(clientCreator: (ClientNotificationSender * ClientRequestSender) -> 'client)
223+
(customizeRpc: IJsonRpcMessageHandler -> JsonRpc)
224+
=
225+
use jsonRpcHandler = new WebSocketMessageHandler(socket, defaultJsonRpcFormatter ())
226+
startWithSetupCore setupRequestHandlings jsonRpcHandler clientCreator customizeRpc
227+
212228
type ServerRequestHandling<'server when 'server :> Ionide.LanguageServerProtocol.ILspServer> =
213229
{ Run: 'server -> Delegate }
214230

@@ -292,22 +308,38 @@ module Server =
292308
"exit", requestHandling (fun s () -> s.Exit() |> notificationSuccess) ]
293309
|> Map.ofList
294310

295-
let start<'client, 'server
311+
let private requestHandlingSetupFunc<'client, 'server
296312
when 'client :> Ionide.LanguageServerProtocol.ILspClient and 'server :> Ionide.LanguageServerProtocol.ILspServer>
297313
(requestHandlings: Map<string, ServerRequestHandling<'server>>)
298-
(input: Stream)
299-
(output: Stream)
300-
(clientCreator: (ClientNotificationSender * ClientRequestSender) -> 'client)
301314
(serverCreator: 'client -> 'server)
302315
=
303-
let requestHandlingSetup client =
316+
fun client ->
304317
let server = serverCreator client
305318

306319
requestHandlings
307320
|> Map.map (fun _ requestHandling -> requestHandling.Run server)
308321

322+
let start<'client, 'server
323+
when 'client :> Ionide.LanguageServerProtocol.ILspClient and 'server :> Ionide.LanguageServerProtocol.ILspServer>
324+
(requestHandlings: Map<string, ServerRequestHandling<'server>>)
325+
(input: Stream)
326+
(output: Stream)
327+
(clientCreator: (ClientNotificationSender * ClientRequestSender) -> 'client)
328+
(serverCreator: 'client -> 'server)
329+
=
330+
let requestHandlingSetup = requestHandlingSetupFunc requestHandlings serverCreator
309331
startWithSetup requestHandlingSetup input output clientCreator
310332

333+
let startWs<'client, 'server
334+
when 'client :> Ionide.LanguageServerProtocol.ILspClient and 'server :> Ionide.LanguageServerProtocol.ILspServer>
335+
(requestHandlings: Map<string, ServerRequestHandling<'server>>)
336+
(socket: Net.WebSockets.WebSocket)
337+
(clientCreator: (ClientNotificationSender * ClientRequestSender) -> 'client)
338+
(serverCreator: 'client -> 'server)
339+
=
340+
let requestHandlingSetup = requestHandlingSetupFunc requestHandlings serverCreator
341+
startWithSetupWs requestHandlingSetup socket clientCreator
342+
311343
module Client =
312344
open System
313345
open System.Diagnostics

0 commit comments

Comments
 (0)