yandex-cloud-functions-router
Version:
Node router for Yandex Cloud Functions
193 lines (192 loc) • 10.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.router = void 0;
const cloudFunctionEvent_1 = require("./models/cloudFunctionEvent");
const routerError_1 = require("./models/routerError");
const httpRouter_1 = require("./routers/httpRouter");
const iotMessageRouter_1 = require("./routers/iotMessageRouter");
const log_1 = require("./helpers/log");
const messageQueueRouter_1 = require("./routers/messageQueueRouter");
const objectStorageRouter_1 = require("./routers/objectStorageRouter");
const timerRouter_1 = require("./routers/timerRouter");
const router = (routes, options) => (event, context) => __awaiter(void 0, void 0, void 0, function* () {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
const errorHandling = (_a = options === null || options === void 0 ? void 0 : options.errorHandling) !== null && _a !== void 0 ? _a : {
http: {
notFound: () => ({
statusCode: 404
}),
invalidRequest: () => ({
statusCode: 400
})
}
};
try {
if (cloudFunctionEvent_1.isHttpEvent(event)) {
try {
log_1.log('INFO', context.requestId, '', {
'HTTP Method': event.httpMethod,
'Body Length': event.body.length,
Query: event.queryStringParameters,
Headers: event.headers
});
return yield httpRouter_1.httpRouter(routes.http || [], event, context, options);
}
catch (error) {
if (errorHandling) {
if (error instanceof routerError_1.NoMatchedRouteError && ((_b = errorHandling.http) === null || _b === void 0 ? void 0 : _b.notFound)) {
return errorHandling.http.notFound(error);
}
else if (error instanceof routerError_1.InvalidRequestError && ((_c = errorHandling.http) === null || _c === void 0 ? void 0 : _c.invalidRequest)) {
return errorHandling.http.invalidRequest(error);
}
}
throw error;
}
}
else if (cloudFunctionEvent_1.isTriggerEvent(event)) {
const errors = [];
for (const message of event.messages) {
try {
if (cloudFunctionEvent_1.isTimerEventMessage(message)) {
try {
log_1.log('INFO', context.requestId, 'Processing timer trigger message', {
'Trigger Id': message.details.trigger_id
});
yield timerRouter_1.timerRouter(routes.timer || [], event, message, context);
}
catch (error) {
if (errorHandling) {
if (error instanceof routerError_1.NoMatchedRouteError && ((_d = errorHandling.timer) === null || _d === void 0 ? void 0 : _d.notFound)) {
return errorHandling.timer.notFound(error);
}
}
throw error;
}
}
else if (cloudFunctionEvent_1.isMessageQueueEventMessage(message)) {
try {
log_1.log('INFO', context.requestId, 'Processing message queue message', {
'Queue Id': message.details.queue_id
});
yield messageQueueRouter_1.messageQueueRouter(routes.message_queue || [], event, message, context);
}
catch (error) {
if (errorHandling) {
if (error instanceof routerError_1.NoMatchedRouteError && ((_e = errorHandling.messageQueue) === null || _e === void 0 ? void 0 : _e.notFound)) {
return errorHandling.messageQueue.notFound(error);
}
else if (error instanceof routerError_1.InvalidRequestError && ((_f = errorHandling.messageQueue) === null || _f === void 0 ? void 0 : _f.invalidRequest)) {
return errorHandling.messageQueue.invalidRequest(error);
}
}
throw error;
}
}
else if (cloudFunctionEvent_1.isObjectStorageEventMessage(message)) {
try {
log_1.log('INFO', context.requestId, 'Processing object storage message', {
'Bucket Id': message.details.bucket_id,
'Object Id': message.details.object_id
});
yield objectStorageRouter_1.objectStorageRouter(routes.object_storage || [], event, message, context);
}
catch (error) {
if (errorHandling) {
if (error instanceof routerError_1.NoMatchedRouteError && ((_g = errorHandling.objectStorage) === null || _g === void 0 ? void 0 : _g.notFound)) {
return errorHandling.objectStorage.notFound(error);
}
else if (error instanceof routerError_1.InvalidRequestError && ((_h = errorHandling.objectStorage) === null || _h === void 0 ? void 0 : _h.invalidRequest)) {
return errorHandling.objectStorage.invalidRequest(error);
}
}
throw error;
}
}
else if (cloudFunctionEvent_1.isIotMessageEventMessage(message)) {
try {
log_1.log('INFO', context.requestId, 'Processing IoT Core message', {
'Registry Id': message.details.registry_id,
'Device Id': message.details.device_id,
'MQTT Topic': message.details.mqtt_topic
});
yield iotMessageRouter_1.iotMessageRouter(routes.iot_message || [], event, message, context);
}
catch (error) {
if (errorHandling) {
if (error instanceof routerError_1.NoMatchedRouteError && ((_j = errorHandling.iot) === null || _j === void 0 ? void 0 : _j.notFound)) {
return errorHandling.iot.notFound(error);
}
else if (error instanceof routerError_1.InvalidRequestError && ((_k = errorHandling.iot) === null || _k === void 0 ? void 0 : _k.invalidRequest)) {
return errorHandling.iot.invalidRequest(error);
}
}
throw error;
}
}
else {
log_1.log('ERROR', context.requestId, 'Unknown message type', {});
throw new routerError_1.UnknownMessageTypeRouteError('Unknown message type.');
}
}
catch (e) {
log_1.log('ERROR', context.requestId, 'Unexpected error during message processing', {
Error: e
});
errors.push(e);
}
}
if (errors.length === 1) {
throw errors[0];
}
else if (errors.length > 1) {
throw new routerError_1.TriggerRouteError(errors);
}
else {
return {
statusCode: 200
};
}
}
else {
log_1.log('ERROR', context.requestId, 'Unknown event type', {});
throw new routerError_1.UnknownEventTypeRouteError('Unknown event type.');
}
}
catch (error) {
if (errorHandling) {
if (error instanceof routerError_1.UnknownEventTypeRouteError && errorHandling.unknownEvent) {
return errorHandling.unknownEvent(error);
}
else if (error instanceof routerError_1.UnknownMessageTypeRouteError && errorHandling.unknownMessage) {
return errorHandling.unknownMessage(error);
}
else if (error instanceof routerError_1.TriggerRouteError && errorHandling.triggerCombinedError) {
return errorHandling.triggerCombinedError(error);
}
else if (errorHandling.custom) {
for (const customErrorHandler of errorHandling.custom) {
if (customErrorHandler.error && customErrorHandler.result) {
if (typeof customErrorHandler.error === 'string' && error.message === customErrorHandler.error) {
return customErrorHandler.result(error);
}
else if (customErrorHandler.error instanceof RegExp && customErrorHandler.error.test(error.message)) {
return customErrorHandler.result(error);
}
}
}
}
}
throw error;
}
});
exports.router = router;