Skip to content

Instantly share code, notes, and snippets.

@seka
Created May 1, 2014 18:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save seka/aa2ebc284338edcc84a2 to your computer and use it in GitHub Desktop.
Save seka/aa2ebc284338edcc84a2 to your computer and use it in GitHub Desktop.
Node.jsのメモリーストアをredisにする場合のsocket.ioとのセッションの共有
module.exports = (SessionConfig, app, express) ->
sio = require "socket.io"
# Session Class
Session = express.session.Session
# sessionStore
# new RedisStore()
sessionStore = SessionConfig.getSessionStore().store
class SocketServer
_sioListenPort = 8080
_socketServer = undefined
@setup : () ->
# socketioの起動
_socketServer = sio.listen(_sioListenPort)
_serverConfig()
_setSocketServer(_socketServer)
console.log "SocketServer setup."
# Socket.ioの各種設定
_serverConfig = () ->
_socketServer.set 'transports', ['websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']
_socketServer.set 'log level', 1
_socketServer.set 'authorization', (handshakeData, callBack) ->
if (!handshakeData.headers.cookie)
return callBack('not found Cookie', false)
# handshakeDataからcookieデータを抽出
cookies = _parseCookie(handshakeData.headers.cookie)
# connect.sidが署名された状態なので、それを取り外している
sessionId = _removeSignature(cookies[app.get('cookieSessionKey')])
# session情報を取り出す
_retrieveSession(handshakeData, cookies, sessionId, callBack)
# appServerにSocketServerを登録する
# module.parentを使って他からアクセスできるようになる
# app.setがexpressに依存しているものなので使うかどうか悩ましい...
_setSocketServer = (server) ->
app.set "SocketServer", server
_parseCookie = (cookie) ->
cookies = []
re = cookie.replace(/\s+/g, '').split(';')
for c in re
parse = c.split('=')
cookies[parse[0]] = parse[1]
return cookies
_removeSignature = (sessionId) ->
reg = new RegExp(/s%3A/)
parse = sessionId.replace(reg, '')
index = parse.indexOf('.')
decodeURIComponent(parse.substr(0, index))
_retrieveSession = (handshakeData, cookies, sessionId, callBack) ->
sessionStore.get sessionId, (err, session) ->
if (err)
return callBack(err.message, false)
# セッションが見つからなかった場合
if (!session)
return callBack('session not found', false)
# socket.ioからセッションを参照できるようにする
# connectionを貼った後はsocket.handshake.session.usernameでアクセスできる
handshakeData.cookie = session.cookie
handshakeData.sessionId = session.sessionId
handshakeData.sessionStore = sessionStore
handshakeData.session = new Session(handshakeData, session)
callBack(null, true)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment