UNPKG

allproxy

Version:

AllProxy: MITM HTTP Debugging Tool.

112 lines 5.12 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()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.decodeProtobuf = exports.getProtoNames = exports.parseProtoFiles = void 0; const path_1 = __importDefault(require("path")); const Paths_1 = __importDefault(require("./Paths")); const fs_1 = __importDefault(require("fs")); const protobufjs_1 = __importDefault(require("protobufjs")); const ConsoleLog_1 = __importDefault(require("./ConsoleLog")); const serviceFuncToFileNameMessageNames = new Map(); function parseProtoFiles() { serviceFuncToFileNameMessageNames.clear(); let protoNames = []; for (const protoFile of fs_1.default.readdirSync(Paths_1.default.protoDir())) { if (!protoFile.endsWith('.proto')) continue; const lines = fs_1.default.readFileSync(path_1.default.join(Paths_1.default.protoDir(), protoFile)).toString().split('\n'); let foundService = false; let packageName = ''; let service = ''; let func = ''; for (let line of lines) { line = line.trim(); if (line.startsWith('package')) { const end = line.indexOf(';'); packageName = line.substring(line.indexOf(' ') + 1, end === -1 ? undefined : end); packageName = packageName.trim(); } if (!foundService) { if (line.startsWith('service ')) foundService = true; const end = line.indexOf('{'); service = line.substring(line.indexOf(' ') + 1, end === -1 ? undefined : end); service = service.trim(); } else { if (line === '}') { foundService = false; continue; } if (line.startsWith('rpc ')) { protoNames = []; protoNames.push(protoFile); func = line.substring(line.indexOf(' ') + 1, line.indexOf('(')); func = func.trim(); let j = line.indexOf('(') + 1; for (let i = j; i < line.length; ++i) { const c = line.substring(i, i + 1); if (c === ')') { const messageName = line.substring(j, i); protoNames.push(messageName); if (protoNames.length === 3) { const key = `/${packageName}.${service}/${func}`; serviceFuncToFileNameMessageNames.set(key, protoNames); ConsoleLog_1.default.info(key, protoNames); break; } const k = line.substring(i).indexOf('('); if (k === -1) break; i += k; j = i + 1; } } } } } } // Watch for new proto files fs_1.default.watch(Paths_1.default.protoDir(), (_event) => { parseProtoFiles(); }); } exports.parseProtoFiles = parseProtoFiles; // map Grpc URL path to request message name and response message name function getProtoNames(urlPath) { return serviceFuncToFileNameMessageNames.get(urlPath); } exports.getProtoNames = getProtoNames; function decodeProtobuf(fileName, packageName, messageName, buffer) { return __awaiter(this, void 0, void 0, function* () { const root = yield protobufjs_1.default.load(path_1.default.join(Paths_1.default.protoDir(), fileName)); const protobufType = root.lookupType(`${packageName}.${messageName}`); const message = buffer.subarray(5); const err = protobufType.verify(message); if (err) { ConsoleLog_1.default.info(err); return undefined; } try { const decodedMessage = protobufType.decode(message); return protobufType.toObject(decodedMessage); } catch (e) { ConsoleLog_1.default.info(e); return undefined; } }); } exports.decodeProtobuf = decodeProtobuf; //# sourceMappingURL=Protobuf.js.map