lib: re-compile

This commit is contained in:
Micooz 2017-09-21 09:33:02 +08:00
parent e2ac70b8cd
commit 9a74822b7e
No known key found for this signature in database
GPG Key ID: 002FB5DD584D6CB1
25 changed files with 22 additions and 16 deletions

@ -1 +0,0 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _slicedToArray=function(){function sliceIterator(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i['return'])_i['return']()}finally{if(_d)throw _e}}return _arr}return function(arr,i){if(Array.isArray(arr)){return arr}else if(Symbol.iterator in Object(arr)){return sliceIterator(arr,i)}else{throw new TypeError('Invalid attempt to destructure non-iterable instance')}}}();let onConnectToRemote=(()=>{var _ref=_asyncToGenerator(function*(action){var _action$payload=action.payload;const host=_action$payload.host,port=_action$payload.port,onConnected=_action$payload.onConnected;if(__IS_SERVER__){yield this.connect({host,port})}if(__IS_CLIENT__){_utils.logger.info(`[relay] [${this.remote}] request: ${host}:${port}`);yield this.connect({host:__SERVER_HOST__,port:__SERVER_PORT__})}this._isConnectedToRemote=true;if(typeof onConnected==='function'){onConnected()}});return function onConnectToRemote(_x){return _ref.apply(this,arguments)}})();let onPresetFailed=(()=>{var _ref2=_asyncToGenerator(function*(action){var _action$payload2=action.payload;const name=_action$payload2.name,message=_action$payload2.message;_utils.logger.error(`[relay] [${this.remote}] preset "${name}" fail to process: ${message}`);if(__IS_CLIENT__){_utils.logger.warn(`[relay] [${this.remote}] connection closed`);this.destroy()}if(__IS_SERVER__){if(__REDIRECT__){const orgData=action.payload.orgData;var _REDIRECT__$split=__REDIRECT__.split(':'),_REDIRECT__$split2=_slicedToArray(_REDIRECT__$split,2);const host=_REDIRECT__$split2[0],port=_REDIRECT__$split2[1];_utils.logger.warn(`[relay] [${this.remote}] connection is redirecting to: ${host}:${port}`);this.setPresets(function(){return[{name:'tracker'}]});const fsocket=yield this.connect({host,port:+port});if(fsocket&&fsocket.writable){fsocket.write(orgData)}}else{this._bsocket&&this._bsocket.pause();this._fsocket&&this._fsocket.pause();const timeout=(0,_utils.getRandomInt)(10,40);_utils.logger.warn(`[relay] [${this.remote}] connection will be closed in ${timeout}s...`);setTimeout(this.destroy,timeout*1e3)}}});return function onPresetFailed(_x2){return _ref2.apply(this,arguments)}})();exports.default=ActionHandler;var _utils=require('../utils');var _defs=require('../presets/defs');function _asyncToGenerator(fn){return function(){var gen=fn.apply(this,arguments);return new Promise(function(resolve,reject){function step(key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{return Promise.resolve(value).then(function(value){step('next',value)},function(err){step('throw',err)})}}return step('next')})}}const mapping={[_defs.CONNECT_TO_REMOTE]:onConnectToRemote,[_defs.PRESET_FAILED]:onPresetFailed,[_defs.PRESET_CLOSE_CONNECTION]:onPresetCloseConnection,[_defs.PRESET_PAUSE_RECV]:onPresetPauseRecv,[_defs.PRESET_RESUME_RECV]:onPresetResumeRecv,[_defs.PRESET_PAUSE_SEND]:onPresetPauseSend,[_defs.PRESET_RESUME_SEND]:onPresetResumeSend};function onPresetCloseConnection(){_utils.logger.info(`[relay] [${this.remote}] preset request to close connection`);this.destroy()}function onPresetPauseRecv(){__IS_SERVER__?this._bsocket&&this._bsocket.pause():this._fsocket&&this._fsocket.pause()}function onPresetResumeRecv(){__IS_SERVER__?this._bsocket&&this._bsocket.resume():this._fsocket&&this._fsocket.resume()}function onPresetPauseSend(){__IS_SERVER__?this._fsocket&&this._fsocket.pause():this._bsocket&&this._bsocket.pause()}function onPresetResumeSend(){__IS_SERVER__?this._fsocket&&this._fsocket.resume():this._bsocket&&this._bsocket.resume()}function ActionHandler(action){const handler=mapping[action.type];if(typeof handler==='function'){handler.call(this,action)}else{_utils.logger.warn(`unhandled action type: ${action.type}`)}}

File diff suppressed because one or more lines are too long

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.DNSCache=exports.DNS_DEFAULT_EXPIRE=undefined;var _slicedToArray=function(){function sliceIterator(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i['return'])_i['return']()}finally{if(_d)throw _e}}return _arr}return function(arr,i){if(Array.isArray(arr)){return arr}else if(Symbol.iterator in Object(arr)){return sliceIterator(arr,i)}else{throw new TypeError('Invalid attempt to destructure non-iterable instance')}}}();var _dns=require('dns');var _dns2=_interopRequireDefault(_dns);var _net=require('net');var _net2=_interopRequireDefault(_net);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _asyncToGenerator(fn){return function(){var gen=fn.apply(this,arguments);return new Promise(function(resolve,reject){function step(key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{return Promise.resolve(value).then(function(value){step('next',value)},function(err){step('throw',err)})}}return step('next')})}}const DNS_DEFAULT_EXPIRE=exports.DNS_DEFAULT_EXPIRE=3600000;class DNSCache{constructor({expire}={}){this._expire=DNS_DEFAULT_EXPIRE;if(expire!==undefined){this._expire=expire}}_now(){return new Date().getTime()}_lookup(hostname){return _asyncToGenerator(function*(){return new Promise(function(resolve,reject){_dns2.default.lookup(hostname,function(err,address){if(err){reject(err)}else{resolve(address)}})})})()}_put(hostname,address){if(this._expire>0){const expire=this._now()+this._expire;DNSCache._pool[hostname]=[address,expire]}}get(hostname){var _this=this;return _asyncToGenerator(function*(){if(_net2.default.isIP(hostname)){return hostname}let address=null;if(DNSCache._pool[hostname]===undefined){address=yield _this._lookup(hostname);_this._put(hostname,address)}else{var _DNSCache$_pool$hostn=_slicedToArray(DNSCache._pool[hostname],2);const addr=_DNSCache$_pool$hostn[0],expire=_DNSCache$_pool$hostn[1];if(_this._now()>=expire){delete DNSCache._pool[hostname]}address=addr}return address})()}clear(){DNSCache._pool={}}}exports.DNSCache=DNSCache;DNSCache._pool={};
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.DNSCache=exports.DNS_DEFAULT_EXPIRE=undefined;var _slicedToArray=function(){function sliceIterator(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i['return'])_i['return']()}finally{if(_d)throw _e}}return _arr}return function(arr,i){if(Array.isArray(arr)){return arr}else if(Symbol.iterator in Object(arr)){return sliceIterator(arr,i)}else{throw new TypeError('Invalid attempt to destructure non-iterable instance')}}}();var _dns=require('dns');var _dns2=_interopRequireDefault(_dns);var _net=require('net');var _net2=_interopRequireDefault(_net);var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _asyncToGenerator(fn){return function(){var gen=fn.apply(this,arguments);return new Promise(function(resolve,reject){function step(key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{return Promise.resolve(value).then(function(value){step('next',value)},function(err){step('throw',err)})}}return step('next')})}}const DNS_DEFAULT_EXPIRE=exports.DNS_DEFAULT_EXPIRE=3600000;class DNSCache{constructor({expire}={}){this._expire=DNS_DEFAULT_EXPIRE;if(expire!==undefined){this._expire=expire}}_now(){return new Date().getTime()}_lookup(hostname){return _asyncToGenerator(function*(){return new Promise(function(resolve,reject){_dns2.default.lookup(hostname,function(err,address){if(err){reject(err)}else{resolve(address)}})})})()}_put(hostname,address){if(this._expire>0){const expire=this._now()+this._expire;DNSCache._pool[hostname]=[address,expire]}}get(hostname){var _this=this;return _asyncToGenerator(function*(){if(_net2.default.isIP(hostname)){return hostname}let address=null;if(DNSCache._pool[hostname]===undefined){address=yield _this._lookup(hostname);_this._put(hostname,address)}else{var _DNSCache$_pool$hostn=_slicedToArray(DNSCache._pool[hostname],2);const addr=_DNSCache$_pool$hostn[0],expire=_DNSCache$_pool$hostn[1];const now=_this._now();if(now>=expire){delete DNSCache._pool[hostname]}_utils.logger.verbose(`[dns-cache] hit: hostname=${hostname} resolved=${addr} ttl=${expire-now}ms`);address=addr}return address})()}clear(){DNSCache._pool={}}}exports.DNSCache=DNSCache;DNSCache._pool={};

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Hub=undefined;var _cluster=require('cluster');var _cluster2=_interopRequireDefault(_cluster);var _events=require('events');var _events2=_interopRequireDefault(_events);var _net=require('net');var _net2=_interopRequireDefault(_net);var _tls=require('tls');var _tls2=_interopRequireDefault(_tls);var _lodash=require('lodash.uniqueid');var _lodash2=_interopRequireDefault(_lodash);var _balancer=require('./balancer');var _config=require('./config');var _relay=require('./relay');var _middleware=require('./middleware');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _asyncToGenerator(fn){return function(){var gen=fn.apply(this,arguments);return new Promise(function(resolve,reject){function step(key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{return Promise.resolve(value).then(function(value){step('next',value)},function(err){step('throw',err)})}}return step('next')})}}class Hub extends _events2.default{constructor(config){super();this._isFirstWorker=_cluster2.default.worker?_cluster2.default.worker.id<=1:true;this._localServer=null;this._fastestServer=null;this._relays=[];this.onConnect=this.onConnect.bind(this);this.onClose=this.onClose.bind(this);if(config!==undefined){_config.Config.init(config)}if(this._isFirstWorker){_utils.logger.info(`==> [hub] use configuration: ${JSON.stringify(__ALL_CONFIG__)}`);_utils.logger.info(`==> [hub] running as: ${__IS_SERVER__?'server':'client'}`)}if(__IS_CLIENT__){this._isFirstWorker&&_utils.logger.info('==> [balancer] started');_balancer.Balancer.start(__SERVERS__)}}run(){var _this=this;return _asyncToGenerator(function*(){const options={host:__LOCAL_HOST__,port:__LOCAL_PORT__};_this._localServer=_this.createServer();_this._localServer.on('close',_this.onClose);return new Promise(function(resolve){return _this._localServer.listen(options,resolve)})})()}terminate(){this.onClose()}createServer(){if(__IS_SERVER__&&__IS_TLS__){const server=_tls2.default.createServer({key:[__TLS_KEY__],cert:[__TLS_CERT__]});server.on('secureConnection',this.onConnect);return server}else{const server=_net2.default.createServer();server.on('connection',this.onConnect);return server}}selectServer(){const server=_balancer.Balancer.getFastest();if(this._fastestServer===null||server.id!==this._fastestServer.id){this._fastestServer=server;_config.Config.initServer(server);_utils.logger.info(`[balancer] use: ${server.host}:${server.port}`)}}onConnect(socket){if(__IS_CLIENT__){this.selectServer()}const id=(0,_lodash2.default)();const relay=new _relay.Relay({socket});relay.id=id;relay.on('close',()=>{this._relays=this._relays.filter(relay=>relay.id!==id)});this._relays.push(relay);_utils.logger.verbose(`[hub] [${socket.remoteAddress}:${socket.remotePort}] connected`)}onClose(){if(this._localServer!==null){this._relays.forEach(relay=>relay.destroy());this._relays=null;(0,_middleware.cleanup)();if(__IS_CLIENT__){_balancer.Balancer.destroy();this._isFirstWorker&&_utils.logger.info('==> [balancer] stopped')}this._localServer.close();this._localServer=null;this._isFirstWorker&&_utils.logger.info('==> [hub] shutdown');this.emit('close')}}}exports.Hub=Hub;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Hub=undefined;var _extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key]}}}return target};var _cluster=require('cluster');var _cluster2=_interopRequireDefault(_cluster);var _events=require('events');var _events2=_interopRequireDefault(_events);var _net=require('net');var _net2=_interopRequireDefault(_net);var _tls=require('tls');var _tls2=_interopRequireDefault(_tls);var _ws=require('ws');var _ws2=_interopRequireDefault(_ws);var _balancer=require('./balancer');var _config=require('./config');var _middleware=require('./middleware');var _transports=require('../transports');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _asyncToGenerator(fn){return function(){var gen=fn.apply(this,arguments);return new Promise(function(resolve,reject){function step(key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{return Promise.resolve(value).then(function(value){step('next',value)},function(err){step('throw',err)})}}return step('next')})}}class Hub extends _events2.default{constructor(config){super();this._isFirstWorker=_cluster2.default.worker?_cluster2.default.worker.id<=1:true;this._server=null;this._fastestServer=null;this._relays=[];this._onConnection=this._onConnection.bind(this);this._onClose=this._onClose.bind(this);if(config!==undefined){_config.Config.init(config)}}run(){var _this=this;return _asyncToGenerator(function*(){if(_this._server!==null){_this.terminate()}_this._server=yield _this._createServer();if(_this._isFirstWorker){_utils.logger.info(`==> [hub] use configuration: ${JSON.stringify(__ALL_CONFIG__)}`);_utils.logger.info(`==> [hub] running as: ${__IS_SERVER__?'server':'client'}`)}if(__IS_CLIENT__){_this._isFirstWorker&&_utils.logger.info('==> [balancer] started');_balancer.Balancer.start(__SERVERS__)}})()}terminate(){this._onClose()}_createServer(){var _this2=this;return _asyncToGenerator(function*(){const address={host:__LOCAL_HOST__,port:__LOCAL_PORT__};return new Promise(function(resolve){let server=null;if(__IS_SERVER__){if(__TRANSPORT__==='tls'){server=_tls2.default.createServer({key:[__TLS_KEY__],cert:[__TLS_CERT__]});server.on('secureConnection',_this2._onConnection);server.on('close',_this2._onClose);server.listen(address,function(){return resolve(server)});return}if(__TRANSPORT__==='websocket'){server=new _ws2.default.Server(_extends({},address,{perMessageDeflate:false}));server.on('connection',function(ws,req){ws.remoteAddress=req.connection.remoteAddress;ws.remotePort=req.connection.remotePort;_this2._onConnection(ws)});server.on('listening',function(){return resolve(server)});return}}server=_net2.default.createServer();server.on('connection',_this2._onConnection);server.on('close',_this2._onClose);server.listen(address,function(){return resolve(server)})})})()}_selectServer(){const server=_balancer.Balancer.getFastest();if(this._fastestServer===null||server.id!==this._fastestServer.id){this._fastestServer=server;_config.Config.initServer(server);_utils.logger.info(`[balancer] use: ${server.host}:${server.port}`)}}_onConnection(context){if(__IS_CLIENT__){this._selectServer()}const relay=(0,_transports.createRelay)(__TRANSPORT__,context);relay.on('close',()=>this._onRelayClose(relay.id));_utils.logger.verbose(`[hub] [${context.remoteAddress}:${context.remotePort}] connected`);this._relays.push(relay)}_onRelayClose(id){this._relays=this._relays.filter(relay=>relay.id!==id)}_onClose(){if(this._server!==null){this._relays.forEach(relay=>relay.destroy());this._relays=null;(0,_middleware.cleanup)();if(__IS_CLIENT__){_balancer.Balancer.destroy();this._isFirstWorker&&_utils.logger.info('==> [balancer] stopped')}this._server.close();this._server=null;this._isFirstWorker&&_utils.logger.info('==> [hub] shutdown');this.emit('close')}}}exports.Hub=Hub;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _balancer=require('./balancer');Object.keys(_balancer).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _balancer[key]}})});var _config=require('./config');Object.keys(_config).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _config[key]}})});var _hub=require('./hub');Object.keys(_hub).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _hub[key]}})});
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _balancer=require('./balancer');Object.keys(_balancer).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _balancer[key]}})});var _config=require('./config');Object.keys(_config).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _config[key]}})});var _dnsCache=require('./dns-cache');Object.keys(_dnsCache).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _dnsCache[key]}})});var _hub=require('./hub');Object.keys(_hub).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _hub[key]}})});var _pipe=require('./pipe');Object.keys(_pipe).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _pipe[key]}})});var _middleware=require('./middleware');Object.keys(_middleware).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _middleware[key]}})});var _relay=require('./relay');Object.keys(_relay).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _relay[key]}})});

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Pipe=undefined;var _events=require('events');var _events2=_interopRequireDefault(_events);var _middleware=require('./middleware');var _defs=require('../presets/defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class Pipe extends _events2.default{constructor(){super();this._upstream_middlewares=[];this._downstream_middlewares=[];this._cacheBuffer=null;this.broadcast=this.broadcast.bind(this)}broadcast(name,action){const middlewares=this.getMiddlewares();const results=[];var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=middlewares[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){const middleware=_step.value;if(middleware.name!==name){results.push(middleware.notify(action))}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}if(name!=='pipe'&&results.every(result=>!!result===false)){this.emit('broadcast',action)}}setMiddlewares(middlewares){var _iteratorNormalCompletion2=true;var _didIteratorError2=false;var _iteratorError2=undefined;try{for(var _iterator2=middlewares[Symbol.iterator](),_step2;!(_iteratorNormalCompletion2=(_step2=_iterator2.next()).done);_iteratorNormalCompletion2=true){const middleware=_step2.value;middleware.setMaxListeners(4);middleware.on('broadcast',this.broadcast);middleware.on('fail',(name,message)=>void this.broadcast(name,{type:_defs.PRESET_FAILED,payload:{name,message,orgData:this._cacheBuffer}}))}}catch(err){_didIteratorError2=true;_iteratorError2=err}finally{try{if(!_iteratorNormalCompletion2&&_iterator2.return){_iterator2.return()}}finally{if(_didIteratorError2){throw _iteratorError2}}}this._upstream_middlewares=middlewares;this._downstream_middlewares=[].concat(middlewares).reverse()}getMiddlewares(direction=_middleware.MIDDLEWARE_DIRECTION_UPWARD){if(direction===_middleware.MIDDLEWARE_DIRECTION_UPWARD){return this._upstream_middlewares}else{return this._downstream_middlewares}}feed(direction,buffer){this._cacheBuffer=buffer;const eventName=`next_${direction}`;const middlewares=this.getMiddlewares(direction);const direct=(buf,isReverse=false)=>this.emit(isReverse?`next_${-direction}`:eventName,buf);const last=middlewares.reduce((prev,next)=>{if(!prev.hasListener(eventName)){prev.on(eventName,buf=>next.write(direction,{buffer:buf,direct}))}return next});if(!last.hasListener(eventName)){last.on(eventName,direct)}middlewares[0].write(direction,{buffer,direct})}destroy(){const middlewares=this.getMiddlewares();var _iteratorNormalCompletion3=true;var _didIteratorError3=false;var _iteratorError3=undefined;try{for(var _iterator3=middlewares[Symbol.iterator](),_step3;!(_iteratorNormalCompletion3=(_step3=_iterator3.next()).done);_iteratorNormalCompletion3=true){const middleware=_step3.value;middleware.onDestroy()}}catch(err){_didIteratorError3=true;_iteratorError3=err}finally{try{if(!_iteratorNormalCompletion3&&_iterator3.return){_iterator3.return()}}finally{if(_didIteratorError3){throw _iteratorError3}}}this._upstream_middlewares=null;this._downstream_middlewares=null;this._cacheBuffer=null;this.removeAllListeners()}}exports.Pipe=Pipe;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Pipe=undefined;var _events=require('events');var _events2=_interopRequireDefault(_events);var _middleware=require('./middleware');var _defs=require('../presets/defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class Pipe extends _events2.default{get destroyed(){return this._destroyed}constructor(){super();this._upstream_middlewares=[];this._downstream_middlewares=[];this._cacheBuffer=null;this._destroyed=false;this.broadcast=this.broadcast.bind(this)}broadcast(name,action){const middlewares=this.getMiddlewares();const results=[];var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=middlewares[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){const middleware=_step.value;if(middleware.name!==name){results.push(middleware.notify(action))}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}if(name!=='pipe'&&results.every(result=>!!result===false)){this.emit('broadcast',action)}}setMiddlewares(middlewares){var _iteratorNormalCompletion2=true;var _didIteratorError2=false;var _iteratorError2=undefined;try{for(var _iterator2=middlewares[Symbol.iterator](),_step2;!(_iteratorNormalCompletion2=(_step2=_iterator2.next()).done);_iteratorNormalCompletion2=true){const middleware=_step2.value;middleware.setMaxListeners(4);middleware.on('broadcast',this.broadcast);middleware.on('fail',(name,message)=>void this.broadcast(name,{type:_defs.PRESET_FAILED,payload:{name,message,orgData:this._cacheBuffer}}))}}catch(err){_didIteratorError2=true;_iteratorError2=err}finally{try{if(!_iteratorNormalCompletion2&&_iterator2.return){_iterator2.return()}}finally{if(_didIteratorError2){throw _iteratorError2}}}this._upstream_middlewares=middlewares;this._downstream_middlewares=[].concat(middlewares).reverse()}getMiddlewares(direction=_middleware.MIDDLEWARE_DIRECTION_UPWARD){if(direction===_middleware.MIDDLEWARE_DIRECTION_UPWARD){return this._upstream_middlewares}else{return this._downstream_middlewares}}feed(direction,buffer){this._cacheBuffer=buffer;const eventName=`next_${direction}`;const middlewares=this.getMiddlewares(direction);const direct=(buf,isReverse=false)=>this.emit(isReverse?`next_${-direction}`:eventName,buf);const last=middlewares.reduce((prev,next)=>{if(!prev.hasListener(eventName)){prev.on(eventName,buf=>next.write(direction,{buffer:buf,direct}))}return next});if(!last.hasListener(eventName)){last.on(eventName,direct)}middlewares[0].write(direction,{buffer,direct})}destroy(){const middlewares=this.getMiddlewares();var _iteratorNormalCompletion3=true;var _didIteratorError3=false;var _iteratorError3=undefined;try{for(var _iterator3=middlewares[Symbol.iterator](),_step3;!(_iteratorNormalCompletion3=(_step3=_iterator3.next()).done);_iteratorNormalCompletion3=true){const middleware=_step3.value;middleware.onDestroy()}}catch(err){_didIteratorError3=true;_iteratorError3=err}finally{try{if(!_iteratorNormalCompletion3&&_iterator3.return){_iterator3.return()}}finally{if(_didIteratorError3){throw _iteratorError3}}}this._upstream_middlewares=null;this._downstream_middlewares=null;this._cacheBuffer=null;this._destroyed=true;this.removeAllListeners()}}exports.Pipe=Pipe;

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _baseAuthStream=require('./base-auth-stream');var _baseAuthStream2=_interopRequireDefault(_baseAuthStream);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class ExpBaseAuthStreamPreset extends _baseAuthStream2.default{}exports.default=ExpBaseAuthStreamPreset;

@ -0,0 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _baseWithPadding=require('./base-with-padding');var _baseWithPadding2=_interopRequireDefault(_baseWithPadding);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class ExpBaseWithPaddingPreset extends _baseWithPadding2.default{}exports.default=ExpBaseWithPaddingPreset;

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _utils=require('../utils');var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const IV_LEN=16;const HMAC_LEN=16;const ciphers=['aes-128-ctr','aes-192-ctr','aes-256-ctr','aes-128-cfb','aes-192-cfb','aes-256-cfb','camellia-128-cfb','camellia-192-cfb','camellia-256-cfb'];class BaseAuthStreamPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._isHandshakeDone=false,this._isBroadCasting=false,this._staging=Buffer.alloc(0),this._host=null,this._port=null,this._cipher=null,this._decipher=null,_temp}static checkParams({method}){if(!ciphers.includes(method)){throw Error(`'method' must be one of [${ciphers}]`)}}static onInit({method}){BaseAuthStreamPreset.cipherName=method;BaseAuthStreamPreset.key=(0,_utils.EVP_BytesToKey)(__KEY__,method.split('-')[1]/8,IV_LEN)}onDestroy(){this._staging=null;this._host=null;this._port=null;this._cipher=null;this._decipher=null}onNotified(action){if(__IS_CLIENT__&&action.type===_defs.CONNECT_TO_REMOTE){var _action$payload=action.payload;const host=_action$payload.host,port=_action$payload.port;this._host=Buffer.from(host);this._port=(0,_utils.numberToBuffer)(port)}}clientOut({buffer}){if(!this._isHandshakeDone){this._isHandshakeDone=true;const iv=_crypto2.default.randomBytes(IV_LEN);const secretKey=BaseAuthStreamPreset.key;const keyForHMAC=(0,_utils.xor)(iv,secretKey.slice(0,IV_LEN));this._cipher=_crypto2.default.createCipheriv(BaseAuthStreamPreset.cipherName,secretKey,iv);this._decipher=_crypto2.default.createDecipheriv(BaseAuthStreamPreset.cipherName,secretKey,iv);const encBuf=this.encrypt(Buffer.concat([(0,_utils.numberToBuffer)(this._host.length,1),this._host,this._port,buffer]));const hmacEncAddr=(0,_utils.hmac)('sha1',keyForHMAC,encBuf.slice(0,-buffer.length)).slice(0,HMAC_LEN);return Buffer.concat([iv,hmacEncAddr,encBuf])}else{return this.encrypt(buffer)}}serverIn({buffer,next,broadcast,fail}){if(!this._isHandshakeDone){if(this._isBroadCasting){this._staging=Buffer.concat([this._staging,buffer]);return}if(buffer.length<37){return fail(`unexpected buffer length_1: ${buffer.length}, buffer=${buffer.toString('hex')}`)}const iv=buffer.slice(0,IV_LEN);const secretKey=BaseAuthStreamPreset.key;this._cipher=_crypto2.default.createCipheriv(BaseAuthStreamPreset.cipherName,secretKey,iv);this._decipher=_crypto2.default.createDecipheriv(BaseAuthStreamPreset.cipherName,secretKey,iv);const tailBuffer=this.decrypt(buffer.slice(32));const providedHmac=buffer.slice(16,32);const alen=tailBuffer[0];if(buffer.length<=35+alen){return fail(`unexpected buffer length_2: ${buffer.length}, buffer=${buffer.toString('hex')}`)}const keyForHMAC=(0,_utils.xor)(iv,secretKey.slice(0,IV_LEN));const expHmac=(0,_utils.hmac)('sha1',keyForHMAC,buffer.slice(32,35+alen)).slice(0,HMAC_LEN);if(!expHmac.equals(providedHmac)){return fail(`unexpected HMAC-SHA1=${providedHmac.toString('hex')} want=${expHmac.toString('hex')}`)}const addr=tailBuffer.slice(1,alen+1).toString();const port=tailBuffer.slice(alen+1,alen+3).readUInt16BE(0);const data=tailBuffer.slice(alen+3);this._isBroadCasting=true;broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:addr,port:port,onConnected:()=>{next(Buffer.concat([data,this._staging]));this._isHandshakeDone=true;this._isBroadCasting=false;this._staging=null}}})}else{return this.decrypt(buffer)}}serverOut({buffer}){return this.encrypt(buffer)}clientIn({buffer}){return this.decrypt(buffer)}encrypt(buffer){return this._cipher.update(buffer)}decrypt(buffer){return this._decipher.update(buffer)}}exports.default=BaseAuthStreamPreset;BaseAuthStreamPreset.cipherName='';BaseAuthStreamPreset.key=null;

@ -0,0 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _net=require('net');var _net2=_interopRequireDefault(_net);var _ip=require('ip');var _ip2=_interopRequireDefault(_ip);var _utils=require('../utils');var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class BaseWithPaddingPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._isHandshakeDone=false,this._isBroadCasting=false,this._staging=Buffer.alloc(0),this._host=null,this._port=null,_temp}static checkParams({salt}){if(typeof salt!=='string'||salt===''){throw Error('\'salt\' must be a non-empty string')}}static onInit({salt}){BaseWithPaddingPreset.padding=(0,_utils.hash)('sha256',salt).slice(0,15)}onDestroy(){this._staging=null;this._host=null;this._port=null}onNotified(action){if(__IS_CLIENT__&&action.type===_defs.CONNECT_TO_REMOTE){var _action$payload=action.payload;const host=_action$payload.host,port=_action$payload.port;this._host=Buffer.from(host);this._port=(0,_utils.numberToBuffer)(port)}}clientOut({buffer}){if(!this._isHandshakeDone){this._isHandshakeDone=true;return Buffer.concat([(0,_utils.numberToBuffer)(this._host.length,1),BaseWithPaddingPreset.padding,this._host,this._port,buffer])}else{return buffer}}serverIn({buffer,next,broadcast,fail}){if(!this._isHandshakeDone){if(this._isBroadCasting){this._staging=Buffer.concat([this._staging,buffer]);return}if(buffer.length<20){return fail(`unexpected buffer length: ${buffer.length}, buffer=${buffer.toString('hex')}`)}if(!buffer.slice(1,16).equals(BaseWithPaddingPreset.padding)){return fail(`unexpected padding=${BaseWithPaddingPreset.padding.toString('hex')}`)}const alen=buffer[0];if(buffer.length<=alen+18){return fail(`unexpected buffer length: ${buffer.length}, buffer=${buffer.toString('hex')}`)}let addr=buffer.slice(16,16+alen);if((0,_utils.isValidHostname)(addr.toString())){addr=addr.toString()}else if(_net2.default.isIP(addr)){addr=_ip2.default.toString(addr)}else{return fail(`invalid addr: (${addr.toString()})`)}const port=buffer.slice(alen+16,alen+18).readUInt16BE(0);const data=buffer.slice(alen+18);this._isBroadCasting=true;broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:addr,port:port,onConnected:()=>{next(Buffer.concat([data,this._staging]));this._isHandshakeDone=true;this._isBroadCasting=false;this._staging=null}}})}else{return buffer}}}exports.default=BaseWithPaddingPreset;BaseWithPaddingPreset.padding=null;

@ -1 +0,0 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _utils=require('../utils');var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const IV_LEN=16;const HMAC_LEN=16;const ciphers=['aes-128-ctr','aes-192-ctr','aes-256-ctr','aes-128-cfb','aes-192-cfb','aes-256-cfb','camellia-128-cfb','camellia-192-cfb','camellia-256-cfb'];class ExpBaseAuthStreamPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._isHandshakeDone=false,this._isBroadCasting=false,this._staging=Buffer.alloc(0),this._host=null,this._port=null,this._cipher=null,this._decipher=null,_temp}static checkParams({method}){if(!ciphers.includes(method)){throw Error(`'method' must be one of [${ciphers}]`)}}static onInit({method}){this.cipherName=method;this.key=(0,_utils.EVP_BytesToKey)(__KEY__,method.split('-')[1]/8,IV_LEN)}onDestroy(){this._staging=null;this._host=null;this._port=null;this._cipher=null;this._decipher=null}onNotified(action){if(__IS_CLIENT__&&action.type===_defs.CONNECT_TO_REMOTE){var _action$payload=action.payload;const host=_action$payload.host,port=_action$payload.port;this._host=Buffer.from(host);this._port=(0,_utils.numberToBuffer)(port)}}clientOut({buffer}){if(!this._isHandshakeDone){this._isHandshakeDone=true;const iv=_crypto2.default.randomBytes(IV_LEN);const secretKey=ExpBaseAuthStreamPreset.key;const keyForHMAC=(0,_utils.xor)(iv,secretKey.slice(0,IV_LEN));this._cipher=_crypto2.default.createCipheriv(ExpBaseAuthStreamPreset.cipherName,secretKey,iv);this._decipher=_crypto2.default.createDecipheriv(ExpBaseAuthStreamPreset.cipherName,secretKey,iv);const encBuf=this.encrypt(Buffer.concat([(0,_utils.numberToBuffer)(this._host.length,1),this._host,this._port,buffer]));const hmacEncAddr=(0,_utils.hmac)('sha1',keyForHMAC,encBuf.slice(0,-buffer.length)).slice(0,HMAC_LEN);return Buffer.concat([iv,hmacEncAddr,encBuf])}else{return this.encrypt(buffer)}}serverIn({buffer,next,broadcast,fail}){if(!this._isHandshakeDone){if(this._isBroadCasting){this._staging=Buffer.concat([this._staging,buffer]);return}if(buffer.length<37){return fail(`unexpected buffer length_1: ${buffer.length}, buffer=${buffer.toString('hex')}`)}const iv=buffer.slice(0,IV_LEN);const secretKey=ExpBaseAuthStreamPreset.key;this._cipher=_crypto2.default.createCipheriv(ExpBaseAuthStreamPreset.cipherName,secretKey,iv);this._decipher=_crypto2.default.createDecipheriv(ExpBaseAuthStreamPreset.cipherName,secretKey,iv);const tailBuffer=this.decrypt(buffer.slice(32));const providedHmac=buffer.slice(16,32);const alen=tailBuffer[0];if(buffer.length<=35+alen){return fail(`unexpected buffer length_2: ${buffer.length}, buffer=${buffer.toString('hex')}`)}const keyForHMAC=(0,_utils.xor)(iv,secretKey.slice(0,IV_LEN));const expHmac=(0,_utils.hmac)('sha1',keyForHMAC,buffer.slice(32,35+alen)).slice(0,HMAC_LEN);if(!expHmac.equals(providedHmac)){return fail(`unexpected HMAC-SHA1=${providedHmac.toString('hex')} want=${expHmac.toString('hex')}`)}const addr=tailBuffer.slice(1,alen+1).toString();const port=tailBuffer.slice(alen+1,alen+3).readUInt16BE(0);const data=tailBuffer.slice(alen+3);this._isBroadCasting=true;broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:addr,port:port,onConnected:()=>{next(Buffer.concat([data,this._staging]));this._isHandshakeDone=true;this._isBroadCasting=false;this._staging=null}}})}else{return this.decrypt(buffer)}}serverOut({buffer}){return this.encrypt(buffer)}clientIn({buffer}){return this.decrypt(buffer)}encrypt(buffer){return this._cipher.update(buffer)}decrypt(buffer){return this._decipher.update(buffer)}}exports.default=ExpBaseAuthStreamPreset;ExpBaseAuthStreamPreset.cipherName='';ExpBaseAuthStreamPreset.key=null;

@ -1 +0,0 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _net=require('net');var _net2=_interopRequireDefault(_net);var _ip=require('ip');var _ip2=_interopRequireDefault(_ip);var _utils=require('../utils');var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class ExpBaseWithPaddingPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._isHandshakeDone=false,this._isBroadCasting=false,this._staging=Buffer.alloc(0),this._host=null,this._port=null,_temp}static checkParams({salt}){if(typeof salt!=='string'||salt===''){throw Error('\'salt\' must be a non-empty string')}}static onInit({salt}){this.padding=(0,_utils.hash)('sha256',salt).slice(0,15)}onDestroy(){this._staging=null;this._host=null;this._port=null}onNotified(action){if(__IS_CLIENT__&&action.type===_defs.CONNECT_TO_REMOTE){var _action$payload=action.payload;const host=_action$payload.host,port=_action$payload.port;this._host=Buffer.from(host);this._port=(0,_utils.numberToBuffer)(port)}}clientOut({buffer}){if(!this._isHandshakeDone){this._isHandshakeDone=true;return Buffer.concat([(0,_utils.numberToBuffer)(this._host.length,1),ExpBaseWithPaddingPreset.padding,this._host,this._port,buffer])}else{return buffer}}serverIn({buffer,next,broadcast,fail}){if(!this._isHandshakeDone){if(this._isBroadCasting){this._staging=Buffer.concat([this._staging,buffer]);return}if(buffer.length<20){return fail(`unexpected buffer length: ${buffer.length}, buffer=${buffer.toString('hex')}`)}if(!buffer.slice(1,16).equals(ExpBaseWithPaddingPreset.padding)){return fail(`unexpected padding=${ExpBaseWithPaddingPreset.padding.toString('hex')}`)}const alen=buffer[0];if(buffer.length<=alen+18){return fail(`unexpected buffer length: ${buffer.length}, buffer=${buffer.toString('hex')}`)}let addr=buffer.slice(16,16+alen);if((0,_utils.isValidHostname)(addr.toString())){addr=addr.toString()}else if(_net2.default.isIP(addr)){addr=_ip2.default.toString(addr)}else{return fail(`invalid addr: (${addr.toString()})`)}const port=buffer.slice(alen+16,alen+18).readUInt16BE(0);const data=buffer.slice(alen+18);this._isBroadCasting=true;broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:addr,port:port,onConnected:()=>{next(Buffer.concat([data,this._staging]));this._isHandshakeDone=true;this._isBroadCasting=false;this._staging=null}}})}else{return buffer}}}exports.default=ExpBaseWithPaddingPreset;ExpBaseWithPaddingPreset.padding=null;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _zlib=require('zlib');var _zlib2=_interopRequireDefault(_zlib);var _utils=require('../utils');var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const factories={'gzip':[_zlib2.default.createGzip,_zlib2.default.createGunzip],'deflate':[_zlib2.default.createDeflate,_zlib2.default.createInflate]};const options={flush:_zlib2.default.Z_PARTIAL_FLUSH};class ExpCompressPreset extends _defs.IPreset{static checkParams({method}){const methods=Object.keys(factories);if(!methods.includes(method)){throw Error(`'method' must be one of [${methods}]`)}}constructor({method}){super();this._method='';this._compressor=null;this._decompressor=null;this._outBytesA=0;this._outBytesB=0;this._inBytesA=0;this._inBytesB=0;this._method=method}onNotified(action){if(action.type===_defs.CONNECTION_CLOSED){_utils.logger.debug(`compression ratio: ${this._outBytesB/this._outBytesA}`);_utils.logger.debug(`decompression ratio: ${this._inBytesB/this._inBytesA}`)}}beforeOut({buffer,next,fail}){if(this._compressor===null){this._compressor=factories[this._method][0](options);this._compressor.on('error',err=>fail(err.message));this._compressor.on('data',buf=>{this._outBytesB+=buf.length;next(buf)})}this._compressor.write(buffer);this._outBytesA+=buffer.length}beforeIn({buffer,next,fail}){if(this._decompressor===null){this._decompressor=factories[this._method][1](options);this._decompressor.on('error',err=>fail(err.message));this._decompressor.on('data',buf=>{this._inBytesB+=buf.length;next(buf)})}this._decompressor.write(buffer);this._inBytesA+=buffer.length}}exports.default=ExpCompressPreset;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _slicedToArray=function(){function sliceIterator(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i['return'])_i['return']()}finally{if(_d)throw _e}}return _arr}return function(arr,i){if(Array.isArray(arr)){return arr}else if(Symbol.iterator in Object(arr)){return sliceIterator(arr,i)}else{throw new TypeError('Invalid attempt to destructure non-iterable instance')}}}();var _zlib=require('zlib');var _zlib2=_interopRequireDefault(_zlib);var _defs=require('./defs');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _asyncToGenerator(fn){return function(){var gen=fn.apply(this,arguments);return new Promise(function(resolve,reject){function step(key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{return Promise.resolve(value).then(function(value){step('next',value)},function(err){step('throw',err)})}}return step('next')})}}const factories={'gzip':[_zlib2.default.gzipSync,_zlib2.default.gunzipSync],'deflate':[_zlib2.default.deflateSync,_zlib2.default.inflateSync]};const DEFAULT_METHOD='deflate';const DEFAULT_THRESHOLD='5kb';const DEFAULT_OPTIONS={};function parseSize(size){const regex=/^(\d+)(b|k|kb|m|mb)$/g;const results=regex.exec(size.toLowerCase());if(results!==null){var _results=_slicedToArray(results,3);const num=_results[1],unit=_results[2];return+num*{'b':1,'k':1024,'kb':1024,'m':1048576,'mb':1048576}[unit]}return null}class ExpCompressPreset extends _defs.IPreset{static checkParams({method=DEFAULT_METHOD,threshold=DEFAULT_THRESHOLD}){const methods=Object.keys(factories);if(!methods.includes(method)){throw Error(`'method' must be one of [${methods}]`)}const minSize=parseSize(threshold);if(minSize===null){throw Error(`'threshold': ${threshold} is invalid`)}if(minSize<1024){_utils.logger.warn('compress chunk less than 1kb can be inefficient')}}constructor({method=DEFAULT_METHOD,threshold=DEFAULT_THRESHOLD,options=DEFAULT_OPTIONS}){super();this._method='';this._threshold=0;this._options={};this._adBuf=null;this._isTransferSSL=false;this._outBytesA=0;this._outBytesB=0;this._method=method;this._threshold=parseSize(threshold);this._options=options;this._adBuf=new _utils.AdvancedBuffer({getPacketLength:this.onReceiving.bind(this)});this._adBuf.on('data',this.onReceived.bind(this))}onNotified(action){switch(action.type){case _defs.CONNECT_TO_REMOTE:this._isTransferSSL=[22,443].includes(action.payload.port);break;case _defs.CONNECTION_CLOSED:_utils.logger.debug(`overall compression ratio: ${this._outBytesB/this._outBytesA}`);break;default:break;}}beforeOut({buffer,fail}){const chunks=(0,_utils.getChunks)(buffer,32767).map(chunk=>{this._outBytesA+=chunk.length+2;let _data=chunk;let _len=chunk.length;if(chunk.length>this._threshold&&!this._isTransferSSL){try{const compressed=this.compress(buffer);if(compressed.length<32767){_data=compressed;_len=_data.length|32768}}catch(err){fail(`cannot compress chunk: ${err.message}`)}}return Buffer.concat([(0,_utils.numberToBuffer)(_len),_data])});const data=Buffer.concat(chunks);this._outBytesB+=data.length;return data}beforeIn({buffer,next,fail}){this._adBuf.put(buffer,{next,fail})}onReceiving(buffer){if(buffer.length<2){return}return 2+(buffer.readUInt16BE(0)&32767)}onReceived(chunk,{next,fail}){var _this=this;return _asyncToGenerator(function*(){const len=chunk.readUInt16BE(0);const data=chunk.slice(2);if(len>>15===1){try{next(_this.decompress(data))}catch(err){fail(`cannot decompress chunk: ${err.message}`)}}else{next(data)}})()}compress(buffer){return factories[this._method][0](buffer,this._options)}decompress(buffer){return factories[this._method][1](buffer,this._options)}}exports.default=ExpCompressPreset;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.presets=exports.getPresetClassByName=undefined;var _defs=require('./defs');Object.keys(_defs).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _defs[key]}})});var _proxy=require('./proxy');var _proxy2=_interopRequireDefault(_proxy);var _tunnel=require('./tunnel');var _tunnel2=_interopRequireDefault(_tunnel);var _stats=require('./stats');var _stats2=_interopRequireDefault(_stats);var _tracker=require('./tracker');var _tracker2=_interopRequireDefault(_tracker);var _accessControl=require('./access-control');var _accessControl2=_interopRequireDefault(_accessControl);var _ssBase=require('./ss-base');var _ssBase2=_interopRequireDefault(_ssBase);var _ssStreamCipher=require('./ss-stream-cipher');var _ssStreamCipher2=_interopRequireDefault(_ssStreamCipher);var _ssAeadCipher=require('./ss-aead-cipher');var _ssAeadCipher2=_interopRequireDefault(_ssAeadCipher);var _v2rayVmess=require('./v2ray-vmess');var _v2rayVmess2=_interopRequireDefault(_v2rayVmess);var _obfsRandomPadding=require('./obfs-random-padding');var _obfsRandomPadding2=_interopRequireDefault(_obfsRandomPadding);var _obfsHttp=require('./obfs-http');var _obfsHttp2=_interopRequireDefault(_obfsHttp);var _obfsTls=require('./obfs-tls1.2-ticket');var _obfsTls2=_interopRequireDefault(_obfsTls);var _expCompress=require('./exp-compress');var _expCompress2=_interopRequireDefault(_expCompress);var _expBaseWithPadding=require('./exp-base-with-padding');var _expBaseWithPadding2=_interopRequireDefault(_expBaseWithPadding);var _expBaseAuthStream=require('./exp-base-auth-stream');var _expBaseAuthStream2=_interopRequireDefault(_expBaseAuthStream);var _aeadRandomCipher=require('./aead-random-cipher');var _aeadRandomCipher2=_interopRequireDefault(_aeadRandomCipher);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const mapping={'proxy':_proxy2.default,'tunnel':_tunnel2.default,'stats':_stats2.default,'tracker':_tracker2.default,'access-control':_accessControl2.default,'ss-base':_ssBase2.default,'ss-stream-cipher':_ssStreamCipher2.default,'ss-aead-cipher':_ssAeadCipher2.default,'v2ray-vmess':_v2rayVmess2.default,'obfs-random-padding':_obfsRandomPadding2.default,'obfs-http':_obfsHttp2.default,'obfs-tls1.2-ticket':_obfsTls2.default,'exp-base-with-padding':_expBaseWithPadding2.default,'exp-base-auth-stream':_expBaseAuthStream2.default,'exp-compress':_expCompress2.default,'aead-random-cipher':_aeadRandomCipher2.default};const presets=Object.keys(mapping);function getPresetClassByName(name){const clazz=mapping[name];if(clazz===undefined){throw Error(`cannot find preset: "${name}"`)}return clazz}exports.getPresetClassByName=getPresetClassByName;exports.presets=presets;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.legacyPresets=exports.presets=exports.getPresetClassByName=undefined;var _extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key]}}}return target};var _defs=require('./defs');Object.keys(_defs).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _defs[key]}})});var _proxy=require('./proxy');var _proxy2=_interopRequireDefault(_proxy);var _tunnel=require('./tunnel');var _tunnel2=_interopRequireDefault(_tunnel);var _stats=require('./stats');var _stats2=_interopRequireDefault(_stats);var _tracker=require('./tracker');var _tracker2=_interopRequireDefault(_tracker);var _accessControl=require('./access-control');var _accessControl2=_interopRequireDefault(_accessControl);var _baseWithPadding=require('./base-with-padding');var _baseWithPadding2=_interopRequireDefault(_baseWithPadding);var _baseAuthStream=require('./base-auth-stream');var _baseAuthStream2=_interopRequireDefault(_baseAuthStream);var _ssBase=require('./ss-base');var _ssBase2=_interopRequireDefault(_ssBase);var _ssStreamCipher=require('./ss-stream-cipher');var _ssStreamCipher2=_interopRequireDefault(_ssStreamCipher);var _ssAeadCipher=require('./ss-aead-cipher');var _ssAeadCipher2=_interopRequireDefault(_ssAeadCipher);var _v2rayVmess=require('./v2ray-vmess');var _v2rayVmess2=_interopRequireDefault(_v2rayVmess);var _obfsRandomPadding=require('./obfs-random-padding');var _obfsRandomPadding2=_interopRequireDefault(_obfsRandomPadding);var _obfsHttp=require('./obfs-http');var _obfsHttp2=_interopRequireDefault(_obfsHttp);var _obfsTls=require('./obfs-tls1.2-ticket');var _obfsTls2=_interopRequireDefault(_obfsTls);var _expCompress=require('./exp-compress');var _expCompress2=_interopRequireDefault(_expCompress);var _aeadRandomCipher=require('./aead-random-cipher');var _aeadRandomCipher2=_interopRequireDefault(_aeadRandomCipher);var _expBaseWithPadding=require('./_exp-base-with-padding');var _expBaseWithPadding2=_interopRequireDefault(_expBaseWithPadding);var _expBaseAuthStream=require('./_exp-base-auth-stream');var _expBaseAuthStream2=_interopRequireDefault(_expBaseAuthStream);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const mapping={'proxy':_proxy2.default,'tunnel':_tunnel2.default,'stats':_stats2.default,'tracker':_tracker2.default,'access-control':_accessControl2.default,'base-with-padding':_baseWithPadding2.default,'base-auth-stream':_baseAuthStream2.default,'ss-base':_ssBase2.default,'ss-stream-cipher':_ssStreamCipher2.default,'ss-aead-cipher':_ssAeadCipher2.default,'v2ray-vmess':_v2rayVmess2.default,'obfs-random-padding':_obfsRandomPadding2.default,'obfs-http':_obfsHttp2.default,'obfs-tls1.2-ticket':_obfsTls2.default,'exp-compress':_expCompress2.default,'aead-random-cipher':_aeadRandomCipher2.default};const legacy={'exp-base-with-padding':_expBaseWithPadding2.default,'exp-base-auth-stream':_expBaseAuthStream2.default};const presets=Object.keys(mapping);const legacyPresets=Object.keys(legacy);function getPresetClassByName(name){const clazz=_extends({},mapping,legacy)[name];if(clazz===undefined){throw Error(`cannot find preset: "${name}"`)}return clazz}exports.getPresetClassByName=getPresetClassByName;exports.presets=presets;exports.legacyPresets=legacyPresets;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _slicedToArray=function(){function sliceIterator(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i['return'])_i['return']()}finally{if(_d)throw _e}}return _arr}return function(arr,i){if(Array.isArray(arr)){return arr}else if(Symbol.iterator in Object(arr)){return sliceIterator(arr,i)}else{throw new TypeError('Invalid attempt to destructure non-iterable instance')}}}();var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _utils=require('../utils');var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const NONCE_LEN=12;const TAG_LEN=16;const MIN_CHUNK_LEN=TAG_LEN*2+3;const MIN_CHUNK_SPLIT_LEN=2048;const MAX_CHUNK_SPLIT_LEN=16383;const ciphers={'aes-128-gcm':16,'aes-192-gcm':24,'aes-256-gcm':32};const HKDF_HASH_ALGORITHM='sha1';class SsAeadCipherPreset extends _defs.IPreset{static checkParams({method}){const cipherNames=Object.keys(ciphers);if(!cipherNames.includes(method)){throw Error(`'method' must be one of [${cipherNames}]`)}}static onInit({method}){this.cipherName=method;this.keySaltSize=ciphers[method];this.evpKey=(0,_utils.EVP_BytesToKey)(__KEY__,this.keySaltSize,16)}constructor(){super();this._cipherKey=null;this._decipherKey=null;this._cipherNonce=0;this._decipherNonce=0;this._adBuf=null;this._adBuf=new _utils.AdvancedBuffer({getPacketLength:this.onReceiving.bind(this)});this._adBuf.on('data',this.onChunkReceived.bind(this))}onDestroy(){this._adBuf.clear();this._adBuf=null;this._cipherKey=null;this._decipherKey=null;this._cipherNonce=0;this._decipherNonce=0}beforeOut({buffer}){let salt=null;if(this._cipherKey===null){const size=SsAeadCipherPreset.keySaltSize;salt=_crypto2.default.randomBytes(size);this._cipherKey=(0,_utils.HKDF)(HKDF_HASH_ALGORITHM,salt,SsAeadCipherPreset.evpKey,SsAeadCipherPreset.info,size)}const chunks=(0,_utils.getRandomChunks)(buffer,MIN_CHUNK_SPLIT_LEN,MAX_CHUNK_SPLIT_LEN).map(chunk=>{const dataLen=(0,_utils.numberToBuffer)(chunk.length);var _encrypt=this.encrypt(dataLen),_encrypt2=_slicedToArray(_encrypt,2);const encLen=_encrypt2[0],lenTag=_encrypt2[1];var _encrypt3=this.encrypt(chunk),_encrypt4=_slicedToArray(_encrypt3,2);const encData=_encrypt4[0],dataTag=_encrypt4[1];return Buffer.concat([encLen,lenTag,encData,dataTag])});if(salt){return Buffer.concat([salt,...chunks])}else{return Buffer.concat(chunks)}}beforeIn({buffer,next,fail}){this._adBuf.put(buffer,{next,fail})}onReceiving(buffer,{fail}){if(this._decipherKey===null){const size=SsAeadCipherPreset.keySaltSize;if(buffer.length<size){return}const salt=buffer.slice(0,size);this._decipherKey=(0,_utils.HKDF)(HKDF_HASH_ALGORITHM,salt,SsAeadCipherPreset.evpKey,SsAeadCipherPreset.info,size);return buffer.slice(size)}if(buffer.length<MIN_CHUNK_LEN){return}var _ref=[buffer.slice(0,2),buffer.slice(2,2+TAG_LEN)];const encLen=_ref[0],lenTag=_ref[1];const dataLenBuf=this.decrypt(encLen,lenTag);if(dataLenBuf===null){fail(`unexpected DataLen_TAG=${lenTag.toString('hex')} when verify DataLen=${encLen.toString('hex')}, dump=${buffer.slice(0,60).toString('hex')}`);return-1}const dataLen=dataLenBuf.readUInt16BE(0);if(dataLen>MAX_CHUNK_SPLIT_LEN){fail(`invalid DataLen=${dataLen} is over ${MAX_CHUNK_SPLIT_LEN}, dump=${buffer.slice(0,60).toString('hex')}`);return-1}return 2+TAG_LEN+dataLen+TAG_LEN}onChunkReceived(chunk,{next,fail}){var _ref2=[chunk.slice(2+TAG_LEN,-TAG_LEN),chunk.slice(-TAG_LEN)];const encData=_ref2[0],dataTag=_ref2[1];const data=this.decrypt(encData,dataTag);if(data===null){fail(`unexpected Data_TAG=${dataTag.toString('hex')} when verify Data=${encData.slice(0,60).toString('hex')}, dump=${chunk.slice(0,60).toString('hex')}`);return}next(data)}encrypt(message){const cipher=_crypto2.default.createCipheriv(SsAeadCipherPreset.cipherName,this._cipherKey,(0,_utils.numberToBuffer)(this._cipherNonce,NONCE_LEN,_utils.BYTE_ORDER_LE));const encrypted=Buffer.concat([cipher.update(message),cipher.final()]);const tag=cipher.getAuthTag();this._cipherNonce+=1;return[encrypted,tag]}decrypt(ciphertext,tag){const decipher=_crypto2.default.createDecipheriv(SsAeadCipherPreset.cipherName,this._decipherKey,(0,_utils.numberToBuffer)(this._decipherNonce,NONCE_LEN,_utils.BYTE_ORDER_LE));decipher.setAuthTag(tag);try{const decrypted=Buffer.concat([decipher.update(ciphertext),decipher.final()]);this._decipherNonce+=1;return decrypted}catch(err){return null}}}exports.default=SsAeadCipherPreset;SsAeadCipherPreset.cipherName='';SsAeadCipherPreset.info=Buffer.from('ss-subkey');SsAeadCipherPreset.keySaltSize=0;SsAeadCipherPreset.evpKey=null;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _slicedToArray=function(){function sliceIterator(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i['return'])_i['return']()}finally{if(_d)throw _e}}return _arr}return function(arr,i){if(Array.isArray(arr)){return arr}else if(Symbol.iterator in Object(arr)){return sliceIterator(arr,i)}else{throw new TypeError('Invalid attempt to destructure non-iterable instance')}}}();var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _utils=require('../utils');var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const NONCE_LEN=12;const TAG_LEN=16;const MIN_CHUNK_LEN=TAG_LEN*2+3;const MIN_CHUNK_SPLIT_LEN=2048;const MAX_CHUNK_SPLIT_LEN=16383;const ciphers={'aes-128-gcm':16,'aes-192-gcm':24,'aes-256-gcm':32};const HKDF_HASH_ALGORITHM='sha1';class SsAeadCipherPreset extends _defs.IPreset{static checkParams({method}){const cipherNames=Object.keys(ciphers);if(!cipherNames.includes(method)){throw Error(`'method' must be one of [${cipherNames}]`)}}static onInit({method}){SsAeadCipherPreset.cipherName=method;SsAeadCipherPreset.keySaltSize=ciphers[method];SsAeadCipherPreset.evpKey=(0,_utils.EVP_BytesToKey)(__KEY__,SsAeadCipherPreset.keySaltSize,16)}constructor(){super();this._cipherKey=null;this._decipherKey=null;this._cipherNonce=0;this._decipherNonce=0;this._adBuf=null;this._adBuf=new _utils.AdvancedBuffer({getPacketLength:this.onReceiving.bind(this)});this._adBuf.on('data',this.onChunkReceived.bind(this))}onDestroy(){this._adBuf.clear();this._adBuf=null;this._cipherKey=null;this._decipherKey=null;this._cipherNonce=0;this._decipherNonce=0}beforeOut({buffer}){let salt=null;if(this._cipherKey===null){const size=SsAeadCipherPreset.keySaltSize;salt=_crypto2.default.randomBytes(size);this._cipherKey=(0,_utils.HKDF)(HKDF_HASH_ALGORITHM,salt,SsAeadCipherPreset.evpKey,SsAeadCipherPreset.info,size)}const chunks=(0,_utils.getRandomChunks)(buffer,MIN_CHUNK_SPLIT_LEN,MAX_CHUNK_SPLIT_LEN).map(chunk=>{const dataLen=(0,_utils.numberToBuffer)(chunk.length);var _encrypt=this.encrypt(dataLen),_encrypt2=_slicedToArray(_encrypt,2);const encLen=_encrypt2[0],lenTag=_encrypt2[1];var _encrypt3=this.encrypt(chunk),_encrypt4=_slicedToArray(_encrypt3,2);const encData=_encrypt4[0],dataTag=_encrypt4[1];return Buffer.concat([encLen,lenTag,encData,dataTag])});if(salt){return Buffer.concat([salt,...chunks])}else{return Buffer.concat(chunks)}}beforeIn({buffer,next,fail}){this._adBuf.put(buffer,{next,fail})}onReceiving(buffer,{fail}){if(this._decipherKey===null){const size=SsAeadCipherPreset.keySaltSize;if(buffer.length<size){return}const salt=buffer.slice(0,size);this._decipherKey=(0,_utils.HKDF)(HKDF_HASH_ALGORITHM,salt,SsAeadCipherPreset.evpKey,SsAeadCipherPreset.info,size);return buffer.slice(size)}if(buffer.length<MIN_CHUNK_LEN){return}var _ref=[buffer.slice(0,2),buffer.slice(2,2+TAG_LEN)];const encLen=_ref[0],lenTag=_ref[1];const dataLenBuf=this.decrypt(encLen,lenTag);if(dataLenBuf===null){fail(`unexpected DataLen_TAG=${lenTag.toString('hex')} when verify DataLen=${encLen.toString('hex')}, dump=${buffer.slice(0,60).toString('hex')}`);return-1}const dataLen=dataLenBuf.readUInt16BE(0);if(dataLen>MAX_CHUNK_SPLIT_LEN){fail(`invalid DataLen=${dataLen} is over ${MAX_CHUNK_SPLIT_LEN}, dump=${buffer.slice(0,60).toString('hex')}`);return-1}return 2+TAG_LEN+dataLen+TAG_LEN}onChunkReceived(chunk,{next,fail}){var _ref2=[chunk.slice(2+TAG_LEN,-TAG_LEN),chunk.slice(-TAG_LEN)];const encData=_ref2[0],dataTag=_ref2[1];const data=this.decrypt(encData,dataTag);if(data===null){fail(`unexpected Data_TAG=${dataTag.toString('hex')} when verify Data=${encData.slice(0,60).toString('hex')}, dump=${chunk.slice(0,60).toString('hex')}`);return}next(data)}encrypt(message){const cipher=_crypto2.default.createCipheriv(SsAeadCipherPreset.cipherName,this._cipherKey,(0,_utils.numberToBuffer)(this._cipherNonce,NONCE_LEN,_utils.BYTE_ORDER_LE));const encrypted=Buffer.concat([cipher.update(message),cipher.final()]);const tag=cipher.getAuthTag();this._cipherNonce+=1;return[encrypted,tag]}decrypt(ciphertext,tag){const decipher=_crypto2.default.createDecipheriv(SsAeadCipherPreset.cipherName,this._decipherKey,(0,_utils.numberToBuffer)(this._decipherNonce,NONCE_LEN,_utils.BYTE_ORDER_LE));decipher.setAuthTag(tag);try{const decrypted=Buffer.concat([decipher.update(ciphertext),decipher.final()]);this._decipherNonce+=1;return decrypted}catch(err){return null}}}exports.default=SsAeadCipherPreset;SsAeadCipherPreset.cipherName='';SsAeadCipherPreset.info=Buffer.from('ss-subkey');SsAeadCipherPreset.keySaltSize=0;SsAeadCipherPreset.evpKey=null;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _utils=require('../utils');var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const IV_LEN=16;const ciphers=['aes-128-ctr','aes-192-ctr','aes-256-ctr','aes-128-cfb','aes-192-cfb','aes-256-cfb','camellia-128-cfb','camellia-192-cfb','camellia-256-cfb'];class SsStreamCipherPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._cipher=null,this._decipher=null,_temp}static checkParams({method}){if(typeof method!=='string'||method===''){throw Error('\'method\' must be set')}if(!ciphers.includes(method)){throw Error(`'method' must be one of [${ciphers}]`)}}static onInit({method}){this.cipherName=method;this.key=(0,_utils.EVP_BytesToKey)(__KEY__,method.split('-')[1]/8,IV_LEN)}onDestroy(){this._cipher=null;this._decipher=null}beforeOut({buffer}){if(!this._cipher){const iv=_crypto2.default.randomBytes(IV_LEN);this._cipher=_crypto2.default.createCipheriv(SsStreamCipherPreset.cipherName,SsStreamCipherPreset.key,iv);return Buffer.concat([iv,this.encrypt(buffer)])}else{return this.encrypt(buffer)}}beforeIn({buffer,fail}){if(!this._decipher){if(buffer.length<IV_LEN){return fail(`buffer is too short ${buffer.length} bytes to get iv, dump=${buffer.toString('hex')}`)}const iv=buffer.slice(0,IV_LEN);this._decipher=_crypto2.default.createDecipheriv(SsStreamCipherPreset.cipherName,SsStreamCipherPreset.key,iv);return this.decrypt(buffer.slice(IV_LEN))}else{return this.decrypt(buffer)}}encrypt(buffer){return this._cipher.update(buffer)}decrypt(buffer){return this._decipher.update(buffer)}}exports.default=SsStreamCipherPreset;SsStreamCipherPreset.cipherName='';SsStreamCipherPreset.key=null;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _utils=require('../utils');var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const IV_LEN=16;const ciphers=['aes-128-ctr','aes-192-ctr','aes-256-ctr','aes-128-cfb','aes-192-cfb','aes-256-cfb','camellia-128-cfb','camellia-192-cfb','camellia-256-cfb'];class SsStreamCipherPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._cipher=null,this._decipher=null,_temp}static checkParams({method}){if(typeof method!=='string'||method===''){throw Error('\'method\' must be set')}if(!ciphers.includes(method)){throw Error(`'method' must be one of [${ciphers}]`)}}static onInit({method}){SsStreamCipherPreset.cipherName=method;SsStreamCipherPreset.key=(0,_utils.EVP_BytesToKey)(__KEY__,method.split('-')[1]/8,IV_LEN)}onDestroy(){this._cipher=null;this._decipher=null}beforeOut({buffer}){if(!this._cipher){const iv=_crypto2.default.randomBytes(IV_LEN);this._cipher=_crypto2.default.createCipheriv(SsStreamCipherPreset.cipherName,SsStreamCipherPreset.key,iv);return Buffer.concat([iv,this.encrypt(buffer)])}else{return this.encrypt(buffer)}}beforeIn({buffer,fail}){if(!this._decipher){if(buffer.length<IV_LEN){return fail(`buffer is too short ${buffer.length} bytes to get iv, dump=${buffer.toString('hex')}`)}const iv=buffer.slice(0,IV_LEN);this._decipher=_crypto2.default.createDecipheriv(SsStreamCipherPreset.cipherName,SsStreamCipherPreset.key,iv);return this.decrypt(buffer.slice(IV_LEN))}else{return this.decrypt(buffer)}}encrypt(buffer){return this._cipher.update(buffer)}decrypt(buffer){return this._decipher.update(buffer)}}exports.default=SsStreamCipherPreset;SsStreamCipherPreset.cipherName='';SsStreamCipherPreset.key=null;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _defs=require('./defs');var _utils=require('../utils');const TRACK_CHAR_UPLOAD='u';const TRACK_CHAR_DOWNLOAD='d';const TRACK_MAX_SIZE=40;class TrackerPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._tracks=[],_temp}onNotified({type,payload}){switch(type){case _defs.CONNECTION_CREATED:case _defs.CONNECT_TO_REMOTE:const host=payload.host,port=payload.port;this._tracks.push(`${host}:${port}`);break;case _defs.CONNECTION_CLOSED:this.dump();this._tracks=[];break;default:break;}}beforeOut({buffer}){this._tracks.push(TRACK_CHAR_UPLOAD);this._tracks.push(buffer.length);return buffer}beforeIn({buffer}){this._tracks.push(TRACK_CHAR_DOWNLOAD);this._tracks.push(buffer.length);return buffer}dump(){let strs=[];let dp=0,db=0;let up=0,ub=0;let ud='';var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=this._tracks[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){const el=_step.value;if(el===TRACK_CHAR_UPLOAD||el===TRACK_CHAR_DOWNLOAD){if(ud===el){continue}ud=el}if(Number.isInteger(el)){if(ud===TRACK_CHAR_DOWNLOAD){dp+=1;db+=el}if(ud===TRACK_CHAR_UPLOAD){up+=1;ub+=el}}strs.push(el)}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}const perSize=Math.floor(TRACK_MAX_SIZE/2);if(strs.length>TRACK_MAX_SIZE){strs=strs.slice(0,perSize).concat([' ... ']).concat(strs.slice(-perSize))}const summary=__IS_CLIENT__?`out/in = ${up}/${dp}, ${ub}b/${db}b`:`in/out = ${dp}/${up}, ${db}b/${ub}b`;_utils.logger.info(`[tracker] summary(${summary}) abstract(${strs.join(' ')})`)}}exports.default=TrackerPreset;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _defs=require('./defs');var _utils=require('../utils');const TRACK_CHAR_UPLOAD='u';const TRACK_CHAR_DOWNLOAD='d';const TRACK_MAX_SIZE=40;function dump(tracks){let strs=[];let dp=0,db=0;let up=0,ub=0;let ud='';var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=tracks[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){const el=_step.value;if(el===TRACK_CHAR_UPLOAD||el===TRACK_CHAR_DOWNLOAD){if(ud===el){continue}ud=el}if(Number.isInteger(el)){if(ud===TRACK_CHAR_DOWNLOAD){dp+=1;db+=el}if(ud===TRACK_CHAR_UPLOAD){up+=1;ub+=el}}strs.push(el)}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}const perSize=Math.floor(TRACK_MAX_SIZE/2);if(strs.length>TRACK_MAX_SIZE){strs=strs.slice(0,perSize).concat([' ... ']).concat(strs.slice(-perSize))}const summary=__IS_CLIENT__?`out/in = ${up}/${dp}, ${ub}b/${db}b`:`in/out = ${dp}/${up}, ${db}b/${ub}b`;_utils.logger.info(`[tracker] summary(${summary}) abstract(${strs.join(' ')})`)}class TrackerPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._tracks=[],_temp}onNotified({type,payload}){switch(type){case _defs.CONNECTION_CREATED:case _defs.CONNECT_TO_REMOTE:const host=payload.host,port=payload.port;this._tracks.push(`${host}:${port}`);break;case _defs.CONNECTION_CLOSED:dump(this._tracks);break;default:break;}}onDestroy(){if(this._tracks!==null){dump(this._tracks)}this._tracks=null}beforeOut({buffer}){this._tracks.push(TRACK_CHAR_UPLOAD);this._tracks.push(buffer.length);return buffer}beforeIn({buffer}){this._tracks.push(TRACK_CHAR_DOWNLOAD);this._tracks.push(buffer.length);return buffer}}exports.default=TrackerPreset;

File diff suppressed because one or more lines are too long

1
lib/transports/defs.js Normal file

@ -0,0 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Outbound=exports.Inbound=undefined;var _events=require('events');var _events2=_interopRequireDefault(_events);var _core=require('../core');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class Bound extends _events2.default{get bufferSize(){return 0}get writable(){return true}onBroadcast(){}write(buffer){}destroy(){}setPresets(callback){}}class Inbound extends Bound{constructor({context,pipe}){super();this._outbound=null;this._pipe=null;this._pipe=pipe;this._remoteHost=context.remoteAddress;this._remotePort=context.remotePort}get remote(){return`${this._remoteHost}:${this._remotePort}`}get remoteHost(){return this._remoteHost}get remotePort(){return this._remotePort}setOutbound(outbound){this._outbound=outbound}broadcast(action){!this._pipe.destroyed&&this._pipe.broadcast('pipe',action)}}exports.Inbound=Inbound;class Outbound extends Bound{constructor({inbound,pipe}){super();this._inbound=null;this._pipe=null;this._dnsCache=null;this._inbound=inbound;this._pipe=pipe;this._dnsCache=new _core.DNSCache({expire:__DNS_EXPIRE__})}get remote(){return this._inbound.remote}broadcast(action){!this._pipe.destroyed&&this._pipe.broadcast('pipe',action)}}exports.Outbound=Outbound;

1
lib/transports/index.js Normal file

@ -0,0 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.createRelay=createRelay;var _lodash=require('lodash.uniqueid');var _lodash2=_interopRequireDefault(_lodash);var _core=require('../core');var _tcp=require('./tcp');var _tls=require('./tls');var _websocket=require('./websocket');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function createRelay(transport,context){let relay=null;switch(transport){case'tcp':relay=new _core.Relay({context,Inbound:_tcp.TcpInbound,Outbound:_tcp.TcpOutbound});relay.id=(0,_lodash2.default)('tcp_');break;case'tls':relay=new _core.Relay({context,Inbound:_tls.TlsInbound,Outbound:_tls.TlsOutbound});relay.id=(0,_lodash2.default)('tls_');break;case'websocket':relay=__IS_CLIENT__?new _core.Relay({context,Inbound:_tcp.TcpInbound,Outbound:_websocket.WsOutbound}):new _core.Relay({context,Inbound:_websocket.WsInbound,Outbound:_tcp.TcpOutbound});relay.id=(0,_lodash2.default)('ws_');break;default:throw Error(`unknown transport: ${transport}`);}return relay}

1
lib/transports/tcp.js Normal file

File diff suppressed because one or more lines are too long

1
lib/transports/tls.js Normal file

@ -0,0 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.TlsOutbound=exports.TlsInbound=undefined;var _tcp=require('./tcp');class TlsInbound extends _tcp.TcpInbound{}exports.TlsInbound=TlsInbound;class TlsOutbound extends _tcp.TcpOutbound{}exports.TlsOutbound=TlsOutbound;

File diff suppressed because one or more lines are too long