From bff474955ef72b948d218979280aff7f3221518e Mon Sep 17 00:00:00 2001 From: "Afshin T. Darian" Date: Mon, 23 Mar 2020 14:08:58 +0000 Subject: [PATCH] Throttle setting registry fetch requests at the connector level --- .../src/settingconnector.ts | 23 +++++++++++++++++-- packages/docmanager-extension/package.json | 1 - packages/docmanager-extension/src/index.ts | 13 +---------- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/packages/apputils-extension/src/settingconnector.ts b/packages/apputils-extension/src/settingconnector.ts index d64cf1ee8a0d..ab0bb44c1562 100644 --- a/packages/apputils-extension/src/settingconnector.ts +++ b/packages/apputils-extension/src/settingconnector.ts @@ -1,8 +1,10 @@ import { PageConfig } from '@jupyterlab/coreutils'; +import { ISettingRegistry } from '@jupyterlab/settingregistry'; + import { DataConnector, IDataConnector } from '@jupyterlab/statedb'; -import { ISettingRegistry } from '@jupyterlab/settingregistry'; +import { Throttler } from '@lumino/polling'; /** * A data connector for fetching settings. @@ -19,8 +21,24 @@ export class SettingConnector extends DataConnector< this._connector = connector; } + /** + * Fetch settings for a plugin. + * @param id - The plugin ID + * + * #### Notes + * The REST API requests are throttled at one request per plugin per 100ms. + */ fetch(id: string): Promise { - return this._connector.fetch(id); + const throttlers = this._throttlers; + if (!(id in throttlers)) { + throttlers[id] = new Throttler(async () => { + const fetched = await this._connector.fetch(id); + throttlers[id].dispose(); + delete throttlers[id]; + return fetched; + }, 100); + } + return throttlers[id].invoke(); } async list( @@ -44,4 +62,5 @@ export class SettingConnector extends DataConnector< } private _connector: IDataConnector; + private _throttlers: { [key: string]: Throttler } = Object.create(null); } diff --git a/packages/docmanager-extension/package.json b/packages/docmanager-extension/package.json index e900cf74b26e..fe90dbda54bb 100644 --- a/packages/docmanager-extension/package.json +++ b/packages/docmanager-extension/package.json @@ -48,7 +48,6 @@ "@lumino/algorithm": "^1.2.3", "@lumino/coreutils": "^1.4.2", "@lumino/disposable": "^1.3.5", - "@lumino/polling": "^1.1.1", "@lumino/widgets": "^1.11.1" }, "devDependencies": { diff --git a/packages/docmanager-extension/src/index.ts b/packages/docmanager-extension/src/index.ts index 92e0b4811672..cfa34c99a1d2 100644 --- a/packages/docmanager-extension/src/index.ts +++ b/packages/docmanager-extension/src/index.ts @@ -44,8 +44,6 @@ import { IDisposable } from '@lumino/disposable'; import { Widget } from '@lumino/widgets'; -import { Throttler } from '@lumino/polling'; - /** * The command IDs used by the document manager plugin. */ @@ -244,18 +242,9 @@ ${fileTypes}`; } }); - // callback to registry change that ensures not to invoke reload method when there is already a promise that is pending - let reloadSettingsRegistry = () => { - let reloadThrottle = new Throttler(() => - settingRegistry.reload(pluginId) - ); - - return reloadThrottle.invoke.bind(reloadThrottle); - }; - // If the document registry gains or loses a factory or file type, // regenerate the settings description with the available options. - registry.changed.connect(reloadSettingsRegistry()); + registry.changed.connect(() => settingRegistry.reload(pluginId)); return docManager; }