The idea would be more like:
var tcp = require("tcp");
var dns = require('dns');
var sys = require('sys');
var server = tcp.createServer(function (socket) {
socket.setEncoding("utf8");
socket.addListener("connect", function () {
socket.wait = true;
socket.buffer = [];
socket.send("hello\r\n");
var reverse = dns.reverse(socket.remoteAddress);
reverse.addCallback(function(domains, ttl, cname)
{
socket.wait = false;
socket.address = JSON.stringify(domains);
socket.send("your address: " + JSON.stringify(domains) + "\r\n");
if (socket.buffer.length > 0)
{
// trigger a "receive" events with the buffer data
for(var i = 0; i < socket.buffer.length; i++)
{
// trigger "receive" event with data = socket.buffer[i]
}
// empty the buffer
socket.buffer = [];
}
});
reverse.addErrback(function()
{
socket.wait = false;
socket.send("error reversing address\r\n");
});
});
socket.addListener("receive", function (data) {
if (socket.wait)
{
// we are currently waiting for the DNS to resolve, queue all data
socket.buffer.push(data);
}
else
{
// the dns has resolved, proceed to normal parsing...
socket.send(data);
}
});
socket.addListener("eof", function () {
socket.send("goodbye\r\n");
socket.close();
});
});
server.listen(7000, "localhost");
However, I haven't looked into the documentation enough to know if we can trigger events... For example could I trigger the "receive" event of a tcp.connection ?
Again, the idea is to block all further communication until the DNS is resolved.
The client may send data, but we need to queue it and ignore it until the DNS is resolved THEN we can process the previous data.