Skip to content

Commit 75b8da7

Browse files
authored
fix(rpc): release registered rpc callbacks (#390)
perf(preview): improve preview label performance fix(preview): preview window label unchanged due to missing 'vim.rpcnotify' events
1 parent 52fb9ed commit 75b8da7

File tree

3 files changed

+69
-79
lines changed

3 files changed

+69
-79
lines changed

lua/fzfx/fzf_helpers.lua

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,16 +300,15 @@ local function send_http_post(port, body)
300300
"-s",
301301
"-S",
302302
"-q",
303-
"-k",
304303
"-Z",
305304
"--parallel-immediate",
306305
"--http2",
307306
"--retry",
308307
"0",
309308
"--connect-timeout",
310-
"0.5",
309+
"1",
311310
"-m",
312-
"0.5",
311+
"1",
313312
"--noproxy",
314313
"*",
315314
"-XPOST",

lua/fzfx/general.lua

Lines changed: 55 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,9 @@ function ProviderSwitch:switch(next_pipeline)
144144
self.pipeline = next_pipeline
145145
end
146146

147-
--- @param name string
148147
--- @param query string?
149148
--- @param context PipelineContext?
150-
function ProviderSwitch:provide(name, query, context)
149+
function ProviderSwitch:provide(query, context)
151150
local provider_config = self.provider_configs[self.pipeline]
152151
-- log.debug(
153152
-- "|fzfx.general - ProviderSwitch:provide| pipeline:%s, provider_config:%s, context:%s",
@@ -157,17 +156,15 @@ function ProviderSwitch:provide(name, query, context)
157156
-- )
158157
log.ensure(
159158
type(provider_config) == "table",
160-
"invalid provider config in %s! pipeline: %s, provider config: %s",
161-
vim.inspect(name),
159+
"invalid provider config in %s! provider config: %s",
162160
vim.inspect(self.pipeline),
163161
vim.inspect(provider_config)
164162
)
165163
log.ensure(
166164
type(provider_config.provider) == "table"
167165
or type(provider_config.provider) == "string"
168166
or type(provider_config.provider) == "function",
169-
"invalid provider in %s! pipeline: %s, provider: %s",
170-
vim.inspect(name),
167+
"invalid provider in %s! provider: %s",
171168
vim.inspect(self.pipeline),
172169
vim.inspect(provider_config)
173170
)
@@ -177,8 +174,7 @@ function ProviderSwitch:provide(name, query, context)
177174
or provider_config.provider_type == ProviderTypeEnum.COMMAND
178175
or provider_config.provider_type == ProviderTypeEnum.COMMAND_LIST
179176
or provider_config.provider_type == ProviderTypeEnum.LIST,
180-
"invalid provider type in %s! pipeline: %s, provider type: %s",
181-
vim.inspect(name),
177+
"invalid provider type in %s! provider type: %s",
182178
vim.inspect(self.pipeline),
183179
vim.inspect(provider_config)
184180
)
@@ -240,7 +236,7 @@ function ProviderSwitch:provide(name, query, context)
240236
utils.writefile(self.resultfile, "")
241237
log.err(
242238
"failed to call pipeline %s command provider %s! query:%s, context:%s, error:%s",
243-
vim.inspect(name),
239+
vim.inspect(self.pipeline),
244240
vim.inspect(provider_config),
245241
vim.inspect(query),
246242
vim.inspect(context),
@@ -271,7 +267,7 @@ function ProviderSwitch:provide(name, query, context)
271267
utils.writefile(self.resultfile, "")
272268
log.err(
273269
"failed to call pipeline %s command_list provider %s! query:%s, context:%s, error:%s",
274-
vim.inspect(name),
270+
vim.inspect(self.pipeline),
275271
vim.inspect(provider_config),
276272
vim.inspect(query),
277273
vim.inspect(context),
@@ -299,7 +295,7 @@ function ProviderSwitch:provide(name, query, context)
299295
utils.writefile(self.resultfile, "")
300296
log.err(
301297
"failed to call pipeline %s list provider %s! query:%s, context:%s, error:%s",
302-
vim.inspect(name),
298+
vim.inspect(self.pipeline),
303299
vim.inspect(provider_config),
304300
vim.inspect(query),
305301
vim.inspect(context),
@@ -335,10 +331,11 @@ end
335331
--- @class PreviewerSwitch
336332
--- @field pipeline PipelineName
337333
--- @field previewer_configs table<PipelineName, PreviewerConfig>
338-
--- @field previewer_labels table<PipelineName, string?>
334+
--- @field last_previewer_label string?
339335
--- @field metafile string
340336
--- @field resultfile string
341337
--- @field fzfportfile string
338+
--- @field fzfport string?
342339
local PreviewerSwitch = {}
343340

344341
--- @param name string
@@ -369,10 +366,11 @@ function PreviewerSwitch:new(name, pipeline, previewer_configs)
369366
local o = {
370367
pipeline = pipeline,
371368
previewer_configs = previewer_configs_map,
372-
previewer_labels = {},
369+
last_previewer_label = nil,
373370
metafile = _make_cache_filename("previewer", "metafile", name),
374371
resultfile = _make_cache_filename("previewer", "resultfile", name),
375372
fzfportfile = _make_cache_filename("previewer", "fzfport", name),
373+
fzfport = nil,
376374
}
377375
setmetatable(o, self)
378376
self.__index = self
@@ -385,11 +383,10 @@ function PreviewerSwitch:switch(next_pipeline)
385383
self.pipeline = next_pipeline
386384
end
387385

388-
--- @param name string
389386
--- @param line string
390387
--- @param context PipelineContext?
391388
--- @return PreviewerType
392-
function PreviewerSwitch:preview(name, line, context)
389+
function PreviewerSwitch:preview(line, context)
393390
local previewer_config = self.previewer_configs[self.pipeline]
394391
-- log.debug(
395392
-- "|fzfx.general - PreviewerSwitch:preview| pipeline:%s, previewer_config:%s, context:%s",
@@ -399,24 +396,21 @@ function PreviewerSwitch:preview(name, line, context)
399396
-- )
400397
log.ensure(
401398
type(previewer_config) == "table",
402-
"invalid previewer config in %s! pipeline: %s, previewer config: %s",
403-
vim.inspect(name),
399+
"invalid previewer config in %s! previewer config: %s",
404400
vim.inspect(self.pipeline),
405401
vim.inspect(previewer_config)
406402
)
407403
log.ensure(
408404
type(previewer_config.previewer) == "function",
409-
"invalid previewer in %s! pipeline: %s, previewer: %s",
410-
vim.inspect(name),
405+
"invalid previewer in %s! previewer: %s",
411406
vim.inspect(self.pipeline),
412407
vim.inspect(previewer_config)
413408
)
414409
log.ensure(
415410
previewer_config.previewer_type == PreviewerTypeEnum.COMMAND
416411
or previewer_config.previewer_type == PreviewerTypeEnum.COMMAND_LIST
417412
or previewer_config.previewer_type == PreviewerTypeEnum.LIST,
418-
"invalid previewer type in %s! pipeline: %s, previewer type: %s",
419-
vim.inspect(name),
413+
"invalid previewer type in %s! previewer type: %s",
420414
vim.inspect(self.pipeline),
421415
vim.inspect(previewer_config)
422416
)
@@ -436,7 +430,7 @@ function PreviewerSwitch:preview(name, line, context)
436430
utils.writefile(self.resultfile, "")
437431
log.err(
438432
"failed to call pipeline %s command previewer %s! line:%s, context:%s, error:%s",
439-
vim.inspect(name),
433+
vim.inspect(self.pipeline),
440434
vim.inspect(previewer_config.previewer),
441435
vim.inspect(line),
442436
vim.inspect(context),
@@ -468,7 +462,7 @@ function PreviewerSwitch:preview(name, line, context)
468462
utils.writefile(self.resultfile, "")
469463
log.err(
470464
"failed to call pipeline %s command_list previewer %s! line:%s, context:%s, error:%s",
471-
vim.inspect(name),
465+
vim.inspect(self.pipeline),
472466
vim.inspect(previewer_config.previewer),
473467
vim.inspect(line),
474468
vim.inspect(context),
@@ -502,7 +496,7 @@ function PreviewerSwitch:preview(name, line, context)
502496
utils.writefile(self.resultfile, "")
503497
log.err(
504498
"failed to call pipeline %s list previewer %s! line:%s, context:%s, error:%s",
505-
vim.inspect(name),
499+
vim.inspect(self.pipeline),
506500
vim.inspect(previewer_config.previewer),
507501
vim.inspect(line),
508502
vim.inspect(context),
@@ -526,11 +520,10 @@ function PreviewerSwitch:preview(name, line, context)
526520
return previewer_config.previewer_type
527521
end
528522

529-
--- @param name string
530523
--- @param line string?
531524
--- @param context PipelineContext
532525
--- @return string?
533-
function PreviewerSwitch:preview_label(name, line, context)
526+
function PreviewerSwitch:preview_label(line, context)
534527
local previewer_config = self.previewer_configs[self.pipeline]
535528
-- log.debug(
536529
-- "|fzfx.general - PreviewerSwitch:preview_label| pipeline:%s, previewer_config:%s, context:%s",
@@ -540,8 +533,7 @@ function PreviewerSwitch:preview_label(name, line, context)
540533
-- )
541534
log.ensure(
542535
type(previewer_config) == "table",
543-
"invalid previewer config in %s! pipeline: %s, previewer config: %s",
544-
vim.inspect(name),
536+
"invalid previewer config in %s! previewer config: %s",
545537
vim.inspect(self.pipeline),
546538
vim.inspect(previewer_config)
547539
)
@@ -550,8 +542,7 @@ function PreviewerSwitch:preview_label(name, line, context)
550542
or previewer_config.previewer_label == nil
551543
or type(previewer_config.previewer_label) == "boolean"
552544
or type(previewer_config.previewer_label) == "string",
553-
"invalid previewer label in %s! pipeline: %s, previewer: %s",
554-
vim.inspect(name),
545+
"invalid previewer label in %s! previewer: %s",
555546
vim.inspect(self.pipeline),
556547
vim.inspect(previewer_config)
557548
)
@@ -564,34 +555,38 @@ function PreviewerSwitch:preview_label(name, line, context)
564555
then
565556
return
566557
end
567-
local label = type(previewer_config.previewer_label) == "function"
568-
and previewer_config.previewer_label(line, context)
569-
or previewer_config.previewer_label
570-
log.debug(
571-
"|fzfx.general - PreviewerSwitch:preview_label| line:%s, label:%s",
572-
vim.inspect(line),
573-
vim.inspect(label)
574-
)
575-
if type(label) ~= "string" then
576-
return
577-
end
578-
self.previewer_labels[self.pipeline] = label
579558

580-
-- do it async/later
581-
vim.defer_fn(function()
582-
local last_label = self.previewer_labels[self.pipeline]
583-
self.previewer_labels[self.pipeline] = nil
584-
if type(last_label) ~= "string" then
559+
vim.schedule(function()
560+
local label = type(previewer_config.previewer_label) == "function"
561+
and previewer_config.previewer_label(line, context)
562+
or previewer_config.previewer_label
563+
log.debug(
564+
"|fzfx.general - PreviewerSwitch:preview_label| line:%s, label:%s",
565+
vim.inspect(line),
566+
vim.inspect(label)
567+
)
568+
if type(label) ~= "string" then
585569
return
586570
end
587-
local fzf_port = utils.readfile(self.fzfportfile) --[[@as string]]
588-
fzf_helpers.send_http_post(
589-
fzf_port,
590-
string.format("change-preview-label(%s)", vim.trim(last_label))
591-
)
592-
end, 100)
571+
self.last_previewer_label = label
572+
573+
-- do it async/later
574+
vim.defer_fn(function()
575+
local last_label = self.last_previewer_label
576+
self.last_previewer_label = nil
577+
if type(last_label) ~= "string" then
578+
return
579+
end
580+
self.fzfport = utils.string_not_empty(self.fzfport) and self.fzfport
581+
or utils.readfile(self.fzfportfile) --[[@as string]]
582+
fzf_helpers.send_http_post(
583+
self.fzfport,
584+
string.format("change-preview-label(%s)", vim.trim(last_label))
585+
)
586+
end, 200)
587+
end)
593588

594-
return label
589+
return self.pipeline
595590
end
596591

597592
-- previewer switch }
@@ -777,12 +772,12 @@ local function general(name, query, bang, pipeline_configs, default_pipeline)
777772

778773
--- @param query_params string
779774
local function provide_rpc(query_params)
780-
provider_switch:provide(name, query_params, context)
775+
provider_switch:provide(query_params, context)
781776
end
782777

783778
--- @param line_params string
784779
local function preview_rpc(line_params)
785-
previewer_switch:preview(name, line_params, context)
780+
previewer_switch:preview(line_params, context)
786781
end
787782

788783
local provide_rpc_id = server.get_rpc_server():register(provide_rpc)
@@ -829,14 +824,14 @@ local function general(name, query, bang, pipeline_configs, default_pipeline)
829824
if constants.has_curl then
830825
--- @param line_params string
831826
local function preview_label_rpc(line_params)
832-
previewer_switch:preview_label(name, line_params, context)
827+
previewer_switch:preview_label(line_params, context)
833828
end
834829
local preview_label_rpc_id =
835830
server.get_rpc_server():register(preview_label_rpc)
836831
table.insert(rpc_registries, preview_label_rpc_id)
837832
preview_label_command = string.format(
838833
"%s %s {}",
839-
fzf_helpers.make_lua_command("rpc", "notify.lua"),
834+
fzf_helpers.make_lua_command("rpc", "request.lua"),
840835
preview_label_rpc_id
841836
)
842837
log.debug(
@@ -1013,11 +1008,11 @@ local function general(name, query, bang, pipeline_configs, default_pipeline)
10131008
actions,
10141009
context,
10151010
function()
1016-
vim.schedule_wrap(function()
1011+
vim.defer_fn(function()
10171012
for _, rpc_id in ipairs(rpc_registries) do
10181013
server:get_rpc_server():unregister(rpc_id)
10191014
end
1020-
end)
1015+
end, 3000)
10211016
end
10221017
)
10231018
return p

0 commit comments

Comments
 (0)