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にある