UNPKG

@nestjs/microservices

Version:

Nest - modern, fast, powerful node.js web framework (@microservices)

46 lines (45 loc) 1.69 kB
"use strict"; 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(',')}}`; }