Class: Configly::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/configly/client.rb

Class Method Summary collapse

Class Method Details

.fetch(keys) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/configly/client.rb', line 65

def self.fetch(keys)
    uri = URI("https://#{CONFIGLY_SERVER}#{CONFIGLY_VALUE_URL}?#{generate_qs(keys)}")
    loaded_keys = {}
    Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
        request = Net::HTTP::Get.new uri
        request.basic_auth get_api_key, ''
        response = http.request request
        data = JSON.parse(response.body)['data']
        data.keys.each do |key|
            loaded_keys[key] = data[key]['value']
        end
    end
    return loaded_keys
end

.generate_qs(keys_to_preload) ⇒ Object



29
30
31
# File 'lib/configly/client.rb', line 29

def self.generate_qs(keys_to_preload)
    return keys_to_preload.map { |key| "keys[]=#{key}" }.join("&")
end

.get(key) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/configly/client.rb', line 80

def self.get(key)
    if @use_ws
        if @keys.has_key? key
            return @keys[key]
        else
            raise KeyError.new(key)
        end
    else
        loaded_keys = fetch([key])
        if loaded_keys.has_key? key
            return loaded_keys[key]
        else
            raise KeyError.new(key)
        end
    end
end

.get_api_keyObject



21
22
23
# File 'lib/configly/client.rb', line 21

def self.get_api_key
    return ENV['CONFIGLY_API_KEY']
end

.get_keys_to_preloadObject



25
26
27
# File 'lib/configly/client.rb', line 25

def self.get_keys_to_preload
    return ENV['CONFIGLY_KEYS_TO_PRELOAD'].split(',')
end

.initObject



13
14
15
16
17
18
19
# File 'lib/configly/client.rb', line 13

def self.init
    @use_ws = true
    if get_api_key
        load_initial_data
        Thread.new { EM.run { start_web_socket_client }}
    end
end

.load_initial_dataObject



33
34
35
# File 'lib/configly/client.rb', line 33

def self.load_initial_data
    @keys = fetch(get_keys_to_preload)
end

.start_web_socket_clientObject



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
# File 'lib/configly/client.rb', line 37

def self.start_web_socket_client
    ws = Faye::WebSocket::Client.new("ws://configly.herokuapp.com", nil, {:ping => 30})

    ws.on :open do |event|
        Rails.logger.debug :open
        ws.send(JSON.generate({"apiKey" => get_api_key, "type" => "handshake"}))
    end

    ws.on :message do |event|
        Rails.logger.debug :message
        data = JSON.parse(event.data)
        if data["type"] == "configUpdate"
            payload = data["payload"]["payload"]
            keyToUpdate = payload['key']
            value = payload['value']
            @keys[keyToUpdate] = value
        end

        Rails.logger.debug @keys
    end

    ws.on :close do |event|
        Rails.logger.debug :close
        Rails.logger.debug event.code
        start_web_socket_client
    end
end