// Shared code var MsgType = { "game start": String.fromCharCode(0), "update state": String.fromCharCode(1), "private message": String.fromCharCode(2) }; var MsgTypeLookup = [ "game start", "update state", "private message" ]; var createNetEmitter = function( EventEmitter2, socket ) { var receive = new EventEmitter2({ wildcard: true }); socket.on( 'message', function( encodedString ) { var event = MsgTypeLookup[ encodedString.charCodeAt(0) ]; netreceive.emit( event, encodedString.substr(1) ); }); var send = new EventEmitter2({ wildcard: true }); netsend.on( '*', function( event, encodedString ) { socket.emit( 'message', MsgType[this.event] + encodedString ); }); return { receive: receive, send: send }; }; // Server code var EventEmitter2 = require('eventemitter2').EventEmitter2; io.sockets.on( 'connection', function( socket ) { var net = createNetEmitter( EventEmitter2, socket ); net.send.emit( 'game start', 'world state goes here' ); }); // Client code // Include the EventEmitter2 library var socket = io.connect(); socket.on( 'connect', function() { var net = createNetEmitter( EventEmitter2, socket ); net.receive.on( 'game start', function( worldState ) { var state = decode( worldState ); }); });