socket.ioのmappingを別ファイルで管理したい

socket.ioは使い勝手が良い。
大規模になるとよくあるサンプルのように1ファイルに全部書きたくないので分ける。

socket.manager.js

var manager = module.exports = {
  base   : './controller/socket/',
  set    : function(path, info, io, socket){
    socket.on(path, function(message){
      var file = info.split('#')[0]
      var func = info.split('#')[1] || null;
      var callback = manager.load(file, func);
      callback(io, socket, message);
    });
  },
  deploy : function(mapping, io, socket){
    for(var path in mapping){
      manager.set(path, mapping[path], io, socket);
    }
  },
  load   : function(path, func){
    var uri = manager.base + path;
    return func ? require(uri)[func] : require(uri);
  },
  listen : function(app, mapping){
    var io = require('socket.io').listen(app);
    io.sockets.on('connection', function(socket){
      manager.deploy(mapping, io, socket);
    });
  }
};

これだけでなんとかなる

app.js

var socket  = require('./socket.manager');
var app     = module.exports = express.createServer();
var mapping = {
  'hi'    : 'hi', // ./controller/socket/hi.js をそのまま呼ぶ
  'hello' : 'test#get' // ./controller/socket/test.jsのgetを呼ぶ
};
app.listen(3000);
socket.listen(app, mapping);

test.js

var test = module.exports = {
  get : function(io, socket, message){
    socket.emit('test#get is ok');
  }
};

というように使う。
動くサンプルはhttps://github.com/myatsumoto/socket.managerにある