モジュールにsocket.ioインスタンスをカプセル化しようとしています。私はこれを行いましたが、エクスプレス/パスポートからのソケットトランスポートの認証のためにいくつかの依存関係を注入する必要があるため、少し厄介に見えます。
私の問題は、次のようなモジュールの外部のソケットインスタンスにアクセスしたいことです。socket.on("newDevice", function (data) {});
接続イベントによって取得したソケットインスタンスは関数内にあり、接続が確立されていないため、作成時に存在しない場合もあります。これは私にはちょっと間違っているように見えます。関数スコープ内に依存関係が必要であるという理由だけで、依存関係をどんどん注入したくありません。
sio.on('connection', function(socket) {});
モジュールの外でやろうと思いました。そして多分私はそれを2回行うことができます、最初はモジュールの内側、次に外側ですが、私は推測する2つのリスナーを作成します。
これを適切に行うための良い習慣やパターンはありますか?
var io = require('socket.io');
var socket = function (server, sessionStore, cookieParser, authentication) {
var sio = io.listen(server);
// Configure socket.io
sio.configure(function () {
// Authorize the socket.io request
sio.set('authorization', function (data, accept) {
// Authorization is done here
});
});
sio.on('connection', function(socket) {
var lastActionTime = new Date();
// Get the userId from the session
var session = socket.handshake.session;
var userId = session.passport.user;
var sessionID = socket.handshake.sessionID;
var userdata = null;
// Deserialize user by the userId
authentication.deserializeUser(userId, function(err, user) {
// get the userdata
});
socket.on('disconnect', function() {
});
socket.on('brightnessChange', function(data) {
// TODO Do something here device control
// Broadcast to other devices
this.broadcast.emit('brightnessChange', data);
});
});
return sio;
};
module.exports = socket;