chore(lib): update

This commit is contained in:
Micooz 2017-06-10 16:23:51 +08:00
parent 7a500c3b9c
commit 32cffc19c7
11 changed files with 11 additions and 9 deletions

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Balancer=undefined;var _net=require('net');var _net2=_interopRequireDefault(_net);var _winston=require('winston');var _winston2=_interopRequireDefault(_winston);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const QUERY_INTERVAL=12e4;const now=()=>new Date().getTime();class Balancer{static start(servers,interval=QUERY_INTERVAL){if(servers.length<1){throw Error('servers cannot be empty')}this._servers=servers;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}}return this._servers[index]}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.map((server,i)=>{const sstr=`${server.host}:${server.port}`;_winston2.default.verbose(`[balancer] querying ${sstr}`);const startTime=now();const socket=_net2.default.connect({host:server.host,port:server.port},()=>{const ping=now()-startTime;this._pings[i]=ping;_winston2.default.verbose(`[balancer] ${sstr} = ${ping}ms`);socket.end()});socket.on('error',()=>{this._pings[i]=-1;_winston2.default.warn(`[balancer] ${sstr} lost connection`)})})}}exports.Balancer=Balancer;Balancer._servers=[];Balancer._pings=[];Balancer._timer=null;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Balancer=undefined;var _net=require('net');var _net2=_interopRequireDefault(_net);var _logger=require('./logger');var _logger2=_interopRequireDefault(_logger);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const QUERY_INTERVAL=12e4;const now=()=>new Date().getTime();class Balancer{static start(servers,interval=QUERY_INTERVAL){if(servers.length<1){throw Error('servers cannot be empty')}this._servers=servers;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}}return this._servers[index]}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.map((server,i)=>{const sstr=`${server.host}:${server.port}`;_logger2.default.verbose(`[balancer] querying ${sstr}`);const startTime=now();const socket=_net2.default.connect({host:server.host,port:server.port},()=>{const ping=now()-startTime;this._pings[i]=ping;_logger2.default.verbose(`[balancer] ${sstr} = ${ping}ms`);socket.end()});socket.on('error',()=>{this._pings[i]=-1;_logger2.default.warn(`[balancer] ${sstr} lost connection`)})})}}exports.Balancer=Balancer;Balancer._servers=[];Balancer._pings=[];Balancer._timer=null;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.ClientProxy=undefined;var _blinksocksUtils=require('blinksocks-utils');var _socks=require('../proxies/socks5');var _socks2=require('../proxies/socks4');var _http=require('../proxies/http');var _common=require('../proxies/common');class ClientProxy{constructor(props){this._socksTcpReady=false;this._socksUdpReady=false;this._httpReady=false;this.onHandshakeDone=props.onHandshakeDone}isDone(){return[this._socksTcpReady,this._socksUdpReady,this._httpReady].some(v=>!!v)}makeHandshake(socket,buffer){this._trySocksHandshake(socket,buffer);if(!this.isDone()){this._tryHttpHandshake(socket,buffer)}}_trySocksHandshake(socket,buffer){if(!this.isDone()){this._trySocks5Handshake(socket,buffer)}if(!this.isDone()){this._trySocks4Handshake(socket,buffer)}}_trySocks4Handshake(socket,buffer){const request=_socks2.RequestMessage.parse(buffer);if(request!==null){const CMD=request.CMD,DSTIP=request.DSTIP,DSTADDR=request.DSTADDR,DSTPORT=request.DSTPORT;if(CMD===_common.REQUEST_COMMAND_CONNECT){const addr={type:DSTADDR.length>0?_common.ATYP_DOMAIN:_common.ATYP_V4,host:DSTADDR.length>0?DSTADDR:DSTIP,port:DSTPORT};this.onHandshakeDone(addr,()=>{const message=new _socks2.ReplyMessage({CMD:_common.REPLY_GRANTED});socket.write(message.toBuffer());this._socksTcpReady=true})}}}_trySocks5Handshake(socket,buffer){const identifier=_socks.IdentifierMessage.parse(buffer);if(identifier!==null){const message=new _socks.SelectMessage;socket.write(message.toBuffer());return}const request=_socks.RequestMessage.parse(buffer);if(request!==null){const type=request.CMD;switch(type){case _common.REQUEST_COMMAND_UDP:case _common.REQUEST_COMMAND_CONNECT:{const addr={type:request.ATYP,host:request.DSTADDR,port:request.DSTPORT};this.onHandshakeDone(addr,()=>{const message=new _socks.ReplyMessage({REP:_common.REPLY_SUCCEEDED});socket.write(message.toBuffer());if(type===_common.REQUEST_COMMAND_CONNECT){this._socksTcpReady=true}else{this._socksUdpReady=true}});break}default:{const message=new _socks.ReplyMessage({REP:_common.REPLY_COMMAND_NOT_SUPPORTED});socket.write(message.toBuffer());break}}}}_tryHttpHandshake(socket,buffer){const request=_http.HttpRequestMessage.parse(buffer);if(request!==null){const METHOD=request.METHOD,HOST=request.HOST;const addr=(0,_blinksocksUtils.parseURI)(HOST.toString());this.onHandshakeDone(addr,onForward=>{if(METHOD.toString()==='CONNECT'){const message=new _http.ConnectReplyMessage;socket.write(message.toBuffer())}else{onForward(buffer)}this._httpReady=true})}}}exports.ClientProxy=ClientProxy;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.ClientProxy=undefined;var _ip=require('ip');var _ip2=_interopRequireDefault(_ip);var _blinksocksUtils=require('blinksocks-utils');var _socks=require('../proxies/socks5');var _socks2=require('../proxies/socks4');var _http=require('../proxies/http');var _common=require('../proxies/common');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}class ClientProxy{constructor(props){this._socksTcpReady=false;this._socksUdpReady=false;this._httpReady=false;this.onHandshakeDone=props.onHandshakeDone}isDone(){return[this._socksTcpReady,this._socksUdpReady,this._httpReady].some(v=>!!v)}makeHandshake(socket,buffer){this._trySocksHandshake(socket,buffer);if(!this.isDone()){this._tryHttpHandshake(socket,buffer)}}_trySocksHandshake(socket,buffer){if(!this.isDone()){this._trySocks5Handshake(socket,buffer)}if(!this.isDone()){this._trySocks4Handshake(socket,buffer)}}_trySocks4Handshake(socket,buffer){const request=_socks2.RequestMessage.parse(buffer);if(request!==null){const CMD=request.CMD,DSTIP=request.DSTIP,DSTADDR=request.DSTADDR,DSTPORT=request.DSTPORT;if(CMD===_common.REQUEST_COMMAND_CONNECT){const addr={type:DSTADDR.length>0?_common.ATYP_DOMAIN:_common.ATYP_V4,host:DSTADDR.length>0?DSTADDR:DSTIP,port:DSTPORT};if(addr.type!==_common.ATYP_DOMAIN){addr.host=_ip2.default.toString(addr.host)}this.onHandshakeDone(addr,()=>{const message=new _socks2.ReplyMessage({CMD:_common.REPLY_GRANTED});socket.write(message.toBuffer());this._socksTcpReady=true})}}}_trySocks5Handshake(socket,buffer){const identifier=_socks.IdentifierMessage.parse(buffer);if(identifier!==null){const message=new _socks.SelectMessage;socket.write(message.toBuffer());return}const request=_socks.RequestMessage.parse(buffer);if(request!==null){const type=request.CMD;switch(type){case _common.REQUEST_COMMAND_UDP:case _common.REQUEST_COMMAND_CONNECT:{const addr={type:request.ATYP,host:request.DSTADDR,port:request.DSTPORT};if(addr.type!==_common.ATYP_DOMAIN){addr.host=_ip2.default.toString(addr.host)}this.onHandshakeDone(addr,()=>{const message=new _socks.ReplyMessage({REP:_common.REPLY_SUCCEEDED});socket.write(message.toBuffer());if(type===_common.REQUEST_COMMAND_CONNECT){this._socksTcpReady=true}else{this._socksUdpReady=true}});break}default:{const message=new _socks.ReplyMessage({REP:_common.REPLY_COMMAND_NOT_SUPPORTED});socket.write(message.toBuffer());break}}}}_tryHttpHandshake(socket,buffer){const request=_http.HttpRequestMessage.parse(buffer);if(request!==null){const METHOD=request.METHOD,HOST=request.HOST;const addr=(0,_blinksocksUtils.parseURI)(HOST.toString());this.onHandshakeDone(addr,onForward=>{if(METHOD.toString()==='CONNECT'){const message=new _http.ConnectReplyMessage;socket.write(message.toBuffer())}else{onForward(buffer)}this._httpReady=true})}}}exports.ClientProxy=ClientProxy;

File diff suppressed because one or more lines are too long

1
lib/core/constants.js Normal file

@ -0,0 +1 @@
'use strict';var _os=require('os');var _os2=_interopRequireDefault(_os);var _path=require('path');var _path2=_interopRequireDefault(_path);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const HOME_DIR=_os2.default.homedir();const BLINKSOCKS_DIR=_path2.default.join(HOME_DIR,'.blinksocks');const LOG_DIR=_path2.default.join(BLINKSOCKS_DIR,'logs');const LOG_FILE_PATH=_path2.default.join(LOG_DIR,typeof process.env.RUN_AS==='undefined'?'blinksocks.log':{'server':'blinksocks-server.log','client':'blinksocks-client.log'}[process.env.RUN_AS]);const LOG_FILE_MAX_SIZE=2*1024*1024;const DEFAULT_LOG_LEVEL='info';module.exports={HOME_DIR,BLINKSOCKS_DIR,LOG_DIR,LOG_FILE_PATH,LOG_FILE_MAX_SIZE,DEFAULT_LOG_LEVEL};

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Hub=undefined;var _net=require('net');var _net2=_interopRequireDefault(_net);var _winston=require('winston');var _winston2=_interopRequireDefault(_winston);var _config=require('./config');var _socket=require('./socket');var _profile=require('./profile');var _balancer=require('./balancer');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const nextId=function(){let i=0;return()=>{if(i>Number.MAX_SAFE_INTEGER-1){i=0}return++i}}();class Hub{constructor(config){this._hub=null;this._sockets=[];this._isClosed=false;if(typeof config!=='undefined'){_config.Config.init(config)}this._hub=_net2.default.createServer();this._hub.on('close',this.onClose.bind(this));this._hub.on('connection',this.onConnect.bind(this));this.onSocketClose=this.onSocketClose.bind(this)}onClose(){if(!this._isClosed){console.info('==> [hub] shutdown');if(__IS_CLIENT__){_balancer.Balancer.destroy();console.info('==> [balancer] stopped')}if(__PROFILE__){console.info('==> [profile] saving...');_profile.Profile.save();_profile.Profile.stop();console.info('==> [profile] stopped')}this._isClosed=true;this._sockets.forEach(socket=>socket.destroy());this._sockets=[]}}onSocketClose(socket){this._sockets=this._sockets.filter(({id})=>id!==socket.id);_profile.Profile.connections=this._sockets.length}onConnect(socket){const id=nextId();const instance=new _socket.Socket({id,socket,onClose:this.onSocketClose});this._sockets.push(instance);_winston2.default.info(`[hub] [${socket.remoteAddress}:${socket.remotePort}] connected`);_profile.Profile.connections+=1}run(callback){const options={host:__LOCAL_HOST__,port:__LOCAL_PORT__};this._hub.listen(options,()=>{console.info('==> [hub] use configuration:');console.info(JSON.stringify(__ALL_CONFIG__,null,' '));console.info(`==> [hub] is running as: ${__IS_SERVER__?'Server':'Client'}`);console.info('==> [hub] is listening on:',this._hub.address());if(__IS_CLIENT__){console.info('==> [balancer] started');_balancer.Balancer.start(__SERVERS__)}if(__PROFILE__){console.info('==> [profile] started');_profile.Profile.start()}if(typeof callback==='function'){callback()}})}terminate(){this._hub.close();this.onClose()}}exports.Hub=Hub;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Hub=undefined;var _net=require('net');var _net2=_interopRequireDefault(_net);var _logger=require('./logger');var _logger2=_interopRequireDefault(_logger);var _config=require('./config');var _socket=require('./socket');var _profile=require('./profile');var _balancer=require('./balancer');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const nextId=function(){let i=0;return()=>{if(i>Number.MAX_SAFE_INTEGER-1){i=0}return++i}}();class Hub{constructor(config){this._hub=null;this._sockets=[];this._isClosed=false;if(typeof config!=='undefined'){_config.Config.init(config)}_logger2.default.level=__LOG_LEVEL__;this._hub=_net2.default.createServer();this._hub.on('close',this.onClose.bind(this));this._hub.on('connection',this.onConnect.bind(this));this.onSocketClose=this.onSocketClose.bind(this)}onClose(){if(!this._isClosed){_logger2.default.info('==> [hub] shutdown');if(__IS_CLIENT__){_balancer.Balancer.destroy();_logger2.default.info('==> [balancer] stopped')}if(__PROFILE__){_logger2.default.info('==> [profile] saving...');_profile.Profile.save();_profile.Profile.stop();_logger2.default.info('==> [profile] stopped')}this._isClosed=true;this._sockets.forEach(socket=>socket.destroy());this._sockets=[]}}onSocketClose(socket){this._sockets=this._sockets.filter(({id})=>id!==socket.id);_profile.Profile.connections=this._sockets.length}onConnect(socket){const id=nextId();const instance=new _socket.Socket({id,socket,onClose:this.onSocketClose});this._sockets.push(instance);_logger2.default.info(`[hub] [${socket.remoteAddress}:${socket.remotePort}] connected`);_profile.Profile.connections+=1}run(callback){const options={host:__LOCAL_HOST__,port:__LOCAL_PORT__};this._hub.listen(options,()=>{_logger2.default.info(`==> [hub] use configuration: ${JSON.stringify(__ALL_CONFIG__)}`);_logger2.default.info(`==> [hub] running as: ${__IS_SERVER__?'Server':'Client'}`);_logger2.default.info(`==> [hub] listening on: ${JSON.stringify(this._hub.address())}`);if(__IS_CLIENT__){_logger2.default.info('==> [balancer] started');_balancer.Balancer.start(__SERVERS__)}if(__PROFILE__){_logger2.default.info('==> [profile] started');_profile.Profile.start()}if(typeof callback==='function'){callback()}})}terminate(){this._hub.close();this.onClose()}}exports.Hub=Hub;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _balancer=require('./balancer');Object.keys(_balancer).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _balancer[key]}})});var _config=require('./config');Object.keys(_config).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _config[key]}})});var _hub=require('./hub');Object.keys(_hub).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _hub[key]}})});
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _balancer=require('./balancer');Object.keys(_balancer).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _balancer[key]}})});var _config=require('./config');Object.keys(_config).forEach(function(key){if(key==='default'||key==='__esModule')return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return _config[key]}})});var _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 _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]}})});

1
lib/core/logger.js Normal file

@ -0,0 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.logger=undefined;var _winston=require('winston');var _winston2=_interopRequireDefault(_winston);var _constants=require('./constants');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const instance=new _winston2.default.Logger({transports:[new _winston2.default.transports.Console({colorize:true,prettyPrint:true}),new _winston2.default.transports.File({filename:_constants.LOG_FILE_PATH,maxsize:_constants.LOG_FILE_MAX_SIZE,silent:['test','debug'].includes(process.env.NODE_ENV)})]});const logger=exports.logger=instance;exports.default=instance;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Middleware=exports.MIDDLEWARE_DIRECTION_DOWNWARD=exports.MIDDLEWARE_DIRECTION_UPWARD=undefined;exports.createMiddleware=createMiddleware;var _events=require('events');var _events2=_interopRequireDefault(_events);var _winston=require('winston');var _winston2=_interopRequireDefault(_winston);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const MIDDLEWARE_DIRECTION_UPWARD=exports.MIDDLEWARE_DIRECTION_UPWARD=1;const MIDDLEWARE_DIRECTION_DOWNWARD=exports.MIDDLEWARE_DIRECTION_DOWNWARD=-1;class Middleware extends _events2.default{constructor(impl){super();this._broadcast=null;this._impl=null;this._impl=impl}subscribe(receiver){this._broadcast=receiver}onNotified(action){return this._impl.onNotified(action)}write(direction,{buffer,direct,fail}){const type={[MIDDLEWARE_DIRECTION_UPWARD]:'Out',[MIDDLEWARE_DIRECTION_DOWNWARD]:'In'}[direction];const broadcast=this._broadcast;const next=buf=>{const args={buffer:buf,next:processed=>this.emit(`next_${direction}`,processed),broadcast,direct,fail};const ret=__IS_CLIENT__?this._impl[`client${type}`](args):this._impl[`server${type}`](args);if(typeof ret!=='undefined'){args.next(ret)}};const r=this._impl[`before${type}`]({buffer,next,broadcast,direct,fail});if(typeof r!=='undefined'){next(r)}}}exports.Middleware=Middleware;function createMiddleware(name,params={}){try{const ImplClass=require(`../presets/${name}`).default;const impl=new ImplClass(params);checkMiddleware(ImplClass.name,impl);return new Middleware(impl)}catch(err){_winston2.default.error(err.message);process.exit(-1)}return null}function checkMiddleware(name,impl){const requiredMethods=['clientOut','serverIn','serverOut','clientIn'];if(requiredMethods.some(method=>typeof impl[method]!=='function')){throw Error(`all methods [${requiredMethods.toString()}] in ${name} must be implemented`)}return true}
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Middleware=exports.MIDDLEWARE_DIRECTION_DOWNWARD=exports.MIDDLEWARE_DIRECTION_UPWARD=undefined;exports.createMiddleware=createMiddleware;var _events=require('events');var _events2=_interopRequireDefault(_events);var _logger=require('./logger');var _logger2=_interopRequireDefault(_logger);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}const MIDDLEWARE_DIRECTION_UPWARD=exports.MIDDLEWARE_DIRECTION_UPWARD=1;const MIDDLEWARE_DIRECTION_DOWNWARD=exports.MIDDLEWARE_DIRECTION_DOWNWARD=-1;class Middleware extends _events2.default{constructor(impl){super();this._broadcast=null;this._impl=null;this._impl=impl}subscribe(receiver){this._broadcast=receiver}onNotified(action){return this._impl.onNotified(action)}write(direction,{buffer,direct,fail}){const type={[MIDDLEWARE_DIRECTION_UPWARD]:'Out',[MIDDLEWARE_DIRECTION_DOWNWARD]:'In'}[direction];const broadcast=this._broadcast;const next=buf=>{const args={buffer:buf,next:processed=>this.emit(`next_${direction}`,processed),broadcast,direct,fail};const ret=__IS_CLIENT__?this._impl[`client${type}`](args):this._impl[`server${type}`](args);if(typeof ret!=='undefined'){args.next(ret)}};const r=this._impl[`before${type}`]({buffer,next,broadcast,direct,fail});if(typeof r!=='undefined'){next(r)}}}exports.Middleware=Middleware;function createMiddleware(name,params={}){try{const ImplClass=require(`../presets/${name}`).default;const impl=new ImplClass(params);checkMiddleware(ImplClass.name,impl);return new Middleware(impl)}catch(err){_logger2.default.error(err.message);process.exit(-1)}return null}function checkMiddleware(name,impl){const requiredMethods=['clientOut','serverIn','serverOut','clientIn'];if(requiredMethods.some(method=>typeof impl[method]!=='function')){throw Error(`all methods [${requiredMethods.toString()}] in ${name} must be implemented`)}return true}

File diff suppressed because one or more lines are too long

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _ip=require('ip');var _ip2=_interopRequireDefault(_ip);var _blinksocksUtils=require('blinksocks-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;class SSBasePreset extends _defs.IPreset{constructor(addr){super();this._isHandshakeDone=false;this._isAddressReceived=false;this._atyp=ATYP_V4;this._addr=null;this._port=null;this._staging=Buffer.alloc(0);if(__IS_CLIENT__){const type=addr.type,host=addr.host,port=addr.port;this._atyp=type;this._addr=host;this._port=port}}clientOut({buffer}){if(!this._isHandshakeDone){this._isHandshakeDone=true;return Buffer.from([this._atyp,...(this._atyp===ATYP_DOMAIN?(0,_blinksocksUtils.numberToBuffer)(this._addr.length,1):[]),...this._addr,...this._port,...buffer])}else{return buffer}}serverIn({buffer,next,broadcast,fail}){if(!this._isHandshakeDone){if(this._isAddressReceived){this._staging=Buffer.concat([this._staging,buffer]);return}if(buffer.length<7){fail(`invalid length: ${buffer.length}`);return}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){fail(`invalid length: ${buffer.length}`);return}addr=_ip2.default.toString(buffer.slice(1,17));port=buffer.slice(16,18).readUInt16BE(0);offset+=16;break;case ATYP_DOMAIN:const domainLen=buffer[1];if(buffer.length<domainLen+4){fail(`invalid length: ${buffer.length}`);return}addr=buffer.slice(2,2+domainLen).toString();if(!(0,_blinksocksUtils.isValidHostname)(addr)){fail(`addr=${addr} is an invalid hostname`);return}port=buffer.slice(2+domainLen,4+domainLen).readUInt16BE(0);offset+=domainLen+1;break;default:fail(`invalid atyp: ${atyp}`);return;}const data=buffer.slice(offset);broadcast({type:_defs.SOCKET_CONNECT_TO_DST,payload:{targetAddress:{type:atyp,host:addr,port},onConnected:()=>{next(Buffer.concat([this._staging,data]));this._isHandshakeDone=true;this._staging=null}}});this._isAddressReceived=true}else{return buffer}}}exports.default=SSBasePreset;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _ip=require('ip');var _ip2=_interopRequireDefault(_ip);var _blinksocksUtils=require('blinksocks-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;class SSBasePreset extends _defs.IPreset{constructor(addr){super();this._isHandshakeDone=false;this._isAddressReceived=false;this._atyp=ATYP_V4;this._host=null;this._port=null;this._staging=Buffer.alloc(0);if(__IS_CLIENT__){const type=addr.type,host=addr.host,port=addr.port;this._atyp=type;this._port=port;this._host=host;if(!(host instanceof Buffer)){if(type===ATYP_DOMAIN){this._host=Buffer.from(host)}else{this._host=_ip2.default.toBuffer(host)}}}}clientOut({buffer}){if(!this._isHandshakeDone){this._isHandshakeDone=true;return Buffer.from([this._atyp,...(this._atyp===ATYP_DOMAIN?(0,_blinksocksUtils.numberToBuffer)(this._host.length,1):[]),...this._host,...this._port,...buffer])}else{return buffer}}serverIn({buffer,next,broadcast,fail}){if(!this._isHandshakeDone){if(this._isAddressReceived){this._staging=Buffer.concat([this._staging,buffer]);return}if(buffer.length<7){fail(`invalid length: ${buffer.length}`);return}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){fail(`invalid length: ${buffer.length}`);return}addr=_ip2.default.toString(buffer.slice(1,17));port=buffer.slice(16,18).readUInt16BE(0);offset+=16;break;case ATYP_DOMAIN:const domainLen=buffer[1];if(buffer.length<domainLen+4){fail(`invalid length: ${buffer.length}`);return}addr=buffer.slice(2,2+domainLen).toString();if(!(0,_blinksocksUtils.isValidHostname)(addr)){fail(`addr=${addr} is an invalid hostname`);return}port=buffer.slice(2+domainLen,4+domainLen).readUInt16BE(0);offset+=domainLen+1;break;default:fail(`invalid atyp: ${atyp}`);return;}const data=buffer.slice(offset);broadcast({type:_defs.SOCKET_CONNECT_TO_DST,payload:{targetAddress:{type:atyp,host:addr,port},onConnected:()=>{next(Buffer.concat([this._staging,data]));this._isHandshakeDone=true;this._staging=null}}});this._isAddressReceived=true}else{return buffer}}}exports.default=SSBasePreset;

@ -1 +1 @@
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.RequestMessage=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 _common=require('../common');class RequestMessage extends _common.Message{constructor(options){super();const fields=_extends({VER:_common.SOCKS_VERSION_V4,CMD:_common.REQUEST_COMMAND_CONNECT,DSTPORT:[_common.NOOP,_common.NOOP],DSTIP:[_common.NOOP,_common.NOOP,_common.NOOP,_common.NOOP],USERID:[_common.NOOP],DSTADDR:[_common.NOOP]},options);this.VER=fields.VER;this.CMD=fields.CMD;this.DSTPORT=fields.DSTPORT;this.DSTIP=fields.DSTIP;this.USERID=fields.USERID;this.DSTADDR=fields.DSTADDR}static parse(buffer){if(buffer.length<9){return null}if(buffer[0]!==_common.SOCKS_VERSION_V4){return null}const reqTypes=[_common.REQUEST_COMMAND_CONNECT,_common.REQUEST_COMMAND_BIND];if(!reqTypes.includes(buffer[1])){return null}if(buffer[buffer.length-1]!==_common.NOOP){return null}const DSTIP=buffer.slice(4,8);let USERID=[];let DSTADDR=[];if(DSTIP[0]===_common.NOOP&&DSTIP[1]===_common.NOOP&&DSTIP[2]===_common.NOOP&&DSTIP[3]!==_common.NOOP){const rest=buffer.slice(8);const fields=[];let field=[];var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=rest[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){const byte=_step.value;if(byte===_common.NOOP){fields.push(field);field=[]}else{field.push(byte)}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}if(fields.length!==2||fields[1].length<1){return null}USERID=fields[0];DSTADDR=fields[1]}return new RequestMessage({VER:buffer[0],CMD:buffer[1],DSTPORT:buffer.slice(2,4),DSTIP,USERID,DSTADDR})}}exports.RequestMessage=RequestMessage;
'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.RequestMessage=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 _common=require('../common');class RequestMessage extends _common.Message{constructor(options){super();const fields=_extends({VER:_common.SOCKS_VERSION_V4,CMD:_common.REQUEST_COMMAND_CONNECT,DSTPORT:[_common.NOOP,_common.NOOP],DSTIP:[_common.NOOP,_common.NOOP,_common.NOOP,_common.NOOP],USERID:[_common.NOOP],DSTADDR:[_common.NOOP]},options);this.VER=fields.VER;this.CMD=fields.CMD;this.DSTPORT=fields.DSTPORT;this.DSTIP=fields.DSTIP;this.USERID=fields.USERID;this.DSTADDR=fields.DSTADDR}static parse(buffer){if(buffer.length<9){return null}if(buffer[0]!==_common.SOCKS_VERSION_V4){return null}const reqTypes=[_common.REQUEST_COMMAND_CONNECT,_common.REQUEST_COMMAND_BIND];if(!reqTypes.includes(buffer[1])){return null}if(buffer[buffer.length-1]!==_common.NOOP){return null}const DSTIP=buffer.slice(4,8);let USERID=[];let DSTADDR=[];if(DSTIP[0]===_common.NOOP&&DSTIP[1]===_common.NOOP&&DSTIP[2]===_common.NOOP&&DSTIP[3]!==_common.NOOP){const rest=buffer.slice(8);const fields=[];let field=[];var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=rest[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){const byte=_step.value;if(byte===_common.NOOP){fields.push(field);field=[]}else{field.push(byte)}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}if(fields.length!==2||fields[1].length<1){return null}USERID=fields[0];DSTADDR=Buffer.from(fields[1])}return new RequestMessage({VER:buffer[0],CMD:buffer[1],DSTPORT:buffer.slice(2,4),DSTIP,USERID,DSTADDR})}}exports.RequestMessage=RequestMessage;