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
JavaScript
"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;