mailiverse/deploy/websockets/proxy-tcp.js

84 lines
2.3 KiB
JavaScript
Raw Normal View History

2013-08-09 17:31:37 -04:00
var WebSocket = require('ws');
var WebSocketServer = WebSocket.Server;
var http = require('http');
var net = require('net');
var server =
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Not implemented');
});
server.listen(8081, "0.0.0.0", null);
closeServer = function() { self._server.close(); };
var incrementingId = 0;
function createWebSocket(path, ws) {
console.log('connection');
ws.xStringVal = (new Date()) + ":" + incrementingId++;
ws.xString = function() { return ws.xStringVal; };
ws.proxy = net.createConnection(path);
ws.proxy.buffer = "";
ws.proxy.connected = false;
ws.proxy.outQueue = [];
ws.proxy.inQueue = [];
ws.proxy.sendQueue = function() {
if (!this.connected) {
while (this.outQueue.length > 0)
{
var message = ws.proxy.outQueue.shift();
console.log(ws.xString() + ' C -> ' + message);
ws.proxy.write(message.trim() + "\r\n");
}
}
};
ws.proxy.receiveQueue = function() {
while (this.inQueue.length > 0)
{
var message = ws.proxy.inQueue.shift();
console.log(ws.xString() + ' <- S ' + message);
ws.send(message.trim() + "\r\n");
}
};
ws.proxy.queueAndReceive = function() {
var retPos = -1;
while ((retPos=this.buffer.indexOf("\n"))!=-1)
{
var next = this.buffer.substring(0, retPos);
this.buffer = this.buffer.substring(retPos+1);
this.inQueue.push(next.trim());
}
this.receiveQueue();
};
ws.proxy.on('data', function(message) {
console.log(ws.xString() + ' <- Q ' + message);
this.buffer += message;
ws.proxy.queueAndReceive();
});
ws.proxy.on('close', function() { console.log(ws.xString() + ' close S'); ws.close() });
ws.proxy.on('open', function() { ws.proxy.connected = true; ws.proxy.sendQueue(); });
ws.on('message', function(message) {
console.log(ws.xString() + ' Q ->', message);
ws.proxy.outQueue.push(message);
ws.proxy.sendQueue();
});
ws.on('close', function() { console.log(ws.xString() + ' C close'); ws.proxy.end(); });
}
wss = new WebSocketServer({server:server, path:"/Mailiverse/KeyServer"});
wss.on('connection', function(ws) { createWebSocket(7000, ws); });
wss = new WebSocketServer({server:server, path:"/Mailiverse/MailServer"});
wss.on('connection', function(ws) { createWebSocket(7001, ws); });