aboutsummaryrefslogtreecommitdiff
path: root/src/msg.js
diff options
context:
space:
mode:
authorDeterminant <ted.sybil@gmail.com>2019-02-03 01:38:28 -0500
committerDeterminant <ted.sybil@gmail.com>2019-02-03 01:38:28 -0500
commit0ea5a1140c52d15ebb7f37862c1fabce5b80547b (patch)
tree6695085883d70c1e3fc177d983c82b5d95710c98 /src/msg.js
parent5552d53304a26f53172e1cc0d0f86e01131eaadd (diff)
abstract out MsgClient
Diffstat (limited to 'src/msg.js')
-rw-r--r--src/msg.js33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/msg.js b/src/msg.js
index c0aaf11..b6221ec 100644
--- a/src/msg.js
+++ b/src/msg.js
@@ -1,3 +1,4 @@
+/* global chrome */
const _updatePatterns = "updatePatterns";
const _getPatterns = "getPatterns";
const _updateCalendars = "updateCalendars";
@@ -48,3 +49,35 @@ export class Msg {
}
static inflate = obj => new Msg(obj.id, parseMsgType(obj.type), obj.data);
}
+
+export class MsgClient {
+ constructor(channelName) {
+ let port = chrome.runtime.connect({name: channelName});
+ const getCallBack = rcb => this.requestCallback;
+ port.onMessage.addListener(function(msg) {
+ console.log(msg);
+ let rcb = getCallBack(msg.type);
+ let cb = rcb.inFlight[msg.id];
+ console.assert(cb !== undefined);
+ rcb.ids.push(msg.id);
+ cb(msg);
+ });
+ this.port = port;
+ this.requestCallback = {inFlight: {}, ids: [], maxId: 0};
+ }
+
+ sendMsg = ({ type, data }) => {
+ let rcb = this.requestCallback;
+ let cb;
+ let pm = new Promise(resolve => { cb = resolve; });
+ let id;
+ if (rcb.ids.length > 0) {
+ id = rcb.ids.pop();
+ } else {
+ id = rcb.maxId++;
+ }
+ rcb.inFlight[id] = cb;
+ this.port.postMessage((new Msg(id, type, data)).deflate());
+ return pm;
+ }
+}