configcat 5.0.1 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/configcat/configcache.rb +19 -4
- data/lib/configcat/configcatclient.rb +263 -107
- data/lib/configcat/configcatlogger.rb +24 -0
- data/lib/configcat/configcatoptions.rb +153 -0
- data/lib/configcat/configentry.rb +40 -0
- data/lib/configcat/configfetcher.rb +98 -40
- data/lib/configcat/configservice.rb +212 -0
- data/lib/configcat/evaluationdetails.rb +23 -0
- data/lib/configcat/interfaces.rb +4 -59
- data/lib/configcat/localdictionarydatasource.rb +14 -4
- data/lib/configcat/localfiledatasource.rb +22 -11
- data/lib/configcat/overridedatasource.rb +8 -2
- data/lib/configcat/pollingmode.rb +62 -0
- data/lib/configcat/refreshresult.rb +3 -0
- data/lib/configcat/rolloutevaluator.rb +32 -37
- data/lib/configcat/user.rb +18 -39
- data/lib/configcat/utils.rb +10 -0
- data/lib/configcat/version.rb +1 -1
- data/lib/configcat.rb +128 -136
- metadata +24 -5
- data/lib/configcat/autopollingcachepolicy.rb +0 -99
- data/lib/configcat/lazyloadingcachepolicy.rb +0 -69
- data/lib/configcat/manualpollingcachepolicy.rb +0 -47
data/lib/configcat.rb
CHANGED
@@ -6,12 +6,25 @@ require 'configcat/user'
|
|
6
6
|
require 'logger'
|
7
7
|
|
8
8
|
module ConfigCat
|
9
|
-
|
10
9
|
@logger = Logger.new(STDOUT, level: Logger::WARN)
|
11
10
|
class << self
|
12
11
|
attr_accessor :logger
|
13
12
|
end
|
14
13
|
|
14
|
+
# Creates a new or gets an already existing `ConfigCatClient` for the given `sdk_key`.
|
15
|
+
#
|
16
|
+
# :param sdk_key [String] ConfigCat SDK Key to access your configuration.
|
17
|
+
# :param options [ConfigCatOptions] Configuration `ConfigCatOptions` for `ConfigCatClient`.
|
18
|
+
# :return [ConfigCatClient] the `ConfigCatClient` instance.
|
19
|
+
def ConfigCat.get(sdk_key, options = nil)
|
20
|
+
return ConfigCatClient.get(sdk_key, options)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Closes all ConfigCatClient instances.
|
24
|
+
def ConfigCat.close_all
|
25
|
+
ConfigCatClient.close_all
|
26
|
+
end
|
27
|
+
|
15
28
|
def ConfigCat.create_client(sdk_key, data_governance: DataGovernance::GLOBAL)
|
16
29
|
#
|
17
30
|
# Create an instance of ConfigCatClient and setup Auto Poll mode with default options
|
@@ -25,171 +38,150 @@ module ConfigCat
|
|
25
38
|
return create_client_with_auto_poll(sdk_key, data_governance: data_governance)
|
26
39
|
end
|
27
40
|
|
41
|
+
# Create an instance of ConfigCatClient and setup Auto Poll mode with custom options
|
42
|
+
#
|
43
|
+
# :param sdk_key: ConfigCat SDK Key to access your configuration.
|
44
|
+
# :param poll_interval_seconds: The client's poll interval in seconds. Default: 60 seconds.
|
45
|
+
# :param on_configuration_changed_callback: You can subscribe to configuration changes with this callback
|
46
|
+
# :param max_init_wait_time_seconds: maximum waiting time for first configuration fetch in polling mode.
|
47
|
+
# :param config_cache: If you want to use custom caching instead of the client's default,
|
48
|
+
# You can provide an implementation of ConfigCache.
|
49
|
+
# :param base_url: You can set a base_url if you want to use a proxy server between your application and ConfigCat
|
50
|
+
# :param proxy_address: Proxy address
|
51
|
+
# :param proxy_port: Proxy port
|
52
|
+
# :param proxy_user: username for proxy authentication
|
53
|
+
# :param proxy_pass: password for proxy authentication
|
54
|
+
# :param open_timeout_seconds: The number of seconds to wait for the server to make the initial connection. Default: 10 seconds.
|
55
|
+
# :param read_timeout_seconds: The number of seconds to wait for the server to respond before giving up. Default: 30 seconds.
|
56
|
+
# :param flag_overrides: A FlagOverrides implementation used to override feature flags & settings.
|
57
|
+
# :param data_governance:
|
58
|
+
# Default: Global. Set this parameter to be in sync with the Data Governance preference on the Dashboard:
|
59
|
+
# https://app.configcat.com/organization/data-governance
|
60
|
+
# (Only Organization Admins have access)
|
28
61
|
def ConfigCat.create_client_with_auto_poll(sdk_key,
|
29
62
|
poll_interval_seconds: 60,
|
30
63
|
max_init_wait_time_seconds: 5,
|
31
64
|
on_configuration_changed_callback: nil,
|
32
|
-
|
65
|
+
config_cache: nil,
|
33
66
|
base_url: nil,
|
34
67
|
proxy_address: nil,
|
35
68
|
proxy_port: nil,
|
36
69
|
proxy_user: nil,
|
37
70
|
proxy_pass: nil,
|
38
|
-
|
39
|
-
|
71
|
+
open_timeout_seconds: 10,
|
72
|
+
read_timeout_seconds: 30,
|
40
73
|
flag_overrides: nil,
|
41
74
|
data_governance: DataGovernance::GLOBAL)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
# :param data_governance:
|
60
|
-
# Default: Global. Set this parameter to be in sync with the Data Governance preference on the Dashboard:
|
61
|
-
# https://app.configcat.com/organization/data-governance
|
62
|
-
# (Only Organization Admins have access)
|
63
|
-
#
|
64
|
-
if sdk_key === nil
|
65
|
-
raise ConfigCatClientException, "SDK Key is required."
|
66
|
-
end
|
67
|
-
if poll_interval_seconds < 1
|
68
|
-
poll_interval_seconds = 1
|
69
|
-
end
|
70
|
-
if max_init_wait_time_seconds < 0
|
71
|
-
max_init_wait_time_seconds = 0
|
72
|
-
end
|
73
|
-
return ConfigCatClient.new(sdk_key,
|
74
|
-
poll_interval_seconds: poll_interval_seconds,
|
75
|
-
max_init_wait_time_seconds: max_init_wait_time_seconds,
|
76
|
-
on_configuration_changed_callback: on_configuration_changed_callback,
|
77
|
-
cache_time_to_live_seconds: 0,
|
78
|
-
config_cache_class: config_cache_class,
|
79
|
-
base_url: base_url,
|
80
|
-
proxy_address: proxy_address,
|
81
|
-
proxy_port: proxy_port,
|
82
|
-
proxy_user: proxy_user,
|
83
|
-
proxy_pass: proxy_pass,
|
84
|
-
open_timeout: open_timeout,
|
85
|
-
read_timeout: read_timeout,
|
86
|
-
flag_overrides: flag_overrides,
|
87
|
-
data_governance: data_governance)
|
75
|
+
options = ConfigCatOptions.new(
|
76
|
+
base_url: base_url,
|
77
|
+
polling_mode: PollingMode.auto_poll(poll_interval_seconds: poll_interval_seconds, max_init_wait_time_seconds: max_init_wait_time_seconds),
|
78
|
+
config_cache: config_cache,
|
79
|
+
proxy_address: proxy_address,
|
80
|
+
proxy_port: proxy_port,
|
81
|
+
proxy_user: proxy_user,
|
82
|
+
proxy_pass: proxy_pass,
|
83
|
+
open_timeout_seconds: open_timeout_seconds,
|
84
|
+
read_timeout_seconds: read_timeout_seconds,
|
85
|
+
flag_overrides: flag_overrides,
|
86
|
+
data_governance: data_governance
|
87
|
+
)
|
88
|
+
client = ConfigCatClient.get(sdk_key, options)
|
89
|
+
client.hooks.add_on_config_changed(on_configuration_changed_callback) if on_configuration_changed_callback
|
90
|
+
client.log.warn('create_client_with_auto_poll is deprecated. Create the ConfigCat Client as a Singleton object with `configcatclient.get()` instead')
|
91
|
+
return client
|
88
92
|
end
|
89
93
|
|
94
|
+
# Create an instance of ConfigCatClient and setup Lazy Load mode with custom options
|
95
|
+
#
|
96
|
+
# :param sdk_key: ConfigCat SDK Key to access your configuration.
|
97
|
+
# :param cache_time_to_live_seconds: The cache TTL.
|
98
|
+
# :param config_cache: If you want to use custom caching instead of the client's default,
|
99
|
+
# You can provide an implementation of ConfigCache.
|
100
|
+
# :param base_url: You can set a base_url if you want to use a proxy server between your application and ConfigCat
|
101
|
+
# :param proxy_address: Proxy address
|
102
|
+
# :param proxy_port: Proxy port
|
103
|
+
# :param proxy_user: username for proxy authentication
|
104
|
+
# :param proxy_pass: password for proxy authentication
|
105
|
+
# :param open_timeout_seconds: The number of seconds to wait for the server to make the initial connection. Default: 10 seconds.
|
106
|
+
# :param read_timeout_seconds: The number of seconds to wait for the server to respond before giving up. Default: 30 seconds.
|
107
|
+
# :param flag_overrides: A FlagOverrides implementation used to override feature flags & settings.
|
108
|
+
# :param data_governance:
|
109
|
+
# Default: Global. Set this parameter to be in sync with the Data Governance preference on the Dashboard:
|
110
|
+
# https://app.configcat.com/organization/data-governance
|
111
|
+
# (Only Organization Admins have access)
|
90
112
|
def ConfigCat.create_client_with_lazy_load(sdk_key,
|
91
113
|
cache_time_to_live_seconds: 60,
|
92
|
-
|
114
|
+
config_cache: nil,
|
93
115
|
base_url: nil,
|
94
116
|
proxy_address: nil,
|
95
117
|
proxy_port: nil,
|
96
118
|
proxy_user: nil,
|
97
119
|
proxy_pass: nil,
|
98
|
-
|
99
|
-
|
120
|
+
open_timeout_seconds: 10,
|
121
|
+
read_timeout_seconds: 30,
|
100
122
|
flag_overrides: nil,
|
101
123
|
data_governance: DataGovernance::GLOBAL)
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
# Default: Global. Set this parameter to be in sync with the Data Governance preference on the Dashboard:
|
119
|
-
# https://app.configcat.com/organization/data-governance
|
120
|
-
# (Only Organization Admins have access)
|
121
|
-
#
|
122
|
-
if sdk_key === nil
|
123
|
-
raise ConfigCatClientException, "SDK Key is required."
|
124
|
-
end
|
125
|
-
if cache_time_to_live_seconds < 1
|
126
|
-
cache_time_to_live_seconds = 1
|
127
|
-
end
|
128
|
-
return ConfigCatClient.new(sdk_key,
|
129
|
-
poll_interval_seconds: 0,
|
130
|
-
max_init_wait_time_seconds: 0,
|
131
|
-
on_configuration_changed_callback: nil,
|
132
|
-
cache_time_to_live_seconds: cache_time_to_live_seconds,
|
133
|
-
config_cache_class: config_cache_class,
|
134
|
-
base_url: base_url,
|
135
|
-
proxy_address: proxy_address,
|
136
|
-
proxy_port: proxy_port,
|
137
|
-
proxy_user: proxy_user,
|
138
|
-
proxy_pass: proxy_pass,
|
139
|
-
open_timeout: open_timeout,
|
140
|
-
read_timeout: read_timeout,
|
141
|
-
flag_overrides: flag_overrides,
|
142
|
-
data_governance: data_governance)
|
124
|
+
options = ConfigCatOptions.new(
|
125
|
+
base_url: base_url,
|
126
|
+
polling_mode: PollingMode.lazy_load(cache_refresh_interval_seconds: cache_time_to_live_seconds),
|
127
|
+
config_cache: config_cache,
|
128
|
+
proxy_address: proxy_address,
|
129
|
+
proxy_port: proxy_port,
|
130
|
+
proxy_user: proxy_user,
|
131
|
+
proxy_pass: proxy_pass,
|
132
|
+
open_timeout_seconds: open_timeout_seconds,
|
133
|
+
read_timeout_seconds: read_timeout_seconds,
|
134
|
+
flag_overrides: flag_overrides,
|
135
|
+
data_governance: data_governance
|
136
|
+
)
|
137
|
+
client = ConfigCatClient.get(sdk_key, options)
|
138
|
+
client.log.warn('create_client_with_lazy_load is deprecated. Create the ConfigCat Client as a Singleton object with `configcatclient.get()` instead')
|
139
|
+
return client
|
143
140
|
end
|
144
141
|
|
142
|
+
# Create an instance of ConfigCatClient and setup Manual Poll mode with custom options
|
143
|
+
#
|
144
|
+
# :param sdk_key: ConfigCat SDK Key to access your configuration.
|
145
|
+
# :param config_cache: If you want to use custom caching instead of the client's default,
|
146
|
+
# You can provide an implementation of ConfigCache.
|
147
|
+
# :param base_url: You can set a base_url if you want to use a proxy server between your application and ConfigCat
|
148
|
+
# :param proxy_address: Proxy address
|
149
|
+
# :param proxy_port: Proxy port
|
150
|
+
# :param proxy_user: username for proxy authentication
|
151
|
+
# :param proxy_pass: password for proxy authentication
|
152
|
+
# :param open_timeout_seconds: The number of seconds to wait for the server to make the initial connection. Default: 10 seconds.
|
153
|
+
# :param read_timeout_seconds: The number of seconds to wait for the server to respond before giving up. Default: 30 seconds.
|
154
|
+
# :param flag_overrides: A FlagOverrides implementation used to override feature flags & settings.
|
155
|
+
# :param data_governance:
|
156
|
+
# Default: Global. Set this parameter to be in sync with the Data Governance preference on the Dashboard:
|
157
|
+
# https://app.configcat.com/organization/data-governance
|
158
|
+
# (Only Organization Admins have access)
|
145
159
|
def ConfigCat.create_client_with_manual_poll(sdk_key,
|
146
|
-
|
160
|
+
config_cache: nil,
|
147
161
|
base_url: nil,
|
148
162
|
proxy_address: nil,
|
149
163
|
proxy_port: nil,
|
150
164
|
proxy_user: nil,
|
151
165
|
proxy_pass: nil,
|
152
|
-
|
153
|
-
|
166
|
+
open_timeout_seconds: 10,
|
167
|
+
read_timeout_seconds: 30,
|
154
168
|
flag_overrides: nil,
|
155
169
|
data_governance: DataGovernance::GLOBAL)
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
# https://app.configcat.com/organization/data-governance
|
173
|
-
# (Only Organization Admins have access)
|
174
|
-
#
|
175
|
-
if sdk_key === nil
|
176
|
-
raise ConfigCatClientException, "SDK Key is required."
|
177
|
-
end
|
178
|
-
return ConfigCatClient.new(sdk_key,
|
179
|
-
poll_interval_seconds: 0,
|
180
|
-
max_init_wait_time_seconds: 0,
|
181
|
-
on_configuration_changed_callback: nil,
|
182
|
-
cache_time_to_live_seconds: 0,
|
183
|
-
config_cache_class: config_cache_class,
|
184
|
-
base_url: base_url,
|
185
|
-
proxy_address: proxy_address,
|
186
|
-
proxy_port: proxy_port,
|
187
|
-
proxy_user: proxy_user,
|
188
|
-
proxy_pass: proxy_pass,
|
189
|
-
open_timeout: open_timeout,
|
190
|
-
read_timeout: read_timeout,
|
191
|
-
flag_overrides: flag_overrides,
|
192
|
-
data_governance: data_governance)
|
170
|
+
options = ConfigCatOptions.new(
|
171
|
+
base_url: base_url,
|
172
|
+
polling_mode: PollingMode.manual_poll(),
|
173
|
+
config_cache: config_cache,
|
174
|
+
proxy_address: proxy_address,
|
175
|
+
proxy_port: proxy_port,
|
176
|
+
proxy_user: proxy_user,
|
177
|
+
proxy_pass: proxy_pass,
|
178
|
+
open_timeout_seconds: open_timeout_seconds,
|
179
|
+
read_timeout_seconds: read_timeout_seconds,
|
180
|
+
flag_overrides: flag_overrides,
|
181
|
+
data_governance: data_governance
|
182
|
+
)
|
183
|
+
client = ConfigCatClient.get(sdk_key, options)
|
184
|
+
client.log.warn('create_client_with_manual_poll is deprecated. Create the ConfigCat Client as a Singleton object with `configcatclient.get()` instead')
|
185
|
+
return client
|
193
186
|
end
|
194
|
-
|
195
|
-
end
|
187
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: configcat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ConfigCat
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
description: Feature Flags created by developers for developers with ❤️. ConfigCat
|
98
112
|
lets you manage feature flags across frontend, backend, mobile, and desktop apps
|
99
113
|
without (re)deploying code. % rollouts, user targeting, segmentation. Feature toggle
|
@@ -106,20 +120,25 @@ extensions: []
|
|
106
120
|
extra_rdoc_files: []
|
107
121
|
files:
|
108
122
|
- lib/configcat.rb
|
109
|
-
- lib/configcat/autopollingcachepolicy.rb
|
110
123
|
- lib/configcat/configcache.rb
|
111
124
|
- lib/configcat/configcatclient.rb
|
125
|
+
- lib/configcat/configcatlogger.rb
|
126
|
+
- lib/configcat/configcatoptions.rb
|
127
|
+
- lib/configcat/configentry.rb
|
112
128
|
- lib/configcat/configfetcher.rb
|
129
|
+
- lib/configcat/configservice.rb
|
113
130
|
- lib/configcat/constants.rb
|
114
131
|
- lib/configcat/datagovernance.rb
|
132
|
+
- lib/configcat/evaluationdetails.rb
|
115
133
|
- lib/configcat/interfaces.rb
|
116
|
-
- lib/configcat/lazyloadingcachepolicy.rb
|
117
134
|
- lib/configcat/localdictionarydatasource.rb
|
118
135
|
- lib/configcat/localfiledatasource.rb
|
119
|
-
- lib/configcat/manualpollingcachepolicy.rb
|
120
136
|
- lib/configcat/overridedatasource.rb
|
137
|
+
- lib/configcat/pollingmode.rb
|
138
|
+
- lib/configcat/refreshresult.rb
|
121
139
|
- lib/configcat/rolloutevaluator.rb
|
122
140
|
- lib/configcat/user.rb
|
141
|
+
- lib/configcat/utils.rb
|
123
142
|
- lib/configcat/version.rb
|
124
143
|
homepage: https://configcat.com
|
125
144
|
licenses:
|
@@ -1,99 +0,0 @@
|
|
1
|
-
require 'configcat/interfaces'
|
2
|
-
require 'configcat/constants'
|
3
|
-
require 'concurrent'
|
4
|
-
|
5
|
-
module ConfigCat
|
6
|
-
class AutoPollingCachePolicy < CachePolicy
|
7
|
-
def initialize(config_fetcher, config_cache, cache_key, poll_interval_seconds=60, max_init_wait_time_seconds=5, on_configuration_changed_callback=nil)
|
8
|
-
if poll_interval_seconds < 1
|
9
|
-
poll_interval_seconds = 1
|
10
|
-
end
|
11
|
-
if max_init_wait_time_seconds < 0
|
12
|
-
max_init_wait_time_seconds = 0
|
13
|
-
end
|
14
|
-
@_config_fetcher = config_fetcher
|
15
|
-
@_config_cache = config_cache
|
16
|
-
@_cache_key = cache_key
|
17
|
-
@_poll_interval_seconds = poll_interval_seconds
|
18
|
-
@_max_init_wait_time_seconds = max_init_wait_time_seconds
|
19
|
-
@_on_configuration_changed_callback = on_configuration_changed_callback
|
20
|
-
@_initialized = false
|
21
|
-
@_is_running = false
|
22
|
-
@_start_time = Time.now.utc
|
23
|
-
@_lock = Concurrent::ReadWriteLock.new()
|
24
|
-
@_is_started = Concurrent::Event.new()
|
25
|
-
@thread = Thread.new{_run()}
|
26
|
-
@_is_started.wait()
|
27
|
-
end
|
28
|
-
|
29
|
-
def _run()
|
30
|
-
@_is_running = true
|
31
|
-
@_is_started.set()
|
32
|
-
loop do
|
33
|
-
force_refresh()
|
34
|
-
sleep(@_poll_interval_seconds)
|
35
|
-
break if !@_is_running
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def get()
|
40
|
-
while !@_initialized && (Time.now.utc < @_start_time + @_max_init_wait_time_seconds)
|
41
|
-
sleep(0.5)
|
42
|
-
end
|
43
|
-
begin
|
44
|
-
@_lock.acquire_read_lock()
|
45
|
-
return @_config_cache.get(@_cache_key)
|
46
|
-
ensure
|
47
|
-
@_lock.release_read_lock()
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def force_refresh()
|
52
|
-
begin
|
53
|
-
configuration_response = @_config_fetcher.get_configuration_json()
|
54
|
-
|
55
|
-
begin
|
56
|
-
@_lock.acquire_read_lock()
|
57
|
-
old_configuration = @_config_cache.get(@_cache_key)
|
58
|
-
ensure
|
59
|
-
@_lock.release_read_lock()
|
60
|
-
end
|
61
|
-
|
62
|
-
if configuration_response.is_fetched()
|
63
|
-
configuration = configuration_response.json()
|
64
|
-
if configuration != old_configuration
|
65
|
-
begin
|
66
|
-
@_lock.acquire_write_lock()
|
67
|
-
@_config_cache.set(@_cache_key, configuration)
|
68
|
-
@_initialized = true
|
69
|
-
ensure
|
70
|
-
@_lock.release_write_lock()
|
71
|
-
end
|
72
|
-
begin
|
73
|
-
if !@_on_configuration_changed_callback.equal?(nil)
|
74
|
-
@_on_configuration_changed_callback.()
|
75
|
-
end
|
76
|
-
rescue Exception => e
|
77
|
-
ConfigCat.logger.error("Exception in on_configuration_changed_callback: #{e.class}:'#{e}'")
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
if !@_initialized && !old_configuration.equal?(nil)
|
83
|
-
@_initialized = true
|
84
|
-
end
|
85
|
-
rescue Timeout::Error => e
|
86
|
-
ConfigCat.logger.error("Request timed out. Timeout values: [open: %ss, read: %ss]" %
|
87
|
-
[@_config_fetcher.get_open_timeout(), @_config_fetcher.get_read_timeout()])
|
88
|
-
rescue Exception => e
|
89
|
-
ConfigCat.logger.error("Double-check your SDK Key at https://app.configcat.com/sdkkey.")
|
90
|
-
ConfigCat.logger.error "threw exception #{e.class}:'#{e}'"
|
91
|
-
ConfigCat.logger.error "stacktrace: #{e.backtrace}"
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def stop()
|
96
|
-
@_is_running = false
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
require 'configcat/interfaces'
|
2
|
-
require 'configcat/constants'
|
3
|
-
require 'concurrent'
|
4
|
-
|
5
|
-
|
6
|
-
module ConfigCat
|
7
|
-
class LazyLoadingCachePolicy < CachePolicy
|
8
|
-
|
9
|
-
def initialize(config_fetcher, config_cache, cache_key, cache_time_to_live_seconds=60)
|
10
|
-
if cache_time_to_live_seconds < 1
|
11
|
-
cache_time_to_live_seconds = 1
|
12
|
-
end
|
13
|
-
@_config_fetcher = config_fetcher
|
14
|
-
@_config_cache = config_cache
|
15
|
-
@_cache_key = cache_key
|
16
|
-
@_cache_time_to_live = cache_time_to_live_seconds
|
17
|
-
@_lock = Concurrent::ReadWriteLock.new()
|
18
|
-
@_last_updated = nil
|
19
|
-
end
|
20
|
-
|
21
|
-
def get()
|
22
|
-
begin
|
23
|
-
@_lock.acquire_read_lock()
|
24
|
-
utc_now = Time.now.utc
|
25
|
-
if !@_last_updated.equal?(nil) && (@_last_updated + @_cache_time_to_live > utc_now)
|
26
|
-
config = @_config_cache.get(@_cache_key)
|
27
|
-
if !config.equal?(nil)
|
28
|
-
return config
|
29
|
-
end
|
30
|
-
end
|
31
|
-
ensure
|
32
|
-
@_lock.release_read_lock()
|
33
|
-
end
|
34
|
-
force_refresh()
|
35
|
-
begin
|
36
|
-
@_lock.acquire_read_lock()
|
37
|
-
config = @_config_cache.get(@_cache_key)
|
38
|
-
return config
|
39
|
-
ensure
|
40
|
-
@_lock.release_read_lock()
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def force_refresh()
|
45
|
-
begin
|
46
|
-
configuration_response = @_config_fetcher.get_configuration_json()
|
47
|
-
if configuration_response.is_fetched()
|
48
|
-
configuration = configuration_response.json()
|
49
|
-
begin
|
50
|
-
@_lock.acquire_write_lock()
|
51
|
-
@_config_cache.set(@_cache_key, configuration)
|
52
|
-
@_last_updated = Time.now.utc
|
53
|
-
ensure
|
54
|
-
@_lock.release_write_lock()
|
55
|
-
end
|
56
|
-
end
|
57
|
-
rescue StandardError => e
|
58
|
-
ConfigCat.logger.error("Double-check your SDK Key at https://app.configcat.com/sdkkey.")
|
59
|
-
ConfigCat.logger.error "threw exception #{e.class}:'#{e}'"
|
60
|
-
ConfigCat.logger.error "stacktrace: #{e.backtrace}"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def stop()
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'configcat/interfaces'
|
2
|
-
require 'configcat/constants'
|
3
|
-
require 'concurrent'
|
4
|
-
|
5
|
-
module ConfigCat
|
6
|
-
class ManualPollingCachePolicy < CachePolicy
|
7
|
-
def initialize(config_fetcher, config_cache, cache_key)
|
8
|
-
@_config_fetcher = config_fetcher
|
9
|
-
@_config_cache = config_cache
|
10
|
-
@_cache_key = cache_key
|
11
|
-
@_lock = Concurrent::ReadWriteLock.new()
|
12
|
-
end
|
13
|
-
|
14
|
-
def get()
|
15
|
-
begin
|
16
|
-
@_lock.acquire_read_lock()
|
17
|
-
config = @_config_cache.get(@_cache_key)
|
18
|
-
return config
|
19
|
-
ensure
|
20
|
-
@_lock.release_read_lock()
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def force_refresh()
|
25
|
-
begin
|
26
|
-
configuration_response = @_config_fetcher.get_configuration_json()
|
27
|
-
if configuration_response.is_fetched()
|
28
|
-
configuration = configuration_response.json()
|
29
|
-
begin
|
30
|
-
@_lock.acquire_write_lock()
|
31
|
-
@_config_cache.set(@_cache_key, configuration)
|
32
|
-
ensure
|
33
|
-
@_lock.release_write_lock()
|
34
|
-
end
|
35
|
-
end
|
36
|
-
rescue StandardError => e
|
37
|
-
ConfigCat.logger.error("Double-check your SDK Key at https://app.configcat.com/sdkkey.")
|
38
|
-
ConfigCat.logger.error "threw exception #{e.class}:'#{e}'"
|
39
|
-
ConfigCat.logger.error "stacktrace: #{e.backtrace}"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def stop()
|
44
|
-
# pass
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|