roku-ecp
Version:
A Node package designed to control Roku devices using TypeScript
49 lines (48 loc) • 1.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.discover = exports.parse = exports.queryString = void 0;
const node_ssdp_1 = require("node-ssdp");
const queryString = (params) => {
if (!params)
return "";
return ("?" +
Object.keys(params)
.map((key) => `${encodeURI(key)}=${encodeURI(params[key])}`)
.join("&"));
};
exports.queryString = queryString;
const parse = (obj) => {
let c = {};
if (obj["_attributes"])
Object.entries(obj["_attributes"]).forEach(([key, value]) => (c[key] = cast(value)));
Object.entries(obj).forEach(([key, value]) => {
if (value["_text"])
return (c[key] = cast(value["_text"]));
if (value["_attributes"])
return (c[key] = exports.parse(value["_attributes"]));
c[key.replace("_text", "name")] = cast(value);
});
delete c["_attributes"];
return c;
};
exports.parse = parse;
const cast = (val) => {
if (val === "true")
return true;
if (val === "false")
return false;
if (!Number.isNaN(Number(val)))
return Number(val);
return val;
};
const discover = (timeout = 10000) => {
const ssdp = new node_ssdp_1.Client();
const devices = [];
ssdp.on("response", (headers, _, rinfo) => devices.push(Object.assign(Object.assign({}, rinfo), { usn: headers.USN, location: headers.LOCATION })));
ssdp.search("roku:ecp");
return new Promise((resolve) => setTimeout(() => {
resolve(devices);
ssdp.stop();
}, timeout));
};
exports.discover = discover;