forked from coolaj86/telebit.js
		
	
		
			
	
	
		
			106 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | module.exports.assign = function (state, tun, cb) { | ||
|  |   var net = state.net || require('net'); | ||
|  |   var service = tun.service.toLowerCase(); | ||
|  |   var portList = state.services[service]; | ||
|  |   var port; | ||
|  | 
 | ||
|  |   if (!tun.name && !tun.serviceport) { | ||
|  |     console.log('tun:\n',tun); | ||
|  |     //console.warn(tun.data.toString());
 | ||
|  |     cb(new Error("missing routing information for ':tun_id'")); | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   port = portList[tun.name]; | ||
|  |   if (!port) { | ||
|  |     // Check for any wildcard domains, sorted longest to shortest so the one with the
 | ||
|  |     // biggest natural match will be found first.
 | ||
|  |     Object.keys(portList).filter(function (pattern) { | ||
|  |       return pattern[0] === '*' && pattern.length > 1; | ||
|  |     }).sort(function (a, b) { | ||
|  |       return b.length - a.length; | ||
|  |     }).some(function (pattern) { | ||
|  |       var subPiece = pattern.slice(1); | ||
|  |       if (subPiece === tun.name.slice(-subPiece.length)) { | ||
|  |         port = portList[pattern]; | ||
|  |         return true; | ||
|  |       } | ||
|  |     }); | ||
|  |   } | ||
|  |   if (!port) { | ||
|  |     port = portList['*']; | ||
|  |   } | ||
|  | 
 | ||
|  |   var createOpts = { | ||
|  |     port: port | ||
|  |   , host: '127.0.0.1' | ||
|  | 
 | ||
|  |   , servername: tun.name | ||
|  |   , name: tun.name | ||
|  |   , serviceport: tun.serviceport | ||
|  |   , data: tun.data | ||
|  |   , remoteFamily: tun.family | ||
|  |   , remoteAddress: tun.address | ||
|  |   , remotePort: tun.port | ||
|  |   }; | ||
|  |   var conn; | ||
|  | 
 | ||
|  |   function handleNow(socket) { | ||
|  |     var httpServer; | ||
|  |     var tlsServer; | ||
|  |     if ('https' === service) { | ||
|  |       if (!state.greenlock) { | ||
|  |         state.greenlock = require('greenlock').create(state.greenlockConfig); | ||
|  |       } | ||
|  |       httpServer = require('http').createServer(function (req, res) { | ||
|  |         console.log('[hit http/s server]'); | ||
|  |         res.end('Hello, Encrypted Tunnel World!'); | ||
|  |       }); | ||
|  |       tlsServer = require('tls').createServer(state.greenlock.tlsOptions, function (tlsSocket) { | ||
|  |         console.log('[hit tls server]'); | ||
|  |         httpServer.emit('connection', tlsSocket); | ||
|  |       }); | ||
|  |       tlsServer.emit('connection', socket); | ||
|  |     } else { | ||
|  |       httpServer = require('http').createServer(state.greenlock.middleware(function (req, res) { | ||
|  |         console.log('[hit pure http server]'); | ||
|  |         res.end('Hello, Encrypted Tunnel World!'); | ||
|  |       })); | ||
|  |       // http://aj.telebit.cloud/.well-known/acme-challenge/blah
 | ||
|  |       httpServer.emit('connection', socket); | ||
|  |     } | ||
|  |   } | ||
|  |   if ('aj.telebit.cloud' === tun.name) { | ||
|  |     console.log('NEW CONNECTION to AJ\'s telebit could'); | ||
|  |     // For performance it may be better to use socket-pair, needs testing
 | ||
|  |     var socketPair = require('socket-pair'); | ||
|  |     conn = socketPair.create(function (err, other) { | ||
|  |       if (err) { console.error('[Error] ' + err.message); } | ||
|  |       handleNow(other); | ||
|  |       if (createOpts.data) { | ||
|  |         conn.write(createOpts.data); | ||
|  |       } | ||
|  |     }); | ||
|  |     /* | ||
|  |     var streamPair = require('stream-pair'); | ||
|  |     var pair = streamPair.create(); | ||
|  |     conn = pair.other; | ||
|  |     process.nextTick(function () { | ||
|  |       if (createOpts.data) { | ||
|  |         conn.write(createOpts.data); | ||
|  |       } | ||
|  |     }); | ||
|  |     */ | ||
|  |   } else { | ||
|  |     conn = net.createConnection(createOpts, function () { | ||
|  |       // this will happen before 'data' or 'readable' is triggered
 | ||
|  |       // We use the data from the createOpts object so that the createConnection function has
 | ||
|  |       // the oppurtunity of removing/changing it if it wants/needs to handle it differently.
 | ||
|  |       if (createOpts.data) { | ||
|  |         conn.write(createOpts.data); | ||
|  |       } | ||
|  |     }); | ||
|  |   } | ||
|  |   cb(null, conn); | ||
|  | }; |