Class: Gossiperl::Client::State

Inherits:
Resolution show all
Defined in:
lib/gossiperl_client/state.rb,
lib/gossiperl_client/headers.rb

Constant Summary

Constants inherited from Resolution

Resolution::UNDEFINED_VALUE

Instance Method Summary collapse

Methods inherited from Resolution

field

Constructor Details

#initialize(worker) ⇒ State

Returns a new instance of State.



12
13
14
# File 'lib/gossiperl_client/state.rb', line 12

def initialize worker
  self.worker = worker
end

Instance Method Details

#receive(digest_ack) ⇒ Object



37
38
39
40
41
42
43
44
45
# File 'lib/gossiperl_client/state.rb', line 37

def receive digest_ack
  unless self.connected
    # Announce connected
    self.worker.process_event( { :event => :connected } )
    self.worker.messaging.digest_subscribe( self.subscriptions ) if self.subscriptions.length > 0
  end
  self.connected = true
  self.last_ts = digest_ack.heartbeat
end

#send_digestObject



47
48
49
50
51
52
53
54
55
# File 'lib/gossiperl_client/state.rb', line 47

def send_digest
  digest = Gossiperl::Client::Thrift::Digest.new
  digest.name = self.worker.options[:client_name].to_s
  digest.port = self.worker.options[:client_port]
  digest.heartbeat = Time.now.to_i
  digest.id = SecureRandom.uuid.to_s
  digest.secret = self.worker.options[:client_secret].to_s
  self.worker.messaging.send digest
end

#startObject



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/gossiperl_client/state.rb', line 16

def start
  sleep 1
  self.last_ts = Time.now.to_i
  Thread.new(self) do |state|
    while state.worker.working
      state.send_digest
      sleep 2
      if Time.now.to_i - state.last_ts > 5
        if self.connected
          # Announce disconnected
          state.worker.process_event( { :event => :disconnected } )
          self.connected = false
        end
      end
    end
    state.worker.process_event( { :event => :disconnected } )
    self.connected = false
    state.worker.logger.info("Stopping state service for client #{state.worker.options[:client_name]}.")
  end
end

#subscribe(event_types) ⇒ Object



57
58
59
60
61
62
# File 'lib/gossiperl_client/state.rb', line 57

def subscribe event_types
  ::Gossiperl::Client::Util::Validation.validate_event_types( event_types )
  self.subscriptions = self.subscriptions + event_types
  self.worker.messaging.digest_subscribe(event_types) if self.connected
  return self.subscriptions
end

#unsubscribe(event_types) ⇒ Object



64
65
66
67
68
69
# File 'lib/gossiperl_client/state.rb', line 64

def unsubscribe event_types
  ::Gossiperl::Client::Util::Validation.validate_event_types( event_types )
  self.subscriptions = self.subscriptions - event_types
  self.worker.messaging.digest_unsubscribe(event_types) if self.connected
  return self.subscriptions
end