Skip to content

Instantly share code, notes, and snippets.

@seka
Created November 30, 2013 10:37
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/7717513 to your computer and use it in GitHub Desktop.
Save seka/7717513 to your computer and use it in GitHub Desktop.
Node.jsのメモリーストアをmongoDBに設定した後に、Socket.io側からアクセスしたくて 色々調べてもよく分からなかったので、自分で実装してみた.(mongooseを使ったのは甘え)
exports.SocketServerClass = class SocketServerClass
_sioListenPort = 8080
constructor : (@app, @node_modules, @appOption) ->
@sio = @node_modules.sio
@http = @node_modules.http
@appServer = @http.createServer(@app)
setup : () ->
# socketioの起動
@appServer.listen(_sioListenPort)
exports.socketServer = @sio.listen(@appServer)
@serverConfig()
return console.log("socket_server setup.")
serverConfig : () ->
exports.socketServer.configure () ->
@.set 'transports', ['websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']
@.set 'log level', 2
# socket.ioからmongoDBに保存されているCookieデータにアクセスする
@.set 'authorization', (handshakeData, callBack) ->
if (!handshakeData.headers.cookie)
return callBack('not found Cookie', false)
# handshakeDataからcookieデータを抽出
cookieData = handshakeData.headers.cookie
cookies = cookieData.replace(/\s+/g, '').split(';')
for c in cookies
parse = c.split('=')
cookies[parse[0]] = parse[1]
# connect.sidが署名された状態なので、それを取り外している。
parse = cookies['connect.sid'].replace(/s%3A/, '')
index = parse.indexOf('.')
sessionID = parse.substr(0, index)
# sidを元にmongoDBからユーザ名を取得する
mongoClass = exports.MongoClass.serachMongo(handshakeData, decodeURIComponent(sessionID), callBack)
exports.MongoClass = new (class MongoClass
constructor : () ->
# mongooseの設定
# 接続はサービスをセットアップするときのみ行う(接続が重複するとエラーになる
socketOption = require './config/option.json'
@db = socketOption.session.database
@collection = socketOption.session.collection
@mongoose = require 'mongoose'
@Schema = @mongoose.Schema
@sessionScheme = new @Schema({
_id : String
data : Object
expires : Date
sid : String
})
@mongoose.connect "mongodb://localhost/#{@db}"
@sessionsCollection = @mongoose.model(@collection, @sessionScheme)
serachMongo : (handshakeData, sessionID, callBack) ->
@sessionsCollection.findOne {sid : sessionID}, (err, data) =>
if (data?)
console.log data.data.username
handshakeData.sessionID = data.data.username
callBack(null, true)
else
callBack(null, false)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment