zapp 0.1.0 → 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/.rubocop.yml +5 -0
- data/Gemfile.lock +5 -3
- data/bin/zapp +1 -2
- data/examples/config/app.rb +5 -0
- data/examples/config/puma.rb +10 -0
- data/examples/config/zapp.rb +13 -0
- data/lib/rack/handler/{zap.rb → zapp.rb} +4 -3
- data/lib/zapp/cli.rb +5 -0
- data/lib/zapp/configuration.rb +10 -2
- data/lib/zapp/http_context/context.rb +10 -11
- data/lib/zapp/http_context/request.rb +10 -6
- data/lib/zapp/http_context/response.rb +10 -5
- data/lib/zapp/logger/base.rb +103 -0
- data/lib/zapp/logger.rb +21 -47
- data/lib/zapp/pipe.rb +14 -0
- data/lib/zapp/server.rb +38 -16
- data/lib/zapp/socket_pipe/receiver.rb +24 -0
- data/lib/zapp/socket_pipe/sender.rb +17 -0
- data/lib/zapp/version.rb +1 -1
- data/lib/zapp/worker/request_processor.rb +109 -0
- data/lib/zapp/worker.rb +18 -69
- data/lib/zapp/worker_pool.rb +17 -18
- data/lib/zapp.rb +18 -11
- data/zapp.gemspec +2 -0
- metadata +26 -100
- data/bin/console +0 -15
- data/bin/setup +0 -8
- data/examples/rails-app/.browserslistrc +0 -1
- data/examples/rails-app/.gitattributes +0 -10
- data/examples/rails-app/.gitignore +0 -40
- data/examples/rails-app/.ruby-version +0 -1
- data/examples/rails-app/Gemfile +0 -58
- data/examples/rails-app/Gemfile.lock +0 -253
- data/examples/rails-app/Rakefile +0 -8
- data/examples/rails-app/app/assets/config/manifest.js +0 -2
- data/examples/rails-app/app/assets/images/.keep +0 -0
- data/examples/rails-app/app/assets/stylesheets/application.css +0 -15
- data/examples/rails-app/app/channels/application_cable/channel.rb +0 -6
- data/examples/rails-app/app/channels/application_cable/connection.rb +0 -6
- data/examples/rails-app/app/controllers/application_controller.rb +0 -4
- data/examples/rails-app/app/controllers/concerns/.keep +0 -0
- data/examples/rails-app/app/helpers/application_helper.rb +0 -4
- data/examples/rails-app/app/javascript/channels/consumer.js +0 -6
- data/examples/rails-app/app/javascript/channels/index.js +0 -5
- data/examples/rails-app/app/javascript/packs/application.js +0 -13
- data/examples/rails-app/app/jobs/application_job.rb +0 -9
- data/examples/rails-app/app/mailers/application_mailer.rb +0 -6
- data/examples/rails-app/app/models/application_record.rb +0 -5
- data/examples/rails-app/app/models/concerns/.keep +0 -0
- data/examples/rails-app/app/views/layouts/application.html.erb +0 -16
- data/examples/rails-app/app/views/layouts/mailer.html.erb +0 -13
- data/examples/rails-app/app/views/layouts/mailer.text.erb +0 -1
- data/examples/rails-app/babel.config.js +0 -82
- data/examples/rails-app/bin/bundle +0 -118
- data/examples/rails-app/bin/rails +0 -7
- data/examples/rails-app/bin/rake +0 -7
- data/examples/rails-app/bin/setup +0 -38
- data/examples/rails-app/bin/spring +0 -16
- data/examples/rails-app/bin/webpack +0 -21
- data/examples/rails-app/bin/webpack-dev-server +0 -21
- data/examples/rails-app/bin/yarn +0 -19
- data/examples/rails-app/bin/zapp +0 -1
- data/examples/rails-app/config/application.rb +0 -24
- data/examples/rails-app/config/boot.rb +0 -6
- data/examples/rails-app/config/cable.yml +0 -10
- data/examples/rails-app/config/credentials.yml.enc +0 -1
- data/examples/rails-app/config/database.yml +0 -25
- data/examples/rails-app/config/environment.rb +0 -7
- data/examples/rails-app/config/environments/development.rb +0 -78
- data/examples/rails-app/config/environments/production.rb +0 -122
- data/examples/rails-app/config/environments/test.rb +0 -62
- data/examples/rails-app/config/initializers/application_controller_renderer.rb +0 -9
- data/examples/rails-app/config/initializers/assets.rb +0 -16
- data/examples/rails-app/config/initializers/backtrace_silencers.rb +0 -10
- data/examples/rails-app/config/initializers/content_security_policy.rb +0 -31
- data/examples/rails-app/config/initializers/cookies_serializer.rb +0 -7
- data/examples/rails-app/config/initializers/filter_parameter_logging.rb +0 -8
- data/examples/rails-app/config/initializers/inflections.rb +0 -17
- data/examples/rails-app/config/initializers/mime_types.rb +0 -5
- data/examples/rails-app/config/initializers/permissions_policy.rb +0 -12
- data/examples/rails-app/config/initializers/wrap_parameters.rb +0 -16
- data/examples/rails-app/config/locales/en.yml +0 -33
- data/examples/rails-app/config/puma.rb +0 -45
- data/examples/rails-app/config/routes.rb +0 -5
- data/examples/rails-app/config/spring.rb +0 -8
- data/examples/rails-app/config/storage.yml +0 -34
- data/examples/rails-app/config/webpack/development.js +0 -5
- data/examples/rails-app/config/webpack/environment.js +0 -3
- data/examples/rails-app/config/webpack/production.js +0 -5
- data/examples/rails-app/config/webpack/test.js +0 -5
- data/examples/rails-app/config/webpacker.yml +0 -92
- data/examples/rails-app/config/zapp.rb +0 -10
- data/examples/rails-app/config.ru +0 -7
- data/examples/rails-app/db/seeds.rb +0 -8
- data/examples/rails-app/lib/assets/.keep +0 -0
- data/examples/rails-app/lib/tasks/.keep +0 -0
- data/examples/rails-app/log/.keep +0 -0
- data/examples/rails-app/package.json +0 -17
- data/examples/rails-app/postcss.config.js +0 -12
- data/examples/rails-app/public/404.html +0 -67
- data/examples/rails-app/public/422.html +0 -67
- data/examples/rails-app/public/500.html +0 -66
- data/examples/rails-app/public/apple-touch-icon-precomposed.png +0 -0
- data/examples/rails-app/public/apple-touch-icon.png +0 -0
- data/examples/rails-app/public/favicon.ico +0 -0
- data/examples/rails-app/public/robots.txt +0 -1
- data/examples/rails-app/storage/.keep +0 -0
- data/examples/rails-app/test/application_system_test_case.rb +0 -7
- data/examples/rails-app/test/channels/application_cable/connection_test.rb +0 -15
- data/examples/rails-app/test/controllers/.keep +0 -0
- data/examples/rails-app/test/fixtures/files/.keep +0 -0
- data/examples/rails-app/test/helpers/.keep +0 -0
- data/examples/rails-app/test/integration/.keep +0 -0
- data/examples/rails-app/test/mailers/.keep +0 -0
- data/examples/rails-app/test/models/.keep +0 -0
- data/examples/rails-app/test/system/.keep +0 -0
- data/examples/rails-app/test/test_helper.rb +0 -17
- data/examples/rails-app/tmp/.keep +0 -0
- data/examples/rails-app/tmp/pids/.keep +0 -0
- data/examples/rails-app/vendor/.keep +0 -0
- data/examples/rails-app/yarn.lock +0 -6973
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Zapp
|
|
4
|
+
class Worker < Ractor
|
|
5
|
+
# Processes HTTP requests
|
|
6
|
+
class RequestProcessor
|
|
7
|
+
attr_reader(:socket_pipe_sender, :context_pipe)
|
|
8
|
+
|
|
9
|
+
def initialize(context_pipe:, socket_pipe:)
|
|
10
|
+
@socket_pipe_sender = Zapp::SocketPipe::Sender.new(pipe: socket_pipe)
|
|
11
|
+
@context_pipe = context_pipe
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def loop
|
|
15
|
+
while (context = context_pipe.take)
|
|
16
|
+
if context == Zapp::WorkerPool::SIGNALS[:EXIT]
|
|
17
|
+
Zapp::Logger.trace("Received exit signal, shutting down")
|
|
18
|
+
shutdown
|
|
19
|
+
break
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
process = lambda {
|
|
23
|
+
process(context: context)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if Zapp.config.log_requests
|
|
27
|
+
log_request_time(context: context, &process)
|
|
28
|
+
else
|
|
29
|
+
process.call
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# We send sockets that the client hasn't closed yet,
|
|
33
|
+
# back to the main ractor for HTTP request parsing again
|
|
34
|
+
socket_pipe_sender.push(context.socket) unless context.client_closed?
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
# Processes an HTTP request
|
|
41
|
+
def process(context:)
|
|
42
|
+
env = prepare_env(data: context.req.data, body: context.req.body, env: Zapp.config.env.dup)
|
|
43
|
+
|
|
44
|
+
status, headers, response_body_stream = Zapp.config.app.call(env)
|
|
45
|
+
|
|
46
|
+
response_body = body_stream_to_string(response_body_stream)
|
|
47
|
+
|
|
48
|
+
context.res.write(data: response_body, status: status, headers: headers)
|
|
49
|
+
rescue StandardError => e
|
|
50
|
+
context.res.write(data: "An unexpected error occurred", status: 500, headers: {})
|
|
51
|
+
Zapp::Logger.error("#{e}\n\n#{e.backtrace&.join(",\n")}") if Zapp.config.log_uncaught_errors
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Merges HTTP data and body into the env to be passed to the rack app
|
|
55
|
+
def prepare_env(data:, body:, env:)
|
|
56
|
+
data["QUERY_STRING"] = ""
|
|
57
|
+
data["SERVER_NAME"] = data["HTTP_HOST"] || ""
|
|
58
|
+
data["PATH_INFO"] = data["REQUEST_PATH"]
|
|
59
|
+
data["SCRIPT_NAME"] = ""
|
|
60
|
+
|
|
61
|
+
env.update(data)
|
|
62
|
+
|
|
63
|
+
env.update(Rack::RACK_INPUT => body)
|
|
64
|
+
|
|
65
|
+
env
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def log_request_time(context:)
|
|
69
|
+
start = Time.now.to_f * 1000
|
|
70
|
+
|
|
71
|
+
yield
|
|
72
|
+
|
|
73
|
+
request_time = ((Time.now.to_f * 1000) - start).truncate(2)
|
|
74
|
+
method = context.req.data["REQUEST_METHOD"]
|
|
75
|
+
path = context.req.data["PATH_INFO"]
|
|
76
|
+
status = context.res.status
|
|
77
|
+
|
|
78
|
+
Zapp::Logger.info(
|
|
79
|
+
"#{method} #{path} - Completed in #{request_time}ms with status #{status}"
|
|
80
|
+
)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Loops over a body stream and returns a single string
|
|
84
|
+
def body_stream_to_string(stream)
|
|
85
|
+
response_body = ""
|
|
86
|
+
stream.each do |s|
|
|
87
|
+
response_body += s
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
stream.close if stream.respond_to?(:close)
|
|
91
|
+
|
|
92
|
+
response_body
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def shutdown
|
|
96
|
+
Zapp::Logger.flush
|
|
97
|
+
thread_pool.shutdown
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def thread_pool
|
|
101
|
+
@thread_pool ||= Concurrent::ThreadPoolExecutor.new(
|
|
102
|
+
min_threads: Zapp.config.threads_per_worker,
|
|
103
|
+
max_threads: Zapp.config.threads_per_worker,
|
|
104
|
+
max_queue: 1000
|
|
105
|
+
)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
data/lib/zapp/worker.rb
CHANGED
|
@@ -1,87 +1,36 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative("worker/request_processor")
|
|
4
|
+
|
|
3
5
|
module Zapp
|
|
4
6
|
# One worker processing requests in parallel
|
|
5
7
|
class Worker < Ractor
|
|
6
8
|
class << self
|
|
7
|
-
def new(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
else
|
|
23
|
-
Zapp::Worker.process(context: context, app: app, logger: logger, config: config)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
9
|
+
def new(context_pipe:, socket_pipe:, index:)
|
|
10
|
+
super(
|
|
11
|
+
context_pipe,
|
|
12
|
+
socket_pipe,
|
|
13
|
+
Zapp.config.dup,
|
|
14
|
+
name: name(index)
|
|
15
|
+
) do |context_pipe, socket_pipe, config|
|
|
16
|
+
Ractor.current[Zapp::RACTOR_CONFIG_KEY] = config
|
|
17
|
+
|
|
18
|
+
processor = Zapp::Worker::RequestProcessor.new(
|
|
19
|
+
socket_pipe: socket_pipe,
|
|
20
|
+
context_pipe: context_pipe
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
processor.loop
|
|
26
24
|
end
|
|
27
25
|
end
|
|
28
26
|
|
|
29
|
-
# Processes an HTTP request
|
|
30
|
-
def process(context:, app:, logger:, config:)
|
|
31
|
-
prepare_env(data: context.req.data, body: context.req.body, env: config.env)
|
|
32
|
-
|
|
33
|
-
status, headers, response_body_stream = app.call(config.env)
|
|
34
|
-
|
|
35
|
-
response_body = body_stream_to_string(response_body_stream)
|
|
36
|
-
|
|
37
|
-
context.res.write(data: response_body, status: status, headers: headers)
|
|
38
|
-
rescue StandardError => e
|
|
39
|
-
context.res.write(data: "An unexpected error occurred", status: 500, headers: {})
|
|
40
|
-
logger.error("#{e}\n\n#{e.backtrace&.join(",\n")}") if config.log_uncaught_errors
|
|
41
|
-
ensure
|
|
42
|
-
context.close
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def log_request_time(logger:)
|
|
46
|
-
start = Time.now.to_f * 1000
|
|
47
|
-
|
|
48
|
-
yield
|
|
49
|
-
ensure
|
|
50
|
-
logger.info("Processed request in #{((Time.now.to_f * 1000) - start).truncate(2)}ms")
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# Loops over a body stream and returns a single string
|
|
54
|
-
def body_stream_to_string(stream)
|
|
55
|
-
response_body = ""
|
|
56
|
-
stream.each do |s|
|
|
57
|
-
response_body += s
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
stream.close if stream.respond_to?(:close)
|
|
61
|
-
|
|
62
|
-
response_body
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Merges HTTP data and body into the env to be passed to the rack app
|
|
66
|
-
def prepare_env(data:, body:, env:)
|
|
67
|
-
data["QUERY_STRING"] = ""
|
|
68
|
-
data["SERVER_NAME"] = data["HTTP_HOST"] || ""
|
|
69
|
-
data["PATH_INFO"] = data["REQUEST_PATH"]
|
|
70
|
-
data["SCRIPT_NAME"] = ""
|
|
71
|
-
|
|
72
|
-
env.update(data)
|
|
73
|
-
|
|
74
|
-
env.update(Rack::RACK_INPUT => body)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
27
|
# Index based name of the worker
|
|
78
28
|
def name(index)
|
|
79
|
-
"
|
|
29
|
+
"zapp-http-#{index + 1}"
|
|
80
30
|
end
|
|
81
31
|
end
|
|
82
32
|
|
|
83
33
|
def terminate
|
|
84
|
-
Zapp::Logger.debug("Terminating worker #{name}")
|
|
85
34
|
take
|
|
86
35
|
end
|
|
87
36
|
end
|
data/lib/zapp/worker_pool.rb
CHANGED
|
@@ -3,38 +3,37 @@
|
|
|
3
3
|
module Zapp
|
|
4
4
|
# Manages and dispatches work to a pool of Zap::Worker's
|
|
5
5
|
class WorkerPool
|
|
6
|
-
attr_reader(:
|
|
6
|
+
attr_reader(:context_pipe, :workers, :parallelism)
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
Ractor.yield(Ractor.receive)
|
|
12
|
-
end
|
|
13
|
-
end
|
|
8
|
+
SIGNALS = {
|
|
9
|
+
EXIT: :exit
|
|
10
|
+
}.freeze
|
|
14
11
|
|
|
12
|
+
def initialize(context_pipe:, socket_pipe:)
|
|
13
|
+
@context_pipe = context_pipe
|
|
15
14
|
@workers = []
|
|
16
15
|
Zapp.config.parallelism.times do |i|
|
|
17
16
|
@workers << Worker.new(
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
context_pipe: context_pipe,
|
|
18
|
+
socket_pipe: socket_pipe,
|
|
20
19
|
index: i
|
|
21
20
|
)
|
|
22
21
|
end
|
|
23
22
|
end
|
|
24
23
|
|
|
25
|
-
# Sends
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def process(context:, shutdown: false)
|
|
29
|
-
pipe.send([context.dup, shutdown], move: true)
|
|
24
|
+
# Sends a socket to one of our workers
|
|
25
|
+
def process(context:)
|
|
26
|
+
context_pipe.send(context)
|
|
30
27
|
end
|
|
31
28
|
|
|
32
29
|
# Finishes processing of all requests and shuts down workers
|
|
33
30
|
def drain
|
|
34
|
-
Zapp.config.parallelism.times { process(context:
|
|
35
|
-
workers.map
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
Zapp.config.parallelism.times { process(context: SIGNALS[:EXIT]) }
|
|
32
|
+
workers.map do |w|
|
|
33
|
+
w.terminate
|
|
34
|
+
rescue Ractor::ClosedError
|
|
35
|
+
# Ractor has already exited
|
|
36
|
+
end
|
|
38
37
|
end
|
|
39
38
|
end
|
|
40
39
|
end
|
data/lib/zapp.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
# External dependencies are loaded here
|
|
4
|
+
require("irb")
|
|
4
5
|
require("socket")
|
|
5
6
|
require("concurrent")
|
|
6
7
|
require("puma")
|
|
@@ -10,11 +11,14 @@ require("rack")
|
|
|
10
11
|
module Zapp
|
|
11
12
|
class ZappError < StandardError; end
|
|
12
13
|
|
|
14
|
+
# The hash key in Ractor.current that stores the global Zapp::Configuration instance
|
|
15
|
+
RACTOR_CONFIG_KEY = "ZAPP_CONFIG"
|
|
16
|
+
|
|
13
17
|
class << self
|
|
14
18
|
def config(reset: false)
|
|
15
|
-
|
|
19
|
+
Ractor.current[RACTOR_CONFIG_KEY] = Zapp::Configuration.new if reset
|
|
16
20
|
|
|
17
|
-
|
|
21
|
+
Ractor.current[RACTOR_CONFIG_KEY] ||= Zapp::Configuration.new
|
|
18
22
|
end
|
|
19
23
|
|
|
20
24
|
def configure
|
|
@@ -23,12 +27,15 @@ module Zapp
|
|
|
23
27
|
end
|
|
24
28
|
end
|
|
25
29
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
require_relative("zapp/version")
|
|
31
|
+
require_relative("zapp/logger")
|
|
32
|
+
require_relative("zapp/configuration")
|
|
33
|
+
require_relative("zapp/input_stream")
|
|
34
|
+
require_relative("zapp/http_context/context")
|
|
35
|
+
require_relative("zapp/pipe")
|
|
36
|
+
require_relative("zapp/socket_pipe/sender")
|
|
37
|
+
require_relative("zapp/socket_pipe/receiver")
|
|
38
|
+
require_relative("zapp/worker")
|
|
39
|
+
require_relative("zapp/worker_pool")
|
|
40
|
+
require_relative("zapp/server")
|
|
41
|
+
require_relative("zapp/cli")
|
data/zapp.gemspec
CHANGED
|
@@ -31,6 +31,8 @@ Gem::Specification.new do |spec|
|
|
|
31
31
|
# Use Puma's C-based HttpParser, it's fast as hell
|
|
32
32
|
spec.add_dependency("puma", "~> 5.5.2")
|
|
33
33
|
|
|
34
|
+
spec.add_dependency("webrick")
|
|
35
|
+
|
|
34
36
|
# Concurrent ruby for managing Thread pools
|
|
35
37
|
spec.add_dependency("concurrent-ruby", "~> 1.1.9")
|
|
36
38
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: zapp
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Mathias H Steffensen
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-07-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rack
|
|
@@ -38,6 +38,20 @@ dependencies:
|
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: 5.5.2
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: webrick
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
41
55
|
- !ruby/object:Gem::Dependency
|
|
42
56
|
name: concurrent-ruby
|
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -98,104 +112,11 @@ files:
|
|
|
98
112
|
- LICENSE.txt
|
|
99
113
|
- README.md
|
|
100
114
|
- Rakefile
|
|
101
|
-
- bin/console
|
|
102
|
-
- bin/setup
|
|
103
115
|
- bin/zapp
|
|
104
|
-
- examples/
|
|
105
|
-
- examples/
|
|
106
|
-
- examples/
|
|
107
|
-
-
|
|
108
|
-
- examples/rails-app/Gemfile
|
|
109
|
-
- examples/rails-app/Gemfile.lock
|
|
110
|
-
- examples/rails-app/Rakefile
|
|
111
|
-
- examples/rails-app/app/assets/config/manifest.js
|
|
112
|
-
- examples/rails-app/app/assets/images/.keep
|
|
113
|
-
- examples/rails-app/app/assets/stylesheets/application.css
|
|
114
|
-
- examples/rails-app/app/channels/application_cable/channel.rb
|
|
115
|
-
- examples/rails-app/app/channels/application_cable/connection.rb
|
|
116
|
-
- examples/rails-app/app/controllers/application_controller.rb
|
|
117
|
-
- examples/rails-app/app/controllers/concerns/.keep
|
|
118
|
-
- examples/rails-app/app/helpers/application_helper.rb
|
|
119
|
-
- examples/rails-app/app/javascript/channels/consumer.js
|
|
120
|
-
- examples/rails-app/app/javascript/channels/index.js
|
|
121
|
-
- examples/rails-app/app/javascript/packs/application.js
|
|
122
|
-
- examples/rails-app/app/jobs/application_job.rb
|
|
123
|
-
- examples/rails-app/app/mailers/application_mailer.rb
|
|
124
|
-
- examples/rails-app/app/models/application_record.rb
|
|
125
|
-
- examples/rails-app/app/models/concerns/.keep
|
|
126
|
-
- examples/rails-app/app/views/layouts/application.html.erb
|
|
127
|
-
- examples/rails-app/app/views/layouts/mailer.html.erb
|
|
128
|
-
- examples/rails-app/app/views/layouts/mailer.text.erb
|
|
129
|
-
- examples/rails-app/babel.config.js
|
|
130
|
-
- examples/rails-app/bin/bundle
|
|
131
|
-
- examples/rails-app/bin/rails
|
|
132
|
-
- examples/rails-app/bin/rake
|
|
133
|
-
- examples/rails-app/bin/setup
|
|
134
|
-
- examples/rails-app/bin/spring
|
|
135
|
-
- examples/rails-app/bin/webpack
|
|
136
|
-
- examples/rails-app/bin/webpack-dev-server
|
|
137
|
-
- examples/rails-app/bin/yarn
|
|
138
|
-
- examples/rails-app/bin/zapp
|
|
139
|
-
- examples/rails-app/config.ru
|
|
140
|
-
- examples/rails-app/config/application.rb
|
|
141
|
-
- examples/rails-app/config/boot.rb
|
|
142
|
-
- examples/rails-app/config/cable.yml
|
|
143
|
-
- examples/rails-app/config/credentials.yml.enc
|
|
144
|
-
- examples/rails-app/config/database.yml
|
|
145
|
-
- examples/rails-app/config/environment.rb
|
|
146
|
-
- examples/rails-app/config/environments/development.rb
|
|
147
|
-
- examples/rails-app/config/environments/production.rb
|
|
148
|
-
- examples/rails-app/config/environments/test.rb
|
|
149
|
-
- examples/rails-app/config/initializers/application_controller_renderer.rb
|
|
150
|
-
- examples/rails-app/config/initializers/assets.rb
|
|
151
|
-
- examples/rails-app/config/initializers/backtrace_silencers.rb
|
|
152
|
-
- examples/rails-app/config/initializers/content_security_policy.rb
|
|
153
|
-
- examples/rails-app/config/initializers/cookies_serializer.rb
|
|
154
|
-
- examples/rails-app/config/initializers/filter_parameter_logging.rb
|
|
155
|
-
- examples/rails-app/config/initializers/inflections.rb
|
|
156
|
-
- examples/rails-app/config/initializers/mime_types.rb
|
|
157
|
-
- examples/rails-app/config/initializers/permissions_policy.rb
|
|
158
|
-
- examples/rails-app/config/initializers/wrap_parameters.rb
|
|
159
|
-
- examples/rails-app/config/locales/en.yml
|
|
160
|
-
- examples/rails-app/config/puma.rb
|
|
161
|
-
- examples/rails-app/config/routes.rb
|
|
162
|
-
- examples/rails-app/config/spring.rb
|
|
163
|
-
- examples/rails-app/config/storage.yml
|
|
164
|
-
- examples/rails-app/config/webpack/development.js
|
|
165
|
-
- examples/rails-app/config/webpack/environment.js
|
|
166
|
-
- examples/rails-app/config/webpack/production.js
|
|
167
|
-
- examples/rails-app/config/webpack/test.js
|
|
168
|
-
- examples/rails-app/config/webpacker.yml
|
|
169
|
-
- examples/rails-app/config/zapp.rb
|
|
170
|
-
- examples/rails-app/db/seeds.rb
|
|
171
|
-
- examples/rails-app/lib/assets/.keep
|
|
172
|
-
- examples/rails-app/lib/tasks/.keep
|
|
173
|
-
- examples/rails-app/log/.keep
|
|
174
|
-
- examples/rails-app/package.json
|
|
175
|
-
- examples/rails-app/postcss.config.js
|
|
176
|
-
- examples/rails-app/public/404.html
|
|
177
|
-
- examples/rails-app/public/422.html
|
|
178
|
-
- examples/rails-app/public/500.html
|
|
179
|
-
- examples/rails-app/public/apple-touch-icon-precomposed.png
|
|
180
|
-
- examples/rails-app/public/apple-touch-icon.png
|
|
181
|
-
- examples/rails-app/public/favicon.ico
|
|
182
|
-
- examples/rails-app/public/robots.txt
|
|
183
|
-
- examples/rails-app/storage/.keep
|
|
184
|
-
- examples/rails-app/test/application_system_test_case.rb
|
|
185
|
-
- examples/rails-app/test/channels/application_cable/connection_test.rb
|
|
186
|
-
- examples/rails-app/test/controllers/.keep
|
|
187
|
-
- examples/rails-app/test/fixtures/files/.keep
|
|
188
|
-
- examples/rails-app/test/helpers/.keep
|
|
189
|
-
- examples/rails-app/test/integration/.keep
|
|
190
|
-
- examples/rails-app/test/mailers/.keep
|
|
191
|
-
- examples/rails-app/test/models/.keep
|
|
192
|
-
- examples/rails-app/test/system/.keep
|
|
193
|
-
- examples/rails-app/test/test_helper.rb
|
|
194
|
-
- examples/rails-app/tmp/.keep
|
|
195
|
-
- examples/rails-app/tmp/pids/.keep
|
|
196
|
-
- examples/rails-app/vendor/.keep
|
|
197
|
-
- examples/rails-app/yarn.lock
|
|
198
|
-
- lib/rack/handler/zap.rb
|
|
116
|
+
- examples/config/app.rb
|
|
117
|
+
- examples/config/puma.rb
|
|
118
|
+
- examples/config/zapp.rb
|
|
119
|
+
- lib/rack/handler/zapp.rb
|
|
199
120
|
- lib/zapp.rb
|
|
200
121
|
- lib/zapp/cli.rb
|
|
201
122
|
- lib/zapp/configuration.rb
|
|
@@ -204,10 +125,15 @@ files:
|
|
|
204
125
|
- lib/zapp/http_context/response.rb
|
|
205
126
|
- lib/zapp/input_stream.rb
|
|
206
127
|
- lib/zapp/logger.rb
|
|
128
|
+
- lib/zapp/logger/base.rb
|
|
207
129
|
- lib/zapp/parser.rb
|
|
130
|
+
- lib/zapp/pipe.rb
|
|
208
131
|
- lib/zapp/server.rb
|
|
132
|
+
- lib/zapp/socket_pipe/receiver.rb
|
|
133
|
+
- lib/zapp/socket_pipe/sender.rb
|
|
209
134
|
- lib/zapp/version.rb
|
|
210
135
|
- lib/zapp/worker.rb
|
|
136
|
+
- lib/zapp/worker/request_processor.rb
|
|
211
137
|
- lib/zapp/worker_pool.rb
|
|
212
138
|
- zapp.gemspec
|
|
213
139
|
homepage: https://github.com/mathiashsteffensen/zapp
|
|
@@ -232,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
232
158
|
- !ruby/object:Gem::Version
|
|
233
159
|
version: '0'
|
|
234
160
|
requirements: []
|
|
235
|
-
rubygems_version: 3.3
|
|
161
|
+
rubygems_version: 3.2.3
|
|
236
162
|
signing_key:
|
|
237
163
|
specification_version: 4
|
|
238
164
|
summary: A Web Server based on Ractors, for Rack-based Ruby applications
|
data/bin/console
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# frozen_string_literal: true
|
|
3
|
-
|
|
4
|
-
require("bundler/setup")
|
|
5
|
-
require("zapp")
|
|
6
|
-
|
|
7
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
|
8
|
-
# with your gem easier. You can also use a different console, if you like.
|
|
9
|
-
|
|
10
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
|
11
|
-
# require "pry"
|
|
12
|
-
# Pry.start
|
|
13
|
-
|
|
14
|
-
require("irb")
|
|
15
|
-
IRB.start(__FILE__)
|
data/bin/setup
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
defaults
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# See https://git-scm.com/docs/gitattributes for more about git attribute files.
|
|
2
|
-
|
|
3
|
-
# Mark the database schema as having been generated.
|
|
4
|
-
db/schema.rb linguist-generated
|
|
5
|
-
|
|
6
|
-
# Mark the yarn lockfile as having been generated.
|
|
7
|
-
yarn.lock linguist-generated
|
|
8
|
-
|
|
9
|
-
# Mark any vendored files as having been vendored.
|
|
10
|
-
vendor/* linguist-vendored
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
|
|
2
|
-
#
|
|
3
|
-
# If you find yourself ignoring temporary files generated by your text editor
|
|
4
|
-
# or operating system, you probably want to add a global ignore instead:
|
|
5
|
-
# git config --global core.excludesfile '~/.gitignore_global'
|
|
6
|
-
|
|
7
|
-
# Ignore bundler config.
|
|
8
|
-
/.bundle
|
|
9
|
-
|
|
10
|
-
# Ignore the default SQLite database.
|
|
11
|
-
/db/*.sqlite3
|
|
12
|
-
/db/*.sqlite3-*
|
|
13
|
-
|
|
14
|
-
# Ignore all logfiles and tempfiles.
|
|
15
|
-
/log/*
|
|
16
|
-
/tmp/*
|
|
17
|
-
!/log/.keep
|
|
18
|
-
!/tmp/.keep
|
|
19
|
-
|
|
20
|
-
# Ignore pidfiles, but keep the directory.
|
|
21
|
-
/tmp/pids/*
|
|
22
|
-
!/tmp/pids/
|
|
23
|
-
!/tmp/pids/.keep
|
|
24
|
-
|
|
25
|
-
# Ignore uploaded files in development.
|
|
26
|
-
/storage/*
|
|
27
|
-
!/storage/.keep
|
|
28
|
-
|
|
29
|
-
/public/assets
|
|
30
|
-
.byebug_history
|
|
31
|
-
|
|
32
|
-
# Ignore master key for decrypting credentials and more.
|
|
33
|
-
/config/master.key
|
|
34
|
-
|
|
35
|
-
/public/packs
|
|
36
|
-
/public/packs-test
|
|
37
|
-
/node_modules
|
|
38
|
-
/yarn-error.log
|
|
39
|
-
yarn-debug.log*
|
|
40
|
-
.yarn-integrity
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3.0.0
|
data/examples/rails-app/Gemfile
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
source("https://rubygems.org")
|
|
4
|
-
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
|
5
|
-
|
|
6
|
-
ruby("3.0.0")
|
|
7
|
-
|
|
8
|
-
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main'
|
|
9
|
-
gem("rails", "~> 6.1.4", ">= 6.1.4.1")
|
|
10
|
-
# Use sqlite3 as the database for Active Record
|
|
11
|
-
gem("sqlite3", "~> 1.4")
|
|
12
|
-
# Use Zapp as the app server
|
|
13
|
-
gem("zapp", path: "../..")
|
|
14
|
-
# Use SCSS for stylesheets
|
|
15
|
-
gem("sass-rails", ">= 6")
|
|
16
|
-
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
|
|
17
|
-
gem("webpacker", "~> 5.0")
|
|
18
|
-
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
|
|
19
|
-
gem("turbolinks", "~> 5")
|
|
20
|
-
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
|
|
21
|
-
gem("jbuilder", "~> 2.7")
|
|
22
|
-
# Use Redis adapter to run Action Cable in production
|
|
23
|
-
# gem 'redis', '~> 4.0'
|
|
24
|
-
# Use Active Model has_secure_password
|
|
25
|
-
# gem 'bcrypt', '~> 3.1.7'
|
|
26
|
-
|
|
27
|
-
# Use Active Storage variant
|
|
28
|
-
# gem 'image_processing', '~> 1.2'
|
|
29
|
-
|
|
30
|
-
# Reduces boot times through caching; required in config/boot.rb
|
|
31
|
-
gem("bootsnap", ">= 1.4.4", require: false)
|
|
32
|
-
|
|
33
|
-
group(:development, :test) do
|
|
34
|
-
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
|
|
35
|
-
gem("byebug", platforms: %i[mri mingw x64_mingw])
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
group(:development) do
|
|
39
|
-
# Access an interactive console on exception pages or by calling 'console' anywhere in the code.
|
|
40
|
-
gem("web-console", ">= 4.1.0")
|
|
41
|
-
# Display performance information such as SQL time and flame graphs for each request in your browser.
|
|
42
|
-
# Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md
|
|
43
|
-
gem("listen", "~> 3.3")
|
|
44
|
-
gem("rack-mini-profiler", "~> 2.0")
|
|
45
|
-
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
|
|
46
|
-
gem("spring")
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
group(:test) do
|
|
50
|
-
# Adds support for Capybara system testing and selenium driver
|
|
51
|
-
gem("capybara", ">= 3.26")
|
|
52
|
-
gem("selenium-webdriver")
|
|
53
|
-
# Easy installation and use of web drivers to run system tests with browsers
|
|
54
|
-
gem("webdrivers")
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
|
58
|
-
gem("tzinfo-data", platforms: %i[mingw mswin x64_mingw jruby])
|