From 3d4cc154d476c78cf51f420d8690e41566c0823a Mon Sep 17 00:00:00 2001 From: Vadym Kaidalov Date: Mon, 26 Apr 2021 14:28:14 +0300 Subject: [PATCH 1/3] 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); } } From 7444026795553f7b755ffabc575682180feb5ee9 Mon Sep 17 00:00:00 2001 From: Vadym Kaidalov Date: Wed, 28 Apr 2021 16:41:10 +0300 Subject: [PATCH 2/3] Move `bandwidthSaveMode` to `JupyterLab.IInfo` of `@jupyterlab/application` --- packages/application/src/lab.ts | 31 ++++++++++++++-- packages/docmanager-extension/src/index.ts | 14 +++++-- packages/docmanager/src/manager.ts | 13 ++++++- packages/docmanager/src/savehandler.ts | 18 ++++----- packages/docmanager/test/savehandler.spec.ts | 2 +- packages/filebrowser-extension/src/index.ts | 16 ++++++-- packages/filebrowser/src/model.ts | 9 +++-- packages/hub-extension/src/index.ts | 19 ++++++++-- packages/services/src/manager.ts | 39 +------------------- 9 files changed, 95 insertions(+), 66 deletions(-) diff --git a/packages/application/src/lab.ts b/packages/application/src/lab.ts index eedc94feb363..b6d5f3c10b89 100644 --- a/packages/application/src/lab.ts +++ b/packages/application/src/lab.ts @@ -7,6 +7,8 @@ import { Base64ModelFactory } from '@jupyterlab/docregistry'; import { IRenderMime } from '@jupyterlab/rendermime-interfaces'; +import { ServiceManager } from '@jupyterlab/services'; + import { Token } from '@lumino/coreutils'; import { JupyterFrontEnd, JupyterFrontEndPlugin } from './frontend'; @@ -25,7 +27,17 @@ export class JupyterLab extends JupyterFrontEnd { * Construct a new JupyterLab object. */ constructor(options: JupyterLab.IOptions = { shell: new LabShell() }) { - super({ ...options, shell: options.shell || new LabShell() }); + super({ + ...options, + shell: options.shell || new LabShell(), + serviceManager: + options.serviceManager || + new ServiceManager({ + standby: () => { + return this._info.bandwidthSaveMode || 'when-hidden'; + } + }) + }); this.restored = this.shell.restored .then(() => undefined) .catch(() => undefined); @@ -164,7 +176,7 @@ export class JupyterLab extends JupyterFrontEnd { }); } - private _info: JupyterLab.IInfo; + private _info: JupyterLab.IInfo = JupyterLab.defaultInfo; private _paths: JupyterFrontEnd.IPaths; } @@ -214,6 +226,18 @@ export namespace JupyterLab { * Whether files are cached on the server. */ readonly filesCached: boolean; + + /** + * 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; } /** @@ -224,7 +248,8 @@ export namespace JupyterLab { deferred: { patterns: [], matches: [] }, disabled: { patterns: [], matches: [] }, mimeExtensions: [], - filesCached: PageConfig.getOption('cacheFiles').toLowerCase() === 'true' + filesCached: PageConfig.getOption('cacheFiles').toLowerCase() === 'true', + bandwidthSaveMode: false }; /** diff --git a/packages/docmanager-extension/src/index.ts b/packages/docmanager-extension/src/index.ts index 358aa0f02ff6..bdb42fee1faf 100644 --- a/packages/docmanager-extension/src/index.ts +++ b/packages/docmanager-extension/src/index.ts @@ -9,7 +9,8 @@ import { ILabShell, ILabStatus, JupyterFrontEnd, - JupyterFrontEndPlugin + JupyterFrontEndPlugin, + JupyterLab } from '@jupyterlab/application'; import { @@ -99,7 +100,8 @@ const docManagerPlugin: JupyterFrontEndPlugin = { ICommandPalette, ILabShell, IMainMenu, - ISessionContextDialogs + ISessionContextDialogs, + JupyterLab.IInfo ], activate: ( app: JupyterFrontEnd, @@ -109,7 +111,8 @@ const docManagerPlugin: JupyterFrontEndPlugin = { palette: ICommandPalette | null, labShell: ILabShell | null, mainMenu: IMainMenu | null, - sessionDialogs: ISessionContextDialogs | null + sessionDialogs: ISessionContextDialogs | null, + info: JupyterLab.IInfo | null ): IDocumentManager => { const trans = translator.load('jupyterlab'); const manager = app.serviceManager; @@ -147,7 +150,10 @@ const docManagerPlugin: JupyterFrontEndPlugin = { when, setBusy: (status && (() => status.setBusy())) ?? undefined, sessionDialogs: sessionDialogs || undefined, - translator + translator, + bandwidthSaveModeCallback: () => { + return info?.bandwidthSaveMode || false; + } }); // Register the file operations commands. diff --git a/packages/docmanager/src/manager.ts b/packages/docmanager/src/manager.ts index 242e91e0a509..0f85fa97c10a 100644 --- a/packages/docmanager/src/manager.ts +++ b/packages/docmanager/src/manager.ts @@ -49,6 +49,8 @@ export class DocumentManager implements IDocumentManager { */ constructor(options: DocumentManager.IOptions) { this.translator = options.translator || nullTranslator; + this._bandwidthSaveModeCallback = + options.bandwidthSaveModeCallback || (() => false); this.registry = options.registry; this.services = options.manager; this._dialogs = options.sessionDialogs || sessionContextDialogs; @@ -485,8 +487,8 @@ export class DocumentManager implements IDocumentManager { }); const handler = new SaveHandler({ context, - saveInterval: this.autosaveInterval, - services: this.services + bandwidthSaveModeCallback: this._bandwidthSaveModeCallback, + saveInterval: this.autosaveInterval }); Private.saveHandlerProperty.set(context, handler); void context.ready.then(() => { @@ -609,6 +611,7 @@ export class DocumentManager implements IDocumentManager { private _when: Promise; private _setBusy: (() => IDisposable) | undefined; private _dialogs: ISessionContext.IDialogs; + private _bandwidthSaveModeCallback: () => boolean; } /** @@ -653,6 +656,12 @@ export namespace DocumentManager { * The applicaton language translator. */ translator?: ITranslator; + + /** + * Autosaving should be paused while this callback function returns `true`. + * By default, it always returns `false`. + */ + bandwidthSaveModeCallback?: () => boolean; } /** diff --git a/packages/docmanager/src/savehandler.ts b/packages/docmanager/src/savehandler.ts index be3119b95d1d..f44dcd125f43 100644 --- a/packages/docmanager/src/savehandler.ts +++ b/packages/docmanager/src/savehandler.ts @@ -5,8 +5,6 @@ import { IDisposable } from '@lumino/disposable'; import { Signal } from '@lumino/signaling'; -import { ServiceManager } from '@jupyterlab/services'; - import { DocumentRegistry } from '@jupyterlab/docregistry'; /** @@ -21,7 +19,8 @@ export class SaveHandler implements IDisposable { */ constructor(options: SaveHandler.IOptions) { this._context = options.context; - this._services = options.services; + this._bandwidthSaveModeCallback = + options.bandwidthSaveModeCallback || (() => false); const interval = options.saveInterval || 120; this._minInterval = interval * 1000; this._interval = this._minInterval; @@ -94,7 +93,7 @@ export class SaveHandler implements IDisposable { return; } this._autosaveTimer = window.setTimeout(() => { - if (!this._services.bandwidthSaveMode) { + if (!this._bandwidthSaveModeCallback()) { this._save(); } }, this._interval); @@ -151,7 +150,7 @@ export class SaveHandler implements IDisposable { private _minInterval = -1; private _interval = -1; private _context: DocumentRegistry.Context; - private _services: ServiceManager.IManager; + private _bandwidthSaveModeCallback: () => boolean; private _isActive = false; private _inDialog = false; private _isDisposed = false; @@ -172,13 +171,14 @@ export namespace SaveHandler { context: DocumentRegistry.Context; /** - * The minimum save interval in seconds (default is two minutes). + * Autosaving should be paused while this callback function returns `true`. + * By default, it always returns `false`. */ - saveInterval?: number; + bandwidthSaveModeCallback?: () => boolean; /** - * A service manager instance. + * The minimum save interval in seconds (default is two minutes). */ - services: ServiceManager.IManager; + saveInterval?: number; } } diff --git a/packages/docmanager/test/savehandler.spec.ts b/packages/docmanager/test/savehandler.spec.ts index 2ff90dedd30d..e18985332be1 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, services: manager }); + handler = new SaveHandler({ context }); return context.initialize(true); }); diff --git a/packages/filebrowser-extension/src/index.ts b/packages/filebrowser-extension/src/index.ts index aaf5a192cc6b..3605e69f347e 100644 --- a/packages/filebrowser-extension/src/index.ts +++ b/packages/filebrowser-extension/src/index.ts @@ -11,7 +11,8 @@ import { ITreePathUpdater, IRouter, JupyterFrontEnd, - JupyterFrontEndPlugin + JupyterFrontEndPlugin, + JupyterLab } from '@jupyterlab/application'; import { @@ -253,14 +254,20 @@ const factory: JupyterFrontEndPlugin = { id: '@jupyterlab/filebrowser-extension:factory', provides: IFileBrowserFactory, requires: [IDocumentManager, ITranslator], - optional: [IStateDB, IRouter, JupyterFrontEnd.ITreeResolver], + optional: [ + IStateDB, + IRouter, + JupyterFrontEnd.ITreeResolver, + JupyterLab.IInfo + ], activate: async ( app: JupyterFrontEnd, docManager: IDocumentManager, translator: ITranslator, state: IStateDB | null, router: IRouter | null, - tree: JupyterFrontEnd.ITreeResolver | null + tree: JupyterFrontEnd.ITreeResolver | null, + info: JupyterLab.IInfo | null ): Promise => { const { commands } = app; const tracker = new WidgetTracker({ namespace }); @@ -274,6 +281,9 @@ const factory: JupyterFrontEndPlugin = { manager: docManager, driveName: options.driveName || '', refreshInterval: options.refreshInterval, + refreshStandby: () => { + return info?.bandwidthSaveMode || 'when-hidden'; + }, state: options.state === null ? undefined diff --git a/packages/filebrowser/src/model.ts b/packages/filebrowser/src/model.ts index 695e91cc82f9..f296e1f4da24 100644 --- a/packages/filebrowser/src/model.ts +++ b/packages/filebrowser/src/model.ts @@ -113,9 +113,7 @@ export class FileBrowserModel implements IDisposable { backoff: true, max: 300 * 1000 }, - standby: () => { - return services.bandwidthSaveMode || 'when-hidden'; - } + standby: options.refreshStandby || 'when-hidden' }); } @@ -700,6 +698,11 @@ export namespace FileBrowserModel { */ refreshInterval?: number; + /** + * When the model stops polling the API. Defaults to `when-hidden`. + */ + refreshStandby?: Poll.Standby | (() => boolean | Poll.Standby); + /** * An optional state database. If provided, the model will restore which * folder was last opened when it is restored. diff --git a/packages/hub-extension/src/index.ts b/packages/hub-extension/src/index.ts index 15e4eabaaaf6..c7b76b4a946f 100644 --- a/packages/hub-extension/src/index.ts +++ b/packages/hub-extension/src/index.ts @@ -13,7 +13,8 @@ import { ConnectionLost, IConnectionLost, JupyterFrontEnd, - JupyterFrontEndPlugin + JupyterFrontEndPlugin, + JupyterLab } from '@jupyterlab/application'; import { URLExt } from '@jupyterlab/coreutils'; @@ -128,10 +129,12 @@ const hubExtension: JupyterFrontEndPlugin = { const connectionlost: JupyterFrontEndPlugin = { id: '@jupyterlab/apputils-extension:connectionlost', requires: [JupyterFrontEnd.IPaths, ITranslator], + optional: [JupyterLab.IInfo], activate: ( app: JupyterFrontEnd, paths: JupyterFrontEnd.IPaths, - translator: ITranslator + translator: ITranslator, + info: JupyterLab.IInfo | null ): IConnectionLost => { const trans = translator.load('jupyterlab'); const hubPrefix = paths.urls.hubPrefix || ''; @@ -152,8 +155,12 @@ const connectionlost: JupyterFrontEndPlugin = { if (showingError) { return; } + showingError = true; - manager.bandwidthSaveMode = true; + if (info) { + info.bandwidthSaveMode = true; + } + const result = await showDialog({ title: trans.__('Server unavailable or unreachable'), body: trans.__( @@ -165,8 +172,12 @@ const connectionlost: JupyterFrontEndPlugin = { Dialog.cancelButton({ label: trans.__('Dismiss') }) ] }); - manager.bandwidthSaveMode = false; + + if (info) { + info.bandwidthSaveMode = false; + } showingError = false; + if (result.button.accept) { await app.commands.execute(CommandIDs.restart); } diff --git a/packages/services/src/manager.ts b/packages/services/src/manager.ts index edc86ceb5b14..a328f5730e91 100644 --- a/packages/services/src/manager.ts +++ b/packages/services/src/manager.ts @@ -37,12 +37,7 @@ export class ServiceManager implements ServiceManager.IManager { const defaultDrive = options.defaultDrive; const serverSettings = options.serverSettings ?? ServerConnection.makeSettings(); - - const standby = - options.standby ?? - (() => { - return this.bandwidthSaveMode || 'when-hidden'; - }); + const standby = options.standby ?? 'when-hidden'; const normalized = { defaultDrive, serverSettings, standby }; const kernelManager = new KernelManager(normalized); @@ -163,23 +158,6 @@ 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); } @@ -188,7 +166,6 @@ export class ServiceManager implements ServiceManager.IManager { private _readyPromise: Promise; private _connectionFailure = new Signal(this); private _isReady = false; - private _bandwidthSaveMode = false; } /** @@ -258,18 +235,6 @@ 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; } /** @@ -287,7 +252,7 @@ export namespace ServiceManager { readonly defaultDrive?: Contents.IDrive; /** - * When the manager stops polling the API. + * When the manager stops polling the API. Defaults to `when-hidden`. */ standby?: Poll.Standby | (() => boolean | Poll.Standby); } From 2775683f5ad0ff87b1c573e14e09df8decab2265 Mon Sep 17 00:00:00 2001 From: Vadym Kaidalov Date: Tue, 10 Aug 2021 22:48:44 +0300 Subject: [PATCH 3/3] Rename `bandwidthSaveMode` to `isConnected` in `JupyterLab.IInfo` --- packages/application/src/lab.ts | 12 ++++++------ packages/docmanager-extension/src/index.ts | 7 +++++-- packages/docmanager/src/manager.ts | 13 ++++++------- packages/docmanager/src/savehandler.ts | 13 ++++++------- packages/filebrowser-extension/src/index.ts | 5 ++++- packages/hub-extension/src/index.ts | 4 ++-- 6 files changed, 29 insertions(+), 25 deletions(-) diff --git a/packages/application/src/lab.ts b/packages/application/src/lab.ts index aa001fdbccd1..6bf610aa9059 100644 --- a/packages/application/src/lab.ts +++ b/packages/application/src/lab.ts @@ -26,7 +26,7 @@ export class JupyterLab extends JupyterFrontEnd { options.serviceManager || new ServiceManager({ standby: () => { - return this._info.bandwidthSaveMode || 'when-hidden'; + return !this._info.isConnected || 'when-hidden'; } }) }); @@ -221,15 +221,15 @@ export namespace JupyterLab { /** * Every periodic network polling should be paused while this is set - * to `true`. Extensions should use this value to decide whether to proceed + * to `false`. 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 + * The extensions may also set this value to `false` 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`. + * back to `true`. */ - bandwidthSaveMode: boolean; + isConnected: boolean; } /** @@ -241,7 +241,7 @@ export namespace JupyterLab { disabled: { patterns: [], matches: [] }, mimeExtensions: [], filesCached: PageConfig.getOption('cacheFiles').toLowerCase() === 'true', - bandwidthSaveMode: false + isConnected: true }; /** diff --git a/packages/docmanager-extension/src/index.ts b/packages/docmanager-extension/src/index.ts index 0ae2a9100955..279d5c2c07be 100644 --- a/packages/docmanager-extension/src/index.ts +++ b/packages/docmanager-extension/src/index.ts @@ -143,8 +143,11 @@ const docManagerPlugin: JupyterFrontEndPlugin = { translator, collaborative: true, docProviderFactory: docProviderFactory ?? undefined, - bandwidthSaveModeCallback: () => { - return info?.bandwidthSaveMode || false; + isConnectedCallback: () => { + if (info) { + return info.isConnected; + } + return true; } }); diff --git a/packages/docmanager/src/manager.ts b/packages/docmanager/src/manager.ts index b94cccf2655d..d2089dde586a 100644 --- a/packages/docmanager/src/manager.ts +++ b/packages/docmanager/src/manager.ts @@ -37,13 +37,12 @@ export class DocumentManager implements IDocumentManager { */ constructor(options: DocumentManager.IOptions) { this.translator = options.translator || nullTranslator; - this._bandwidthSaveModeCallback = - options.bandwidthSaveModeCallback || (() => false); this.registry = options.registry; this.services = options.manager; this._collaborative = !!options.collaborative; this._dialogs = options.sessionDialogs || sessionContextDialogs; this._docProviderFactory = options.docProviderFactory; + this._isConnectedCallback = options.isConnectedCallback || (() => true); this._opener = options.opener; this._when = options.when || options.manager.ready; @@ -479,7 +478,7 @@ export class DocumentManager implements IDocumentManager { }); const handler = new SaveHandler({ context, - bandwidthSaveModeCallback: this._bandwidthSaveModeCallback, + isConnectedCallback: this._isConnectedCallback, saveInterval: this.autosaveInterval }); Private.saveHandlerProperty.set(context, handler); @@ -605,7 +604,7 @@ export class DocumentManager implements IDocumentManager { private _dialogs: ISessionContext.IDialogs; private _docProviderFactory: IDocumentProviderFactory | undefined; private _collaborative: boolean; - private _bandwidthSaveModeCallback: () => boolean; + private _isConnectedCallback: () => boolean; } /** @@ -663,10 +662,10 @@ export namespace DocumentManager { collaborative?: boolean; /** - * Autosaving should be paused while this callback function returns `true`. - * By default, it always returns `false`. + * Autosaving should be paused while this callback function returns `false`. + * By default, it always returns `true`. */ - bandwidthSaveModeCallback?: () => boolean; + isConnectedCallback?: () => boolean; } /** diff --git a/packages/docmanager/src/savehandler.ts b/packages/docmanager/src/savehandler.ts index 9aed0ce30e31..1ea9b71ff55f 100644 --- a/packages/docmanager/src/savehandler.ts +++ b/packages/docmanager/src/savehandler.ts @@ -17,8 +17,7 @@ export class SaveHandler implements IDisposable { */ constructor(options: SaveHandler.IOptions) { this._context = options.context; - this._bandwidthSaveModeCallback = - options.bandwidthSaveModeCallback || (() => false); + this._isConnectedCallback = options.isConnectedCallback || (() => true); const interval = options.saveInterval || 120; this._minInterval = interval * 1000; this._interval = this._minInterval; @@ -91,7 +90,7 @@ export class SaveHandler implements IDisposable { return; } this._autosaveTimer = window.setTimeout(() => { - if (!this._bandwidthSaveModeCallback()) { + if (this._isConnectedCallback()) { this._save(); } }, this._interval); @@ -148,7 +147,7 @@ export class SaveHandler implements IDisposable { private _minInterval = -1; private _interval = -1; private _context: DocumentRegistry.Context; - private _bandwidthSaveModeCallback: () => boolean; + private _isConnectedCallback: () => boolean; private _isActive = false; private _inDialog = false; private _isDisposed = false; @@ -169,10 +168,10 @@ export namespace SaveHandler { context: DocumentRegistry.Context; /** - * Autosaving should be paused while this callback function returns `true`. - * By default, it always returns `false`. + * Autosaving should be paused while this callback function returns `false`. + * By default, it always returns `true`. */ - bandwidthSaveModeCallback?: () => boolean; + isConnectedCallback?: () => boolean; /** * The minimum save interval in seconds (default is two minutes). diff --git a/packages/filebrowser-extension/src/index.ts b/packages/filebrowser-extension/src/index.ts index 91f883a2a1dc..cd39f4e90cdc 100644 --- a/packages/filebrowser-extension/src/index.ts +++ b/packages/filebrowser-extension/src/index.ts @@ -275,7 +275,10 @@ const factory: JupyterFrontEndPlugin = { driveName: options.driveName || '', refreshInterval: options.refreshInterval, refreshStandby: () => { - return info?.bandwidthSaveMode || 'when-hidden'; + if (info) { + return !info.isConnected || 'when-hidden'; + } + return 'when-hidden'; }, state: options.state === null diff --git a/packages/hub-extension/src/index.ts b/packages/hub-extension/src/index.ts index 5099c60edeef..647125a74fa0 100644 --- a/packages/hub-extension/src/index.ts +++ b/packages/hub-extension/src/index.ts @@ -155,7 +155,7 @@ const connectionlost: JupyterFrontEndPlugin = { showingError = true; if (info) { - info.bandwidthSaveMode = true; + info.isConnected = false; } const result = await showDialog({ @@ -171,7 +171,7 @@ const connectionlost: JupyterFrontEndPlugin = { }); if (info) { - info.bandwidthSaveMode = false; + info.isConnected = true; } showingError = false;