itsi 0.2.7 → 0.2.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 +4 -4
- data/Cargo.lock +2 -2
- data/crates/itsi_scheduler/Cargo.toml +1 -1
- data/crates/itsi_scheduler/src/itsi_scheduler.rs +16 -10
- data/crates/itsi_server/Cargo.toml +1 -1
- data/docs/content/features/_index.md +1 -1
- data/docs/content/getting_started/_index.md +35 -11
- data/gems/scheduler/Cargo.lock +1 -1
- data/gems/scheduler/itsi-scheduler.gemspec +1 -1
- data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
- data/gems/scheduler/test/test_active_record.rb +16 -4
- data/gems/scheduler/test/test_nested_fibers.rb +36 -33
- data/gems/server/Cargo.lock +1 -1
- data/gems/server/itsi-server.gemspec +1 -0
- data/gems/server/lib/itsi/server/config/config_helpers.rb +9 -0
- data/gems/server/lib/itsi/server/version.rb +1 -1
- data/gems/server/test/rack/test_rack_server.rb +2 -0
- data/lib/itsi/version.rb +1 -1
- data/tasks.txt +2 -4
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79c36b477ccc4ed0f1327f160d6a0c0d53d8a0524f3458d98ed3ddefa5e59e72
|
4
|
+
data.tar.gz: eb43759f50d8eb8f62c7a8dbfcf71bea68ccda7b441877cc356cfba827d58612
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 201903b6a53a8f29f916711b4cffa67ae2f67737cff05c7ddae1016ba928f3c0704656a17ab8739d05da1ac2ff8ff15d3b26fb89527ebbf47b128af022a21953
|
7
|
+
data.tar.gz: 7752aa84a9af2d8f8be6f52b714b73ce47c0cb6b19833f65248cacb8d7967f14ed89d387e7243c7663634305c169492566c0709534e0d33063e7c5e200a506f8
|
data/Cargo.lock
CHANGED
@@ -1644,7 +1644,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
|
|
1644
1644
|
|
1645
1645
|
[[package]]
|
1646
1646
|
name = "itsi-scheduler"
|
1647
|
-
version = "0.2.
|
1647
|
+
version = "0.2.8"
|
1648
1648
|
dependencies = [
|
1649
1649
|
"bytes",
|
1650
1650
|
"derive_more",
|
@@ -1662,7 +1662,7 @@ dependencies = [
|
|
1662
1662
|
|
1663
1663
|
[[package]]
|
1664
1664
|
name = "itsi-server"
|
1665
|
-
version = "0.2.
|
1665
|
+
version = "0.2.8"
|
1666
1666
|
dependencies = [
|
1667
1667
|
"argon2",
|
1668
1668
|
"async-channel",
|
@@ -7,7 +7,7 @@ use itsi_error::ItsiError;
|
|
7
7
|
use itsi_rb_helpers::{call_without_gvl, create_ruby_thread};
|
8
8
|
use magnus::{
|
9
9
|
error::Result as MagnusResult,
|
10
|
-
value::{InnerValue, Opaque, ReprValue},
|
10
|
+
value::{InnerValue, Lazy, LazyId, Opaque, ReprValue},
|
11
11
|
Module, RClass, Ruby, Value,
|
12
12
|
};
|
13
13
|
use mio::{Events, Poll, Token, Waker};
|
@@ -19,7 +19,7 @@ use std::{
|
|
19
19
|
time::Duration,
|
20
20
|
};
|
21
21
|
use timer::Timer;
|
22
|
-
use tracing::{debug, info, warn};
|
22
|
+
use tracing::{debug, error, info, warn};
|
23
23
|
|
24
24
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
25
25
|
pub(crate) struct Readiness(i16);
|
@@ -31,6 +31,9 @@ impl std::fmt::Debug for ItsiScheduler {
|
|
31
31
|
}
|
32
32
|
|
33
33
|
const WAKE_TOKEN: Token = Token(0);
|
34
|
+
static ID_CURRENT: LazyId = LazyId::new("current");
|
35
|
+
static CLASS_FIBER: Lazy<RClass> =
|
36
|
+
Lazy::new(|ruby| ruby.module_kernel().const_get("Fiber").unwrap());
|
34
37
|
|
35
38
|
#[magnus::wrap(class = "Itsi::Scheduler", free_immediately, size)]
|
36
39
|
pub(crate) struct ItsiScheduler {
|
@@ -225,14 +228,17 @@ impl ItsiScheduler {
|
|
225
228
|
let result: Arc<RwLock<Option<T>>> = Arc::new(RwLock::new(None));
|
226
229
|
let result_clone = Arc::clone(&result);
|
227
230
|
|
228
|
-
let
|
229
|
-
let
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
231
|
+
let class_fiber = ruby.get_inner(&CLASS_FIBER);
|
232
|
+
let current_fiber = ruby
|
233
|
+
.get_inner(&CLASS_FIBER)
|
234
|
+
.funcall::<_, _, Value>(*ID_CURRENT, ());
|
235
|
+
|
236
|
+
if current_fiber.is_err() {
|
237
|
+
error!("Failed to get current fiber");
|
238
|
+
return Err(ItsiError::ArgumentError("Failed to get current fiber".to_string()).into());
|
239
|
+
}
|
240
|
+
let current_fiber = Opaque::from(current_fiber.unwrap());
|
241
|
+
let scheduler = Opaque::from(class_fiber.funcall::<_, _, Value>("scheduler", ()).unwrap());
|
236
242
|
|
237
243
|
create_ruby_thread(move || {
|
238
244
|
call_without_gvl(|| {
|
@@ -7,7 +7,7 @@ next: /getting_started
|
|
7
7
|
|
8
8
|
Itsi bundles a slew of essential modern web features into a single, easy-to-use package.
|
9
9
|
Here's a list of the essentials.
|
10
|
-
Or jump straight in to <a target="_blank" href="
|
10
|
+
Or jump straight in to <a target="_blank" href="/getting_started">install</a> and <a target="_blank" href="/configuration">configure</a> for a deeper dive.
|
11
11
|
|
12
12
|
{{< callout >}}
|
13
13
|
You don't need to use all of the features listed below to benefit from Itsi. E.g.
|
@@ -5,7 +5,6 @@ weight: 2
|
|
5
5
|
prev: features/
|
6
6
|
next: getting_started/local_development/
|
7
7
|
---
|
8
|
-
|
9
8
|
{{% steps %}}
|
10
9
|
|
11
10
|
### Step 1 - Install Ruby
|
@@ -26,34 +25,60 @@ Install Ruby
|
|
26
25
|
apt-get install build-essential libclang-dev
|
27
26
|
```
|
28
27
|
|
29
|
-
Then use `gem` to install
|
30
|
-
`itsi-server` gem, and the `itsi-scheduler` gem.
|
31
|
-
|
28
|
+
Then use `gem` to install Itsi, or its components based on your Ruby version.
|
32
29
|
|
30
|
+
**For Ruby >= 3.1**:
|
33
31
|
```bash
|
34
32
|
gem install itsi
|
35
33
|
```
|
34
|
+
*(Installs both `itsi-server` and `itsi-scheduler`)*
|
35
|
+
|
36
|
+
**For Ruby 2.7 – 3.0**:
|
37
|
+
```bash
|
38
|
+
gem install itsi-server
|
39
|
+
```
|
40
|
+
*(Installs `itsi-server` only; `itsi-scheduler` is not supported on Ruby < 3.1)*
|
36
41
|
|
37
42
|
{{< callout type="info" >}}
|
38
|
-
|
39
|
-
|
43
|
+
Itsi (**server + scheduler**) requires **Ruby >= 3.1**.
|
44
|
+
|
45
|
+
Itsi **server** supports **Ruby >= 2.7**.
|
46
|
+
|
47
|
+
If you wish to use either the scheduler or server independently:
|
48
|
+
- `gem install itsi-server`
|
49
|
+
- `gem install itsi-scheduler` (Ruby >= 3.1 only)
|
50
|
+
|
40
51
|
{{< /callout >}}
|
41
52
|
|
42
53
|
{{< /tab >}}
|
43
54
|
{{< tab >}}
|
44
55
|
**Mac**:
|
56
|
+
**For Ruby >= 3.1**:
|
45
57
|
```bash
|
46
58
|
gem install itsi
|
47
59
|
```
|
60
|
+
|
61
|
+
**For Ruby 2.7 – 3.0**:
|
62
|
+
```bash
|
63
|
+
gem install itsi-server
|
64
|
+
```
|
65
|
+
|
48
66
|
{{< callout type="info" >}}
|
49
|
-
|
50
|
-
|
67
|
+
Itsi (**server + scheduler**) requires **Ruby >= 3.1**.
|
68
|
+
|
69
|
+
Itsi **server** supports **Ruby >= 2.7**.
|
70
|
+
|
71
|
+
You can install components individually:
|
72
|
+
- `gem install itsi-server`
|
73
|
+
- `gem install itsi-scheduler` (Ruby >= 3.1 only)
|
74
|
+
|
75
|
+
⚠️ Scheduler is not compatible with Ruby 3.0.
|
51
76
|
{{< /callout >}}
|
52
77
|
|
53
78
|
{{< /tab >}}
|
54
|
-
{{< tab >}}**Windows**: Itsi currently doesn't support native Windows builds, but it runs well on [https://learn.microsoft.com/en-us/windows/wsl/install
|
79
|
+
{{< tab >}}**Windows**: Itsi currently doesn't support native Windows builds, but it runs well on [WSL](https://learn.microsoft.com/en-us/windows/wsl/install).
|
55
80
|
|
56
|
-
Follow the linked instructions to
|
81
|
+
Follow the linked instructions to install a Linux distribution like Ubuntu or Debian, and then follow the instructions in the Linux tab.
|
57
82
|
{{< /tab >}}
|
58
83
|
|
59
84
|
{{< /tabs >}}
|
@@ -62,7 +87,6 @@ Install Ruby
|
|
62
87
|
|
63
88
|
Great! You now have Itsi installed. Go to one of the following pages to learn how to use it:
|
64
89
|
|
65
|
-
|
66
90
|
{{< cards >}}
|
67
91
|
{{< card link="./local_development" title="Local Development" icon="star" >}}
|
68
92
|
{{< card link="../options" title="Options" icon="adjustments" >}}
|
data/gems/scheduler/Cargo.lock
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.description = "Itsi Scheduler - A light-weight Fiber Scheduler implementation for Ruby"
|
13
13
|
spec.homepage = "https://itsi.fyi"
|
14
14
|
spec.license = "MIT"
|
15
|
-
spec.required_ruby_version = ">= 3.
|
15
|
+
spec.required_ruby_version = ">= 3.1"
|
16
16
|
spec.required_rubygems_version = ">= 3.1.11"
|
17
17
|
|
18
18
|
spec.metadata["homepage_uri"] = spec.homepage
|
@@ -94,14 +94,26 @@ class TestActiveRecordFiberScheduler < Minitest::Test
|
|
94
94
|
|
95
95
|
with_scheduler do |_scheduler|
|
96
96
|
Fiber.schedule do
|
97
|
-
ActiveRecord::Base.connection_pool.
|
98
|
-
|
97
|
+
if ActiveRecord::Base.connection_pool.method(:with_connection).arity == 0
|
98
|
+
ActiveRecord::Base.connection_pool.with_connection do
|
99
|
+
results << ActiveRecord::Base.connection.select_value("SELECT 1")
|
100
|
+
end
|
101
|
+
else
|
102
|
+
ActiveRecord::Base.connection_pool.with_connection(prevent_permanent_checkout: true) do
|
103
|
+
results << ActiveRecord::Base.connection.select_value("SELECT 1")
|
104
|
+
end
|
99
105
|
end
|
100
106
|
end
|
101
107
|
|
102
108
|
Fiber.schedule do
|
103
|
-
ActiveRecord::Base.connection_pool.
|
104
|
-
|
109
|
+
if ActiveRecord::Base.connection_pool.method(:with_connection).arity == 0
|
110
|
+
ActiveRecord::Base.connection_pool.with_connection do
|
111
|
+
results << ActiveRecord::Base.connection.select_value("SELECT 2")
|
112
|
+
end
|
113
|
+
else
|
114
|
+
ActiveRecord::Base.connection_pool.with_connection(prevent_permanent_checkout: true) do
|
115
|
+
results << ActiveRecord::Base.connection.select_value("SELECT 2")
|
116
|
+
end
|
105
117
|
end
|
106
118
|
end
|
107
119
|
end
|
@@ -181,44 +181,47 @@ class TestNestedFibers < Minitest::Test
|
|
181
181
|
assert_equal [0, 1, 2, 3, 4, 5, 6, 7], results
|
182
182
|
end
|
183
183
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
fib = Fiber.new do
|
191
|
-
results << 4
|
192
|
-
sleep 0.001
|
193
|
-
results << 5
|
194
|
-
sleep 0.001
|
195
|
-
results << 6
|
196
|
-
end
|
197
|
-
|
184
|
+
if RUBY_VERSION >= '3.2'
|
185
|
+
def test_nested_unowned_fibers_with_scheduler
|
186
|
+
results = []
|
187
|
+
out, err = capture_subprocess_io do
|
188
|
+
begin
|
189
|
+
with_scheduler do |scheduler|
|
198
190
|
Fiber.new do
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
results <<
|
203
|
-
sleep 0.
|
204
|
-
results <<
|
205
|
-
end
|
206
|
-
results << 2
|
207
|
-
end.resume
|
208
|
-
|
209
|
-
results << 3
|
191
|
+
fib = Fiber.new do
|
192
|
+
results << 4
|
193
|
+
sleep 0.001
|
194
|
+
results << 5
|
195
|
+
sleep 0.001
|
196
|
+
results << 6
|
197
|
+
end
|
210
198
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
199
|
+
Fiber.new do
|
200
|
+
results << 0
|
201
|
+
sleep 0.001
|
202
|
+
puts "Launch and transfer"
|
203
|
+
Fiber.new do
|
204
|
+
results << 1
|
205
|
+
sleep 0.1
|
206
|
+
results << 8
|
207
|
+
end.transfer
|
208
|
+
results << 2
|
209
|
+
end.resume
|
210
|
+
|
211
|
+
results << 3
|
212
|
+
|
213
|
+
fib.resume
|
214
|
+
sleep 0.01
|
215
|
+
results << 7
|
216
|
+
end.transfer
|
217
|
+
end
|
218
|
+
rescue
|
215
219
|
end
|
216
|
-
rescue
|
217
220
|
end
|
221
|
+
# Transfered fibers are not resumed after yielding out.
|
222
|
+
assert_equal [0, 3, 4, 1, 5, 6], results
|
223
|
+
# assert_match /attempt to yield on a not resumed fiber/, out
|
218
224
|
end
|
219
|
-
# Transfered fibers are not resumed after yielding out.
|
220
|
-
assert_equal [0, 3, 4, 1, 5, 6], results
|
221
|
-
# assert_match /attempt to yield on a not resumed fiber/, out
|
222
225
|
end
|
223
226
|
|
224
227
|
def test_nested_unowned_fibers_no_scheduler
|
data/gems/server/Cargo.lock
CHANGED
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec|
|
|
39
39
|
spec.add_dependency "rack", ">= 1.6"
|
40
40
|
spec.add_dependency "json", '~> 2'
|
41
41
|
spec.add_dependency "rb_sys", "~> 0.9.91"
|
42
|
+
spec.add_dependency 'prism', '~> 1.4'
|
42
43
|
|
43
44
|
spec.add_development_dependency "ruby-lsp"
|
44
45
|
# For more information and examples about making a new gem, check out our
|
@@ -42,7 +42,16 @@ module Itsi
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def self.included(cls) # rubocop:disable Metrics/PerceivedComplexity,Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
|
45
|
+
|
46
|
+
class << cls
|
47
|
+
def subclasses
|
48
|
+
@subclasses ||= []
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
45
52
|
def cls.inherited(base) # rubocop:disable Metrics/MethodLength,Lint/MissingSuper,Metrics/PerceivedComplexity
|
53
|
+
self.subclasses << base
|
54
|
+
|
46
55
|
%i[detail documentation insert_text schema].each do |attr|
|
47
56
|
base.define_singleton_method(attr) do |value = nil|
|
48
57
|
@middleware_class_attrs ||= {}
|
data/lib/itsi/version.rb
CHANGED
data/tasks.txt
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
|
2
|
-
- Opt in to gRPC compression override, per endpoint or per service
|
3
|
-
|
1
|
+
Tasks:
|
4
2
|
- Static ruby build
|
5
|
-
- Add
|
3
|
+
- Add way to opt non Itsi.rb files into LSP
|
6
4
|
- OTel
|
7
5
|
- Even faster Hash creation for Rack
|
8
6
|
- Image resizer
|
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.
|
4
|
+
version: 0.2.8
|
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.
|
18
|
+
version: 0.2.8
|
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.
|
25
|
+
version: 0.2.8
|
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.
|
32
|
+
version: 0.2.8
|
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.
|
39
|
+
version: 0.2.8
|
40
40
|
description: Wrapper Gem for both the Itsi server and the Itsi Fiber scheduler
|
41
41
|
email:
|
42
42
|
- wc@pico.net.nz
|
@@ -1035,7 +1035,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
1035
1035
|
requirements:
|
1036
1036
|
- - ">="
|
1037
1037
|
- !ruby/object:Gem::Version
|
1038
|
-
version: '
|
1038
|
+
version: '3.1'
|
1039
1039
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1040
1040
|
requirements:
|
1041
1041
|
- - ">="
|