2025-08-28 23:43:10 -04:00
|
|
|
-- For "--listen" and related functionality.
|
|
|
|
|
|
2025-07-28 10:10:04 +05:30
|
|
|
local M = {}
|
|
|
|
|
|
2026-04-17 18:14:14 +02:00
|
|
|
--- Called by builtin serverlist(). Returns the combined server list (own + peers).
|
2025-07-11 08:33:29 -04:00
|
|
|
---
|
2026-04-17 18:14:14 +02:00
|
|
|
--- @param opts? table Options:
|
|
|
|
|
--- - opts.peer is true, also discover peer servers.
|
|
|
|
|
--- @param addrs string[] Internal ("own") addresses, from `server_address_list`.
|
|
|
|
|
--- @return string[] # Combined list of servers (own + peers).
|
|
|
|
|
function M.serverlist(opts, addrs)
|
|
|
|
|
if type(opts) ~= 'table' or not opts.peer then
|
|
|
|
|
return addrs
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Discover peer servers in stdpath("run").
|
|
|
|
|
-- TODO: track TCP servers, somehow.
|
|
|
|
|
-- TODO: support Windows named pipes.
|
2025-08-28 19:11:31 +05:30
|
|
|
local root = vim.fs.normalize(vim.fn.stdpath('run') .. '/..')
|
2025-07-28 10:10:04 +05:30
|
|
|
local socket_paths = vim.fs.find(function(name, _)
|
|
|
|
|
return name:match('nvim.*')
|
2025-08-28 19:11:31 +05:30
|
|
|
end, { path = root, type = 'socket', limit = math.huge })
|
2025-07-28 10:10:04 +05:30
|
|
|
|
|
|
|
|
for _, socket in ipairs(socket_paths) do
|
2026-04-17 18:14:14 +02:00
|
|
|
if not vim.list_contains(addrs, socket) then
|
2025-07-28 10:10:04 +05:30
|
|
|
local ok, chan = pcall(vim.fn.sockconnect, 'pipe', socket, { rpc = true })
|
|
|
|
|
if ok and chan then
|
|
|
|
|
-- Check that the server is responding
|
|
|
|
|
-- TODO: do we need a timeout or error handling here?
|
|
|
|
|
if vim.fn.rpcrequest(chan, 'nvim_get_chan_info', 0).id then
|
2026-04-17 18:14:14 +02:00
|
|
|
table.insert(addrs, socket)
|
2025-07-28 10:10:04 +05:30
|
|
|
end
|
|
|
|
|
vim.fn.chanclose(chan)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2026-04-17 18:14:14 +02:00
|
|
|
return addrs
|
2025-07-28 10:10:04 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return M
|