Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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
You can’t perform that action at this time.