all files / app/services/ socketService.js

55.77% Statements 29/52
68.18% Branches 15/22
73.33% Functions 11/15
55.77% Lines 29/52
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94                                                                                                                                  
var logger = require('../logger')
var async = require('async')
 
var messageService = require('./messageService')
 
var noAuthentication = function (arg, cb) {
  cb(null, true, {
    scope: '*'
  }, null)
}
var noAuthorization = function (arg, cb) {
  cb(null, true)
}
var noSession = function (sessionId, cb) {
  cb(null, {})
}
 
var SocketService = {
  agents: {},
  onConnect: function (sessionId, authToken, emitter, endFn, done) {
    var yaktor = require('../index')
    var authenticate = yaktor.auth && yaktor.auth.tokenAuthenticate || noAuthentication
    var authorize = yaktor.auth && yaktor.auth.authorize || noAuthorization
    var getSession = yaktor.session.getSession || noSession
    async.waterfall([
      async.apply(authenticate, authToken),
      function (user, info, token, cb) {
        Iif (cb && token) {
          var now = new Date()
          var root = token.root
          var kill = 'kill:::' + root
          var t = setTimeout(function () {
            logger.debug('︻デ┳═ー expired %s at: %s; now: %s; ttl: %s;', kill, token.expires, now, token.expires - now)
            endFn()
          }, Math.min(0x7fffffff, token.expires - now))
          var killer = function (date) {
            logger.silly('$$$$$$ might kill if %s > %s for: %s', date, now, token.root)
            if (date > now) {
              logger.debug('︻デ┳═ー killer', kill)
              clearTimeout(t)
              endFn()
              messageService.removeListener(kill, killer)
            }
          }
          logger.silly('¢¢¢¢¢¢ listening for', kill)
          messageService.on(kill, killer)
          emitter.on('close', function () {
            messageService.removeListener(kill, killer)
          })
        }
        // if not authenticated then no token
        Iif (!user) {
          cb = token
        }
        cb(null, user)
      },
      async.apply(authorize),
      function (user, cb) {
        var err = user ? null : new Error('unauthorized')
        Iif (err) {
          err.token = authToken
        }
        cb(err, user)
      },
      function (user, cb) {
        getSession(sessionId, function (err, session) {
          return cb(err, session, user)
        })
      }
    ], function (err, session, user) {
      Iif (err) {
        logger.error('connection invalid, %s: %s', err.message, err.token)
        emitter.emit(sessionId + ':' + err.message, {
          message: err.message
        })
        emitter.emit(sessionId + ':error', {
          message: err.message
        })
      }
      done(err, session, user)
    })
  },
  startListening: function (emitter, sessionId, session, user) {
    async.each(Object.keys(SocketService.agents), function (name, cb) {
      SocketService.agents[ name ](emitter, emitter, sessionId, session, user, cb)
    }, function () {
      logger.silly(sessionId + ':connected')
      emitter.emit(sessionId + ':connected')
    })
  }
}
 
module.exports = SocketService