@di-zed/yandex-smart-home
Version:
The Yandex Smart Home skills for the different device types.
146 lines (145 loc) • 5.95 kB
JavaScript
;
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;