aboutsummaryrefslogtreecommitdiff
path: root/src/msg.js
diff options
context:
space:
mode:
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;
+ }
+}