rox-rollout 4.1.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.circleci/config.yml +51 -23
- data/.editorconfig +12 -0
- data/.github/workflows/ruby.yml +20 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +17 -0
- data/Gemfile +2 -2
- data/README.md +32 -0
- data/Rakefile +12 -9
- data/bin/console +3 -4
- data/e2e-server/run_server.sh +12 -0
- data/e2e-server/server.rb +158 -0
- data/e2e/container.rb +11 -14
- data/e2e/custom_props.rb +9 -9
- data/e2e/rox_e2e_test.rb +18 -20
- data/e2e/test_vars.rb +3 -6
- data/example/local.rb +40 -0
- data/lib/rox/core/analytics.rb +18 -0
- data/lib/rox/core/client/buid.rb +9 -44
- data/lib/rox/core/client/device_properties.rb +8 -2
- data/lib/rox/core/client/dynamic_api.rb +53 -15
- data/lib/rox/core/client/internal_flags.rb +14 -2
- data/lib/rox/core/client/sdk_settings.rb +1 -1
- data/lib/rox/core/configuration/configuration.rb +1 -1
- data/lib/rox/core/configuration/configuration_fetched_args.rb +2 -2
- data/lib/rox/core/configuration/configuration_fetched_invoker.rb +8 -3
- data/lib/rox/core/configuration/configuration_parser.rb +39 -38
- data/lib/rox/core/configuration/fetcher_error.rb +1 -1
- data/lib/rox/core/configuration/fetcher_status.rb +1 -1
- data/lib/rox/core/configuration/models/experiment_model.rb +1 -1
- data/lib/rox/core/configuration/models/target_group_model.rb +1 -1
- data/lib/rox/core/consts/build.rb +3 -3
- data/lib/rox/core/consts/environment.rb +34 -10
- data/lib/rox/core/consts/property_type.rb +18 -17
- data/lib/rox/core/context/merged_context.rb +2 -1
- data/lib/rox/core/core.rb +101 -33
- data/lib/rox/core/entities/default_flag_values.rb +10 -0
- data/lib/rox/core/entities/flag.rb +22 -7
- data/lib/rox/core/entities/flag_setter.rb +6 -6
- data/lib/rox/core/entities/rox_double.rb +11 -0
- data/lib/rox/core/entities/rox_int.rb +11 -0
- data/lib/rox/core/entities/{variant.rb → rox_string.rb} +20 -13
- data/lib/rox/core/error_handling/exception_trigger.rb +10 -0
- data/lib/rox/core/error_handling/userspace_handler_exception.rb +12 -0
- data/lib/rox/core/error_handling/userspace_unhandled_error_invoker.rb +41 -0
- data/lib/rox/core/impression/impression_args.rb +2 -2
- data/lib/rox/core/impression/impression_invoker.rb +41 -7
- data/lib/rox/core/impression/models/experiment.rb +1 -1
- data/lib/rox/core/impression/models/reporting_value.rb +10 -2
- data/lib/rox/core/logging/logging.rb +3 -3
- data/lib/rox/core/logging/no_op_logger.rb +1 -1
- data/lib/rox/core/network/configuration_fetch_result.rb +1 -1
- data/lib/rox/core/network/configuration_fetcher.rb +9 -8
- data/lib/rox/core/network/configuration_fetcher_base.rb +1 -1
- data/lib/rox/core/network/configuration_fetcher_roxy.rb +4 -4
- data/lib/rox/core/network/configuration_fetcher_self_managed.rb +30 -0
- data/lib/rox/core/network/configuration_source.rb +1 -1
- data/lib/rox/core/network/request.rb +3 -3
- data/lib/rox/core/network/request_configuration_builder.rb +12 -9
- data/lib/rox/core/network/request_data.rb +1 -1
- data/lib/rox/core/network/response.rb +20 -4
- data/lib/rox/core/network/state_sender.rb +146 -0
- data/lib/rox/core/notifications/notification_listener.rb +4 -4
- data/lib/rox/core/properties/custom_property.rb +1 -1
- data/lib/rox/core/properties/custom_property_type.rb +1 -1
- data/lib/rox/core/properties/device_property.rb +2 -2
- data/lib/rox/core/properties/property_factory.rb +132 -0
- data/lib/rox/core/register/registerer.rb +13 -12
- data/lib/rox/core/reporting/error_reporter.rb +14 -13
- data/lib/rox/core/repositories/custom_property_repository.rb +1 -1
- data/lib/rox/core/repositories/experiment_repository.rb +2 -4
- data/lib/rox/core/repositories/flag_repository.rb +8 -8
- data/lib/rox/core/repositories/roxx/experiments_extensions.rb +8 -8
- data/lib/rox/core/repositories/roxx/properties_extensions.rb +32 -7
- data/lib/rox/core/repositories/target_group_repository.rb +2 -4
- data/lib/rox/core/roxx/evaluation_result.rb +2 -0
- data/lib/rox/core/roxx/node.rb +1 -1
- data/lib/rox/core/roxx/parser.rb +46 -20
- data/lib/rox/core/roxx/regular_expression_extensions.rb +6 -3
- data/lib/rox/core/roxx/string_tokenizer.rb +3 -1
- data/lib/rox/core/roxx/symbols.rb +1 -1
- data/lib/rox/core/roxx/token_type.rb +1 -1
- data/lib/rox/core/roxx/tokenized_expression.rb +16 -12
- data/lib/rox/core/roxx/value_compare_extensions.rb +49 -29
- data/lib/rox/core/security/signature_verifier.rb +3 -3
- data/lib/rox/core/security/signature_verifier_mock.rb +12 -0
- data/lib/rox/core/utils/debouncer.rb +18 -0
- data/lib/rox/core/utils/type_utils.rb +1 -1
- data/lib/rox/server/client/sdk_settings.rb +1 -1
- data/lib/rox/server/client/server_properties.rb +1 -1
- data/lib/rox/server/flags/normalize_flag_type.rb +25 -0
- data/lib/rox/server/flags/rox_double.rb +8 -0
- data/lib/rox/server/flags/rox_flag.rb +1 -1
- data/lib/rox/server/flags/rox_int.rb +8 -0
- data/lib/rox/server/flags/rox_string.rb +8 -0
- data/lib/rox/server/flags/server_entities_provider.rb +14 -4
- data/lib/rox/server/logging/server_logger.rb +2 -2
- data/lib/rox/server/rox_options.rb +39 -8
- data/lib/rox/server/rox_server.rb +81 -60
- data/lib/rox/version.rb +1 -1
- data/rox.gemspec +13 -9
- metadata +95 -36
- data/README_DEVELOP.md +0 -19
- data/_archive/.document +0 -5
- data/_archive/.rspec +0 -1
- data/_archive/Gemfile +0 -15
- data/_archive/Gemfile.lock +0 -87
- data/_archive/README.md +0 -32
- data/_archive/README.rdoc +0 -19
- data/_archive/Rakefile +0 -50
- data/_archive/lib/expr_function_definition.rb +0 -52
- data/_archive/lib/function_definition.rb +0 -48
- data/_archive/lib/function_token.rb +0 -12
- data/_archive/lib/object_extends.rb +0 -12
- data/_archive/lib/ruby_interpreter.rb +0 -292
- data/_archive/lib/stack.rb +0 -48
- data/_archive/lib/string_extends.rb +0 -14
- data/_archive/spec/ruby_interpreter_spec.rb +0 -203
- data/_archive/spec/spec_helper.rb +0 -30
- data/_archive/spec/stack_spec.rb +0 -77
- data/lib/rox/server/flags/rox_variant.rb +0 -8
@@ -6,11 +6,14 @@ module Rox
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def extend
|
9
|
-
@parser.add_operator('match') do |
|
9
|
+
@parser.add_operator('match') do |_parser, stack, _context|
|
10
10
|
text = stack.pop
|
11
11
|
pattern = stack.pop
|
12
12
|
flags = stack.pop
|
13
|
-
|
13
|
+
unless text.is_a?(String) && pattern.is_a?(String) && flags.is_a?(String)
|
14
|
+
raise ArgumentError,
|
15
|
+
'should be string'
|
16
|
+
end
|
14
17
|
|
15
18
|
options = 0
|
16
19
|
flags.each_char do |flag|
|
@@ -30,4 +33,4 @@ module Rox
|
|
30
33
|
end
|
31
34
|
end
|
32
35
|
end
|
33
|
-
end
|
36
|
+
end
|
@@ -17,6 +17,7 @@ module Rox
|
|
17
17
|
while !@ret_delims && position < @max_position
|
18
18
|
c = @text[position]
|
19
19
|
break unless delimiter?(c)
|
20
|
+
|
20
21
|
position += 1
|
21
22
|
end
|
22
23
|
position
|
@@ -27,6 +28,7 @@ module Rox
|
|
27
28
|
while position < @max_position
|
28
29
|
c = @text[position]
|
29
30
|
break if delimiter?(c)
|
31
|
+
|
30
32
|
position += 1
|
31
33
|
end
|
32
34
|
|
@@ -65,4 +67,4 @@ module Rox
|
|
65
67
|
end
|
66
68
|
end
|
67
69
|
end
|
68
|
-
end
|
70
|
+
end
|
@@ -49,7 +49,8 @@ module Rox
|
|
49
49
|
@dict_key = nil
|
50
50
|
|
51
51
|
delimiters_to_use = TokenizedExpression::TOKEN_DELIMITERS
|
52
|
-
normalized_expression = expression.gsub(TokenizedExpression::ESCAPED_QUOTE,
|
52
|
+
normalized_expression = expression.gsub(TokenizedExpression::ESCAPED_QUOTE,
|
53
|
+
TokenizedExpression::ESCAPED_QUOTE_PLACEHOLDER)
|
53
54
|
tokenizer = StringTokenizer.new(normalized_expression, delimiters_to_use, true)
|
54
55
|
|
55
56
|
token = nil
|
@@ -71,14 +72,16 @@ module Rox
|
|
71
72
|
@array_accumulator = nil
|
72
73
|
push_node(node_from_array(array_result))
|
73
74
|
elsif token == TokenizedExpression::STRING_DELIMITER
|
74
|
-
|
75
|
-
|
76
|
-
else
|
77
|
-
if delimiters_to_use == TokenizedExpression::STRING_DELIMITER
|
78
|
-
push_node(Node.new(NodeTypes::RAND, token.gsub(TokenizedExpression::ESCAPED_QUOTE_PLACEHOLDER, TokenizedExpression::ESCAPED_QUOTE)))
|
79
|
-
elsif !TokenizedExpression::TOKEN_DELIMITERS.include?(token) && token != TokenizedExpression::PRE_POST_STRING_CHAR
|
80
|
-
push_node(node_from_token(token))
|
75
|
+
if prev_token == TokenizedExpression::STRING_DELIMITER
|
76
|
+
push_node(node_from_token(Symbols::ROXX_EMPTY_STRING))
|
81
77
|
end
|
78
|
+
delimiters_to_use = in_string ? TokenizedExpression::TOKEN_DELIMITERS : TokenizedExpression::STRING_DELIMITER
|
79
|
+
elsif delimiters_to_use == TokenizedExpression::STRING_DELIMITER
|
80
|
+
push_node(Node.new(NodeTypes::RAND,
|
81
|
+
token.gsub(TokenizedExpression::ESCAPED_QUOTE_PLACEHOLDER,
|
82
|
+
TokenizedExpression::ESCAPED_QUOTE)))
|
83
|
+
elsif !TokenizedExpression::TOKEN_DELIMITERS.include?(token) && token != TokenizedExpression::PRE_POST_STRING_CHAR
|
84
|
+
push_node(node_from_token(token))
|
82
85
|
end
|
83
86
|
end
|
84
87
|
|
@@ -100,15 +103,16 @@ module Rox
|
|
100
103
|
return Node.new(NodeTypes::RAND, TokenType::UNDEFINED) if token == Symbols::ROXX_UNDEFINED
|
101
104
|
|
102
105
|
token_type = TokenType.from_token(token)
|
103
|
-
return Node.new(NodeTypes::RAND, token[1...-
|
106
|
+
return Node.new(NodeTypes::RAND, token[1...-2]) if token_type == TokenType::STRING
|
107
|
+
|
104
108
|
if token_type == TokenType::NUMBER
|
105
109
|
begin
|
106
110
|
return Node.new(NodeTypes::RAND, Integer(token))
|
107
111
|
rescue ArgumentError
|
108
112
|
begin
|
109
113
|
return Node.new(NodeTypes::RAND, Float(token))
|
110
|
-
rescue ArgumentError =>
|
111
|
-
raise ArgumentError, "Excepted Number, got '#{token}' (#{token_type}): #{
|
114
|
+
rescue ArgumentError => e
|
115
|
+
raise ArgumentError, "Excepted Number, got '#{token}' (#{token_type}): #{e}"
|
112
116
|
end
|
113
117
|
end
|
114
118
|
end
|
@@ -116,4 +120,4 @@ module Rox
|
|
116
120
|
end
|
117
121
|
end
|
118
122
|
end
|
119
|
-
end
|
123
|
+
end
|
@@ -6,47 +6,67 @@ module Rox
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def extend
|
9
|
-
@parser.add_operator('lt') do |
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
@parser.add_operator('lt') do |_parser, stack, _context|
|
10
|
+
begin
|
11
|
+
op1 = stack.pop.to_f
|
12
|
+
op2 = stack.pop.to_f
|
13
13
|
stack.push(op1 < op2)
|
14
|
-
|
14
|
+
rescue StandardError
|
15
15
|
stack.push(false)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
@parser.add_operator('lte') do |
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
@parser.add_operator('lte') do |_parser, stack, _context|
|
20
|
+
begin
|
21
|
+
op1 = stack.pop.to_f
|
22
|
+
op2 = stack.pop.to_f
|
23
23
|
stack.push(op1 <= op2)
|
24
|
-
|
24
|
+
rescue StandardError
|
25
25
|
stack.push(false)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
@parser.add_operator('gt') do |
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
@parser.add_operator('gt') do |_parser, stack, _context|
|
30
|
+
begin
|
31
|
+
op1 = stack.pop.to_f
|
32
|
+
op2 = stack.pop.to_f
|
33
33
|
stack.push(op1 > op2)
|
34
|
-
|
34
|
+
rescue StandardError
|
35
35
|
stack.push(false)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
@parser.add_operator('gte') do |
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
@parser.add_operator('gte') do |_parser, stack, _context|
|
40
|
+
begin
|
41
|
+
op1 = stack.pop.to_f
|
42
|
+
op2 = stack.pop.to_f
|
43
43
|
stack.push(op1 >= op2)
|
44
|
-
|
44
|
+
rescue StandardError
|
45
|
+
stack.push(false)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
@parser.add_operator('numne') do |_parser, stack, _context|
|
50
|
+
begin
|
51
|
+
op1 = stack.pop.to_f
|
52
|
+
op2 = stack.pop.to_f
|
53
|
+
stack.push(op1 != op2)
|
54
|
+
rescue StandardError
|
55
|
+
stack.push(false)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
@parser.add_operator('numeq') do |_parser, stack, _context|
|
60
|
+
begin
|
61
|
+
op1 = stack.pop.to_f
|
62
|
+
op2 = stack.pop.to_f
|
63
|
+
stack.push(op1 == op2)
|
64
|
+
rescue StandardError
|
45
65
|
stack.push(false)
|
46
66
|
end
|
47
67
|
end
|
48
68
|
|
49
|
-
@parser.add_operator('semverNe') do |
|
69
|
+
@parser.add_operator('semverNe') do |_parser, stack, _context|
|
50
70
|
op1 = stack.pop
|
51
71
|
op2 = stack.pop
|
52
72
|
if op1.is_a?(String) && op2.is_a?(String)
|
@@ -57,7 +77,7 @@ module Rox
|
|
57
77
|
end
|
58
78
|
end
|
59
79
|
|
60
|
-
@parser.add_operator('semverEq') do |
|
80
|
+
@parser.add_operator('semverEq') do |_parser, stack, _context|
|
61
81
|
op1 = stack.pop
|
62
82
|
op2 = stack.pop
|
63
83
|
if op1.is_a?(String) && op2.is_a?(String)
|
@@ -68,7 +88,7 @@ module Rox
|
|
68
88
|
end
|
69
89
|
end
|
70
90
|
|
71
|
-
@parser.add_operator('semverLt') do |
|
91
|
+
@parser.add_operator('semverLt') do |_parser, stack, _context|
|
72
92
|
op1 = stack.pop
|
73
93
|
op2 = stack.pop
|
74
94
|
if op1.is_a?(String) && op2.is_a?(String)
|
@@ -79,7 +99,7 @@ module Rox
|
|
79
99
|
end
|
80
100
|
end
|
81
101
|
|
82
|
-
@parser.add_operator('semverLte') do |
|
102
|
+
@parser.add_operator('semverLte') do |_parser, stack, _context|
|
83
103
|
op1 = stack.pop
|
84
104
|
op2 = stack.pop
|
85
105
|
if op1.is_a?(String) && op2.is_a?(String)
|
@@ -90,7 +110,7 @@ module Rox
|
|
90
110
|
end
|
91
111
|
end
|
92
112
|
|
93
|
-
@parser.add_operator('semverGt') do |
|
113
|
+
@parser.add_operator('semverGt') do |_parser, stack, _context|
|
94
114
|
op1 = stack.pop
|
95
115
|
op2 = stack.pop
|
96
116
|
if op1.is_a?(String) && op2.is_a?(String)
|
@@ -101,7 +121,7 @@ module Rox
|
|
101
121
|
end
|
102
122
|
end
|
103
123
|
|
104
|
-
@parser.add_operator('semverGte') do |
|
124
|
+
@parser.add_operator('semverGte') do |_parser, stack, _context|
|
105
125
|
op1 = stack.pop
|
106
126
|
op2 = stack.pop
|
107
127
|
if op1.is_a?(String) && op2.is_a?(String)
|
@@ -123,15 +143,15 @@ module Rox
|
|
123
143
|
return [version1, version2] if segment_count1 == segment_count2
|
124
144
|
|
125
145
|
if segment_count1 < segment_count2
|
126
|
-
version1 += '.0' * (segment_count2 - segment_count1)
|
146
|
+
version1 += "#{'.0' * (segment_count2 - segment_count1)}.0"
|
127
147
|
version2 += '.1'
|
128
148
|
else
|
129
149
|
version1 += '.1'
|
130
|
-
version2 += '.0' * (segment_count1 - segment_count2)
|
150
|
+
version2 += "#{'.0' * (segment_count1 - segment_count2)}.0"
|
131
151
|
end
|
132
152
|
|
133
153
|
[version1, version2]
|
134
154
|
end
|
135
155
|
end
|
136
156
|
end
|
137
|
-
end
|
157
|
+
end
|
@@ -4,15 +4,15 @@ require 'openssl'
|
|
4
4
|
module Rox
|
5
5
|
module Core
|
6
6
|
class SignatureVerifier
|
7
|
-
ROX_CERTIFICATE_BASE64 = 'MIIDWDCCAkACCQDR039HDUMyzTANBgkqhkiG9w0BAQUFADBuMQswCQYDVQQHEwJjYTETMBEGA1UEChMKcm9sbG91dC5pbzERMA8GA1UECxMIc2VjdXJpdHkxFzAVBgNVBAMTDnd3dy5yb2xsb3V0LmlvMR4wHAYJKoZIhvcNAQkBFg9leWFsQHJvbGxvdXQuaW8wHhcNMTQwODE4MDkzNjAyWhcNMjQwODE1MDkzNjAyWjBuMQswCQYDVQQHEwJjYTETMBEGA1UEChMKcm9sbG91dC5pbzERMA8GA1UECxMIc2VjdXJpdHkxFzAVBgNVBAMTDnd3dy5yb2xsb3V0LmlvMR4wHAYJKoZIhvcNAQkBFg9leWFsQHJvbGxvdXQuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDq8GMRFLyaQVDEdcHlYm7NnGrAqhLP2E/27W21yTQein7r8FOT/7jJ0PLpcGLw/3zDT5wzIJ3OtFy4HWre2hn7wmt+bI+bbS/9kKrmqkpjAj1+PwnB4lhEad27lolMCuz5purqi209k7q51IMdfq0/Ot7P/Bmp+LBNs2F4jMsPYxZUUYkVTAmPqgnwxuWoJZan/OGNjtj9OGg8eOcOfcyxC4GDR/Yail+kht4I/HHesSXVukqXntsbdgnXKFkX682TuFPc3pd8ly+6N6OSWpbNV8UmEVZygnxWT3vxBT2TWvFexbW52KOFY91wIkjt+IPEMPJBPPDiN9J2nuttvfMpAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAIXrD6YsIhZa6fYDAR8huP0V3BRwMKjeLGLCXLzvuPaoQGDhn4RJNgz3leNcomIkV/AwneeS9BXgBAcEKjNeLD+nW58RSRnAfxDT5cUtQgIeR6dFmEK05u+8j/cK3VO410xr0taNMbmJfEn07WjfCdcJS3hsGJuVmEUC85KYznbIcafQMGklLYArXYVnR3XKqzxcLohSPX99weujH5wt78Zy3pXxuYCDETwhgcCYCQaZz7mpvtSOub3JQT+Ir5cBSdyI1oPI2dIamUL5+ntTyll/1rbYj83qREw8PKA9Q0KIIgfpggy19TS9zknwOLz44wRdLyT2tFoaiRqHvm6JKaA='
|
7
|
+
ROX_CERTIFICATE_BASE64 = 'MIIDWDCCAkACCQDR039HDUMyzTANBgkqhkiG9w0BAQUFADBuMQswCQYDVQQHEwJjYTETMBEGA1UEChMKcm9sbG91dC5pbzERMA8GA1UECxMIc2VjdXJpdHkxFzAVBgNVBAMTDnd3dy5yb2xsb3V0LmlvMR4wHAYJKoZIhvcNAQkBFg9leWFsQHJvbGxvdXQuaW8wHhcNMTQwODE4MDkzNjAyWhcNMjQwODE1MDkzNjAyWjBuMQswCQYDVQQHEwJjYTETMBEGA1UEChMKcm9sbG91dC5pbzERMA8GA1UECxMIc2VjdXJpdHkxFzAVBgNVBAMTDnd3dy5yb2xsb3V0LmlvMR4wHAYJKoZIhvcNAQkBFg9leWFsQHJvbGxvdXQuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDq8GMRFLyaQVDEdcHlYm7NnGrAqhLP2E/27W21yTQein7r8FOT/7jJ0PLpcGLw/3zDT5wzIJ3OtFy4HWre2hn7wmt+bI+bbS/9kKrmqkpjAj1+PwnB4lhEad27lolMCuz5purqi209k7q51IMdfq0/Ot7P/Bmp+LBNs2F4jMsPYxZUUYkVTAmPqgnwxuWoJZan/OGNjtj9OGg8eOcOfcyxC4GDR/Yail+kht4I/HHesSXVukqXntsbdgnXKFkX682TuFPc3pd8ly+6N6OSWpbNV8UmEVZygnxWT3vxBT2TWvFexbW52KOFY91wIkjt+IPEMPJBPPDiN9J2nuttvfMpAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAIXrD6YsIhZa6fYDAR8huP0V3BRwMKjeLGLCXLzvuPaoQGDhn4RJNgz3leNcomIkV/AwneeS9BXgBAcEKjNeLD+nW58RSRnAfxDT5cUtQgIeR6dFmEK05u+8j/cK3VO410xr0taNMbmJfEn07WjfCdcJS3hsGJuVmEUC85KYznbIcafQMGklLYArXYVnR3XKqzxcLohSPX99weujH5wt78Zy3pXxuYCDETwhgcCYCQaZz7mpvtSOub3JQT+Ir5cBSdyI1oPI2dIamUL5+ntTyll/1rbYj83qREw8PKA9Q0KIIgfpggy19TS9zknwOLz44wRdLyT2tFoaiRqHvm6JKaA='.freeze
|
8
8
|
|
9
9
|
def verify(data, signature_base64)
|
10
10
|
certificate_bytes = Base64.decode64(SignatureVerifier::ROX_CERTIFICATE_BASE64)
|
11
11
|
cert = OpenSSL::X509::Certificate.new certificate_bytes
|
12
12
|
rsa = cert.public_key
|
13
13
|
signature_bytes = Base64.decode64(signature_base64)
|
14
|
-
rsa.verify(OpenSSL::Digest
|
14
|
+
rsa.verify(OpenSSL::Digest.new('SHA256'), signature_bytes, data)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
18
|
-
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Debouncer
|
2
|
+
def initialize(delay_in_seconds, block)
|
3
|
+
@delay_in_seconds = delay_in_seconds
|
4
|
+
@block = block
|
5
|
+
@delay_until = Time.now
|
6
|
+
end
|
7
|
+
|
8
|
+
def call
|
9
|
+
now = Time.now
|
10
|
+
if now > @delay_until
|
11
|
+
@delay_until = now + @delay_in_seconds
|
12
|
+
Thread.new do
|
13
|
+
sleep(@delay_in_seconds)
|
14
|
+
@block.call
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Rox
|
2
|
+
module Server
|
3
|
+
class NormalizeFlagType
|
4
|
+
def self.normalize_string(string_value)
|
5
|
+
string_value
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.normalize_int(string_value)
|
9
|
+
Integer(string_value)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.normalize_float(string_value)
|
13
|
+
Float(string_value)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.normalize_boolean(string_value)
|
17
|
+
if string_value.is_a?(Boolean)
|
18
|
+
string_value
|
19
|
+
else
|
20
|
+
string_value == 'True'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'rox/server/flags/rox_flag'
|
2
|
-
require 'rox/server/flags/
|
2
|
+
require 'rox/server/flags/rox_string'
|
3
|
+
require 'rox/server/flags/rox_int'
|
4
|
+
require 'rox/server/flags/rox_double'
|
3
5
|
|
4
6
|
module Rox
|
5
7
|
module Server
|
@@ -8,9 +10,17 @@ module Rox
|
|
8
10
|
Rox::Server::RoxFlag.new(default_value)
|
9
11
|
end
|
10
12
|
|
11
|
-
def
|
12
|
-
Rox::Server::
|
13
|
+
def create_string(default_value, options)
|
14
|
+
Rox::Server::RoxString.new(default_value, options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_int(default_value, options)
|
18
|
+
Rox::Server::RoxInt.new(default_value, options)
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_double(default_value, options)
|
22
|
+
Rox::Server::RoxDouble.new(default_value, options)
|
13
23
|
end
|
14
24
|
end
|
15
25
|
end
|
16
|
-
end
|
26
|
+
end
|