divvy-lib
Version:
A JavaScript API for interacting with Divvy in Node.js and the browser
76 lines • 2.78 kB
JavaScript
/* eslint-disable new-cap */
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const _ = require("lodash");
const jayson = require("jayson");
const api_1 = require("./api");
/* istanbul ignore next */
function createHTTPServer(options, httpPort) {
const divvyAPI = new api_1.DivvyAPI(options);
const methodNames = _.filter(_.keys(api_1.DivvyAPI.prototype), k => {
return typeof api_1.DivvyAPI.prototype[k] === 'function'
&& k !== 'connect'
&& k !== 'disconnect'
&& k !== 'constructor'
&& k !== 'DivvyAPI';
});
function applyPromiseWithCallback(fnName, callback, args_) {
try {
let args = args_;
if (!_.isArray(args_)) {
const fnParameters = jayson.Utils.getParameterNames(divvyAPI[fnName]);
args = fnParameters.map(name => args_[name]);
const defaultArgs = _.omit(args_, fnParameters);
assert(_.size(defaultArgs) <= 1, 'Function must have no more than one default argument');
if (_.size(defaultArgs) > 0) {
args.push(defaultArgs[_.keys(defaultArgs)[0]]);
}
}
Promise.resolve(divvyAPI[fnName](...args))
.then(res => callback(null, res))
.catch(err => {
callback({ code: 99, message: err.message, data: { name: err.name } });
});
}
catch (err) {
callback({ code: 99, message: err.message, data: { name: err.name } });
}
}
const methods = {};
_.forEach(methodNames, fn => {
methods[fn] = jayson.Method((args, cb) => {
applyPromiseWithCallback(fn, cb, args);
}, { collect: true });
});
const server = jayson.server(methods);
let httpServer = null;
return {
server: server,
start: function () {
if (httpServer !== null) {
return Promise.reject('Already started');
}
return new Promise(resolve => {
divvyAPI.connect().then(() => {
httpServer = server.http();
httpServer.listen(httpPort, resolve);
});
});
},
stop: function () {
if (httpServer === null) {
return Promise.reject('Not started');
}
return new Promise(resolve => {
divvyAPI.disconnect();
httpServer.close(() => {
httpServer = null;
resolve();
});
});
}
};
}
exports.createHTTPServer = createHTTPServer;
//# sourceMappingURL=http.js.map
;