mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
fix(lsp): buffer messages until connected to server (#28507)
`handle:write(msg)` can fail if the socket is not yet connected to the server. Should address https://github.com/neovim/neovim/pull/28398#issuecomment-2078152491
This commit is contained in:
parent
a736e845a4
commit
47dbda97d2
@ -645,9 +645,23 @@ function M.connect(host_or_path, port)
|
|||||||
or assert(uv.new_tcp(), 'Could not create new TCP socket')
|
or assert(uv.new_tcp(), 'Could not create new TCP socket')
|
||||||
)
|
)
|
||||||
local closing = false
|
local closing = false
|
||||||
|
-- Connect returns a PublicClient synchronously so the caller
|
||||||
|
-- can immediately send messages before the connection is established
|
||||||
|
-- -> Need to buffer them until that happens
|
||||||
|
local connected = false
|
||||||
|
-- size should be enough because the client can't really do anything until initialization is done
|
||||||
|
-- which required a response from the server - implying the connection got established
|
||||||
|
local msgbuf = vim.ringbuf(10)
|
||||||
local transport = {
|
local transport = {
|
||||||
write = function(msg)
|
write = function(msg)
|
||||||
handle:write(msg)
|
if connected then
|
||||||
|
local _, err = handle:write(msg)
|
||||||
|
if err and not closing then
|
||||||
|
log.error('Error on handle:write: %q', err)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
msgbuf:push(msg)
|
||||||
|
end
|
||||||
end,
|
end,
|
||||||
is_closing = function()
|
is_closing = function()
|
||||||
return closing
|
return closing
|
||||||
@ -679,6 +693,10 @@ function M.connect(host_or_path, port)
|
|||||||
handle:read_start(M.create_read_loop(handle_body, transport.terminate, function(read_err)
|
handle:read_start(M.create_read_loop(handle_body, transport.terminate, function(read_err)
|
||||||
client:on_error(M.client_errors.READ_ERROR, read_err)
|
client:on_error(M.client_errors.READ_ERROR, read_err)
|
||||||
end))
|
end))
|
||||||
|
connected = true
|
||||||
|
for msg in msgbuf do
|
||||||
|
handle:write(msg)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if port == nil then
|
if port == nil then
|
||||||
handle:connect(host_or_path, on_connect)
|
handle:connect(host_or_path, on_connect)
|
||||||
|
Loading…
Reference in New Issue
Block a user