homebridge-smartsystem
Version:
SmartServer (Proxy TCP sockets to the cloud, Smappee MQTT, Duotecno IP Nodes, Homekit interface)
125 lines • 6.04 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.httpRequest = exports.ContentType = void 0;
const logger_1 = require("../duotecno/logger");
const http = require("http");
//////////////////////////////////
// Home Assistant API //
// and other http based APIs //
//////////////////////////////////
var ContentType;
(function (ContentType) {
ContentType[ContentType["form"] = 0] = "form";
ContentType[ContentType["plain"] = 1] = "plain";
ContentType[ContentType["none"] = 2] = "none";
ContentType[ContentType["json"] = 3] = "json";
})(ContentType = exports.ContentType || (exports.ContentType = {}));
;
function httpRequest(url, method = "GET", formdata = "", contentType = ContentType.form, header = "") {
return __awaiter(this, void 0, void 0, function* () {
if (url.indexOf("://") === -1)
url = "http://" + url;
return new Promise((resolve, reject) => {
try {
// const data = querystring.stringify(formdata);
const options = { method };
if (formdata) {
if (contentType === ContentType.form) {
options.headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(formdata)
};
}
else if (contentType === ContentType.plain) {
options.headers = {
'Content-Type': 'text/plain',
'Accept': 'application/json'
};
}
else if (contentType === ContentType.json) {
options.headers = {
'Content-Type': 'application/json',
'Accept': '*/*'
};
}
}
;
// header provide as string or object
if (header) {
if (!options.headers)
options.headers = {};
if (typeof header === "string") {
if (header.substring(0, 1) === "{") {
try {
options.headers = Object.assign(Object.assign({}, options.headers), JSON.parse(header));
}
catch (e) {
(0, logger_1.err)("smartapp", "error parsing :" + header + " -> " + JSON.stringify(e));
}
}
else {
const s = header.split(":");
options.headers[s[0]] = s[1];
}
}
else {
// header is an object
options.headers = Object.assign(Object.assign({}, options.headers), header);
}
}
(0, logger_1.debug)("smartapp", "Sending to " + url + " with options: " + JSON.stringify(options));
const req = http.request(url, options, res => {
let resp = "";
// res.setEncoding('utf8');
res.on('error', error => {
(0, logger_1.log)("smartapp", "The request to " + url + ", error: " + (error ? error.message : "unknown"));
reject(error);
});
res.on('data', chunk => {
resp += chunk;
});
res.on('end', () => {
// try to make something out of it...
try {
const x = JSON.parse(resp);
if ((x.type === "Buffer") && x.data)
x.data = x.data.toString();
(0, logger_1.debug)("smartapp", "http " + method + " -> " + res.statusCode + ": " + url + " = " + JSON.stringify(x).substring(0, 200) + "...");
resolve(x);
}
catch (e) {
(0, logger_1.err)("smartapp", "http " + method + " -> " + res.statusCode + ": " + url + " = " + resp);
resolve({ status: "NOK", result: resp });
}
;
});
});
if (formdata) {
req.write(formdata);
}
req.on("error", (e) => {
(0, logger_1.log)("smartapp", "The request to " + url + ", error: " + (e ? e.message : "unknown"));
});
req.on("timeout", (e) => {
(0, logger_1.log)("smartapp", "The request to " + url + ", timeout: " + (e ? e.message : "unknown"));
});
req.end();
}
catch (e) {
(0, logger_1.log)("smartapp", "** http error ** " + (e ? e.message : "unknown") + " **");
reject(e);
}
});
});
}
exports.httpRequest = httpRequest;
//# sourceMappingURL=HA-API.js.map