summaryrefslogtreecommitdiffhomepage
path: root/app/lib
diff options
context:
space:
mode:
authorErik Larkö <erik@mullvad.net>2017-05-23 15:53:42 +0200
committerErik Larkö <erik@mullvad.net>2017-05-23 15:53:42 +0200
commit8034e21467dac5dfdacb94fde2f6aa5010b1b266 (patch)
tree7d29944a26c8b367b6f3bd86eeb47a0c85ec6068 /app/lib
parent62a40a9d3fcd24a13cf8ee998fda68b89441c2b1 (diff)
parent4caada3dbe8e801355b8accab38495d6f41655a1 (diff)
downloadmullvadvpn-8034e21467dac5dfdacb94fde2f6aa5010b1b266.tar.xz
mullvadvpn-8034e21467dac5dfdacb94fde2f6aa5010b1b266.zip
Merge branch 'jsonrpc-subscriptions'
Diffstat (limited to 'app/lib')
-rw-r--r--app/lib/backend.js4
-rw-r--r--app/lib/ipc.js45
2 files changed, 41 insertions, 8 deletions
diff --git a/app/lib/backend.js b/app/lib/backend.js
index cfd6596bdb..1a0daf005f 100644
--- a/app/lib/backend.js
+++ b/app/lib/backend.js
@@ -389,8 +389,8 @@ export default class Backend extends EventEmitter {
_registerIpcListeners() {
- this._ipc.on('connection-info', (newConnectionInfo) => {
+ /*this._ipc.on('connection-info', (newConnectionInfo) => {
log.info('Got new connection info from backend', newConnectionInfo);
- });
+ });*/
}
}
diff --git a/app/lib/ipc.js b/app/lib/ipc.js
index 6b548b8414..81fad0c1ef 100644
--- a/app/lib/ipc.js
+++ b/app/lib/ipc.js
@@ -8,12 +8,20 @@ export default class Ipc {
this._connectionString = connectionString;
this._onConnect = [];
this._unansweredRequests = {};
+ this._subscriptions = {};
this._reconnect();
}
- on(event/*, listener*/) {
+ on(event, listener) {
+ // We're currently not actually using the event parameter.
+ // This is because we aren't sure if the backend will use
+ // one subscription per event or one subscription per
+ // event source.
+
log.info('Adding a listener to', event);
+ this.send('event_subscribe')
+ .then(subscriptionId => this._subscriptions[subscriptionId] = listener);
}
send(action, ...data) {
@@ -53,15 +61,40 @@ export default class Ipc {
const json = JSON.parse(message);
const c = jsonrpc.parseObject(json);
- const id = c.payload.id;
+ if (c.type === 'notification') {
+ this._onNotification(c);
+ } else {
+ this._onReply(c);
+ }
+ }
+
+ _onNotification(message) {
+ const subscriptionId = message.payload.params.subscription;
+ const listener = this._subscriptions[subscriptionId];
+
+ if (listener) {
+ log.debug('Got notification', message.payload.method, message.payload.params.result);
+ listener(message.payload.params.result);
+ } else {
+ log.warn('Got notification for', message.payload.method, 'but no one is listening for it');
+ }
+ }
+
+ _onReply(message) {
+ const id = message.payload.id;
const request = this._unansweredRequests[id];
delete this._unansweredRequests[id];
- log.debug('Got answer to', id, c.type);
- if (c.type === 'error') {
- request.reject(c.payload.error.message);
+ if (!request) {
+ log.warn('Got reply to', id, 'but no one was waiting for it');
+ return;
+ }
+
+ log.debug('Got answer to', id, message.type);
+ if (message.type === 'error') {
+ request.reject(message.payload.error.message);
} else {
- const reply = c.payload.result;
+ const reply = message.payload.result;
request.resolve(reply);
}
}