homebridge-gsh-kazari
Version:
88 lines (73 loc) • 2.15 kB
JavaScript
//
;
var extend = require('extend');
var URL = require('url');
var EventedHttpClient = require('./eventedHttpClient');
var debug = require('debug')('hapRequest');
var instances = {};
module.exports = hapRequest;
// organize params for patch, post, put, head, del
function initParams(uri, options, callback) {
if (typeof options === 'function') {
callback = options;
}
var params = {};
if (options !== null && typeof options === 'object') {
extend(params, options, {
uri: uri
});
} else if (typeof uri === 'string') {
extend(params, {
uri: uri
});
} else {
extend(params, uri);
}
params.callback = callback || params.callback;
return params;
}
function hapRequest(uri, options, callback) {
// debug("THIS", options.events);
if (typeof uri === 'undefined') {
throw new Error('undefined is not a valid uri or options object.');
}
var params = initParams(uri, options, callback);
if (params.method === 'HEAD' && paramsHaveRequestBody(params)) {
throw new Error('HTTP HEAD requests MUST NOT include a request body.');
}
return new hapRequest.Request(params);
}
// Helper functions
function paramsHaveRequestBody(params) {
return (
params.body ||
params.requestBodyStream ||
(params.json && typeof params.json !== 'boolean') ||
params.multipart
);
}
/**
* var q - Message queuing to prevent requests overstepping each other
*
* @param {type} function(request description
* @param {type} cb description
* @return {type} description
*/
hapRequest.Request = function(options) {
var instance = options.deviceID;
if (instances[instance]) {
// reuse existing HAP connection
if (instances[instance].connected) {
// debug('instance', instance);
instances[instance].request(options);
} else {
debug("Deleting unused connection", instance);
delete instances[instance];
instances[instance] = new EventedHttpClient(options);
}
} else {
// Create new HAP connection
instances[instance] = new EventedHttpClient(options);
}
// return eventBus;
};