@@ -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+
311343module Client =
312344 open System
313345 open System.Diagnostics
0 commit comments