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

avoid multiple parallel passphrase prompts - fixes #4811

Eugene Pankov 4 лет назад
Родитель
Сommit
9d8e19622f
2 измененных файлов с 13 добавлено и 2 удалено
  1. 4 2
      tabby-core/src/services/vault.service.ts
  2. 9 0
      tabby-core/src/utils.ts

+ 4 - 2
tabby-core/src/services/vault.service.ts

@@ -3,7 +3,7 @@ import { promisify } from 'util'
 import { Injectable, NgZone } from '@angular/core'
 import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
 import { AsyncSubject, Subject, Observable } from 'rxjs'
-import { wrapPromise } from '../utils'
+import { wrapPromise, serializeFunction } from '../utils'
 import { UnlockVaultModalComponent } from '../components/unlockVaultModal.component'
 import { NotificationsService } from './notifications.service'
 import { SelectorService } from './selector.service'
@@ -114,7 +114,9 @@ export class VaultService {
         private zone: NgZone,
         private notifications: NotificationsService,
         private ngbModal: NgbModal,
-    ) { }
+    ) {
+        this.getPassphrase = serializeFunction(this.getPassphrase.bind(this))
+    }
 
     async setEnabled (enabled: boolean, passphrase?: string): Promise<void> {
         if (enabled) {

+ 9 - 0
tabby-core/src/utils.ts

@@ -64,3 +64,12 @@ export const TAB_COLORS = [
     { name: 'Red', value: '#d9534f' },
     { name: 'Yellow', value: '#ffd500' },
 ]
+
+export function serializeFunction <T extends () => Promise<any>> (fn: T): T {
+    let queue = Promise.resolve()
+    return (...args) => {
+        const res = queue.then(() => fn(...args))
+        queue = res.catch(() => null)
+        return res
+    }
+}