Skip to content

Commit 157737c

Browse files
author
Yatao Li
committed
daemon sends back session id or error number
1 parent 9080244 commit 157737c

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

daemon.fs

+22-13
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ let attachSession id svrpipe =
4747
| true, ({ server = None } as s) ->
4848
let ns = {s with server = Some svrpipe}
4949
sessions.[id] <- ns
50-
Some ns
51-
| _ -> None
50+
Ok ns
51+
| _ -> Error -2
5252

5353
let newSession nvim stderrenc args svrpipe =
5454
let myid = sessionId
@@ -74,15 +74,16 @@ let newSession nvim stderrenc args svrpipe =
7474
sessionId <- sessionId + 1
7575
sessions.[myid] <- session
7676
proc.Start() |> ignore
77-
Some session
77+
Ok session
7878

7979

8080
let attachFirstSession svrpipe =
8181
sessions |> Seq.tryFind (fun kv -> kv.Value.server.IsNone)
82-
>>= fun kv ->
82+
>>= (fun kv ->
8383
let ns = {kv.Value with server = Some svrpipe}
8484
sessions.[kv.Key] <- ns
85-
Some ns
85+
Some ns)
86+
|> function | Some ns -> Ok ns | None -> Error -1
8687

8788
let serveSession (session: Session) =
8889
async {
@@ -130,11 +131,13 @@ let serve nvim stderrenc (pipe: NamedPipeServerStream) =
130131
| AttachFirst _ -> attachFirstSession pipe
131132

132133
match session with
133-
| None ->
134-
trace "Session unavailable for request %A" request
134+
| Error errno ->
135+
trace "Session unavailable for request %A, errno=%d" request errno
136+
do! fromInt32LE errno |> readonlymemory |> write pipe
135137
return()
136-
| Some session ->
138+
| Ok session ->
137139
trace "Request %A is attaching to session %d" request session.id
140+
do! fromInt32LE session.id |> readonlymemory |> write pipe
138141
do! serveSession session
139142
finally
140143
try
@@ -165,8 +168,14 @@ let fvrConnect (stdin: Stream) (verb: FVimRemoteVerb) =
165168
verb
166169
|> Json.serialize
167170
|> Text.Encoding.UTF8.GetBytes
168-
let len = fromInt32LE payload.Length
169-
stdin.Write(FVR_MAGIC, 0, FVR_MAGIC.Length)
170-
stdin.Write(len, 0, len.Length)
171-
stdin.Write(payload, 0, payload.Length)
172-
stdin.Flush()
171+
let intbuf = fromInt32LE payload.Length
172+
try
173+
stdin.Write(FVR_MAGIC, 0, FVR_MAGIC.Length)
174+
stdin.Write(intbuf, 0, intbuf.Length)
175+
stdin.Write(payload, 0, payload.Length)
176+
stdin.Flush()
177+
Async.StartAsTask(read stdin (intbuf.AsMemory())).Wait()
178+
toInt32LE intbuf
179+
with ex ->
180+
trace "%O" ex
181+
-10

neovim.fs

+8-2
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,21 @@ type Nvim() =
7575
let pipe = new System.IO.Pipes.NamedPipeClientStream(".", name, IO.Pipes.PipeDirection.InOut, IO.Pipes.PipeOptions.Asynchronous, TokenImpersonationLevel.Impersonation)
7676
pipe.Connect()
7777
trace "Connected, sending session request..."
78-
fvrConnect pipe verb
78+
let id = fvrConnect pipe verb
79+
if id < 0 then
80+
pipe.Dispose()
81+
failwithf "Remote daemon closed the connection with error code %d" id
7982
RemoteSession pipe
8083
| FVimRemote(pipe, Remote(prog, args), verb, _) ->
8184
let pname = Option.defaultValue defaultDaemonName pipe
8285
let paddr = pipeaddrUnix pname
8386
trace "Connecting to remote fvr session '%s'" paddr
8487
let proc = newProcess prog (args @ [paddr]) Text.Encoding.UTF8
8588
proc.Start() |> ignore
86-
fvrConnect proc.StandardInput.BaseStream verb
89+
let id = fvrConnect proc.StandardInput.BaseStream verb
90+
if id < 0 then
91+
proc.Kill()
92+
failwithf "Remote daemon closed the connection with error code %d" id
8793
TunneledSession proc
8894

8995
member this.start opts =

0 commit comments

Comments
 (0)