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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1 -8
- data/Cargo.lock +2 -2
- data/LICENSE.txt +698 -0
- data/README.md +15 -4
- data/Rakefile +9 -5
- data/crates/itsi_acme/.gitignore +4 -0
- data/crates/itsi_acme/Cargo.toml +86 -0
- data/crates/itsi_acme/LICENSE-APACHE +201 -0
- data/crates/itsi_acme/LICENSE-MIT +23 -0
- data/crates/itsi_acme/README.md +9 -0
- data/crates/itsi_acme/examples/high_level.rs +63 -0
- data/crates/itsi_acme/examples/high_level_warp.rs +52 -0
- data/crates/itsi_acme/examples/low_level.rs +87 -0
- data/crates/itsi_acme/examples/low_level_axum.rs +66 -0
- data/crates/itsi_acme/src/acceptor.rs +81 -0
- data/crates/itsi_acme/src/acme.rs +354 -0
- data/crates/itsi_acme/src/axum.rs +86 -0
- data/crates/itsi_acme/src/cache.rs +39 -0
- data/crates/itsi_acme/src/caches/boxed.rs +80 -0
- data/crates/itsi_acme/src/caches/composite.rs +69 -0
- data/crates/itsi_acme/src/caches/dir.rs +106 -0
- data/crates/itsi_acme/src/caches/mod.rs +11 -0
- data/crates/itsi_acme/src/caches/no.rs +78 -0
- data/crates/itsi_acme/src/caches/test.rs +136 -0
- data/crates/itsi_acme/src/config.rs +172 -0
- data/crates/itsi_acme/src/https_helper.rs +69 -0
- data/crates/itsi_acme/src/incoming.rs +142 -0
- data/crates/itsi_acme/src/jose.rs +161 -0
- data/crates/itsi_acme/src/lib.rs +142 -0
- data/crates/itsi_acme/src/resolver.rs +59 -0
- data/crates/itsi_acme/src/state.rs +424 -0
- data/crates/itsi_rb_helpers/src/lib.rs +4 -3
- data/crates/itsi_scheduler/Cargo.toml +1 -1
- data/crates/itsi_scheduler/src/itsi_scheduler.rs +8 -2
- data/crates/itsi_scheduler/src/lib.rs +1 -0
- data/crates/itsi_server/Cargo.toml +1 -1
- data/crates/itsi_server/src/lib.rs +2 -1
- data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +18 -1
- data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +11 -3
- data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +122 -63
- data/crates/itsi_server/src/ruby_types/itsi_server.rs +2 -0
- data/crates/itsi_server/src/server/binds/bind.rs +3 -0
- data/crates/itsi_server/src/server/binds/listener.rs +12 -5
- data/crates/itsi_server/src/server/binds/tls.rs +13 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +12 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +8 -1
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +9 -1
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +48 -43
- data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +11 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +39 -12
- data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +36 -27
- data/crates/itsi_server/src/server/middleware_stack/middlewares/csp.rs +25 -11
- data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +12 -3
- data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +74 -72
- data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +15 -1
- data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +11 -8
- data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +19 -11
- data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +5 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +2 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +11 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +17 -20
- data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +19 -8
- data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +16 -37
- data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +22 -12
- data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +26 -11
- data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +7 -1
- data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +14 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +19 -0
- data/crates/itsi_server/src/server/middleware_stack/mod.rs +49 -13
- data/crates/itsi_server/src/server/mod.rs +1 -0
- data/crates/itsi_server/src/server/redirect_type.rs +26 -0
- data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +22 -16
- data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +49 -12
- data/crates/itsi_server/src/server/signal.rs +1 -0
- data/crates/itsi_server/src/server/size_limited_incoming.rs +6 -0
- data/crates/itsi_server/src/server/thread_worker.rs +5 -1
- data/crates/itsi_server/src/services/itsi_http_service.rs +20 -2
- data/crates/itsi_server/src/services/rate_limiter.rs +15 -4
- data/crates/itsi_server/src/services/static_file_server.rs +33 -19
- data/crates/itsi_tracing/src/lib.rs +42 -22
- data/docs/content/_index.md +1 -2
- data/docs/content/acknowledgements/_index.md +5 -2
- data/docs/content/configuration/_index.md +8 -5
- data/docs/content/contact/_index.md +8 -1
- data/docs/content/faqs/_index.md +5 -3
- data/docs/content/features/_index.md +56 -50
- data/docs/content/getting_started/_index.md +8 -5
- data/docs/content/getting_started/local_development.md +68 -8
- data/docs/content/getting_started/logging.md +16 -9
- data/docs/content/getting_started/running_itsi_in_production.md +5 -3
- data/docs/content/getting_started/signals.md +38 -0
- data/docs/content/itsi_scheduler/_index.md +8 -7
- data/docs/content/utilities/_index.md +13 -0
- data/docs/content/utilities/config_file_testing.md +17 -0
- data/docs/content/utilities/passfile_generator.md +41 -0
- data/docs/content/utilities/route_testing.md +27 -0
- data/docs/content/utilities/secrets_management.md +30 -0
- data/docs/hugo.yaml +1 -1
- data/fairytale.txt +3 -4
- data/gems/scheduler/Cargo.lock +1 -1
- data/gems/scheduler/README.md +4 -5
- data/gems/scheduler/Rakefile +0 -4
- data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
- data/gems/scheduler/lib/itsi/scheduler.rb +9 -4
- data/gems/scheduler/test/test_active_record.rb +12 -7
- data/gems/server/Cargo.lock +1 -1
- data/gems/server/Rakefile +0 -4
- data/gems/server/exe/itsi +13 -2
- data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +2 -0
- data/gems/server/lib/itsi/http_request.rb +40 -9
- data/gems/server/lib/itsi/http_response.rb +2 -1
- data/gems/server/lib/itsi/passfile.rb +0 -1
- data/gems/server/lib/itsi/server/config/config_helpers.rb +20 -8
- data/gems/server/lib/itsi/server/config/dsl.rb +20 -435
- data/gems/server/lib/itsi/server/config/known_paths.rb +4 -1
- data/gems/server/lib/itsi/server/config/middleware/_index.md +6 -4
- data/gems/server/lib/itsi/server/config/middleware/allow_list.md +46 -0
- data/gems/server/lib/itsi/server/config/middleware/allow_list.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_basic.md +45 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_basic.rb +44 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
- data/gems/server/lib/itsi/server/config/middleware/cache_control.md +78 -0
- data/gems/server/lib/itsi/server/config/middleware/cache_control.rb +45 -0
- data/gems/server/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
- data/gems/server/lib/itsi/server/config/middleware/compression.md +50 -0
- data/gems/server/lib/itsi/server/config/middleware/compression.rb +37 -0
- data/gems/server/lib/itsi/server/config/middleware/cors.md +93 -0
- data/gems/server/lib/itsi/server/config/middleware/cors.rb +32 -0
- data/gems/server/lib/itsi/server/config/middleware/csp.md +37 -0
- data/gems/server/lib/itsi/server/config/middleware/csp.rb +44 -0
- data/gems/server/lib/itsi/server/config/middleware/deny_list.md +45 -0
- data/gems/server/lib/itsi/server/config/middleware/deny_list.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/_index.md +159 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/endpoint.rb +99 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/get.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/post.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/put.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
- data/gems/server/lib/itsi/server/config/middleware/error_response.md +61 -0
- data/gems/server/lib/itsi/server/config/middleware/error_response.rb +36 -0
- data/gems/server/lib/itsi/server/config/middleware/etag.md +59 -0
- data/gems/server/lib/itsi/server/config/middleware/etag.rb +27 -0
- data/gems/server/lib/itsi/server/config/middleware/grpc.md +172 -0
- data/gems/server/lib/itsi/server/config/middleware/grpc.rb +54 -0
- data/gems/server/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
- data/gems/server/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
- data/gems/server/lib/itsi/server/config/middleware/location.md +107 -0
- data/gems/server/lib/itsi/server/config/middleware/location.rb +99 -0
- data/gems/server/lib/itsi/server/config/middleware/log_requests.md +13 -11
- data/gems/server/lib/itsi/server/config/middleware/log_requests.rb +1 -3
- data/gems/server/lib/itsi/server/config/middleware/max_body.md +18 -0
- data/gems/server/lib/itsi/server/config/middleware/max_body.rb +21 -0
- data/gems/server/lib/itsi/server/config/middleware/proxy.md +62 -0
- data/gems/server/lib/itsi/server/config/middleware/proxy.rb +41 -0
- data/gems/server/lib/itsi/server/config/middleware/rackup_file.md +54 -0
- data/gems/server/lib/itsi/server/config/middleware/rackup_file.rb +44 -0
- data/gems/server/lib/itsi/server/config/middleware/rate_limit.md +126 -0
- data/gems/server/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
- data/gems/server/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
- data/gems/server/lib/itsi/server/config/middleware/redirect.md +55 -0
- data/gems/server/lib/itsi/server/config/middleware/redirect.rb +25 -0
- data/gems/server/lib/itsi/server/config/middleware/request_headers.md +34 -0
- data/gems/server/lib/itsi/server/config/middleware/request_headers.rb +24 -0
- data/gems/server/lib/itsi/server/config/middleware/response_headers.md +33 -0
- data/gems/server/lib/itsi/server/config/middleware/response_headers.rb +25 -0
- data/gems/server/lib/itsi/server/config/middleware/run.md +60 -0
- data/gems/server/lib/itsi/server/config/middleware/run.rb +43 -0
- data/gems/server/lib/itsi/server/config/middleware/static_assets.md +73 -0
- data/gems/server/lib/itsi/server/config/middleware/static_assets.rb +87 -0
- data/gems/server/lib/itsi/server/config/middleware/static_response.md +44 -0
- data/gems/server/lib/itsi/server/config/middleware/static_response.rb +29 -0
- data/gems/server/lib/itsi/server/config/middleware/string_rewrite.md +67 -0
- data/gems/server/lib/itsi/server/config/middleware/token_source.rb +32 -0
- data/gems/server/lib/itsi/server/config/middleware.rb +4 -0
- data/gems/server/lib/itsi/server/config/option.rb +5 -0
- data/gems/server/lib/itsi/server/config/options/_index.md +3 -2
- data/gems/server/lib/itsi/server/config/options/auto_reload_config.md +13 -0
- data/gems/server/lib/itsi/server/config/options/auto_reload_config.rb +41 -0
- data/gems/server/lib/itsi/server/config/options/bind.md +71 -0
- data/gems/server/lib/itsi/server/config/options/bind.rb +26 -0
- data/gems/server/lib/itsi/server/config/options/certificates.md +65 -0
- data/gems/server/lib/itsi/server/config/options/daemonize.md +14 -0
- data/gems/server/lib/itsi/server/config/options/daemonize.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/fiber_scheduler.md +1 -2
- data/gems/server/lib/itsi/server/config/options/fiber_scheduler.rb +6 -3
- data/gems/server/lib/itsi/server/config/options/header_read_timeout.md +17 -0
- data/gems/server/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/hooks/_index.md +11 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_start.md +12 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/include.md +20 -0
- data/gems/server/lib/itsi/server/config/options/include.rb +36 -0
- data/gems/server/lib/itsi/server/config/options/listen_backlog.md +11 -0
- data/gems/server/lib/itsi/server/config/options/listen_backlog.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/log_format.md +18 -0
- data/gems/server/lib/itsi/server/config/options/log_format.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/log_level.md +34 -0
- data/gems/server/lib/itsi/server/config/options/log_level.rb +20 -0
- data/gems/server/lib/itsi/server/config/options/log_target.md +38 -0
- data/gems/server/lib/itsi/server/config/options/log_target.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/log_target_filters.md +17 -0
- data/gems/server/lib/itsi/server/config/options/log_target_filters.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
- data/gems/server/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
- data/gems/server/lib/itsi/server/config/options/nodelay.md +16 -0
- data/gems/server/lib/itsi/server/config/options/nodelay.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
- data/gems/server/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
- data/gems/server/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
- data/gems/server/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/preload.md +21 -0
- data/gems/server/lib/itsi/server/config/options/preload.rb +18 -0
- data/gems/server/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
- data/gems/server/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
- data/gems/server/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
- data/gems/server/lib/itsi/server/config/options/request_timeout.md +23 -0
- data/gems/server/lib/itsi/server/config/options/request_timeout.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/reuse_address.md +16 -0
- data/gems/server/lib/itsi/server/config/options/reuse_address.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/reuse_port.md +16 -0
- data/gems/server/lib/itsi/server/config/options/reuse_port.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/scheduler_threads.md +34 -0
- data/gems/server/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
- data/gems/server/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
- data/gems/server/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/stream_body.md +32 -0
- data/gems/server/lib/itsi/server/config/options/stream_body.rb +18 -0
- data/gems/server/lib/itsi/server/config/options/threads.md +7 -2
- data/gems/server/lib/itsi/server/config/options/threads.rb +1 -1
- data/gems/server/lib/itsi/server/config/options/watch.md +16 -0
- data/gems/server/lib/itsi/server/config/options/watch.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
- data/gems/server/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
- data/gems/server/lib/itsi/server/config/options/workers.md +1 -2
- data/gems/server/lib/itsi/server/config/options/workers.rb +1 -1
- data/gems/server/lib/itsi/server/config/typed_struct.rb +59 -20
- data/gems/server/lib/itsi/server/config.rb +77 -48
- data/gems/server/lib/itsi/server/default_config/Itsi.rb +3 -3
- data/gems/server/lib/itsi/server/grpc/grpc_call.rb +1 -1
- data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +11 -4
- data/gems/server/lib/itsi/server/rack/handler/itsi.rb +3 -3
- data/gems/server/lib/itsi/server/route_tester.rb +58 -8
- data/gems/server/lib/itsi/server/signal_trap.rb +1 -1
- data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +14 -18
- data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +5 -4
- data/gems/server/lib/itsi/server/typed_handlers.rb +12 -4
- data/gems/server/lib/itsi/server/version.rb +1 -1
- data/gems/server/lib/itsi/server.rb +98 -14
- data/gems/server/lib/ruby_lsp/itsi/addon.rb +20 -18
- data/gems/server/test/helpers/test_helper.rb +89 -29
- data/gems/server/test/middleware/allow_list.rb +128 -0
- data/gems/server/test/middleware/auth_api_key.rb +141 -0
- data/gems/server/test/middleware/auth_basic.rb +91 -0
- data/gems/server/test/middleware/auth_jwt.rb +214 -0
- data/gems/server/test/middleware/cache_control.rb +82 -0
- data/gems/server/test/middleware/cidr_to_regex.rb +46 -0
- data/gems/server/test/middleware/compression.rb +89 -0
- data/gems/server/test/middleware/cors.rb +113 -0
- data/gems/server/test/middleware/csp.rb +62 -0
- data/gems/server/test/middleware/deny_list.rb +131 -0
- data/gems/server/test/middleware/endpoint.rb +300 -0
- data/gems/server/test/middleware/etag.rb +75 -0
- data/gems/server/test/middleware/grpc/grpc.rb +158 -0
- data/gems/server/test/middleware/grpc/test_service.proto +32 -0
- data/gems/server/test/middleware/grpc/test_service_impl.rb +28 -0
- data/gems/server/test/middleware/grpc/test_service_pb.rb +18 -0
- data/gems/server/test/middleware/grpc/test_service_services_pb.rb +30 -0
- data/gems/server/test/middleware/header_interpolation.rb +35 -0
- data/gems/server/test/middleware/intrusion_protection.rb +259 -0
- data/gems/server/test/middleware/location.rb +220 -0
- data/gems/server/test/middleware/max_body.rb +20 -0
- data/gems/server/test/middleware/proxy.rb +415 -0
- data/gems/server/test/middleware/rate_limit.rb +211 -0
- data/gems/server/test/middleware/redirect.rb +85 -0
- data/gems/server/test/middleware/request_headers.rb +50 -0
- data/gems/server/test/middleware/response_headers.rb +50 -0
- data/gems/server/test/middleware/static_assets.rb +374 -0
- data/gems/server/test/middleware/static_response.rb +56 -0
- data/gems/server/test/middleware/string_rewrite.rb +112 -0
- data/gems/server/test/options/bind.rb +47 -0
- data/gems/server/test/options/header_read_timeout.rb +23 -0
- data/gems/server/test/options/test_request_timeout.rb +16 -0
- data/gems/server/test/options/test_workers.rb +2 -4
- data/gems/server/test/{test_itsi_server.rb → rack/test_rack_server.rb} +2 -2
- data/grpc_test/Itsi.rb +11 -0
- data/grpc_test/echo.proto +14 -0
- data/grpc_test/echo_pb.rb +16 -0
- data/grpc_test/echo_service_impl.rb +8 -0
- data/grpc_test/echo_services_pb.rb +22 -0
- data/lib/itsi/version.rb +1 -1
- data/tasks.txt +15 -72
- metadata +210 -7
- 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
|
-
|
9
|
-
|
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
|
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
|
-
|
23
|
-
Concerned about errors? Itsi will validate your config first before it tries to apply it. If there are errors, Itsi will provide
|
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
|
-
|
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
|
-
|
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
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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: /
|
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
|
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
|
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
|
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
|
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! (
|
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
|
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
|
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
|
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
|
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.
|
data/gems/scheduler/Cargo.lock
CHANGED
data/gems/scheduler/README.md
CHANGED
@@ -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
|
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
|
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
|
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
|
31
|
+
To install and use Itsi Scheduler follow the instructions below:
|
33
32
|
|
34
33
|
|
35
34
|
### 1 - Install Itsi Scheduler
|
data/gems/scheduler/Rakefile
CHANGED
@@ -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
|
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
|
-
|
134
|
-
|
135
|
-
|
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:
|
14
|
-
|
15
|
-
|
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:
|
81
|
-
host: "localhost",
|
82
|
-
database: "fiber_scheduler_test",
|
83
|
-
|
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!
|
data/gems/server/Cargo.lock
CHANGED
data/gems/server/Rakefile
CHANGED
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
|