added udp capacity to the servers file

This commit is contained in:
tigerbot 2017-05-02 17:48:58 -06:00
parent dbd1e23bfa
commit f4de15b14f
1 changed files with 72 additions and 5 deletions

View File

@ -1,10 +1,10 @@
'use strict'; 'use strict';
var serversMap = module.exports._serversMap = {}; var serversMap = module.exports._serversMap = {};
var dgramMap = module.exports._dgramMap = {};
module.exports.addTcpListener = function (port, handler) {
var PromiseA = require('bluebird'); var PromiseA = require('bluebird');
module.exports.addTcpListener = function (port, handler) {
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
}
}; };