diff options
author | Determinant <ted.sybil@gmail.com> | 2019-02-03 01:38:28 -0500 |
---|---|---|
committer | Determinant <ted.sybil@gmail.com> | 2019-02-03 01:38:28 -0500 |
commit | 0ea5a1140c52d15ebb7f37862c1fabce5b80547b (patch) | |
tree | 6695085883d70c1e3fc177d983c82b5d95710c98 /src/msg.js | |
parent | 5552d53304a26f53172e1cc0d0f86e01131eaadd (diff) |
abstract out MsgClient
Diffstat (limited to 'src/msg.js')
-rw-r--r-- | src/msg.js | 33 |
1 files changed, 33 insertions, 0 deletions
@@ -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; + } +} |