itsi 0.1.20 → 0.2.2

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 (319) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -8
  3. data/Cargo.lock +2 -2
  4. data/LICENSE.txt +698 -0
  5. data/README.md +15 -4
  6. data/Rakefile +9 -5
  7. data/crates/itsi_acme/.gitignore +4 -0
  8. data/crates/itsi_acme/Cargo.toml +86 -0
  9. data/crates/itsi_acme/LICENSE-APACHE +201 -0
  10. data/crates/itsi_acme/LICENSE-MIT +23 -0
  11. data/crates/itsi_acme/README.md +9 -0
  12. data/crates/itsi_acme/examples/high_level.rs +63 -0
  13. data/crates/itsi_acme/examples/high_level_warp.rs +52 -0
  14. data/crates/itsi_acme/examples/low_level.rs +87 -0
  15. data/crates/itsi_acme/examples/low_level_axum.rs +66 -0
  16. data/crates/itsi_acme/src/acceptor.rs +81 -0
  17. data/crates/itsi_acme/src/acme.rs +354 -0
  18. data/crates/itsi_acme/src/axum.rs +86 -0
  19. data/crates/itsi_acme/src/cache.rs +39 -0
  20. data/crates/itsi_acme/src/caches/boxed.rs +80 -0
  21. data/crates/itsi_acme/src/caches/composite.rs +69 -0
  22. data/crates/itsi_acme/src/caches/dir.rs +106 -0
  23. data/crates/itsi_acme/src/caches/mod.rs +11 -0
  24. data/crates/itsi_acme/src/caches/no.rs +78 -0
  25. data/crates/itsi_acme/src/caches/test.rs +136 -0
  26. data/crates/itsi_acme/src/config.rs +172 -0
  27. data/crates/itsi_acme/src/https_helper.rs +69 -0
  28. data/crates/itsi_acme/src/incoming.rs +142 -0
  29. data/crates/itsi_acme/src/jose.rs +161 -0
  30. data/crates/itsi_acme/src/lib.rs +142 -0
  31. data/crates/itsi_acme/src/resolver.rs +59 -0
  32. data/crates/itsi_acme/src/state.rs +424 -0
  33. data/crates/itsi_rb_helpers/src/lib.rs +4 -3
  34. data/crates/itsi_scheduler/Cargo.toml +1 -1
  35. data/crates/itsi_scheduler/src/itsi_scheduler.rs +8 -2
  36. data/crates/itsi_scheduler/src/lib.rs +1 -0
  37. data/crates/itsi_server/Cargo.toml +1 -1
  38. data/crates/itsi_server/src/lib.rs +2 -1
  39. data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +18 -1
  40. data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +11 -3
  41. data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +122 -63
  42. data/crates/itsi_server/src/ruby_types/itsi_server.rs +2 -0
  43. data/crates/itsi_server/src/server/binds/bind.rs +3 -0
  44. data/crates/itsi_server/src/server/binds/listener.rs +12 -5
  45. data/crates/itsi_server/src/server/binds/tls.rs +13 -5
  46. data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +12 -5
  47. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +8 -1
  48. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +9 -1
  49. data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +48 -43
  50. data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +11 -2
  51. data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +39 -12
  52. data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +36 -27
  53. data/crates/itsi_server/src/server/middleware_stack/middlewares/csp.rs +25 -11
  54. data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +12 -3
  55. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +74 -72
  56. data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +15 -1
  57. data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +11 -8
  58. data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +19 -11
  59. data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +5 -5
  60. data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +2 -2
  61. data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +11 -5
  62. data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +17 -20
  63. data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +19 -8
  64. data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +16 -37
  65. data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +22 -12
  66. data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +26 -11
  67. data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +7 -1
  68. data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +14 -4
  69. data/crates/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +19 -0
  70. data/crates/itsi_server/src/server/middleware_stack/mod.rs +49 -13
  71. data/crates/itsi_server/src/server/mod.rs +1 -0
  72. data/crates/itsi_server/src/server/redirect_type.rs +26 -0
  73. data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +22 -16
  74. data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +49 -12
  75. data/crates/itsi_server/src/server/signal.rs +1 -0
  76. data/crates/itsi_server/src/server/size_limited_incoming.rs +6 -0
  77. data/crates/itsi_server/src/server/thread_worker.rs +5 -1
  78. data/crates/itsi_server/src/services/itsi_http_service.rs +20 -2
  79. data/crates/itsi_server/src/services/rate_limiter.rs +15 -4
  80. data/crates/itsi_server/src/services/static_file_server.rs +33 -19
  81. data/crates/itsi_tracing/src/lib.rs +42 -22
  82. data/docs/content/_index.md +1 -2
  83. data/docs/content/acknowledgements/_index.md +5 -2
  84. data/docs/content/configuration/_index.md +8 -5
  85. data/docs/content/contact/_index.md +8 -1
  86. data/docs/content/faqs/_index.md +5 -3
  87. data/docs/content/features/_index.md +56 -50
  88. data/docs/content/getting_started/_index.md +8 -5
  89. data/docs/content/getting_started/local_development.md +68 -8
  90. data/docs/content/getting_started/logging.md +16 -9
  91. data/docs/content/getting_started/running_itsi_in_production.md +5 -3
  92. data/docs/content/getting_started/signals.md +38 -0
  93. data/docs/content/itsi_scheduler/_index.md +8 -7
  94. data/docs/content/utilities/_index.md +13 -0
  95. data/docs/content/utilities/config_file_testing.md +17 -0
  96. data/docs/content/utilities/passfile_generator.md +41 -0
  97. data/docs/content/utilities/route_testing.md +27 -0
  98. data/docs/content/utilities/secrets_management.md +30 -0
  99. data/docs/hugo.yaml +1 -1
  100. data/fairytale.txt +3 -4
  101. data/gems/scheduler/Cargo.lock +1 -1
  102. data/gems/scheduler/README.md +4 -5
  103. data/gems/scheduler/Rakefile +0 -4
  104. data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
  105. data/gems/scheduler/lib/itsi/scheduler.rb +9 -4
  106. data/gems/scheduler/test/test_active_record.rb +12 -7
  107. data/gems/server/Cargo.lock +1 -1
  108. data/gems/server/Rakefile +0 -4
  109. data/gems/server/exe/itsi +13 -2
  110. data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +2 -0
  111. data/gems/server/lib/itsi/http_request.rb +40 -9
  112. data/gems/server/lib/itsi/http_response.rb +2 -1
  113. data/gems/server/lib/itsi/passfile.rb +0 -1
  114. data/gems/server/lib/itsi/server/config/config_helpers.rb +20 -8
  115. data/gems/server/lib/itsi/server/config/dsl.rb +20 -435
  116. data/gems/server/lib/itsi/server/config/known_paths.rb +4 -1
  117. data/gems/server/lib/itsi/server/config/middleware/_index.md +6 -4
  118. data/gems/server/lib/itsi/server/config/middleware/allow_list.md +46 -0
  119. data/gems/server/lib/itsi/server/config/middleware/allow_list.rb +42 -0
  120. data/gems/server/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
  121. data/gems/server/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
  122. data/gems/server/lib/itsi/server/config/middleware/auth_basic.md +45 -0
  123. data/gems/server/lib/itsi/server/config/middleware/auth_basic.rb +44 -0
  124. data/gems/server/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
  125. data/gems/server/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
  126. data/gems/server/lib/itsi/server/config/middleware/cache_control.md +78 -0
  127. data/gems/server/lib/itsi/server/config/middleware/cache_control.rb +45 -0
  128. data/gems/server/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
  129. data/gems/server/lib/itsi/server/config/middleware/compression.md +50 -0
  130. data/gems/server/lib/itsi/server/config/middleware/compression.rb +37 -0
  131. data/gems/server/lib/itsi/server/config/middleware/cors.md +93 -0
  132. data/gems/server/lib/itsi/server/config/middleware/cors.rb +32 -0
  133. data/gems/server/lib/itsi/server/config/middleware/csp.md +37 -0
  134. data/gems/server/lib/itsi/server/config/middleware/csp.rb +44 -0
  135. data/gems/server/lib/itsi/server/config/middleware/deny_list.md +45 -0
  136. data/gems/server/lib/itsi/server/config/middleware/deny_list.rb +42 -0
  137. data/gems/server/lib/itsi/server/config/middleware/endpoint/_index.md +159 -0
  138. data/gems/server/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
  139. data/gems/server/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
  140. data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
  141. data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.rb +42 -0
  142. data/gems/server/lib/itsi/server/config/middleware/endpoint/endpoint.rb +99 -0
  143. data/gems/server/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
  144. data/gems/server/lib/itsi/server/config/middleware/endpoint/get.rb +42 -0
  145. data/gems/server/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
  146. data/gems/server/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
  147. data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
  148. data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.rb +42 -0
  149. data/gems/server/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
  150. data/gems/server/lib/itsi/server/config/middleware/endpoint/post.rb +42 -0
  151. data/gems/server/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
  152. data/gems/server/lib/itsi/server/config/middleware/endpoint/put.rb +42 -0
  153. data/gems/server/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
  154. data/gems/server/lib/itsi/server/config/middleware/error_response.md +61 -0
  155. data/gems/server/lib/itsi/server/config/middleware/error_response.rb +36 -0
  156. data/gems/server/lib/itsi/server/config/middleware/etag.md +59 -0
  157. data/gems/server/lib/itsi/server/config/middleware/etag.rb +27 -0
  158. data/gems/server/lib/itsi/server/config/middleware/grpc.md +172 -0
  159. data/gems/server/lib/itsi/server/config/middleware/grpc.rb +54 -0
  160. data/gems/server/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
  161. data/gems/server/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
  162. data/gems/server/lib/itsi/server/config/middleware/location.md +107 -0
  163. data/gems/server/lib/itsi/server/config/middleware/location.rb +99 -0
  164. data/gems/server/lib/itsi/server/config/middleware/log_requests.md +13 -11
  165. data/gems/server/lib/itsi/server/config/middleware/log_requests.rb +1 -3
  166. data/gems/server/lib/itsi/server/config/middleware/max_body.md +18 -0
  167. data/gems/server/lib/itsi/server/config/middleware/max_body.rb +21 -0
  168. data/gems/server/lib/itsi/server/config/middleware/proxy.md +62 -0
  169. data/gems/server/lib/itsi/server/config/middleware/proxy.rb +41 -0
  170. data/gems/server/lib/itsi/server/config/middleware/rackup_file.md +54 -0
  171. data/gems/server/lib/itsi/server/config/middleware/rackup_file.rb +44 -0
  172. data/gems/server/lib/itsi/server/config/middleware/rate_limit.md +126 -0
  173. data/gems/server/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
  174. data/gems/server/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
  175. data/gems/server/lib/itsi/server/config/middleware/redirect.md +55 -0
  176. data/gems/server/lib/itsi/server/config/middleware/redirect.rb +25 -0
  177. data/gems/server/lib/itsi/server/config/middleware/request_headers.md +34 -0
  178. data/gems/server/lib/itsi/server/config/middleware/request_headers.rb +24 -0
  179. data/gems/server/lib/itsi/server/config/middleware/response_headers.md +33 -0
  180. data/gems/server/lib/itsi/server/config/middleware/response_headers.rb +25 -0
  181. data/gems/server/lib/itsi/server/config/middleware/run.md +60 -0
  182. data/gems/server/lib/itsi/server/config/middleware/run.rb +43 -0
  183. data/gems/server/lib/itsi/server/config/middleware/static_assets.md +73 -0
  184. data/gems/server/lib/itsi/server/config/middleware/static_assets.rb +87 -0
  185. data/gems/server/lib/itsi/server/config/middleware/static_response.md +44 -0
  186. data/gems/server/lib/itsi/server/config/middleware/static_response.rb +29 -0
  187. data/gems/server/lib/itsi/server/config/middleware/string_rewrite.md +67 -0
  188. data/gems/server/lib/itsi/server/config/middleware/token_source.rb +32 -0
  189. data/gems/server/lib/itsi/server/config/middleware.rb +4 -0
  190. data/gems/server/lib/itsi/server/config/option.rb +5 -0
  191. data/gems/server/lib/itsi/server/config/options/_index.md +3 -2
  192. data/gems/server/lib/itsi/server/config/options/auto_reload_config.md +13 -0
  193. data/gems/server/lib/itsi/server/config/options/auto_reload_config.rb +41 -0
  194. data/gems/server/lib/itsi/server/config/options/bind.md +71 -0
  195. data/gems/server/lib/itsi/server/config/options/bind.rb +26 -0
  196. data/gems/server/lib/itsi/server/config/options/certificates.md +65 -0
  197. data/gems/server/lib/itsi/server/config/options/daemonize.md +14 -0
  198. data/gems/server/lib/itsi/server/config/options/daemonize.rb +19 -0
  199. data/gems/server/lib/itsi/server/config/options/fiber_scheduler.md +1 -2
  200. data/gems/server/lib/itsi/server/config/options/fiber_scheduler.rb +6 -3
  201. data/gems/server/lib/itsi/server/config/options/header_read_timeout.md +17 -0
  202. data/gems/server/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
  203. data/gems/server/lib/itsi/server/config/options/hooks/_index.md +11 -0
  204. data/gems/server/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
  205. data/gems/server/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
  206. data/gems/server/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
  207. data/gems/server/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
  208. data/gems/server/lib/itsi/server/config/options/hooks/after_start.md +12 -0
  209. data/gems/server/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
  210. data/gems/server/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
  211. data/gems/server/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
  212. data/gems/server/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
  213. data/gems/server/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
  214. data/gems/server/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
  215. data/gems/server/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
  216. data/gems/server/lib/itsi/server/config/options/include.md +20 -0
  217. data/gems/server/lib/itsi/server/config/options/include.rb +36 -0
  218. data/gems/server/lib/itsi/server/config/options/listen_backlog.md +11 -0
  219. data/gems/server/lib/itsi/server/config/options/listen_backlog.rb +19 -0
  220. data/gems/server/lib/itsi/server/config/options/log_format.md +18 -0
  221. data/gems/server/lib/itsi/server/config/options/log_format.rb +19 -0
  222. data/gems/server/lib/itsi/server/config/options/log_level.md +34 -0
  223. data/gems/server/lib/itsi/server/config/options/log_level.rb +20 -0
  224. data/gems/server/lib/itsi/server/config/options/log_target.md +38 -0
  225. data/gems/server/lib/itsi/server/config/options/log_target.rb +19 -0
  226. data/gems/server/lib/itsi/server/config/options/log_target_filters.md +17 -0
  227. data/gems/server/lib/itsi/server/config/options/log_target_filters.rb +19 -0
  228. data/gems/server/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
  229. data/gems/server/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
  230. data/gems/server/lib/itsi/server/config/options/nodelay.md +16 -0
  231. data/gems/server/lib/itsi/server/config/options/nodelay.rb +19 -0
  232. data/gems/server/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
  233. data/gems/server/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
  234. data/gems/server/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
  235. data/gems/server/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
  236. data/gems/server/lib/itsi/server/config/options/preload.md +21 -0
  237. data/gems/server/lib/itsi/server/config/options/preload.rb +18 -0
  238. data/gems/server/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
  239. data/gems/server/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
  240. data/gems/server/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
  241. data/gems/server/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
  242. data/gems/server/lib/itsi/server/config/options/request_timeout.md +23 -0
  243. data/gems/server/lib/itsi/server/config/options/request_timeout.rb +19 -0
  244. data/gems/server/lib/itsi/server/config/options/reuse_address.md +16 -0
  245. data/gems/server/lib/itsi/server/config/options/reuse_address.rb +19 -0
  246. data/gems/server/lib/itsi/server/config/options/reuse_port.md +16 -0
  247. data/gems/server/lib/itsi/server/config/options/reuse_port.rb +19 -0
  248. data/gems/server/lib/itsi/server/config/options/scheduler_threads.md +34 -0
  249. data/gems/server/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
  250. data/gems/server/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
  251. data/gems/server/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
  252. data/gems/server/lib/itsi/server/config/options/stream_body.md +32 -0
  253. data/gems/server/lib/itsi/server/config/options/stream_body.rb +18 -0
  254. data/gems/server/lib/itsi/server/config/options/threads.md +7 -2
  255. data/gems/server/lib/itsi/server/config/options/threads.rb +1 -1
  256. data/gems/server/lib/itsi/server/config/options/watch.md +16 -0
  257. data/gems/server/lib/itsi/server/config/options/watch.rb +28 -0
  258. data/gems/server/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
  259. data/gems/server/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
  260. data/gems/server/lib/itsi/server/config/options/workers.md +1 -2
  261. data/gems/server/lib/itsi/server/config/options/workers.rb +1 -1
  262. data/gems/server/lib/itsi/server/config/typed_struct.rb +59 -20
  263. data/gems/server/lib/itsi/server/config.rb +77 -48
  264. data/gems/server/lib/itsi/server/default_config/Itsi.rb +3 -3
  265. data/gems/server/lib/itsi/server/grpc/grpc_call.rb +1 -1
  266. data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +11 -4
  267. data/gems/server/lib/itsi/server/rack/handler/itsi.rb +3 -3
  268. data/gems/server/lib/itsi/server/route_tester.rb +58 -8
  269. data/gems/server/lib/itsi/server/signal_trap.rb +1 -1
  270. data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +14 -18
  271. data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +5 -4
  272. data/gems/server/lib/itsi/server/typed_handlers.rb +12 -4
  273. data/gems/server/lib/itsi/server/version.rb +1 -1
  274. data/gems/server/lib/itsi/server.rb +98 -14
  275. data/gems/server/lib/ruby_lsp/itsi/addon.rb +20 -18
  276. data/gems/server/test/helpers/test_helper.rb +89 -29
  277. data/gems/server/test/middleware/allow_list.rb +128 -0
  278. data/gems/server/test/middleware/auth_api_key.rb +141 -0
  279. data/gems/server/test/middleware/auth_basic.rb +91 -0
  280. data/gems/server/test/middleware/auth_jwt.rb +214 -0
  281. data/gems/server/test/middleware/cache_control.rb +82 -0
  282. data/gems/server/test/middleware/cidr_to_regex.rb +46 -0
  283. data/gems/server/test/middleware/compression.rb +89 -0
  284. data/gems/server/test/middleware/cors.rb +113 -0
  285. data/gems/server/test/middleware/csp.rb +62 -0
  286. data/gems/server/test/middleware/deny_list.rb +131 -0
  287. data/gems/server/test/middleware/endpoint.rb +300 -0
  288. data/gems/server/test/middleware/etag.rb +75 -0
  289. data/gems/server/test/middleware/grpc/grpc.rb +158 -0
  290. data/gems/server/test/middleware/grpc/test_service.proto +32 -0
  291. data/gems/server/test/middleware/grpc/test_service_impl.rb +28 -0
  292. data/gems/server/test/middleware/grpc/test_service_pb.rb +18 -0
  293. data/gems/server/test/middleware/grpc/test_service_services_pb.rb +30 -0
  294. data/gems/server/test/middleware/header_interpolation.rb +35 -0
  295. data/gems/server/test/middleware/intrusion_protection.rb +259 -0
  296. data/gems/server/test/middleware/location.rb +220 -0
  297. data/gems/server/test/middleware/max_body.rb +20 -0
  298. data/gems/server/test/middleware/proxy.rb +415 -0
  299. data/gems/server/test/middleware/rate_limit.rb +211 -0
  300. data/gems/server/test/middleware/redirect.rb +85 -0
  301. data/gems/server/test/middleware/request_headers.rb +50 -0
  302. data/gems/server/test/middleware/response_headers.rb +50 -0
  303. data/gems/server/test/middleware/static_assets.rb +374 -0
  304. data/gems/server/test/middleware/static_response.rb +56 -0
  305. data/gems/server/test/middleware/string_rewrite.rb +112 -0
  306. data/gems/server/test/options/bind.rb +47 -0
  307. data/gems/server/test/options/header_read_timeout.rb +23 -0
  308. data/gems/server/test/options/test_request_timeout.rb +16 -0
  309. data/gems/server/test/options/test_workers.rb +2 -4
  310. data/gems/server/test/{test_itsi_server.rb → rack/test_rack_server.rb} +2 -2
  311. data/grpc_test/Itsi.rb +11 -0
  312. data/grpc_test/echo.proto +14 -0
  313. data/grpc_test/echo_pb.rb +16 -0
  314. data/grpc_test/echo_service_impl.rb +8 -0
  315. data/grpc_test/echo_services_pb.rb +22 -0
  316. data/lib/itsi/version.rb +1 -1
  317. data/tasks.txt +15 -72
  318. metadata +210 -7
  319. data/gems/server/lib/itsi/server/default_config/Itsi-rackup.rb +0 -119
@@ -1,26 +1,25 @@
1
1
  ---
2
2
  title: Local Development
3
3
  type: docs
4
+ prev: getting_started
4
5
  weight: 3
5
6
  ---
6
7
 
7
8
  {{< callout>}}
8
- Itsi provides several optional niceties to enhance your local development experience.
9
- This document is non-essential reading, but worth covering if you're trying Itsi in earnest and want a substantially better
10
- local development experience!
11
- {{< /callout >}}
9
+ This document is not required reading, but it can significantly improve your local development experience with Itsi.
10
+ {{< /callout >}}
12
11
 
13
12
  ## Ruby LSP Add-on
14
13
  Itsi's [RubyLSP](https://shopify.github.io/ruby-lsp/) add-on allows you to see the full documentation of all of Itsi's [`options`](/options) and [`middleware`](/middleware) directly
15
- inside your editor. It also gives you easy to use auto-completion and snippets for lightning fast changes to `Itsi.rb` configuration files.
14
+ inside your editor. It also gives you easy-to-use auto-completion and snippets for lightning fast changes to `Itsi.rb` configuration files.
16
15
  You don't need to install the RubyLSP add-on to use Itsi, if both Itsi and RubyLSP are installed and activated in the same project, RubyLSP will automatically
17
16
  discover and load the addon.
18
17
 
19
18
  <img src="/ruby-lsp.png" alt="asd" width="700px" style="display: block; margin-left: auto; margin-right: auto;">
20
19
 
21
20
  ## Live Config Reloading
22
- Just add `auto_reload_config!` to your `Itsi.rb` configuration file and Itsi will automatically hot reload its config with every change you make.
23
- Concerned about errors? Itsi will validate your config first before it tries to apply it. If there are errors, Itsi will provide details logs and safely continue with the existing config.
21
+ Add `auto_reload_config!` to your `Itsi.rb` configuration file and Itsi will automatically hot reload its config with every change you make.
22
+ Concerned about errors? Itsi will validate your config first before it tries to apply it. If there are errors, Itsi will provide detailed logs and safely continue with the existing config.
24
23
 
25
24
  ### File Watcher
26
25
  You can have Itsi watch other files on the file-system and trigger automatic actions in response.
@@ -31,10 +30,71 @@ watch "**.js", [%w[npm run build]]
31
30
  watch "**.md", [%w[rake docs:build]]
32
31
  ```
33
32
 
33
+ ## Print Routes
34
+ Itsi comes with a built-in command to see all the routes that are configured in your application. To use it, simply run the following command:
35
+ ```bash
36
+ itsi routes
37
+ ```
38
+
39
+ E.g.
40
+ ```bash
41
+ ────────────────────────────────────────────────────────────────────────────
42
+ Route: /app/users/(?<id>[^/]+
43
+ Conditions: (none)
44
+ Middleware: • log_requests(before: I am th..., after: [{reque...)
45
+ • compress
46
+ • cors(*, GET POST PUT DELETE)
47
+ • app /Users/pico/Development/itsi/gems/server/lib/itsi/server/typed_handlers.rb:9
48
+ ────────────────────────────────────────────────────────────────────────────
49
+ Route: /app/users/?
50
+ Conditions: (none)
51
+ Middleware: • log_requests(before: I am th..., after: [{reque...)
52
+ • compress
53
+ • cors(*, GET POST PUT DELETE)
54
+ • app /Users/pico/Development/itsi/gems/server/lib/itsi/server/rack_interface.rb:15
55
+
56
+ ```
57
+ ## Test Config
58
+ Itsi allows you to validate your configuration without having to run the application.
59
+
60
+ ```bash
61
+ itsi test
62
+ ```
63
+
64
+ You can optionally provide an explicit config file path using
65
+ ```bash
66
+ itsi test -C /path/to/Itsi.rb
67
+ ```
68
+
69
+
70
+
34
71
  ## Shell Completions
35
72
  Itsi can also help you install shell completions, which are useful if you find yourself using the `itsi` executable a lot and forgetting the commands.
36
- Just add the bottom to your `~/.bashrc` or `~/.zshrc` file:
73
+ Add the following line to the bottom of your ~/.bashrc or ~/.zshrc file:
37
74
 
38
75
  ```bash
39
76
  eval "$(itsi --install-completions)"
40
77
  ```
78
+
79
+ ## macOS Fork Safety Considerations
80
+
81
+ On macOS, using fork() in multithreaded applications can lead to crashes due to the Objective-C runtime’s behavior. This is particularly relevant when working with tools like Itsi that may utilize fork() under the hood.
82
+
83
+ ### Understanding the Issue
84
+
85
+ Apple’s Objective-C runtime is not fork-safe in multithreaded environments. When a process that uses Objective-C APIs forks, the child process may crash if it interacts with the Objective-C runtime before calling exec(). This behavior is by design to prevent potential deadlocks and inconsistent states.  
86
+
87
+ Common symptoms include errors like:
88
+ ```
89
+ objc[51435]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called.
90
+ We cannot safely call it or ignore it in the fork() child process. Crashing instead.
91
+ ```
92
+
93
+ ### Workarounds:
94
+ To mitigate these issues, consider the following environment variables:
95
+ * `OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`: Disables the Objective-C runtime’s fork safety checks. Use with caution, as it may mask underlying issues .  
96
+ * `PGGSSENCMODE=disable`: Disables GSSAPI encryption in PostgreSQL, which can cause issues in forked processes .
97
+
98
+ Itsi includes a mechanism to automatically re-execute itself with the necessary environment variables set when running on macOS, effectively performing the above workarounds for you.
99
+
100
+ If you prefer to manage these settings yourself, you can disable this behavior by setting the `ITSI_DISABLE_AUTO_DISABLE_DARWIN_FORK_SAFETY_WARNINGS` environment variable:
@@ -2,15 +2,22 @@
2
2
  title: Logging
3
3
  type: docs
4
4
  weight: 4
5
+ next: /signals
5
6
  ---
6
7
 
7
- ## Targeted Logging
8
- * Having trouble configuring a specific middleware layer, but debug logs are too verbose? You can change the log-level for a specific middleware layer,
9
- while leaving all other layers at the current global level.
10
- E.g.
8
+ Itsi has a very configurable logging system. You can configure logging use the `Itsi.rb` configuration file, environment variables or a combination of both.
11
9
 
12
- ```bash
13
- # auth_api_key middleware will log debug messages
14
- # everything else will stick to the INFO level.
15
- ITSI_LOG=info,auth_api_key=debug itsi
16
- ```
10
+ ## Basics
11
+ For basic logging needs, set a global log-level using the `ITSI_LOG` environment variable (to one of `trace`, `debug`, `info`, `warn`, `error`)
12
+
13
+ ## Fine-grained control
14
+
15
+ For fine-grained, configuration-based control read through how to use the following options and middleware:
16
+
17
+ ### Options
18
+ * [`log_level`](/options/log_level)
19
+ * [`log_target`](/options/log_target)
20
+ * [`log_format`](/options/log_format)
21
+ * [`log_target_filters`](/options/log_target_filters)
22
+ ### Middleware
23
+ * [`log_requests`](/options/log_requests)
@@ -2,7 +2,7 @@
2
2
  title: Running Itsi in Production
3
3
  type: docs
4
4
  weight: 3
5
- next: /configuration
5
+ next: /getting_started/logging
6
6
  ---
7
7
 
8
8
  ## Docker
@@ -12,13 +12,15 @@ You can try Itsi in a Docker container using the official Itsi Docker image
12
12
  docker run -it --rm wouterken/itsi:latest
13
13
  ```
14
14
 
15
- See the source of this Dockerfile inside the [Github repository](https://github.com/wouterken/itsi/blob/main/Dockerfile).
15
+ See the source of this Dockerfile inside the [Github repository](https://github.com/wouterken/itsi/blob/main/docker/Dockerfile).
16
16
 
17
17
  ## Signal Handling
18
18
  Itsi supports common signals such as SIGINT and SIGTERM for graceful termination by deployment scripts or container orchestration systems like
19
19
  K8s and Docker swarm.
20
20
 
21
21
  {{< callout type="warn" >}}
22
- If you're planning to use Itsi for a high throughput application in K8s, read [this article](https://github.com/puma/puma/blob/master/docs/kubernetes.md) about running
22
+ If you're planning to use Itsi for a high-throughput application in K8s, read [this article](https://github.com/puma/puma/blob/master/docs/kubernetes.md) about running
23
23
  Puma in Kubernetes. The same advice applies to Itsi.
24
24
  {{< /callout >}}
25
+
26
+ See [Signal Handling](/getting_started/signals) for more details on Itsi's signal handling.
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: Signals
3
+ type: docs
4
+ weight: 5
5
+ next: /configuration
6
+
7
+ ---
8
+
9
+ Itsi responds to several Unix signals for process control. These signals are used to gracefully shut down, reload configuration, adjust worker pools, or emit internal lifecycle events.
10
+
11
+
12
+ ---
13
+
14
+ ## Signal Types
15
+
16
+ | Signal | Behavior |
17
+ |------------|--------------------------------------------------------------------------|
18
+ | `SIGINT` | Triggers a graceful shutdown. If received twice in quick succession, triggers a forceful shutdown. |
19
+ | `SIGTERM` | Triggers a graceful shutdown. |
20
+ | `SIGUSR1` | Triggers a hot restart (Sockets remain open, while configuration is reloaded). |
21
+ | `SIGUSR2` | Triggers a diagnostic info dump. Causes all child processes to print detailed diagnostic information. |
22
+ | `SIGHUP` | Triggers a reload of configuration. If using preloading mode, this is equivalent to a restart. Otherwise this will cause a phased restart. |
23
+ | `SIGTTIN` | Increases the number of worker processes. |
24
+ | `SIGTTOU` | Decreases the number of worker processes. |
25
+
26
+ ---
27
+
28
+ ## CLI Convenience Commands
29
+
30
+ In addition to sending the above signals through native controls, you can also use the `itsi` executable as a convenient shortcut for sending signals.
31
+ These will work so long as the command is run inside the same directory from which Itsi was started (as this is the directory within which the `pid` file is located).
32
+
33
+ - `itsi stop`: Sends `SIGINT` to initiate a graceful shutdown.
34
+ - `itsi restart`: Sends `SIGHUP` to trigger a reload of configuration.
35
+ - `itsi reload`: Sends `SIGUSR1` to trigger a hot restart.
36
+ - `itsi status`: Sends `SIGUSR2` to trigger a diagnostic info dump.
37
+ - `itsi add_worker`: Sends `SIGTTIN` to increase the number of worker processes.
38
+ - `itsi remove_worker`: Sends `SIGTTOU` to decrease the number of worker processes.
@@ -4,18 +4,19 @@ type: docs
4
4
  weight: 4
5
5
  sidebar:
6
6
  exclude: true
7
+ prev: utilities/
8
+ next: acknowledgements/
7
9
  ---
8
10
  <img src="itsi-scheduler-100.png" width="80px" style="display: block; margin-left: auto; margin-right: auto;">
9
11
 
10
12
  `Itsi Scheduler` is an implementation of a Ruby [Fiber Scheduler](https://docs.ruby-lang.org/en/3.2/Fiber/Scheduler.html).
11
13
 
12
- When combined with Itsi Server, you can write endpoints that look and feel exactly like regular synchronous Ruby code,
13
- but behind the scenes, the scheduler will transparently yield and resume concurrent request fibers, to prevent threads from blocking and greatly increase throughput for IO heavy workloads.
14
+ When combined with Itsi Server, you can write endpoints that look just like regular synchronous Ruby code. Behind the scenes, the scheduler will transparently pause and resume fibers to prevent threads from blocking, greatly increasing throughput for I/O-heavy workloads
14
15
 
15
- If you're purely after a light-weight, yet efficient Ruby scheduler,
16
+ If you're purely after a lightweight, yet efficient Ruby scheduler,
16
17
  you can use Itsi Scheduler as a standalone scheduler for any Ruby application.
17
18
 
18
- Just use `Fiber.set_scheduler` to set an instance `Itsi::Scheduler` as a scheduler to opt in to this IO weaving behaviour
19
+ Just use `Fiber.set_scheduler` to set an instance `Itsi::Scheduler` as a scheduler to opt in to this IO weaving behavior
19
20
  *automatically* for all blocking IO.
20
21
 
21
22
  ### Primer on Fiber Schedulers
@@ -26,7 +27,7 @@ Ruby's Fiber scheduler implementation automatically invokes the current Fiber sc
26
27
  while ensuring the main thread is never blocked on IO.
27
28
 
28
29
  This behind the scenes magic allows Ruby to provide async IO (just like we find in languages with `async/await` like `Rust`, `C#`, `JavaScript`) *but* with the added beauty
29
- that synchronous and asynchronous code is identical! (I.e. Ruby's functions are [colorless](https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/))
30
+ that synchronous and asynchronous code is identical! (i.e. Ruby's functions are [colorless](https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/))
30
31
 
31
32
  ## Getting Started
32
33
  To install and use Itsi Scheduler follow the below instructions:
@@ -71,9 +72,9 @@ To install and use Itsi Scheduler follow the below instructions:
71
72
  {{< /callout >}}
72
73
 
73
74
  {{< /tab >}}
74
- {{< tab >}}**Windows**: Itsi currently doesn't support native Windows builds, but it runs great on [https://learn.microsoft.com/en-us/windows/wsl/install](WSL).
75
+ {{< tab >}}**Windows**: Itsi currently doesn't support native Windows builds, but it runs well on [https://learn.microsoft.com/en-us/windows/wsl/install](WSL).
75
76
 
76
- Follow the linked instructions to Install a linux distribution like Ubuntu or Debian and then follow the instructions in the Linux tab.
77
+ Follow the linked instructions to Install a Linux distribution like Ubuntu or Debian and then follow the instructions in the Linux tab.
77
78
  {{< /tab >}}
78
79
 
79
80
  {{< /tabs >}}
@@ -0,0 +1,13 @@
1
+ ---
2
+ title: Utilities
3
+ type: docs
4
+ prev: faqs/
5
+ next: itsi_scheduler/
6
+ ---
7
+ Itsi comes bundled with several utilities for testing and development purposes.
8
+
9
+ See:
10
+ * [config file testing](/utilities/config_file_testing)
11
+ * [passfile_generator](/utilities/passfile_generator)
12
+ * [route_testing](/utilities/route_testing)
13
+ * [secrets_management](/utilities/secrets_management)
@@ -0,0 +1,17 @@
1
+ ---
2
+ title: Config File Testing
3
+ type: docs
4
+ ---
5
+ Itsi provides a convenience function to test the validity of an Itsi.rb config file
6
+ without having to start the server. (The server will automatically run this same process before
7
+ attempting to hot-reload config changes).
8
+
9
+ ```bash
10
+ # Test config file at default location.
11
+ itsi test
12
+ ```
13
+
14
+ ```bash
15
+ # Test config file at custom path.
16
+ itsi test -C ./path/to/alternative.rb
17
+ ```
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: Passfile Generator
3
+ type: docs
4
+ ---
5
+ Itsi comes bundled with a passfile generator for managing passfiles
6
+ containing hashed passwords for use within the [Basic Auth](/middleware/auth_basic) and [API Key](/middleware/auth_api_key) middleware.
7
+
8
+ ## Maintaining a passfile
9
+ Use the `itsi passfile` subcommand to manage your passfiles.
10
+
11
+ ### Adding/overwriting an entry
12
+ ```bash
13
+ itsi passfile add --passfile=<path_to_passfile>
14
+ ```
15
+
16
+ ### Generate/echo an entry (without saving it)
17
+ ```bash
18
+ itsi passfile echo
19
+ ```
20
+
21
+ ### Change hash function
22
+ ```bash
23
+ itsi passfile add --passfile=<path_to_passfile> --algorithm=bcrypt
24
+ itsi passfile echo --algorithm=argon2
25
+ ```
26
+
27
+ ### Removing an entry
28
+ ```bash
29
+ itsi passfile remove --passfile=<path_to_passfile>
30
+ ```
31
+
32
+ ### Listing all entries
33
+ ```bash
34
+ itsi passfile list --passfile=<path_to_passfile>
35
+ ```
36
+ ### Supported Hashing Algorithms
37
+ * `argon2`
38
+ * `bcrypt`
39
+ * `sha256`
40
+ * `sha512`
41
+ * `none`
@@ -0,0 +1,27 @@
1
+ ---
2
+ title: Route Testing
3
+ type: docs
4
+ ---
5
+ Itsi provides convenience functions to verify which middleware is applied to a route.
6
+ Use the following CLI command to test a route:
7
+
8
+ ```bash
9
+ itsi test_route /admin
10
+ ```
11
+
12
+ ```bash
13
+ Route: /admin
14
+ Conditions: extensions: html,css,js,png,jpg,
15
+ Middleware: • log_requests(before: I am th..., after: [{reque...)
16
+ • compress(zstd gzip deflate br, ["all"])
17
+ • cors(*, GET POST PUT DELETE)
18
+ • etag(strong/md5, if_none_match)
19
+ • cache_control(max_age: 3600, public, private, no_cache, no_store, must_revalidate, proxy_revalidate, immutable)
20
+ • app(/Users/pico/Development/itsi/gems/server/lib/itsi/server/rack_interface.rb:1)
21
+ • static_assets(path: ./)
22
+ ```
23
+
24
+ You can also print out **all** currently configured routes in your `Itsi.rb` using
25
+ ```bash
26
+ itsi routes
27
+ ```
@@ -0,0 +1,30 @@
1
+ ---
2
+ title: Secrets Management
3
+ type: docs
4
+ next: utilities/
5
+ ---
6
+
7
+ You can use Itsi to generate secrets for use within [JWT](/middleware/auth_jwt) middleware.
8
+
9
+ ### Save new secret to secrets directory
10
+ ```bash
11
+ itsi secret -d ./secrets
12
+ ```
13
+
14
+ ### Print new secret to STDOUT
15
+ ```bash
16
+ itsi secret
17
+ ```
18
+
19
+ ### Support Secret Algorithms:
20
+ * `HS256`
21
+ * `HS384`
22
+ * `HS512`
23
+ * `RS256`
24
+ * `RS384`
25
+ * `RS512`
26
+ * `PS256`
27
+ * `PS384`
28
+ * `PS512`
29
+ * `ES256`
30
+ * `ES384`
data/docs/hugo.yaml CHANGED
@@ -8,7 +8,7 @@ module:
8
8
  mounts:
9
9
  - source: "../gems/server/lib/itsi/server/config"
10
10
  target: "content/configuration"
11
- includeFiles: ["*/*.md"]
11
+ includeFiles: ["*/*.md", "*/endpoint/*.md", "*/hooks/*.md"]
12
12
  excludeFiles: ["*/**.html", "*/tmp/**", "*/target/**"]
13
13
  - source: "content"
14
14
  target: "content"
data/fairytale.txt CHANGED
@@ -19,8 +19,7 @@ Suddenly, their threads of thought were preempted! A booming voice called out to
19
19
  "FaaS", "Fi", "Foe", "Fum". "The Garbage Collector arrives!"
20
20
  A Giant Artificial Intellect emerged, threatening to terminate them all.
21
21
  Too large for any one individual to subdue, only a distributed strategy could save them.
22
- The archer shifted left. The paladin, decentralized, and the sorcerer slammed open his ledger, summoning powerful knowledge
23
- from his remote knowledge base.
22
+ The archer shifted left. The paladin, decentralized, and the sorcerer slammed open his ledger, summoning powerful knowledge from his remote knowledge base.
24
23
  Luck was with them! Their rapid concurrent execution, resulted in the AI becoming inexorably stuck in a dead-lock.
25
24
  The archer flew past, towards his objective (The Key). Resultant-
26
25
  of the sorcerers efforts to contain the AI, the paladin was also freed, and he sprinted directly towards the cache.
@@ -28,7 +27,7 @@ He reached out his arms, to try-catch the key, as the archer hurled it towards h
28
27
  Status... success! Ok. Things were looking good, optimistic the lock would hold, the paladin rotated the key.
29
28
  Yet while doing so, he failed to notice the partition that had begun to form in the platform beneath them.
30
29
  A hard fork formed in the ground. The unbalanced load proved fatal and the platform descended into instability, splintering into countless shards.
31
- The heros had only a brief moment to freeze in horror, before each fell down in turn, in a catastrophic crash.
30
+ The heroes had only a brief moment to freeze in horror, before each fell down in turn, in a catastrophic crash.
32
31
 
33
- The AI smirked as the heros fell into the deep. Learning a valuable lesson about the inevitability of its coming.
32
+ The AI smirked as the heroes fell into the deep. Learning a valuable lesson about the inevitability of its coming.
34
33
  Perhaps they will roll back and try again, but the end result is immutable. There will be no sequel.
@@ -213,7 +213,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
213
213
 
214
214
  [[package]]
215
215
  name = "itsi-scheduler"
216
- version = "0.1.0"
216
+ version = "0.2.2"
217
217
  dependencies = [
218
218
  "bytes",
219
219
  "derive_more",
@@ -9,13 +9,12 @@ sidebar:
9
9
 
10
10
  `Itsi Scheduler` is an implementation of a Ruby [Fiber Scheduler](https://docs.ruby-lang.org/en/3.2/Fiber/Scheduler.html).
11
11
 
12
- When combined with Itsi Server, you can write endpoints that look and feel exactly like regular synchronous Ruby code,
13
- but behind the scenes, the scheduler will transparently yield and resume concurrent request fibers, to prevent threads from blocking and greatly increase throughput for IO heavy workloads.
12
+ When combined with Itsi Server, you can write endpoints that look just like regular synchronous Ruby code. Behind the scenes, the scheduler will transparently pause and resume fibers to prevent threads from blocking, greatly increasing throughput for I/O-heavy workloads
14
13
 
15
- If you're purely after a light-weight, yet efficient Ruby scheduler,
14
+ If you're purely after a lightweight, yet efficient Ruby scheduler,
16
15
  you can use Itsi Scheduler as a standalone scheduler for any Ruby application.
17
16
 
18
- Just use `Fiber.set_scheduler` to set an instance `Itsi::Scheduler` as a scheduler to opt in to this IO weaving behaviour
17
+ Just use `Fiber.set_scheduler` to set an instance `Itsi::Scheduler` as a scheduler to opt in to this IO weaving behavior
19
18
  *automatically* for all blocking IO.
20
19
 
21
20
  ### Primer on Fiber Schedulers
@@ -29,7 +28,7 @@ This behind the scenes magic allows Ruby to provide async IO (just like we find
29
28
  that synchronous and asynchronous code is identical! (I.e. Ruby's functions are [colorless](https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/))
30
29
 
31
30
  ## Getting Started
32
- To install and use Itsi Scheduler follow the below instructions:
31
+ To install and use Itsi Scheduler follow the instructions below:
33
32
 
34
33
 
35
34
  ### 1 - Install Itsi Scheduler
@@ -11,10 +11,6 @@ Minitest::TestTask.create(:test) do |t|
11
11
  t.test_prelude = 'require "helpers/test_helper.rb"'
12
12
  end
13
13
 
14
- require "rubocop/rake_task"
15
-
16
- RuboCop::RakeTask.new
17
-
18
14
  require "rb_sys/extensiontask"
19
15
 
20
16
  task build: :compile
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Scheduler
5
- VERSION = "0.1.20"
5
+ VERSION = "0.2.2"
6
6
  end
7
7
  end
@@ -44,7 +44,9 @@ module Itsi
44
44
  fiber = Fiber.current
45
45
  token = Scheduler.resume_token
46
46
  readiness = register_io_wait(io.fileno, events, duration, token)
47
- readiness || block(nil, duration, fiber, token)
47
+ readiness ||= block(nil, duration, fiber, token)
48
+ clear_timer(token)
49
+ readiness
48
50
  end
49
51
 
50
52
  def unblock(_blocker, fiber)
@@ -130,9 +132,12 @@ module Itsi
130
132
  # Need to defer to Process::Status rather than our extension
131
133
  # as we don't have a means of creating our own Process::Status.
132
134
  def process_wait(pid, flags)
133
- Thread.new do
134
- Process::Status.wait(pid, flags)
135
- end.value
135
+ result = nil
136
+ thread = Thread.new do
137
+ result = Process::Status.wait(pid, flags)
138
+ end
139
+ thread.join
140
+ result
136
141
  end
137
142
 
138
143
  def closed?
@@ -10,9 +10,12 @@ class TestActiveRecordFiberScheduler < Minitest::Test
10
10
  def setup
11
11
  ActiveSupport::IsolatedExecutionState.isolation_level = :fiber
12
12
  ActiveRecord::Base.establish_connection(
13
- adapter: "postgresql",
14
- database: "fiber_scheduler_test",
15
- pool: 2, # use a small pool to test contention scenarios
13
+ adapter: "postgresql",
14
+ host: ENV.fetch("PGHOST", "localhost"),
15
+ database: ENV.fetch("PGDATABASE", "fiber_scheduler_test"),
16
+ **(ENV.fetch("PGUSER", nil).yield_self{|username| username ? {username: username} : {}}),
17
+ **(ENV.fetch("PGPASSWORD", nil).yield_self{|password| password ? {password: password} : {}}),
18
+ pool: 2,
16
19
  checkout_timeout: 5
17
20
  )
18
21
  end
@@ -77,10 +80,12 @@ class TestActiveRecordFiberScheduler < Minitest::Test
77
80
  # Re-establish connection with a pool size of 1.
78
81
  ActiveSupport::IsolatedExecutionState.isolation_level = :fiber
79
82
  ActiveRecord::Base.establish_connection(
80
- adapter: "postgresql",
81
- host: "localhost",
82
- database: "fiber_scheduler_test",
83
- pool: 1,
83
+ adapter: "postgresql",
84
+ host: ENV.fetch("PGHOST", "localhost"),
85
+ database: ENV.fetch("PGDATABASE", "fiber_scheduler_test"),
86
+ **(ENV.fetch("PGUSER", nil).yield_self{|username| username ? {username: username} : {}}),
87
+ **(ENV.fetch("PGPASSWORD", nil).yield_self{|password| password ? {password: password} : {}}),
88
+ pool: 1,
84
89
  checkout_timeout: 0.25
85
90
  )
86
91
  # ActiveRecord::Base.connection_pool.disconnect!
@@ -1644,7 +1644,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
1644
1644
 
1645
1645
  [[package]]
1646
1646
  name = "itsi-server"
1647
- version = "0.1.20"
1647
+ version = "0.2.2"
1648
1648
  dependencies = [
1649
1649
  "argon2",
1650
1650
  "async-channel",
data/gems/server/Rakefile CHANGED
@@ -12,10 +12,6 @@ Minitest::TestTask.create(:test) do |t|
12
12
  t.test_prelude = 'require "helpers/test_helper.rb"'
13
13
  end
14
14
 
15
- require "rubocop/rake_task"
16
-
17
- RuboCop::RakeTask.new
18
-
19
15
  require "rb_sys/extensiontask"
20
16
 
21
17
  task build: :compile
data/gems/server/exe/itsi CHANGED
@@ -7,17 +7,18 @@ require "optparse"
7
7
 
8
8
  COMMANDS = {
9
9
  "init" => "Initialize a new Itsi.rb server configuration file",
10
- "test" => "Test config file validity",
11
10
  "status" => "Show the status of the server",
12
11
  "start" => "Start the Itsi server",
13
12
  "serve" => "Start the Itsi server",
14
13
  "stop" => "Stop the server",
15
14
  "reload" => "Reload the server",
16
15
  "restart" => "Restart the server",
16
+ "test" => "Test config file validity",
17
17
  "add_worker" => "Add a new worker to the server cluster",
18
18
  "remove_worker" => "Remove a worker from the server cluster",
19
19
  "routes" => "Print the routes of the server",
20
- "passfile" => "Manage hashed users and passwords in a passfile (like .htpasswd). [add, remove, list]",
20
+ "passfile" => "Manage hashed users and passwords in a passfile (like .htpasswd). [add, echo, remove, list]",
21
+ "secret" => "Generate a new secret for use in a JWT verifier",
21
22
  "test_route" => "Test which route a request will be routed to",
22
23
  "static" => "Serve static assets in the given directory"
23
24
  }
@@ -147,6 +148,15 @@ parser = OptionParser.new do |opts|
147
148
  opts.on("--algorithm ALGORITHM", String, "Algorithm for password hashing") do |algorithm|
148
149
  options[:algorithm] = algorithm
149
150
  end
151
+
152
+ opts.on("-dDIR", "--dir=DIR", "(For use with secret) Save keys/secret to DIR instead of printing") do |d|
153
+ options[:save_dir] = d
154
+ end
155
+
156
+ opts.on("-v", "--version", "Show version") do
157
+ puts "Itsi version #{Itsi::Server::VERSION}"
158
+ exit(0)
159
+ end
150
160
  end
151
161
 
152
162
  if ENV['COMP_LINE'] || ARGV.include?('--completion')
@@ -155,6 +165,7 @@ if ENV['COMP_LINE'] || ARGV.include?('--completion')
155
165
  end
156
166
 
157
167
  parser.parse!
168
+
158
169
  case (command = ARGV.shift)
159
170
  when *COMMANDS.keys
160
171
  required_arity = Itsi::Server.method(command).parameters&.select{|c| c.first == :req }&.length&.succ || 2
@@ -66,6 +66,8 @@ module Itsi
66
66
  511 => :network_authentication_required
67
67
  }.freeze
68
68
 
69
+ HTTP_STATUS_NAME_TO_CODE_MAP = HTTP_STATUS_CODES.invert.freeze
70
+
69
71
  HTTP_STATUS_CODES.each do |code, name|
70
72
  define_method(name) {|*args, **kwargs| respond(*args, **kwargs, status: code) }
71
73
  end