UNPKG

yandex-cloud-functions-router

Version:
193 lines (192 loc) 10.5 kB
"use strict"; 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;