diff options
| author | Maximilian Krambach <[email protected]> | 2019-06-19 10:57:20 +0000 | 
|---|---|---|
| committer | Maximilian Krambach <[email protected]> | 2019-06-19 10:58:44 +0000 | 
| commit | f5e27a12d3fd22b95e83c03a5650659bfa2299b9 (patch) | |
| tree | 7ddac98f4f0a20ffc6d6a2aaf2ec25ddd5a7efd3 /lang/js/src/Connection.js | |
| parent | Post release updates (diff) | |
| download | gpgme-f5e27a12d3fd22b95e83c03a5650659bfa2299b9.tar.gz gpgme-f5e27a12d3fd22b95e83c03a5650659bfa2299b9.zip | |
js: Error handling for browser errors
--
* Connection.js
  - Add some meaningful nativeMessaging feedback for failing
    communication due to misconfiguration or other browser-originated
    fails
  - add an "isDisconnected" property
  - "isNativeHostUnknown" tries to match browser's feedback string if
    the browser does not find gpgme-json
* init.js
  - initialization will now reject with a more meaningful error if the
    configuration is not set up or other browser-based errors
    (chrome.runtime.lastError) are present. This should speed up
    the normal initialization (not having to waiting for a timeout
    any more in case of improper setup)
* errors.js
  - CONN_NATIVEMESSAGE: New error that passes the browser's
    nativeMessaging error
  - CONN_NO_CONFIG: native messaging error indicating that the
    nativeMessaging host was not set up properly
* unittests.js:
  - added the "isDisconnected" property to the startup tests
  - added tests for proper behavior of connection checks
Diffstat (limited to '')
| -rw-r--r-- | lang/js/src/Connection.js | 68 | 
1 files changed, 45 insertions, 23 deletions
| diff --git a/lang/js/src/Connection.js b/lang/js/src/Connection.js index 8a965479..923698a4 100644 --- a/lang/js/src/Connection.js +++ b/lang/js/src/Connection.js @@ -40,7 +40,15 @@ import { decode, atobArray, Utf8ArrayToStr } from './Helpers';  export class Connection{      constructor (){ +        this._connectionError = null;          this._connection = chrome.runtime.connectNative('gpgmejson'); +        this._connection.onDisconnect.addListener(() => { +            if (chrome.runtime.lastError) { +                this._connectionError = chrome.runtime.lastError.message; +            } else { +                this._connectionError = 'Disconnected without error message'; +            } +        });      }      /** @@ -50,9 +58,16 @@ export class Connection{          if (this._connection){              this._connection.disconnect();              this._connection = null; +            this._connectionError = 'Disconnect requested by gpgmejs';          }      } +    /** +     * Checks if the connection terminated with an error state +     */ +    get isDisconnected (){ +        return this._connectionError !== null; +    }      /**      * @typedef {Object} backEndDetails @@ -126,9 +141,17 @@ export class Connection{              this.disconnect();              return Promise.reject(gpgme_error('MSG_INCOMPLETE'));          } +        if (this.isDisconnected) { +            if ( this.isNativeHostUnknown === true) { +                return Promise.reject(gpgme_error('CONN_NO_CONFIG')); +            } else { +                return Promise.reject(gpgme_error( +                    'CONN_NO_CONNECT', this._connectionError)); +            } +        }          let chunksize = message.chunksize;          const me = this; -        return new Promise(function (resolve, reject){ +        const nativeCommunication = new Promise(function (resolve, reject){              let answer = new Answer(message);              let listener = function (msg) {                  if (!msg){ @@ -161,29 +184,21 @@ export class Connection{                  }              };              me._connection.onMessage.addListener(listener); -            if (permittedOperations[message.operation].pinentry){ -                return me._connection.postMessage(message.message); -            } else { -                return Promise.race([ -                    me._connection.postMessage(message.message), -                    function (resolve, reject){ -                        setTimeout(function (){ -                            me._connection.disconnect(); -                            reject(gpgme_error('CONN_TIMEOUT')); -                        }, 5000); -                    } -                ]).then(function (result){ -                    return result; -                }, function (reject){ -                    if (!(reject instanceof Error)) { -                        me._connection.disconnect(); -                        return gpgme_error('GNUPG_ERROR', reject); -                    } else { -                        return reject; -                    } -                }); -            } +            me._connection.postMessage(message.message);          }); +        if (permittedOperations[message.operation].pinentry === true) { +            return nativeCommunication; +        } else { +            return Promise.race([ +                nativeCommunication, +                new Promise(function (resolve, reject){ +                    setTimeout(function (){ +                        me._connection.disconnect(); +                        reject(gpgme_error('CONN_TIMEOUT')); +                    }, 5000); +                }) +            ]); +        }      }  } @@ -213,6 +228,13 @@ class Answer{      }      /** +     * Checks if an error matching browsers 'host not known' messages occurred +     */ +    get isNativeHostUnknown () { +        return this._connectionError === 'Specified native messaging host not found.'; +    } + +    /**       * Adds incoming base64 encoded data to the existing response       * @param {*} msg base64 encoded data.       * @returns {Boolean} | 
