openfeature-go-feature-flag-provider 0.1.7 → 0.1.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f77c6e14ebd429606e0f754c034e740fa5b201d33a2e060417c06d63ff1200c
4
- data.tar.gz: c3066c5d408e51eec86d06e288fc461934767815d244a95ad758363e97b9bcbd
3
+ metadata.gz: ddfe59a26f6cb77f15f337d09960c06d01f35465e388c39a3b06603f36c0f573
4
+ data.tar.gz: 7598fabc63d82fa717b8dd388a1ccd4825db1a71e86aa5d92161eb704751616f
5
5
  SHA512:
6
- metadata.gz: f70df57dbf0442f9058aad26a15cb3908022dafb87af3d7b195cb66d82866898579da0f0a771c3ffd793bbe283b796a693912b3ab25e41674ccc86367f023cf1
7
- data.tar.gz: 44d1b3d4c43eee840b6d6c81f7f665df065a2e3af135d9fd43cece06fa567244991bb9781bdd64c6cdeb34e66a14a044993a3adfd8ff5d42a52785299d27e51b
6
+ metadata.gz: ab45b781c719f2f037677808d3fce03e49dbe683f9c33acdc52065e79ccc0b81a428f642bc55310ffef543f54dbea1e530665954f8a0b714df052f8ba6dbcdc2
7
+ data.tar.gz: 1c831f1f4a7015fd811111fc91d6f1055a9feb032771be4b87c467edba901f3d4aff394c22d9dc9966ad3ec0cd18feeafc087d547534946e86fc424810128374
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.8](https://github.com/open-feature/ruby-sdk-contrib/compare/openfeature-go-feature-flag-provider/v0.1.7...openfeature-go-feature-flag-provider/v0.1.8) (2026-01-13)
4
+
5
+
6
+ ### 🐛 Bug Fixes
7
+
8
+ * Make goff unix socket client thread safe ([#74](https://github.com/open-feature/ruby-sdk-contrib/issues/74)) ([ec25c37](https://github.com/open-feature/ruby-sdk-contrib/commit/ec25c3787b108ed2af8d7f1c9efbd6a258870a21))
9
+
3
10
  ## [0.1.7](https://github.com/open-feature/ruby-sdk-contrib/compare/openfeature-go-feature-flag-provider/v0.1.6...openfeature-go-feature-flag-provider/v0.1.7) (2025-11-19)
4
11
 
5
12
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openfeature-go-feature-flag-provider (0.1.7)
4
+ openfeature-go-feature-flag-provider (0.1.8)
5
5
  faraday-net_http_persistent (~> 2.3)
6
6
  openfeature-sdk (~> 0.3.1)
7
7
 
@@ -24,8 +24,20 @@ module OpenFeature
24
24
  {"Content-Type" => "application/json"}.merge(@custom_headers || {})
25
25
  end
26
26
 
27
+ def evaluation_request(evaluation_context)
28
+ ctx = evaluation_context || OpenFeature::SDK::EvaluationContext.new
29
+ fields = ctx.fields.dup
30
+ # replace targeting_key by targetingKey without mutating original fields
31
+ fields["targetingKey"] = ctx.targeting_key
32
+ fields.delete("targeting_key")
33
+
34
+ {context: fields}
35
+ end
36
+
27
37
  def check_retry_after
28
- unless @retry_after.nil?
38
+ lock = (@retry_lock ||= Mutex.new)
39
+ lock.synchronize do
40
+ return if @retry_after.nil?
29
41
  if Time.now < @retry_after
30
42
  raise OpenFeature::GoFeatureFlag::RateLimited.new(nil)
31
43
  else
@@ -109,12 +121,18 @@ module OpenFeature
109
121
  return nil if retry_after.nil?
110
122
 
111
123
  begin
112
- @retry_after = if /^\d+$/.match?(retry_after)
113
- # Retry-After is in seconds
114
- Time.now + Integer(retry_after)
115
- else
116
- # Retry-After is an HTTP-date
117
- Time.httpdate(retry_after)
124
+ next_retry_time =
125
+ if /^\d+$/.match?(retry_after)
126
+ # Retry-After is in seconds
127
+ Time.now + Integer(retry_after)
128
+ else
129
+ # Retry-After is an HTTP-date
130
+ Time.httpdate(retry_after)
131
+ end
132
+ # Protect updates and never shorten an existing backoff window
133
+ lock = (@retry_lock ||= Mutex.new)
134
+ lock.synchronize do
135
+ @retry_after = [@retry_after, next_retry_time].compact.max
118
136
  end
119
137
  rescue ArgumentError
120
138
  # ignore invalid Retry-After header
@@ -19,13 +19,10 @@ module OpenFeature
19
19
 
20
20
  def evaluate_ofrep_api(flag_key:, evaluation_context:)
21
21
  check_retry_after
22
- evaluation_context = OpenFeature::SDK::EvaluationContext.new if evaluation_context.nil?
23
- # replace targeting_key by targetingKey
24
- evaluation_context.fields["targetingKey"] = evaluation_context.targeting_key
25
- evaluation_context.fields.delete("targeting_key")
22
+ request = evaluation_request(evaluation_context)
26
23
 
27
24
  response = @faraday_connection.post("/ofrep/v1/evaluate/flags/#{flag_key}") do |req|
28
- req.body = {context: evaluation_context.fields}.to_json
25
+ req.body = request.to_json
29
26
  end
30
27
 
31
28
  case response.status
@@ -7,21 +7,17 @@ module OpenFeature
7
7
  module GoFeatureFlag
8
8
  module Client
9
9
  class UnixApi < Common
10
- attr_accessor :socket
11
-
12
- def initialize(endpoint: nil, custom_headers: nil)
10
+ def initialize(endpoint: nil, custom_headers: nil, unix_socket_client_factory: nil)
13
11
  @custom_headers = custom_headers
14
- @socket = HttpUnix.new(endpoint)
12
+ @endpoint = endpoint
13
+ @unix_socket_client_factory = unix_socket_client_factory || ->(ep) { HttpUnix.new(ep) }
15
14
  end
16
15
 
17
16
  def evaluate_ofrep_api(flag_key:, evaluation_context:)
18
17
  check_retry_after
19
- evaluation_context = OpenFeature::SDK::EvaluationContext.new if evaluation_context.nil?
20
- # replace targeting_key by targetingKey
21
- evaluation_context.fields["targetingKey"] = evaluation_context.targeting_key
22
- evaluation_context.fields.delete("targeting_key")
23
18
 
24
- response = @socket.post("/ofrep/v1/evaluate/flags/#{flag_key}", {context: evaluation_context.fields}, headers)
19
+ request = evaluation_request(evaluation_context)
20
+ response = thread_local_socket.post("/ofrep/v1/evaluate/flags/#{flag_key}", request, headers)
25
21
 
26
22
  case response.code
27
23
  when "200"
@@ -39,6 +35,13 @@ module OpenFeature
39
35
  raise OpenFeature::GoFeatureFlag::InternalServerError.new(response)
40
36
  end
41
37
  end
38
+
39
+ private
40
+
41
+ def thread_local_socket
42
+ key = "openfeature_goff_unix_socket_#{object_id}"
43
+ Thread.current[key] ||= @unix_socket_client_factory.call(@endpoint)
44
+ end
42
45
  end
43
46
  end
44
47
  end
@@ -1,5 +1,5 @@
1
1
  module OpenFeature
2
2
  module GoFeatureFlag
3
- GO_FEATURE_FLAG_PROVIDER_VERSION = "0.1.7"
3
+ GO_FEATURE_FLAG_PROVIDER_VERSION = "0.1.8"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openfeature-go-feature-flag-provider
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Poignant
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-11-19 00:00:00.000000000 Z
11
+ date: 2026-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: openfeature-sdk