added udp capacity to the servers file
This commit is contained in:
		
							父節點
							
								
									dbd1e23bfa
								
							
						
					
					
						當前提交
						f4de15b14f
					
				@ -1,10 +1,10 @@
 | 
				
			|||||||
'use strict';
 | 
					'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var serversMap = module.exports._serversMap = {};
 | 
					var serversMap = module.exports._serversMap = {};
 | 
				
			||||||
 | 
					var dgramMap = module.exports._dgramMap = {};
 | 
				
			||||||
 | 
					var PromiseA = require('bluebird');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports.addTcpListener = function (port, handler) {
 | 
					module.exports.addTcpListener = function (port, handler) {
 | 
				
			||||||
  var PromiseA = require('bluebird');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return new PromiseA(function (resolve, reject) {
 | 
					  return new PromiseA(function (resolve, reject) {
 | 
				
			||||||
    var stat = serversMap[port];
 | 
					    var stat = serversMap[port];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -34,7 +34,7 @@ module.exports.addTcpListener = function (port, handler) {
 | 
				
			|||||||
    stat = serversMap[port] = {
 | 
					    stat = serversMap[port] = {
 | 
				
			||||||
      server: server
 | 
					      server: server
 | 
				
			||||||
    , handler: handler
 | 
					    , handler: handler
 | 
				
			||||||
    , _closing: false
 | 
					    , _closing: null
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Add .destroy so we can close all open connections. Better if added before listen
 | 
					    // Add .destroy so we can close all open connections. Better if added before listen
 | 
				
			||||||
@ -69,8 +69,6 @@ module.exports.addTcpListener = function (port, handler) {
 | 
				
			|||||||
  });
 | 
					  });
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
module.exports.closeTcpListener = function (port) {
 | 
					module.exports.closeTcpListener = function (port) {
 | 
				
			||||||
  var PromiseA = require('bluebird');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return new PromiseA(function (resolve) {
 | 
					  return new PromiseA(function (resolve) {
 | 
				
			||||||
    var stat = serversMap[port];
 | 
					    var stat = serversMap[port];
 | 
				
			||||||
    if (!stat) {
 | 
					    if (!stat) {
 | 
				
			||||||
@ -101,10 +99,79 @@ module.exports.destroyTcpListener = function (port) {
 | 
				
			|||||||
  stat = null;
 | 
					  stat = null;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports.addUdpListener = function (port, handler) {
 | 
				
			||||||
 | 
					  return new PromiseA(function (resolve, reject) {
 | 
				
			||||||
 | 
					    var stat = dgramMap[port];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (stat) {
 | 
				
			||||||
 | 
					      // we'll replace the current listener
 | 
				
			||||||
 | 
					      stat.handler = handler;
 | 
				
			||||||
 | 
					      resolve();
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var dgram = require('dgram');
 | 
				
			||||||
 | 
					    var server = dgram.createSocket('udp4');
 | 
				
			||||||
 | 
					    var resolved = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    stat = dgramMap[port] = {
 | 
				
			||||||
 | 
					      server: server
 | 
				
			||||||
 | 
					    , handler: handler
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    server.on('message', function (msg, rinfo) {
 | 
				
			||||||
 | 
					      msg._size = rinfo.size;
 | 
				
			||||||
 | 
					      msg._remoteFamily = rinfo.family;
 | 
				
			||||||
 | 
					      msg._remoteAddress = rinfo.address;
 | 
				
			||||||
 | 
					      msg._remotePort = rinfo.port;
 | 
				
			||||||
 | 
					      msg._port = port;
 | 
				
			||||||
 | 
					      stat.handler(msg);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    server.on('error', function (err) {
 | 
				
			||||||
 | 
					      if (!resolved) {
 | 
				
			||||||
 | 
					        delete dgramMap[port];
 | 
				
			||||||
 | 
					        reject(err);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else if (stat.handler.onError) {
 | 
				
			||||||
 | 
					        stat.handler.onError(err);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else {
 | 
				
			||||||
 | 
					        throw err;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    server.on('close', function () {
 | 
				
			||||||
 | 
					      delete dgramMap[port];
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    server.bind(port, function () {
 | 
				
			||||||
 | 
					      resolved = true;
 | 
				
			||||||
 | 
					      resolve();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					module.exports.closeUdpListener = function (port) {
 | 
				
			||||||
 | 
					  var stat = dgramMap[port];
 | 
				
			||||||
 | 
					  if (!stat) {
 | 
				
			||||||
 | 
					    return PromiseA.resolve();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return new PromiseA(function (resolve) {
 | 
				
			||||||
 | 
					    stat.server.once('close', resolve);
 | 
				
			||||||
 | 
					    stat.server.close();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports.listeners = {
 | 
					module.exports.listeners = {
 | 
				
			||||||
  tcp: {
 | 
					  tcp: {
 | 
				
			||||||
    add: module.exports.addTcpListener
 | 
					    add: module.exports.addTcpListener
 | 
				
			||||||
  , close: module.exports.closeTcpListener
 | 
					  , close: module.exports.closeTcpListener
 | 
				
			||||||
  , destroy: module.exports.destroyTcpListener
 | 
					  , destroy: module.exports.destroyTcpListener
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					, udp: {
 | 
				
			||||||
 | 
					    add: module.exports.addUdpListener
 | 
				
			||||||
 | 
					  , close: module.exports.closeUdpListener
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user