lib: regen

This commit is contained in:
Micooz 2018-02-16 16:58:30 +08:00
parent c4bb2d1e74
commit 4bffddf7b3
39 changed files with 35 additions and 38 deletions

@ -1 +1 @@
"use strict";Object.defineProperty(exports,"__esModule",{value:true});const PIPE_ENCODE=exports.PIPE_ENCODE=1;const PIPE_DECODE=exports.PIPE_DECODE=-1;const MAX_BUFFERED_SIZE=exports.MAX_BUFFERED_SIZE=512*1024;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.MAX_BUFFERED_SIZE=exports.PIPE_DECODE=exports.PIPE_ENCODE=exports.APP_ID=undefined;var _crypto=require('./utils/crypto');const APP_ID=exports.APP_ID=(0,_crypto.randomBytes)(16).toString('hex');const PIPE_ENCODE=exports.PIPE_ENCODE=1;const PIPE_DECODE=exports.PIPE_DECODE=-1;const MAX_BUFFERED_SIZE=exports.MAX_BUFFERED_SIZE=512*1024;

@ -1 +0,0 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Balancer=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 _net=require('net');var _net2=_interopRequireDefault(_net);var _url=require('url');var _url2=_interopRequireDefault(_url);var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const QUERY_INTERVAL=12e4;class Balancer{static start(servers,interval=QUERY_INTERVAL){if(servers.length<1){throw Error('servers cannot be empty')}this._servers=servers.map((server,i)=>_extends({id:i},server));this._pings=this._servers.map(()=>0);this._startQuery(interval)}static destroy(){this._stopQuery()}static getFastest(){let index=0;const pings=this._pings;for(let i=0;i<pings.length;++i){const ping=pings[i];if(ping>0&&ping<pings[index]||pings[index]<=0){index=i}}const server=this._servers[index];if(!this._server||this._server.id!==server.id){return this._server=server}else{return null}}static _startQuery(interval){if(this._servers.length>1){if(this._timer!==null){this._stopQuery()}this._timer=setInterval(()=>this._query(),interval);this._query()}}static _stopQuery(){clearInterval(this._timer);this._timer=null}static _query(){this._servers.forEach((server,i)=>{let _host,_port;if(server.service){var _url$parse=_url2.default.parse(server.service);const host=_url$parse.hostname,port=_url$parse.port;_host=host;_port=+port}else{_host=server.host;_port=server.port}const sstr=`${_host}:${_port}`;_utils.logger.verbose(`[balancer] querying ${sstr}`);const startTime=Date.now();const socket=_net2.default.connect({host:_host,port:_port},()=>{const ping=Date.now()-startTime;this._pings[i]=ping;_utils.logger.verbose(`[balancer] ${sstr} = ${ping}ms`);socket.end()});socket.on('error',()=>{this._pings[i]=-1;_utils.logger.warn(`[balancer] ${sstr} lost connection`)})})}}exports.Balancer=Balancer;Balancer._servers=[];Balancer._server=null;Balancer._pings=[];Balancer._timer=null;

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
'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 Date.now()}_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={};

File diff suppressed because one or more lines are too long

@ -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 _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]}})});
'use strict';Object.defineProperty(exports,'__esModule',{value:true});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]}})});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.Middleware=undefined;var _events=require('events');var _events2=_interopRequireDefault(_events);var _presets=require('../presets');var _constants=require('../constants');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const staticPresetCache=new Map;function createPreset(name,params={}){const ImplClass=(0,_presets.getPresetClassByName)(name);const createOne=()=>{ImplClass.checkParams(params);ImplClass.onInit(params);return new ImplClass(params)};let preset=null;if(_presets.IPresetStatic.isPrototypeOf(ImplClass)){preset=staticPresetCache.get(ImplClass.name);if(preset===undefined){preset=createOne();staticPresetCache.set(ImplClass.name,preset)}}else{preset=createOne()}return preset}class Middleware extends _events2.default{constructor(preset){super();this._impl=null;this.onPresetNext=this.onPresetNext.bind(this);this.onPresetBroadcast=this.onPresetBroadcast.bind(this);this.onPresetFail=this.onPresetFail.bind(this);this._impl=createPreset(preset.name,preset.params||{});this._impl.next=this.onPresetNext;this._impl.broadcast=this.onPresetBroadcast;this._impl.fail=this.onPresetFail}get name(){return this._impl.getName()||(0,_utils.kebabCase)(this._impl.constructor.name).replace(/(.*)-preset/i,'$1')}getImplement(){return this._impl}hasListener(event){return this.listenerCount(event)>0}notify(action){return this._impl.onNotified(action)}onPresetNext(direction,buffer){this.emit(`next_${direction}`,buffer)}onPresetBroadcast(action){this.emit('broadcast',this.name,action)}onPresetFail(message){this.emit('fail',this.name,message)}onDestroy(){if(!(this._impl instanceof _presets.IPresetStatic)){this._impl.onDestroy()}this.removeAllListeners()}write({direction,buffer,direct,isUdp},extraArgs){const type=(direction===_constants.PIPE_ENCODE?'Out':'In')+(isUdp?'Udp':'');const broadcast=this.onPresetBroadcast;const fail=this.onPresetFail;const next=(processed,isReverse=false)=>{const hasListener=this.emit(`next_${isReverse?-direction:direction}`,processed);if(!hasListener){direct(processed,isReverse)}};const nextLifeCycleHook=(buf)=>{const args={buffer:buf,next,broadcast,direct,fail};const ret=__IS_CLIENT__?this._impl[`client${type}`](args,extraArgs):this._impl[`server${type}`](args,extraArgs);if(ret instanceof Buffer){next(ret)}};const args={buffer,next:nextLifeCycleHook,broadcast,direct,fail};const ret=this._impl[`before${type}`](args,extraArgs);if(ret instanceof Buffer){nextLifeCycleHook(ret)}}}exports.Middleware=Middleware;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Middleware=undefined;var _events=require('events');var _events2=_interopRequireDefault(_events);var _presets=require('../presets');var _constants=require('../constants');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function createPreset({config,preset}){const name=preset.name;const params=preset.params||{};const ImplClass=(0,_presets.getPresetClassByName)(name);const instance=new ImplClass({config,params});instance.onInit(params);return instance}class Middleware extends _events2.default{constructor({config,preset}){super();this._config=null;this._impl=null;this.onPresetNext=this.onPresetNext.bind(this);this.onPresetBroadcast=this.onPresetBroadcast.bind(this);this.onPresetFail=this.onPresetFail.bind(this);this._config=config;this._impl=createPreset({config,preset});this._impl.next=this.onPresetNext;this._impl.broadcast=this.onPresetBroadcast;this._impl.fail=this.onPresetFail}get name(){return(0,_utils.kebabCase)(this._impl.constructor.name).replace(/(.*)-preset/i,'$1')}getImplement(){return this._impl}hasListener(event){return this.listenerCount(event)>0}notify(action){return this._impl.onNotified(action)}onPresetNext(direction,buffer){this.emit(`next_${direction}`,buffer)}onPresetBroadcast(action){this.emit('broadcast',this.name,action)}onPresetFail(message){this.emit('fail',this.name,message)}onDestroy(){this._impl.onDestroy();this.removeAllListeners()}write({direction,buffer,direct,isUdp},extraArgs){const type=(direction===_constants.PIPE_ENCODE?'Out':'In')+(isUdp?'Udp':'');const broadcast=this.onPresetBroadcast;const fail=this.onPresetFail;const next=(processed,isReverse=false)=>{const hasListener=this.emit(`next_${isReverse?-direction:direction}`,processed);if(!hasListener){direct(processed,isReverse)}};const nextLifeCycleHook=(buf)=>{const args={buffer:buf,next,broadcast,direct,fail};const ret=this._config.is_client?this._impl[`client${type}`](args,extraArgs):this._impl[`server${type}`](args,extraArgs);if(ret instanceof Buffer){next(ret)}};const args={buffer,next:nextLifeCycleHook,broadcast,direct,fail};const ret=this._impl[`before${type}`](args,extraArgs);if(ret instanceof Buffer){nextLifeCycleHook(ret)}}}exports.Middleware=Middleware;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _fs=require('fs');var _fs2=_interopRequireDefault(_fs);var _path=require('path');var _path2=_interopRequireDefault(_path);var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _nodeFetch=require('node-fetch');var _nodeFetch2=_interopRequireDefault(_nodeFetch);var _pify=require('pify');var _pify2=_interopRequireDefault(_pify);var _defs=require('./defs');var _utils=require('../utils');var _constants=require('../constants');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 readFile=(0,_pify2.default)(_fs2.default.readFile);const MAX_TIME_DIFF=30;const NOOP=Buffer.alloc(0);class AutoConfPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._isSuiteChanged=false,this._isHeaderSent=false,this._header=null,_temp}static checkParams({suites}){if(typeof suites!=='string'||suites.length<1){throw Error('\'suites\' is invalid')}}static onInit({suites:uri}){return _asyncToGenerator(function*(){_utils.logger.info(`[auto-conf] loading suites from: ${uri}`);let suites=[];if(uri.startsWith('http')){const res=yield(0,_nodeFetch2.default)(uri);suites=yield res.json()}else{const suiteJson=_path2.default.resolve(process.cwd(),uri);const rawText=yield readFile(suiteJson,{encoding:'utf-8'});suites=JSON.parse(rawText)}if(suites.length<1){throw Error(`you must provide at least one suite in ${uri}`)}_utils.logger.info(`[auto-conf] ${suites.length} suites loaded`);AutoConfPreset.suites=suites})()}onDestroy(){this._header=null}createRequestHeader(suites){const sid=_crypto2.default.randomBytes(2);const utc=(0,_utils.numberToBuffer)((0,_utils.getCurrentTimestampInt)(),4,_utils.BYTE_ORDER_LE);const key=(0,_utils.EVP_BytesToKey)(Buffer.from(__KEY__).toString('base64')+(0,_utils.hash)('md5',sid).toString('base64'),16,16);const cipher=_crypto2.default.createCipheriv('rc4',key,NOOP);const enc_utc=cipher.update(utc);const request_hmac=(0,_utils.hmac)('md5',key,Buffer.concat([sid,enc_utc]));return{header:Buffer.concat([sid,enc_utc,request_hmac]),suite:suites[sid.readUInt16LE(0)%suites.length]}}encodeChangeSuite({buffer,broadcast,fail}){const suites=AutoConfPreset.suites;if(suites.length<1){return fail('suites are not initialized properly')}var _createRequestHeader=this.createRequestHeader(suites);const header=_createRequestHeader.header,suite=_createRequestHeader.suite;this._header=header;this._isSuiteChanged=true;return broadcast({type:_defs.CHANGE_PRESET_SUITE,payload:{type:_constants.PIPE_ENCODE,suite:suite,data:buffer}})}decodeChangeSuite({buffer,broadcast,fail}){const suites=AutoConfPreset.suites;if(suites.length<1){return fail('suites are not initialized properly')}if(buffer.length<22){return fail(`client request is too short, dump=${(0,_utils.dumpHex)(buffer)}`)}const sid=buffer.slice(0,2);const request_hmac=buffer.slice(6,22);const key=(0,_utils.EVP_BytesToKey)(Buffer.from(__KEY__).toString('base64')+(0,_utils.hash)('md5',sid).toString('base64'),16,16);const hmac_calc=(0,_utils.hmac)('md5',key,buffer.slice(0,6));if(!hmac_calc.equals(request_hmac)){return fail(`unexpected hmac of client request, dump=${(0,_utils.dumpHex)(buffer)}`)}const enc_utc=buffer.slice(2,6);const decipher=_crypto2.default.createDecipheriv('rc4',key,NOOP);const utc=decipher.update(enc_utc).readUInt32LE(0);const time_diff=Math.abs(utc-(0,_utils.getCurrentTimestampInt)());if(time_diff>MAX_TIME_DIFF){return fail(`timestamp diff is over ${MAX_TIME_DIFF}s, dump=${(0,_utils.dumpHex)(buffer)}`)}const suite=suites[sid.readUInt16LE(0)%suites.length];this._isSuiteChanged=true;return broadcast({type:_defs.CHANGE_PRESET_SUITE,payload:{type:_constants.PIPE_DECODE,suite:suite,data:buffer.slice(22)}})}clientOut({buffer,broadcast,fail}){if(!this._isSuiteChanged){return this.encodeChangeSuite({buffer,broadcast,fail})}if(!this._isHeaderSent){this._isHeaderSent=true;return Buffer.concat([this._header,buffer])}else{return buffer}}serverIn({buffer,broadcast,fail}){if(!this._isSuiteChanged){return this.decodeChangeSuite({buffer,broadcast,fail})}else{return buffer}}clientOutUdp({buffer,broadcast,fail}){if(!this._isSuiteChanged){return this.encodeChangeSuite({buffer,broadcast,fail})}else{this._isSuiteChanged=false;return Buffer.concat([this._header,buffer])}}serverInUdp({buffer,broadcast,fail}){if(!this._isSuiteChanged){return this.decodeChangeSuite({buffer,broadcast,fail})}else{this._isSuiteChanged=false;return buffer}}}exports.default=AutoConfPreset;AutoConfPreset.suites=[];
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _fs=require('fs');var _fs2=_interopRequireDefault(_fs);var _path=require('path');var _path2=_interopRequireDefault(_path);var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _nodeFetch=require('node-fetch');var _nodeFetch2=_interopRequireDefault(_nodeFetch);var _defs=require('./defs');var _utils=require('../utils');var _constants=require('../constants');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 MAX_TIME_DIFF=30;const NOOP=Buffer.alloc(0);class AutoConfPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._isSuiteChanged=false,this._isHeaderSent=false,this._header=null,_temp}static onCheckParams({suites}){if(typeof suites!=='string'||suites.length<1){throw Error('\'suites\' is invalid')}}static onCache({suites:uri}){return _asyncToGenerator(function*(){_utils.logger.info(`[auto-conf] loading suites from: ${uri}`);let suites=[];if(uri.startsWith('http')){const res=yield(0,_nodeFetch2.default)(uri);suites=yield res.json()}else{const suiteJson=_path2.default.resolve(process.cwd(),uri);const rawText=_fs2.default.readFileSync(suiteJson,{encoding:'utf-8'});suites=JSON.parse(rawText)}if(suites.length<1){throw Error(`you must provide at least one suite in ${uri}`)}_utils.logger.info(`[auto-conf] ${suites.length} suites loaded`);return{suites}})()}onDestroy(){this._header=null}createRequestHeader(suites){const sid=_crypto2.default.randomBytes(2);const utc=(0,_utils.numberToBuffer)((0,_utils.getCurrentTimestampInt)(),4,_utils.BYTE_ORDER_LE);const key=(0,_utils.EVP_BytesToKey)(Buffer.from(this._config.key).toString('base64')+(0,_utils.hash)('md5',sid).toString('base64'),16,16);const cipher=_crypto2.default.createCipheriv('rc4',key,NOOP);const enc_utc=cipher.update(utc);const request_hmac=(0,_utils.hmac)('md5',key,Buffer.concat([sid,enc_utc]));return{header:Buffer.concat([sid,enc_utc,request_hmac]),suite:suites[sid.readUInt16LE(0)%suites.length]}}encodeChangeSuite({buffer,broadcast,fail}){var _getStore=this.getStore();const suites=_getStore.suites;if(suites.length<1){return fail('suites are not initialized properly')}var _createRequestHeader=this.createRequestHeader(suites);const header=_createRequestHeader.header,suite=_createRequestHeader.suite;this._header=header;this._isSuiteChanged=true;return broadcast({type:_defs.CHANGE_PRESET_SUITE,payload:{type:_constants.PIPE_ENCODE,suite:suite,data:buffer}})}decodeChangeSuite({buffer,broadcast,fail}){var _getStore2=this.getStore();const suites=_getStore2.suites;if(suites.length<1){return fail('suites are not initialized properly')}if(buffer.length<22){return fail(`client request is too short, dump=${(0,_utils.dumpHex)(buffer)}`)}const sid=buffer.slice(0,2);const request_hmac=buffer.slice(6,22);const key=(0,_utils.EVP_BytesToKey)(Buffer.from(this._config.key).toString('base64')+(0,_utils.hash)('md5',sid).toString('base64'),16,16);const hmac_calc=(0,_utils.hmac)('md5',key,buffer.slice(0,6));if(!hmac_calc.equals(request_hmac)){return fail(`unexpected hmac of client request, dump=${(0,_utils.dumpHex)(buffer)}`)}const enc_utc=buffer.slice(2,6);const decipher=_crypto2.default.createDecipheriv('rc4',key,NOOP);const utc=decipher.update(enc_utc).readUInt32LE(0);const time_diff=Math.abs(utc-(0,_utils.getCurrentTimestampInt)());if(time_diff>MAX_TIME_DIFF){return fail(`timestamp diff is over ${MAX_TIME_DIFF}s, dump=${(0,_utils.dumpHex)(buffer)}`)}const suite=suites[sid.readUInt16LE(0)%suites.length];this._isSuiteChanged=true;return broadcast({type:_defs.CHANGE_PRESET_SUITE,payload:{type:_constants.PIPE_DECODE,suite:suite,data:buffer.slice(22)}})}clientOut({buffer,broadcast,fail}){if(!this._isSuiteChanged){return this.encodeChangeSuite({buffer,broadcast,fail})}if(!this._isHeaderSent){this._isHeaderSent=true;return Buffer.concat([this._header,buffer])}else{return buffer}}serverIn({buffer,broadcast,fail}){if(!this._isSuiteChanged){return this.decodeChangeSuite({buffer,broadcast,fail})}else{return buffer}}clientOutUdp({buffer,broadcast,fail}){if(!this._isSuiteChanged){return this.encodeChangeSuite({buffer,broadcast,fail})}else{this._isSuiteChanged=false;return Buffer.concat([this._header,buffer])}}serverInUdp({buffer,broadcast,fail}){if(!this._isSuiteChanged){return this.decodeChangeSuite({buffer,broadcast,fail})}else{this._isSuiteChanged=false;return buffer}}}exports.default=AutoConfPreset;

@ -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 HMAC_METHODS={'md5':16,'sha1':20,'sha256':32};const DEFAULT_HASH_METHOD='sha1';class BaseAuthPreset extends _defs.IPresetAddressing{static checkParams({method=DEFAULT_HASH_METHOD}){const methods=Object.keys(HMAC_METHODS);if(!methods.includes(method)){throw Error(`base-auth 'method' must be one of [${methods}]`)}}static onInit({method=DEFAULT_HASH_METHOD}){BaseAuthPreset.hmacMethod=method;BaseAuthPreset.hmacLen=HMAC_METHODS[method];BaseAuthPreset.hmacKey=(0,_utils.EVP_BytesToKey)(__KEY__,16,16)}constructor(){super();this._cipher=null;this._decipher=null;this._isConnecting=false;this._isHeaderSent=false;this._isHeaderRecv=false;this._pending=Buffer.alloc(0);this._host=null;this._port=null;const key=BaseAuthPreset.hmacKey;const iv=(0,_utils.hash)('md5',Buffer.from(__KEY__+'base-auth'));if(__IS_CLIENT__){this._cipher=_crypto2.default.createCipheriv('aes-128-cfb',key,iv)}else{this._decipher=_crypto2.default.createDecipheriv('aes-128-cfb',key,iv)}}onDestroy(){this._cipher=null;this._decipher=null;this._pending=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)}}encodeHeader(){const hmacMethod=BaseAuthPreset.hmacMethod,hmacKey=BaseAuthPreset.hmacKey;const header=Buffer.concat([(0,_utils.numberToBuffer)(this._host.length,1),this._host,this._port]);const encHeader=this._cipher.update(header);const mac=(0,_utils.hmac)(hmacMethod,hmacKey,encHeader);return Buffer.concat([encHeader,mac])}decodeHeader({buffer,fail}){const hmacMethod=BaseAuthPreset.hmacMethod,hmacLen=BaseAuthPreset.hmacLen,hmacKey=BaseAuthPreset.hmacKey;if(buffer.length<31){return fail(`length is too short: ${buffer.length}, dump=${buffer.toString('hex')}`)}const alen=this._decipher.update(buffer.slice(0,1))[0];if(buffer.length<=1+alen+2+hmacLen){return fail(`unexpected length: ${buffer.length}, dump=${buffer.toString('hex')}`)}const givenHmac=buffer.slice(1+alen+2,1+alen+2+hmacLen);const expHmac=(0,_utils.hmac)(hmacMethod,hmacKey,buffer.slice(0,1+alen+2));if(!givenHmac.equals(expHmac)){return fail(`unexpected HMAC=${givenHmac.toString('hex')} want=${expHmac.toString('hex')} dump=${buffer.slice(0,60).toString('hex')}`)}const plaintext=this._decipher.update(buffer.slice(1,1+alen+2));const addr=plaintext.slice(0,alen).toString();const port=plaintext.slice(alen,alen+2).readUInt16BE(0);const data=buffer.slice(1+alen+2+hmacLen);return{host:addr,port,data}}clientOut({buffer}){if(!this._isHeaderSent){this._isHeaderSent=true;return Buffer.concat([this.encodeHeader(),buffer])}else{return buffer}}serverIn({buffer,next,broadcast,fail}){if(!this._isHeaderRecv){if(this._isConnecting){this._pending=Buffer.concat([this._pending,buffer]);return}const decoded=this.decodeHeader({buffer,fail});if(!decoded){return}const host=decoded.host,port=decoded.port,data=decoded.data;this._isConnecting=true;broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:host,port:port,onConnected:()=>{next(Buffer.concat([data,this._pending]));this._isHeaderRecv=true;this._isConnecting=false;this._pending=null}}})}else{return buffer}}clientOutUdp({buffer}){return Buffer.concat([this.encodeHeader(),buffer])}serverInUdp({buffer,next,broadcast,fail}){const decoded=this.decodeHeader({buffer,fail});if(!decoded){return}const host=decoded.host,port=decoded.port,data=decoded.data;broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:host,port:port,onConnected:()=>next(data)}})}}exports.default=BaseAuthPreset;BaseAuthPreset.hmacMethod=DEFAULT_HASH_METHOD;BaseAuthPreset.hmacLen=null;BaseAuthPreset.hmacKey=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 HMAC_METHODS={'md5':16,'sha1':20,'sha256':32};const DEFAULT_HASH_METHOD='sha1';class BaseAuthPreset extends _defs.IPresetAddressing{constructor(...args){var _temp;return _temp=super(...args),this._hmacMethod=DEFAULT_HASH_METHOD,this._hmacLen=null,this._hmacKey=null,this._cipher=null,this._decipher=null,this._isConnecting=false,this._isHeaderSent=false,this._isHeaderRecv=false,this._pending=Buffer.alloc(0),this._host=null,this._port=null,_temp}static onCheckParams({method=DEFAULT_HASH_METHOD}){const methods=Object.keys(HMAC_METHODS);if(!methods.includes(method)){throw Error(`base-auth 'method' must be one of [${methods}]`)}}onInit({method=DEFAULT_HASH_METHOD}){const key=(0,_utils.EVP_BytesToKey)(this._config.key,16,16);const iv=(0,_utils.hash)('md5',Buffer.from(this._config.key+'base-auth'));this._hmacMethod=method;this._hmacLen=HMAC_METHODS[method];this._hmacKey=key;if(this._config.is_client){this._cipher=_crypto2.default.createCipheriv('aes-128-cfb',key,iv)}else{this._decipher=_crypto2.default.createDecipheriv('aes-128-cfb',key,iv)}}onDestroy(){this._cipher=null;this._decipher=null;this._pending=null;this._host=null;this._port=null}onNotified(action){if(this._config.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)}}encodeHeader(){const header=Buffer.concat([(0,_utils.numberToBuffer)(this._host.length,1),this._host,this._port]);const encHeader=this._cipher.update(header);const mac=(0,_utils.hmac)(this._hmacMethod,this._hmacKey,encHeader);return Buffer.concat([encHeader,mac])}decodeHeader({buffer,fail}){const hmacLen=this._hmacLen;if(buffer.length<31){return fail(`length is too short: ${buffer.length}, dump=${buffer.toString('hex')}`)}const alen=this._decipher.update(buffer.slice(0,1))[0];if(buffer.length<=1+alen+2+hmacLen){return fail(`unexpected length: ${buffer.length}, dump=${buffer.toString('hex')}`)}const givenHmac=buffer.slice(1+alen+2,1+alen+2+hmacLen);const expHmac=(0,_utils.hmac)(this._hmacMethod,this._hmacKey,buffer.slice(0,1+alen+2));if(!givenHmac.equals(expHmac)){return fail(`unexpected HMAC=${givenHmac.toString('hex')} want=${expHmac.toString('hex')} dump=${buffer.slice(0,60).toString('hex')}`)}const plaintext=this._decipher.update(buffer.slice(1,1+alen+2));const addr=plaintext.slice(0,alen).toString();const port=plaintext.slice(alen,alen+2).readUInt16BE(0);const data=buffer.slice(1+alen+2+hmacLen);return{host:addr,port,data}}clientOut({buffer}){if(!this._isHeaderSent){this._isHeaderSent=true;return Buffer.concat([this.encodeHeader(),buffer])}else{return buffer}}serverIn({buffer,next,broadcast,fail}){if(!this._isHeaderRecv){if(this._isConnecting){this._pending=Buffer.concat([this._pending,buffer]);return}const decoded=this.decodeHeader({buffer,fail});if(!decoded){return}const host=decoded.host,port=decoded.port,data=decoded.data;this._isConnecting=true;broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:host,port:port,onConnected:()=>{next(Buffer.concat([data,this._pending]));this._isHeaderRecv=true;this._isConnecting=false;this._pending=null}}})}else{return buffer}}clientOutUdp({buffer}){return Buffer.concat([this.encodeHeader(),buffer])}serverInUdp({buffer,next,broadcast,fail}){const decoded=this.decodeHeader({buffer,fail});if(!decoded){return}const host=decoded.host,port=decoded.port,data=decoded.data;broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:host,port:port,onConnected:()=>next(data)}})}}exports.default=BaseAuthPreset;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.checkPresetClass=checkPresetClass;const CONNECTION_CREATED=exports.CONNECTION_CREATED='@action:connection_created';const CONNECTION_CLOSED=exports.CONNECTION_CLOSED='@action:connection_closed';const CONNECTION_WILL_CLOSE=exports.CONNECTION_WILL_CLOSE='@action:connection_will_close';const CONNECT_TO_REMOTE=exports.CONNECT_TO_REMOTE='@action:connect_to_remote';const CONNECTED_TO_REMOTE=exports.CONNECTED_TO_REMOTE='@action:connected_to_remote';const PRESET_FAILED=exports.PRESET_FAILED='@action:preset_failed';const CHANGE_PRESET_SUITE=exports.CHANGE_PRESET_SUITE='@action:change_preset_suite';const PRESET_CLOSE_CONNECTION=exports.PRESET_CLOSE_CONNECTION='@action:preset_close_connection';const PRESET_PAUSE_RECV=exports.PRESET_PAUSE_RECV='@action:preset_pause_recv';const PRESET_PAUSE_SEND=exports.PRESET_PAUSE_SEND='@action:preset_pause_send';const PRESET_RESUME_RECV=exports.PRESET_RESUME_RECV='@action:preset_resume_recv';const PRESET_RESUME_SEND=exports.PRESET_RESUME_SEND='@action:preset_resume_send';const MUX_NEW_CONN=exports.MUX_NEW_CONN='@action:mux_new_conn';const MUX_DATA_FRAME=exports.MUX_DATA_FRAME='@action:mux_data_frame';const MUX_CLOSE_CONN=exports.MUX_CLOSE_CONN='@action:mux_close_conn';class IPreset{static checkParams(params){}static onInit(params){}getName(){}onNotified(action){return false}onDestroy(){}beforeOut({buffer}){return buffer}beforeIn({buffer}){return buffer}clientOut({buffer}){return buffer}serverIn({buffer}){return buffer}serverOut({buffer}){return buffer}clientIn({buffer}){return buffer}beforeOutUdp({buffer}){return buffer}beforeInUdp({buffer}){return buffer}clientOutUdp({buffer}){return buffer}serverInUdp({buffer}){return buffer}serverOutUdp({buffer}){return buffer}clientInUdp({buffer}){return buffer}next(direction,buffer){}broadcast(action){}fail(message){}readProperty(presetName,propertyName){}}exports.IPreset=IPreset;IPreset.checked=false;IPreset.initialized=false;class IPresetAddressing extends IPreset{}exports.IPresetAddressing=IPresetAddressing;class IPresetStatic extends IPreset{constructor(){super();if(IPresetStatic.isInstantiated){throw Error(`${this.constructor.name} is singleton and can only be instantiated once`)}IPresetStatic.isInstantiated=true}}exports.IPresetStatic=IPresetStatic;IPresetStatic.isInstantiated=false;function checkPresetClass(clazz){if(typeof clazz!=='function'){return false}const requiredMethods=['getName','onNotified','onDestroy','beforeOut','beforeIn','clientOut','serverIn','serverOut','clientIn','beforeOutUdp','beforeInUdp','clientOutUdp','serverInUdp','serverOutUdp','clientInUdp'];if(requiredMethods.some(method=>typeof clazz.prototype[method]!=='function')){return false}const requiredStaticMethods=['checkParams','onInit'];if(requiredStaticMethods.some(method=>typeof clazz[method]!=='function')){return false}return true}
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.checkPresetClass=checkPresetClass;const CONNECTION_CREATED=exports.CONNECTION_CREATED='@action:connection_created';const CONNECTION_CLOSED=exports.CONNECTION_CLOSED='@action:connection_closed';const CONNECTION_WILL_CLOSE=exports.CONNECTION_WILL_CLOSE='@action:connection_will_close';const CONNECT_TO_REMOTE=exports.CONNECT_TO_REMOTE='@action:connect_to_remote';const CONNECTED_TO_REMOTE=exports.CONNECTED_TO_REMOTE='@action:connected_to_remote';const PRESET_FAILED=exports.PRESET_FAILED='@action:preset_failed';const CHANGE_PRESET_SUITE=exports.CHANGE_PRESET_SUITE='@action:change_preset_suite';const PRESET_CLOSE_CONNECTION=exports.PRESET_CLOSE_CONNECTION='@action:preset_close_connection';const PRESET_PAUSE_RECV=exports.PRESET_PAUSE_RECV='@action:preset_pause_recv';const PRESET_PAUSE_SEND=exports.PRESET_PAUSE_SEND='@action:preset_pause_send';const PRESET_RESUME_RECV=exports.PRESET_RESUME_RECV='@action:preset_resume_recv';const PRESET_RESUME_SEND=exports.PRESET_RESUME_SEND='@action:preset_resume_send';const MUX_NEW_CONN=exports.MUX_NEW_CONN='@action:mux_new_conn';const MUX_DATA_FRAME=exports.MUX_DATA_FRAME='@action:mux_data_frame';const MUX_CLOSE_CONN=exports.MUX_CLOSE_CONN='@action:mux_close_conn';class IPreset{static onCheckParams(params){}static onCache(params,store){}constructor({config,params}={}){this._config=null;if(config){this._config=config}}onInit(params){}onNotified(action){return false}onDestroy(){}beforeOut({buffer}){return buffer}beforeIn({buffer}){return buffer}clientOut({buffer}){return buffer}serverIn({buffer}){return buffer}serverOut({buffer}){return buffer}clientIn({buffer}){return buffer}beforeOutUdp({buffer}){return buffer}beforeInUdp({buffer}){return buffer}clientOutUdp({buffer}){return buffer}serverInUdp({buffer}){return buffer}serverOutUdp({buffer}){return buffer}clientInUdp({buffer}){return buffer}next(direction,buffer){}broadcast(action){}fail(message){}readProperty(presetName,propertyName){}getStore(){}}exports.IPreset=IPreset;class IPresetAddressing extends IPreset{}exports.IPresetAddressing=IPresetAddressing;function checkPresetClass(clazz){if(typeof clazz!=='function'){return false}const requiredMethods=['onNotified','onDestroy','onInit','beforeOut','beforeIn','clientOut','serverIn','serverOut','clientIn','beforeOutUdp','beforeInUdp','clientOutUdp','serverInUdp','serverOutUdp','clientInUdp'];if(requiredMethods.some(method=>typeof clazz.prototype[method]!=='function')){return false}const requiredStaticMethods=['onCheckParams','onCache'];if(requiredStaticMethods.some(method=>typeof clazz[method]!=='function')){return false}return true}

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.presets=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};exports.getPresetClassByName=getPresetClassByName;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 _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 _autoConf=require('./auto-conf');var _autoConf2=_interopRequireDefault(_autoConf);var _mux=require('./mux');var _mux2=_interopRequireDefault(_mux);var _baseAuth=require('./base-auth');var _baseAuth2=_interopRequireDefault(_baseAuth);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 _ssrAuthAes128Md=require('./ssr-auth-aes128-md5');var _ssrAuthAes128Md2=_interopRequireDefault(_ssrAuthAes128Md);var _ssrAuthAes128Sha=require('./ssr-auth-aes128-sha1');var _ssrAuthAes128Sha2=_interopRequireDefault(_ssrAuthAes128Sha);var _ssrAuthChainA=require('./ssr-auth-chain-a');var _ssrAuthChainA2=_interopRequireDefault(_ssrAuthChainA);var _ssrAuthChainB=require('./ssr-auth-chain-b');var _ssrAuthChainB2=_interopRequireDefault(_ssrAuthChainB);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 _aeadRandomCipher=require('./aead-random-cipher');var _aeadRandomCipher2=_interopRequireDefault(_aeadRandomCipher);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function monkeyPatch(clazz){clazz.onInit=function(onInit){return function _onInit(...args){if(!clazz.initialized){onInit(...args);clazz.initialized=true}}}(clazz.onInit);clazz.checkParams=function(checkParams){return function _checkParams(...args){if(!clazz.checked){checkParams(...args);clazz.checked=true}}}(clazz.checkParams)}const mapping={'stats':_stats2.default,'tracker':_tracker2.default,'access-control':_accessControl2.default,'auto-conf':_autoConf2.default,'mux':_mux2.default,'base-auth':_baseAuth2.default,'ss-base':_ssBase2.default,'ss-stream-cipher':_ssStreamCipher2.default,'ss-aead-cipher':_ssAeadCipher2.default,'ssr-auth-aes128-md5':_ssrAuthAes128Md2.default,'ssr-auth-aes128-sha1':_ssrAuthAes128Sha2.default,'ssr-auth-chain-a':_ssrAuthChainA2.default,'ssr-auth-chain-b':_ssrAuthChainB2.default,'v2ray-vmess':_v2rayVmess2.default,'obfs-random-padding':_obfsRandomPadding2.default,'obfs-http':_obfsHttp2.default,'obfs-tls1.2-ticket':_obfsTls2.default,'aead-random-cipher':_aeadRandomCipher2.default};const presetClasses=_extends({},mapping);Object.keys(presetClasses).forEach(clazzName=>monkeyPatch(presetClasses[clazzName]));function getPresetClassByName(name){let clazz=presetClasses[name];if(clazz===undefined){try{clazz=require(name)}catch(err){throw Error(`cannot load preset: "${name}" from built-in modules or external`)}if(!(0,_defs.checkPresetClass)(clazz)){throw Error(`definition of preset "${name}" is invalid`)}}return clazz}const presets=exports.presets=Object.keys(mapping);
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.presets=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};exports.getPresetClassByName=getPresetClassByName;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 _tracker=require('./tracker');var _tracker2=_interopRequireDefault(_tracker);var _autoConf=require('./auto-conf');var _autoConf2=_interopRequireDefault(_autoConf);var _mux=require('./mux');var _mux2=_interopRequireDefault(_mux);var _baseAuth=require('./base-auth');var _baseAuth2=_interopRequireDefault(_baseAuth);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 _ssrAuthAes128Md=require('./ssr-auth-aes128-md5');var _ssrAuthAes128Md2=_interopRequireDefault(_ssrAuthAes128Md);var _ssrAuthAes128Sha=require('./ssr-auth-aes128-sha1');var _ssrAuthAes128Sha2=_interopRequireDefault(_ssrAuthAes128Sha);var _ssrAuthChainA=require('./ssr-auth-chain-a');var _ssrAuthChainA2=_interopRequireDefault(_ssrAuthChainA);var _ssrAuthChainB=require('./ssr-auth-chain-b');var _ssrAuthChainB2=_interopRequireDefault(_ssrAuthChainB);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 _aeadRandomCipher=require('./aead-random-cipher');var _aeadRandomCipher2=_interopRequireDefault(_aeadRandomCipher);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const mapping={'tracker':_tracker2.default,'auto-conf':_autoConf2.default,'mux':_mux2.default,'base-auth':_baseAuth2.default,'ss-base':_ssBase2.default,'ss-stream-cipher':_ssStreamCipher2.default,'ss-aead-cipher':_ssAeadCipher2.default,'ssr-auth-aes128-md5':_ssrAuthAes128Md2.default,'ssr-auth-aes128-sha1':_ssrAuthAes128Sha2.default,'ssr-auth-chain-a':_ssrAuthChainA2.default,'ssr-auth-chain-b':_ssrAuthChainB2.default,'v2ray-vmess':_v2rayVmess2.default,'obfs-random-padding':_obfsRandomPadding2.default,'obfs-http':_obfsHttp2.default,'obfs-tls1.2-ticket':_obfsTls2.default,'aead-random-cipher':_aeadRandomCipher2.default};const presetClasses=_extends({},mapping);function getPresetClassByName(name){let clazz=presetClasses[name];if(clazz===undefined){try{clazz=require(name)}catch(err){throw Error(`cannot load preset: "${name}" from built-in modules or external`)}if(!(0,_defs.checkPresetClass)(clazz)){throw Error(`definition of preset "${name}" is invalid`)}}return clazz}const presets=exports.presets=Object.keys(mapping);

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _utils=require('../utils');var _defs=require('./defs');const CMD_NEW_CONN=0;const CMD_DATA_FRAME=1;const CMD_CLOSE_CONN=2;class MuxPreset extends _defs.IPresetAddressing{constructor(){super();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}onReceiving(buffer,{fail}){if(buffer.length<2){return}const cmd=buffer[0];switch(cmd){case CMD_NEW_CONN:if(buffer.length<5+buffer[2]){return}return 5+buffer[2];case CMD_DATA_FRAME:if(buffer.length<4){return}return 4+buffer.readUInt16BE(2);case CMD_CLOSE_CONN:return 2;default:fail(`unknown cmd=${cmd} dump=${(0,_utils.dumpHex)(buffer)}`);return-1;}}onChunkReceived(chunk,{broadcast,fail}){const cmd=chunk[0];const cid=chunk[1];switch(cmd){case CMD_NEW_CONN:{const host=chunk.slice(3,-2).toString();const port=chunk.readUInt16BE(3+chunk[2]);if(!(0,_utils.isValidHostname)(host)||!(0,_utils.isValidPort)(port)){return fail(`invalid host or port, host=${host} port=${port}`)}return broadcast({type:_defs.MUX_NEW_CONN,payload:{host,port,cid}})}case CMD_DATA_FRAME:{const dataLen=chunk.readUInt16BE(2);return broadcast({type:_defs.MUX_DATA_FRAME,payload:{cid:cid,data:chunk.slice(-dataLen)}})}case CMD_CLOSE_CONN:return broadcast({type:_defs.MUX_CLOSE_CONN,payload:{cid}});}}createDataFrames(cid,data){const chunks=(0,_utils.getRandomChunks)(data,2048,16383).map(chunk=>Buffer.concat([(0,_utils.numberToBuffer)(CMD_DATA_FRAME,1),(0,_utils.numberToBuffer)(cid,1),(0,_utils.numberToBuffer)(chunk.length),chunk]));return Buffer.concat(chunks)}createNewConn(host,port,cid){const _host=Buffer.from(host);const _port=(0,_utils.numberToBuffer)(port);return Buffer.concat([(0,_utils.numberToBuffer)(CMD_NEW_CONN,1),(0,_utils.numberToBuffer)(cid,1),(0,_utils.numberToBuffer)(_host.length,1),_host,_port])}createCloseConn(cid){return Buffer.concat([(0,_utils.numberToBuffer)(CMD_CLOSE_CONN,1),(0,_utils.numberToBuffer)(cid,1)])}clientOut({buffer},{host,port,cid,isClosing}){if(cid!==undefined){const dataFrames=this.createDataFrames(cid,buffer);if(host&&port){return Buffer.concat([this.createNewConn(host,port,cid),dataFrames])}if(isClosing){return this.createCloseConn(cid)}return dataFrames}}serverOut({buffer},{cid,isClosing}){if(cid!==undefined){if(isClosing){return this.createCloseConn(cid)}return this.createDataFrames(cid,buffer)}}beforeIn({buffer,broadcast,fail}){this._adBuf.put(buffer,{broadcast,fail})}}exports.default=MuxPreset;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _utils=require('../utils');var _defs=require('./defs');const CMD_NEW_CONN=0;const CMD_DATA_FRAME=1;const CMD_CLOSE_CONN=2;class MuxPreset extends _defs.IPresetAddressing{constructor(...args){var _temp;return _temp=super(...args),this._adBuf=null,_temp}onInit(){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}onReceiving(buffer,{fail}){if(buffer.length<5){return}const cmd=buffer[0];switch(cmd){case CMD_NEW_CONN:if(buffer.length<8+buffer[5]){return}return 8+buffer[5];case CMD_DATA_FRAME:if(buffer.length<7){return}return 7+buffer.readUInt16BE(5);case CMD_CLOSE_CONN:return 5;default:fail(`unknown cmd=${cmd} dump=${(0,_utils.dumpHex)(buffer)}`);return-1;}}onChunkReceived(chunk,{broadcast,fail}){const cmd=chunk[0];const cid=chunk.slice(1,5).toString('hex');switch(cmd){case CMD_NEW_CONN:{const hostBuf=chunk.slice(6,-2);const host=hostBuf.toString();const port=chunk.readUInt16BE(6+chunk[5]);if(!(0,_utils.isValidHostname)(host)||!(0,_utils.isValidPort)(port)){return fail(`invalid host or port, host=${(0,_utils.dumpHex)(hostBuf)} port=${port}`)}return broadcast({type:_defs.MUX_NEW_CONN,payload:{cid,host,port}})}case CMD_DATA_FRAME:{const dataLen=chunk.readUInt16BE(5);return broadcast({type:_defs.MUX_DATA_FRAME,payload:{cid,data:chunk.slice(-dataLen)}})}case CMD_CLOSE_CONN:return broadcast({type:_defs.MUX_CLOSE_CONN,payload:{cid}});}}createDataFrames(cid,data){const chunks=(0,_utils.getRandomChunks)(data,2048,16383).map(chunk=>Buffer.concat([(0,_utils.numberToBuffer)(CMD_DATA_FRAME,1),cid,(0,_utils.numberToBuffer)(chunk.length),chunk]));return Buffer.concat(chunks)}createNewConn(host,port,cid){const _host=Buffer.from(host);const _port=(0,_utils.numberToBuffer)(port);return Buffer.concat([(0,_utils.numberToBuffer)(CMD_NEW_CONN,1),cid,(0,_utils.numberToBuffer)(_host.length,1),_host,_port])}createCloseConn(cid){return Buffer.concat([(0,_utils.numberToBuffer)(CMD_CLOSE_CONN,1),cid])}clientOut({buffer,fail},{host,port,cid,isClosing}){if(cid!==undefined){const _cid=Buffer.from(cid,'hex');const dataFrames=this.createDataFrames(_cid,buffer);if(host&&port){return Buffer.concat([this.createNewConn(host,port,_cid),dataFrames])}if(isClosing){return this.createCloseConn(_cid)}return dataFrames}else{fail(`cid is not provided, drop buffer=${(0,_utils.dumpHex)(buffer)}`)}}serverOut({buffer,fail},{cid,isClosing}){if(cid!==undefined){const _cid=Buffer.from(cid,'hex');if(isClosing){return this.createCloseConn(_cid)}return this.createDataFrames(_cid,buffer)}else{fail(`cid is not provided, drop buffer=${(0,_utils.dumpHex)(buffer)}`)}}beforeIn({buffer,broadcast,fail}){this._adBuf.put(buffer,{broadcast,fail})}}exports.default=MuxPreset;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _fs=require('fs');var _fs2=_interopRequireDefault(_fs);var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function parseFile(file){const txt=_fs2.default.readFileSync(file,{encoding:'utf-8'});const lines=txt.split(/\r\n|\n|\r/);const parts=[];let part='';var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=lines[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){const line=_step.value;switch(line[0]){case'=':case'-':if(part!==''){part+='\r\n';parts.push(part);part=''}break;default:part+=line;part+='\r\n';break;}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}const pairs=[];for(let i=0;i<parts.length;i+=2){const prev=parts[i];const next=parts[i+1];pairs.push({request:Buffer.from(prev),response:Buffer.from(next)})}return pairs}class ObfsHttpPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._isHeaderSent=false,this._isHeaderRecv=false,this._response=null,_temp}static checkParams({file}){if(typeof file!=='string'||file===''){throw Error('\'file\' must be a non-empty string')}}static onInit({file}){ObfsHttpPreset.pairs=parseFile(file)}onDestroy(){this._response=null}clientOut({buffer}){if(!this._isHeaderSent){const pairs=ObfsHttpPreset.pairs;this._isHeaderSent=true;const index=_crypto2.default.randomBytes(1)[0]%pairs.length;const request=pairs[index].request;return Buffer.concat([request,buffer])}else{return buffer}}serverIn({buffer,fail}){if(!this._isHeaderRecv){const found=ObfsHttpPreset.pairs.find(({request})=>buffer.indexOf(request)===0);if(found!==undefined){this._isHeaderRecv=true;this._response=found.response;return buffer.slice(found.request.length)}else{return fail('http header mismatch')}}else{return buffer}}serverOut({buffer}){if(!this._isHeaderSent){this._isHeaderSent=true;return Buffer.concat([this._response,buffer])}else{return buffer}}clientIn({buffer,fail}){if(!this._isHeaderRecv){const found=ObfsHttpPreset.pairs.find(({response})=>buffer.indexOf(response)===0);if(found!==undefined){this._isHeaderRecv=true;return buffer.slice(found.response.length)}else{return fail('http header mismatch')}}else{return buffer}}}exports.default=ObfsHttpPreset;ObfsHttpPreset.pairs=null;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _fs=require('fs');var _fs2=_interopRequireDefault(_fs);var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function parseFile(file){const txt=_fs2.default.readFileSync(file,{encoding:'utf-8'});const lines=txt.split(/\r\n|\n|\r/);const parts=[];let part='';var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=lines[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){const line=_step.value;switch(line[0]){case'=':case'-':if(part!==''){part+='\r\n';parts.push(part);part=''}break;default:part+=line;part+='\r\n';break;}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}const pairs=[];for(let i=0;i<parts.length;i+=2){const prev=parts[i];const next=parts[i+1];pairs.push({request:Buffer.from(prev),response:Buffer.from(next)})}return pairs}class ObfsHttpPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._isHeaderSent=false,this._isHeaderRecv=false,this._response=null,_temp}static onCheckParams({file}){if(typeof file!=='string'||file===''){throw Error('\'file\' must be a non-empty string')}}static onCache({file}){return{pairs:parseFile(file)}}onDestroy(){this._response=null}clientOut({buffer}){if(!this._isHeaderSent){var _getStore=this.getStore();const pairs=_getStore.pairs;this._isHeaderSent=true;const index=_crypto2.default.randomBytes(1)[0]%pairs.length;const request=pairs[index].request;return Buffer.concat([request,buffer])}else{return buffer}}serverIn({buffer,fail}){if(!this._isHeaderRecv){const found=this.getStore().pairs.find(({request})=>buffer.indexOf(request)===0);if(found!==undefined){this._isHeaderRecv=true;this._response=found.response;return buffer.slice(found.request.length)}else{return fail('http header mismatch')}}else{return buffer}}serverOut({buffer}){if(!this._isHeaderSent){this._isHeaderSent=true;return Buffer.concat([this._response,buffer])}else{return buffer}}clientIn({buffer,fail}){if(!this._isHeaderRecv){const found=this.getStore().pairs.find(({response})=>buffer.indexOf(response)===0);if(found!==undefined){this._isHeaderRecv=true;return buffer.slice(found.response.length)}else{return fail('http header mismatch')}}else{return buffer}}}exports.default=ObfsHttpPreset;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _defs=require('./defs');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class ObfsRandomPaddingPreset extends _defs.IPreset{constructor(){super();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}getRandomBytesLength(dataLen){if(dataLen>1440){return 0}const rand=_crypto2.default.randomBytes(1)[0];let random_bytes_len;if(dataLen>1300){random_bytes_len=rand%31}else if(dataLen>900){random_bytes_len=rand%127}else if(dataLen>400){random_bytes_len=rand%521}else{random_bytes_len=rand%1021}return random_bytes_len}beforeOut({buffer}){const chunks=(0,_utils.getRandomChunks)(buffer,16383,65535).map(data=>{const pLen=this.getRandomBytesLength(data.length);const padding=_crypto2.default.randomBytes(pLen);return Buffer.concat([(0,_utils.numberToBuffer)(pLen,1),padding,(0,_utils.numberToBuffer)(data.length),data])});return Buffer.concat(chunks)}beforeIn({buffer,next}){this._adBuf.put(buffer,{next})}onReceiving(buffer){if(buffer.length<3){return}const pLen=buffer[0];if(buffer.length<1+pLen+2){return}const dLen=buffer.readUInt16BE(1+pLen);if(buffer.length<1+pLen+2+dLen){return}return 1+pLen+2+dLen}onChunkReceived(chunk,{next}){const pLen=chunk[0];next(chunk.slice(1+pLen+2))}beforeOutUdp({buffer}){const pLen=_crypto2.default.randomBytes(1)[0]%128;const padding=_crypto2.default.randomBytes(pLen);return Buffer.concat([(0,_utils.numberToBuffer)(pLen,1),padding,buffer])}beforeInUdp({buffer,fail}){if(buffer.length<1){return fail(`too short to get PaddingLen, len=${buffer.length} dump=${buffer.toString('hex')}`)}const pLen=buffer[0];if(buffer.length<1+pLen){return fail(`too short to drop Padding, len=${buffer.length} dump=${buffer.slice(0,60).toString('hex')}`)}return buffer.slice(1+pLen)}}exports.default=ObfsRandomPaddingPreset;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _crypto=require('crypto');var _crypto2=_interopRequireDefault(_crypto);var _defs=require('./defs');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class ObfsRandomPaddingPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._adBuf=null,_temp}onInit(){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}getRandomBytesLength(dataLen){if(dataLen>1440){return 0}const rand=_crypto2.default.randomBytes(1)[0];let random_bytes_len;if(dataLen>1300){random_bytes_len=rand%31}else if(dataLen>900){random_bytes_len=rand%127}else if(dataLen>400){random_bytes_len=rand%521}else{random_bytes_len=rand%1021}return random_bytes_len}beforeOut({buffer}){const chunks=(0,_utils.getRandomChunks)(buffer,16383,65535).map(data=>{const pLen=this.getRandomBytesLength(data.length);const padding=_crypto2.default.randomBytes(pLen);return Buffer.concat([(0,_utils.numberToBuffer)(pLen,1),padding,(0,_utils.numberToBuffer)(data.length),data])});return Buffer.concat(chunks)}beforeIn({buffer,next}){this._adBuf.put(buffer,{next})}onReceiving(buffer){if(buffer.length<3){return}const pLen=buffer[0];if(buffer.length<1+pLen+2){return}const dLen=buffer.readUInt16BE(1+pLen);if(buffer.length<1+pLen+2+dLen){return}return 1+pLen+2+dLen}onChunkReceived(chunk,{next}){const pLen=chunk[0];next(chunk.slice(1+pLen+2))}beforeOutUdp({buffer}){const pLen=_crypto2.default.randomBytes(1)[0]%128;const padding=_crypto2.default.randomBytes(pLen);return Buffer.concat([(0,_utils.numberToBuffer)(pLen,1),padding,buffer])}beforeInUdp({buffer,fail}){if(buffer.length<1){return fail(`too short to get PaddingLen, len=${buffer.length} dump=${buffer.toString('hex')}`)}const pLen=buffer[0];if(buffer.length<1+pLen){return fail(`too short to drop Padding, len=${buffer.length} dump=${buffer.slice(0,60).toString('hex')}`)}return buffer.slice(1+pLen)}}exports.default=ObfsRandomPaddingPreset;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +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}}const ATYP_V4=1;const ATYP_V6=4;const ATYP_DOMAIN=3;function getHostType(host){if(_net2.default.isIPv4(host)){return ATYP_V4}if(_net2.default.isIPv6(host)){return ATYP_V6}return ATYP_DOMAIN}class SsBasePreset extends _defs.IPresetAddressing{constructor(...args){var _temp;return _temp=super(...args),this._isConnecting=false,this._pending=Buffer.alloc(0),this._isHeaderSent=false,this._isHeaderRecv=false,this._atyp=ATYP_V4,this._host=null,this._port=null,this._headSize=0,_temp}get headSize(){return this._headSize}onDestroy(){this._pending=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;const type=getHostType(host);this._atyp=type;this._port=(0,_utils.numberToBuffer)(port);this._host=type===ATYP_DOMAIN?Buffer.from(host):_ip2.default.toBuffer(host)}}encodeHeader(){const head=Buffer.from([this._atyp,...(this._atyp===ATYP_DOMAIN?[this._host.length]:[]),...this._host,...this._port]);this._headSize=head.length;return head}decodeHeader({buffer,fail}){if(buffer.length<7){return fail(`invalid length: ${buffer.length}`)}const atyp=buffer[0];let addr;let port;let offset=3;switch(atyp){case ATYP_V4:addr=_ip2.default.toString(buffer.slice(1,5));port=buffer.slice(5,7).readUInt16BE(0);offset+=4;break;case ATYP_V6:if(buffer.length<19){return fail(`invalid length: ${buffer.length}`)}addr=_ip2.default.toString(buffer.slice(1,17));port=buffer.slice(17,19).readUInt16BE(0);offset+=16;break;case ATYP_DOMAIN:const domainLen=buffer[1];if(buffer.length<domainLen+4){return fail(`invalid length: ${buffer.length}`)}addr=buffer.slice(2,2+domainLen).toString();if(!(0,_utils.isValidHostname)(addr)){return fail(`addr=${addr} is an invalid hostname`)}port=buffer.slice(2+domainLen,4+domainLen).readUInt16BE(0);offset+=domainLen+1;break;default:return fail(`invalid atyp: ${atyp}`);}const data=buffer.slice(offset);return{host:addr,port,data}}clientOut({buffer}){if(!this._isHeaderSent){this._isHeaderSent=true;return Buffer.concat([this.encodeHeader(),buffer])}else{return buffer}}serverIn({buffer,next,broadcast,fail}){if(!this._isHeaderRecv){if(this._isConnecting){this._pending=Buffer.concat([this._pending,buffer]);return}const decoded=this.decodeHeader({buffer,fail});if(!decoded){return}const host=decoded.host,port=decoded.port,data=decoded.data;this._isConnecting=true;broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:host,port:port,onConnected:()=>{next(Buffer.concat([data,this._pending]));this._isHeaderRecv=true;this._isConnecting=false;this._pending=null}}})}else{return buffer}}beforeOutUdp({buffer}){return Buffer.concat([this.encodeHeader(),buffer])}serverInUdp({buffer,next,broadcast,fail}){const decoded=this.decodeHeader({buffer,fail});if(!decoded){return}const host=decoded.host,port=decoded.port,data=decoded.data;this._atyp=getHostType(host);this._host=this._atyp===ATYP_DOMAIN?Buffer.from(host):_ip2.default.toBuffer(host);this._port=(0,_utils.numberToBuffer)(port);broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:host,port:port,onConnected:()=>next(data)}})}}exports.default=SsBasePreset;
'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}}const ATYP_V4=1;const ATYP_V6=4;const ATYP_DOMAIN=3;function getHostType(host){if(_net2.default.isIPv4(host)){return ATYP_V4}if(_net2.default.isIPv6(host)){return ATYP_V6}return ATYP_DOMAIN}class SsBasePreset extends _defs.IPresetAddressing{constructor(...args){var _temp;return _temp=super(...args),this._isConnecting=false,this._pending=Buffer.alloc(0),this._isHeaderSent=false,this._isHeaderRecv=false,this._atyp=ATYP_V4,this._host=null,this._port=null,this._headSize=0,_temp}get headSize(){return this._headSize}onDestroy(){this._pending=null;this._host=null;this._port=null}onNotified(action){if(this._config.is_client&&action.type===_defs.CONNECT_TO_REMOTE){var _action$payload=action.payload;const host=_action$payload.host,port=_action$payload.port;const type=getHostType(host);this._atyp=type;this._port=(0,_utils.numberToBuffer)(port);this._host=type===ATYP_DOMAIN?Buffer.from(host):_ip2.default.toBuffer(host)}}encodeHeader(){const head=Buffer.from([this._atyp,...(this._atyp===ATYP_DOMAIN?[this._host.length]:[]),...this._host,...this._port]);this._headSize=head.length;return head}decodeHeader({buffer,fail}){if(buffer.length<7){return fail(`invalid length: ${buffer.length}`)}const atyp=buffer[0];let addr;let port;let offset=3;switch(atyp){case ATYP_V4:addr=_ip2.default.toString(buffer.slice(1,5));port=buffer.slice(5,7).readUInt16BE(0);offset+=4;break;case ATYP_V6:if(buffer.length<19){return fail(`invalid length: ${buffer.length}`)}addr=_ip2.default.toString(buffer.slice(1,17));port=buffer.slice(17,19).readUInt16BE(0);offset+=16;break;case ATYP_DOMAIN:const domainLen=buffer[1];if(buffer.length<domainLen+4){return fail(`invalid length: ${buffer.length}`)}addr=buffer.slice(2,2+domainLen).toString();if(!(0,_utils.isValidHostname)(addr)){return fail(`addr=${addr} is an invalid hostname`)}port=buffer.slice(2+domainLen,4+domainLen).readUInt16BE(0);offset+=domainLen+1;break;default:return fail(`invalid atyp: ${atyp}`);}const data=buffer.slice(offset);return{host:addr,port,data}}clientOut({buffer}){if(!this._isHeaderSent){this._isHeaderSent=true;return Buffer.concat([this.encodeHeader(),buffer])}else{return buffer}}serverIn({buffer,next,broadcast,fail}){if(!this._isHeaderRecv){if(this._isConnecting){this._pending=Buffer.concat([this._pending,buffer]);return}const decoded=this.decodeHeader({buffer,fail});if(!decoded){return}const host=decoded.host,port=decoded.port,data=decoded.data;this._isConnecting=true;broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:host,port:port,onConnected:()=>{next(Buffer.concat([data,this._pending]));this._isHeaderRecv=true;this._isConnecting=false;this._pending=null}}})}else{return buffer}}beforeOutUdp({buffer}){return Buffer.concat([this.encodeHeader(),buffer])}serverInUdp({buffer,next,broadcast,fail}){const decoded=this.decodeHeader({buffer,fail});if(!decoded){return}const host=decoded.host,port=decoded.port,data=decoded.data;this._atyp=getHostType(host);this._host=this._atyp===ATYP_DOMAIN?Buffer.from(host):_ip2.default.toBuffer(host);this._port=(0,_utils.numberToBuffer)(port);broadcast({type:_defs.CONNECT_TO_REMOTE,payload:{host:host,port:port,onConnected:()=>next(data)}})}}exports.default=SsBasePreset;

@ -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 _defs=require('./defs');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const ciphers={'aes-128-ctr':[16,16],'aes-192-ctr':[24,16],'aes-256-ctr':[32,16],'aes-128-cfb':[16,16],'aes-192-cfb':[24,16],'aes-256-cfb':[32,16],'camellia-128-cfb':[16,16],'camellia-192-cfb':[24,16],'camellia-256-cfb':[32,16],'rc4-md5':[16,16],'rc4-md5-6':[16,6],'none':[16,0]};const NOOP=Buffer.alloc(0);class SsStreamCipherPreset extends _defs.IPreset{static checkParams({method}){if(typeof method!=='string'||method===''){throw Error('\'method\' must be set')}const cipherNames=Object.keys(ciphers);if(!cipherNames.includes(method)){throw Error(`'method' must be one of [${cipherNames}]`)}}get key(){return this._key}get iv(){return this._iv}constructor({method}){super();this._algorithm='';this._key=null;this._iv=null;this._keySize=0;this._ivSize=0;this._cipher=null;this._decipher=null;var _ciphers$method=_slicedToArray(ciphers[method],2);const keySize=_ciphers$method[0],ivSize=_ciphers$method[1];const iv=_crypto2.default.randomBytes(ivSize);this._algorithm=['rc4-md5','rc4-md5-6'].includes(method)?'rc4':method;this._keySize=keySize;this._ivSize=ivSize;this._key=(0,_utils.EVP_BytesToKey)(__KEY__,keySize,ivSize);this._iv=method==='rc4-md5-6'?iv.slice(0,6):iv}onDestroy(){this._key=null;this._iv=null;this._cipher=null;this._decipher=null}createCipher(key,iv){const algorithm=this._algorithm;let _key=key;let _iv=iv;if(algorithm==='rc4'){_key=(0,_utils.hash)('md5',Buffer.concat([_key,_iv]));_iv=NOOP}else if(algorithm==='none'){return{update:buffer=>buffer}}return _crypto2.default.createCipheriv(algorithm,_key,_iv)}createDecipher(key,iv){const algorithm=this._algorithm;let _key=key;let _iv=iv;if(algorithm==='rc4'){_key=(0,_utils.hash)('md5',Buffer.concat([_key,_iv]));_iv=NOOP}else if(algorithm==='none'){return{update:buffer=>buffer}}return _crypto2.default.createDecipheriv(algorithm,_key,_iv)}beforeOut({buffer}){if(!this._cipher){this._cipher=this.createCipher(this._key,this._iv);return Buffer.concat([this._iv,this._cipher.update(buffer)])}else{return this._cipher.update(buffer)}}beforeIn({buffer,fail}){if(!this._decipher){const _ivSize=this._ivSize;if(buffer.length<_ivSize){return fail(`buffer is too short to get iv, len=${buffer.length} dump=${(0,_utils.dumpHex)(buffer)}`)}this._iv=buffer.slice(0,_ivSize);this._decipher=this.createDecipher(this._key,this._iv);return this._decipher.update(buffer.slice(_ivSize))}else{return this._decipher.update(buffer)}}beforeOutUdp({buffer}){this._iv=_crypto2.default.randomBytes(this._ivSize);this._cipher=this.createCipher(this._key,this._iv);return Buffer.concat([this._iv,this._cipher.update(buffer)])}beforeInUdp({buffer,fail}){const _ivSize=this._ivSize;if(buffer.length<_ivSize){return fail(`buffer is too short to get iv, len=${buffer.length} dump=${(0,_utils.dumpHex)(buffer)}`)}this._iv=buffer.slice(0,_ivSize);this._decipher=this.createDecipher(this._key,this._iv);return this._decipher.update(buffer.slice(_ivSize))}}exports.default=SsStreamCipherPreset;
'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 _defs=require('./defs');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const ciphers={'aes-128-ctr':[16,16],'aes-192-ctr':[24,16],'aes-256-ctr':[32,16],'aes-128-cfb':[16,16],'aes-192-cfb':[24,16],'aes-256-cfb':[32,16],'camellia-128-cfb':[16,16],'camellia-192-cfb':[24,16],'camellia-256-cfb':[32,16],'rc4-md5':[16,16],'rc4-md5-6':[16,6],'none':[16,0]};const NOOP=Buffer.alloc(0);class SsStreamCipherPreset extends _defs.IPreset{constructor(...args){var _temp;return _temp=super(...args),this._algorithm='',this._key=null,this._iv=null,this._keySize=0,this._ivSize=0,this._cipher=null,this._decipher=null,_temp}get key(){return this._key}get iv(){return this._iv}static onCheckParams({method}){if(typeof method!=='string'||method===''){throw Error('\'method\' must be set')}const cipherNames=Object.keys(ciphers);if(!cipherNames.includes(method)){throw Error(`'method' must be one of [${cipherNames}]`)}}onInit({method}){var _ciphers$method=_slicedToArray(ciphers[method],2);const keySize=_ciphers$method[0],ivSize=_ciphers$method[1];const iv=_crypto2.default.randomBytes(ivSize);this._algorithm=['rc4-md5','rc4-md5-6'].includes(method)?'rc4':method;this._keySize=keySize;this._ivSize=ivSize;this._key=(0,_utils.EVP_BytesToKey)(this._config.key,keySize,ivSize);this._iv=method==='rc4-md5-6'?iv.slice(0,6):iv}onDestroy(){this._key=null;this._iv=null;this._cipher=null;this._decipher=null}createCipher(key,iv){const algorithm=this._algorithm;let _key=key;let _iv=iv;if(algorithm==='rc4'){_key=(0,_utils.hash)('md5',Buffer.concat([_key,_iv]));_iv=NOOP}else if(algorithm==='none'){return{update:buffer=>buffer}}return _crypto2.default.createCipheriv(algorithm,_key,_iv)}createDecipher(key,iv){const algorithm=this._algorithm;let _key=key;let _iv=iv;if(algorithm==='rc4'){_key=(0,_utils.hash)('md5',Buffer.concat([_key,_iv]));_iv=NOOP}else if(algorithm==='none'){return{update:buffer=>buffer}}return _crypto2.default.createDecipheriv(algorithm,_key,_iv)}beforeOut({buffer}){if(!this._cipher){this._cipher=this.createCipher(this._key,this._iv);return Buffer.concat([this._iv,this._cipher.update(buffer)])}else{return this._cipher.update(buffer)}}beforeIn({buffer,fail}){if(!this._decipher){const _ivSize=this._ivSize;if(buffer.length<_ivSize){return fail(`buffer is too short to get iv, len=${buffer.length} dump=${(0,_utils.dumpHex)(buffer)}`)}this._iv=buffer.slice(0,_ivSize);this._decipher=this.createDecipher(this._key,this._iv);return this._decipher.update(buffer.slice(_ivSize))}else{return this._decipher.update(buffer)}}beforeOutUdp({buffer}){this._iv=_crypto2.default.randomBytes(this._ivSize);this._cipher=this.createCipher(this._key,this._iv);return Buffer.concat([this._iv,this._cipher.update(buffer)])}beforeInUdp({buffer,fail}){const _ivSize=this._ivSize;if(buffer.length<_ivSize){return fail(`buffer is too short to get iv, len=${buffer.length} dump=${(0,_utils.dumpHex)(buffer)}`)}this._iv=buffer.slice(0,_ivSize);this._decipher=this.createDecipher(this._key,this._iv);return this._decipher.update(buffer.slice(_ivSize))}}exports.default=SsStreamCipherPreset;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _ssrAuthAes=require('./ssr-auth-aes128');var _ssrAuthAes2=_interopRequireDefault(_ssrAuthAes);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class SsrAuthAes128Md5Preset extends _ssrAuthAes2.default{constructor(params){super(params);this._hashFunc='md5';this._salt='auth_aes128_md5'}}exports.default=SsrAuthAes128Md5Preset;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _ssrAuthAes=require('./ssr-auth-aes128');var _ssrAuthAes2=_interopRequireDefault(_ssrAuthAes);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class SsrAuthAes128Md5Preset extends _ssrAuthAes2.default{constructor(props){super(props);this._hashFunc='md5';this._salt='auth_aes128_md5'}}exports.default=SsrAuthAes128Md5Preset;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _ssrAuthAes=require('./ssr-auth-aes128');var _ssrAuthAes2=_interopRequireDefault(_ssrAuthAes);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class SsrAuthAes128Sha1Preset extends _ssrAuthAes2.default{constructor(params){super(params);this._hashFunc='sha1';this._salt='auth_aes128_sha1'}}exports.default=SsrAuthAes128Sha1Preset;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _ssrAuthAes=require('./ssr-auth-aes128');var _ssrAuthAes2=_interopRequireDefault(_ssrAuthAes);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class SsrAuthAes128Sha1Preset extends _ssrAuthAes2.default{constructor(props){super(props);this._hashFunc='sha1';this._salt='auth_aes128_sha1'}}exports.default=SsrAuthAes128Sha1Preset;

File diff suppressed because one or more lines are too long

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _ssrAuthChain=require('./ssr-auth-chain');var _ssrAuthChain2=_interopRequireDefault(_ssrAuthChain);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class SsrAuthChainAPreset extends _ssrAuthChain2.default{constructor(params){super(params);this._salt='auth_chain_a'}getRandomBytesLengthForTcp(seed,base,rng){if(base>1440){return 0}rng.init_from_bin_datalen(seed,base);let random_bytes_len;if(base>1300){random_bytes_len=rng.next().mod(31)}else if(base>900){random_bytes_len=rng.next().mod(127)}else if(base>400){random_bytes_len=rng.next().mod(521)}else{random_bytes_len=rng.next().mod(1021)}return random_bytes_len.toNumber()}}exports.default=SsrAuthChainAPreset;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _ssrAuthChain=require('./ssr-auth-chain');var _ssrAuthChain2=_interopRequireDefault(_ssrAuthChain);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class SsrAuthChainAPreset extends _ssrAuthChain2.default{constructor(props){super(props);this._salt='auth_chain_a'}getRandomBytesLengthForTcp(seed,base,rng){if(base>1440){return 0}rng.init_from_bin_datalen(seed,base);let random_bytes_len;if(base>1300){random_bytes_len=rng.next().mod(31)}else if(base>900){random_bytes_len=rng.next().mod(127)}else if(base>400){random_bytes_len=rng.next().mod(521)}else{random_bytes_len=rng.next().mod(1021)}return random_bytes_len.toNumber()}}exports.default=SsrAuthChainAPreset;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _ssrAuthChain=require('./ssr-auth-chain');var _ssrAuthChain2=_interopRequireDefault(_ssrAuthChain);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function bisect_left(array,x,low=0,high=array.length){let mid;while(low<high){mid=low+high>>1;if(array[mid]<x){low=mid+1}else{high=mid}}return low}class SsrAuthChainBPreset extends _ssrAuthChain2.default{constructor(params){super(params);this._data_size_list=[];this._data_size_list2=[];this._salt='auth_chain_b'}onDestroy(){super.onDestroy();this._data_size_list=null;this._data_size_list2=null}initDataSizeLists(){const rng=(0,_ssrAuthChain.xorshift128plus)();rng.init_from_bin(this.readProperty('ss-stream-cipher','key'));let len=rng.next().mod(8).add(4).toNumber();for(let i=0;i<len;++i){this._data_size_list.push(rng.next().mod(2340).mod(2040).mod(1440).toNumber())}len=rng.next().mod(16).add(8).toNumber();for(let i=0;i<len;++i){this._data_size_list2.push(rng.next().mod(2340).mod(2040).mod(1440).toNumber())}this._data_size_list.sort((a,b)=>a-b);this._data_size_list2.sort((a,b)=>a-b)}getRandomBytesLengthForTcp(seed,base,rng){if(this._data_size_list.length<1||this._data_size_list2.length<1){this.initDataSizeLists()}if(base>=1440){return 0}rng.init_from_bin_datalen(seed,base);const list_1=this._data_size_list;const list_2=this._data_size_list2;const overhead=this._overhead;let pos=bisect_left(list_1,base+overhead);pos=pos+rng.next().mod(list_1.length).toNumber();if(pos<list_1.length){return list_1[pos]-base-overhead}pos=bisect_left(list_2,base+overhead);const final_pos=pos+rng.next().mod(list_2.length).toNumber();if(final_pos<list_2.length){return list_2[final_pos]-base-overhead}if(final_pos<pos+list_2.length-1){return 0}let random_bytes_len;if(base>1300){random_bytes_len=rng.next().mod(31)}else if(base>900){random_bytes_len=rng.next().mod(127)}else if(base>400){random_bytes_len=rng.next().mod(521)}else{random_bytes_len=rng.next().mod(1021)}return random_bytes_len.toNumber()}}exports.default=SsrAuthChainBPreset;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _ssrAuthChain=require('./ssr-auth-chain');var _ssrAuthChain2=_interopRequireDefault(_ssrAuthChain);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function bisect_left(array,x,low=0,high=array.length){let mid;while(low<high){mid=low+high>>1;if(array[mid]<x){low=mid+1}else{high=mid}}return low}class SsrAuthChainBPreset extends _ssrAuthChain2.default{constructor(props){super(props);this._data_size_list=[];this._data_size_list2=[];this._salt='auth_chain_b'}onDestroy(){super.onDestroy();this._data_size_list=null;this._data_size_list2=null}initDataSizeLists(){const rng=(0,_ssrAuthChain.xorshift128plus)();rng.init_from_bin(this.readProperty('ss-stream-cipher','key'));let len=rng.next().mod(8).add(4).toNumber();for(let i=0;i<len;++i){this._data_size_list.push(rng.next().mod(2340).mod(2040).mod(1440).toNumber())}len=rng.next().mod(16).add(8).toNumber();for(let i=0;i<len;++i){this._data_size_list2.push(rng.next().mod(2340).mod(2040).mod(1440).toNumber())}this._data_size_list.sort((a,b)=>a-b);this._data_size_list2.sort((a,b)=>a-b)}getRandomBytesLengthForTcp(seed,base,rng){if(this._data_size_list.length<1||this._data_size_list2.length<1){this.initDataSizeLists()}if(base>=1440){return 0}rng.init_from_bin_datalen(seed,base);const list_1=this._data_size_list;const list_2=this._data_size_list2;const overhead=this._overhead;let pos=bisect_left(list_1,base+overhead);pos=pos+rng.next().mod(list_1.length).toNumber();if(pos<list_1.length){return list_1[pos]-base-overhead}pos=bisect_left(list_2,base+overhead);const final_pos=pos+rng.next().mod(list_2.length).toNumber();if(final_pos<list_2.length){return list_2[final_pos]-base-overhead}if(final_pos<pos+list_2.length-1){return 0}let random_bytes_len;if(base>1300){random_bytes_len=rng.next().mod(31)}else if(base>900){random_bytes_len=rng.next().mod(127)}else if(base>400){random_bytes_len=rng.next().mod(521)}else{random_bytes_len=rng.next().mod(1021)}return random_bytes_len.toNumber()}}exports.default=SsrAuthChainBPreset;

File diff suppressed because one or more lines are too long

@ -1 +0,0 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _fs=require('fs');var _fs2=_interopRequireDefault(_fs);var _path=require('path');var _path2=_interopRequireDefault(_path);var _defs=require('./defs');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const DEFAULT_SAMPLE_INTERVAL=30;const DEFAULT_SAVE_INTERVAL=60;class StatsPreset extends _defs.IPresetStatic{static checkParams({save_to,sample_interval=DEFAULT_SAMPLE_INTERVAL,save_interval=DEFAULT_SAVE_INTERVAL}){if(typeof save_to!=='string'||save_to===''){throw Error('\'save_to\' must be a non-empty string')}if(typeof sample_interval==='undefined'){throw Error('\'sample_interval\' must be provided as an integer')}if(typeof sample_interval!=='number'){throw Error('\'sample_interval\' must be a number')}if(!Number.isSafeInteger(sample_interval)){throw Error('\'sample_interval\' must be an integer')}if(sample_interval<1){throw Error('\'sample_interval\' must be greater than 0')}if(typeof save_interval==='undefined'){throw Error('\'save_interval\' must be provided as an integer')}if(typeof save_interval!=='number'){throw Error('\'save_interval\' must be a number')}if(!Number.isSafeInteger(save_interval)){throw Error('\'save_interval\' must be an integer')}if(save_interval<1){throw Error('\'save_interval\' must be greater than 0')}}constructor({save_to,sample_interval=DEFAULT_SAMPLE_INTERVAL,save_interval=DEFAULT_SAVE_INTERVAL}){super();this.sampleInterval=DEFAULT_SAMPLE_INTERVAL;this.saveInterval=DEFAULT_SAVE_INTERVAL;this.saveTo='';this.sampleTimer=null;this.saveTimer=null;this.startedAt=Date.now();this.totalOutBytes=0;this.totalInBytes=0;this.totalOutPackets=0;this.totalInPackets=0;this.totalErrors=0;this.totalConnections=0;this.instantOutSpeed=0;this.instantInSpeed=0;this.maxOutSpeed=0;this.maxInSpeed=0;this.maxConnections=0;this.tmpOut=0;this.tmpIn=0;this.onSave=this.onSave.bind(this);this.onSample=this.onSample.bind(this);this.saveTo=_path2.default.resolve(process.cwd(),save_to);this.sampleInterval=sample_interval;this.saveInterval=save_interval;this.sampleTimer=setInterval(this.onSample,sample_interval*1e3);this.saveTimer=setInterval(this.onSave,save_interval*1e3);process.on('SIGINT',this.onSave)}onSave(){const startedAt=this.startedAt;const endAt=Date.now();const durationMilliSec=endAt-startedAt;const durationSec=durationMilliSec/1e3;const totalPackets=this.totalInPackets+this.totalOutPackets;const totalBytes=this.totalInBytes+this.totalOutBytes;const json={sample:{from:startedAt,to:endAt,duration:durationMilliSec},summary:{maxOutSpeed:this.maxOutSpeed,maxInSpeed:this.maxInSpeed,maxConnections:this.maxConnections,totalOutBytes:this.totalOutBytes,totalOutPackets:this.totalOutPackets,totalInBytes:this.totalInBytes,totalInPackets:this.totalInPackets,totalBytes:totalBytes,totalPackets:totalPackets,totalErrors:this.totalErrors},instant:{outSpeed:this.instantOutSpeed,inSpeed:this.instantInSpeed,totalConnections:this.totalConnections,errorRate:totalPackets.length>0?this.totalErrors/totalPackets:0,outBytesPerSecond:this.totalOutBytes/durationSec,outPacketsPerSecond:this.totalOutPackets/durationSec,inBytesPerSecond:this.totalInBytes/durationSec,inPacketsPerSecond:this.totalInPackets/durationSec,totalBytesPerSecond:totalBytes/durationSec,totalPacketsPerSecond:totalPackets/durationSec},process:{upTime:process.uptime(),cpuUsage:process.cpuUsage(),memoryUsage:process.memoryUsage()}};_fs2.default.writeFile(this.saveTo,JSON.stringify(json,null,' '),()=>0)}onSample(){this.instantOutSpeed=this.tmpOut/this.sampleInterval;this.instantInSpeed=this.tmpIn/this.sampleInterval;this.maxOutSpeed=Math.max(this.maxOutSpeed,this.instantOutSpeed);this.maxInSpeed=Math.max(this.maxInSpeed,this.instantInSpeed);this.tmpOut=0;this.tmpIn=0}onNotified(action){if(action.type===_defs.PRESET_FAILED){this.totalErrors+=1}if(action.type===_defs.CONNECTION_CREATED){this.totalConnections+=1;this.maxConnections=Math.max(this.maxConnections,this.totalConnections)}if(action.type===_defs.CONNECTION_CLOSED){this.totalConnections-=1}}onDestroy(){clearInterval(this.sampleTimer);clearInterval(this.saveTimer)}beforeOut({buffer}){this.totalOutBytes+=buffer.length;this.totalOutPackets+=1;this.tmpOut+=buffer.length;return buffer}beforeIn({buffer}){this.totalInBytes+=buffer.length;this.totalInPackets+=1;this.tmpIn+=buffer.length;return buffer}beforeOutUdp(...args){return this.beforeOut(...args)}beforeInUdp(...args){return this.beforeIn(...args)}}exports.default=StatsPreset;

@ -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=60;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:{const host=payload.host,port=payload.port,transport=payload.transport;if(this._sourceHost!==host&&this._sourceHost!==port){this._transport=transport;this._sourceHost=host;this._sourcePort=port;this._tracks.push(`${host}:${port}`)}break}case _defs.CONNECT_TO_REMOTE:{const host=payload.host,port=payload.port;if(this._targetHost!==host&&this._targetPort!==port){this._targetHost=host;this._targetPort=port;this._tracks.push(`${host}:${port}`)}break}default:break;}}onDestroy(){if(this._tracks!==null){this.dump(this._tracks)}this._tracks=null}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:${this._transport}] summary(${summary}) abstract(${strs.join(' ')})`)}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}beforeOutUdp(...args){return this.beforeOut(...args)}beforeInUdp(...args){return this.beforeIn(...args)}}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=60;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:{const host=payload.host,port=payload.port,transport=payload.transport;if(this._sourceHost!==host&&this._sourceHost!==port){this._transport=transport;this._sourceHost=host;this._sourcePort=port;this._tracks.push(`${host}:${port}`)}break}case _defs.CONNECT_TO_REMOTE:{const host=payload.host,port=payload.port;if(this._targetHost!==host&&this._targetPort!==port){this._targetHost=host;this._targetPort=port;this._tracks.push(`${host}:${port}`)}break}default:break;}}onDestroy(){if(this._tracks!==null){this.dump(this._tracks)}this._tracks=null}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=this._config.is_client?`out/in = ${up}/${dp}, ${ub}b/${db}b`:`in/out = ${dp}/${up}, ${db}b/${ub}b`;_utils.logger.info(`[tracker:${this._transport}] summary(${summary}) abstract(${strs.join(' ')})`)}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}beforeOutUdp(...args){return this.beforeOut(...args)}beforeInUdp(...args){return this.beforeIn(...args)}}exports.default=TrackerPreset;

File diff suppressed because one or more lines are too long

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Outbound=exports.Inbound=undefined;var _events=require('events');var _events2=_interopRequireDefault(_events);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class Bound extends _events2.default{constructor({context}){super();this._ctx=null;this._ctx=context}get ctx(){return this._ctx}get remoteHost(){return this.ctx.remoteInfo.host}get remotePort(){return this.ctx.remoteInfo.port}get remote(){return`${this.remoteHost}:${this.remotePort}`}get bufferSize(){return 0}get writable(){return true}onBroadcast(){}write(buffer){}end(){}close(){}updatePresets(value){this.emit('updatePresets',value)}broadcast(action){!this.ctx.pipe.destroyed&&this.ctx.pipe.broadcast('pipe',action)}}class Inbound extends Bound{constructor(...args){var _temp;return _temp=super(...args),this._outbound=null,_temp}setOutbound(outbound){this._outbound=outbound}getOutbound(){return this._outbound}}exports.Inbound=Inbound;class Outbound extends Bound{constructor(...args){var _temp2;return _temp2=super(...args),this._inbound=null,_temp2}setInbound(inbound){this._inbound=inbound}getInbound(){return this._inbound}}exports.Outbound=Outbound;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Outbound=exports.Inbound=undefined;var _events=require('events');var _events2=_interopRequireDefault(_events);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class Bound extends _events2.default{constructor({config,context}){super();this._ctx=null;this._config=null;this._config=config;this._ctx=context}get ctx(){return this._ctx}get remoteHost(){return this.ctx.remoteInfo.host}get remotePort(){return this.ctx.remoteInfo.port}get remote(){return`${this.remoteHost}:${this.remotePort}`}get bufferSize(){return 0}get writable(){return true}onBroadcast(){}write(buffer){}end(){}close(){}updatePresets(value){this.emit('updatePresets',value)}broadcast(action){!this.ctx.pipe.destroyed&&this.ctx.pipe.broadcast('pipe',action)}}class Inbound extends Bound{constructor(...args){var _temp;return _temp=super(...args),this._outbound=null,_temp}setOutbound(outbound){this._outbound=outbound}getOutbound(){return this._outbound}}exports.Inbound=Inbound;class Outbound extends Bound{constructor(...args){var _temp2;return _temp2=super(...args),this._inbound=null,_temp2}setInbound(inbound){this._inbound=inbound}getInbound(){return this._inbound}}exports.Outbound=Outbound;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.MuxOutbound=exports.MuxInbound=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');var _defs2=require('../presets/defs');class MuxInbound extends _defs.Inbound{constructor(props){super(props);this.onDrain=this.onDrain.bind(this);if(__IS_SERVER__){const inbound=this.ctx.muxRelay.getInbound();inbound.on('drain',this.onDrain)}else{}}get bufferSize(){if(__IS_CLIENT__){const totalBufferSize=0;return totalBufferSize}else{const inbound=this.ctx.muxRelay.getInbound();if(inbound){return inbound.bufferSize}else{return 0}}}onBroadcast(action){const socket=this.ctx.socket;switch(action.type){case _defs2.CONNECT_TO_REMOTE:socket&&socket.pause();break;case _defs2.CONNECTED_TO_REMOTE:socket&&socket.resume();break;default:break;}}onDrain(){this.emit('drain')}write(buffer){if(__IS_SERVER__){var _ctx=this.ctx;const muxRelay=_ctx.muxRelay,cid=_ctx.cid;muxRelay.encode(buffer,{cid})}}end(){this.close()}close(){const doClose=()=>{if(__IS_SERVER__){var _ctx2=this.ctx;const muxRelay=_ctx2.muxRelay,cid=_ctx2.cid;const inbound=muxRelay.getInbound();if(inbound){inbound.removeListener('drain',this.onDrain)}muxRelay.destroySubRelay(cid)}if(!this._destroyed){this._destroyed=true;this.emit('close')}};if(this.bufferSize>0){this.once('drain',doClose)}else{doClose()}}}exports.MuxInbound=MuxInbound;class MuxOutbound extends _defs.Outbound{constructor(props){super(props);this._isFirstFrame=true;this.onDrain=this.onDrain.bind(this);if(__IS_CLIENT__){const outbound=this.ctx.muxRelay.getOutbound();outbound.on('drain',this.onDrain)}else{}}get bufferSize(){if(__IS_CLIENT__){const outbound=this.ctx.muxRelay.getOutbound();if(outbound){return outbound.bufferSize}else{return 0}}else{const totalBufferSize=0;return totalBufferSize}}onDrain(){this.emit('drain')}write(buffer){if(__IS_CLIENT__){var _ctx3=this.ctx;const muxRelay=_ctx3.muxRelay,proxyRequest=_ctx3.proxyRequest,cid=_ctx3.cid;if(this._isFirstFrame){this._isFirstFrame=false;muxRelay.encode(buffer,_extends({cid},proxyRequest))}else{muxRelay.encode(buffer,{cid})}}}end(){this.close()}close(){const doClose=()=>{if(__IS_CLIENT__){var _ctx4=this.ctx;const muxRelay=_ctx4.muxRelay,cid=_ctx4.cid;const outbound=muxRelay.getOutbound();if(outbound){outbound.removeListener('drain',this.onDrain)}muxRelay.destroySubRelay(cid)}if(!this._destroyed){this._destroyed=true;this.emit('close')}};if(this.bufferSize>0){this.once('drain',doClose)}else{doClose()}}}exports.MuxOutbound=MuxOutbound;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.MuxOutbound=exports.MuxInbound=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');var _defs2=require('../presets/defs');var _utils=require('../utils');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 MuxInbound extends _defs.Inbound{constructor(props){super(props);this.onDrain=this.onDrain.bind(this);if(this._config.is_server){const inbound=this.ctx.muxRelay.getInbound();inbound.on('drain',this.onDrain)}else{}}get name(){return'mux:inbound'}get bufferSize(){if(this._config.is_client){const totalBufferSize=0;return totalBufferSize}else{const inbound=this.ctx.muxRelay.getInbound();if(inbound){return inbound.bufferSize}else{return 0}}}onBroadcast(action){const socket=this.ctx.socket;switch(action.type){case _defs2.CONNECT_TO_REMOTE:socket&&socket.pause();break;case _defs2.CONNECTED_TO_REMOTE:socket&&socket.resume();break;case _defs2.PRESET_FAILED:this.onPresetFailed(action);break;default:break;}}onPresetFailed(action){var _this=this;return _asyncToGenerator(function*(){var _action$payload=action.payload;const name=_action$payload.name,message=_action$payload.message;_utils.logger.error(`[${_this.name}] [${_this.remote}] preset "${name}" fail to process: ${message}`)})()}onDrain(){this.emit('drain')}write(buffer){if(this._config.is_server){var _ctx=this.ctx;const muxRelay=_ctx.muxRelay,cid=_ctx.cid;muxRelay.encode(buffer,{cid})}}end(){this.close()}close(){const doClose=()=>{if(this._config.is_server){var _ctx2=this.ctx;const muxRelay=_ctx2.muxRelay,cid=_ctx2.cid;const inbound=muxRelay.getInbound();if(inbound){inbound.removeListener('drain',this.onDrain)}muxRelay.destroySubRelay(cid)}if(!this._destroyed){this._destroyed=true;this.emit('close')}};if(this.bufferSize>0){this.once('drain',doClose)}else{doClose()}}}exports.MuxInbound=MuxInbound;class MuxOutbound extends _defs.Outbound{constructor(props){super(props);this._isFirstFrame=true;this.onDrain=this.onDrain.bind(this);if(this._config.is_client){const outbound=this.ctx.muxRelay.getOutbound();outbound.on('drain',this.onDrain)}else{}}get bufferSize(){if(this._config.is_client){const outbound=this.ctx.muxRelay.getOutbound();if(outbound){return outbound.bufferSize}else{return 0}}else{const totalBufferSize=0;return totalBufferSize}}onDrain(){this.emit('drain')}write(buffer){if(this._config.is_client){var _ctx3=this.ctx;const muxRelay=_ctx3.muxRelay,proxyRequest=_ctx3.proxyRequest,cid=_ctx3.cid;if(this._isFirstFrame){this._isFirstFrame=false;muxRelay.encode(buffer,_extends({cid},proxyRequest))}else{muxRelay.encode(buffer,{cid})}}}end(){this.close()}close(){const doClose=()=>{if(this._config.is_client){var _ctx4=this.ctx;const muxRelay=_ctx4.muxRelay,cid=_ctx4.cid;const outbound=muxRelay.getOutbound();if(outbound){outbound.removeListener('drain',this.onDrain)}muxRelay.destroySubRelay(cid)}if(!this._destroyed){this._destroyed=true;this.emit('close')}};if(this.bufferSize>0){this.once('drain',doClose)}else{doClose()}}}exports.MuxOutbound=MuxOutbound;

File diff suppressed because one or more lines are too long

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.TlsOutbound=exports.TlsInbound=undefined;var _tls=require('tls');var _tls2=_interopRequireDefault(_tls);var _tcp=require('./tcp');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 TlsInbound extends _tcp.TcpInbound{get name(){return'tls:inbound'}get bufferSize(){return super.bufferSize-1}}exports.TlsInbound=TlsInbound;class TlsOutbound extends _tcp.TcpOutbound{get name(){return'tls:outbound'}get bufferSize(){return super.bufferSize-1}_connect({host,port}){var _this=this;return _asyncToGenerator(function*(){_utils.logger.info(`[tls:outbound] [${_this.remote}] connecting to tls://${host}:${port}`);return _tls2.default.connect({host,port,ca:[__TLS_CERT__]})})()}}exports.TlsOutbound=TlsOutbound;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.TlsOutbound=exports.TlsInbound=undefined;var _tls=require('tls');var _tls2=_interopRequireDefault(_tls);var _tcp=require('./tcp');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 TlsInbound extends _tcp.TcpInbound{get name(){return'tls:inbound'}get bufferSize(){return super.bufferSize-1}}exports.TlsInbound=TlsInbound;class TlsOutbound extends _tcp.TcpOutbound{get name(){return'tls:outbound'}get bufferSize(){return super.bufferSize-1}_connect({host,port}){var _this=this;return _asyncToGenerator(function*(){_utils.logger.info(`[tls:outbound] [${_this.remote}] connecting to tls://${host}:${port}`);return _tls2.default.connect({host,port,ca:[_this._config.tls_cert]})})()}}exports.TlsOutbound=TlsOutbound;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.UdpOutbound=exports.UdpInbound=undefined;var _dgram=require('dgram');var _dgram2=_interopRequireDefault(_dgram);var _defs=require('./defs');var _constants=require('../constants');var _presets=require('../presets');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class UdpInbound extends _defs.Inbound{constructor(props){super(props);this._socket=null;this._rinfo=null;this.onReceive=this.onReceive.bind(this);this.onPresetFailed=this.onPresetFailed.bind(this);this._socket=this.ctx.socket}onReceive(buffer,rinfo){const type=__IS_CLIENT__?_constants.PIPE_ENCODE:_constants.PIPE_DECODE;this._rinfo=rinfo;this.ctx.pipe.feed(type,buffer)}onBroadcast(action){switch(action.type){case _presets.PRESET_FAILED:this.onPresetFailed(action);break;default:break;}}onPresetFailed(action){var _action$payload=action.payload;const name=_action$payload.name,message=_action$payload.message;_utils.logger.error(`[udp:inbound] [${this.remote}] preset "${name}" fail to process: ${message}`);if(this._outbound){this._outbound.close();this._outbound=null}this.close();this.broadcast({type:_presets.CONNECTION_CLOSED,payload:{host:this.remoteHost,port:this.remotePort}})}write(buffer){var _rinfo=this._rinfo;const address=_rinfo.address,port=_rinfo.port;const onSendError=err=>{if(err){_utils.logger.warn(`[udp:inbound] [${this.remote}]:`,err)}};if(__IS_CLIENT__){const isSs=this.ctx.pipe.presets.some(({name})=>['ss-base'].includes(name));this._socket.send(buffer,port,address,isSs,onSendError)}else{this._socket.send(buffer,port,address,onSendError)}}close(){if(this._socket!==null&&this._socket._handle!==null){this._socket.close();this._socket=null;this.emit('close')}}}exports.UdpInbound=UdpInbound;class UdpOutbound extends _defs.Outbound{constructor(props){super(props);this._socket=null;this._targetHost=null;this._targetPort=null;this.onReceive=this.onReceive.bind(this);this._socket=_dgram2.default.createSocket('udp4');this._socket.on('message',this.onReceive)}onReceive(buffer){const type=__IS_CLIENT__?_constants.PIPE_DECODE:_constants.PIPE_ENCODE;this.ctx.pipe.feed(type,buffer)}onBroadcast(action){switch(action.type){case _presets.CONNECT_TO_REMOTE:if(this._targetHost===null&&this._targetPort===null){this.onConnectToRemote(action)}break;default:break;}}write(buffer){const host=this._targetHost;const port=this._targetPort;if(host===null||port===null){_utils.logger.error('[udp:outbound] fail to send udp data, target address was not initialized.')}else if(port<=0||port>=65536){_utils.logger.error(`[udp:outbound] fail to send udp data, target port "${port}" is invalid.`)}else{this._socket.send(buffer,port,host,err=>{if(err){_utils.logger.warn(`[udp:outbound] [${this.remote}]:`,err)}})}}onConnectToRemote(action){var _action$payload2=action.payload;const host=_action$payload2.host,port=_action$payload2.port,onConnected=_action$payload2.onConnected;if(__IS_CLIENT__){this._targetHost=__SERVER_HOST__;this._targetPort=__SERVER_PORT__}if(__IS_SERVER__){this._targetHost=host;this._targetPort=port;if(typeof onConnected==='function'){onConnected()}}_utils.logger.info(`[udp:outbound] [${this.remote}] request: ${host}:${port}`)}close(){if(this._socket!==null&&this._socket._handle!==null){this._socket.close();this._socket=null;this.emit('close')}}}exports.UdpOutbound=UdpOutbound;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.UdpOutbound=exports.UdpInbound=undefined;var _dgram=require('dgram');var _dgram2=_interopRequireDefault(_dgram);var _defs=require('./defs');var _constants=require('../constants');var _presets=require('../presets');var _utils=require('../utils');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class UdpInbound extends _defs.Inbound{constructor(props){super(props);this._socket=null;this._rinfo=null;this.onReceive=this.onReceive.bind(this);this.onPresetFailed=this.onPresetFailed.bind(this);this._socket=this.ctx.socket}onReceive(buffer,rinfo){const type=this._config.is_client?_constants.PIPE_ENCODE:_constants.PIPE_DECODE;this._rinfo=rinfo;this.ctx.pipe.feed(type,buffer)}onBroadcast(action){switch(action.type){case _presets.PRESET_FAILED:this.onPresetFailed(action);break;default:break;}}onPresetFailed(action){var _action$payload=action.payload;const name=_action$payload.name,message=_action$payload.message;_utils.logger.error(`[udp:inbound] [${this.remote}] preset "${name}" fail to process: ${message}`);if(this._outbound){this._outbound.close();this._outbound=null}this.close();this.broadcast({type:_presets.CONNECTION_CLOSED,payload:{host:this.remoteHost,port:this.remotePort}})}write(buffer){var _rinfo=this._rinfo;const address=_rinfo.address,port=_rinfo.port;const onSendError=err=>{if(err){_utils.logger.warn(`[udp:inbound] [${this.remote}]:`,err)}};if(this._config.is_client){const isSs=this.ctx.pipe.presets.some(({name})=>['ss-base'].includes(name));this._socket.send(buffer,port,address,isSs,onSendError)}else{this._socket.send(buffer,port,address,onSendError)}}close(){if(this._socket!==null&&this._socket._handle!==null){this._socket=null;this.emit('close')}}}exports.UdpInbound=UdpInbound;class UdpOutbound extends _defs.Outbound{constructor(props){super(props);this._socket=null;this._targetHost=null;this._targetPort=null;this.onReceive=this.onReceive.bind(this);this._socket=_dgram2.default.createSocket('udp4');this._socket.on('message',this.onReceive)}onReceive(buffer){const type=this._config.is_client?_constants.PIPE_DECODE:_constants.PIPE_ENCODE;this.ctx.pipe.feed(type,buffer)}onBroadcast(action){switch(action.type){case _presets.CONNECT_TO_REMOTE:if(this._targetHost===null&&this._targetPort===null){this.onConnectToRemote(action)}break;default:break;}}write(buffer){const host=this._targetHost;const port=this._targetPort;if(host===null||port===null){_utils.logger.error('[udp:outbound] fail to send udp data, target address was not initialized.')}else if(port<=0||port>=65536){_utils.logger.error(`[udp:outbound] fail to send udp data, target port "${port}" is invalid.`)}else{this._socket.send(buffer,port,host,err=>{if(err){_utils.logger.warn(`[udp:outbound] [${this.remote}]:`,err)}})}}onConnectToRemote(action){var _action$payload2=action.payload;const host=_action$payload2.host,port=_action$payload2.port,onConnected=_action$payload2.onConnected;if(this._config.is_client){this._targetHost=this._config.server_host;this._targetPort=this._config.server_port}if(this._config.is_server){this._targetHost=host;this._targetPort=port;if(typeof onConnected==='function'){onConnected()}}_utils.logger.info(`[udp:outbound] [${this.remote}] request: ${host}:${port}`)}close(){if(this._socket!==null&&this._socket._handle!==null){this._socket.close();this._socket=null;this.emit('close')}}}exports.UdpOutbound=UdpOutbound;

1
lib/utils/dns-cache.js Normal file

@ -0,0 +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')}}}();let lookup=(()=>{var _ref=_asyncToGenerator(function*(hostname){return new Promise(function(resolve,reject){_dns2.default.lookup(hostname,function(err,address){if(err){reject(err)}else{resolve(address)}})})});return function lookup(_x){return _ref.apply(this,arguments)}})();var _dns=require('dns');var _dns2=_interopRequireDefault(_dns);var _net=require('net');var _net2=_interopRequireDefault(_net);var _logger=require('./logger');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')})}}function now(){return Date.now()}const DNS_DEFAULT_EXPIRE=exports.DNS_DEFAULT_EXPIRE=3600000;class DNSCache{static init(expire){if(typeof expire==='number'&&expire>=0){DNSCache.expire=expire}DNSCache.pool={}}static get(hostname){return _asyncToGenerator(function*(){if(_net2.default.isIP(hostname)){return hostname}let address=null;if(!DNSCache.pool[hostname]){address=yield lookup(hostname);DNSCache._put(hostname,address)}else{var _DNSCache$pool$hostna=_slicedToArray(DNSCache.pool[hostname],2);const addr=_DNSCache$pool$hostna[0],expire=_DNSCache$pool$hostna[1];const _now=now();if(_now>=expire){delete DNSCache.pool[hostname]}_logger.logger.verbose(`[dns-cache] hit: hostname=${hostname} resolved=${addr} ttl=${expire-_now}ms`);address=addr}return address})()}static clear(){DNSCache.pool={}}static _put(hostname,address){if(DNSCache.expire>0){const expire=now()+DNSCache.expire;DNSCache.pool[hostname]=[address,expire]}}}exports.DNSCache=DNSCache;DNSCache.pool={};DNSCache.expire=DNS_DEFAULT_EXPIRE;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _common=require('./common');Object.keys(_common).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _common[key]}})});var _crypto=require('./crypto');Object.keys(_crypto).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _crypto[key]}})});var _date=require('./date');Object.keys(_date).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _date[key]}})});var _string=require('./string');Object.keys(_string).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _string[key]}})});var _validator=require('./validator');Object.keys(_validator).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _validator[key]}})});var _advancedBuffer=require('./advanced-buffer');Object.keys(_advancedBuffer).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _advancedBuffer[key]}})});var _logger=require('./logger');Object.keys(_logger).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _logger[key]}})});
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _common=require('./common');Object.keys(_common).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _common[key]}})});var _crypto=require('./crypto');Object.keys(_crypto).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _crypto[key]}})});var _date=require('./date');Object.keys(_date).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _date[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 _string=require('./string');Object.keys(_string).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _string[key]}})});var _validator=require('./validator');Object.keys(_validator).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _validator[key]}})});var _advancedBuffer=require('./advanced-buffer');Object.keys(_advancedBuffer).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _advancedBuffer[key]}})});var _logger=require('./logger');Object.keys(_logger).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _logger[key]}})});