UNPKG

pao-aop-server

Version:

基于pao-aop的服务端框架

750 lines (748 loc) 38.1 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); } return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; (function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define(["require", "exports", "net", "util", "pao-aop", "../net/socket", "../buffer/index", "../base"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TCP = require("net"); var util_1 = require("util"); var pao_aop_1 = require("pao-aop"); var socket_1 = require("../net/socket"); var index_1 = require("../buffer/index"); var base_1 = require("../base"); /* * 版权: Copyright (c) 2018 red * * 文件: proxyServer.ts * 创建日期: Thursday September 20th 2018 * 作者: pao * 说明: * 1、反向代理 * 2、外网:从Internet发来请求的端口 * 3、内网:面向内网的端口 * 4、代理:代理服务器的内网端口 * 5、目标:最终提供服务的服务器 */ /** * 默认字符串编码 */ var StringEncoding = 'UTF8'; /** * 命令 */ var Command; (function (Command) { Command[Command["CommandConnect"] = 0] = "CommandConnect"; Command[Command["CommandProxy"] = 1] = "CommandProxy"; Command[Command["CommandEnd"] = 2] = "CommandEnd"; })(Command = exports.Command || (exports.Command = {})); /** * 等待端口的建立 * @param outerAddress 外部地址 */ function waitForSocketCreated(outerAddress, socketList) { /** * 等待目标端口创建完毕 */ pao_aop_1.wait(function () { if (socketList && socketList[outerAddress]) { return true; } else { return false; } }, 60 * 1000, 10); } /** * Socket 缓存队列 */ var SocketBufferQueueList = /** @class */ (function () { function SocketBufferQueueList() { /** * 缓存队列 */ this.bufferQueueList = {}; } SocketBufferQueueList.prototype.setBufferQueue = function (outerAddress) { this.bufferQueueList[outerAddress] = []; }; SocketBufferQueueList.prototype.pushBuffer = function (outerAddress, data) { if (!this.bufferQueueList[outerAddress]) { this.bufferQueueList[outerAddress] = []; } this.bufferQueueList[outerAddress].push(data); }; SocketBufferQueueList.prototype.shiftBuffer = function (outerAddress) { if (this.bufferQueueList[outerAddress]) { return this.bufferQueueList[outerAddress].shift(); } return undefined; }; SocketBufferQueueList.prototype.sendAll = function (address, socketList) { var socket = socketList[address]; var bufferQueue = this.bufferQueueList[address]; if (socket && bufferQueue) { while (bufferQueue.length > 0) { var data = bufferQueue.shift(); if (typeof data === "string" && data === 'end') { socket.end(); } else if (util_1.isError(data)) { socket.destroy(data); } else { pao_aop_1.log('data', "Send Data(\u5927\u5C0F=" + data.length + ", \u5916\u7F51\u5730\u5740=" + address); socket.write(data); } } } }; return SocketBufferQueueList; }()); /** * 插件:透明分发器 * 分发所有数据的数据分发器 */ var TransparentDistributor = /** @class */ (function (_super) { __extends(TransparentDistributor, _super); function TransparentDistributor() { return _super !== null && _super.apply(this, arguments) || this; } /** * 分发套接字 * @param distributeServerID 分发服务器ID * @param incommingSocket 传入的套接字 */ TransparentDistributor.prototype.distributorCheck = function (distributeServerID, incommingSocket) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, true]; }); }); }; TransparentDistributor = __decorate([ pao_aop_1.addon('TransparentDistributor', '透明分发器', '分发所有数据的数据分发器') ], TransparentDistributor); return TransparentDistributor; }(pao_aop_1.BaseAddon)); exports.TransparentDistributor = TransparentDistributor; /** * 代理服务器信息 */ var ProxyServerInfo = /** @class */ (function () { function ProxyServerInfo() { } return ProxyServerInfo; }()); exports.ProxyServerInfo = ProxyServerInfo; /** * 分发服务器信息 */ var DistributeServerInfo = /** @class */ (function () { function DistributeServerInfo() { } return DistributeServerInfo; }()); exports.DistributeServerInfo = DistributeServerInfo; /** * 分发服务器细节 */ var DistributeServerDetail = /** @class */ (function () { function DistributeServerDetail() { } return DistributeServerDetail; }()); /** * 反向代理内网监听服务 */ var ReverseProxyListenServer = /** @class */ (function (_super) { __extends(ReverseProxyListenServer, _super); function ReverseProxyListenServer() { var _this = _super !== null && _super.apply(this, arguments) || this; /** * 代理服务实例 */ _this.proxyServerInstances = {}; /** * 服务明细 */ _this.distributeServerDetails = {}; return _this; } ReverseProxyListenServer.prototype.onCreated = function () { /** * 启动时开启代理服务监听 */ if (!this.proxyServers) { throw new Error("未设置代理服务器列表。"); } pao_aop_1.log('proxyServer', "\u4EE3\u7406\u670D\u52A1\u5668\u6570\u76EE: " + this.proxyServers.length); for (var _i = 0, _a = this.proxyServers; _i < _a.length; _i++) { var proxyServerInfo = _a[_i]; var proxyServer = new ReverseProxyServer("外网监听服务器", proxyServerInfo.serverPort, this.hostName); proxyServer.proxyServerInfo = proxyServerInfo; proxyServer.start(); this.proxyServerInstances[proxyServerInfo.serverPort] = proxyServer; } }; /** * 连接建立 * @param socket 套接字 */ ReverseProxyListenServer.prototype.onConnected = function (socket) { var _this = this; var innerAddress = socket_1.getSocketRemoteAddress(socket); socket.on('error', function (error) { pao_aop_1.log('proxyServer', new Error("\u6765\u81EA" + innerAddress + "\u7684\u5185\u7F51\u8FDE\u63A5\u53D1\u751F\u5F02\u5E38: " + error)); }); socket.on('timeout', function () { pao_aop_1.log('proxyServer', new Error("\u6765\u81EA" + innerAddress + "\u7684\u5185\u7F51\u8FDE\u63A5\u8D85\u65F6")); }); socket.on('close', function (had_error) { pao_aop_1.log('proxyServer', "\u6765\u81EA" + innerAddress + "\u7684\u5185\u7F51\u8FDE\u63A5\u5173\u95ED"); }); // 首次连接根据发过来的连接消息来判断端口是主端口还是代理端口,如果是代理端口,则创建一个代理通道 socket.once('data', function (data) { try { pao_aop_1.log('proxyServer', "Inner => Data(\u5927\u5C0F=" + data.length + ")"); var dataReader = new index_1.BufferReader(data); var command = dataReader.readUInt32BE(); if (command === Command.CommandConnect) { // 读取代理服务ID var distributeServerID = dataReader.readString(StringEncoding); var distributeServerPassword = dataReader.readString(StringEncoding); pao_aop_1.log('proxyServer', "\u8FDE\u63A5\u8BF7\u6C42\u5230\u8FBE(ServerID=" + distributeServerID + ", Password=" + distributeServerPassword + ")"); _this.connectServer(distributeServerID, distributeServerPassword, socket); } else if (command === Command.CommandProxy) { var distributeServerID_1 = dataReader.readString(StringEncoding); var outerAddress_1 = dataReader.readString(StringEncoding); pao_aop_1.log('proxyServer', "\u4EE3\u7406\u8BF7\u6C42\u5230\u8FBE(ServerID=" + distributeServerID_1 + ", OuterAddress=" + outerAddress_1 + ")"); _this.distributeServers.forEach(function (distributeServerInfo) { if (distributeServerInfo.serverID === distributeServerID_1) { pao_aop_1.log('proxyServer', "Inner => Proxy(\u5916\u7F51\u5730\u5740=" + outerAddress_1); _this.distributeServerDetails[distributeServerID_1].proxyServer.connectInnerPort(outerAddress_1, socket, distributeServerID_1); } }); } } catch (error) { pao_aop_1.log('proxyServer', error, 'error'); } }); }; ReverseProxyListenServer.prototype.connectServer = function (distributeServerID, distributeServerPassword, socket) { var _this = this; if (!this.distributeServers) { throw new Error("\u672A\u8BBE\u7F6E\u5206\u5E03\u5F0F\u670D\u52A1\u5668\u5217\u8868\uFF0C\u670D\u52A1:" + distributeServerID + "\u8FDE\u63A5\u5931\u8D25"); } this.distributeServers.forEach(function (distributeServerInfo) { if (distributeServerInfo.serverID === distributeServerID && distributeServerInfo.password === distributeServerPassword) { var port = distributeServerInfo.serverPort; pao_aop_1.log('proxyServer', "Inner => Connect(\u7AEF\u53E3=" + port + "})"); var proxyServer_1 = _this.proxyServerInstances[port]; if (!proxyServer_1) { throw new Error("\u670D\u52A1" + distributeServerID + "\u8981\u4EE3\u7406\u7684\u7AEF\u53E3" + port + "\u6CA1\u6709\u8BBE\u7F6E\uFF0C\u5982\u679C\u9700\u8981\u5F00\u542F\u67D0\u4E2A\u7AEF\u53E3\uFF0C\u8BF7\u8BBE\u7F6EproxyServers\u5C5E\u6027"); } _this.distributeServerDetails[distributeServerID] = { innerMainSocket: socket, proxyServer: proxyServer_1 }; /** * 如果是主连接,端口关闭后应当删除服务 */ socket.on('close', function (had_error) { var innerAddress = socket_1.getSocketRemoteAddress(socket); pao_aop_1.log('proxyServer', "\u6765\u81EA" + innerAddress + "\u7684\u5185\u7F51\u4E3B\u8FDE\u63A5\u5173\u95ED"); proxyServer_1.disconnectInnerMainPort(distributeServerID); delete _this.distributeServerDetails[distributeServerID]; }); proxyServer_1.connetInnerMainPort(distributeServerInfo, _this.distributeServerDetails[distributeServerID]); } }); }; return ReverseProxyListenServer; }(socket_1.SocketServer)); exports.ReverseProxyListenServer = ReverseProxyListenServer; /** * 反向代理服务 * 反向代理服务在有IP地址公网中运行,模拟开启某个服务,并将接收到的信息转发给目标服务器 */ var ReverseProxyServer = /** @class */ (function (_super) { __extends(ReverseProxyServer, _super); function ReverseProxyServer() { var _this = _super !== null && _super.apply(this, arguments) || this; /** * 外网Socket列表 */ _this.outerSocketList = {}; /** * 内网Socket列表 */ _this.innerSocketList = {}; /** * 待发送的数据缓存 */ _this.bufferList = new SocketBufferQueueList(); /** * 服务明细 */ _this.distributeServers = {}; return _this; } /** * 连接内网主端口 * @param innerMainSocket 内网主端口 * @param serverInfo 服务器信息 */ ReverseProxyServer.prototype.connetInnerMainPort = function (serverInfo, serverDetail) { this.distributeServers[serverInfo.serverID] = { serverInfo: serverInfo, serverDetail: serverDetail }; }; /** * 断开内网主连接端口 * @param serverID 服务ID */ ReverseProxyServer.prototype.disconnectInnerMainPort = function (serverID) { delete this.distributeServers[serverID]; }; /** * 连接内网端口 * @param outerAddress 外网地址 * @param innerSocket 内部端口 */ ReverseProxyServer.prototype.connectInnerPort = function (outerAddress, innerSocket, serverID) { var _this = this; innerSocket.on('error', function (error) { pao_aop_1.log('proxyServer', new Error("\u5185\u7F51\u8FDE\u63A5" + outerAddress + "\u5F02\u5E38: " + error)); var outerSocket = _this.outerSocketList[outerAddress]; if (outerSocket) { pao_aop_1.log('proxyServer', "Error => Outer(\u5916\u7F51\u5730\u5740=" + outerAddress); outerSocket.destroy(error); } }); innerSocket.on('timeout', function () { pao_aop_1.log('proxyServer', new Error("\u5185\u7F51\u8FDE\u63A5" + outerAddress + "\u8D85\u65F6")); }); innerSocket.on('close', function (had_error) { pao_aop_1.log('proxyServer', "\u5185\u7F51\u8FDE\u63A5" + outerAddress + "\u5173\u95ED"); var outerSocketList = _this.outerSocketList[outerAddress]; if (outerSocketList) { outerSocketList.destroy(); } delete _this.outerSocketList[outerAddress]; delete _this.innerSocketList[outerAddress]; }); // 内网数据转发到外网 innerSocket.on('data', function (data) { try { pao_aop_1.log('proxyServer', "Inner => Data(\u5927\u5C0F=" + data.length + ", \u5916\u7F51\u5730\u5740=" + outerAddress + ")"); waitForSocketCreated(outerAddress, _this.outerSocketList); var outerSocket = _this.outerSocketList[outerAddress]; if (outerSocket) { pao_aop_1.log('proxyServer', "Data => Outer(\u5927\u5C0F=" + data.length + ", \u5916\u7F51\u5730\u5740=" + outerAddress); outerSocket.write(data); } } catch (error) { pao_aop_1.log('proxyServer', error, 'error'); } }); innerSocket.on('end', function () { try { pao_aop_1.log('proxyServer', "Inner => End(\u5916\u7F51\u5730\u5740=" + outerAddress); var outerSocket = _this.outerSocketList[outerAddress]; if (outerSocket) { pao_aop_1.log('proxyServer', "End => Outer(\u5916\u7F51\u5730\u5740=" + outerAddress); outerSocket.end(); } } catch (error) { pao_aop_1.log('proxyServer', error, 'error'); } }); this.innerSocketList[outerAddress] = innerSocket; this.bufferList.sendAll(outerAddress, this.innerSocketList); }; /** * 来自外网的连接建立 * @param outerSocket 套接字 */ ReverseProxyServer.prototype.onConnected = function (outerSocket) { var _this = this; var outerAddress = socket_1.getSocketRemoteAddress(outerSocket); this.outerSocketList[outerAddress] = outerSocket; var _loop_1 = function (distributeServerID) { if (distributeServerID) { var distributeServer_1 = this_1.distributeServers[distributeServerID]; // 只有生效的分发服务器才转发数据 if (distributeServer_1.serverInfo.enabled) { if (this_1.proxyServerInfo.distributor) { this_1.proxyServerInfo.distributor.distributorCheck(distributeServerID, outerSocket).then(function (ok) { if (ok) { var distributeServerDetail = distributeServer_1.serverDetail; socket_1.writeDataToSocket(distributeServerDetail.innerMainSocket, function (bufferWriter) { bufferWriter.writeUInt32BE(Command.CommandConnect); bufferWriter.writeString(outerAddress, StringEncoding); pao_aop_1.log('proxyServer', "Connect => Inner(\u5927\u5C0F=" + bufferWriter.bufferSize + ", \u5916\u7F51\u5730\u5740=" + outerAddress + ")"); }); } }); } } } }; var this_1 = this; // 根据转发规则建立连接 for (var distributeServerID in this.distributeServers) { _loop_1(distributeServerID); } outerSocket.on('error', function (error) { pao_aop_1.log('proxyServer', new Error("\u5916\u7F51\u8FDE\u63A5" + outerAddress + "\u5F02\u5E38: " + error)); _this.bufferList.pushBuffer(outerAddress, error); _this.bufferList.sendAll(outerAddress, _this.innerSocketList); }); outerSocket.on('timeout', function () { pao_aop_1.log('proxyServer', new Error("\u5916\u7F51\u8FDE\u63A5" + outerAddress + "\u8D85\u65F6")); }); outerSocket.on('close', function (had_error) { pao_aop_1.log('proxyServer', "\u5916\u7F51\u8FDE\u63A5" + outerAddress + "\u5173\u95ED"); var innerSocket = _this.innerSocketList[outerAddress]; if (innerSocket) { innerSocket.destroy(); } delete _this.innerSocketList[outerAddress]; delete _this.outerSocketList[outerAddress]; }); // 外网数据转发到内网 outerSocket.on('data', function (data) { try { pao_aop_1.log('proxyServer', "Outer => Data(\u5927\u5C0F=" + data.length + ", \u5916\u7F51\u5730\u5740=" + outerAddress + ")"); _this.bufferList.pushBuffer(outerAddress, data); waitForSocketCreated(outerAddress, _this.innerSocketList); _this.bufferList.sendAll(outerAddress, _this.innerSocketList); } catch (error) { pao_aop_1.log('proxyServer', error, 'error'); } }); outerSocket.on('end', function () { try { pao_aop_1.log('proxyServer', "Outer => End(\u5916\u7F51\u5730\u5740=" + outerAddress); _this.bufferList.pushBuffer(outerAddress, 'end'); _this.bufferList.sendAll(outerAddress, _this.innerSocketList); } catch (error) { pao_aop_1.log('proxyServer', error, 'error'); } }); }; return ReverseProxyServer; }(socket_1.SocketServer)); exports.ReverseProxyServer = ReverseProxyServer; /** * 反向代理客户端 */ var ReverseProxyClient = /** @class */ (function (_super) { __extends(ReverseProxyClient, _super); /** * 构造函数 * @param proxyPort 要代理的端口 * @param proxyServer 代理服务器地址 * @param proxyServerPort 代理服务端口 * @param targetServer 目标服务器 * @param targetServerPort 目标端口 */ function ReverseProxyClient(serverID, password, proxyPort, proxyServer, proxyServerPort, targetServer, targetServerPort) { var _this = _super.call(this) || this; _this.serverID = serverID; _this.password = password; _this.proxyPort = proxyPort; _this.proxyServer = proxyServer; _this.proxyServerPort = proxyServerPort; _this.targetServer = targetServer; _this.targetServerPort = targetServerPort; /** * 发送到Target的缓冲区 */ _this.bufferListToTarget = new SocketBufferQueueList(); /** * 代理服务列表 */ _this.proxySocketList = {}; /** * 目标服务列表 */ _this.targetSocketList = {}; return _this; } /** * 等待结束 */ ReverseProxyClient.prototype.waitForExit = function () { return __awaiter(this, void 0, void 0, function () { var intervalID, reconnectTime, that; return __generator(this, function (_a) { switch (_a.label) { case 0: reconnectTime = 1000 * 30; that = this; return [4 /*yield*/, new Promise(function (resolve, reject) { var reconnect = function () { // 每30秒检测一次客户端是否断开,如果断开则重新连接 if (!that.proxyServerMainSocket) { that.connectProxyServer(); } setTimeout(reconnect, reconnectTime); }; setTimeout(reconnect, reconnectTime); })]; case 1: _a.sent(); clearInterval(intervalID); return [2 /*return*/]; } }); }); }; /** * 连接代理服务器 */ ReverseProxyClient.prototype.connectProxyServer = function () { var _this = this; this.proxyServerMainSocket = new TCP.Socket(); var proxyAddress = socket_1.getSocketRemoteAddress(this.proxyServerMainSocket); // 数据转发 this.proxyServerMainSocket.on('data', function (data) { try { pao_aop_1.log('proxyClient', "ProxyMain => Data(\u5927\u5C0F=" + data.length + ")"); var bufferReader = new index_1.BufferReader(data); while (!bufferReader.isEnd) { var command = bufferReader.readUInt32BE(); if (command === Command.CommandConnect) { var outerAddress = bufferReader.readString(StringEncoding); _this.connectSockets(outerAddress); } } } catch (error) { pao_aop_1.log('proxyServer', error, 'error'); } }); this.proxyServerMainSocket.on('error', function (error) { pao_aop_1.log('proxyClient', new Error("\u4EE3\u7406\u8FDE\u63A5" + proxyAddress + "\u5F02\u5E38: " + error)); }); this.proxyServerMainSocket.on('timeout', function () { pao_aop_1.log('proxyClient', new Error("\u4EE3\u7406\u8FDE\u63A5" + proxyAddress + "\u8D85\u65F6")); }); this.proxyServerMainSocket.on('close', function (had_error) { pao_aop_1.log('proxyClient', "\u4EE3\u7406\u8FDE\u63A5" + proxyAddress + "\u5173\u95ED"); _this.proxyServerMainSocket = undefined; }); this.proxyServerMainSocket.once('connect', function () { pao_aop_1.log('proxyClient', "\u4EE3\u7406\u670D\u52A1\u5668" + socket_1.getSocketRemoteAddress(_this.proxyServerMainSocket) + "\u8FDE\u63A5\u6210\u529F"); // 向代理服务器通发送服务ID,准备启动代理 socket_1.writeDataToSocket(_this.proxyServerMainSocket, function (bufferWriter) { bufferWriter.writeUInt32BE(Command.CommandConnect); bufferWriter.writeString(_this.serverID); // serverID bufferWriter.writeString(_this.password); // password pao_aop_1.log('proxyClient', "Connect => ProxyMain(\u5927\u5C0F=" + bufferWriter.bufferSize + ")"); }); }); pao_aop_1.log('proxyClient', "\u5F00\u59CB\u8FDE\u63A5\u4EE3\u7406\u670D\u52A1\u5668" + this.proxyServer + ":" + this.proxyServerPort); this.proxyServerMainSocket.connect(this.proxyServerPort, this.proxyServer); }; ReverseProxyClient.prototype.onStart = function () { this.connectProxyServer(); this.waitForExit(); }; ReverseProxyClient.prototype.connectSockets = function (outerAddress) { var _this = this; var proxySocket = new TCP.Socket(); proxySocket.on('error', function (error) { pao_aop_1.log('proxyClient', new Error("\u4EE3\u7406\u8FDE\u63A5\u5F02\u5E38: " + error + ", \u5916\u7F51\u5730\u5740:" + outerAddress)); _this.bufferListToTarget.pushBuffer(outerAddress, error); waitForSocketCreated(outerAddress, _this.targetSocketList); _this.bufferListToTarget.sendAll(outerAddress, _this.targetSocketList); }); proxySocket.on('timeout', function () { pao_aop_1.log('proxyClient', new Error("\u4EE3\u7406\u8FDE\u63A5\u8D85\u65F6, \u5916\u7F51\u5730\u5740:" + outerAddress)); }); proxySocket.on('close', function (had_error) { pao_aop_1.log('proxyClient', "\u4EE3\u7406\u8FDE\u63A5\u5173\u95ED, \u5916\u7F51\u5730\u5740:" + outerAddress); var targetSocket = _this.targetSocketList[outerAddress]; if (targetSocket) { targetSocket.destroy(); } delete _this.targetSocketList[outerAddress]; delete _this.proxySocketList[outerAddress]; }); // 数据转发 TargetServer -> ProxyServer proxySocket.on('data', function (data) { try { pao_aop_1.log('proxyClient', "Proxy => Data(\u5927\u5C0F=" + data.length + ", \u5916\u7F51\u5730\u5740:" + outerAddress); _this.bufferListToTarget.pushBuffer(outerAddress, data); waitForSocketCreated(outerAddress, _this.targetSocketList); _this.bufferListToTarget.sendAll(outerAddress, _this.targetSocketList); } catch (error) { pao_aop_1.log('proxyServer', error, 'error'); } }); proxySocket.on('end', function () { try { pao_aop_1.log('proxyClient', "Proxy => End(\u5916\u7F51\u5730\u5740=" + outerAddress + ")"); _this.bufferListToTarget.pushBuffer(outerAddress, 'end'); waitForSocketCreated(outerAddress, _this.targetSocketList); _this.bufferListToTarget.sendAll(outerAddress, _this.targetSocketList); } catch (error) { pao_aop_1.log('proxyServer', error, 'error'); } }); proxySocket.once('connect', function () { try { pao_aop_1.log('proxyClient', "\u4EE3\u7406\u670D\u52A1\u5668" + socket_1.getSocketRemoteAddress(proxySocket) + "\u8FDE\u63A5\u6210\u529F, \u5916\u7F51\u5730\u5740:" + outerAddress); // 向代理服务器通知建立代理端口 socket_1.writeDataToSocket(proxySocket, function (bufferWriter) { bufferWriter.writeUInt32BE(Command.CommandProxy); bufferWriter.writeString(_this.serverID); bufferWriter.writeString(outerAddress); pao_aop_1.log('proxyClient', "Connect => Proxy(\u5927\u5C0F=" + bufferWriter.bufferSize + ")"); }); // 代理服务器连接成功后连接目标服务器 _this.connectTargetSocket(outerAddress); // 代理连接建立后转发数据 _this.proxySocketList[outerAddress] = proxySocket; waitForSocketCreated(outerAddress, _this.targetSocketList); _this.bufferListToTarget.sendAll(outerAddress, _this.targetSocketList); } catch (error) { pao_aop_1.log('proxyServer', error, 'error'); } }); // 连接目标服务器 pao_aop_1.log('proxyClient', "\u5F00\u59CB\u8FDE\u63A5\u4EE3\u7406\u670D\u52A1\u5668" + this.proxyServer + ":" + this.proxyServerPort + ", \u5916\u7F51\u5730\u5740:" + outerAddress); proxySocket.connect(this.proxyServerPort, this.proxyServer); }; /** * 连接目标服务器 */ ReverseProxyClient.prototype.connectTargetSocket = function (outerAddress) { var _this = this; var targetSocket = new TCP.Socket(); targetSocket.on('error', function (error) { pao_aop_1.log('proxyClient', "\u76EE\u6807\u8FDE\u63A5\u5F02\u5E38: " + error + ", \u5916\u7F51\u5730\u5740:" + outerAddress); var proxySocket = _this.proxySocketList[outerAddress]; if (proxySocket) { pao_aop_1.log('proxyClient', "Error => Proxy(\u5916\u7F51\u5730\u5740=" + outerAddress + ")"); proxySocket.destroy(error); } }); targetSocket.on('timeout', function () { pao_aop_1.log('proxyClient', "\u76EE\u6807\u8FDE\u63A5\u8D85\u65F6, \u5916\u7F51\u5730\u5740:" + outerAddress); }); targetSocket.on('close', function (had_error) { pao_aop_1.log('proxyClient', "\u76EE\u6807\u8FDE\u63A5\u5173\u95ED(\u5916\u7F51\u5730\u5740:" + outerAddress + ")"); var proxySocket = _this.proxySocketList[outerAddress]; if (proxySocket) { proxySocket.destroy(); } delete _this.proxySocketList[outerAddress]; delete _this.targetSocketList[outerAddress]; }); // 数据转发 TargetServer -> ProxyServer targetSocket.on('data', function (data) { pao_aop_1.log('proxyClient', "Target => Data(\u5927\u5C0F=" + data.length + ", \u5916\u7F51\u5730\u5740=" + outerAddress + ")"); var proxySocket = _this.proxySocketList[outerAddress]; pao_aop_1.log('proxyClient', "Data => Proxy(\u5927\u5C0F=" + data.length + ", \u5916\u7F51\u5730\u5740=" + outerAddress + ")"); waitForSocketCreated(outerAddress, _this.proxySocketList); proxySocket.write(data); }); targetSocket.on('end', function () { pao_aop_1.log('proxyClient', "Target => End(\u5916\u7F51\u5730\u5740=" + outerAddress + ")"); var proxySocket = _this.proxySocketList[outerAddress]; if (proxySocket) { pao_aop_1.log('proxyClient', "End => Proxy(\u5916\u7F51\u5730\u5740=" + outerAddress + ")"); proxySocket.end(); } }); targetSocket.once('connect', function () { try { pao_aop_1.log('proxyClient', "\u76EE\u6807\u670D\u52A1\u5668" + socket_1.getSocketRemoteAddress(targetSocket) + "\u8FDE\u63A5\u6210\u529F, \u5916\u7F51\u5730\u5740:" + outerAddress); _this.targetSocketList[outerAddress] = targetSocket; } catch (error) { pao_aop_1.log('proxyServer', error, 'error'); } }); // 连接目标服务器 pao_aop_1.log('proxyClient', "\u5F00\u59CB\u8FDE\u63A5\u76EE\u6807\u670D\u52A1\u5668" + this.targetServer + ":" + this.targetServerPort + ", \u5916\u7F51\u5730\u5740:" + outerAddress); targetSocket.connect(this.targetServerPort, this.targetServer); }; return ReverseProxyClient; }(base_1.BaseServer)); exports.ReverseProxyClient = ReverseProxyClient; }); //# sourceMappingURL=reverseProxy.js.map