Class: Colossus::WriterClient

Inherits:
Object
  • Object
show all
Defined in:
lib/colossus/writer_client.rb

Defined Under Namespace

Classes: FayeExtension

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url, writer_token = Colossus.config.writer_token, time_out = 2) ⇒ WriterClient

Returns a new instance of WriterClient.



5
6
7
8
9
10
11
# File 'lib/colossus/writer_client.rb', line 5

def initialize(url,
               writer_token = Colossus.config.writer_token,
               time_out = 2)
  @url          = url
  @writer_token = writer_token
  @time_out     = time_out
end

Instance Attribute Details

#time_outObject (readonly)

Returns the value of attribute time_out.



3
4
5
# File 'lib/colossus/writer_client.rb', line 3

def time_out
  @time_out
end

#urlObject (readonly)

Returns the value of attribute url.



3
4
5
# File 'lib/colossus/writer_client.rb', line 3

def url
  @url
end

#writer_tokenObject (readonly)

Returns the value of attribute writer_token.



3
4
5
# File 'lib/colossus/writer_client.rb', line 3

def writer_token
  @writer_token
end

Instance Method Details

#get_presences(optional_user_ids = nil) ⇒ Object



13
14
15
16
17
18
19
20
21
# File 'lib/colossus/writer_client.rb', line 13

def get_presences(optional_user_ids = nil)
  user_ids = Array(optional_user_ids) if optional_user_ids
  unique_token = generate_unique_token
  EM.synchrony do
    EM::Synchrony.add_timer(time_out) { raise "Presence request timed out" }
    EM::Synchrony.sync(faye_client.subscribe("/presences/response/#{unique_token}") { |message| return message['statuses'] })
    EM::Synchrony.sync(faye_client.publish("/presences/request/#{unique_token}", user_ids))
  end
end

#get_presences_by_http(optional_user_ids = nil) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/colossus/writer_client.rb', line 23

def get_presences_by_http(optional_user_ids = nil)
  user_ids = Array(optional_user_ids) if optional_user_ids
  # Custom Content-Type to indicate to the server
  # this is a simple http request
  conn     = Faraday.new(url, headers: {'Content-Type' => 'application/vnd.http.json'}) do |conf|
    conf.adapter  Faraday.default_adapter
    conf.response :raise_error
  end

  body = conn.post do |req|
    req.body = JSON.dump({ user_ids: user_ids, writer_token: writer_token})
  end.body

  response = JSON.parse(body)
  response['statuses']
end

#push_message(user_ids, message) ⇒ Object



40
41
42
43
44
45
46
47
48
# File 'lib/colossus/writer_client.rb', line 40

def push_message(user_ids, message)
  user_ids = Array(user_ids)
  EM.synchrony do
    user_ids.each do |user_id|
      EM::Synchrony.sync(faye_client.publish("/users/#{user_id}", message))
    end
    EM.stop
  end
end