itsi 0.2.10 → 0.2.12

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +2 -2
  3. data/LICENSE.txt +169 -0
  4. data/README.md +8 -0
  5. data/crates/itsi_error/Cargo.toml +1 -1
  6. data/crates/itsi_rb_helpers/Cargo.toml +1 -1
  7. data/crates/itsi_scheduler/Cargo.toml +1 -1
  8. data/crates/itsi_server/Cargo.toml +1 -1
  9. data/crates/itsi_server/src/default_responses/mod.rs +3 -0
  10. data/crates/itsi_server/src/lib.rs +2 -0
  11. data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +15 -10
  12. data/crates/itsi_server/src/ruby_types/itsi_http_response.rs +10 -2
  13. data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +6 -0
  14. data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +13 -7
  15. data/crates/itsi_server/src/server/thread_worker.rs +4 -1
  16. data/docs/content/features/_index.md +2 -2
  17. data/docs/content/itsi_scheduler/_index.md +31 -1
  18. data/examples/hybrid_scheduler_mode/Itsi.rb +60 -0
  19. data/examples/hybrid_scheduler_mode/config.ru +9 -0
  20. data/examples/hybrid_scheduler_mode/slow_service/Itsi.rb +12 -0
  21. data/gems/scheduler/Cargo.lock +1 -1
  22. data/gems/scheduler/lib/itsi/schedule_refinement.rb +96 -0
  23. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  24. data/gems/scheduler/lib/itsi/scheduler.rb +1 -0
  25. data/gems/server/Cargo.lock +1 -1
  26. data/gems/server/lib/itsi/http_request.rb +19 -20
  27. data/gems/server/lib/itsi/server/config/config_helpers.rb +5 -2
  28. data/gems/server/lib/itsi/server/config/middleware/endpoint/_index.md +2 -1
  29. data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.rb +3 -2
  30. data/gems/server/lib/itsi/server/config/middleware/endpoint/endpoint.rb +14 -3
  31. data/gems/server/lib/itsi/server/config/middleware/endpoint/get.rb +3 -2
  32. data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.rb +3 -2
  33. data/gems/server/lib/itsi/server/config/middleware/endpoint/post.rb +3 -2
  34. data/gems/server/lib/itsi/server/config/middleware/endpoint/put.rb +3 -2
  35. data/gems/server/lib/itsi/server/config/middleware/rackup_file.md +18 -0
  36. data/gems/server/lib/itsi/server/config/middleware/rackup_file.rb +2 -0
  37. data/gems/server/lib/itsi/server/config/middleware/run.md +20 -1
  38. data/gems/server/lib/itsi/server/config/middleware/run.rb +2 -0
  39. data/gems/server/lib/itsi/server/config/options/certificates.md +2 -2
  40. data/gems/server/lib/itsi/server/config/options/ruby_thread_request_backlog_size.md +18 -0
  41. data/gems/server/lib/itsi/server/config/options/ruby_thread_request_backlog_size.rb +19 -0
  42. data/gems/server/lib/itsi/server/config/options/scheduler_threads.md +8 -1
  43. data/gems/server/lib/itsi/server/config.rb +3 -0
  44. data/gems/server/lib/itsi/server/default_config/Itsi.rb +2 -2
  45. data/gems/server/lib/itsi/server/rack/handler/itsi.rb +3 -2
  46. data/gems/server/lib/itsi/server/rack_interface.rb +5 -6
  47. data/gems/server/lib/itsi/server/version.rb +1 -1
  48. data/gems/server/test/helpers/test_helper.rb +4 -1
  49. data/gems/server/test/options/ruby_thread_request_backlog_size.rb +37 -0
  50. data/gems/server/test/rack/test_rack_server.rb +127 -47
  51. data/lib/itsi/version.rb +1 -1
  52. data/tasks.txt +3 -2
  53. metadata +12 -9
  54. data/gems/scheduler/README.md +0 -76
  55. data/gems/scheduler/sig/itsi_scheduler.rbs +0 -4
  56. data/gems/server/README.md +0 -49
  57. data/gems/server/sig/itsi_server.rbs +0 -4
@@ -6,25 +6,25 @@ class TestRackServer < Minitest::Test
6
6
  end
7
7
 
8
8
  def test_hello_world
9
- server(app: lambda do |env|
10
- [200, { "Content-Type" => "text/plain" }, ["Hello, World!"]]
9
+ server(app_with_lint: lambda do |env|
10
+ [200, { "content-type" => "text/plain" }, ["Hello, World!"]]
11
11
  end) do
12
12
  assert_equal "Hello, World!", get("/")
13
13
  end
14
14
  end
15
15
 
16
16
  def test_post
17
- server(app: lambda do |env|
17
+ server(app_with_lint: lambda do |env|
18
18
  assert_equal env["REQUEST_METHOD"], "POST"
19
19
  assert_equal "data", env["rack.input"].read
20
- [200, { "Content-Type" => "text/plain" }, ["Hello, World!"]]
20
+ [200, { "content-type" => "text/plain" }, ["Hello, World!"]]
21
21
  end) do
22
22
  assert_equal "Hello, World!", post("/", "data").body
23
23
  end
24
24
  end
25
25
 
26
26
  def test_full_hijack
27
- server(app: lambda do |env|
27
+ server(app_with_lint: lambda do |env|
28
28
  io = env["rack.hijack"].call
29
29
  io.write("HTTP/1.1 200 Ok\r\n")
30
30
  io.write("Content-Type: text/plain\r\n")
@@ -36,14 +36,15 @@ class TestRackServer < Minitest::Test
36
36
  io.write("World!\r\n")
37
37
  io.write("0\r\n\r\n")
38
38
  io.close
39
+ [200, {}, []]
39
40
  end) do
40
41
  assert_equal "Hello, World!", get("/")
41
42
  end
42
43
  end
43
44
 
44
45
  def test_streaming_body
45
- server(app: lambda do |env|
46
- [200, { "Content-Type" => "text/plain" }, lambda { |stream|
46
+ server(app_with_lint: lambda do |env|
47
+ [200, { "content-type" => "text/plain" }, lambda { |stream|
47
48
  stream.write("Hello")
48
49
  stream.write(", World!")
49
50
  stream.close
@@ -54,8 +55,8 @@ class TestRackServer < Minitest::Test
54
55
  end
55
56
 
56
57
  def test_partial_hijack
57
- server(app: lambda do |env|
58
- [200, { "Content-Type" => "text/plain", "rack.hijack" => lambda { |stream|
58
+ server(app_with_lint: lambda do |env|
59
+ [200, { "content-type" => "text/plain", "rack.hijack" => lambda { |stream|
59
60
  stream.write("Hello")
60
61
  stream.write(", World!")
61
62
  stream.close
@@ -66,8 +67,8 @@ class TestRackServer < Minitest::Test
66
67
  end
67
68
 
68
69
  def test_enumerable_body
69
- server(app: lambda do |env|
70
- [200, { "Content-Type" => "application/json" },
70
+ server(app_with_lint: lambda do |env|
71
+ [200, { "content-type" => "application/json" },
71
72
  %W[one\n two\n three\n]]
72
73
  end) do
73
74
  assert_equal "one\ntwo\nthree\n", get("/")
@@ -82,7 +83,7 @@ class TestRackServer < Minitest::Test
82
83
  fiber_scheduler "Itsi::Scheduler"
83
84
  run(lambda do |env|
84
85
  sleep 0.25
85
- [200, { "Content-Type" => "text/plain" }, "Response: #{env["PATH_INFO"][1..-1]}"]
86
+ [200, { "content-type" => "text/plain" }, "Response: #{env["PATH_INFO"][1..-1]}"]
86
87
  end)
87
88
  end
88
89
  ) do
@@ -100,17 +101,17 @@ class TestRackServer < Minitest::Test
100
101
  end
101
102
 
102
103
  def test_query_params
103
- server(app: lambda do |env|
104
- [200, { "Content-Type" => "text/plain" }, [env["QUERY_STRING"]]]
104
+ server(app_with_lint: lambda do |env|
105
+ [200, { "content-type" => "text/plain" }, [env["QUERY_STRING"]]]
105
106
  end) do
106
107
  assert_equal "foo=bar&baz=qux", get("/?foo=bar&baz=qux")
107
108
  end
108
109
  end
109
110
 
110
111
  def test_put_request
111
- server(app: lambda do |env|
112
+ server(app_with_lint: lambda do |env|
112
113
  body = env["rack.input"].read
113
- [200, { "Content-Type" => "text/plain" }, [body]]
114
+ [200, { "content-type" => "text/plain" }, [body]]
114
115
  end) do |uri|
115
116
  req = Net::HTTP::Put.new(uri)
116
117
  req.body = "put data"
@@ -120,9 +121,9 @@ class TestRackServer < Minitest::Test
120
121
  end
121
122
 
122
123
  def test_custom_headers
123
- server(app: lambda do |env|
124
+ server(app_with_lint: lambda do |env|
124
125
  header = env["HTTP_X_CUSTOM"] || ""
125
- [200, { "Content-Type" => "text/plain" }, [header]]
126
+ [200, { "content-type" => "text/plain" }, [header]]
126
127
  end) do |uri|
127
128
  req = Net::HTTP::Get.new(uri)
128
129
  req["X-Custom"] = "custom-value"
@@ -134,7 +135,7 @@ class TestRackServer < Minitest::Test
134
135
  def test_error_response
135
136
  response = nil
136
137
  capture_subprocess_io do
137
- server(app: lambda do |env|
138
+ server(app_with_lint: lambda do |env|
138
139
  raise "Intentional error for testing"
139
140
  end) do
140
141
  response = get_resp("/")
@@ -144,8 +145,8 @@ class TestRackServer < Minitest::Test
144
145
  end
145
146
 
146
147
  def test_redirect
147
- server(app: lambda do |env|
148
- [302, { "Location" => "http://example.com" }, []]
148
+ server(app_with_lint: lambda do |env|
149
+ [302, { "location" => "http://example.com" }, []]
149
150
  end) do
150
151
  response = get_resp("/")
151
152
  assert_equal "302", response.code
@@ -154,11 +155,11 @@ class TestRackServer < Minitest::Test
154
155
  end
155
156
 
156
157
  def test_not_found
157
- server(app: lambda do |env|
158
+ server(app_with_lint: lambda do |env|
158
159
  if env["PATH_INFO"] == "/"
159
- [200, { "Content-Type" => "text/plain" }, ["Home"]]
160
+ [200, { "content-type" => "text/plain" }, ["Home"]]
160
161
  else
161
- [404, { "Content-Type" => "text/plain" }, ["Not Found"]]
162
+ [404, { "content-type" => "text/plain" }, ["Not Found"]]
162
163
  end
163
164
  end) do
164
165
  response = get_resp("/nonexistent")
@@ -168,8 +169,8 @@ class TestRackServer < Minitest::Test
168
169
  end
169
170
 
170
171
  def test_head_request
171
- server(app: lambda do |env|
172
- [200, { "Content-Type" => "text/plain", "Content-Length" => "13" }, ["Hello, World!"]]
172
+ server(app_with_lint: lambda do |env|
173
+ [200, { "content-type" => "text/plain", "content-length" => "13" }, []]
173
174
  end) do
174
175
  response = head("/")
175
176
  assert_equal "200", response.code
@@ -179,8 +180,8 @@ class TestRackServer < Minitest::Test
179
180
  end
180
181
 
181
182
  def test_options_request
182
- server(app: lambda do |env|
183
- [200, { "Allow" => "GET,POST,OPTIONS", "Content-Type" => "text/plain" }, ["Options Response"]]
183
+ server(app_with_lint: lambda do |env|
184
+ [200, { "allow" => "GET,POST,OPTIONS", "content-type" => "text/plain" }, ["Options Response"]]
184
185
  end) do
185
186
  response = options("/")
186
187
  assert_equal "200", response.code
@@ -190,8 +191,8 @@ class TestRackServer < Minitest::Test
190
191
  end
191
192
 
192
193
  def test_cookie_handling
193
- server(app: lambda do |env|
194
- [200, { "Content-Type" => "text/plain", "Set-Cookie" => "session=abc123; Path=/" }, ["Cookie Test"]]
194
+ server(app_with_lint: lambda do |env|
195
+ [200, { "content-type" => "text/plain", "set-cookie" => "session=abc123; Path=/" }, ["Cookie Test"]]
195
196
  end) do
196
197
  response = get_resp("/")
197
198
  assert_equal "200", response.code
@@ -201,8 +202,8 @@ class TestRackServer < Minitest::Test
201
202
  end
202
203
 
203
204
  def test_multiple_headers
204
- server(app: lambda do |env|
205
- [200, { "Content-Type" => "text/plain", "X-Example" => "one, two, three" }, ["Multiple Headers"]]
205
+ server(app_with_lint: lambda do |env|
206
+ [200, { "content-type" => "text/plain", "x-example" => "one, two, three" }, ["Multiple Headers"]]
206
207
  end) do
207
208
  response = get_resp("/")
208
209
  assert_equal "200", response.code
@@ -213,8 +214,8 @@ class TestRackServer < Minitest::Test
213
214
 
214
215
  def test_large_body
215
216
  large_text = "A" * 10_000
216
- server(app: lambda do |env|
217
- [200, { "Content-Type" => "text/plain", "Content-Length" => large_text.bytesize.to_s }, [large_text]]
217
+ server(app_with_lint: lambda do |env|
218
+ [200, { "content-type" => "text/plain", "content-length" => large_text.bytesize.to_s }, [large_text]]
218
219
  end) do
219
220
  response = get_resp("/")
220
221
  assert_equal "200", response.code
@@ -223,8 +224,8 @@ class TestRackServer < Minitest::Test
223
224
  end
224
225
 
225
226
  def test_custom_status_code
226
- server(app: lambda do |env|
227
- [201, { "Content-Type" => "text/plain" }, ["Created"]]
227
+ server(app_with_lint: lambda do |env|
228
+ [201, { "content-type" => "text/plain" }, ["Created"]]
228
229
  end) do
229
230
  response = get_resp("/")
230
231
  assert_equal "201", response.code
@@ -233,8 +234,8 @@ class TestRackServer < Minitest::Test
233
234
  end
234
235
 
235
236
  def test_empty_body
236
- server(app: lambda do |env|
237
- [204, { "Content-Type" => "text/plain" }, []]
237
+ server(app_with_lint: lambda do |env|
238
+ [204, {}, []]
238
239
  end) do
239
240
  response = get_resp("/")
240
241
  assert_equal "204", response.code
@@ -244,8 +245,8 @@ class TestRackServer < Minitest::Test
244
245
 
245
246
  def test_utf8_response
246
247
  utf8_text = "こんにちは世界"
247
- server(app: lambda do |env|
248
- [200, { "Content-Type" => "text/plain; charset=utf-8" }, [utf8_text]]
248
+ server(app_with_lint: lambda do |env|
249
+ [200, { "content-type" => "text/plain; charset=utf-8" }, [utf8_text]]
249
250
  end) do
250
251
  response = get_resp("/")
251
252
  assert_equal "200", response.code
@@ -254,9 +255,9 @@ class TestRackServer < Minitest::Test
254
255
  end
255
256
 
256
257
  def test_custom_request_header
257
- server(app: lambda do |env|
258
+ server(app_with_lint: lambda do |env|
258
259
  header_value = env["HTTP_X_MY_HEADER"] || ""
259
- [200, { "Content-Type" => "text/plain" }, [header_value]]
260
+ [200, { "content-type" => "text/plain" }, [header_value]]
260
261
  end) do |uri|
261
262
  req = Net::HTTP::Get.new(uri)
262
263
  req["X-My-Header"] = "test-header"
@@ -266,16 +267,16 @@ class TestRackServer < Minitest::Test
266
267
  end
267
268
 
268
269
  def test_url_encoded_query_params
269
- server(app: lambda do |env|
270
- [200, { "Content-Type" => "text/plain" }, [env["QUERY_STRING"]]]
270
+ server(app_with_lint: lambda do |env|
271
+ [200, { "content-type" => "text/plain" }, [env["QUERY_STRING"]]]
271
272
  end) do
272
273
  assert_equal "param=%C3%A9", get("/?param=%C3%A9")
273
274
  end
274
275
  end
275
276
 
276
- def test_https
277
- server(app: lambda do |env|
278
- [200, { "Content-Type" => "text/plain" }, ["Hello, HTTPS!"]]
277
+ def test_rackup_handler
278
+ server(app_with_lint: lambda do |env|
279
+ [200, { "content-type" => "text/plain" }, ["Hello, HTTPS!"]]
279
280
  end, protocol: "https") do |uri|
280
281
  response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true,
281
282
  verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
@@ -285,4 +286,83 @@ class TestRackServer < Minitest::Test
285
286
  assert_equal "Hello, HTTPS!", response.body
286
287
  end
287
288
  end
289
+
290
+ # Used by `rails -s` and other tools using the rack-up interface.
291
+ def test_rackup_handler
292
+ host, port = free_bind.split(%r{:/?/?}).last(2)
293
+ app = ->(_) { [200, { "content-type" => "text/plain" }, ["Hello, Rackup!"]] }
294
+
295
+ Thread.new do
296
+ Rack::Handler::Itsi.run(
297
+ app,
298
+ {
299
+ host: host,
300
+ Port: port
301
+ }
302
+ )
303
+ end
304
+
305
+ sleep 0.25
306
+ assert_equal Net::HTTP.get(URI("http://#{host}:#{port}")), "Hello, Rackup!"
307
+ Process.kill(:SIGINT, Process.pid)
308
+ end
309
+
310
+ def test_script_name_inferred_from_mount
311
+ server(itsi_rb: lambda do
312
+ location "foo*" do
313
+ run ->(env) { [200, { "content-type" => "text/plain" }, [env["SCRIPT_NAME"]]] }
314
+ end
315
+ run ->(env) { [200, { "content-type" => "text/plain" }, [env["SCRIPT_NAME"]]] }
316
+ end) do
317
+ assert_equal get("/foo/bar"), "/foo"
318
+ assert_equal get("/baz"), ""
319
+ end
320
+ end
321
+
322
+ def test_path_info_inferred_from_mount
323
+ server(itsi_rb: lambda do
324
+ location "foo*" do
325
+ run ->(env) { [200, { "content-type" => "text/plain" }, [env["PATH_INFO"]]] }
326
+ end
327
+ run ->(env) { [200, { "content-type" => "text/plain" }, [env["PATH_INFO"]]] }
328
+ end) do
329
+ assert_equal get("/foo/bar"), "/bar"
330
+ assert_equal get("/baz"), "/baz"
331
+ end
332
+ end
333
+
334
+ def test_script_name_explicitly_set
335
+ server(itsi_rb: lambda do
336
+ location "foo*" do
337
+ run ->(env) { [200, { "content-type" => "text/plain" }, [env["SCRIPT_NAME"]]] }, script_name: "/overridden"
338
+ end
339
+ run ->(env) { [200, { "content-type" => "text/plain" }, [env["SCRIPT_NAME"]]] }, script_name: ""
340
+ end) do
341
+ assert_equal get("/foo/bar"), "/overridden"
342
+ assert_equal get("/baz"), ""
343
+ end
344
+ end
345
+
346
+ def test_path_info_when_script_name_explicitly_set
347
+ server(itsi_rb: lambda do
348
+ location "foo*" do
349
+ run ->(env) { [200, { "content-type" => "text/plain" }, [env["PATH_INFO"]]] }, script_name: ""
350
+ end
351
+ run ->(env) { [200, { "content-type" => "text/plain" }, [env["PATH_INFO"]]] }, script_name: ""
352
+ end) do
353
+ assert_equal get("/foo/bar"), "/foo/bar"
354
+ assert_equal get("/baz"), "/baz"
355
+ end
356
+ end
357
+
358
+ def test_multi_field_headers
359
+ server(app_with_lint: lambda do |env|
360
+ [200, { "content-type" => "text/plain", "x-example" => ["one, two, three", "four, five"] }, ["Multiple Field Headers"]]
361
+ end) do
362
+ response = get_resp("/")
363
+ assert_equal "200", response.code
364
+ assert_equal "one, two, three, four, five", response["x-example"]
365
+ assert_equal "Multiple Field Headers", response.body
366
+ end
367
+ end
288
368
  end
data/lib/itsi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Itsi
2
- VERSION = '0.2.10'
2
+ VERSION = '0.2.12'
3
3
  end
data/tasks.txt CHANGED
@@ -1,5 +1,6 @@
1
- - Fix crash during reload on Linux
2
- - Fix orphaned processes on linux (Maybe need to kill watcher?)
1
+ - Add tests for script name and request backlog size, Add tests for scheduler.
2
+ - Respond on Reddit
3
+ - Min rust version
3
4
 
4
5
  Tasks:
5
6
  - Add way to opt non Itsi.rb files into LSP
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itsi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.10
4
+ version: 0.2.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters
@@ -15,28 +15,28 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.2.10
18
+ version: 0.2.11
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: 0.2.10
25
+ version: 0.2.11
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: itsi-server
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: 0.2.10
32
+ version: 0.2.11
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.2.10
39
+ version: 0.2.11
40
40
  description: Wrapper Gem for both the Itsi server and the Itsi Fiber scheduler
41
41
  email:
42
42
  - wc@pico.net.nz
@@ -253,6 +253,9 @@ files:
253
253
  - examples/file_server/itsi-server-100.png
254
254
  - examples/file_server/subdirectory/movies.csv
255
255
  - examples/helpers/datastore.rb
256
+ - examples/hybrid_scheduler_mode/Itsi.rb
257
+ - examples/hybrid_scheduler_mode/config.ru
258
+ - examples/hybrid_scheduler_mode/slow_service/Itsi.rb
256
259
  - examples/media_server/Itsi.rb
257
260
  - examples/media_server/README.md
258
261
  - examples/media_server/images/itsi-server-100.png
@@ -672,15 +675,14 @@ files:
672
675
  - gems/scheduler/.rubocop.yml
673
676
  - gems/scheduler/Cargo.lock
674
677
  - gems/scheduler/Cargo.toml
675
- - gems/scheduler/README.md
676
678
  - gems/scheduler/Rakefile
677
679
  - gems/scheduler/bin/console
678
680
  - gems/scheduler/bin/setup
679
681
  - gems/scheduler/itsi-scheduler-100.png
680
682
  - gems/scheduler/itsi-scheduler.gemspec
683
+ - gems/scheduler/lib/itsi/schedule_refinement.rb
681
684
  - gems/scheduler/lib/itsi/scheduler.rb
682
685
  - gems/scheduler/lib/itsi/scheduler/version.rb
683
- - gems/scheduler/sig/itsi_scheduler.rbs
684
686
  - gems/scheduler/test/helpers/test_helper.rb
685
687
  - gems/scheduler/test/test_active_record.rb
686
688
  - gems/scheduler/test/test_address_resolve.rb
@@ -695,7 +697,6 @@ files:
695
697
  - gems/server/.rubocop.yml
696
698
  - gems/server/Cargo.lock
697
699
  - gems/server/Cargo.toml
698
- - gems/server/README.md
699
700
  - gems/server/Rakefile
700
701
  - gems/server/bin/console
701
702
  - gems/server/bin/setup
@@ -943,6 +944,8 @@ files:
943
944
  - gems/server/lib/itsi/server/config/options/reuse_address.rb
944
945
  - gems/server/lib/itsi/server/config/options/reuse_port.md
945
946
  - gems/server/lib/itsi/server/config/options/reuse_port.rb
947
+ - gems/server/lib/itsi/server/config/options/ruby_thread_request_backlog_size.md
948
+ - gems/server/lib/itsi/server/config/options/ruby_thread_request_backlog_size.rb
946
949
  - gems/server/lib/itsi/server/config/options/scheduler_threads.md
947
950
  - gems/server/lib/itsi/server/config/options/scheduler_threads.rb
948
951
  - gems/server/lib/itsi/server/config/options/shutdown_timeout.md
@@ -978,7 +981,6 @@ files:
978
981
  - gems/server/lib/itsi/standard_headers.rb
979
982
  - gems/server/lib/ruby_lsp/itsi/addon.rb
980
983
  - gems/server/lib/shell_completions/completions.rb
981
- - gems/server/sig/itsi_server.rbs
982
984
  - gems/server/test/helpers/test_helper.rb
983
985
  - gems/server/test/middleware/allow_list.rb
984
986
  - gems/server/test/middleware/auth_api_key.rb
@@ -1012,6 +1014,7 @@ files:
1012
1014
  - gems/server/test/middleware/test_log_requests.rb
1013
1015
  - gems/server/test/options/bind.rb
1014
1016
  - gems/server/test/options/header_read_timeout.rb
1017
+ - gems/server/test/options/ruby_thread_request_backlog_size.rb
1015
1018
  - gems/server/test/options/test_request_timeout.rb
1016
1019
  - gems/server/test/options/test_threads.rb
1017
1020
  - gems/server/test/options/test_workers.rb
@@ -1,76 +0,0 @@
1
- ---
2
- title: Itsi Scheduler
3
- type: docs
4
- weight: 4
5
- sidebar:
6
- exclude: true
7
- ---
8
- <img src="itsi-scheduler-100.png" width="80px" style="display: block; margin-left: auto; margin-right: auto;">
9
-
10
- `Itsi Scheduler` is an implementation of a Ruby [Fiber Scheduler](https://docs.ruby-lang.org/en/3.2/Fiber/Scheduler.html).
11
-
12
- When combined with Itsi Server, you can write endpoints that look just like regular synchronous Ruby code. Behind the scenes, the scheduler will transparently pause and resume fibers to prevent threads from blocking, greatly increasing throughput for I/O-heavy workloads
13
-
14
- If you're purely after a lightweight, yet efficient Ruby scheduler,
15
- you can use Itsi Scheduler as a standalone scheduler for any Ruby application.
16
-
17
- Just use `Fiber.set_scheduler` to set an instance `Itsi::Scheduler` as a scheduler to opt in to this IO weaving behavior
18
- *automatically* for all blocking IO.
19
-
20
- ### Primer on Fiber Schedulers
21
-
22
- Fiber schedulers are a way to automatically manage the execution of non-blocking fibers in Ruby. A scheduler is responsible for the automatic pausing and resumption of Fibers based
23
- on whether or not they are awaiting IO operations.
24
- Ruby's Fiber scheduler implementation automatically invokes the current Fiber scheduler (if it exists) for each blocking operation, allowing it to seamlessly drive the execution of huge numbers of simultaneous non-blocking fibers
25
- while ensuring the main thread is never blocked on IO.
26
-
27
- This behind the scenes magic allows Ruby to provide async IO (just like we find in languages with `async/await` like `Rust`, `C#`, `JavaScript`) *but* with the added beauty
28
- that synchronous and asynchronous code is identical! (I.e. Ruby's functions are [colorless](https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/))
29
-
30
- ## Getting Started
31
- To install and use Itsi Scheduler follow the instructions below:
32
-
33
-
34
- ### 1 - Install Itsi Scheduler
35
-
36
- **Prerequisites**
37
-
38
- You'll need at least `build-essential` and `libclang-dev` installed to build Itsi on Linux.
39
- E.g.
40
- ```bash
41
- apt-get install build-essential libclang-dev
42
- ```
43
-
44
- Then use `gem` to install the Itsi package. This will in turn install both the
45
- `itsi-server` gem, and the `itsi-scheduler` gem.
46
-
47
-
48
- ```bash
49
- gem install itsi-scheduler
50
- ```
51
-
52
-
53
- ### 2 - Use Itsi Scheduler
54
-
55
- Great! You now have Itsi Scheduler installed.
56
- Now you can run code like this:
57
-
58
- ```ruby
59
- require 'itsi/scheduler'
60
- require 'socket'
61
- results = Thread.new do
62
- Fiber.set_scheduler Itsi::Scheduler.new
63
- results = []
64
- Fiber.schedule do
65
- results << Addrinfo.getaddrinfo("www.ruby-lang.org", 80, nil, :STREAM)
66
- end
67
- Fiber.schedule do
68
- results << Addrinfo.getaddrinfo("www.google.com", 80, nil, :STREAM)
69
- end
70
- results
71
- end.value
72
-
73
- puts results.map(&:inspect)
74
- ```
75
-
76
- to run many blocking operations simultaneously all while occupying only a single Ruby thread!
@@ -1,4 +0,0 @@
1
- module ItsiScheduler
2
- VERSION: String
3
- # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
- end
@@ -1,49 +0,0 @@
1
- ---
2
- type: docs
3
- sidebar:
4
- exclude: true
5
- ---
6
-
7
- # ItsiServer
8
-
9
- TODO: Delete this and the text below, and describe your gem
10
-
11
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/itsi_server`. To experiment with that code, run `bin/console` for an interactive prompt.
12
-
13
- ## Installation
14
-
15
- TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
16
-
17
- Install the gem and add to the application's Gemfile by executing:
18
-
19
- ```bash
20
- bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
21
- ```
22
-
23
- If bundler is not being used to manage dependencies, install the gem by executing:
24
-
25
- ```bash
26
- gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
27
- ```
28
-
29
- ## Usage
30
-
31
- TODO: Write usage instructions here
32
-
33
- ## Development
34
-
35
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
36
-
37
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
38
-
39
- ## Contributing
40
-
41
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/itsi_server. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/itsi_server/blob/master/CODE_OF_CONDUCT.md).
42
-
43
- ## License
44
-
45
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
46
-
47
- ## Code of Conduct
48
-
49
- Everyone interacting in the ItsiServer project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/itsi_server/blob/master/CODE_OF_CONDUCT.md).
@@ -1,4 +0,0 @@
1
- module ItsiServer
2
- VERSION: String
3
- # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
- end