itsi-scheduler 0.1.5 → 0.1.19

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.

Potentially problematic release.


This version of itsi-scheduler might be problematic. Click here for more details.

Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +7 -0
  3. data/Cargo.lock +90 -22
  4. data/README.md +5 -0
  5. data/_index.md +7 -0
  6. data/ext/itsi_error/Cargo.toml +1 -0
  7. data/ext/itsi_error/src/lib.rs +106 -7
  8. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
  9. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
  10. data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
  11. data/ext/itsi_error/target/debug/build/rb-sys-49f554618693db24/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
  12. data/ext/itsi_error/target/debug/incremental/itsi_error-1mmt5sux7jb0i/s-h510z7m8v9-0bxu7yd.lock +0 -0
  13. data/ext/itsi_error/target/debug/incremental/itsi_error-2vn3jey74oiw0/s-h5113n0e7e-1v5qzs6.lock +0 -0
  14. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510ykifhe-0tbnep2.lock +0 -0
  15. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510yyocpj-0tz7ug7.lock +0 -0
  16. data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510z0xc8g-14ol18k.lock +0 -0
  17. data/ext/itsi_error/target/debug/incremental/itsi_error-3g5qf4y7d54uj/s-h5113n0e7d-1trk8on.lock +0 -0
  18. data/ext/itsi_error/target/debug/incremental/itsi_error-3lpfftm45d3e2/s-h510z7m8r3-1pxp20o.lock +0 -0
  19. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510ykifek-1uxasnk.lock +0 -0
  20. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510yyocki-11u37qm.lock +0 -0
  21. data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510z0xc93-0pmy0zm.lock +0 -0
  22. data/ext/itsi_rb_helpers/Cargo.toml +1 -0
  23. data/ext/itsi_rb_helpers/src/heap_value.rs +18 -0
  24. data/ext/itsi_rb_helpers/src/lib.rs +59 -9
  25. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
  26. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
  27. data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
  28. data/ext/itsi_rb_helpers/target/debug/build/rb-sys-eb9ed4ff3a60f995/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
  29. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-040pxg6yhb3g3/s-h5113n7a1b-03bwlt4.lock +0 -0
  30. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h51113xnh3-1eik1ip.lock +0 -0
  31. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h5111704jj-0g4rj8x.lock +0 -0
  32. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-1q2d3drtxrzs5/s-h5113n79yl-0bxcqc5.lock +0 -0
  33. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h51113xoox-10de2hp.lock +0 -0
  34. data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h5111704w7-0vdq7gq.lock +0 -0
  35. data/ext/itsi_scheduler/src/itsi_scheduler.rs +1 -1
  36. data/ext/itsi_server/Cargo.lock +2956 -0
  37. data/ext/itsi_server/Cargo.toml +72 -28
  38. data/ext/itsi_server/src/default_responses/mod.rs +11 -0
  39. data/ext/itsi_server/src/env.rs +43 -0
  40. data/ext/itsi_server/src/lib.rs +113 -75
  41. data/ext/itsi_server/src/prelude.rs +2 -0
  42. data/ext/itsi_server/src/{body_proxy → ruby_types/itsi_body_proxy}/big_bytes.rs +10 -5
  43. data/ext/itsi_server/src/{body_proxy/itsi_body_proxy.rs → ruby_types/itsi_body_proxy/mod.rs} +29 -8
  44. data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
  45. data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +264 -0
  46. data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +345 -0
  47. data/ext/itsi_server/src/{response/itsi_response.rs → ruby_types/itsi_http_response.rs} +84 -40
  48. data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +225 -0
  49. data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +375 -0
  50. data/ext/itsi_server/src/ruby_types/itsi_server.rs +83 -0
  51. data/ext/itsi_server/src/ruby_types/mod.rs +48 -0
  52. data/ext/itsi_server/src/server/{bind.rs → binds/bind.rs} +56 -24
  53. data/ext/itsi_server/src/server/{listener.rs → binds/listener.rs} +218 -113
  54. data/ext/itsi_server/src/server/binds/mod.rs +4 -0
  55. data/ext/itsi_server/src/server/{tls → binds/tls}/locked_dir_cache.rs +55 -17
  56. data/ext/itsi_server/src/server/{tls.rs → binds/tls.rs} +109 -28
  57. data/ext/itsi_server/src/server/byte_frame.rs +32 -0
  58. data/ext/itsi_server/src/server/http_message_types.rs +97 -0
  59. data/ext/itsi_server/src/server/io_stream.rs +2 -1
  60. data/ext/itsi_server/src/server/lifecycle_event.rs +3 -0
  61. data/ext/itsi_server/src/server/middleware_stack/middleware.rs +165 -0
  62. data/ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +56 -0
  63. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +87 -0
  64. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +86 -0
  65. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +285 -0
  66. data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +142 -0
  67. data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +289 -0
  68. data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +292 -0
  69. data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +55 -0
  70. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +190 -0
  71. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +157 -0
  72. data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +195 -0
  73. data/ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +82 -0
  74. data/ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +201 -0
  75. data/ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +82 -0
  76. data/ext/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
  77. data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +87 -0
  78. data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +414 -0
  79. data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +131 -0
  80. data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +76 -0
  81. data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +44 -0
  82. data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +36 -0
  83. data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +126 -0
  84. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +180 -0
  85. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
  86. data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +163 -0
  87. data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +12 -0
  88. data/ext/itsi_server/src/server/middleware_stack/mod.rs +347 -0
  89. data/ext/itsi_server/src/server/mod.rs +6 -5
  90. data/ext/itsi_server/src/server/process_worker.rs +65 -14
  91. data/ext/itsi_server/src/server/request_job.rs +11 -0
  92. data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +137 -49
  93. data/ext/itsi_server/src/server/serve_strategy/mod.rs +9 -6
  94. data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +338 -164
  95. data/ext/itsi_server/src/server/signal.rs +32 -26
  96. data/ext/itsi_server/src/server/size_limited_incoming.rs +101 -0
  97. data/ext/itsi_server/src/server/thread_worker.rs +214 -107
  98. data/ext/itsi_server/src/services/cache_store.rs +74 -0
  99. data/ext/itsi_server/src/services/itsi_http_service.rs +239 -0
  100. data/ext/itsi_server/src/services/mime_types.rs +1416 -0
  101. data/ext/itsi_server/src/services/mod.rs +6 -0
  102. data/ext/itsi_server/src/services/password_hasher.rs +83 -0
  103. data/ext/itsi_server/src/services/rate_limiter.rs +569 -0
  104. data/ext/itsi_server/src/services/static_file_server.rs +1324 -0
  105. data/ext/itsi_tracing/Cargo.toml +1 -0
  106. data/ext/itsi_tracing/src/lib.rs +312 -34
  107. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock +0 -0
  108. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock +0 -0
  109. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock +0 -0
  110. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock +0 -0
  111. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock +0 -0
  112. data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock +0 -0
  113. data/lib/itsi/scheduler/version.rb +1 -1
  114. data/lib/itsi/scheduler.rb +2 -2
  115. metadata +93 -21
  116. data/ext/itsi_error/src/from.rs +0 -71
  117. data/ext/itsi_server/extconf.rb +0 -6
  118. data/ext/itsi_server/src/body_proxy/mod.rs +0 -2
  119. data/ext/itsi_server/src/request/itsi_request.rs +0 -277
  120. data/ext/itsi_server/src/request/mod.rs +0 -1
  121. data/ext/itsi_server/src/response/mod.rs +0 -1
  122. data/ext/itsi_server/src/server/itsi_ca/itsi_ca.crt +0 -13
  123. data/ext/itsi_server/src/server/itsi_ca/itsi_ca.key +0 -5
  124. data/ext/itsi_server/src/server/itsi_server.rs +0 -244
  125. /data/ext/itsi_server/src/server/{bind_protocol.rs → binds/bind_protocol.rs} +0 -0
@@ -14,3 +14,4 @@ tracing-subscriber = { version = "0.3.19", features = [
14
14
  ] }
15
15
  tracing-attributes = "0.1"
16
16
  atty = "0.2.14"
17
+ tracing-appender = "0.2.3"
@@ -1,41 +1,319 @@
1
- use std::env;
2
-
3
1
  use atty::{Stream, is};
4
- pub use tracing::{debug, error, info, trace, warn};
5
- pub use tracing_attributes::instrument; // Explicitly export from tracing-attributes
6
- use tracing_subscriber::{
7
- EnvFilter,
8
- fmt::{self, format},
2
+ use std::{
3
+ env,
4
+ sync::{Mutex, OnceLock},
9
5
  };
6
+ pub use tracing::{debug, error, info, trace, warn};
7
+ use tracing_appender::rolling;
8
+ use tracing_subscriber::fmt::writer::BoxMakeWriter;
9
+ use tracing_subscriber::{EnvFilter, fmt, prelude::*, reload};
10
+ use tracing_subscriber::{Layer, Registry, layer::Layered};
11
+
12
+ // Global reload handle for changing the level at runtime.
13
+ static RELOAD_HANDLE: OnceLock<
14
+ Mutex<Option<reload::Handle<EnvFilter, tracing_subscriber::Registry>>>,
15
+ > = OnceLock::new();
16
+
17
+ // Global reload handle for changing the formatting layer (log target/format) at runtime.
18
+ type ReloadFmtHandle = reload::Handle<
19
+ Box<
20
+ dyn Layer<
21
+ tracing_subscriber::layer::Layered<
22
+ reload::Layer<EnvFilter, tracing_subscriber::Registry>,
23
+ tracing_subscriber::Registry,
24
+ >,
25
+ > + Send
26
+ + Sync,
27
+ >,
28
+ Layered<tracing_subscriber::reload::Layer<EnvFilter, Registry>, Registry>,
29
+ >;
30
+
31
+ static RELOAD_FMT_HANDLE: OnceLock<Mutex<Option<ReloadFmtHandle>>> = OnceLock::new();
32
+
33
+ // Global current log configuration for formatting options.
34
+ static CURRENT_CONFIG: OnceLock<Mutex<LogConfig>> = OnceLock::new();
35
+
36
+ /// Log format: Plain or JSON.
37
+ #[derive(Debug, Clone)]
38
+ pub enum LogFormat {
39
+ Plain,
40
+ Json,
41
+ }
42
+
43
+ /// Log target: STDOUT, File, or Both.
44
+ #[derive(Debug, Clone)]
45
+ pub enum LogTarget {
46
+ Stdout,
47
+ File(String), // file name (rotated daily)
48
+ Both(String), // file name (rotated daily) plus STDOUT
49
+ }
50
+
51
+ /// Logger configuration.
52
+ #[derive(Debug, Clone)]
53
+ pub struct LogConfig {
54
+ /// Log level as a string (e.g. "info", "debug").
55
+ pub level: String,
56
+ /// Format: Plain (with optional ANSI) or JSON.
57
+ pub format: LogFormat,
58
+ /// Target: STDOUT, File, or Both.
59
+ pub target: LogTarget,
60
+ /// Whether to enable ANSI coloring (for plain text).
61
+ pub use_ansi: bool,
62
+ }
63
+
64
+ impl Default for LogConfig {
65
+ fn default() -> Self {
66
+ let level = env::var("ITSI_LOG").unwrap_or_else(|_| "info".into());
67
+ let format = match env::var("ITSI_LOG_FORMAT").as_deref() {
68
+ Ok("json") => LogFormat::Json,
69
+ _ => LogFormat::Plain,
70
+ };
71
+ let target = match env::var("ITSI_LOG_TARGET").as_deref() {
72
+ Ok("file") => {
73
+ let file = env::var("ITSI_LOG_FILE").unwrap_or_else(|_| "app.log".into());
74
+ LogTarget::File(file)
75
+ }
76
+ Ok("both") => {
77
+ let file = env::var("ITSI_LOG_FILE").unwrap_or_else(|_| "app.log".into());
78
+ LogTarget::Both(file)
79
+ }
80
+ _ => LogTarget::Stdout,
81
+ };
82
+ // If ITSI_LOG_ANSI is set, use that; otherwise, use ANSI if stdout is a TTY.
83
+ let use_ansi = env::var("ITSI_LOG_ANSI")
84
+ .map(|s| s == "true")
85
+ .unwrap_or_else(|_| is(Stream::Stdout));
86
+ Self {
87
+ level,
88
+ format,
89
+ target,
90
+ use_ansi,
91
+ }
92
+ }
93
+ }
94
+
95
+ /// Build the formatting layer based on the provided configuration.
96
+ fn build_fmt_layer(
97
+ config: &LogConfig,
98
+ ) -> Box<
99
+ dyn Layer<
100
+ tracing_subscriber::layer::Layered<
101
+ reload::Layer<EnvFilter, tracing_subscriber::Registry>,
102
+ tracing_subscriber::Registry,
103
+ >,
104
+ > + Send
105
+ + Sync,
106
+ > {
107
+ match &config.target {
108
+ LogTarget::Stdout => match config.format {
109
+ LogFormat::Plain => fmt::layer()
110
+ .compact()
111
+ .with_file(false)
112
+ .with_line_number(false)
113
+ .with_target(false)
114
+ .with_thread_ids(false)
115
+ .with_writer(BoxMakeWriter::new(std::io::stdout))
116
+ .with_ansi(config.use_ansi)
117
+ .boxed(),
118
+ LogFormat::Json => fmt::layer()
119
+ .compact()
120
+ .with_file(false)
121
+ .with_line_number(false)
122
+ .with_target(false)
123
+ .with_thread_ids(false)
124
+ .with_writer(BoxMakeWriter::new(std::io::stdout))
125
+ .with_ansi(config.use_ansi)
126
+ .json()
127
+ .boxed(),
128
+ },
129
+ LogTarget::File(file) => {
130
+ let file_clone = file.clone();
131
+ match config.format {
132
+ LogFormat::Plain => fmt::layer()
133
+ .compact()
134
+ .with_file(false)
135
+ .with_line_number(false)
136
+ .with_target(false)
137
+ .with_thread_ids(false)
138
+ .with_writer(BoxMakeWriter::new(move || {
139
+ rolling::daily(".", file_clone.clone())
140
+ }))
141
+ .with_ansi(false)
142
+ .boxed(),
143
+ LogFormat::Json => {
144
+ let file_clone = file.clone();
145
+ fmt::layer()
146
+ .compact()
147
+ .with_file(false)
148
+ .with_line_number(false)
149
+ .with_target(false)
150
+ .with_thread_ids(false)
151
+ .with_writer(BoxMakeWriter::new(move || {
152
+ rolling::daily(".", file_clone.clone())
153
+ }))
154
+ .with_ansi(false)
155
+ .json()
156
+ .boxed()
157
+ }
158
+ }
159
+ }
160
+ LogTarget::Both(file) => {
161
+ let file_clone = file.clone();
162
+ match config.format {
163
+ LogFormat::Plain => {
164
+ let stdout_layer = fmt::layer()
165
+ .compact()
166
+ .with_file(false)
167
+ .with_line_number(false)
168
+ .with_target(false)
169
+ .with_thread_ids(false)
170
+ .with_writer(BoxMakeWriter::new(std::io::stdout))
171
+ .with_ansi(config.use_ansi);
172
+ let file_layer = fmt::layer()
173
+ .compact()
174
+ .with_file(false)
175
+ .with_line_number(false)
176
+ .with_target(false)
177
+ .with_thread_ids(false)
178
+ .with_writer(BoxMakeWriter::new(move || {
179
+ rolling::daily(".", file_clone.clone())
180
+ }))
181
+ .with_ansi(false);
182
+ stdout_layer.and_then(file_layer).boxed()
183
+ }
184
+ LogFormat::Json => {
185
+ let stdout_layer = fmt::layer()
186
+ .compact()
187
+ .with_file(false)
188
+ .with_line_number(false)
189
+ .with_target(false)
190
+ .with_thread_ids(false)
191
+ .with_writer(BoxMakeWriter::new(std::io::stdout))
192
+ .with_ansi(config.use_ansi)
193
+ .json();
194
+ let file_layer = fmt::layer()
195
+ .compact()
196
+ .with_file(false)
197
+ .with_line_number(false)
198
+ .with_target(false)
199
+ .with_thread_ids(false)
200
+ .with_writer(BoxMakeWriter::new(move || {
201
+ rolling::daily(".", file_clone.clone())
202
+ }))
203
+ .with_ansi(false)
204
+ .json();
205
+ stdout_layer.and_then(file_layer).boxed()
206
+ }
207
+ }
208
+ }
209
+ }
210
+ }
211
+
212
+ /// Update the formatting layer using the current configuration.
213
+ fn update_fmt_layer(config: &LogConfig) {
214
+ if let Some(handle) = RELOAD_FMT_HANDLE.get().unwrap().lock().unwrap().as_ref() {
215
+ let new_layer = build_fmt_layer(config);
216
+ handle
217
+ .modify(|layer| {
218
+ *layer = new_layer;
219
+ })
220
+ .expect("Failed to update formatting layer");
221
+ } else {
222
+ eprintln!("Reload handle for formatting layer not initialized; call init() first.");
223
+ }
224
+ }
10
225
 
11
- #[instrument]
226
+ /// Initialize the global tracing subscriber with the default configuration.
12
227
  pub fn init() {
13
- let env_filter = EnvFilter::builder()
14
- .with_env_var("ITSI_LOG")
15
- .try_from_env()
16
- .unwrap_or_else(|_| EnvFilter::new("info"));
17
-
18
- let format = fmt::format()
19
- .compact()
20
- .with_file(false)
21
- .with_level(true)
22
- .with_line_number(false)
23
- .with_source_location(false)
24
- .with_target(false)
25
- .with_thread_ids(false);
26
-
27
- let is_tty = is(Stream::Stdout);
28
-
29
- let subscriber = tracing_subscriber::fmt()
30
- .event_format(format)
31
- .with_env_filter(env_filter);
32
-
33
- if (is_tty && env::var("ITSI_LOG_PLAIN").is_err()) || env::var("ITSI_LOG_ANSI").is_ok() {
34
- subscriber.with_ansi(true).init();
228
+ init_with_config(LogConfig::default());
229
+ }
230
+
231
+ /// Initialize the global tracing subscriber with a given configuration.
232
+ pub fn init_with_config(config: LogConfig) {
233
+ // Store the current config in a global for future updates.
234
+ CURRENT_CONFIG.set(Mutex::new(config.clone())).ok();
235
+
236
+ // Build an EnvFilter from the configured level.
237
+ let env_filter = EnvFilter::new(config.clone().level);
238
+
239
+ // Build the formatting layer based on the configuration.
240
+ let fmt_layer = build_fmt_layer(&config);
241
+
242
+ // Create a reloadable filter layer so we can update the level at runtime.
243
+ let (filter_layer, filter_handle) = reload::Layer::new(env_filter);
244
+
245
+ // Create a reloadable formatting layer so we can update the target/format at runtime.
246
+ let (fmt_layer, fmt_handle) = reload::Layer::new(fmt_layer);
247
+
248
+ // Build the subscriber registry.
249
+ let subscriber = tracing_subscriber::registry()
250
+ .with(filter_layer)
251
+ .with(fmt_layer);
252
+
253
+ tracing::subscriber::set_global_default(subscriber)
254
+ .expect("Unable to set global tracing subscriber");
255
+
256
+ RELOAD_HANDLE.set(Mutex::new(Some(filter_handle))).unwrap();
257
+ RELOAD_FMT_HANDLE.set(Mutex::new(Some(fmt_handle))).ok();
258
+ }
259
+
260
+ /// Change the log level at runtime.
261
+ pub fn set_level(new_level: &str) {
262
+ if let Some(handle) = RELOAD_HANDLE.get().unwrap().lock().unwrap().as_ref() {
263
+ handle
264
+ .modify(|filter| *filter = EnvFilter::new(new_level))
265
+ .expect("Failed to update log level");
266
+
267
+ // Also update the stored config.
268
+ if let Some(config_mutex) = CURRENT_CONFIG.get() {
269
+ let mut config = config_mutex.lock().unwrap();
270
+ config.level = new_level.to_string();
271
+ }
272
+ } else {
273
+ eprintln!("Reload handle not initialized; call init() first.");
274
+ }
275
+ }
276
+
277
+ /// Change the log target at runtime.
278
+ pub fn set_target(new_target: &str) {
279
+ let target: LogTarget = match new_target {
280
+ "stdout" => LogTarget::Stdout,
281
+ path => LogTarget::File(path.to_string()),
282
+ };
283
+ if let Some(config_mutex) = CURRENT_CONFIG.get() {
284
+ let mut config = config_mutex.lock().unwrap();
285
+ config.target = target;
286
+ update_fmt_layer(&config);
35
287
  } else {
36
- subscriber
37
- .fmt_fields(format::JsonFields::default())
38
- .event_format(fmt::format().json())
39
- .init();
288
+ eprintln!("Current configuration not initialized; call init() first.");
40
289
  }
41
290
  }
291
+
292
+ /// Change the log format at runtime.
293
+ pub fn set_format(new_format: &str) {
294
+ let format = match new_format {
295
+ "json" => LogFormat::Json,
296
+ "plain" => LogFormat::Plain,
297
+ _ => LogFormat::Json,
298
+ };
299
+ if let Some(config_mutex) = CURRENT_CONFIG.get() {
300
+ let mut config = config_mutex.lock().unwrap();
301
+ config.format = format;
302
+ update_fmt_layer(&config);
303
+ } else {
304
+ eprintln!("Current configuration not initialized; call init() first.");
305
+ }
306
+ }
307
+
308
+ /// Run a function silently by temporarily setting a no-op subscriber.
309
+ pub fn run_silently<F, R>(f: F) -> R
310
+ where
311
+ F: FnOnce() -> R,
312
+ {
313
+ let no_op_subscriber = tracing_subscriber::fmt()
314
+ .with_writer(std::io::sink)
315
+ .with_max_level(tracing_subscriber::filter::LevelFilter::OFF)
316
+ .finish();
317
+ let dispatch = tracing::Dispatch::new(no_op_subscriber);
318
+ tracing::dispatcher::with_default(&dispatch, f)
319
+ }
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Scheduler
5
- VERSION = "0.1.5"
5
+ VERSION = "0.1.19"
6
6
  end
7
7
  end
@@ -73,7 +73,7 @@ module Itsi
73
73
  fiber.resume
74
74
  end
75
75
  rescue StandardError => e
76
- warn "Failed to resume fiber #{fiber}: #{e.message}"
76
+ warn "Fiber #{fiber} terminated on exception: #{e.message}"
77
77
  end
78
78
 
79
79
  def resume_fiber_with_readiness((token, readiness))
@@ -81,7 +81,7 @@ module Itsi
81
81
  fiber.resume(readiness)
82
82
  end
83
83
  rescue StandardError => e
84
- warn "Failed to resume fiber #{fiber}: #{e.message}"
84
+ warn "Fiber #{fiber} terminated on exception: #{e.message}"
85
85
  end
86
86
 
87
87
  def resume_blocked(fiber)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itsi-scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-03-14 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rb_sys
@@ -40,53 +40,125 @@ files:
40
40
  - LICENSE.txt
41
41
  - README.md
42
42
  - Rakefile
43
+ - _index.md
43
44
  - ext/itsi_error/Cargo.lock
44
45
  - ext/itsi_error/Cargo.toml
45
- - ext/itsi_error/src/from.rs
46
46
  - ext/itsi_error/src/lib.rs
47
+ - ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/common.rs
48
+ - ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs
49
+ - ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs
50
+ - ext/itsi_error/target/debug/build/rb-sys-49f554618693db24/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs
51
+ - ext/itsi_error/target/debug/incremental/itsi_error-1mmt5sux7jb0i/s-h510z7m8v9-0bxu7yd.lock
52
+ - ext/itsi_error/target/debug/incremental/itsi_error-2vn3jey74oiw0/s-h5113n0e7e-1v5qzs6.lock
53
+ - ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510ykifhe-0tbnep2.lock
54
+ - ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510yyocpj-0tz7ug7.lock
55
+ - ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510z0xc8g-14ol18k.lock
56
+ - ext/itsi_error/target/debug/incremental/itsi_error-3g5qf4y7d54uj/s-h5113n0e7d-1trk8on.lock
57
+ - ext/itsi_error/target/debug/incremental/itsi_error-3lpfftm45d3e2/s-h510z7m8r3-1pxp20o.lock
58
+ - ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510ykifek-1uxasnk.lock
59
+ - ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510yyocki-11u37qm.lock
60
+ - ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510z0xc93-0pmy0zm.lock
47
61
  - ext/itsi_instrument_entry/Cargo.toml
48
62
  - ext/itsi_instrument_entry/src/lib.rs
49
63
  - ext/itsi_rb_helpers/Cargo.lock
50
64
  - ext/itsi_rb_helpers/Cargo.toml
51
65
  - ext/itsi_rb_helpers/src/heap_value.rs
52
66
  - ext/itsi_rb_helpers/src/lib.rs
67
+ - ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/common.rs
68
+ - ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs
69
+ - ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs
70
+ - ext/itsi_rb_helpers/target/debug/build/rb-sys-eb9ed4ff3a60f995/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs
71
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-040pxg6yhb3g3/s-h5113n7a1b-03bwlt4.lock
72
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h51113xnh3-1eik1ip.lock
73
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h5111704jj-0g4rj8x.lock
74
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-1q2d3drtxrzs5/s-h5113n79yl-0bxcqc5.lock
75
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h51113xoox-10de2hp.lock
76
+ - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h5111704w7-0vdq7gq.lock
53
77
  - ext/itsi_scheduler/Cargo.toml
54
- - ext/itsi_scheduler/extconf.rb
55
78
  - ext/itsi_scheduler/src/itsi_scheduler.rs
56
79
  - ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs
57
80
  - ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs
58
81
  - ext/itsi_scheduler/src/itsi_scheduler/timer.rs
59
82
  - ext/itsi_scheduler/src/lib.rs
83
+ - ext/itsi_server/Cargo.lock
60
84
  - ext/itsi_server/Cargo.toml
61
- - ext/itsi_server/extconf.rb
62
- - ext/itsi_server/src/body_proxy/big_bytes.rs
63
- - ext/itsi_server/src/body_proxy/itsi_body_proxy.rs
64
- - ext/itsi_server/src/body_proxy/mod.rs
85
+ - ext/itsi_server/src/default_responses/mod.rs
86
+ - ext/itsi_server/src/env.rs
65
87
  - ext/itsi_server/src/lib.rs
66
- - ext/itsi_server/src/request/itsi_request.rs
67
- - ext/itsi_server/src/request/mod.rs
68
- - ext/itsi_server/src/response/itsi_response.rs
69
- - ext/itsi_server/src/response/mod.rs
70
- - ext/itsi_server/src/server/bind.rs
71
- - ext/itsi_server/src/server/bind_protocol.rs
88
+ - ext/itsi_server/src/prelude.rs
89
+ - ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs
90
+ - ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs
91
+ - ext/itsi_server/src/ruby_types/itsi_grpc_call.rs
92
+ - ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs
93
+ - ext/itsi_server/src/ruby_types/itsi_http_request.rs
94
+ - ext/itsi_server/src/ruby_types/itsi_http_response.rs
95
+ - ext/itsi_server/src/ruby_types/itsi_server.rs
96
+ - ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs
97
+ - ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs
98
+ - ext/itsi_server/src/ruby_types/mod.rs
99
+ - ext/itsi_server/src/server/binds/bind.rs
100
+ - ext/itsi_server/src/server/binds/bind_protocol.rs
101
+ - ext/itsi_server/src/server/binds/listener.rs
102
+ - ext/itsi_server/src/server/binds/mod.rs
103
+ - ext/itsi_server/src/server/binds/tls.rs
104
+ - ext/itsi_server/src/server/binds/tls/locked_dir_cache.rs
105
+ - ext/itsi_server/src/server/byte_frame.rs
106
+ - ext/itsi_server/src/server/http_message_types.rs
72
107
  - ext/itsi_server/src/server/io_stream.rs
73
- - ext/itsi_server/src/server/itsi_ca/itsi_ca.crt
74
- - ext/itsi_server/src/server/itsi_ca/itsi_ca.key
75
- - ext/itsi_server/src/server/itsi_server.rs
76
108
  - ext/itsi_server/src/server/lifecycle_event.rs
77
- - ext/itsi_server/src/server/listener.rs
109
+ - ext/itsi_server/src/server/middleware_stack/middleware.rs
110
+ - ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs
111
+ - ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs
112
+ - ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs
113
+ - ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs
114
+ - ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs
115
+ - ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs
116
+ - ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs
117
+ - ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs
118
+ - ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs
119
+ - ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs
120
+ - ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs
121
+ - ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs
122
+ - ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs
123
+ - ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs
124
+ - ext/itsi_server/src/server/middleware_stack/middlewares/max_body.rs
125
+ - ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs
126
+ - ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs
127
+ - ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs
128
+ - ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs
129
+ - ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs
130
+ - ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs
131
+ - ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs
132
+ - ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs
133
+ - ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs
134
+ - ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs
135
+ - ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs
136
+ - ext/itsi_server/src/server/middleware_stack/mod.rs
78
137
  - ext/itsi_server/src/server/mod.rs
79
138
  - ext/itsi_server/src/server/process_worker.rs
139
+ - ext/itsi_server/src/server/request_job.rs
80
140
  - ext/itsi_server/src/server/serve_strategy/cluster_mode.rs
81
141
  - ext/itsi_server/src/server/serve_strategy/mod.rs
82
142
  - ext/itsi_server/src/server/serve_strategy/single_mode.rs
83
143
  - ext/itsi_server/src/server/signal.rs
144
+ - ext/itsi_server/src/server/size_limited_incoming.rs
84
145
  - ext/itsi_server/src/server/thread_worker.rs
85
- - ext/itsi_server/src/server/tls.rs
86
- - ext/itsi_server/src/server/tls/locked_dir_cache.rs
146
+ - ext/itsi_server/src/services/cache_store.rs
147
+ - ext/itsi_server/src/services/itsi_http_service.rs
148
+ - ext/itsi_server/src/services/mime_types.rs
149
+ - ext/itsi_server/src/services/mod.rs
150
+ - ext/itsi_server/src/services/password_hasher.rs
151
+ - ext/itsi_server/src/services/rate_limiter.rs
152
+ - ext/itsi_server/src/services/static_file_server.rs
87
153
  - ext/itsi_tracing/Cargo.lock
88
154
  - ext/itsi_tracing/Cargo.toml
89
155
  - ext/itsi_tracing/src/lib.rs
156
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock
157
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock
158
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock
159
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock
160
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock
161
+ - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock
90
162
  - lib/itsi/scheduler.rb
91
163
  - lib/itsi/scheduler/version.rb
92
164
  - sig/itsi_scheduler.rbs
@@ -111,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
183
  - !ruby/object:Gem::Version
112
184
  version: 3.1.11
113
185
  requirements: []
114
- rubygems_version: 3.6.2
186
+ rubygems_version: 3.6.7
115
187
  specification_version: 4
116
188
  summary: Itsi Scheduler - A light-weight Fiber Scheduler implementation for Ruby.
117
189
  test_files: []
@@ -1,71 +0,0 @@
1
- use crate::ItsiError;
2
- use std::ffi::NulError;
3
-
4
- pub static CLIENT_CONNECTION_CLOSED: &str = "Client disconnected";
5
-
6
- impl From<httparse::Error> for ItsiError {
7
- fn from(err: httparse::Error) -> Self {
8
- ItsiError::ArgumentError(err.to_string())
9
- }
10
- }
11
-
12
- impl From<nix::errno::Errno> for ItsiError {
13
- fn from(err: nix::errno::Errno) -> Self {
14
- ItsiError::ArgumentError(err.to_string())
15
- }
16
- }
17
-
18
- impl From<std::io::Error> for ItsiError {
19
- fn from(err: std::io::Error) -> Self {
20
- ItsiError::ArgumentError(err.to_string())
21
- }
22
- }
23
-
24
- impl From<rcgen::Error> for ItsiError {
25
- fn from(err: rcgen::Error) -> Self {
26
- ItsiError::ArgumentError(err.to_string())
27
- }
28
- }
29
-
30
- impl From<NulError> for ItsiError {
31
- fn from(err: NulError) -> Self {
32
- ItsiError::ArgumentError(err.to_string())
33
- }
34
- }
35
-
36
- impl From<magnus::Error> for ItsiError {
37
- fn from(err: magnus::Error) -> Self {
38
- match err.error_type() {
39
- magnus::error::ErrorType::Jump(tag) => ItsiError::Jump(tag.to_string()),
40
- magnus::error::ErrorType::Error(_exception_class, cow) => {
41
- ItsiError::ArgumentError(cow.to_string())
42
- }
43
- magnus::error::ErrorType::Exception(exception) => {
44
- ItsiError::ArgumentError(exception.to_string())
45
- }
46
- }
47
- }
48
- }
49
-
50
- impl From<ItsiError> for magnus::Error {
51
- fn from(err: ItsiError) -> Self {
52
- match err {
53
- ItsiError::InvalidInput(msg) => magnus::Error::new(magnus::exception::arg_error(), msg),
54
- ItsiError::InternalServerError(msg) => {
55
- magnus::Error::new(magnus::exception::exception(), msg)
56
- }
57
- ItsiError::UnsupportedProtocol(msg) => {
58
- magnus::Error::new(magnus::exception::arg_error(), msg)
59
- }
60
- ItsiError::ArgumentError(msg) => {
61
- magnus::Error::new(magnus::exception::arg_error(), msg)
62
- }
63
- ItsiError::Jump(msg) => magnus::Error::new(magnus::exception::local_jump_error(), msg),
64
- ItsiError::Break() => magnus::Error::new(magnus::exception::interrupt(), "Break"),
65
- ItsiError::ClientConnectionClosed => {
66
- magnus::Error::new(magnus::exception::eof_error(), CLIENT_CONNECTION_CLOSED)
67
- }
68
- ItsiError::Pass() => magnus::Error::new(magnus::exception::interrupt(), "Pass"),
69
- }
70
- }
71
- }
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "mkmf"
4
- require "rb_sys/mkmf"
5
-
6
- create_rust_makefile("itsi/server/itsi_server")
@@ -1,2 +0,0 @@
1
- pub mod big_bytes;
2
- pub mod itsi_body_proxy;