e8fea54258e3d879ec6e554a41e8a1f134fd0880
[gpgme.git] / lang / js / src / Connection.js
1 /**
2  * A connection port will be opened for each communication between gpgmejs and
3  * gnupg. It should be alive as long as there are additional messages to be
4  * expected.
5  */
6
7 export function Connection(){
8     if (!this.connection){
9         this.connection = connect();
10         this._msg = {
11             'always-trust': true,
12             // 'no-encrypt-to': false,
13             // 'no-compress': true,
14             // 'throw-keyids': false,
15             // 'wrap': false,
16             'armor': true,
17             'base64': false
18         };
19     };
20
21     this.disconnect = function () {
22         if (this.connection){
23             this.connection.disconnect();
24         }
25     };
26
27     /**
28      * Sends a message and resolves with the answer.
29      * @param {*} operation The interaction requested from gpgme
30      * @param {*} message A json-capable object to pass the operation details.
31      * TODO: _msg should contain configurable parameters
32      */
33     this.post = function(operation, message){
34         let timeout = 5000;
35         let me = this;
36         if (!message || !operation){
37             return Promise.reject('no message'); // TBD
38         }
39
40         let keys = Object.keys(message);
41         for (let i=0; i < keys.length; i++){
42             let property = keys[i];
43             me._msg[property] = message[property];
44         }
45         me._msg['op'] = operation;
46         // TODO fancier checks if what we want is consistent with submitted content
47         return new Promise(function(resolve, reject){
48             me.connection.onMessage.addListener(function(msg) {
49                 if (!msg){
50                     reject('empty answer.');
51                 }
52                 if (msg.type === "error"){
53                     reject(msg.msg);
54                 }
55                     resolve(msg);
56             });
57
58             me.connection.postMessage(me._msg);
59             setTimeout(
60                 function(){
61                     me.disconnect();
62                     reject('Timeout');
63                 }, timeout);
64         });
65      };
66 };
67
68
69 function connect(){
70     let connection = chrome.runtime.connectNative('gpgmejson');
71     if (!connection){
72         let msg = chrome.runtime.lastError || 'no message'; //TBD
73         throw(msg);
74     }
75     return connection;
76 };