var http = require('http'); var url = require('url'); var io = require('socket.io-client'); function WsRelay(route, handle, opts) { var self = this; // socket.io の接続先 this.dest = opts.dest || 'http://localhost:8080/appname'; // サーバハンドラが渡されたそちらを優先して利用する if (opts.server) { this.server = opts.server; } else { // デフォルトのリスンポート 8081 this.port = opts.port || 8081; } function onRequest(req, res) { var parse = url.parse(req.url, true); var query = parse.query; // 監視エージェントからのリクエストのみ処理する if (!query['1'] && !query['2']) return; // 初回リクエストで socket.io 接続 if (!self.appname) { self.appname = io.connect(self.dest); } var appname = self.appname; appname.on('available_channel', function(channels) { console.log('avaiable_channnel', channels); // リスト先頭のチャネルIDを利用する appname.emit('join', channels[0]); }); appname.on('connect', function() { console.log('connect'); self.connected = true; appname.once('joined', function() { // 初回リクエスト時のデータ送信 appname.json.emit('user:message', query); }); }); // 既に socket.io 接続されている時のデータ送信 if (self.connected) appname.json.emit('user:message', query); req.setEncoding('utf8'); req.on('end', function() { route(handle, parse.pathname, res); }); res.end(); } // サーバハンドラが存在していればそちらを優先する if (this.server) { this.server.on('request', onRequest); } else { http.createServer(onRequest).listen(this.port); } } exports.WsRelay = WsRelay;