55 lines
1.5 KiB
JavaScript
55 lines
1.5 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
'use strict';
|
|
|
|
module.metadata = {
|
|
'stability': 'experimental'
|
|
};
|
|
|
|
var { request: hostReq, response: hostRes } = require('./host');
|
|
var { defer: async } = require('../lang/functional');
|
|
var { defer } = require('../core/promise');
|
|
var { emit: emitSync, on, off } = require('../event/core');
|
|
var { uuid } = require('../util/uuid');
|
|
var emit = async(emitSync);
|
|
|
|
// Map of IDs to deferreds
|
|
var requests = new Map();
|
|
|
|
// May not be necessary to wrap this in `async`
|
|
// once promises are async via bug 881047
|
|
var receive = async(function ({data, id, error}) {
|
|
let request = requests.get(id);
|
|
if (request) {
|
|
if (error) request.reject(error);
|
|
else request.resolve(clone(data));
|
|
requests.delete(id);
|
|
}
|
|
});
|
|
on(hostRes, 'data', receive);
|
|
|
|
/*
|
|
* Send is a helper to be used in client APIs to send
|
|
* a request to host
|
|
*/
|
|
function send (eventName, data) {
|
|
let id = uuid();
|
|
let deferred = defer();
|
|
requests.set(id, deferred);
|
|
emit(hostReq, 'data', {
|
|
id: id,
|
|
data: clone(data),
|
|
event: eventName
|
|
});
|
|
return deferred.promise;
|
|
}
|
|
exports.send = send;
|
|
|
|
/*
|
|
* Implement internal structured cloning algorithm in the future?
|
|
* http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#internal-structured-cloning-algorithm
|
|
*/
|
|
function clone (obj) JSON.parse(JSON.stringify(obj || {}))
|