diff --git a/src/background/nativeMessaging.background.ts b/src/background/nativeMessaging.background.ts index 902ddee06a..ddd9317da8 100644 --- a/src/background/nativeMessaging.background.ts +++ b/src/background/nativeMessaging.background.ts @@ -143,7 +143,7 @@ export class NativeMessagingBackground { message.timestamp = Date.now(); const encrypted = await this.cryptoService.encrypt(JSON.stringify(message), this.sharedSecret); - this.port.postMessage({appId: this.appId, message: encrypted}); + this.postMessage({appId: this.appId, message: encrypted}); } getResponse(): Promise { @@ -152,6 +152,27 @@ export class NativeMessagingBackground { }); } + private postMessage(message: any) { + // Wrap in try-catch to when the port disconnected without triggering `onDisconnect`. + try { + this.port.postMessage(message); + } catch (e) { + // tslint:disable-next-line + console.error("NativeMessaging port disconnected, disconnecting."); + + this.sharedSecret = null; + this.privateKey = null; + this.connected = false; + + this.messagingService.send('showDialog', { + text: this.i18nService.t('nativeMessagingInvalidEncryptionDesc'), + title: this.i18nService.t('nativeMessagingInvalidEncryptionTitle'), + confirmText: this.i18nService.t('ok'), + type: 'error', + }); + } + } + private async onMessage(rawMessage: any) { const message = JSON.parse(await this.cryptoService.decryptToUtf8(rawMessage, this.sharedSecret)); @@ -229,7 +250,7 @@ export class NativeMessagingBackground { message.timestamp = Date.now(); - this.port.postMessage({appId: this.appId, message: message}); + this.postMessage({appId: this.appId, message: message}); } private async showFingerprintDialog() {