From f03ac7649413344c5c8e2e2b93fed020d84d0283 Mon Sep 17 00:00:00 2001 From: Ioannis G Date: Wed, 5 Jul 2023 16:54:50 +0300 Subject: [PATCH] throttle PluginsManifest.UpdateManifestAsync avoid repeatedly fetching manifest data while the user is typing a `pm` query --- .../ExternalPlugins/PluginsManifest.cs | 13 +++++++--- .../Main.cs | 5 ++-- .../PluginsManager.cs | 26 +++---------------- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs b/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs index 2f12f3d6f..a9322b418 100644 --- a/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs +++ b/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs @@ -1,4 +1,4 @@ -using Flow.Launcher.Infrastructure.Logger; +using Flow.Launcher.Infrastructure.Logger; using System; using System.Collections.Generic; using System.Threading; @@ -16,6 +16,9 @@ namespace Flow.Launcher.Core.ExternalPlugins private static readonly SemaphoreSlim manifestUpdateLock = new(1); + private static DateTime lastFetchedAt = DateTime.MinValue; + private static TimeSpan fetchTimeout = TimeSpan.FromSeconds(10); + public static List UserPlugins { get; private set; } public static async Task UpdateManifestAsync(CancellationToken token = default) @@ -24,9 +27,13 @@ namespace Flow.Launcher.Core.ExternalPlugins { await manifestUpdateLock.WaitAsync(token).ConfigureAwait(false); - var results = await mainPluginStore.FetchAsync(token).ConfigureAwait(false); + if (UserPlugins == null || DateTime.Now.Subtract(lastFetchedAt) >= fetchTimeout) + { + var results = await mainPluginStore.FetchAsync(token).ConfigureAwait(false); - UserPlugins = results; + UserPlugins = results; + lastFetchedAt = DateTime.Now; + } } catch (Exception e) { diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs index cd554e4d0..52e8a8c26 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Main.cs @@ -1,4 +1,5 @@ -using Flow.Launcher.Plugin.PluginsManager.ViewModels; +using Flow.Launcher.Core.ExternalPlugins; +using Flow.Launcher.Plugin.PluginsManager.ViewModels; using Flow.Launcher.Plugin.PluginsManager.Views; using System.Collections.Generic; using System.Linq; @@ -34,7 +35,7 @@ namespace Flow.Launcher.Plugin.PluginsManager contextMenu = new ContextMenu(Context); pluginManager = new PluginsManager(Context, Settings); - _ = pluginManager.UpdateManifestAsync(); + await PluginsManifest.UpdateManifestAsync(); } public List LoadContextMenus(Result selectedResult) diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs index d74ec70b5..163c4751a 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs @@ -1,4 +1,4 @@ -using Flow.Launcher.Core.ExternalPlugins; +using Flow.Launcher.Core.ExternalPlugins; using Flow.Launcher.Core.Plugin; using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure.Http; @@ -49,26 +49,6 @@ namespace Flow.Launcher.Plugin.PluginsManager Settings = settings; } - private Task _downloadManifestTask = Task.CompletedTask; - - internal Task UpdateManifestAsync(CancellationToken token = default, bool silent = false) - { - if (_downloadManifestTask.Status == TaskStatus.Running) - { - return _downloadManifestTask; - } - else - { - _downloadManifestTask = PluginsManifest.UpdateManifestAsync(token); - if (!silent) - _downloadManifestTask.ContinueWith(_ => - Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_failed_title"), - Context.API.GetTranslation("plugin_pluginsmanager_update_failed_subtitle"), icoPath, false), - TaskContinuationOptions.OnlyOnFaulted); - return _downloadManifestTask; - } - } - internal List GetDefaultHotKeys() { return new List() @@ -184,7 +164,7 @@ namespace Flow.Launcher.Plugin.PluginsManager internal async ValueTask> RequestUpdateAsync(string search, CancellationToken token) { - await UpdateManifestAsync(token); + await PluginsManifest.UpdateManifestAsync(token); var resultsForUpdate = from existingPlugin in Context.API.GetAllPlugins() @@ -359,7 +339,7 @@ namespace Flow.Launcher.Plugin.PluginsManager internal async ValueTask> RequestInstallOrUpdate(string search, CancellationToken token) { - await UpdateManifestAsync(token); + await PluginsManifest.UpdateManifestAsync(token); if (Uri.IsWellFormedUriString(search, UriKind.Absolute) && search.Split('.').Last() == zip)