Module: Diaspora::WebSocket

Defined in:
lib/diaspora/web_socket.rb

Constant Summary

REDIS_CONNECTION_SET =
'ws-uids'

Class Method Summary (collapse)

Class Method Details

+ (Object) ensure_channel(uid)



42
43
44
# File 'lib/diaspora/web_socket.rb', line 42

def self.ensure_channel(uid)
  @channels[uid] ||= [EM::Channel.new, 0 ]
end

+ (Object) initialize_channels



20
21
22
# File 'lib/diaspora/web_socket.rb', line 20

def self.initialize_channels
  @channels = {}
end

+ (Boolean) is_connected?(uid)

Returns:

  • (Boolean)


56
57
58
# File 'lib/diaspora/web_socket.rb', line 56

def self.is_connected?(uid)
  redis.sismember(REDIS_CONNECTION_SET, uid)
end

+ (Object) length



13
14
15
# File 'lib/diaspora/web_socket.rb', line 13

def self.length
  redis.llen :websocket
end

+ (Object) next



24
25
26
# File 'lib/diaspora/web_socket.rb', line 24

def self.next
  redis.rpop(:websocket)
end

+ (Object) push_to_user(uid, data)



28
29
30
31
# File 'lib/diaspora/web_socket.rb', line 28

def self.push_to_user(uid, data)
  Rails.logger.debug "event=socket-push uid=#{uid}"
  @channels[uid][0].push(data) if @channels[uid]
end

+ (Object) queue_to_user(uid, data)



16
17
18
# File 'lib/diaspora/web_socket.rb', line 16

def self.queue_to_user(uid, data)
  redis.lpush(:websocket, {:uid => uid, :data => data}.to_json)
end

+ (Object) redis



10
11
12
# File 'lib/diaspora/web_socket.rb', line 10

def self.redis
  @redis ||= Resque.redis
end

+ (Object) subscribe(uid, ws)



33
34
35
36
37
38
39
40
# File 'lib/diaspora/web_socket.rb', line 33

def self.(uid, ws)
  Rails.logger.info "event=socket-subscribe uid=#{uid} channels=#{self.length}"
  self.ensure_channel(uid)
  @channels[uid][0].{ |msg| ws.send msg }
  @channels[uid][1] += 1

  redis.sadd(REDIS_CONNECTION_SET, uid)
end

+ (Object) unsubscribe(uid, sid)



46
47
48
49
50
51
52
53
54
# File 'lib/diaspora/web_socket.rb', line 46

def self.unsubscribe(uid,sid)
  Rails.logger.info "event=socket-unsubscribe sid=#{sid} uid=#{uid} channels=#{self.length}"
  @channels[uid][0].unsubscribe(sid) if @channels[uid]
  @channels[uid][1] -= 1
  if @channels[uid][1] <= 0
    @channels.delete(uid)
    redis.srem(REDIS_CONNECTION_SET, uid)
  end
end