diff options
| author | Alex Yatskov <alex@foosoft.net> | 2019-09-05 20:21:07 -0700 | 
|---|---|---|
| committer | Alex Yatskov <alex@foosoft.net> | 2019-09-05 20:21:07 -0700 | 
| commit | cfc6363a01ee00e89866c54709006d6f55d093de (patch) | |
| tree | a03b1f79ba220e93c248ad8284fb01dc95b676a9 /ext/fg/js/frontend-api-receiver.js | |
| parent | 5347da528bd07166b4686f45440d80a77f4888a3 (diff) | |
| parent | c53263158b22f4be8e54696c4675f360f1813de8 (diff) | |
Merge branch 'master' into testing
Diffstat (limited to 'ext/fg/js/frontend-api-receiver.js')
| -rw-r--r-- | ext/fg/js/frontend-api-receiver.js | 62 | 
1 files changed, 62 insertions, 0 deletions
| diff --git a/ext/fg/js/frontend-api-receiver.js b/ext/fg/js/frontend-api-receiver.js new file mode 100644 index 00000000..687e5c3c --- /dev/null +++ b/ext/fg/js/frontend-api-receiver.js @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2019 Alex Yatskov <alex@foosoft.net> + * Author: Alex Yatskov <alex@foosoft.net> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + + +class FrontendApiReceiver { +    constructor(source='', handlers={}) { +        this.source = source; +        this.handlers = handlers; + +        chrome.runtime.onConnect.addListener(this.onConnect.bind(this)); +    } + +    onConnect(port) { +        if (port.name !== 'frontend-api-receiver') { return; } + +        port.onMessage.addListener(this.onMessage.bind(this, port)); +    } + +    onMessage(port, {id, action, params, target, senderId}) { +        if ( +            target !== this.source || +            !this.handlers.hasOwnProperty(action) +        ) { +            return; +        } + +        this.sendAck(port, id, senderId); + +        const handler = this.handlers[action]; +        handler(params).then( +            result => { +                this.sendResult(port, id, senderId, {result}); +            }, +            e => { +                const error = typeof e.toString === 'function' ? e.toString() : e; +                this.sendResult(port, id, senderId, {error}); +            }); +    } + +    sendAck(port, id, senderId) { +        port.postMessage({type: 'ack', id, senderId}); +    } + +    sendResult(port, id, senderId, data) { +        port.postMessage({type: 'result', id, senderId, data}); +    } +} |