瀏覽代碼

Factor out common things from the managers into a base manager.

Jason Grout 5 年之前
父節點
當前提交
9efd678485

+ 104 - 0
packages/services/src/basemanager.ts

@@ -0,0 +1,104 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+
+import { IObservableDisposable } from '@phosphor/disposable';
+import { ISignal, Signal } from '@phosphor/signaling';
+import { ServerConnection } from './serverconnection';
+
+/**
+ * Object which manages kernel instances for a given base url.
+ *
+ * #### Notes
+ * The manager is responsible for maintaining the state of kernel specs.
+ */
+export interface IManager extends IObservableDisposable {
+  /**
+   * A signal emitted when there is a connection failure.
+   * TODO: figure out the relationship between this and the other connection status signals for kernels.
+   */
+  connectionFailure: ISignal<IManager, ServerConnection.NetworkError>;
+
+  /**
+   * The server settings for the manager.
+   */
+  readonly serverSettings: ServerConnection.ISettings;
+
+  /**
+   * Whether the manager is ready.
+   */
+  readonly isReady: boolean;
+
+  /**
+   * A promise that resolves when the manager is initially ready.
+   */
+  readonly ready: Promise<void>;
+}
+
+export abstract class BaseManager implements IManager {
+  constructor(options: BaseManager.IOptions) {
+    this.serverSettings =
+      options.serverSettings || ServerConnection.makeSettings();
+  }
+  /**
+   * A signal emitted when the delegate is disposed.
+   */
+  get disposed(): ISignal<this, void> {
+    return this._disposed;
+  }
+
+  /**
+   * A signal emitted when there is a connection failure.
+   */
+  abstract connectionFailure: ISignal<this, Error>;
+
+  /**
+   * Test whether the delegate has been disposed.
+   */
+  get isDisposed(): boolean {
+    return this._isDisposed;
+  }
+
+  /**
+   * Test whether the manager is ready.
+   */
+  abstract isReady: boolean;
+
+  /**
+   * A promise that fulfills when the manager is ready.
+   */
+  abstract ready: Promise<void>;
+
+  /**
+   * Dispose of the delegate and invoke the callback function.
+   */
+  dispose(): void {
+    if (this.isDisposed) {
+      return;
+    }
+    this._disposed.emit(undefined);
+    Signal.clearData(this);
+  }
+
+  /**
+   * The server settings of the manager.
+   */
+  readonly serverSettings: ServerConnection.ISettings;
+
+  private _isDisposed = false;
+  private _disposed = new Signal<this, void>(this);
+}
+
+/**
+ * The namespace for `BaseManager` class statics.
+ */
+export namespace BaseManager {
+  /**
+   * The options used to initialize a SessionManager.
+   */
+  export interface IOptions {
+    /**
+     * The server settings for the manager.
+     */
+    serverSettings?: ServerConnection.ISettings;
+  }
+}

+ 2 - 6
packages/services/src/kernel/kernel.ts

@@ -16,6 +16,7 @@ import { DefaultKernel } from './default';
 import { KernelMessage } from './messages';
 
 import { KernelSpec } from '../kernelspec';
+import { IManager as IBaseManager } from '../basemanager';
 
 /**
  * A namespace for kernel types, interfaces, and type checker functions.
@@ -659,7 +660,7 @@ export namespace Kernel {
    * through polling the server. Use a manager if you want to be notified of
    * changes to kernels.
    */
-  export interface IManager extends IDisposable {
+  export interface IManager extends IBaseManager {
     /**
      * A signal emitted when the running kernels change.
      */
@@ -671,11 +672,6 @@ export namespace Kernel {
      */
     connectionFailure: ISignal<IManager, ServerConnection.NetworkError>;
 
-    /**
-     * The server settings for the manager.
-     */
-    serverSettings?: ServerConnection.ISettings;
-
     /**
      * Whether the manager is ready.
      */

+ 6 - 23
packages/services/src/kernel/manager.ts

@@ -12,6 +12,7 @@ import { ISignal, Signal } from '@phosphor/signaling';
 import { ServerConnection } from '..';
 
 import { Kernel } from './kernel';
+import { BaseManager } from '../basemanager';
 
 // TODO: Migrate kernel connection status etc. up to session
 // TODO: move session management work up to session manager rather than session objects
@@ -21,15 +22,14 @@ import { Kernel } from './kernel';
 /**
  * An implementation of a kernel manager.
  */
-export class KernelManager implements Kernel.IManager {
+export class KernelManager extends BaseManager implements Kernel.IManager {
   /**
    * Construct a new kernel manager.
    *
    * @param options - The default options for kernel.
    */
   constructor(options: KernelManager.IOptions = {}) {
-    this.serverSettings =
-      options.serverSettings || ServerConnection.makeSettings();
+    super(options);
 
     // Initialize internal data.
     this._ready = (async () => {
@@ -62,13 +62,6 @@ export class KernelManager implements Kernel.IManager {
    */
   readonly serverSettings: ServerConnection.ISettings;
 
-  /**
-   * Test whether the kernel manager is disposed.
-   */
-  get isDisposed(): boolean {
-    return this._isDisposed;
-  }
-
   /**
    * Test whether the manager is ready.
    */
@@ -114,13 +107,9 @@ export class KernelManager implements Kernel.IManager {
    * Dispose of the resources used by the manager.
    */
   dispose(): void {
-    if (this._isDisposed) {
-      return;
-    }
-    this._isDisposed = true;
     this._models.length = 0;
     this._pollModels.dispose();
-    Signal.clearData(this);
+    super.dispose();
   }
 
   /**
@@ -253,7 +242,7 @@ export class KernelManager implements Kernel.IManager {
       }
       throw err;
     });
-    if (this._isDisposed) {
+    if (this.isDisposed) {
       return;
     }
     if (!JSONExt.deepEqual(models, this._models)) {
@@ -297,7 +286,6 @@ export class KernelManager implements Kernel.IManager {
     }
   }
 
-  private _isDisposed = false;
   private _isReady = false;
   private _kernels = new Set<Kernel.IKernel>();
   private _models: Kernel.IModel[] = [];
@@ -314,12 +302,7 @@ export namespace KernelManager {
   /**
    * The options used to initialize a KernelManager.
    */
-  export interface IOptions {
-    /**
-     * The server settings for the manager.
-     */
-    serverSettings?: ServerConnection.ISettings;
-
+  export interface IOptions extends BaseManager.IOptions {
     /**
      * When the manager stops polling the API. Defaults to `when-hidden`.
      */

+ 7 - 23
packages/services/src/kernelspec/manager.ts

@@ -6,18 +6,19 @@ import { ServerConnection } from '../serverconnection';
 import { KernelSpec } from './kernelspec';
 import { ISignal, Signal } from '@phosphor/signaling';
 import { JSONExt } from '@phosphor/coreutils';
+import { BaseManager } from '../basemanager';
 /**
  * An implementation of a kernel manager.
  */
-export class KernelSpecManager implements KernelSpec.IManager {
+export class KernelSpecManager extends BaseManager
+  implements KernelSpec.IManager {
   /**
    * Construct a new kernel manager.
    *
    * @param options - The default options for kernel.
    */
   constructor(options: KernelSpecManager.IOptions = {}) {
-    this.serverSettings =
-      options.serverSettings || ServerConnection.makeSettings();
+    super(options);
 
     // Initialize internal data.
     this._ready = Promise.all([this.requestSpecs()])
@@ -51,13 +52,6 @@ export class KernelSpecManager implements KernelSpec.IManager {
    */
   readonly serverSettings: ServerConnection.ISettings;
 
-  /**
-   * Test whether the kernel manager is disposed.
-   */
-  get isDisposed(): boolean {
-    return this._isDisposed;
-  }
-
   /**
    * Test whether the manager is ready.
    */
@@ -97,12 +91,8 @@ export class KernelSpecManager implements KernelSpec.IManager {
    * Dispose of the resources used by the manager.
    */
   dispose(): void {
-    if (this._isDisposed) {
-      return;
-    }
-    this._isDisposed = true;
     this._pollSpecs.dispose();
-    Signal.clearData(this);
+    super.dispose();
   }
 
   /**
@@ -124,7 +114,7 @@ export class KernelSpecManager implements KernelSpec.IManager {
    */
   protected async requestSpecs(): Promise<void> {
     const specs = await KernelSpec.getSpecs(this.serverSettings);
-    if (this._isDisposed) {
+    if (this.isDisposed) {
       return;
     }
     if (!JSONExt.deepEqual(specs, this._specs)) {
@@ -133,7 +123,6 @@ export class KernelSpecManager implements KernelSpec.IManager {
     }
   }
 
-  private _isDisposed = false;
   private _isReady = false;
   private _connectionFailure = new Signal<this, Error>(this);
 
@@ -151,12 +140,7 @@ export namespace KernelSpecManager {
   /**
    * The options used to initialize a KernelManager.
    */
-  export interface IOptions {
-    /**
-     * The server settings for the manager.
-     */
-    serverSettings?: ServerConnection.ISettings;
-
+  export interface IOptions extends BaseManager.IOptions {
     /**
      * When the manager stops polling the API. Defaults to `when-hidden`.
      */

+ 0 - 2
packages/services/src/manager.ts

@@ -13,8 +13,6 @@ import { NbConvert, NbConvertManager } from './nbconvert';
 
 import { Contents, ContentsManager } from './contents';
 
-import { Kernel } from './kernel';
-
 import { KernelSpec, KernelSpecManager } from './kernelspec';
 
 import { Session, SessionManager } from './session';

+ 5 - 28
packages/services/src/session/manager.ts

@@ -12,6 +12,7 @@ import { ISignal, Signal } from '@phosphor/signaling';
 import { ServerConnection } from '../serverconnection';
 
 import { Session } from './session';
+import { BaseManager } from '../basemanager';
 
 /**
  * We have a session manager that maintains a list of models from the server.
@@ -27,15 +28,14 @@ import { Session } from './session';
 /**
  * An implementation of a session manager.
  */
-export class SessionManager implements Session.IManager {
+export class SessionManager extends BaseManager implements Session.IManager {
   /**
    * Construct a new session manager.
    *
    * @param options - The default options for each session.
    */
   constructor(options: SessionManager.IOptions = {}) {
-    this.serverSettings =
-      options.serverSettings || ServerConnection.makeSettings();
+    super(options);
 
     // Initialize internal data.
     this._ready = (async () => {
@@ -44,7 +44,6 @@ export class SessionManager implements Session.IManager {
         this._isReady = true;
       }
     })();
-
     // Start model polling with exponential backoff.
     this._pollModels = new Poll({
       auto: false,
@@ -76,18 +75,6 @@ export class SessionManager implements Session.IManager {
     return this._connectionFailure;
   }
 
-  /**
-   * Test whether the manager is disposed.
-   */
-  get isDisposed(): boolean {
-    return this._isDisposed;
-  }
-
-  /**
-   * The server settings of the manager.
-   */
-  readonly serverSettings: ServerConnection.ISettings;
-
   /**
    * Test whether the manager is ready.
    */
@@ -106,13 +93,9 @@ export class SessionManager implements Session.IManager {
    * Dispose of the resources used by the manager.
    */
   dispose(): void {
-    if (this.isDisposed) {
-      return;
-    }
-    this._isDisposed = true;
     this._models.length = 0;
     this._pollModels.dispose();
-    Signal.clearData(this);
+    super.dispose();
   }
 
   /**
@@ -336,7 +319,6 @@ export class SessionManager implements Session.IManager {
     }
   }
 
-  private _isDisposed = false;
   private _isReady = false;
   private _models: Session.IModel[] = [];
   private _pollModels: Poll;
@@ -353,12 +335,7 @@ export namespace SessionManager {
   /**
    * The options used to initialize a SessionManager.
    */
-  export interface IOptions {
-    /**
-     * The server settings for the manager.
-     */
-    serverSettings?: ServerConnection.ISettings;
-
+  export interface IOptions extends BaseManager.IOptions {
     /**
      * When the manager stops polling the API. Defaults to `when-hidden`.
      */

+ 6 - 22
packages/services/src/terminal/manager.ts

@@ -12,17 +12,18 @@ import { ISignal, Signal } from '@phosphor/signaling';
 import { ServerConnection } from '..';
 
 import { TerminalSession } from './terminal';
+import { BaseManager } from '../basemanager';
 
 /**
  * A terminal session manager.
  */
-export class TerminalManager implements TerminalSession.IManager {
+export class TerminalManager extends BaseManager
+  implements TerminalSession.IManager {
   /**
    * Construct a new terminal manager.
    */
   constructor(options: TerminalManager.IOptions = {}) {
-    this.serverSettings =
-      options.serverSettings || ServerConnection.makeSettings();
+    super(options);
 
     // Check if terminals are available
     if (!TerminalSession.isAvailable()) {
@@ -73,13 +74,6 @@ export class TerminalManager implements TerminalSession.IManager {
     return this._connectionFailure;
   }
 
-  /**
-   * Test whether the terminal manager is disposed.
-   */
-  get isDisposed(): boolean {
-    return this._isDisposed;
-  }
-
   /**
    * The server settings of the manager.
    */
@@ -96,13 +90,9 @@ export class TerminalManager implements TerminalSession.IManager {
    * Dispose of the resources used by the manager.
    */
   dispose(): void {
-    if (this.isDisposed) {
-      return;
-    }
-    this._isDisposed = true;
     this._models.length = 0;
     this._pollModels.dispose();
-    Signal.clearData(this);
+    super.dispose();
   }
 
   /**
@@ -323,7 +313,6 @@ export class TerminalManager implements TerminalSession.IManager {
     });
   }
 
-  private _isDisposed = false;
   private _isReady = false;
   private _models: TerminalSession.IModel[] = [];
   private _pollModels: Poll;
@@ -340,12 +329,7 @@ export namespace TerminalManager {
   /**
    * The options used to initialize a terminal manager.
    */
-  export interface IOptions {
-    /**
-     * The server settings used by the manager.
-     */
-    serverSettings?: ServerConnection.ISettings;
-
+  export interface IOptions extends BaseManager.IOptions {
     /**
      * When the manager stops polling the API. Defaults to `when-hidden`.
      */

+ 2 - 6
packages/services/src/terminal/terminal.ts

@@ -12,6 +12,7 @@ import { ISignal } from '@phosphor/signaling';
 import { ServerConnection } from '..';
 
 import { DefaultTerminalSession } from './default';
+import { IManager as IBaseManager } from '../basemanager';
 
 /**
  * The namespace for ISession statics.
@@ -204,7 +205,7 @@ export namespace TerminalSession {
    * The manager is responsible for maintaining the state of running
    * terminal sessions.
    */
-  export interface IManager extends IDisposable {
+  export interface IManager extends IBaseManager {
     /**
      * A signal emitted when the running terminals change.
      */
@@ -215,11 +216,6 @@ export namespace TerminalSession {
      */
     connectionFailure: ISignal<IManager, ServerConnection.NetworkError>;
 
-    /**
-     * The server settings for the manager.
-     */
-    readonly serverSettings: ServerConnection.ISettings;
-
     /**
      * Test whether the manager is ready.
      */