itsi 0.1.9 → 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 (294) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +1542 -43
  3. data/Itsi.rb +125 -0
  4. data/Rakefile +8 -4
  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 +59 -9
  9. data/crates/itsi_server/Cargo.toml +70 -28
  10. data/crates/itsi_server/src/lib.rs +80 -80
  11. data/crates/itsi_server/src/{body_proxy → ruby_types/itsi_body_proxy}/big_bytes.rs +10 -5
  12. data/{gems/server/ext/itsi_server/src/body_proxy/itsi_body_proxy.rs → crates/itsi_server/src/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/crates/itsi_server/src/ruby_types/itsi_http_request.rs +282 -0
  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 +29 -17
  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 +111 -11
  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 +44 -11
  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 +129 -46
  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 +325 -167
  61. data/crates/itsi_server/src/server/signal.rs +20 -4
  62. data/crates/itsi_server/src/server/static_file_server.rs +984 -0
  63. data/crates/itsi_server/src/server/thread_worker.rs +165 -88
  64. data/crates/itsi_server/src/server/tls.rs +1 -1
  65. data/crates/itsi_server/src/server/types.rs +43 -0
  66. data/crates/itsi_server/test.md +14 -0
  67. data/crates/itsi_tracing/Cargo.toml +1 -0
  68. data/crates/itsi_tracing/src/lib.rs +216 -45
  69. data/docs/.gitignore +7 -0
  70. data/docs/.gitpod.yml +15 -0
  71. data/docs/Itsi.rb +17 -0
  72. data/docs/content/_index.md +17 -0
  73. data/docs/content/about.md +6 -0
  74. data/docs/content/docs/_index.md +18 -0
  75. data/docs/content/docs/first-page.md +9 -0
  76. data/docs/content/docs/folder/_index.md +10 -0
  77. data/docs/content/docs/folder/leaf.md +7 -0
  78. data/docs/go.mod +5 -0
  79. data/docs/go.sum +2 -0
  80. data/docs/hugo.yaml +77 -0
  81. data/examples/static_assets_example.rb +83 -0
  82. data/gems/_index.md +18 -0
  83. data/gems/scheduler/CODE_OF_CONDUCT.md +7 -0
  84. data/gems/scheduler/Cargo.lock +75 -14
  85. data/gems/scheduler/README.md +5 -0
  86. data/gems/scheduler/_index.md +7 -0
  87. data/gems/scheduler/itsi-scheduler.gemspec +4 -1
  88. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  89. data/gems/scheduler/lib/itsi/scheduler.rb +2 -2
  90. data/gems/scheduler/test/test_file_io.rb +0 -1
  91. data/gems/scheduler/test/test_itsi_scheduler.rb +1 -1
  92. data/gems/server/CHANGELOG.md +5 -0
  93. data/gems/server/CODE_OF_CONDUCT.md +7 -0
  94. data/gems/server/Cargo.lock +1543 -43
  95. data/gems/server/README.md +4 -0
  96. data/gems/server/_index.md +6 -0
  97. data/gems/server/exe/itsi +46 -57
  98. data/gems/server/itsi-server.gemspec +3 -2
  99. data/gems/server/lib/itsi/{request.rb → http_request.rb} +29 -5
  100. data/gems/server/lib/itsi/http_response.rb +39 -0
  101. data/gems/server/lib/itsi/server/Itsi.rb +119 -0
  102. data/gems/server/lib/itsi/server/config/dsl.rb +506 -0
  103. data/gems/server/lib/itsi/server/config.rb +131 -0
  104. data/gems/server/lib/itsi/server/default_app/default_app.rb +38 -0
  105. data/gems/server/lib/itsi/server/grpc_interface.rb +213 -0
  106. data/gems/server/lib/itsi/server/rack/handler/itsi.rb +9 -6
  107. data/gems/server/lib/itsi/server/rack_interface.rb +24 -9
  108. data/gems/server/lib/itsi/server/scheduler_interface.rb +1 -1
  109. data/gems/server/lib/itsi/server/scheduler_mode.rb +4 -0
  110. data/gems/server/lib/itsi/server/signal_trap.rb +6 -1
  111. data/gems/server/lib/itsi/server/version.rb +1 -1
  112. data/gems/server/lib/itsi/server.rb +75 -60
  113. data/gems/server/lib/itsi/standard_headers.rb +86 -0
  114. data/gems/server/test/helpers/test_helper.rb +14 -12
  115. data/gems/server/test/test_itsi_server.rb +21 -2
  116. data/lib/itsi/version.rb +1 -1
  117. data/sandbox/itsi_file/Gemfile +11 -0
  118. data/sandbox/itsi_file/Gemfile.lock +69 -0
  119. data/sandbox/itsi_file/Itsi.rb +276 -0
  120. data/sandbox/itsi_file/error.html +2 -0
  121. data/sandbox/itsi_file/organisations_controller.rb +20 -0
  122. data/sandbox/itsi_file/public/assets/image.png +0 -0
  123. data/sandbox/itsi_file/public/assets/index.html +1 -0
  124. data/sandbox/itsi_sandbox_async/Gemfile +1 -1
  125. data/sandbox/itsi_sandbox_hanami/Gemfile.lock +2 -2
  126. data/sandbox/itsi_sandbox_rack/Gemfile.lock +2 -2
  127. data/sandbox/itsi_sandbox_rack/config.ru +2 -15
  128. data/sandbox/itsi_sandbox_rails/.dockerignore +2 -5
  129. data/sandbox/itsi_sandbox_rails/.github/workflows/ci.yml +1 -1
  130. data/sandbox/itsi_sandbox_rails/.gitignore +2 -1
  131. data/sandbox/itsi_sandbox_rails/Dockerfile +6 -9
  132. data/sandbox/itsi_sandbox_rails/Gemfile +16 -22
  133. data/sandbox/itsi_sandbox_rails/Gemfile.lock +100 -225
  134. data/sandbox/itsi_sandbox_rails/app/assets/config/manifest.js +4 -0
  135. data/sandbox/itsi_sandbox_rails/app/assets/stylesheets/application.css +11 -6
  136. data/sandbox/itsi_sandbox_rails/app/channels/application_cable/channel.rb +4 -0
  137. data/sandbox/itsi_sandbox_rails/app/channels/application_cable/connection.rb +4 -0
  138. data/sandbox/itsi_sandbox_rails/app/controllers/live_controller.rb +7 -8
  139. data/sandbox/itsi_sandbox_rails/app/controllers/uploads_controller.rb +0 -3
  140. data/sandbox/itsi_sandbox_rails/app/views/layouts/application.html.erb +2 -7
  141. data/sandbox/itsi_sandbox_rails/bin/docker-entrypoint +3 -4
  142. data/sandbox/itsi_sandbox_rails/bin/setup +8 -5
  143. data/sandbox/itsi_sandbox_rails/config/application.rb +1 -35
  144. data/sandbox/itsi_sandbox_rails/config/cable.yml +3 -10
  145. data/sandbox/itsi_sandbox_rails/config/credentials.yml.enc +1 -1
  146. data/sandbox/itsi_sandbox_rails/config/database.yml +9 -19
  147. data/sandbox/itsi_sandbox_rails/config/environment.rb +1 -1
  148. data/sandbox/itsi_sandbox_rails/config/environments/development.rb +21 -12
  149. data/sandbox/itsi_sandbox_rails/config/environments/production.rb +49 -34
  150. data/sandbox/itsi_sandbox_rails/config/environments/test.rb +19 -5
  151. data/sandbox/itsi_sandbox_rails/config/initializers/assets.rb +5 -0
  152. data/sandbox/itsi_sandbox_rails/config/initializers/filter_parameter_logging.rb +1 -1
  153. data/sandbox/itsi_sandbox_rails/config/initializers/permissions_policy.rb +13 -0
  154. data/sandbox/itsi_sandbox_rails/config/puma.rb +2 -9
  155. data/sandbox/itsi_sandbox_rails/config.ru +0 -1
  156. data/sandbox/itsi_sandbox_rails/db/migrate/20250301041554_create_posts.rb +1 -1
  157. data/sandbox/itsi_sandbox_rails/db/schema.rb +2 -2
  158. data/sandbox/itsi_sandbox_rails/lib/assets/.keep +0 -0
  159. data/sandbox/itsi_sandbox_rails/public/404.html +66 -113
  160. data/sandbox/itsi_sandbox_rails/public/406-unsupported-browser.html +65 -113
  161. data/sandbox/itsi_sandbox_rails/public/422.html +66 -113
  162. data/sandbox/itsi_sandbox_rails/public/500.html +65 -113
  163. data/sandbox/itsi_sandbox_rails/public/icon.png +0 -0
  164. data/sandbox/itsi_sandbox_rails/public/icon.svg +2 -2
  165. data/sandbox/itsi_sandbox_rails/test/channels/application_cable/connection_test.rb +13 -0
  166. data/sandbox/itsi_sandbox_roda/Gemfile.lock +3 -10
  167. data/tasks.txt +72 -12
  168. metadata +94 -139
  169. data/crates/itsi_server/src/body_proxy/itsi_body_proxy.rs +0 -122
  170. data/crates/itsi_server/src/body_proxy/mod.rs +0 -2
  171. data/crates/itsi_server/src/request/itsi_request.rs +0 -305
  172. data/crates/itsi_server/src/request/mod.rs +0 -1
  173. data/crates/itsi_server/src/response/mod.rs +0 -1
  174. data/crates/itsi_server/src/server/itsi_server.rs +0 -294
  175. data/gems/scheduler/ext/itsi_error/Cargo.lock +0 -368
  176. data/gems/scheduler/ext/itsi_error/Cargo.toml +0 -11
  177. data/gems/scheduler/ext/itsi_error/src/from.rs +0 -68
  178. data/gems/scheduler/ext/itsi_error/src/lib.rs +0 -24
  179. data/gems/scheduler/ext/itsi_instrument_entry/Cargo.toml +0 -15
  180. data/gems/scheduler/ext/itsi_instrument_entry/src/lib.rs +0 -31
  181. data/gems/scheduler/ext/itsi_rb_helpers/Cargo.lock +0 -355
  182. data/gems/scheduler/ext/itsi_rb_helpers/Cargo.toml +0 -10
  183. data/gems/scheduler/ext/itsi_rb_helpers/src/heap_value.rs +0 -121
  184. data/gems/scheduler/ext/itsi_rb_helpers/src/lib.rs +0 -178
  185. data/gems/scheduler/ext/itsi_scheduler/Cargo.toml +0 -24
  186. data/gems/scheduler/ext/itsi_scheduler/extconf.rb +0 -6
  187. data/gems/scheduler/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +0 -56
  188. data/gems/scheduler/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +0 -44
  189. data/gems/scheduler/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +0 -44
  190. data/gems/scheduler/ext/itsi_scheduler/src/itsi_scheduler.rs +0 -308
  191. data/gems/scheduler/ext/itsi_scheduler/src/lib.rs +0 -38
  192. data/gems/scheduler/ext/itsi_server/Cargo.lock +0 -2956
  193. data/gems/scheduler/ext/itsi_server/Cargo.toml +0 -47
  194. data/gems/scheduler/ext/itsi_server/extconf.rb +0 -6
  195. data/gems/scheduler/ext/itsi_server/src/body_proxy/big_bytes.rs +0 -104
  196. data/gems/scheduler/ext/itsi_server/src/body_proxy/itsi_body_proxy.rs +0 -122
  197. data/gems/scheduler/ext/itsi_server/src/body_proxy/mod.rs +0 -2
  198. data/gems/scheduler/ext/itsi_server/src/env.rs +0 -43
  199. data/gems/scheduler/ext/itsi_server/src/lib.rs +0 -112
  200. data/gems/scheduler/ext/itsi_server/src/request/itsi_request.rs +0 -305
  201. data/gems/scheduler/ext/itsi_server/src/request/mod.rs +0 -1
  202. data/gems/scheduler/ext/itsi_server/src/response/itsi_response.rs +0 -357
  203. data/gems/scheduler/ext/itsi_server/src/response/mod.rs +0 -1
  204. data/gems/scheduler/ext/itsi_server/src/server/bind.rs +0 -170
  205. data/gems/scheduler/ext/itsi_server/src/server/bind_protocol.rs +0 -37
  206. data/gems/scheduler/ext/itsi_server/src/server/io_stream.rs +0 -104
  207. data/gems/scheduler/ext/itsi_server/src/server/itsi_server.rs +0 -294
  208. data/gems/scheduler/ext/itsi_server/src/server/lifecycle_event.rs +0 -9
  209. data/gems/scheduler/ext/itsi_server/src/server/listener.rs +0 -318
  210. data/gems/scheduler/ext/itsi_server/src/server/mod.rs +0 -11
  211. data/gems/scheduler/ext/itsi_server/src/server/process_worker.rs +0 -196
  212. data/gems/scheduler/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +0 -254
  213. data/gems/scheduler/ext/itsi_server/src/server/serve_strategy/mod.rs +0 -27
  214. data/gems/scheduler/ext/itsi_server/src/server/serve_strategy/single_mode.rs +0 -263
  215. data/gems/scheduler/ext/itsi_server/src/server/signal.rs +0 -77
  216. data/gems/scheduler/ext/itsi_server/src/server/thread_worker.rs +0 -367
  217. data/gems/scheduler/ext/itsi_server/src/server/tls/locked_dir_cache.rs +0 -132
  218. data/gems/scheduler/ext/itsi_server/src/server/tls.rs +0 -265
  219. data/gems/scheduler/ext/itsi_tracing/Cargo.lock +0 -274
  220. data/gems/scheduler/ext/itsi_tracing/Cargo.toml +0 -16
  221. data/gems/scheduler/ext/itsi_tracing/src/lib.rs +0 -58
  222. data/gems/server/ext/itsi_error/Cargo.lock +0 -368
  223. data/gems/server/ext/itsi_error/Cargo.toml +0 -11
  224. data/gems/server/ext/itsi_error/src/from.rs +0 -68
  225. data/gems/server/ext/itsi_error/src/lib.rs +0 -24
  226. data/gems/server/ext/itsi_instrument_entry/Cargo.toml +0 -15
  227. data/gems/server/ext/itsi_instrument_entry/src/lib.rs +0 -31
  228. data/gems/server/ext/itsi_rb_helpers/Cargo.lock +0 -355
  229. data/gems/server/ext/itsi_rb_helpers/Cargo.toml +0 -10
  230. data/gems/server/ext/itsi_rb_helpers/src/heap_value.rs +0 -121
  231. data/gems/server/ext/itsi_rb_helpers/src/lib.rs +0 -178
  232. data/gems/server/ext/itsi_scheduler/Cargo.toml +0 -24
  233. data/gems/server/ext/itsi_scheduler/extconf.rb +0 -6
  234. data/gems/server/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +0 -56
  235. data/gems/server/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +0 -44
  236. data/gems/server/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +0 -44
  237. data/gems/server/ext/itsi_scheduler/src/itsi_scheduler.rs +0 -308
  238. data/gems/server/ext/itsi_scheduler/src/lib.rs +0 -38
  239. data/gems/server/ext/itsi_server/Cargo.lock +0 -2956
  240. data/gems/server/ext/itsi_server/Cargo.toml +0 -47
  241. data/gems/server/ext/itsi_server/extconf.rb +0 -6
  242. data/gems/server/ext/itsi_server/src/body_proxy/big_bytes.rs +0 -104
  243. data/gems/server/ext/itsi_server/src/body_proxy/mod.rs +0 -2
  244. data/gems/server/ext/itsi_server/src/env.rs +0 -43
  245. data/gems/server/ext/itsi_server/src/lib.rs +0 -112
  246. data/gems/server/ext/itsi_server/src/request/itsi_request.rs +0 -305
  247. data/gems/server/ext/itsi_server/src/request/mod.rs +0 -1
  248. data/gems/server/ext/itsi_server/src/response/itsi_response.rs +0 -357
  249. data/gems/server/ext/itsi_server/src/response/mod.rs +0 -1
  250. data/gems/server/ext/itsi_server/src/server/bind.rs +0 -170
  251. data/gems/server/ext/itsi_server/src/server/bind_protocol.rs +0 -37
  252. data/gems/server/ext/itsi_server/src/server/io_stream.rs +0 -104
  253. data/gems/server/ext/itsi_server/src/server/itsi_server.rs +0 -294
  254. data/gems/server/ext/itsi_server/src/server/lifecycle_event.rs +0 -9
  255. data/gems/server/ext/itsi_server/src/server/listener.rs +0 -318
  256. data/gems/server/ext/itsi_server/src/server/mod.rs +0 -11
  257. data/gems/server/ext/itsi_server/src/server/process_worker.rs +0 -196
  258. data/gems/server/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +0 -254
  259. data/gems/server/ext/itsi_server/src/server/serve_strategy/mod.rs +0 -27
  260. data/gems/server/ext/itsi_server/src/server/serve_strategy/single_mode.rs +0 -263
  261. data/gems/server/ext/itsi_server/src/server/signal.rs +0 -77
  262. data/gems/server/ext/itsi_server/src/server/thread_worker.rs +0 -367
  263. data/gems/server/ext/itsi_server/src/server/tls/locked_dir_cache.rs +0 -132
  264. data/gems/server/ext/itsi_server/src/server/tls.rs +0 -265
  265. data/gems/server/ext/itsi_tracing/Cargo.lock +0 -274
  266. data/gems/server/ext/itsi_tracing/Cargo.toml +0 -16
  267. data/gems/server/ext/itsi_tracing/src/lib.rs +0 -58
  268. data/gems/server/lib/itsi/stream_io.rb +0 -38
  269. data/sandbox/itsi_sandbox_rails/.kamal/hooks/docker-setup.sample +0 -3
  270. data/sandbox/itsi_sandbox_rails/.kamal/hooks/post-app-boot.sample +0 -3
  271. data/sandbox/itsi_sandbox_rails/.kamal/hooks/post-deploy.sample +0 -14
  272. data/sandbox/itsi_sandbox_rails/.kamal/hooks/post-proxy-reboot.sample +0 -3
  273. data/sandbox/itsi_sandbox_rails/.kamal/hooks/pre-app-boot.sample +0 -3
  274. data/sandbox/itsi_sandbox_rails/.kamal/hooks/pre-build.sample +0 -51
  275. data/sandbox/itsi_sandbox_rails/.kamal/hooks/pre-connect.sample +0 -47
  276. data/sandbox/itsi_sandbox_rails/.kamal/hooks/pre-deploy.sample +0 -109
  277. data/sandbox/itsi_sandbox_rails/.kamal/hooks/pre-proxy-reboot.sample +0 -3
  278. data/sandbox/itsi_sandbox_rails/.kamal/secrets +0 -17
  279. data/sandbox/itsi_sandbox_rails/bin/dev +0 -2
  280. data/sandbox/itsi_sandbox_rails/bin/jobs +0 -6
  281. data/sandbox/itsi_sandbox_rails/bin/kamal +0 -27
  282. data/sandbox/itsi_sandbox_rails/bin/thrust +0 -5
  283. data/sandbox/itsi_sandbox_rails/config/cache.yml +0 -16
  284. data/sandbox/itsi_sandbox_rails/config/deploy.yml +0 -116
  285. data/sandbox/itsi_sandbox_rails/config/queue.yml +0 -18
  286. data/sandbox/itsi_sandbox_rails/config/recurring.yml +0 -10
  287. data/sandbox/itsi_sandbox_rails/db/cable_schema.rb +0 -11
  288. data/sandbox/itsi_sandbox_rails/db/cache_schema.rb +0 -14
  289. data/sandbox/itsi_sandbox_rails/db/queue_schema.rb +0 -129
  290. data/sandbox/itsi_sandbox_rails/public/400.html +0 -114
  291. data/sandbox/itsi_sandbox_rails/test/fixtures/posts.yml +0 -9
  292. data/sandbox/itsi_sandbox_rails/test/models/post_test.rb +0 -7
  293. /data/{sandbox/itsi_sandbox_rails/script/.keep → crates/_index.md} +0 -0
  294. /data/gems/server/lib/itsi/{index.html → server/default_app/index.html} +0 -0
@@ -1,3 +1,7 @@
1
+ ---
2
+ type: docs
3
+ ---
4
+
1
5
  # ItsiServer
2
6
 
3
7
  TODO: Delete this and the text below, and describe your gem
@@ -0,0 +1,6 @@
1
+ ---
2
+ title: Itsi Server
3
+ type: docs
4
+ ---
5
+
6
+ ## Foo
data/gems/server/exe/itsi CHANGED
@@ -1,51 +1,44 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
+
4
+ require "itsi/server"
3
5
  require "optparse"
4
6
 
5
- # Default options used when starting Osprey from the CLI using `osprey`
6
- DEFAULT_OPTIONS = {
7
- # Number of workers
8
- workers: 1,
9
- # Number of threads per worker
10
- threads: 1,
11
- # Graceful shutdown timeout
12
- shutdown_timeout: 5,
13
- # Binds
14
- binds: ["http://0.0.0.0:3000"],
15
- # Preload
16
- preload: true,
17
- # Rackup file
18
- rackup_file: "config.ru",
19
- # Scheduler class
20
- scheduler_class: nil,
21
- # Whether to stream the body or not
22
- stream_body: false
23
- }
24
-
25
- options = DEFAULT_OPTIONS.to_a.select(&:last).to_h
26
-
27
- # Define the option parser
7
+ Itsi::Server::Config.save_argv!
8
+
9
+ options = {}
10
+
28
11
  OptionParser.new do |opts|
29
12
  opts.banner = "Usage: itsi [options]"
30
13
 
31
- opts.on("-w", "--workers WORKERS", Integer, "Number of workers (default: #{options[:workers]})") do |w|
14
+ opts.on("-C", "--config CONFIG_FILE", String, "Itsi Configuration file to use (default: Itsi.rb)") do |config_file|
15
+ options[:config_file] = config_file
16
+ end
17
+
18
+ opts.on("-w", "--workers WORKERS", Integer, "Number of workers (default: #{Etc.nprocessors})") do |w|
32
19
  options[:workers] = w
33
20
  end
34
21
 
35
- opts.on("-t", "--threads THREADS", Integer, "Number of threads (default: #{options[:threads]})") do |t|
22
+ opts.on("-t", "--threads THREADS", Integer, "Number of threads (default: 1)") do |t|
36
23
  options[:threads] = t
37
24
  end
38
25
 
39
- opts.on("-r", "--rackup_file FILE", String, "Rackup file to use (default: #{options[:rackup_file]})") do |rf|
26
+ opts.on("-mtr", "--multithreaded-reactor true/false", String,
27
+ "Use a multithreaded reactor (default: true)") do |mtr|
28
+ options[:multithreaded_reactor] = mtr.to_s == "true"
29
+ end
30
+
31
+ opts.on("-r", "--rackup_file FILE", String, "Rackup file to use (default: config.ru)") do |rf|
40
32
  options[:rackup_file] = rf
41
33
  end
42
34
 
43
35
  opts.on("--worker-memory-limit MEMORY_LIMIT", Integer,
44
- "Memory limit for each worker (default: #{options[:worker_memory_limit] || 'None'}). If this limit is breached the worker is gracefully restarted") do |ml|
36
+ "Memory limit for each worker (default: None). If this limit is breached the worker is gracefully restarted") do |ml|
45
37
  options[:worker_memory_limit] = ml
46
38
  end
47
39
 
48
- opts.on("-f", "--fiber_scheduler [CLASS_NAME]", [String], "Scheduler class to use (default: nil). Provide blank or true to use Itsi::Scheduler, or a classname to use an alternative scheduler") do |scheduler_class|
40
+ opts.on("-f", "--fiber_scheduler [CLASS_NAME]", [String],
41
+ "Scheduler class to use (default: nil). Provide blank or true to use Itsi::Scheduler, or a classname to use an alternative scheduler") do |scheduler_class|
49
42
  if scheduler_class.nil? || scheduler_class == "true"
50
43
  options[:scheduler_class] = "Itsi::Scheduler"
51
44
  elsif scheduler_class == "false"
@@ -65,15 +58,16 @@ OptionParser.new do |opts|
65
58
  end
66
59
  end
67
60
 
68
-
69
- opts.on("-b", "--bind BIND", String, "Bind address (default: #{options[:binds].join(", ")}). You can specify this flag multiple times to bind to multiple addresses.") do |bind|
70
- options[:binds].pop if options[:binds].first.frozen?
61
+ opts.on("-b", "--bind BIND", String,
62
+ "Bind address (default: http://0.0.0.0:3000). You can specify this flag multiple times to bind to multiple addresses.") do |bind|
63
+ options[:binds] ||= []
71
64
  options[:binds] << bind
72
65
  end
73
66
 
74
67
  opts.on("-c", "--cert_path CERT_PATH", String,
75
68
  "Path to the SSL certificate file (must follow a --bind option). You can specify this flag multiple times.") do |cp|
76
69
  raise OptionParser::InvalidOption, "--cert_path must follow a --bind" if options[:binds].empty?
70
+
77
71
  require "uri"
78
72
 
79
73
  # Modify the last bind entry to add/update the cert query parameter
@@ -84,8 +78,10 @@ OptionParser.new do |opts|
84
78
  options[:binds][-1] = "#{uri.host}?#{query_string}"
85
79
  end
86
80
 
87
- opts.on("-k", "--key_path KEY_PATH", String, "Path to the SSL key file (must follow a --bind option). You can specify this flag multiple times.") do |kp|
81
+ opts.on("-k", "--key_path KEY_PATH", String,
82
+ "Path to the SSL key file (must follow a --bind option). You can specify this flag multiple times.") do |kp|
88
83
  raise OptionParser::InvalidOption, "--key_path must follow a --bind" if options[:binds].empty?
84
+
89
85
  require "uri"
90
86
 
91
87
  # Modify the last bind entry to add/update the key query parameter
@@ -113,32 +109,25 @@ OptionParser.new do |opts|
113
109
  puts opts
114
110
  exit
115
111
  end
116
- end.parse!
117
112
 
118
- # Rack app loader, invoked per worker.
119
- # This is a no-op if preloading is enabled (we just return the preloaded app).
120
- preloader = \
121
- if options[:preload]
122
- require "rack"
123
-
124
- app = Array(Rack::Builder.parse_file(options[:rackup_file])).first
125
- require_relative "../lib/itsi/server/scheduler_mode" if options[:scheduler_class]
126
- app.method(:itself).to_proc
127
- else
128
- lambda do
129
- require "rack"
130
-
131
- app = Array(Rack::Builder.parse_file(options[:rackup_file])).first
132
- require_relative "../lib/itsi/server/scheduler_mode" if options[:scheduler_class]
133
- app
134
- end
113
+ opts.on("--reexec PARAMS", String, "Reexec the server with the given parameters") do |params|
114
+ options[:reexec] = params
135
115
  end
136
116
 
137
- # Make sure Itsi is loaded, if not already loaded by the rack_app above.
138
- # Start the Itsi server
139
- require "itsi/server"
117
+ opts.on("--listeners LISTENERS", String, "Listeners for reexec") do |listeners|
118
+ options[:listeners] = listeners
119
+ end
120
+ end.parse!
121
+
140
122
 
141
- Itsi::Server.new(
142
- app: preloader,
143
- **options.except(:preload, :rackup_file)
144
- ).start
123
+ case (command = ARGV.pop)
124
+ when "init"
125
+ Itsi::Server::Config.write_default
126
+ exit(0)
127
+ when "reload", "restart", "down", "up", "add_worker", "remove_worker", "status"
128
+ Itsi::Server.send(command)
129
+ when nil, "start", "serve"
130
+ Itsi::Server.start(options)
131
+ else
132
+ puts "Invalid command #{command}"
133
+ end
@@ -27,7 +27,9 @@ Gem::Specification.new do |spec|
27
27
  (f == gemspec) ||
28
28
  f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile])
29
29
  end
30
- end
30
+ end + Dir["../../crates/**/*.{toml,rs,lock}"].map do |ext_file|
31
+ "ext/#{ext_file[%r{.*crates/(.*?)$}, 1]}"
32
+ end.compact
31
33
 
32
34
  spec.bindir = "exe"
33
35
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
@@ -38,7 +40,6 @@ Gem::Specification.new do |spec|
38
40
  # spec.add_dependency "example-gem", "~> 1.0"
39
41
  spec.add_dependency "rack", ">= 1.6"
40
42
  spec.add_dependency "rb_sys", "~> 0.9.91"
41
-
42
43
  # For more information and examples about making a new gem, check out our
43
44
  # guide at: https://bundler.io/guides/creating_gem.html
44
45
  end
@@ -4,9 +4,23 @@ require "stringio"
4
4
  require "socket"
5
5
 
6
6
  module Itsi
7
- class Request
7
+ class HttpRequest
8
8
  attr_accessor :hijacked
9
9
 
10
+ EMPTY_IO = StringIO.new("").freeze
11
+ RACK_HEADER_MAP = StandardHeaders::ALL.map do |header|
12
+ rack_form = if header == "content-type"
13
+ "CONTENT_TYPE"
14
+ elsif header == "content-length"
15
+ "CONTENT_LENGTH"
16
+ else
17
+ "HTTP_#{header.upcase.gsub(/-/, "_")}"
18
+ end
19
+ [header, rack_form]
20
+ end.to_h.tap do |hm|
21
+ hm.default_proc = proc { |hsh, key| "HTTP_#{key.upcase.gsub(/-/, "_")}" }
22
+ end
23
+
10
24
  def to_rack_env
11
25
  path = self.path
12
26
  host = self.host
@@ -21,8 +35,8 @@ module Itsi
21
35
  "REMOTE_ADDR" => remote_addr,
22
36
  "SERVER_PORT" => port.to_s,
23
37
  "SERVER_NAME" => host,
24
- "HTTP_HOST" => host,
25
38
  "SERVER_PROTOCOL" => version,
39
+ "HTTP_HOST" => host,
26
40
  "HTTP_VERSION" => version,
27
41
  "itsi.request" => self,
28
42
  "itsi.response" => response,
@@ -36,17 +50,26 @@ module Itsi
36
50
  "rack.hijack?" => true,
37
51
  "rack.multipart.buffer_size" => 16_384,
38
52
  "rack.hijack" => build_hijack_proc
39
- }.tap { |r| headers.each { |(k, v)| r[k] = v } }
53
+ }.tap do |r|
54
+ headers.each do |(k, v)|
55
+ r[RACK_HEADER_MAP[k]] = v
56
+ end
57
+ end
58
+ end
59
+
60
+ def respond(_body = nil, _status = 200, _header = nil, status: _status, headers: _header, body: _body,
61
+ hijack: false, &blk)
62
+ response.respond(status: status, headers: headers, body: body, hijack: hijack, &blk)
40
63
  end
41
64
 
42
65
  def build_hijack_proc
43
66
  lambda do
44
67
  self.hijacked = true
45
68
  UNIXSocket.pair.yield_self do |(server_sock, app_sock)|
69
+ server_sock.autoclose = false
46
70
  response.hijack(server_sock.fileno)
47
71
  server_sock.sync = true
48
72
  app_sock.sync = true
49
- app_sock.instance_variable_set("@server_sock", server_sock)
50
73
  app_sock
51
74
  end
52
75
  end
@@ -54,8 +77,9 @@ module Itsi
54
77
 
55
78
  def build_input_io
56
79
  case body
57
- when Array then File.open(body.first, "rb")
80
+ when nil then StringIO.new("")
58
81
  when String then StringIO.new(body)
82
+ when Array then File.open(body.first, "rb")
59
83
  else body
60
84
  end
61
85
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ require 'forwardable'
3
+ require "stringio"
4
+ require "socket"
5
+
6
+ module Itsi
7
+
8
+ class HttpResponse
9
+
10
+ def respond _body=nil, _status=200, _header=nil, status: _status, headers: _header, body: _body, hijack: false, &blk
11
+ self.status = status
12
+
13
+ if headers
14
+ headers.each do |key, value|
15
+ if value.is_a?(Array)
16
+ value.each { |v| add_header(key, v) }
17
+ else
18
+ add_header(key, value)
19
+ end
20
+ end
21
+ end
22
+
23
+ if body
24
+ # Common case. Write a single string body.
25
+ send_and_close(body)
26
+ elsif block_given?
27
+
28
+ # If you call respond with a block, you get a handle to a stream that you can write to.
29
+ yield self
30
+
31
+ # If you hijack the connection, you are responsible for closing it.
32
+ # Otherwise, the response will be closed automatically.
33
+ self.close unless hijack
34
+ else
35
+ self.close
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This is the default Itsi configuration file, installed when you run `itsi init`
4
+ # It contains a sane starting point for configuring your Itsi server.
5
+ # You can use this file in both development and production environments.
6
+ # Most of the options in this file can be overridden by command line options.
7
+ # Check out itsi -h to learn more about the command line options available to you.
8
+
9
+ env = ENV.fetch("APP_ENV") { ENV.fetch("RACK_ENV", "development") }
10
+
11
+ # Number of worker processes to spawn
12
+ # If more than 1, Itsi will be booted in Cluster mode
13
+ workers ENV.fetch("ITSI_WORKERS") {
14
+ require "etc"
15
+ env == "development" ? 1 : Etc.nprocessors
16
+ }
17
+
18
+ # Number of threads to spawn per worker process
19
+ # For pure CPU bound applicationss, you'll get the best results keeping this number low
20
+ # Setting a value of 1 is great for superficial benchmarks, but in reality
21
+ # it's better to set this a bit higher to allow expensive requests to get overtaken and minimize head-of-line blocking
22
+ threads ENV.fetch("ITSI_THREADS", 3)
23
+
24
+ # If your application is IO bound (e.g. performing a lot of proxied HTTP requests, or heavy queries etc)
25
+ # you can see *substantial* benefits from enabling this option.
26
+ # To set this option, pass a string, not a class (as we will not have loaded the class yet)
27
+ # E.g.
28
+ # `fiber_scheduler "Itsi::Scheduler"` - The default fast and light-weight scheduler that comes with Itsi
29
+ # `fiber_scheduler "Async::Scheduler"` - Bring your own scheduler!
30
+ fiber_scheduler nil
31
+
32
+ # By default Itsi will run the Rack app from config.ru.
33
+ # You can provide an alternative Rack app file name here
34
+ # Or you can inline the app directly inside Itsi.rb.
35
+ # Only one of `run` and `rackup_file` can be used.
36
+ # E.g.
37
+ # require 'rack'
38
+ # run(Rack::Builder.app do
39
+ # use Rack::CommonLogger
40
+ # run ->(env) { [200, { 'content-type' => 'text/plain' }, ['OK']] }
41
+ # end)
42
+ rackup_file "config.ru"
43
+
44
+ # If you bind to https, without specifying a certificate, Itsi will use a self-signed certificate.
45
+ # The self-signed certificate will use a CA generated for your host and stored inside `ITSI_LOCAL_CA_DIR` (Defaults to ~/.itsi)
46
+ # bind "https://localhost:3000"
47
+ # bind "https://localhost:3000?domains=dev.itsi.fyi"
48
+ #
49
+ # If you want to use let's encrypt to generate you a real certificate you and pass cert=acme and an acme_email address to generate one.
50
+ # bind "https://itsi.fyi?cert=acme&acme_email=admin@itsi.fyi"
51
+ # You can generate certificates for multiple domains at once, by passing a comma-separated list of domains
52
+ # bind "https://0.0.0.0?domains=foo.itsi.fyi,bar.itsi.fyi&cert=acme&acme_email=admin@itsi.fyi"
53
+ #
54
+ # If you already have a certificate you can specify it using the cert and key parameters
55
+ # bind "https://itsi.fyi?cert=/path/to/cert.pem&key=/path/to/key.pem"
56
+ #
57
+ # You can also bind to a unix socket or a tls unix socket. E.g.
58
+ # bind "unix:///tmp/itsi.sock"
59
+ # bind "tls:///tmp/itsi.secure.sock"
60
+
61
+ if env == "development"
62
+ bind "http://localhost:3000"
63
+ else
64
+ bind "https://0.0.0.0?domains=#{ENV["PRODUCTION_DOMAINS"]}&cert=acme&acme_email=admin@itsi.fyi"
65
+ end
66
+
67
+ # If you want to preload the application, set preload to true
68
+ # to load the entire rack-app defined in rack_file_name before forking.
69
+ # Alternatively, you can preload just a specific set of gems in a group in your gemfile,
70
+ # by providing the group name here.
71
+ # E.g.
72
+ #
73
+ # preload :preload # Load gems inside the preload group
74
+ # preload false # Don't preload.
75
+ #
76
+ # If you want to be able to perform zero-downtime deploys using a single itsi process,
77
+ # you should disable preloads, so that the application is loaded fresh each time a new worker boots
78
+ preload true
79
+
80
+ # Set the maximum memory limit for each worker process in bytes
81
+ # When this limit is reached, the worker will be gracefully restarted.
82
+ # Only one worker is restarted at a time to ensure we don't take down
83
+ # all of them at once, if they reach the threshold simultaneously.
84
+ worker_memory_limit 1024 * 1024 * 1024
85
+
86
+ # You can provide an optional block of code to run, when a worker hits its memory threshold (Use this to send yourself an alert,
87
+ # write metrics to disk etc. etc.)
88
+ after_memory_threshold_reached do |pid|
89
+ puts "Worker #{pid} has reached its memory threshold and will restart"
90
+ end
91
+
92
+ # Do clean up of any non-threadsafe resources before forking a new worker here.
93
+ before_fork {}
94
+
95
+ # Reinitialize any non-threadsafe resources after forking a new worker here.
96
+ after_fork {}
97
+
98
+ # Shutdown timeout
99
+ # Number of seconds to wait for workers to gracefully shutdown before killing them.
100
+ shutdown_timeout 5
101
+
102
+ # Set this to false for application environments that require rack.input to be a rewindable body
103
+ # (like Rails). For rack applications that can stream inputs, you can set this to true for a more memory-efficient approach.
104
+ stream_body false
105
+
106
+ # OOB GC responses threshold
107
+ # Specifies how frequently OOB gc should be triggered during periods where there is a gap in queued requests.
108
+ # Setting this too low can substantially worsen performance
109
+ oob_gc_responses_threshold 512
110
+
111
+ # Log level
112
+ # Set this to one of the following values: debug, info, warn, error, fatal
113
+ # Can also be set using the ITSI_LOG environment variable
114
+ log_level :info
115
+
116
+ # Log Format
117
+ # Set this to be either :ansi or :json. If you leave it blank Itsi will try
118
+ # and auto-detect the format based on the TTY environment.
119
+ log_format :auto