リアルタイムwebアプリを作るのにとても良い組み合わせだと思っています。基本的にsocket.ioのconnectionはhttpのsessionと関連が無いので、例えばそのconnectionがログインしているユーザのものかその他のユーザのものか区別がつかない。以前はSessionWebSocketを使ってそれを判別するようにしていたのだけど、残念なことに残念なのでコレはもう使いたくない。そこでclientから最初にcookieを送信してもらって、そこからclientのsessionを識別する、という方法がある、と以前@masahirohさんに教えていただきました。storeをsocket.ioと共有できるようにしておく。}));のようなかんじで設定。デフォルトでhttpOnlyはtrueになっているけどこれをfalseにしておかないとclientでcookieが取得出来ないので。この例ではデフォルトのMemoryStoreを使っているけど、connect-redisやconnect-mongodbのように別のものに置き換えて使うことも可能*2。socket.ioサーバでは、このstoreを使ってcookieからsession情報を引けるようにする。storeを見るので、session情報を共有することができるようになる。テストを書くで、これもできればテストを書きたい。思ってそもそもsocket.ioのテストってどうするんだろうとsocket.ioパッケージについているtestを調べてみたら、node-websocket-clientを使ってclientからの接続を作ってtestを書いているようだった。sessionを共有するsocket.ioサーバのテストを書いてみた。ぎゃーんメモで用意したtest_helperスクリプトを使ったQUnit+qunit-tapのテストになっています。使用portは空いてるものを見つけるようにした方が良いと思うけどここでは決め打ちで。setup時にhttpサーバを適当に上げて、MemoryStoreと一緒にモジュール化したsocket.ioサーバに渡して立ち上げる。disconnectまでの流れ。disconnectまで終わったらテスト終了。PASSwebsocket-clientはnpmパッケージあるけどsocket.ioにも同梱されているのでそこから持ってくることができる。ブラウザ用に書くクライアント側のsocket.ioとちょっと違うのでインタフェースを合わせた下記のようなラッパーを使用した方がスッキリすると思う。storeを渡して動かすようにするモジュールとして切り出すtest時にはsetupで立ち上げてteadownで落とすcookieも作ってMemoryStoreにsessionを入れておき、testの中で検証できるようにするwebsocket-clientでクライアント側からの接続をエミュレートというようにやればtestは書けるはず。