UNPKG

homebridge-programmable-http-switch

Version:

A Homebridge plugin that allows users to create Stateless Programmable Switches which can be controlled using a HTTP API.

229 lines (228 loc) 9.07 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var express_1 = __importDefault(require("express")); var types_1 = require("./types"); var Server = /** @class */ (function () { function Server(log, config) { var _this = this; this.accessories = {}; this.start = function () { _this.server.listen(_this.config.port || 3000, function () { _this.log.info("Started listening on port " + (_this.config.port || 3000)); }); }; this.setAccessories = function (accessories) { _this.accessories = accessories; }; this.setState = function (accessoryIdentifier, buttonIdentifier, action) { _this.accessories[accessoryIdentifier].setState(buttonIdentifier, action); }; // Accessories this.accessory = function (identifier) { return _this.config.accessories.find(function (accessory) { return accessory.identifier == identifier; }); }; this.getAccessories = function (request, response) { response.json({ success: true, data: _this.config.accessories }); }; this.getAccessory = function (request, response) { var accessoryIdentifier = request.params.accessoryIdentifier; if (accessoryIdentifier == null) { response.status(400).json({ success: false, error: { code: 400, message: "Missing required parameter 'accessoryIdentifier'." } }); return; } var accessory = _this.accessory(accessoryIdentifier); if (accessory == null) { response.status(404).json({ success: false, error: { code: 404, message: "Couldn't find accessory with identifier '" + accessoryIdentifier + "'." } }); return; } response.json({ success: true, data: accessory }); }; // Buttons this.buttons = function (accessoryIdentifier) { var _a; return (_a = _this.accessory(accessoryIdentifier)) === null || _a === void 0 ? void 0 : _a.buttons; }; this.button = function (accessoryIdentifier, buttonIdentifier) { var _a; return (_a = _this.buttons(accessoryIdentifier)) === null || _a === void 0 ? void 0 : _a.find(function (button) { return button.identifier == buttonIdentifier; }); }; this.getButtons = function (request, response) { var accessoryIdentifier = request.params.accessoryIdentifier; if (accessoryIdentifier == null) { response.status(400).json({ success: false, error: { code: 400, message: "Missing required parameter 'accessoryIdentifier'." } }); return; } var buttons = _this.buttons(accessoryIdentifier); if (buttons == null) { response.status(404).json({ success: false, error: { code: 404, message: "Couldn't find accessory with identifier '" + accessoryIdentifier + "'." } }); return; } response.json({ success: true, data: buttons }); }; this.getButton = function (request, response) { var accessoryIdentifier = request.params.accessoryIdentifier; var buttonIdentifier = request.params.buttonIdentifier; if (accessoryIdentifier == null) { response.status(400).json({ success: false, error: { code: 400, message: "Missing required parameter 'accessoryIdentifier'." } }); return; } if (buttonIdentifier == null) { response.status(400).json({ success: false, error: { code: 400, message: "Missing required parameter 'buttonIdentifier'." } }); return; } var button = _this.button(accessoryIdentifier, buttonIdentifier); if (button == null) { response.status(404).json({ success: false, error: { code: 404, message: "Couldn't find button with identifier '" + accessoryIdentifier + "' for accessory with identifier '" + accessoryIdentifier + "'." } }); return; } response.json({ success: true, data: button }); }; this.putButton = function (request, response) { var accessoryIdentifier = request.params.accessoryIdentifier; var buttonIdentifier = request.params.buttonIdentifier; var rawAction = request.body.action; if (accessoryIdentifier == null) { response.status(400).json({ success: false, error: { code: 400, message: "Missing required parameter 'accessoryIdentifier'." } }); return; } if (buttonIdentifier == null) { response.status(400).json({ success: false, error: { code: 400, message: "Missing required parameter 'buttonIdentifier'." } }); return; } if (rawAction == null) { response.status(400).json({ success: false, error: { code: 400, message: "Missing required property 'action'." } }); return; } var button = _this.button(accessoryIdentifier, buttonIdentifier); if (button == null) { response.status(404).json({ success: false, error: { code: 404, message: "Couldn't find button with identifier '" + accessoryIdentifier + "' for accessory with identifier '" + accessoryIdentifier + "'." } }); return; } var action = _this.action(rawAction); if (action == null) { response.status(400).json({ success: false, error: { code: 400, message: "Invalid action '" + action + "'." } }); return; } if (!button.supportedActions.map(_this.action).includes(action)) { response.status(400).json({ success: false, error: { code: 400, message: "Button with identifier '" + buttonIdentifier + "' does not support action '" + types_1.Action[action] + "'." } }); return; } _this.setState(accessoryIdentifier, buttonIdentifier, action); response.json({ success: true }); }; this.action = function (action) { if (typeof action == 'string') { return types_1.Action[action]; } else { return action; } }; this.log = log; this.config = config; this.server = (0, express_1.default)(); this.server.use(express_1.default.json()); this.server.get('/accessories', this.getAccessories); this.server.get('/accessories/:accessoryIdentifier', this.getAccessory); this.server.get('/accessories/:accessoryIdentifier/buttons', this.getButtons); this.server.get('/accessories/:accessoryIdentifier/buttons/:buttonIdentifier', this.getButton); this.server.put('/accessories/:accessoryIdentifier/buttons/:buttonIdentifier', this.putButton); } return Server; }()); exports.default = Server;