fetch-api 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4217a0ddb4ec43da71a630ba5de24d9a6a02af0f5cf2b39286702c1cc512c699
4
- data.tar.gz: 05abc4f266fab3577c2223de54957b8c6a84e7b3ccc24df428f40e771c1e311d
3
+ metadata.gz: eb43f07388e02a5f1ec3ccf700a634962896b68e8de60c402aacfe078499dc06
4
+ data.tar.gz: 228e63fa8ba87bdb73f4ed82dd92af70724bb5e3c0a10c2be1849bba3752b846
5
5
  SHA512:
6
- metadata.gz: c7caa0c96f93f03ae799a121fc7f25410f401c9c192a7546f97627c760cb638627b79d01b0911ed8a4f2ebaacdaa619e86e84a2b88443a721f066a4a9fd4c1d9
7
- data.tar.gz: 826e3c4ff75b7b3c3f0886949a6fe141cdd360fd31da86b42b08aabde98b0a608ac6f51561b65819b65622a1a2f344f5e6784505bafb990d0aad300ac8f378b6
6
+ metadata.gz: 99785c3983dbf1e311e3e845ad92a41791af9089b1ecf349973e5a3a14159b1ec855b07c16f46980248b1f8375d3761fd6696cebde999763053a178117257510
7
+ data.tar.gz: 6c969cd4edfc77256e960cab56d7fe9db4a345f754e811e278b18d27900c393625ead267a566abb4334e743270b181ac9921fdfdc51f45f715da8f8701ed28cb
data/README.md CHANGED
@@ -110,8 +110,8 @@ These values can be configured as follows (in seconds):
110
110
 
111
111
  ``` ruby
112
112
  Fetch.configure do |config|
113
- config.max_idle_time = 10 # default
114
- config.keep_alive_timeout = 2 # default
113
+ config.max_idle_time = 30 # default
114
+ config.keep_alive_timeout = 15 # default
115
115
  end
116
116
  ```
117
117
 
data/lib/fetch/client.rb CHANGED
@@ -51,7 +51,7 @@ module Fetch
51
51
  # @type var location: String
52
52
  location = res['Location']
53
53
 
54
- fetch(location, method:, headers:, body:, redirect:, _redirected: true) # steep:ignore ArgumentTypeMismatch
54
+ fetch(location, method:, headers:, body:, redirect:, _redirected: true)
55
55
  when 'error'
56
56
  raise RedirectError, "redirected to #{res['Location']}"
57
57
  when 'manual'
@@ -4,76 +4,67 @@ require 'thread'
4
4
 
5
5
  module Fetch
6
6
  class ConnectionPool
7
- Entry = Struct.new(:connection, :in_use, :last_used, keyword_init: true)
8
-
9
7
  def initialize
10
8
  @connections = {}
11
9
  @mutex = Mutex.new
12
10
 
13
11
  @sweeper = Thread.new {
14
12
  loop do
15
- sleep 1
16
13
  sweep
17
14
 
18
- Thread.stop if @connections.empty?
15
+ if @connections.empty?
16
+ Thread.stop
17
+ else
18
+ sleep 1
19
+ end
19
20
  end
20
21
  }
21
22
  end
22
23
 
23
24
  def with_connection(uri, &block)
24
- conn = acquire(uri)
25
+ conn = checkout(uri)
25
26
 
26
27
  begin
27
28
  block.call(conn)
28
29
  ensure
29
- release uri
30
+ checkin uri, conn
30
31
  end
31
32
  end
32
33
 
33
34
  private
34
35
 
35
- def acquire(uri)
36
- @mutex.synchronize {
37
- entry = @connections[uri.origin]
38
-
39
- if entry
40
- entry.in_use = true
41
-
42
- entry.connection
43
- else
44
- # @type var host: String
45
- host = uri.host
46
-
47
- Net::HTTP.new(host, uri.port).tap {|http|
48
- http.use_ssl = uri.scheme == 'https'
49
- http.keep_alive_timeout = Fetch.config.keep_alive_timeout
50
-
51
- http.start
52
-
53
- @connections[uri.origin] = Entry.new(connection: http, in_use: true)
54
- }
55
- end
56
- }.tap {
57
- @sweeper.wakeup
58
- }
36
+ def checkout(uri)
37
+ if entry = @mutex.synchronize { @connections.delete(uri.origin) }
38
+ entry.first
39
+ else
40
+ # @type var host: String
41
+ host = uri.host
42
+
43
+ Net::HTTP.new(host, uri.port).tap {|http|
44
+ http.use_ssl = uri.scheme == 'https'
45
+ http.keep_alive_timeout = Fetch.config.keep_alive_timeout
46
+ http.start
47
+ }
48
+ end
59
49
  end
60
50
 
61
- def release(uri)
51
+ def checkin(uri, conn)
62
52
  @mutex.synchronize do
63
- if entry = @connections[uri.origin]
64
- entry.in_use = false
65
- entry.last_used = Time.now
66
- end
53
+ @connections[uri.origin] = [conn, Time.now]
67
54
  end
55
+
56
+ @sweeper.wakeup
68
57
  end
69
58
 
70
59
  def sweep
71
60
  @mutex.synchronize do
72
- @connections.each do |origin, entry|
73
- next if entry.in_use
74
-
75
- if entry.last_used + Fetch.config.max_idle_time < Time.now
76
- entry.connection.finish
61
+ @connections.each do |origin, (conn, last_used)|
62
+ if last_used + Fetch.config.max_idle_time < Time.now
63
+ begin
64
+ conn.finish
65
+ rescue IOError
66
+ # do nothing
67
+ end
77
68
 
78
69
  @connections.delete origin
79
70
  end
data/lib/fetch/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fetch
2
- VERSION = '0.4.2'
2
+ VERSION = '0.4.3'
3
3
  end
data/lib/fetch.rb CHANGED
@@ -10,7 +10,7 @@ module Fetch
10
10
  end
11
11
 
12
12
  configure do |config|
13
- config.max_idle_time = 10
14
- config.keep_alive_timeout = 2
13
+ config.max_idle_time = 30
14
+ config.keep_alive_timeout = 15
15
15
  end
16
16
  end
@@ -1,20 +1,12 @@
1
1
  module Fetch
2
2
  class ConnectionPool
3
- class Entry
4
- attr_accessor connection: Net::HTTP
5
- attr_accessor in_use: bool
6
- attr_accessor last_used: Time
7
-
8
- def initialize: (connection: Net::HTTP, in_use: bool, ?last_used: Time) -> void
9
- end
10
-
11
3
  def initialize: () -> void
12
4
  def with_connection: [T] (URI::HTTP) { (Net::HTTP) -> T } -> T
13
5
 
14
6
  private
15
7
 
16
- def acquire: (URI::HTTP) -> Net::HTTP
17
- def release: (URI::HTTP) -> void
8
+ def checkout: (URI::HTTP) -> Net::HTTP
9
+ def checkin: (URI::HTTP, Net::HTTP) -> void
18
10
  def sweep: () -> void
19
11
  end
20
12
  end
@@ -0,0 +1,3 @@
1
+ module Fetch
2
+ VERSION: String
3
+ end
data/sig/fetch.rbs CHANGED
@@ -1,6 +1,4 @@
1
1
  module Fetch
2
- VERSION: String
3
-
4
2
  attr_accessor self.config: Config
5
3
 
6
4
  def self.configure: () { (Config) -> void } -> void
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fetch-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keita Urashima
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-08 00:00:00.000000000 Z
11
+ date: 2024-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: forwardable
@@ -139,6 +139,7 @@ files:
139
139
  - sig/fetch/headers.rbs
140
140
  - sig/fetch/response.rbs
141
141
  - sig/fetch/url_search_params.rbs
142
+ - sig/fetch/version.rbs
142
143
  homepage: https://github.com/ursm/fetch-api
143
144
  licenses:
144
145
  - MIT
@@ -160,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
161
  - !ruby/object:Gem::Version
161
162
  version: '0'
162
163
  requirements: []
163
- rubygems_version: 3.5.14
164
+ rubygems_version: 3.5.11
164
165
  signing_key:
165
166
  specification_version: 4
166
167
  summary: Something like the Fetch API for Ruby