UNPKG

yandex-cloud-functions-router

Version:
103 lines (102 loc) 4.91 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.messageQueueRouter = void 0; const routerError_1 = require("../models/routerError"); const log_1 = require("../helpers/log"); const matchObjectPattern_1 = require("../helpers/matchObjectPattern"); const validateQueueId = (context, queueIds, message) => { if (queueIds) { const result = queueIds.some((queueId) => message.details.queue_id === queueId); log_1.debug(context.requestId, `Validating queue id: ${result ? 'valid' : 'invalid'}`, { request: message.details.queue_id, route: queueIds }); return result; } else { return true; } }; const validateBodyJson = (context, pattern, message) => { if (pattern) { log_1.debug(context.requestId, 'Validating message body json', { pattern, body: message.details.message.body }); try { const bodyObject = JSON.parse(message.details.message.body); const result = matchObjectPattern_1.matchObjectPattern(bodyObject, pattern); log_1.debug(context.requestId, 'Validating message body json', { bodyObject, result }); return result; } catch (e) { log_1.debug(context.requestId, 'Validating message body json failed with error', { error: e }); if (e instanceof SyntaxError) { return false; } else { throw e; } } } else { return true; } }; const validateBodyPattern = (context, pattern, message) => { if (pattern) { log_1.debug(context.requestId, 'Validating message body pattern', { pattern, body: message.details.message.body }); if (message.details.message.body) { const result = pattern.test(message.details.message.body); log_1.debug(context.requestId, 'Validating message body pattern', { result }); return result; } else { return false; } } else { return true; } }; const validateWithValidators = (validators, event, context, message) => { var _a; try { return validators ? validators.every((validator) => validator(event, context, message)) : true; } catch (e) { log_1.log('WARN', context.requestId, `Validator failed with error: ${((_a = e === null || e === void 0 ? void 0 : e.toString()) !== null && _a !== void 0 ? _a : 'unknown error').replace(/[\r\n]+/g, '')}`, {}); return false; } }; const messageQueueRouter = (routes, event, message, context) => __awaiter(void 0, void 0, void 0, function* () { log_1.debug(context.requestId, 'Message queue processing started', {}); for (const { queueId, body, validators, handler } of routes) { const matched = validateQueueId(context, queueId, message) && validateBodyJson(context, body === null || body === void 0 ? void 0 : body.json, message) && validateBodyPattern(context, body === null || body === void 0 ? void 0 : body.pattern, message); log_1.debug(context.requestId, 'Message queue matching completed', { message, matched, queueId: queueId !== null && queueId !== void 0 ? queueId : '', body: body !== null && body !== void 0 ? body : '' }); if (matched) { const validatorsPassed = validateWithValidators(validators, event, context, message); log_1.debug(context.requestId, 'Message queue validating completed', { validatorsPassed }); if (validatorsPassed) { const result = handler(event, context, message); log_1.debug(context.requestId, 'Message queue processed', {}); return result instanceof Promise ? result : Promise.resolve(result); } else { log_1.log('WARN', context.requestId, 'Invalid request', {}); throw new routerError_1.InvalidRequestError('Invalid request.'); } } } log_1.log('WARN', context.requestId, 'There is no matched route', {}); throw new routerError_1.NoMatchedRouteError('There is no matched route.'); }); exports.messageQueueRouter = messageQueueRouter;