From 0ea5a1140c52d15ebb7f37862c1fabce5b80547b Mon Sep 17 00:00:00 2001 From: Determinant Date: Sun, 3 Feb 2019 01:38:28 -0500 Subject: abstract out MsgClient --- src/msg.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'src/msg.js') 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; + } +} -- cgit v1.2.3