diff --git a/src/vscode/superbol-vscode-platform/superbol_vscode_platform.ml b/src/vscode/superbol-vscode-platform/superbol_vscode_platform.ml index 6ad104543..79bbe26dc 100644 --- a/src/vscode/superbol-vscode-platform/superbol_vscode_platform.ml +++ b/src/vscode/superbol-vscode-platform/superbol_vscode_platform.ml @@ -188,13 +188,34 @@ let activate (extension : Vscode.ExtensionContext.t) = Vscode.ExtensionContext.subscribe extension ~disposable:task; - client := - Some (Vscode_languageclient.LanguageClient.make - ~id:"cobolServer" - ~name:"Cobol Server" - ~serverOptions:Superbol_languageclient.serverOptions - ~clientOptions:Superbol_languageclient.clientOptions - ()); + let new_client = + let serverOptions = Superbol_languageclient.serverOptions in + let cmd = Vscode_languageclient.Executable.command serverOptions in + if String.starts_with ~prefix:"ws://" cmd then + Some (Vscode_languageclient.LanguageClient.make_ + ~id:"cobolServer" + ~name:"Cobol Server" + (fun () -> + let njs_stream = + Vscode_languageclient.StreamInfo.njs_stream_of_string cmd + in + Promise.return ( + Vscode_languageclient.StreamInfo.create + ~writer:njs_stream + ~reader:njs_stream + () + ) + ) + ) + else + Some (Vscode_languageclient.LanguageClient.make + ~id:"cobolServer" + ~name:"Cobol Server" + ~serverOptions:Superbol_languageclient.serverOptions + ~clientOptions:Superbol_languageclient.clientOptions + ()) + in + client := new_client; match !client with | Some client -> Vscode_languageclient.LanguageClient.start client | None -> Promise.return () diff --git a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.ml b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.ml index 61d74b2b2..12f2e5d61 100644 --- a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.ml +++ b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.ml @@ -189,6 +189,38 @@ module StaticFeature = struct [@@js.builder]] end +module StreamInfo = struct + include Interface.Make () + + type njs_stream + + let njs_stream_of_string str : njs_stream = + Format.ksprintf + Js_of_ocaml.Js.Unsafe.eval_string + "new joo_global_object.webSocket (`%s`);" + str + + let njs_stream_of_js = Obj.magic + + let njs_stream_to_js = Obj.magic + + include + [%js: + val writer : t -> njs_stream [@@js.get] + + val reader : t -> njs_stream [@@js.get] + + val detached : t -> bool option [@@js.get] + + val create : + writer:njs_stream + -> reader:njs_stream + -> ?detached:bool + -> unit + -> t + [@@js.builder]] +end + module LanguageClient = struct include Class.Make () @@ -204,6 +236,13 @@ module LanguageClient = struct -> t [@@js.new "vscode_languageclient.LanguageClient"] + val make_ : + id:string + -> name:string + -> (unit -> StreamInfo.t Promise.t) + -> t + [@@js.new "vscode_languageclient.LanguageClient"] + val start : t -> unit Promise.t [@@js.call] val isRunning : t -> bool [@@js.call] diff --git a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.mli b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.mli index b6fe9ffda..502e4681d 100644 --- a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.mli +++ b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient.mli @@ -160,6 +160,28 @@ module StaticFeature : sig -> t end +module StreamInfo : sig + include Js.T + + type njs_stream + + val njs_stream_of_string : string -> njs_stream + + val writer : t -> njs_stream [@@js.get] + + val reader : t -> njs_stream [@@js.get] + + val detached : t -> bool option [@@js.get] + + val create : + writer:njs_stream + -> reader:njs_stream + -> ?detached:bool + -> unit + -> t + [@@js.builder] +end + module LanguageClient : sig include Js.T @@ -172,6 +194,12 @@ module LanguageClient : sig -> unit -> t + val make_ : + id:string + -> name:string + -> (unit -> StreamInfo.t Promise.t) + -> t + val start : t -> unit Promise.t val isRunning : t -> bool diff --git a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient_stub.js b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient_stub.js index 875f885b0..c8af13b07 100644 --- a/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient_stub.js +++ b/src/vscode/vscode-languageclient-js-stubs/vscode_languageclient_stub.js @@ -1 +1,2 @@ joo_global_object.vscode_languageclient = require("vscode-languageclient"); +joo_global_object.webSocket = require("ws");