yandex-cloud-functions-router
Version:
Node router for Yandex Cloud Functions
103 lines (102 loc) • 4.91 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.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;