yandex-cloud-functions-router
Version:
Node router for Yandex Cloud Functions
77 lines (76 loc) • 3.5 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.iotMessageRouter = void 0;
const log_1 = require("../helpers/log");
const routerError_1 = require("../models/routerError");
const validateRegistryId = (context, registryIds, message) => {
if (registryIds) {
const result = registryIds.some((registryId) => registryId === message.details.registry_id);
log_1.debug(context.requestId, `Validating reugistry id: ${result ? 'valid' : 'invalid'}`, {
request: message.details.registry_id,
route: registryIds
});
return result;
}
else {
return true;
}
};
const validateDeviceId = (context, deviceIds, message) => {
if (deviceIds) {
const result = deviceIds.some((deviceId) => deviceId === message.details.device_id);
log_1.debug(context.requestId, `Validating device id: ${result ? 'valid' : 'invalid'}`, {
request: message.details.device_id,
route: deviceIds
});
return result;
}
else {
return true;
}
};
const validateMqttTopic = (context, mqttTopics, message) => {
if (mqttTopics) {
const result = mqttTopics.some((mqttTopic) => mqttTopic === message.details.mqtt_topic);
log_1.debug(context.requestId, `Validating MQTT topic: ${result ? 'valid' : 'invalid'}`, {
request: message.details.mqtt_topic,
route: mqttTopics
});
return result;
}
else {
return true;
}
};
const iotMessageRouter = (routes, event, message, context) => __awaiter(void 0, void 0, void 0, function* () {
log_1.debug(context.requestId, 'IoT Core processing started', {});
for (const { registryId, deviceId, mqttTopic, handler } of routes) {
const matched = validateRegistryId(context, registryId, message) &&
validateDeviceId(context, deviceId, message) &&
validateMqttTopic(context, mqttTopic, message);
log_1.debug(context.requestId, 'IoT Core matching completed', {
matched,
message,
registryId: registryId !== null && registryId !== void 0 ? registryId : '',
deviceId: deviceId !== null && deviceId !== void 0 ? deviceId : '',
mqttTopic: mqttTopic !== null && mqttTopic !== void 0 ? mqttTopic : ''
});
if (matched) {
const result = handler(event, context, message);
log_1.debug(context.requestId, 'IoT Core processed', {});
return result instanceof Promise ? result : Promise.resolve(result);
}
}
log_1.log('WARN', context.requestId, 'There is no matched route', {});
throw new routerError_1.NoMatchedRouteError('There is no matched route.');
});
exports.iotMessageRouter = iotMessageRouter;