Просмотр исходного кода

Clear the application state if we did not start up correctly

Steven Silvester 7 лет назад
Родитель
Сommit
e8a348509e
2 измененных файлов с 37 добавлено и 13 удалено
  1. 4 1
      packages/apputils-extension/src/index.ts
  2. 33 12
      packages/coreutils/src/statedb.ts

+ 4 - 1
packages/apputils-extension/src/index.ts

@@ -164,7 +164,10 @@ const state: JupyterLabPlugin<IStateDB> = {
   autoStart: true,
   provides: IStateDB,
   activate: (app: JupyterLab) => {
-    const state = new StateDB({ namespace: app.info.namespace });
+    const state = new StateDB({
+      namespace: app.info.namespace,
+      when: app.restored.then(() => { /* no-op */ })
+    });
     const version = app.info.version;
     const key = 'statedb:version';
     const fetch = state.fetch(key);

+ 33 - 12
packages/coreutils/src/statedb.ts

@@ -88,6 +88,14 @@ class StateDB implements IStateDB {
    */
   constructor(options: StateDB.IOptions) {
     this.namespace = options.namespace;
+    let key = `${this.namespace}:stateDb:sentinel`;
+    let sentinel = window.localStorage.getItem(key);
+    if (sentinel) {
+      this._clear();
+    }
+    options.when.then(() => {
+      window.localStorage.removeItem(key);
+    });
   }
 
   /**
@@ -109,18 +117,7 @@ class StateDB implements IStateDB {
    * Clear the entire database.
    */
   clear(): Promise<void> {
-    const prefix = `${this.namespace}:`;
-    let i = window.localStorage.length;
-
-    while (i) {
-      let key = window.localStorage.key(--i);
-
-      if (key && key.indexOf(prefix) === 0) {
-        window.localStorage.removeItem(key);
-      }
-    }
-
-    return Promise.resolve(undefined);
+    return this._clear();
   }
 
   /**
@@ -250,6 +247,24 @@ class StateDB implements IStateDB {
       return Promise.reject(error);
     }
   }
+
+  /**
+   * Clear the entire database.
+   */
+  private _clear(): Promise<void> {
+    const prefix = `${this.namespace}:`;
+    let i = window.localStorage.length;
+
+    while (i) {
+      let key = window.localStorage.key(--i);
+
+      if (key && key.indexOf(prefix) === 0) {
+        window.localStorage.removeItem(key);
+      }
+    }
+
+    return Promise.resolve(undefined);
+  }
 }
 
 /**
@@ -266,6 +281,12 @@ namespace StateDB {
      * The namespace prefix for all state database entries.
      */
     namespace: string;
+
+    /**
+     * The Promise for when the state database should be considered
+     * initialized.
+     */
+    when: Promise<void>;
   }
 }