itsi 0.1.14 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Cargo.lock +126 -272
- data/Cargo.toml +6 -0
- data/crates/itsi_error/Cargo.toml +1 -0
- data/crates/itsi_error/src/lib.rs +100 -10
- data/crates/itsi_scheduler/src/itsi_scheduler.rs +1 -1
- data/crates/itsi_server/Cargo.toml +12 -11
- data/crates/itsi_server/src/default_responses/html/401.html +68 -0
- data/crates/itsi_server/src/default_responses/html/403.html +68 -0
- data/crates/itsi_server/src/default_responses/html/404.html +68 -0
- data/crates/itsi_server/src/default_responses/html/413.html +71 -0
- data/crates/itsi_server/src/default_responses/html/429.html +68 -0
- data/crates/itsi_server/src/default_responses/html/500.html +71 -0
- data/crates/itsi_server/src/default_responses/html/502.html +71 -0
- data/crates/itsi_server/src/default_responses/html/503.html +68 -0
- data/crates/itsi_server/src/default_responses/html/504.html +69 -0
- data/crates/itsi_server/src/default_responses/html/index.html +238 -0
- data/crates/itsi_server/src/default_responses/json/401.json +6 -0
- data/crates/itsi_server/src/default_responses/json/403.json +6 -0
- data/crates/itsi_server/src/default_responses/json/404.json +6 -0
- data/crates/itsi_server/src/default_responses/json/413.json +6 -0
- data/crates/itsi_server/src/default_responses/json/429.json +6 -0
- data/crates/itsi_server/src/default_responses/json/500.json +6 -0
- data/crates/itsi_server/src/default_responses/json/502.json +6 -0
- data/crates/itsi_server/src/default_responses/json/503.json +6 -0
- data/crates/itsi_server/src/default_responses/json/504.json +6 -0
- data/crates/itsi_server/src/default_responses/mod.rs +11 -0
- data/crates/itsi_server/src/lib.rs +58 -26
- data/crates/itsi_server/src/prelude.rs +2 -0
- data/crates/itsi_server/src/ruby_types/README.md +21 -0
- data/crates/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +8 -6
- data/crates/itsi_server/src/ruby_types/itsi_grpc_call.rs +344 -0
- data/crates/itsi_server/src/ruby_types/{itsi_grpc_stream → itsi_grpc_response_stream}/mod.rs +121 -73
- data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +103 -40
- data/crates/itsi_server/src/ruby_types/itsi_http_response.rs +8 -5
- data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +4 -4
- data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +37 -17
- data/crates/itsi_server/src/ruby_types/itsi_server.rs +4 -3
- data/crates/itsi_server/src/ruby_types/mod.rs +6 -13
- data/crates/itsi_server/src/server/{bind.rs → binds/bind.rs} +23 -4
- data/crates/itsi_server/src/server/{listener.rs → binds/listener.rs} +24 -10
- data/crates/itsi_server/src/server/binds/mod.rs +4 -0
- data/crates/itsi_server/src/server/{tls.rs → binds/tls.rs} +9 -4
- data/crates/itsi_server/src/server/http_message_types.rs +97 -0
- data/crates/itsi_server/src/server/io_stream.rs +2 -1
- data/crates/itsi_server/src/server/middleware_stack/middleware.rs +28 -16
- data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +17 -8
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +47 -18
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +13 -9
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +50 -29
- data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +5 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +37 -48
- data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +25 -20
- data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +14 -7
- data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +190 -0
- data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +125 -95
- data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +9 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +1 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +25 -19
- data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +4 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +47 -0
- data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +9 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +260 -62
- data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +29 -22
- data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +6 -6
- data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +6 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +4 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +51 -18
- data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +31 -13
- data/crates/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +55 -0
- data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +13 -8
- data/crates/itsi_server/src/server/middleware_stack/mod.rs +101 -69
- data/crates/itsi_server/src/server/mod.rs +3 -9
- data/crates/itsi_server/src/server/process_worker.rs +21 -3
- data/crates/itsi_server/src/server/request_job.rs +2 -2
- data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +8 -3
- data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +26 -26
- data/crates/itsi_server/src/server/signal.rs +24 -41
- data/crates/itsi_server/src/server/size_limited_incoming.rs +101 -0
- data/crates/itsi_server/src/server/thread_worker.rs +59 -28
- data/crates/itsi_server/src/services/itsi_http_service.rs +239 -0
- data/crates/itsi_server/src/services/mime_types.rs +1416 -0
- data/crates/itsi_server/src/services/mod.rs +6 -0
- data/crates/itsi_server/src/services/password_hasher.rs +83 -0
- data/crates/itsi_server/src/{server → services}/rate_limiter.rs +35 -31
- data/crates/itsi_server/src/{server → services}/static_file_server.rs +521 -181
- data/crates/itsi_tracing/src/lib.rs +145 -55
- data/{Itsi.rb → foo/Itsi.rb} +6 -9
- data/gems/scheduler/Cargo.lock +7 -0
- data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
- data/gems/scheduler/test/helpers/test_helper.rb +0 -1
- data/gems/scheduler/test/test_address_resolve.rb +0 -1
- data/gems/scheduler/test/test_network_io.rb +1 -1
- data/gems/scheduler/test/test_process_wait.rb +0 -1
- data/gems/server/Cargo.lock +126 -272
- data/gems/server/exe/itsi +65 -19
- data/gems/server/itsi-server.gemspec +4 -3
- data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +74 -0
- data/gems/server/lib/itsi/http_request.rb +117 -17
- data/gems/server/lib/itsi/http_response.rb +2 -0
- data/gems/server/lib/itsi/passfile.rb +109 -0
- data/gems/server/lib/itsi/server/config/dsl.rb +171 -99
- data/gems/server/lib/itsi/server/config.rb +58 -23
- data/gems/server/lib/itsi/server/default_app/default_app.rb +25 -29
- data/gems/server/lib/itsi/server/default_app/index.html +113 -89
- data/gems/server/lib/itsi/server/{Itsi.rb → default_config/Itsi-rackup.rb} +1 -1
- data/gems/server/lib/itsi/server/default_config/Itsi.rb +107 -0
- data/gems/server/lib/itsi/server/grpc/grpc_call.rb +246 -0
- data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +100 -0
- data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_pb.rb +26 -0
- data/gems/server/lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb +122 -0
- data/gems/server/lib/itsi/server/route_tester.rb +107 -0
- data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +200 -0
- data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +55 -0
- data/gems/server/lib/itsi/server/typed_handlers.rb +17 -0
- data/gems/server/lib/itsi/server/version.rb +1 -1
- data/gems/server/lib/itsi/server.rb +82 -12
- data/gems/server/lib/ruby_lsp/itsi/addon.rb +111 -0
- data/gems/server/lib/shell_completions/completions.rb +26 -0
- data/gems/server/test/helpers/test_helper.rb +2 -1
- data/lib/itsi/version.rb +1 -1
- data/sandbox/README.md +5 -0
- data/sandbox/itsi_file/Gemfile +4 -2
- data/sandbox/itsi_file/Gemfile.lock +48 -6
- data/sandbox/itsi_file/Itsi.rb +327 -129
- data/sandbox/itsi_file/call.json +1 -0
- data/sandbox/itsi_file/echo_client/Gemfile +10 -0
- data/sandbox/itsi_file/echo_client/Gemfile.lock +27 -0
- data/sandbox/itsi_file/echo_client/README.md +95 -0
- data/sandbox/itsi_file/echo_client/echo_client.rb +164 -0
- data/sandbox/itsi_file/echo_client/gen_proto.sh +17 -0
- data/sandbox/itsi_file/echo_client/lib/echo_pb.rb +16 -0
- data/sandbox/itsi_file/echo_client/lib/echo_services_pb.rb +29 -0
- data/sandbox/itsi_file/echo_client/run_client.rb +64 -0
- data/sandbox/itsi_file/echo_client/test_compressions.sh +20 -0
- data/sandbox/itsi_file/echo_service_nonitsi/Gemfile +10 -0
- data/sandbox/itsi_file/echo_service_nonitsi/Gemfile.lock +79 -0
- data/sandbox/itsi_file/echo_service_nonitsi/echo.proto +26 -0
- data/sandbox/itsi_file/echo_service_nonitsi/echo_pb.rb +16 -0
- data/sandbox/itsi_file/echo_service_nonitsi/echo_services_pb.rb +29 -0
- data/sandbox/itsi_file/echo_service_nonitsi/server.rb +52 -0
- data/sandbox/itsi_sandbox_async/config.ru +0 -1
- data/sandbox/itsi_sandbox_rack/Gemfile.lock +2 -2
- data/sandbox/itsi_sandbox_rails/Gemfile +2 -2
- data/sandbox/itsi_sandbox_rails/Gemfile.lock +76 -2
- data/sandbox/itsi_sandbox_rails/app/controllers/home_controller.rb +15 -0
- data/sandbox/itsi_sandbox_rails/config/environments/development.rb +1 -0
- data/sandbox/itsi_sandbox_rails/config/environments/production.rb +1 -0
- data/sandbox/itsi_sandbox_rails/config/routes.rb +2 -0
- data/sandbox/itsi_sinatra/app.rb +0 -1
- data/sandbox/static_files/.env +1 -0
- data/sandbox/static_files/404.html +25 -0
- data/sandbox/static_files/_DSC0102.NEF.jpg +0 -0
- data/sandbox/static_files/about.html +68 -0
- data/sandbox/static_files/tiny.html +1 -0
- data/sandbox/static_files/writebook.zip +0 -0
- data/tasks.txt +28 -33
- metadata +87 -26
- data/crates/itsi_error/src/from.rs +0 -68
- data/crates/itsi_server/src/ruby_types/itsi_grpc_request.rs +0 -147
- data/crates/itsi_server/src/ruby_types/itsi_grpc_response.rs +0 -19
- data/crates/itsi_server/src/server/itsi_service.rs +0 -172
- data/crates/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs +0 -72
- data/crates/itsi_server/src/server/types.rs +0 -43
- data/gems/server/lib/itsi/server/grpc_interface.rb +0 -213
- data/sandbox/itsi_file/public/assets/index.html +0 -1
- /data/crates/itsi_server/src/server/{bind_protocol.rs → binds/bind_protocol.rs} +0 -0
- /data/crates/itsi_server/src/server/{tls → binds/tls}/locked_dir_cache.rs +0 -0
- /data/crates/itsi_server/src/{server → services}/cache_store.rs +0 -0
@@ -3,45 +3,62 @@
|
|
3
3
|
require_relative "server/version"
|
4
4
|
require_relative "server/itsi_server"
|
5
5
|
require_relative "server/rack_interface"
|
6
|
-
require_relative "server/grpc_interface"
|
6
|
+
require_relative "server/grpc/grpc_interface"
|
7
|
+
require_relative "server/grpc/grpc_call"
|
7
8
|
require_relative "server/scheduler_interface"
|
8
9
|
require_relative "server/signal_trap"
|
10
|
+
require_relative "server/route_tester"
|
9
11
|
require_relative "server/rack/handler/itsi"
|
10
12
|
require_relative "server/config"
|
13
|
+
require_relative "server/typed_handlers"
|
11
14
|
require_relative "standard_headers"
|
12
15
|
require_relative "http_request"
|
13
16
|
require_relative "http_response"
|
17
|
+
require_relative "passfile"
|
18
|
+
require_relative "../shell_completions/completions"
|
14
19
|
|
15
20
|
module Itsi
|
16
21
|
class Server
|
17
22
|
extend RackInterface
|
18
23
|
extend SchedulerInterface
|
24
|
+
extend RouteTester
|
19
25
|
|
20
26
|
class << self
|
27
|
+
|
21
28
|
def running?
|
22
29
|
!!@running
|
23
30
|
end
|
24
31
|
|
25
|
-
def start_in_background_thread(cli_params={},
|
26
|
-
@background_thread = start(cli_params,
|
32
|
+
def start_in_background_thread(cli_params = {}, &blk)
|
33
|
+
@background_thread = start(cli_params, background: true, &blk)
|
27
34
|
end
|
28
35
|
|
29
|
-
def start(cli_params,
|
36
|
+
def start(cli_params, background: false, &blk)
|
37
|
+
itsi_file = Itsi::Server::Config.config_file_path(cli_params[:config_file])
|
30
38
|
server = new(cli_params, itsi_file, blk)
|
31
39
|
previous_handler = Signal.trap(:INT, :DEFAULT)
|
32
40
|
run = lambda do
|
33
41
|
write_pid
|
34
42
|
@running = server
|
35
43
|
server.start
|
44
|
+
@running = false
|
36
45
|
Signal.trap(:INT, previous_handler)
|
37
46
|
server
|
38
47
|
end
|
39
48
|
background ? Thread.new(&run) : run[]
|
40
49
|
end
|
41
50
|
|
51
|
+
def static(cli_params)
|
52
|
+
start(cli_params.merge(static: true))
|
53
|
+
end
|
54
|
+
|
55
|
+
def stop
|
56
|
+
return unless pid = get_pid
|
57
|
+
Process.kill(:INT, pid)
|
58
|
+
end
|
59
|
+
|
42
60
|
def stop_background_thread
|
43
61
|
@running&.stop
|
44
|
-
@running = nil
|
45
62
|
@background_thread&.join
|
46
63
|
end
|
47
64
|
|
@@ -54,16 +71,22 @@ module Itsi
|
|
54
71
|
if Process.kill(0, pid)
|
55
72
|
pid
|
56
73
|
else
|
74
|
+
puts "No server running"
|
57
75
|
nil
|
58
76
|
end
|
59
77
|
rescue StandardError
|
78
|
+
puts "No server running"
|
60
79
|
nil
|
61
80
|
end
|
62
81
|
|
82
|
+
def init
|
83
|
+
Config.write_default
|
84
|
+
end
|
85
|
+
|
63
86
|
def reload
|
64
87
|
return unless pid = get_pid
|
65
88
|
|
66
|
-
Process.kill(:
|
89
|
+
Process.kill(:HUP, pid)
|
67
90
|
end
|
68
91
|
|
69
92
|
def restart
|
@@ -72,12 +95,29 @@ module Itsi
|
|
72
95
|
Process.kill(:USR1, pid)
|
73
96
|
end
|
74
97
|
|
75
|
-
def
|
76
|
-
|
77
|
-
|
98
|
+
def passfile(options, subcmd)
|
99
|
+
filename = options[:passfile]
|
100
|
+
unless filename
|
101
|
+
puts "Error: passfile not set. Use --passfile option to provide a path to a file containing hashed credentials."
|
102
|
+
puts "This file contains hashed credentials and should not be included in source control without additional protection."
|
103
|
+
exit(1)
|
104
|
+
end
|
105
|
+
algorithm = options.fetch(:algorithm, 'sha256')
|
78
106
|
|
79
|
-
|
80
|
-
|
107
|
+
unless %w[sha256 sha512 bcrypt argon2 none].include?(algorithm)
|
108
|
+
puts "Invalid algorithm"
|
109
|
+
exit(1)
|
110
|
+
end
|
111
|
+
|
112
|
+
case subcmd
|
113
|
+
when 'add', 'echo'
|
114
|
+
Passfile.send(subcmd, filename, algorithm)
|
115
|
+
when 'remove', 'list'
|
116
|
+
Passfile.send(subcmd, filename)
|
117
|
+
else
|
118
|
+
puts "Valid subcommands are: add | remove | list"
|
119
|
+
exit(0)
|
120
|
+
end
|
81
121
|
end
|
82
122
|
|
83
123
|
def add_worker
|
@@ -95,8 +135,38 @@ module Itsi
|
|
95
135
|
def status
|
96
136
|
return unless pid = get_pid
|
97
137
|
|
98
|
-
Process.kill(:
|
138
|
+
Process.kill(:USR2, pid)
|
139
|
+
end
|
140
|
+
|
141
|
+
def load_route_middleware_stack(cli_params)
|
142
|
+
Config.build_config(cli_params, Itsi::Server::Config.config_file_path(cli_params[:config_file_path]))[
|
143
|
+
"middleware_loader"
|
144
|
+
][]
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_route(cli_params = {}, route_str)
|
148
|
+
matched_route = load_route_middleware_stack(cli_params).find do |route|
|
149
|
+
route["route"] =~ route_str
|
150
|
+
end
|
151
|
+
if matched_route
|
152
|
+
print_route(route_str, matched_route)
|
153
|
+
else
|
154
|
+
puts "No matching route found"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def routes(cli_params = {})
|
159
|
+
load_route_middleware_stack(cli_params).each do |stack|
|
160
|
+
routes = explode_route_pattern(stack["route"].source)
|
161
|
+
routes.each do |route|
|
162
|
+
print_route(route, stack)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
puts "─" * 76
|
99
166
|
end
|
167
|
+
|
168
|
+
alias serve start
|
169
|
+
|
100
170
|
end
|
101
171
|
end
|
102
172
|
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "ruby_lsp/addon"
|
4
|
+
puts "Here we go"
|
5
|
+
module RubyLsp
|
6
|
+
module Itsi
|
7
|
+
class Addon < ::RubyLsp::Addon
|
8
|
+
|
9
|
+
def name
|
10
|
+
"Ruby LSP Itsi"
|
11
|
+
end
|
12
|
+
|
13
|
+
def version
|
14
|
+
"0.1.0"
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_completion_listener(response_builder, node_context, dispatcher, uri)
|
18
|
+
return unless uri.to_s.end_with?("Itsi.rb")
|
19
|
+
@in_itsi_file = true
|
20
|
+
CompletionListener.new(response_builder, node_context, dispatcher, uri)
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_hover_listener(response_builder, node_context, dispatcher)
|
24
|
+
hl = dispatcher.listeners[:on_call_node_enter].find{|c| c.kind_of?(RubyLsp::Listeners::Hover)}
|
25
|
+
|
26
|
+
return unless hl.instance_variable_get("@path").to_s.end_with?("Itsi.rb")
|
27
|
+
HoverListener.new(response_builder, node_context, dispatcher)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class HoverListener
|
32
|
+
def initialize(response_builder, node_context, dispatcher)
|
33
|
+
@response_builder = response_builder
|
34
|
+
@node_context = node_context
|
35
|
+
@dispatcher = dispatcher
|
36
|
+
|
37
|
+
# Register for call nodes (you could also use other events if more appropriate)
|
38
|
+
dispatcher.register(self, :on_call_node_enter)
|
39
|
+
end
|
40
|
+
|
41
|
+
def on_call_node_enter(node)
|
42
|
+
# Check if this is the call for foo_bar; you might add additional logic if needed.
|
43
|
+
case node.message
|
44
|
+
when "log_level"
|
45
|
+
# Push a simple hover response.
|
46
|
+
@response_builder.push(
|
47
|
+
"Method **log_level**: A method that takes a single parameter `a`.",
|
48
|
+
category: :documentation
|
49
|
+
)
|
50
|
+
when "shutdown_timeout"
|
51
|
+
# Push a simple hover response.
|
52
|
+
@response_builder.push(
|
53
|
+
"Method **shutdown_timeout**: Number of seconds to wait for a graceful shutdown before forcefully shutting down.",
|
54
|
+
category: :documentation
|
55
|
+
)
|
56
|
+
when "log"
|
57
|
+
# Push a simple hover response.
|
58
|
+
@response_builder.push(
|
59
|
+
"Method **log**: A method that takes a single parameter `a`.",
|
60
|
+
category: :documentation
|
61
|
+
)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class CompletionListener
|
67
|
+
def initialize(response_builder, node_context, dispatcher, uri)
|
68
|
+
@response_builder = response_builder
|
69
|
+
@node_context = node_context
|
70
|
+
@uri = uri
|
71
|
+
@dispatcher = dispatcher
|
72
|
+
|
73
|
+
# Register for call nodes to handle method completions
|
74
|
+
dispatcher.register(self, :on_call_node_enter)
|
75
|
+
end
|
76
|
+
|
77
|
+
def on_call_node_enter(node)
|
78
|
+
# Only handle method calls that are being typed (no arguments yet)
|
79
|
+
return unless node.arguments.nil?
|
80
|
+
puts "Adding log level completion"
|
81
|
+
# Add our completion item
|
82
|
+
@response_builder << Interface::CompletionItem.new(
|
83
|
+
label: "log_level",
|
84
|
+
kind: Constant::CompletionItemKind::METHOD,
|
85
|
+
detail: "log_level a ",
|
86
|
+
documentation: "A method that takes a single parameter 'a'",
|
87
|
+
insert_text: "log_level ${1|:info,:debug,:warn,:error|}",
|
88
|
+
insert_text_format: Constant::InsertTextFormat::SNIPPET,
|
89
|
+
)
|
90
|
+
|
91
|
+
@response_builder << Interface::CompletionItem.new(
|
92
|
+
label: "bind",
|
93
|
+
kind: Constant::CompletionItemKind::METHOD,
|
94
|
+
detail: "Bind to an interface",
|
95
|
+
documentation: "A method that takes a single parameter 'a'",
|
96
|
+
insert_text: "bind ${1|'https://0.0.0.0','http://0.0.0.0','http://0.0.0.0:3000','https://0.0.0.0:3000','http://127.0.0.1','https://127.0.0.1'|}",
|
97
|
+
insert_text_format: Constant::InsertTextFormat::SNIPPET,
|
98
|
+
)
|
99
|
+
|
100
|
+
@response_builder << Interface::CompletionItem.new(
|
101
|
+
label: "log_format",
|
102
|
+
kind: Constant::CompletionItemKind::METHOD,
|
103
|
+
detail: "log_format",
|
104
|
+
documentation: "A method that takes a single parameter 'a'",
|
105
|
+
insert_text: "log_format ${1|:plain,:json,:auto|}",
|
106
|
+
insert_text_format: Constant::InsertTextFormat::SNIPPET,
|
107
|
+
)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
if ARGV.include?('--install-completions')
|
4
|
+
# Try to get the next argument as the shell name.
|
5
|
+
shell = ARGV[ARGV.index('--install-completions') + 1] rescue nil
|
6
|
+
# Fallback: use the basename of the SHELL environment variable
|
7
|
+
shell ||= File.basename(ENV['SHELL'] || '')
|
8
|
+
|
9
|
+
case shell.downcase
|
10
|
+
when 'bash'
|
11
|
+
# Bash completion script
|
12
|
+
puts 'complete -W "$(itsi --completion)" itsi'
|
13
|
+
when 'zsh'
|
14
|
+
puts <<~ZSH
|
15
|
+
_itsi() {
|
16
|
+
local completions
|
17
|
+
completions=("${(@f)$(itsi --completion)}")
|
18
|
+
compadd -- $completions
|
19
|
+
}
|
20
|
+
compdef _itsi itsi
|
21
|
+
ZSH
|
22
|
+
else
|
23
|
+
warn "Unsupported shell: #{shell}. Please specify 'bash' or 'zsh'."
|
24
|
+
end
|
25
|
+
exit
|
26
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
ENV["ITSI_LOG"] = "off"
|
2
3
|
|
3
4
|
require "minitest/reporters"
|
4
5
|
require "itsi/server"
|
@@ -20,7 +21,7 @@ def run_app(app, protocol: "http", bind: free_bind(protocol), scheduler_class: n
|
|
20
21
|
workers 1
|
21
22
|
threads 1
|
22
23
|
fiber_scheduler scheduler_class
|
23
|
-
log_level :
|
24
|
+
log_level :warn
|
24
25
|
run app
|
25
26
|
end
|
26
27
|
|
data/lib/itsi/version.rb
CHANGED
data/sandbox/README.md
ADDED
data/sandbox/itsi_file/Gemfile
CHANGED
@@ -1,19 +1,21 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../../gems/scheduler
|
3
3
|
specs:
|
4
|
-
itsi-scheduler (0.1.
|
4
|
+
itsi-scheduler (0.1.18)
|
5
5
|
rb_sys (~> 0.9.91)
|
6
6
|
|
7
7
|
PATH
|
8
8
|
remote: ../../gems/server
|
9
9
|
specs:
|
10
|
-
itsi-server (0.1.
|
10
|
+
itsi-server (0.1.18)
|
11
|
+
json (~> 2)
|
11
12
|
rack (>= 1.6)
|
12
13
|
rb_sys (~> 0.9.91)
|
13
14
|
|
14
15
|
GEM
|
15
16
|
remote: https://rubygems.org/
|
16
17
|
specs:
|
18
|
+
ast (2.4.3)
|
17
19
|
bigdecimal (3.1.9)
|
18
20
|
date (3.4.1)
|
19
21
|
debug (1.10.0)
|
@@ -34,26 +36,64 @@ GEM
|
|
34
36
|
google-protobuf (>= 3.25, < 5.0)
|
35
37
|
googleapis-common-protos-types (~> 1.0)
|
36
38
|
io-console (0.8.0)
|
37
|
-
irb (1.15.
|
39
|
+
irb (1.15.2)
|
38
40
|
pp (>= 0.6.0)
|
39
41
|
rdoc (>= 4.0.0)
|
40
42
|
reline (>= 0.4.2)
|
43
|
+
json (2.10.2)
|
44
|
+
language_server-protocol (3.17.0.4)
|
45
|
+
lint_roller (1.1.0)
|
46
|
+
logger (1.7.0)
|
47
|
+
parallel (1.26.3)
|
48
|
+
parser (3.3.7.4)
|
49
|
+
ast (~> 2.4.1)
|
50
|
+
racc
|
41
51
|
pp (0.6.2)
|
42
52
|
prettyprint
|
43
53
|
prettyprint (0.2.0)
|
54
|
+
prism (1.4.0)
|
44
55
|
psych (5.2.3)
|
45
56
|
date
|
46
57
|
stringio
|
58
|
+
racc (1.8.1)
|
47
59
|
rack (3.1.12)
|
60
|
+
rainbow (3.1.1)
|
48
61
|
rake (13.2.1)
|
49
62
|
rake-compiler-dock (1.9.1)
|
50
63
|
rb_sys (0.9.111)
|
51
64
|
rake-compiler-dock (= 1.9.1)
|
52
|
-
|
65
|
+
rbs (3.9.2)
|
66
|
+
logger
|
67
|
+
rdoc (6.13.1)
|
53
68
|
psych (>= 4.0.0)
|
54
|
-
|
69
|
+
regexp_parser (2.10.0)
|
70
|
+
reline (0.6.1)
|
55
71
|
io-console (~> 0.5)
|
56
|
-
|
72
|
+
rubocop (1.75.1)
|
73
|
+
json (~> 2.3)
|
74
|
+
language_server-protocol (~> 3.17.0.2)
|
75
|
+
lint_roller (~> 1.1.0)
|
76
|
+
parallel (~> 1.10)
|
77
|
+
parser (>= 3.3.0.2)
|
78
|
+
rainbow (>= 2.2.2, < 4.0)
|
79
|
+
regexp_parser (>= 2.9.3, < 3.0)
|
80
|
+
rubocop-ast (>= 1.43.0, < 2.0)
|
81
|
+
ruby-progressbar (~> 1.7)
|
82
|
+
unicode-display_width (>= 2.4.0, < 4.0)
|
83
|
+
rubocop-ast (1.43.0)
|
84
|
+
parser (>= 3.3.7.2)
|
85
|
+
prism (~> 1.4)
|
86
|
+
ruby-lsp (0.23.13)
|
87
|
+
language_server-protocol (~> 3.17.0)
|
88
|
+
prism (>= 1.2, < 2.0)
|
89
|
+
rbs (>= 3, < 4)
|
90
|
+
sorbet-runtime (>= 0.5.10782)
|
91
|
+
ruby-progressbar (1.13.0)
|
92
|
+
sorbet-runtime (0.5.11971)
|
93
|
+
stringio (3.1.6)
|
94
|
+
unicode-display_width (3.1.4)
|
95
|
+
unicode-emoji (~> 4.0, >= 4.0.4)
|
96
|
+
unicode-emoji (4.0.4)
|
57
97
|
|
58
98
|
PLATFORMS
|
59
99
|
arm64-darwin-23
|
@@ -64,6 +104,8 @@ DEPENDENCIES
|
|
64
104
|
grpc
|
65
105
|
itsi-scheduler!
|
66
106
|
itsi-server!
|
107
|
+
rubocop
|
108
|
+
ruby-lsp
|
67
109
|
|
68
110
|
BUNDLED WITH
|
69
111
|
2.6.3
|