itsi 0.1.11 → 0.1.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 (293) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +1535 -45
  3. data/{sandbox/itsi_itsi_file/Itsi.rb → Itsi.rb} +19 -13
  4. data/Rakefile +8 -7
  5. data/crates/itsi_error/src/lib.rs +9 -0
  6. data/crates/itsi_rb_helpers/Cargo.toml +1 -0
  7. data/crates/itsi_rb_helpers/src/heap_value.rs +18 -0
  8. data/crates/itsi_rb_helpers/src/lib.rs +34 -7
  9. data/crates/itsi_server/Cargo.toml +69 -30
  10. data/crates/itsi_server/src/lib.rs +79 -147
  11. data/crates/itsi_server/src/{body_proxy → ruby_types/itsi_body_proxy}/big_bytes.rs +10 -5
  12. data/crates/itsi_server/src/{body_proxy/itsi_body_proxy.rs → ruby_types/itsi_body_proxy/mod.rs} +22 -3
  13. data/crates/itsi_server/src/ruby_types/itsi_grpc_request.rs +147 -0
  14. data/crates/itsi_server/src/ruby_types/itsi_grpc_response.rs +19 -0
  15. data/crates/itsi_server/src/ruby_types/itsi_grpc_stream/mod.rs +216 -0
  16. data/{gems/server/ext/itsi_server/src/request/itsi_request.rs → crates/itsi_server/src/ruby_types/itsi_http_request.rs} +101 -117
  17. data/crates/itsi_server/src/{response/itsi_response.rs → ruby_types/itsi_http_response.rs} +72 -41
  18. data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +225 -0
  19. data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +355 -0
  20. data/crates/itsi_server/src/ruby_types/itsi_server.rs +82 -0
  21. data/crates/itsi_server/src/ruby_types/mod.rs +55 -0
  22. data/crates/itsi_server/src/server/bind.rs +13 -5
  23. data/crates/itsi_server/src/server/byte_frame.rs +32 -0
  24. data/crates/itsi_server/src/server/cache_store.rs +74 -0
  25. data/crates/itsi_server/src/server/itsi_service.rs +172 -0
  26. data/crates/itsi_server/src/server/lifecycle_event.rs +3 -0
  27. data/crates/itsi_server/src/server/listener.rs +102 -2
  28. data/crates/itsi_server/src/server/middleware_stack/middleware.rs +153 -0
  29. data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +47 -0
  30. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +58 -0
  31. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +82 -0
  32. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +321 -0
  33. data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +139 -0
  34. data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +300 -0
  35. data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +287 -0
  36. data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +48 -0
  37. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +127 -0
  38. data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +191 -0
  39. data/crates/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs +72 -0
  40. data/crates/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +85 -0
  41. data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +195 -0
  42. data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +82 -0
  43. data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +82 -0
  44. data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +216 -0
  45. data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +124 -0
  46. data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +76 -0
  47. data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +43 -0
  48. data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +34 -0
  49. data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +93 -0
  50. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +162 -0
  51. data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +158 -0
  52. data/crates/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +12 -0
  53. data/crates/itsi_server/src/server/middleware_stack/mod.rs +315 -0
  54. data/crates/itsi_server/src/server/mod.rs +8 -1
  55. data/crates/itsi_server/src/server/process_worker.rs +38 -12
  56. data/crates/itsi_server/src/server/rate_limiter.rs +565 -0
  57. data/crates/itsi_server/src/server/request_job.rs +11 -0
  58. data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +119 -42
  59. data/crates/itsi_server/src/server/serve_strategy/mod.rs +9 -6
  60. data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +256 -111
  61. data/crates/itsi_server/src/server/signal.rs +19 -0
  62. data/crates/itsi_server/src/server/static_file_server.rs +984 -0
  63. data/crates/itsi_server/src/server/thread_worker.rs +139 -94
  64. data/crates/itsi_server/src/server/types.rs +43 -0
  65. data/crates/itsi_server/test.md +14 -0
  66. data/crates/itsi_tracing/Cargo.toml +1 -0
  67. data/crates/itsi_tracing/src/lib.rs +216 -45
  68. data/docs/.gitignore +7 -0
  69. data/docs/.gitpod.yml +15 -0
  70. data/docs/Itsi.rb +17 -0
  71. data/docs/content/_index.md +17 -0
  72. data/docs/content/about.md +6 -0
  73. data/docs/content/docs/_index.md +18 -0
  74. data/docs/content/docs/first-page.md +9 -0
  75. data/docs/content/docs/folder/_index.md +10 -0
  76. data/docs/content/docs/folder/leaf.md +7 -0
  77. data/docs/go.mod +5 -0
  78. data/docs/go.sum +2 -0
  79. data/docs/hugo.yaml +77 -0
  80. data/examples/static_assets_example.rb +83 -0
  81. data/gems/_index.md +18 -0
  82. data/gems/scheduler/CODE_OF_CONDUCT.md +7 -0
  83. data/gems/scheduler/Cargo.lock +75 -14
  84. data/gems/scheduler/README.md +5 -0
  85. data/gems/scheduler/_index.md +7 -0
  86. data/gems/scheduler/itsi-scheduler.gemspec +4 -1
  87. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  88. data/gems/scheduler/lib/itsi/scheduler.rb +2 -2
  89. data/gems/scheduler/test/test_file_io.rb +0 -1
  90. data/gems/scheduler/test/test_itsi_scheduler.rb +1 -1
  91. data/gems/server/CHANGELOG.md +5 -0
  92. data/gems/server/CODE_OF_CONDUCT.md +7 -0
  93. data/gems/server/Cargo.lock +1536 -45
  94. data/gems/server/README.md +4 -0
  95. data/gems/server/_index.md +6 -0
  96. data/gems/server/exe/itsi +33 -74
  97. data/gems/server/itsi-server.gemspec +3 -2
  98. data/gems/server/lib/itsi/{request.rb → http_request.rb} +29 -5
  99. data/gems/server/lib/itsi/http_response.rb +39 -0
  100. data/gems/server/lib/itsi/server/Itsi.rb +11 -19
  101. data/gems/server/lib/itsi/server/config/dsl.rb +506 -0
  102. data/gems/server/lib/itsi/server/config.rb +103 -8
  103. data/gems/server/lib/itsi/server/default_app/default_app.rb +38 -0
  104. data/gems/server/lib/itsi/server/grpc_interface.rb +213 -0
  105. data/gems/server/lib/itsi/server/rack/handler/itsi.rb +8 -17
  106. data/gems/server/lib/itsi/server/rack_interface.rb +23 -4
  107. data/gems/server/lib/itsi/server/scheduler_interface.rb +1 -1
  108. data/gems/server/lib/itsi/server/scheduler_mode.rb +4 -0
  109. data/gems/server/lib/itsi/server/signal_trap.rb +7 -1
  110. data/gems/server/lib/itsi/server/version.rb +1 -1
  111. data/gems/server/lib/itsi/server.rb +74 -63
  112. data/gems/server/lib/itsi/standard_headers.rb +86 -0
  113. data/gems/server/test/helpers/test_helper.rb +12 -12
  114. data/gems/server/test/test_itsi_server.rb +2 -2
  115. data/lib/itsi/version.rb +1 -1
  116. data/sandbox/itsi_file/Gemfile +11 -0
  117. data/sandbox/itsi_file/Gemfile.lock +69 -0
  118. data/sandbox/itsi_file/Itsi.rb +276 -0
  119. data/sandbox/itsi_file/error.html +2 -0
  120. data/sandbox/itsi_file/organisations_controller.rb +20 -0
  121. data/sandbox/itsi_file/public/assets/image.png +0 -0
  122. data/sandbox/itsi_file/public/assets/index.html +1 -0
  123. data/sandbox/itsi_sandbox_hanami/Gemfile.lock +2 -2
  124. data/sandbox/itsi_sandbox_rack/Gemfile.lock +2 -2
  125. data/sandbox/itsi_sandbox_rack/config.ru +2 -15
  126. data/sandbox/itsi_sandbox_rails/.dockerignore +2 -5
  127. data/sandbox/itsi_sandbox_rails/.github/workflows/ci.yml +1 -1
  128. data/sandbox/itsi_sandbox_rails/.gitignore +2 -1
  129. data/sandbox/itsi_sandbox_rails/Dockerfile +6 -9
  130. data/sandbox/itsi_sandbox_rails/Gemfile +16 -22
  131. data/sandbox/itsi_sandbox_rails/Gemfile.lock +100 -225
  132. data/sandbox/itsi_sandbox_rails/app/assets/config/manifest.js +4 -0
  133. data/sandbox/itsi_sandbox_rails/app/assets/stylesheets/application.css +11 -6
  134. data/sandbox/itsi_sandbox_rails/app/channels/application_cable/channel.rb +4 -0
  135. data/sandbox/itsi_sandbox_rails/app/channels/application_cable/connection.rb +4 -0
  136. data/sandbox/itsi_sandbox_rails/app/controllers/live_controller.rb +7 -8
  137. data/sandbox/itsi_sandbox_rails/app/controllers/uploads_controller.rb +0 -3
  138. data/sandbox/itsi_sandbox_rails/app/views/layouts/application.html.erb +2 -7
  139. data/sandbox/itsi_sandbox_rails/bin/docker-entrypoint +3 -4
  140. data/sandbox/itsi_sandbox_rails/bin/setup +8 -5
  141. data/sandbox/itsi_sandbox_rails/config/application.rb +1 -35
  142. data/sandbox/itsi_sandbox_rails/config/cable.yml +3 -10
  143. data/sandbox/itsi_sandbox_rails/config/credentials.yml.enc +1 -1
  144. data/sandbox/itsi_sandbox_rails/config/database.yml +9 -19
  145. data/sandbox/itsi_sandbox_rails/config/environment.rb +1 -1
  146. data/sandbox/itsi_sandbox_rails/config/environments/development.rb +21 -12
  147. data/sandbox/itsi_sandbox_rails/config/environments/production.rb +49 -34
  148. data/sandbox/itsi_sandbox_rails/config/environments/test.rb +19 -5
  149. data/sandbox/itsi_sandbox_rails/config/initializers/assets.rb +5 -0
  150. data/sandbox/itsi_sandbox_rails/config/initializers/filter_parameter_logging.rb +1 -1
  151. data/sandbox/itsi_sandbox_rails/config/initializers/permissions_policy.rb +13 -0
  152. data/sandbox/itsi_sandbox_rails/config/puma.rb +2 -9
  153. data/sandbox/itsi_sandbox_rails/config.ru +0 -1
  154. data/sandbox/itsi_sandbox_rails/db/migrate/20250301041554_create_posts.rb +1 -1
  155. data/sandbox/itsi_sandbox_rails/db/schema.rb +2 -2
  156. data/sandbox/itsi_sandbox_rails/lib/assets/.keep +0 -0
  157. data/sandbox/itsi_sandbox_rails/public/404.html +66 -113
  158. data/sandbox/itsi_sandbox_rails/public/406-unsupported-browser.html +65 -113
  159. data/sandbox/itsi_sandbox_rails/public/422.html +66 -113
  160. data/sandbox/itsi_sandbox_rails/public/500.html +65 -113
  161. data/sandbox/itsi_sandbox_rails/public/icon.png +0 -0
  162. data/sandbox/itsi_sandbox_rails/public/icon.svg +2 -2
  163. data/sandbox/itsi_sandbox_rails/test/channels/application_cable/connection_test.rb +13 -0
  164. data/sandbox/itsi_sandbox_roda/Gemfile.lock +3 -10
  165. data/tasks.txt +72 -35
  166. metadata +89 -139
  167. data/crates/itsi_server/src/body_proxy/mod.rs +0 -2
  168. data/crates/itsi_server/src/request/itsi_request.rs +0 -298
  169. data/crates/itsi_server/src/request/mod.rs +0 -1
  170. data/crates/itsi_server/src/response/mod.rs +0 -1
  171. data/crates/itsi_server/src/server/itsi_server.rs +0 -288
  172. data/gems/scheduler/ext/itsi_error/Cargo.lock +0 -368
  173. data/gems/scheduler/ext/itsi_error/Cargo.toml +0 -11
  174. data/gems/scheduler/ext/itsi_error/src/from.rs +0 -68
  175. data/gems/scheduler/ext/itsi_error/src/lib.rs +0 -24
  176. data/gems/scheduler/ext/itsi_instrument_entry/Cargo.toml +0 -15
  177. data/gems/scheduler/ext/itsi_instrument_entry/src/lib.rs +0 -31
  178. data/gems/scheduler/ext/itsi_rb_helpers/Cargo.lock +0 -355
  179. data/gems/scheduler/ext/itsi_rb_helpers/Cargo.toml +0 -10
  180. data/gems/scheduler/ext/itsi_rb_helpers/src/heap_value.rs +0 -121
  181. data/gems/scheduler/ext/itsi_rb_helpers/src/lib.rs +0 -201
  182. data/gems/scheduler/ext/itsi_scheduler/Cargo.toml +0 -24
  183. data/gems/scheduler/ext/itsi_scheduler/extconf.rb +0 -6
  184. data/gems/scheduler/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +0 -56
  185. data/gems/scheduler/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +0 -44
  186. data/gems/scheduler/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +0 -44
  187. data/gems/scheduler/ext/itsi_scheduler/src/itsi_scheduler.rs +0 -308
  188. data/gems/scheduler/ext/itsi_scheduler/src/lib.rs +0 -38
  189. data/gems/scheduler/ext/itsi_server/Cargo.lock +0 -2956
  190. data/gems/scheduler/ext/itsi_server/Cargo.toml +0 -50
  191. data/gems/scheduler/ext/itsi_server/extconf.rb +0 -6
  192. data/gems/scheduler/ext/itsi_server/src/body_proxy/big_bytes.rs +0 -104
  193. data/gems/scheduler/ext/itsi_server/src/body_proxy/itsi_body_proxy.rs +0 -122
  194. data/gems/scheduler/ext/itsi_server/src/body_proxy/mod.rs +0 -2
  195. data/gems/scheduler/ext/itsi_server/src/env.rs +0 -43
  196. data/gems/scheduler/ext/itsi_server/src/lib.rs +0 -180
  197. data/gems/scheduler/ext/itsi_server/src/request/itsi_request.rs +0 -298
  198. data/gems/scheduler/ext/itsi_server/src/request/mod.rs +0 -1
  199. data/gems/scheduler/ext/itsi_server/src/response/itsi_response.rs +0 -357
  200. data/gems/scheduler/ext/itsi_server/src/response/mod.rs +0 -1
  201. data/gems/scheduler/ext/itsi_server/src/server/bind.rs +0 -174
  202. data/gems/scheduler/ext/itsi_server/src/server/bind_protocol.rs +0 -37
  203. data/gems/scheduler/ext/itsi_server/src/server/io_stream.rs +0 -104
  204. data/gems/scheduler/ext/itsi_server/src/server/itsi_server.rs +0 -288
  205. data/gems/scheduler/ext/itsi_server/src/server/lifecycle_event.rs +0 -9
  206. data/gems/scheduler/ext/itsi_server/src/server/listener.rs +0 -318
  207. data/gems/scheduler/ext/itsi_server/src/server/mod.rs +0 -11
  208. data/gems/scheduler/ext/itsi_server/src/server/process_worker.rs +0 -203
  209. data/gems/scheduler/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +0 -260
  210. data/gems/scheduler/ext/itsi_server/src/server/serve_strategy/mod.rs +0 -27
  211. data/gems/scheduler/ext/itsi_server/src/server/serve_strategy/single_mode.rs +0 -276
  212. data/gems/scheduler/ext/itsi_server/src/server/signal.rs +0 -74
  213. data/gems/scheduler/ext/itsi_server/src/server/thread_worker.rs +0 -399
  214. data/gems/scheduler/ext/itsi_server/src/server/tls/locked_dir_cache.rs +0 -132
  215. data/gems/scheduler/ext/itsi_server/src/server/tls.rs +0 -265
  216. data/gems/scheduler/ext/itsi_tracing/Cargo.lock +0 -274
  217. data/gems/scheduler/ext/itsi_tracing/Cargo.toml +0 -16
  218. data/gems/scheduler/ext/itsi_tracing/src/lib.rs +0 -58
  219. data/gems/server/ext/itsi_error/Cargo.lock +0 -368
  220. data/gems/server/ext/itsi_error/Cargo.toml +0 -11
  221. data/gems/server/ext/itsi_error/src/from.rs +0 -68
  222. data/gems/server/ext/itsi_error/src/lib.rs +0 -24
  223. data/gems/server/ext/itsi_instrument_entry/Cargo.toml +0 -15
  224. data/gems/server/ext/itsi_instrument_entry/src/lib.rs +0 -31
  225. data/gems/server/ext/itsi_rb_helpers/Cargo.lock +0 -355
  226. data/gems/server/ext/itsi_rb_helpers/Cargo.toml +0 -10
  227. data/gems/server/ext/itsi_rb_helpers/src/heap_value.rs +0 -121
  228. data/gems/server/ext/itsi_rb_helpers/src/lib.rs +0 -201
  229. data/gems/server/ext/itsi_scheduler/Cargo.toml +0 -24
  230. data/gems/server/ext/itsi_scheduler/extconf.rb +0 -6
  231. data/gems/server/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +0 -56
  232. data/gems/server/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +0 -44
  233. data/gems/server/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +0 -44
  234. data/gems/server/ext/itsi_scheduler/src/itsi_scheduler.rs +0 -308
  235. data/gems/server/ext/itsi_scheduler/src/lib.rs +0 -38
  236. data/gems/server/ext/itsi_server/Cargo.lock +0 -2956
  237. data/gems/server/ext/itsi_server/Cargo.toml +0 -50
  238. data/gems/server/ext/itsi_server/extconf.rb +0 -6
  239. data/gems/server/ext/itsi_server/src/body_proxy/big_bytes.rs +0 -104
  240. data/gems/server/ext/itsi_server/src/body_proxy/itsi_body_proxy.rs +0 -122
  241. data/gems/server/ext/itsi_server/src/body_proxy/mod.rs +0 -2
  242. data/gems/server/ext/itsi_server/src/env.rs +0 -43
  243. data/gems/server/ext/itsi_server/src/lib.rs +0 -180
  244. data/gems/server/ext/itsi_server/src/request/mod.rs +0 -1
  245. data/gems/server/ext/itsi_server/src/response/itsi_response.rs +0 -357
  246. data/gems/server/ext/itsi_server/src/response/mod.rs +0 -1
  247. data/gems/server/ext/itsi_server/src/server/bind.rs +0 -174
  248. data/gems/server/ext/itsi_server/src/server/bind_protocol.rs +0 -37
  249. data/gems/server/ext/itsi_server/src/server/io_stream.rs +0 -104
  250. data/gems/server/ext/itsi_server/src/server/itsi_server.rs +0 -288
  251. data/gems/server/ext/itsi_server/src/server/lifecycle_event.rs +0 -9
  252. data/gems/server/ext/itsi_server/src/server/listener.rs +0 -318
  253. data/gems/server/ext/itsi_server/src/server/mod.rs +0 -11
  254. data/gems/server/ext/itsi_server/src/server/process_worker.rs +0 -203
  255. data/gems/server/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +0 -260
  256. data/gems/server/ext/itsi_server/src/server/serve_strategy/mod.rs +0 -27
  257. data/gems/server/ext/itsi_server/src/server/serve_strategy/single_mode.rs +0 -276
  258. data/gems/server/ext/itsi_server/src/server/signal.rs +0 -74
  259. data/gems/server/ext/itsi_server/src/server/thread_worker.rs +0 -399
  260. data/gems/server/ext/itsi_server/src/server/tls/locked_dir_cache.rs +0 -132
  261. data/gems/server/ext/itsi_server/src/server/tls.rs +0 -265
  262. data/gems/server/ext/itsi_tracing/Cargo.lock +0 -274
  263. data/gems/server/ext/itsi_tracing/Cargo.toml +0 -16
  264. data/gems/server/ext/itsi_tracing/src/lib.rs +0 -58
  265. data/gems/server/lib/itsi/server/options_dsl.rb +0 -401
  266. data/gems/server/lib/itsi/stream_io.rb +0 -38
  267. data/location_dsl.rb +0 -381
  268. data/sandbox/itsi_sandbox_rails/.kamal/hooks/docker-setup.sample +0 -3
  269. data/sandbox/itsi_sandbox_rails/.kamal/hooks/post-app-boot.sample +0 -3
  270. data/sandbox/itsi_sandbox_rails/.kamal/hooks/post-deploy.sample +0 -14
  271. data/sandbox/itsi_sandbox_rails/.kamal/hooks/post-proxy-reboot.sample +0 -3
  272. data/sandbox/itsi_sandbox_rails/.kamal/hooks/pre-app-boot.sample +0 -3
  273. data/sandbox/itsi_sandbox_rails/.kamal/hooks/pre-build.sample +0 -51
  274. data/sandbox/itsi_sandbox_rails/.kamal/hooks/pre-connect.sample +0 -47
  275. data/sandbox/itsi_sandbox_rails/.kamal/hooks/pre-deploy.sample +0 -109
  276. data/sandbox/itsi_sandbox_rails/.kamal/hooks/pre-proxy-reboot.sample +0 -3
  277. data/sandbox/itsi_sandbox_rails/.kamal/secrets +0 -17
  278. data/sandbox/itsi_sandbox_rails/bin/dev +0 -2
  279. data/sandbox/itsi_sandbox_rails/bin/jobs +0 -6
  280. data/sandbox/itsi_sandbox_rails/bin/kamal +0 -27
  281. data/sandbox/itsi_sandbox_rails/bin/thrust +0 -5
  282. data/sandbox/itsi_sandbox_rails/config/cache.yml +0 -16
  283. data/sandbox/itsi_sandbox_rails/config/deploy.yml +0 -116
  284. data/sandbox/itsi_sandbox_rails/config/queue.yml +0 -18
  285. data/sandbox/itsi_sandbox_rails/config/recurring.yml +0 -10
  286. data/sandbox/itsi_sandbox_rails/db/cable_schema.rb +0 -11
  287. data/sandbox/itsi_sandbox_rails/db/cache_schema.rb +0 -14
  288. data/sandbox/itsi_sandbox_rails/db/queue_schema.rb +0 -129
  289. data/sandbox/itsi_sandbox_rails/public/400.html +0 -114
  290. data/sandbox/itsi_sandbox_rails/test/fixtures/posts.yml +0 -9
  291. data/sandbox/itsi_sandbox_rails/test/models/post_test.rb +0 -7
  292. /data/{sandbox/itsi_sandbox_rails/script/.keep → crates/_index.md} +0 -0
  293. /data/gems/server/lib/itsi/{index.html → server/default_app/index.html} +0 -0
@@ -1,17 +1,13 @@
1
- use crate::server::{
2
- itsi_server::Server, lifecycle_event::LifecycleEvent, listener::Listener,
3
- process_worker::ProcessWorker,
4
- };
1
+ use crate::ruby_types::itsi_server::itsi_server_config::ItsiServerConfig;
2
+ use crate::server::signal::SIGNAL_HANDLER_CHANNEL;
3
+ use crate::server::{lifecycle_event::LifecycleEvent, process_worker::ProcessWorker};
5
4
  use itsi_error::{ItsiError, Result};
6
5
  use itsi_rb_helpers::{
7
6
  call_proc_and_log_errors, call_with_gvl, call_without_gvl, create_ruby_thread,
8
7
  };
9
8
  use itsi_tracing::{error, info, warn};
10
9
  use magnus::Value;
11
- use nix::{
12
- libc::{self, exit},
13
- unistd::Pid,
14
- };
10
+ use nix::{libc::exit, unistd::Pid};
15
11
 
16
12
  use std::{
17
13
  sync::{atomic::AtomicUsize, Arc},
@@ -24,8 +20,7 @@ use tokio::{
24
20
  };
25
21
  use tracing::{debug, instrument};
26
22
  pub(crate) struct ClusterMode {
27
- pub listeners: parking_lot::Mutex<Vec<Listener>>,
28
- pub server: Arc<Server>,
23
+ pub server_config: Arc<ItsiServerConfig>,
29
24
  pub process_workers: parking_lot::Mutex<Vec<ProcessWorker>>,
30
25
  pub lifecycle_channel: broadcast::Sender<LifecycleEvent>,
31
26
  }
@@ -35,12 +30,8 @@ static CHILD_SIGNAL_SENDER: parking_lot::Mutex<Option<watch::Sender<()>>> =
35
30
  parking_lot::Mutex::new(None);
36
31
 
37
32
  impl ClusterMode {
38
- pub fn new(
39
- server: Arc<Server>,
40
- listeners: Vec<Listener>,
41
- lifecycle_channel: broadcast::Sender<LifecycleEvent>,
42
- ) -> Self {
43
- let process_workers = (0..server.workers)
33
+ pub fn new(server_config: Arc<ItsiServerConfig>) -> Self {
34
+ let process_workers = (0..server_config.server_params.read().workers)
44
35
  .map(|_| ProcessWorker {
45
36
  worker_id: WORKER_ID.fetch_add(1, std::sync::atomic::Ordering::Relaxed),
46
37
  ..Default::default()
@@ -48,10 +39,9 @@ impl ClusterMode {
48
39
  .collect();
49
40
 
50
41
  Self {
51
- listeners: parking_lot::Mutex::new(listeners),
52
- server,
42
+ server_config,
53
43
  process_workers: parking_lot::Mutex::new(process_workers),
54
- lifecycle_channel,
44
+ lifecycle_channel: SIGNAL_HANDLER_CHANNEL.0.clone(),
55
45
  }
56
46
  }
57
47
 
@@ -73,13 +63,56 @@ impl ClusterMode {
73
63
  ) -> Result<()> {
74
64
  match lifecycle_event {
75
65
  LifecycleEvent::Start => Ok(()),
66
+ LifecycleEvent::PrintInfo => {
67
+ self.print_info().await?;
68
+ Ok(())
69
+ }
76
70
  LifecycleEvent::Shutdown => {
71
+ self.server_config.stop_watcher()?;
77
72
  self.shutdown().await?;
78
73
  Ok(())
79
74
  }
80
75
  LifecycleEvent::Restart => {
81
- for worker in self.process_workers.lock().iter() {
82
- worker.reboot(self.clone()).await?;
76
+ self.server_config.dup_fds()?;
77
+ self.shutdown().await.ok();
78
+ info!("Shutdown complete. Calling reload exec");
79
+ self.server_config.reload_exec()?;
80
+ Ok(())
81
+ }
82
+ LifecycleEvent::Reload => {
83
+ let should_reexec = self.server_config.clone().reload(true)?;
84
+ if should_reexec {
85
+ self.server_config.dup_fds()?;
86
+ self.shutdown().await.ok();
87
+ self.server_config.reload_exec()?;
88
+ }
89
+ let mut workers_to_load = self.server_config.server_params.read().workers;
90
+ let mut next_workers = Vec::new();
91
+ for worker in self.process_workers.lock().drain(..) {
92
+ if workers_to_load == 0 {
93
+ worker.graceful_shutdown(self.clone()).await
94
+ } else {
95
+ workers_to_load -= 1;
96
+ worker.reboot(self.clone()).await?;
97
+ next_workers.push(worker);
98
+ }
99
+ }
100
+ self.process_workers.lock().extend(next_workers);
101
+ while workers_to_load > 0 {
102
+ let mut workers = self.process_workers.lock();
103
+ let worker = ProcessWorker {
104
+ worker_id: WORKER_ID.fetch_add(1, std::sync::atomic::Ordering::Relaxed),
105
+ ..Default::default()
106
+ };
107
+ let worker_clone = worker.clone();
108
+ let self_clone = self.clone();
109
+ create_ruby_thread(move || {
110
+ call_without_gvl(move || {
111
+ worker_clone.boot(self_clone).ok();
112
+ })
113
+ });
114
+ workers.push(worker);
115
+ workers_to_load -= 1
83
116
  }
84
117
  Ok(())
85
118
  }
@@ -106,8 +139,10 @@ impl ClusterMode {
106
139
  };
107
140
  if let Some(dropped_worker) = worker {
108
141
  dropped_worker.request_shutdown();
109
- let force_kill_time =
110
- Instant::now() + Duration::from_secs_f64(self.server.shutdown_timeout);
142
+ let force_kill_time = Instant::now()
143
+ + Duration::from_secs_f64(
144
+ self.server_config.server_params.read().shutdown_timeout,
145
+ );
111
146
  while dropped_worker.is_alive() && force_kill_time > Instant::now() {
112
147
  tokio::time::sleep(Duration::from_millis(100)).await;
113
148
  }
@@ -121,13 +156,20 @@ impl ClusterMode {
121
156
  for worker in self.process_workers.lock().iter() {
122
157
  worker.force_kill();
123
158
  }
159
+ error!("Force shutdown!");
124
160
  unsafe { exit(0) };
125
161
  }
162
+ LifecycleEvent::ChildTerminated => {
163
+ CHILD_SIGNAL_SENDER.lock().as_ref().inspect(|i| {
164
+ i.send(()).ok();
165
+ });
166
+ Ok(())
167
+ }
126
168
  }
127
169
  }
128
170
 
129
171
  pub async fn shutdown(&self) -> Result<()> {
130
- let shutdown_timeout = self.server.shutdown_timeout;
172
+ let shutdown_timeout = self.server_config.server_params.read().shutdown_timeout;
131
173
  let workers = self.process_workers.lock().clone();
132
174
 
133
175
  workers.iter().for_each(|worker| worker.request_shutdown());
@@ -163,35 +205,71 @@ impl ClusterMode {
163
205
  Err(ItsiError::Break())
164
206
  }
165
207
 
166
- pub fn receive_signal(signal: i32) {
167
- match signal {
168
- libc::SIGCHLD => {
169
- CHILD_SIGNAL_SENDER.lock().as_ref().inspect(|i| {
170
- i.send(()).ok();
171
- });
172
- }
173
- _ => {
174
- // Handle other signals
208
+ pub async fn print_info(self: Arc<Self>) -> Result<()> {
209
+ println!("Itsi Cluster Info:");
210
+ println!("Master PID: {:?}", Pid::this());
211
+ if let Some(memory_limit) = self.server_config.server_params.read().worker_memory_limit {
212
+ println!("Worker Memory Limit: {}", memory_limit);
213
+ }
214
+
215
+ if self.server_config.watcher_fd.is_some() {
216
+ println!("File Watcher Enabled: true",);
217
+ if let Some(watchers) = self
218
+ .server_config
219
+ .server_params
220
+ .read()
221
+ .notify_watchers
222
+ .as_ref()
223
+ {
224
+ for watcher in watchers {
225
+ println!(
226
+ "Watching path: {} => {}",
227
+ watcher.0,
228
+ watcher
229
+ .1
230
+ .iter()
231
+ .map(|path| path.join(","))
232
+ .collect::<Vec<String>>()
233
+ .join(" ")
234
+ );
235
+ }
175
236
  }
176
237
  }
238
+ println!(
239
+ "Silent Mode: {}",
240
+ self.server_config.server_params.read().silence
241
+ );
242
+ println!(
243
+ "Preload: {}",
244
+ self.server_config.server_params.read().preload
245
+ );
246
+ let workers = self.process_workers.lock().clone();
247
+ for worker in workers {
248
+ worker.print_info()?;
249
+ sleep(Duration::from_millis(50)).await;
250
+ }
251
+ Ok(())
177
252
  }
178
253
 
179
254
  pub fn stop(&self) -> Result<()> {
180
- unsafe { libc::signal(libc::SIGCHLD, libc::SIG_DFL) };
181
-
182
255
  for worker in self.process_workers.lock().iter() {
183
256
  if worker.is_alive() {
184
257
  worker.force_kill();
185
258
  }
186
259
  }
187
-
188
260
  Ok(())
189
261
  }
190
262
 
191
263
  #[instrument(skip(self), fields(mode = "cluster", pid=format!("{:?}", Pid::this())))]
192
264
  pub fn run(self: Arc<Self>) -> Result<()> {
193
265
  info!("Starting in Cluster mode");
194
- if let Some(proc) = self.server.hooks.get("before_fork") {
266
+ if let Some(proc) = self
267
+ .server_config
268
+ .server_params
269
+ .read()
270
+ .hooks
271
+ .get("before_fork")
272
+ {
195
273
  call_with_gvl(|_| call_proc_and_log_errors(proc.clone()))
196
274
  }
197
275
  self.process_workers
@@ -202,8 +280,6 @@ impl ClusterMode {
202
280
  let (sender, mut receiver) = watch::channel(());
203
281
  *CHILD_SIGNAL_SENDER.lock() = Some(sender);
204
282
 
205
- unsafe { libc::signal(libc::SIGCHLD, Self::receive_signal as usize) };
206
-
207
283
  let mut lifecycle_rx = self.lifecycle_channel.subscribe();
208
284
  let self_ref = self.clone();
209
285
 
@@ -215,14 +291,15 @@ impl ClusterMode {
215
291
  _ = receiver.changed() => {
216
292
  let mut workers = self_ref.process_workers.lock();
217
293
  workers.retain(|worker| {
218
- worker.boot_if_dead(Arc::clone(&self_ref))
294
+ worker.boot_if_dead(self_ref.clone())
219
295
  });
220
296
  if workers.is_empty() {
221
297
  warn!("No workers running. Send SIGTTIN to increase worker count");
222
298
  }
223
299
  }
224
300
  _ = memory_check_interval.tick() => {
225
- if let Some(memory_limit) = self_ref.server.worker_memory_limit {
301
+ let worker_memory_limit = self_ref.server_config.server_params.read().worker_memory_limit;
302
+ if let Some(memory_limit) = worker_memory_limit {
226
303
  let largest_worker = {
227
304
  let workers = self_ref.process_workers.lock();
228
305
  workers.iter().max_by(|wa, wb| wa.memory_usage().cmp(&wb.memory_usage())).cloned()
@@ -231,7 +308,7 @@ impl ClusterMode {
231
308
  if let Some(current_mem_usage) = largest_worker.memory_usage(){
232
309
  if current_mem_usage > memory_limit {
233
310
  largest_worker.reboot(self_ref.clone()).await.ok();
234
- if let Some(hook) = self_ref.server.hooks.get("after_memory_threshold_reached") {
311
+ if let Some(hook) = self_ref.server_config.server_params.read().hooks.get("after_memory_threshold_reached") {
235
312
  call_with_gvl(|_| hook.call::<_, Value>((largest_worker.pid(),)).ok() );
236
313
  }
237
314
  }
@@ -1,27 +1,30 @@
1
+ use std::sync::Arc;
2
+
1
3
  use cluster_mode::ClusterMode;
2
4
  use itsi_error::Result;
3
5
  use single_mode::SingleMode;
4
- use std::sync::Arc;
6
+
5
7
  pub mod cluster_mode;
6
8
  pub mod single_mode;
7
9
 
10
+ #[derive(Clone)]
8
11
  pub(crate) enum ServeStrategy {
9
12
  Single(Arc<SingleMode>),
10
13
  Cluster(Arc<ClusterMode>),
11
14
  }
12
15
 
13
16
  impl ServeStrategy {
14
- pub fn run(&self) -> Result<()> {
17
+ pub fn run(self) -> Result<()> {
15
18
  match self {
16
- ServeStrategy::Single(single_router) => single_router.clone().run(),
17
- ServeStrategy::Cluster(cluster_router) => cluster_router.clone().run(),
19
+ ServeStrategy::Single(single_router) => single_router.run(),
20
+ ServeStrategy::Cluster(cluster_router) => cluster_router.run(),
18
21
  }
19
22
  }
20
23
 
21
24
  pub(crate) fn stop(&self) -> Result<()> {
22
25
  match self {
23
- ServeStrategy::Single(single_router) => single_router.clone().stop(),
24
- ServeStrategy::Cluster(cluster_router) => cluster_router.clone().stop(),
26
+ ServeStrategy::Single(single_router) => single_router.stop(),
27
+ ServeStrategy::Cluster(cluster_router) => cluster_router.stop(),
25
28
  }
26
29
  }
27
30
  }