@nestjs/microservices
Version:
Nest - modern, fast, powerful node.js web framework (@microservices)
46 lines (45 loc) • 1.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformPatternToRoute = transformPatternToRoute;
const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
const DEFAULT_MAX_DEPTH = 5;
const DEFAULT_MAX_KEYS = 20;
/**
* Transforms the Pattern to Route safely.
*
* @param pattern - client pattern
* @param depth - current recursion depth
* @param maxDepth - maximum allowed recursion depth
* @param maxKeys - maximum allowed keys per object
* @returns string
*/
function transformPatternToRoute(pattern, depth = 0, maxDepth = DEFAULT_MAX_DEPTH, maxKeys = DEFAULT_MAX_KEYS) {
if ((0, shared_utils_1.isString)(pattern) || (0, shared_utils_1.isNumber)(pattern)) {
return `${pattern}`;
}
if (!(0, shared_utils_1.isObject)(pattern)) {
// For non-string, non-number, non-object values
return pattern;
}
if (depth > maxDepth) {
return '[MAX_DEPTH_REACHED]';
}
const keys = Object.keys(pattern);
if (keys.length > maxKeys) {
return '[TOO_MANY_KEYS]';
}
const sortedKeys = keys.sort((a, b) => ('' + a).localeCompare(b));
const parts = sortedKeys.map(key => {
const value = pattern[key];
let partialRoute = `"${key}":`;
// Only quote strings, numbers and objects are handled recursively
if ((0, shared_utils_1.isString)(value)) {
partialRoute += `"${transformPatternToRoute(value, depth + 1, maxDepth, maxKeys)}"`;
}
else {
partialRoute += transformPatternToRoute(value, depth + 1, maxDepth, maxKeys);
}
return partialRoute;
});
return `{${parts.join(',')}}`;
}