From 3d4cc154d476c78cf51f420d8690e41566c0823a Mon Sep 17 00:00:00 2001 From: Vadym Kaidalov Date: Mon, 26 Apr 2021 14:28:14 +0300 Subject: [PATCH] Add `bandwidthSaveMode` to `ServiceManager`, use it in `hub-extension` --- packages/docmanager/src/manager.ts | 3 +- packages/docmanager/src/savehandler.ts | 13 ++++++- packages/docmanager/test/savehandler.spec.ts | 2 +- packages/filebrowser/src/model.ts | 4 +- packages/hub-extension/src/index.ts | 2 + packages/services/src/kernel/manager.ts | 2 +- packages/services/src/kernelspec/manager.ts | 2 +- packages/services/src/manager.ts | 41 ++++++++++++++++++-- packages/services/src/session/manager.ts | 2 +- packages/services/src/terminal/manager.ts | 2 +- 10 files changed, 62 insertions(+), 11 deletions(-) diff --git a/packages/docmanager/src/manager.ts b/packages/docmanager/src/manager.ts index cfa9387c804a..242e91e0a509 100644 --- a/packages/docmanager/src/manager.ts +++ b/packages/docmanager/src/manager.ts @@ -485,7 +485,8 @@ export class DocumentManager implements IDocumentManager { }); const handler = new SaveHandler({ context, - saveInterval: this.autosaveInterval + saveInterval: this.autosaveInterval, + services: this.services }); Private.saveHandlerProperty.set(context, handler); void context.ready.then(() => { diff --git a/packages/docmanager/src/savehandler.ts b/packages/docmanager/src/savehandler.ts index 25eb3792089f..be3119b95d1d 100644 --- a/packages/docmanager/src/savehandler.ts +++ b/packages/docmanager/src/savehandler.ts @@ -5,6 +5,8 @@ import { IDisposable } from '@lumino/disposable'; import { Signal } from '@lumino/signaling'; +import { ServiceManager } from '@jupyterlab/services'; + import { DocumentRegistry } from '@jupyterlab/docregistry'; /** @@ -19,6 +21,7 @@ export class SaveHandler implements IDisposable { */ constructor(options: SaveHandler.IOptions) { this._context = options.context; + this._services = options.services; const interval = options.saveInterval || 120; this._minInterval = interval * 1000; this._interval = this._minInterval; @@ -91,7 +94,9 @@ export class SaveHandler implements IDisposable { return; } this._autosaveTimer = window.setTimeout(() => { - this._save(); + if (!this._services.bandwidthSaveMode) { + this._save(); + } }, this._interval); } @@ -146,6 +151,7 @@ export class SaveHandler implements IDisposable { private _minInterval = -1; private _interval = -1; private _context: DocumentRegistry.Context; + private _services: ServiceManager.IManager; private _isActive = false; private _inDialog = false; private _isDisposed = false; @@ -169,5 +175,10 @@ export namespace SaveHandler { * The minimum save interval in seconds (default is two minutes). */ saveInterval?: number; + + /** + * A service manager instance. + */ + services: ServiceManager.IManager; } } diff --git a/packages/docmanager/test/savehandler.spec.ts b/packages/docmanager/test/savehandler.spec.ts index e18985332be1..2ff90dedd30d 100644 --- a/packages/docmanager/test/savehandler.spec.ts +++ b/packages/docmanager/test/savehandler.spec.ts @@ -38,7 +38,7 @@ describe('docregistry/savehandler', () => { factory, path: UUID.uuid4() + '.txt' }); - handler = new SaveHandler({ context }); + handler = new SaveHandler({ context, services: manager }); return context.initialize(true); }); diff --git a/packages/filebrowser/src/model.ts b/packages/filebrowser/src/model.ts index 1d1d7454e527..695e91cc82f9 100644 --- a/packages/filebrowser/src/model.ts +++ b/packages/filebrowser/src/model.ts @@ -113,7 +113,9 @@ export class FileBrowserModel implements IDisposable { backoff: true, max: 300 * 1000 }, - standby: 'when-hidden' + standby: () => { + return services.bandwidthSaveMode || 'when-hidden'; + } }); } diff --git a/packages/hub-extension/src/index.ts b/packages/hub-extension/src/index.ts index 9f777fbb301d..15e4eabaaaf6 100644 --- a/packages/hub-extension/src/index.ts +++ b/packages/hub-extension/src/index.ts @@ -153,6 +153,7 @@ const connectionlost: JupyterFrontEndPlugin = { return; } showingError = true; + manager.bandwidthSaveMode = true; const result = await showDialog({ title: trans.__('Server unavailable or unreachable'), body: trans.__( @@ -164,6 +165,7 @@ const connectionlost: JupyterFrontEndPlugin = { Dialog.cancelButton({ label: trans.__('Dismiss') }) ] }); + manager.bandwidthSaveMode = false; showingError = false; if (result.button.accept) { await app.commands.execute(CommandIDs.restart); diff --git a/packages/services/src/kernel/manager.ts b/packages/services/src/kernel/manager.ts index 2f3c0702de9f..97516b13e7ce 100644 --- a/packages/services/src/kernel/manager.ts +++ b/packages/services/src/kernel/manager.ts @@ -337,6 +337,6 @@ export namespace KernelManager { /** * When the manager stops polling the API. Defaults to `when-hidden`. */ - standby?: Poll.Standby; + standby?: Poll.Standby | (() => boolean | Poll.Standby); } } diff --git a/packages/services/src/kernelspec/manager.ts b/packages/services/src/kernelspec/manager.ts index 717a771f2bf6..9ce1f92b40b8 100644 --- a/packages/services/src/kernelspec/manager.ts +++ b/packages/services/src/kernelspec/manager.ts @@ -147,6 +147,6 @@ export namespace KernelSpecManager { /** * When the manager stops polling the API. Defaults to `when-hidden`. */ - standby?: Poll.Standby; + standby?: Poll.Standby | (() => boolean | Poll.Standby); } } diff --git a/packages/services/src/manager.ts b/packages/services/src/manager.ts index cd4d93131f34..edc86ceb5b14 100644 --- a/packages/services/src/manager.ts +++ b/packages/services/src/manager.ts @@ -37,7 +37,12 @@ export class ServiceManager implements ServiceManager.IManager { const defaultDrive = options.defaultDrive; const serverSettings = options.serverSettings ?? ServerConnection.makeSettings(); - const standby = options.standby ?? 'when-hidden'; + + const standby = + options.standby ?? + (() => { + return this.bandwidthSaveMode || 'when-hidden'; + }); const normalized = { defaultDrive, serverSettings, standby }; const kernelManager = new KernelManager(normalized); @@ -158,6 +163,23 @@ export class ServiceManager implements ServiceManager.IManager { return this._readyPromise; } + /** + * Every periodic network polling should be paused while + * this is set to true. Extensions should use this value + * to decide whether to proceed with the polling. + * The extensions may also set this value to true if there is no need + * to fetch anything from the server backend basing on some conditions + * (e.g. when an error message dialog is displayed). + * At the same time, the extensions are responsible for setting + * this value back to false. + */ + get bandwidthSaveMode(): boolean { + return this._bandwidthSaveMode; + } + set bandwidthSaveMode(value: boolean) { + this._bandwidthSaveMode = value; + } + private _onConnectionFailure(sender: any, err: Error): void { this._connectionFailure.emit(err); } @@ -166,6 +188,7 @@ export class ServiceManager implements ServiceManager.IManager { private _readyPromise: Promise; private _connectionFailure = new Signal(this); private _isReady = false; + private _bandwidthSaveMode = false; } /** @@ -235,6 +258,18 @@ export namespace ServiceManager { * A signal emitted when there is a connection failure with the server. */ readonly connectionFailure: ISignal; + + /** + * Every periodic network polling should be paused while + * this is set to true. Extensions should use this value + * to decide whether to proceed with the polling. + * The extensions may also set this value to true if there is no need + * to fetch anything from the server backend basing on some conditions + * (e.g. when an error message dialog is displayed). + * At the same time, the extensions are responsible for setting + * this value back to false. + */ + bandwidthSaveMode: boolean; } /** @@ -252,8 +287,8 @@ export namespace ServiceManager { readonly defaultDrive?: Contents.IDrive; /** - * When the manager stops polling the API. Defaults to `when-hidden`. + * When the manager stops polling the API. */ - standby?: Poll.Standby; + standby?: Poll.Standby | (() => boolean | Poll.Standby); } } diff --git a/packages/services/src/session/manager.ts b/packages/services/src/session/manager.ts index 1e9d092a5516..c0b2f9aff56f 100644 --- a/packages/services/src/session/manager.ts +++ b/packages/services/src/session/manager.ts @@ -355,7 +355,7 @@ export namespace SessionManager { /** * When the manager stops polling the API. Defaults to `when-hidden`. */ - standby?: Poll.Standby; + standby?: Poll.Standby | (() => boolean | Poll.Standby); /** * Kernel Manager diff --git a/packages/services/src/terminal/manager.ts b/packages/services/src/terminal/manager.ts index 74840efe40f4..1c2dd89ba7c1 100644 --- a/packages/services/src/terminal/manager.ts +++ b/packages/services/src/terminal/manager.ts @@ -289,6 +289,6 @@ export namespace TerminalManager { /** * When the manager stops polling the API. Defaults to `when-hidden`. */ - standby?: Poll.Standby; + standby?: Poll.Standby | (() => boolean | Poll.Standby); } }