NewsBlur/node/unread_counts.coffee

96 lines
3.6 KiB
CoffeeScript

fs = require 'fs'
redis = require 'redis'
log = require './log.js'
DEV = process.env.NODE_ENV == 'development'
REDIS_SERVER = if process.env.NODE_ENV == 'development' then 'localhost' else 'db_redis_pubsub'
SECURE = !!process.env.NODE_SSL
# client = redis.createClient 6379, REDIS_SERVER
# RedisStore = require 'socket.io/lib/stores/redis'
# rpub = redis.createClient 6379, REDIS_SERVER
# rsub = redis.createClient 6379, REDIS_SERVER
# rclient = redis.createClient 6379, REDIS_SERVER
log.debug "Starting NewsBlur unread count server..."
if !DEV and !process.env.NODE_ENV
log.debug "Specify NODE_ENV=<development,production>"
return
else if DEV
log.debug "Running as development server"
else
log.debug "Running as production server"
if SECURE
privateKey = fs.readFileSync('/srv/newsblur/config/certificates/newsblur.com.key').toString()
certificate = fs.readFileSync('/srv/newsblur/config/certificates/newsblur.com.crt').toString()
# ca = fs.readFileSync('./config/certificates/intermediate.crt').toString()
options =
port: 8889
key: privateKey
cert: certificate
app = require('https').createServer options
io = require('socket.io')(app, path: "/v2/socket.io")
app.listen options.port
log.debug "Listening securely on port #{options.port}"
else
options =
port: 8888
app = require('http').createServer()
io = require('socket.io')(app, path: "/v2/socket.io")
app.listen options.port
log.debug "Listening on port #{options.port}"
# io.set('transports', ['websocket'])
# io.set 'store', new RedisStore
# redisPub : rpub
# redisSub : rsub
# redisClient : rclient
io.on 'connection', (socket) ->
ip = socket.handshake.headers['X-Forwarded-For'] || socket.handshake.address
socket.on 'subscribe:feeds', (@feeds, @username) ->
log.info @username, "Connecting (#{feeds.length} feeds, #{ip})," +
" (#{io.engine.clientsCount} connected) " +
" #{if SECURE then "(SSL)" else "(non-SSL)"}"
if not @username
return
socket.on "error", (err) ->
log.debug "Error (socket): #{err}"
socket.subscribe?.quit()
socket.subscribe = redis.createClient 6379, REDIS_SERVER
socket.subscribe.on "error", (err) =>
log.info @username, "Error: #{err} (#{@feeds.length} feeds)"
socket.subscribe?.quit()
socket.subscribe.on "connect", =>
log.info @username, "Connected (#{@feeds.length} feeds, #{ip})," +
" (#{io.engine.clientsCount} connected) " +
" #{if SECURE then "(SSL)" else "(non-SSL)"}"
socket.subscribe.subscribe @feeds
feeds_story = @feeds.map (f) -> "#{f}:story"
socket.subscribe.subscribe feeds_story
socket.subscribe.subscribe @username
socket.subscribe.on 'message', (channel, message) =>
log.info @username, "Update on #{channel}: #{message}"
if channel == @username
socket.emit 'user:update', channel, message
else if channel.indexOf(':story') >= 0
socket.emit 'feed:story:new', channel, message
else
socket.emit 'feed:update', channel, message
socket.on 'disconnect', () ->
socket.subscribe?.quit()
log.info @username, "Disconnect (#{@feeds?.length} feeds, #{ip})," +
" there are now #{io.engine.clientsCount} users. " +
" #{if SECURE then "(SSL)" else "(non-SSL)"}"
io.sockets.on 'error', (err) ->
log.debug "Error (sockets): #{err}"