UNPKG

@di-zed/yandex-smart-home

Version:

The Yandex Smart Home skills for the different device types.

146 lines (145 loc) 5.95 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); /** * @author DiZed Team * @copyright Copyright (c) DiZed Team (https://github.com/di-zed/) */ const express_1 = __importDefault(require("express")); const express_ruid_1 = __importDefault(require("express-ruid")); const path_1 = __importDefault(require("path")); const cookie_parser_1 = __importDefault(require("cookie-parser")); const i18n_1 = __importDefault(require("i18n")); const helmet_1 = __importDefault(require("helmet")); const morgan_1 = __importDefault(require("morgan")); const hpp_1 = __importDefault(require("hpp")); const configProvider_1 = __importDefault(require("./providers/configProvider")); const mqttProvider_1 = __importDefault(require("./providers/mqttProvider")); const redisProvider_1 = __importDefault(require("./providers/redisProvider")); const topicService_1 = __importDefault(require("./services/topicService")); const skillService_1 = __importDefault(require("./services/skillService")); const routes_1 = __importDefault(require("./routes")); /** * Bootstrap Class. */ class YandexSmartHome { /** * Yandex Smart Home Index. * * @param app * @param config */ constructor(app, config) { configProvider_1.default.setConfig(config); this.setConfig(app); this.connectRedis(); new routes_1.default(app); } /** * Set Configurations. * * @param app * @protected */ setConfig(app) { // Parse Cookie header and populate req.cookies with an object keyed by the cookie names. app.use((0, cookie_parser_1.default)()); // Lightweight simple translation module with dynamic JSON storage. i18n_1.default.configure({ locales: ['ru'], defaultLocale: 'ru', directory: path_1.default.join(__dirname, 'locales'), }); app.use(i18n_1.default.init); // Set view engine. app.set('view engine', 'ejs'); app.set('views', path_1.default.join(__dirname, 'views')); // Serving static files. app.use(express_1.default.static(path_1.default.join(__dirname, 'public'))); // Generates UUID for request and add it to header. app.use((0, express_ruid_1.default)({ setInContext: true, header: 'X-Request-Id', attribute: 'requestId', })); // Helmet helps secure Express apps by setting HTTP response headers. app.use((0, helmet_1.default)({ contentSecurityPolicy: { directives: { scriptSrc: ["'self'", 'cdn.jsdelivr.net'], 'form-action': null, // @todo It should be like ["'self'", 'social.yandex.net'] but it doesn't work on mobile. }, }, })); // HTTP request logger middleware for Node.js. if (process.env.NODE_ENV === 'development') { app.use((0, morgan_1.default)('dev')); } // It parses incoming requests with JSON payloads and is based on body-parser. app.use(express_1.default.json({ limit: '10kb' })); // It parses incoming requests with URL-encoded payloads and is based on a body parser. app.use(express_1.default.urlencoded({ extended: true, limit: '10kb', })); // Node.js Connect middleware to sanitize user input coming from POST body, GET queries, and URL params. require('xss-clean')(); // Express middleware to protect against HTTP Parameter Pollution attacks. app.use((0, hpp_1.default)()); } /** * Redis Connection. * * @protected */ connectRedis() { redisProvider_1.default.connect().then(() => { this.subscribeMqtt(); }); } /** * MQTT Subscriber. * * @protected */ subscribeMqtt() { mqttProvider_1.default.getClientAsync().then((client) => { client.subscribe('#', (err) => { if (!err) { console.log('MQTT is Subscribed!'); client.on('message', (topic, message) => { try { const newMessage = String(message); topicService_1.default.getTopicMessage(topic).then((oldMessage) => { if (oldMessage !== newMessage) { topicService_1.default.setTopicMessage(topic, newMessage).then(() => { mqttProvider_1.default.listenTopic(topic, oldMessage, newMessage); skillService_1.default.initYandexCallbacks(topic, oldMessage, newMessage).catch((err) => { console.log('ERROR! Init Yandex Callbacks.', { err, topic /*, oldMessage, newMessage*/ }); }); }); } }); } catch (err) { console.log('ERROR! MQTT Message.', { err, topic, message }); } }); const callbackMqttIsSubscribed = configProvider_1.default.getConfigOption('callbackMqttIsSubscribed'); if (typeof callbackMqttIsSubscribed === 'function') { callbackMqttIsSubscribed(client); } } else { console.log('ERROR! MQTT Subscribe.', { err }); } }); }); } } function default_1(app, config) { return new YandexSmartHome(app, config); } exports.default = default_1;