Skip to content

Instantly share code, notes, and snippets.

@horatio-sans-serif
Created April 15, 2010 01:49
Show Gist options
  • Save horatio-sans-serif/366590 to your computer and use it in GitHub Desktop.
Save horatio-sans-serif/366590 to your computer and use it in GitHub Desktop.
subs = {}, conns = 0;
require('net').createServer(function (sock) {
sock.setEncoding('utf8');
sock.subs = {};
sock.id = conns++;
var buf = '';
sock.addListener('data', function (chunk) {
buf += chunk;
var match;
while (match = buf.match(/^(.*)\r\n/)) {
buf = buf.substr(match[0].length);
var line = match[1];
if (match = line.match(/^sub\s+(.+)$/)) {
var chan = match[1];
sock.subs[chan] = 1;
if (!subs[chan]) subs[chan] = [];
subs[chan][sock.id] = sock;
} else if (match = line.match(/^unsub\s+(.+)$/)) {
var chan = match[1];
delete sock.subs[chan];
if (subs[chan]) delete subs[chan][sock.id];
} else if (match = line.match(/^pub\s+(.+?)\s+(.+)$/)) {
var chan = match[1], sentTo = 0;
(subs[chan] || []).forEach(function (s) {
if (s.write(JSON.stringify({chan:chan, msg:match[2]})+"\r\n")) sentTo++;
});
} else {
sock.write(JSON.stringify({err:"unknown command"})+"\r\n");
sock.end();
}
};
});
sock.addListener("end", function () {
Object.getOwnPropertyNames(sock.subs).forEach(function (chan) {
delete sock.subs[chan];
if (subs[chan]) delete subs[chan][sock.id];
});
sock.end();
});
}).listen(8080);
@horatio-sans-serif
Copy link
Author

$ node pubsub.js &

$ telnet 127.0.0.1 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
sub foo
pub foo bar
{"chan":"foo","msg":"bar"}
pub bar foo
sub bar
pub bar foo
{"chan":"bar","msg":"foo"}
pub foo hi
{"chan":"foo","msg":"hi"}
unsub bar
pub bar hello
^]
telnet> Connection closed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment