rage-iodine 1.7.58
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 +7 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
- data/.github/workflows/ruby.yml +42 -0
- data/.gitignore +20 -0
- data/.rspec +2 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +1098 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +21 -0
- data/LIMITS.md +41 -0
- data/README.md +782 -0
- data/Rakefile +23 -0
- data/SPEC-PubSub-Draft.md +159 -0
- data/SPEC-WebSocket-Draft.md +239 -0
- data/bin/console +22 -0
- data/bin/info.md +353 -0
- data/bin/mustache_bench.rb +100 -0
- data/bin/poc/Gemfile.lock +23 -0
- data/bin/poc/README.md +37 -0
- data/bin/poc/config.ru +66 -0
- data/bin/poc/gemfile +1 -0
- data/bin/poc/www/index.html +57 -0
- data/examples/async_task.ru +92 -0
- data/examples/bates/README.md +3 -0
- data/examples/bates/config.ru +342 -0
- data/examples/bates/david+bold.pdf +0 -0
- data/examples/bates/public/drop-pdf.png +0 -0
- data/examples/bates/public/index.html +600 -0
- data/examples/config.ru +59 -0
- data/examples/echo.ru +59 -0
- data/examples/etag.ru +16 -0
- data/examples/hello.ru +29 -0
- data/examples/pubsub_engine.ru +81 -0
- data/examples/rack3.ru +12 -0
- data/examples/redis.ru +70 -0
- data/examples/shootout.ru +73 -0
- data/examples/sub-protocols.ru +90 -0
- data/examples/tcp_client.rb +66 -0
- data/examples/x-sendfile.ru +14 -0
- data/exe/iodine +280 -0
- data/ext/iodine/extconf.rb +110 -0
- data/ext/iodine/fio.c +12096 -0
- data/ext/iodine/fio.h +6390 -0
- data/ext/iodine/fio_cli.c +431 -0
- data/ext/iodine/fio_cli.h +189 -0
- data/ext/iodine/fio_json_parser.h +687 -0
- data/ext/iodine/fio_siphash.c +157 -0
- data/ext/iodine/fio_siphash.h +37 -0
- data/ext/iodine/fio_tls.h +129 -0
- data/ext/iodine/fio_tls_missing.c +649 -0
- data/ext/iodine/fio_tls_openssl.c +1056 -0
- data/ext/iodine/fio_tmpfile.h +50 -0
- data/ext/iodine/fiobj.h +44 -0
- data/ext/iodine/fiobj4fio.h +21 -0
- data/ext/iodine/fiobj_ary.c +333 -0
- data/ext/iodine/fiobj_ary.h +139 -0
- data/ext/iodine/fiobj_data.c +1185 -0
- data/ext/iodine/fiobj_data.h +167 -0
- data/ext/iodine/fiobj_hash.c +409 -0
- data/ext/iodine/fiobj_hash.h +176 -0
- data/ext/iodine/fiobj_json.c +622 -0
- data/ext/iodine/fiobj_json.h +68 -0
- data/ext/iodine/fiobj_mem.h +71 -0
- data/ext/iodine/fiobj_mustache.c +317 -0
- data/ext/iodine/fiobj_mustache.h +62 -0
- data/ext/iodine/fiobj_numbers.c +344 -0
- data/ext/iodine/fiobj_numbers.h +127 -0
- data/ext/iodine/fiobj_str.c +433 -0
- data/ext/iodine/fiobj_str.h +172 -0
- data/ext/iodine/fiobject.c +620 -0
- data/ext/iodine/fiobject.h +654 -0
- data/ext/iodine/hpack.h +1923 -0
- data/ext/iodine/http.c +2736 -0
- data/ext/iodine/http.h +1019 -0
- data/ext/iodine/http1.c +825 -0
- data/ext/iodine/http1.h +29 -0
- data/ext/iodine/http1_parser.h +1835 -0
- data/ext/iodine/http_internal.c +1279 -0
- data/ext/iodine/http_internal.h +248 -0
- data/ext/iodine/http_mime_parser.h +350 -0
- data/ext/iodine/iodine.c +1433 -0
- data/ext/iodine/iodine.h +64 -0
- data/ext/iodine/iodine_caller.c +218 -0
- data/ext/iodine/iodine_caller.h +27 -0
- data/ext/iodine/iodine_connection.c +941 -0
- data/ext/iodine/iodine_connection.h +55 -0
- data/ext/iodine/iodine_defer.c +420 -0
- data/ext/iodine/iodine_defer.h +6 -0
- data/ext/iodine/iodine_fiobj2rb.h +120 -0
- data/ext/iodine/iodine_helpers.c +282 -0
- data/ext/iodine/iodine_helpers.h +12 -0
- data/ext/iodine/iodine_http.c +1280 -0
- data/ext/iodine/iodine_http.h +23 -0
- data/ext/iodine/iodine_json.c +302 -0
- data/ext/iodine/iodine_json.h +6 -0
- data/ext/iodine/iodine_mustache.c +567 -0
- data/ext/iodine/iodine_mustache.h +6 -0
- data/ext/iodine/iodine_pubsub.c +580 -0
- data/ext/iodine/iodine_pubsub.h +26 -0
- data/ext/iodine/iodine_rack_io.c +273 -0
- data/ext/iodine/iodine_rack_io.h +20 -0
- data/ext/iodine/iodine_store.c +142 -0
- data/ext/iodine/iodine_store.h +20 -0
- data/ext/iodine/iodine_tcp.c +346 -0
- data/ext/iodine/iodine_tcp.h +13 -0
- data/ext/iodine/iodine_tls.c +261 -0
- data/ext/iodine/iodine_tls.h +13 -0
- data/ext/iodine/mustache_parser.h +1546 -0
- data/ext/iodine/redis_engine.c +957 -0
- data/ext/iodine/redis_engine.h +79 -0
- data/ext/iodine/resp_parser.h +317 -0
- data/ext/iodine/scheduler.c +173 -0
- data/ext/iodine/scheduler.h +6 -0
- data/ext/iodine/websocket_parser.h +506 -0
- data/ext/iodine/websockets.c +752 -0
- data/ext/iodine/websockets.h +185 -0
- data/iodine.gemspec +50 -0
- data/lib/iodine/connection.rb +61 -0
- data/lib/iodine/json.rb +42 -0
- data/lib/iodine/mustache.rb +113 -0
- data/lib/iodine/pubsub.rb +55 -0
- data/lib/iodine/rack_utils.rb +43 -0
- data/lib/iodine/tls.rb +16 -0
- data/lib/iodine/version.rb +3 -0
- data/lib/iodine.rb +274 -0
- data/lib/rack/handler/iodine.rb +33 -0
- data/logo.png +0 -0
- metadata +284 -0
data/lib/iodine.rb
ADDED
@@ -0,0 +1,274 @@
|
|
1
|
+
require 'stringio' # Used internally as a default RackIO
|
2
|
+
require 'socket' # TCPSocket is used internally for Hijack support
|
3
|
+
# require 'openssl' # For SSL/TLS support using OpenSSL
|
4
|
+
|
5
|
+
require_relative './iodine/version'
|
6
|
+
require_relative './iodine/iodine_ext' # loading a binary C extension
|
7
|
+
|
8
|
+
# Iodine is an HTTP / WebSocket server as well as an Evented Network Tool Library. In essense, Iodine is a Ruby port for the [facil.io](http://facil.io) C library.
|
9
|
+
#
|
10
|
+
# Here is a simple telnet based echo server using Iodine (see full list at {Iodine::Connection}):
|
11
|
+
#
|
12
|
+
#
|
13
|
+
# require 'iodine'
|
14
|
+
# # define the protocol for our service
|
15
|
+
# module EchoProtocol
|
16
|
+
# def on_open(client)
|
17
|
+
# # Set a connection timeout
|
18
|
+
# client.timeout = 10
|
19
|
+
# # Write a welcome message
|
20
|
+
# client.write "Echo server running on Iodine #{Iodine::VERSION}.\r\n"
|
21
|
+
# end
|
22
|
+
# # this is called for incoming data - note data might be fragmented.
|
23
|
+
# def on_message(client, data)
|
24
|
+
# # write the data we received
|
25
|
+
# client.write "echo: #{data}"
|
26
|
+
# # close the connection when the time comes
|
27
|
+
# client.close if data =~ /^bye[\n\r]/
|
28
|
+
# end
|
29
|
+
# # called if the connection is still open and the server is shutting down.
|
30
|
+
# def on_shutdown(client)
|
31
|
+
# # write the data we received
|
32
|
+
# client.write "Server going away\r\n"
|
33
|
+
# end
|
34
|
+
# extend self
|
35
|
+
# end
|
36
|
+
# # create the service instance, the block returns a connection handler.
|
37
|
+
# Iodine.listen(port: "3000") { EchoProtocol }
|
38
|
+
# # start the service
|
39
|
+
# Iodine.threads = 1
|
40
|
+
# Iodine.start
|
41
|
+
#
|
42
|
+
#
|
43
|
+
#
|
44
|
+
# Methods for setting up and starting {Iodine} include {start}, {threads}, {threads=}, {workers} and {workers=}.
|
45
|
+
#
|
46
|
+
# Methods for setting startup / operational callbacks include {on_idle}, {on_state}.
|
47
|
+
#
|
48
|
+
# Methods for asynchronous execution include {run} (same as {defer}), {run_after} and {run_every}.
|
49
|
+
#
|
50
|
+
# Methods for application wide pub/sub include {subscribe}, {unsubscribe} and {publish}. Connection specific pub/sub methods are documented in the {Iodine::Connection} class).
|
51
|
+
#
|
52
|
+
# Methods for TCP/IP, Unix Sockets and HTTP connections include {listen} and {connect}.
|
53
|
+
#
|
54
|
+
# Note that the HTTP server supports both TCP/IP and Unix Sockets as well as SSE / WebSockets extensions.
|
55
|
+
#
|
56
|
+
# Iodine doesn't call {patch_rack} automatically, but doing so will improve Rack's performace.
|
57
|
+
#
|
58
|
+
# Please read the {file:README.md} file for an introduction to Iodine.
|
59
|
+
#
|
60
|
+
module Iodine
|
61
|
+
|
62
|
+
# Will monkey patch some Rack methods to increase their performance.
|
63
|
+
#
|
64
|
+
# This is recommended, see {Iodine::Rack::Utils} for details.
|
65
|
+
def self.patch_rack
|
66
|
+
begin
|
67
|
+
require 'rack'
|
68
|
+
rescue LoadError
|
69
|
+
end
|
70
|
+
::Rack::Utils.class_eval do
|
71
|
+
Iodine::Base::MonkeyPatch::RackUtils.methods(false).each do |m|
|
72
|
+
::Rack::Utils.define_singleton_method(m,
|
73
|
+
Iodine::Base::MonkeyPatch::RackUtils.instance_method(m) )
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
# @deprecated use {Iodine.listen} with `service: :http`.
|
80
|
+
#
|
81
|
+
# Sets a block of code to run once a Worker process shuts down (both in single process mode and cluster mode).
|
82
|
+
def self.listen2http(args, &block)
|
83
|
+
warn "Iodine.listen2http is deprecated, use Iodine.listen(service: :http)."
|
84
|
+
args[:service] = :http;
|
85
|
+
Iodine.listen(args, &block)
|
86
|
+
end
|
87
|
+
|
88
|
+
# @deprecated use {Iodine.on_state}.
|
89
|
+
#
|
90
|
+
# Sets a block of code to run before a new worker process is forked (cluster mode only).
|
91
|
+
def self.before_fork(&block)
|
92
|
+
warn "Iodine.before_fork is deprecated, use Iodine.on_state(:before_fork)."
|
93
|
+
Iodine.on_state(:before_fork, &block)
|
94
|
+
end
|
95
|
+
# @deprecated use {Iodine.on_state}.
|
96
|
+
#
|
97
|
+
# Sets a block of code to run after a new worker process is forked (cluster mode only).
|
98
|
+
#
|
99
|
+
# Code runs in both the parent and the child.
|
100
|
+
def self.after_fork(&block)
|
101
|
+
warn "Iodine.after_fork is deprecated, use Iodine.on_state(:after_fork)."
|
102
|
+
Iodine.on_state(:after_fork, &block)
|
103
|
+
end
|
104
|
+
# @deprecated use {Iodine.on_state}.
|
105
|
+
#
|
106
|
+
# Sets a block of code to run in the worker process, after a new worker process is forked (cluster mode only).
|
107
|
+
def self.after_fork_in_worker(&block)
|
108
|
+
warn "Iodine.after_fork_in_worker is deprecated, use Iodine.on_state(:enter_child)."
|
109
|
+
Iodine.on_state(:enter_child, &block)
|
110
|
+
end
|
111
|
+
# @deprecated use {Iodine.on_state}.
|
112
|
+
#
|
113
|
+
# Sets a block of code to run in the master / root process, after a new worker process is forked (cluster mode only).
|
114
|
+
def self.after_fork_in_master(&block)
|
115
|
+
warn "Iodine.after_fork_in_master is deprecated, use Iodine.on_state(:enter_master)."
|
116
|
+
Iodine.on_state(:enter_master, &block)
|
117
|
+
end
|
118
|
+
# @deprecated use {Iodine.on_state}.
|
119
|
+
#
|
120
|
+
# Sets a block of code to run once a Worker process shuts down (both in single process mode and cluster mode).
|
121
|
+
def self.on_shutdown(&block)
|
122
|
+
warn "Iodine.on_shutdown is deprecated, use Iodine.on_state(:on_finish)."
|
123
|
+
Iodine.on_state(:on_finish, &block)
|
124
|
+
end
|
125
|
+
|
126
|
+
module PubSub
|
127
|
+
# @deprecated use {Iodine::PubSub.detach}.
|
128
|
+
def self.dettach(engine)
|
129
|
+
warn "Iodine::PubSub.dettach is deprecated (was a typo), use Iodine::PubSub.detach(engine)."
|
130
|
+
Iodine::PubSub.detach(engine)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
### trap some signals to avoid excessive exception reports
|
135
|
+
begin
|
136
|
+
old_sigint = Signal.trap("SIGINT") { old_sigint.call if old_sigint.respond_to?(:call) }
|
137
|
+
rescue Exception
|
138
|
+
end
|
139
|
+
begin
|
140
|
+
old_sigterm = Signal.trap("SIGTERM") { old_sigterm.call if old_sigterm.respond_to?(:call) }
|
141
|
+
rescue Exception
|
142
|
+
end
|
143
|
+
begin
|
144
|
+
old_sigpipe = Signal.trap("SIGPIPE") { old_sigpipe.call if old_sigpipe.respond_to?(:call) }
|
145
|
+
rescue Exception
|
146
|
+
end
|
147
|
+
begin
|
148
|
+
old_sigusr1 = Signal.trap("SIGUSR1") { old_sigusr1.call if old_sigusr1.respond_to?(:call) }
|
149
|
+
rescue Exception
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
require 'rack/handler/iodine' unless defined? ::Iodine::Rack::IODINE_RACK_LOADED
|
154
|
+
|
155
|
+
|
156
|
+
### Automatic ActiveRecord and Sequel support for forking (preventing connection sharing)
|
157
|
+
Iodine.on_state(:before_fork) do
|
158
|
+
if defined?(ActiveRecord) && defined?(ActiveRecord::Base) && ActiveRecord::Base.respond_to?(:connection)
|
159
|
+
begin
|
160
|
+
ActiveRecord::Base.connection.disconnect!
|
161
|
+
rescue
|
162
|
+
end
|
163
|
+
end
|
164
|
+
if defined?(Sequel)
|
165
|
+
begin
|
166
|
+
Sequel::DATABASES.each { |database| database.disconnect }
|
167
|
+
rescue
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
Iodine.on_state(:after_fork) do
|
172
|
+
if defined?(ActiveRecord) && defined?(ActiveRecord::Base) && ActiveRecord::Base.respond_to?(:establish_connection)
|
173
|
+
begin
|
174
|
+
ActiveRecord::Base.establish_connection
|
175
|
+
rescue
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
### Parse CLI for default HTTP settings
|
181
|
+
Iodine::Base::CLI.parse if defined?(IODINE_PARSE_CLI) && IODINE_PARSE_CLI
|
182
|
+
|
183
|
+
### Set default port (if missing)
|
184
|
+
Iodine::DEFAULT_SETTINGS[:port] ||= (ENV["PORT"] || "3000")
|
185
|
+
|
186
|
+
### Set default binding (if missing)
|
187
|
+
Iodine::DEFAULT_SETTINGS[:address] ||= nil
|
188
|
+
|
189
|
+
### Initialize Redis if set in CLI
|
190
|
+
Iodine::PubSub.default = Iodine::PubSub::Redis.new(Iodine::DEFAULT_SETTINGS[:redis_], ping: Iodine::DEFAULT_SETTINGS[:redis_ping_]) if Iodine::DEFAULT_SETTINGS[:redis_]
|
191
|
+
|
192
|
+
### PID file generation
|
193
|
+
if Iodine::DEFAULT_SETTINGS[:pid_]
|
194
|
+
pid_filename = Iodine::DEFAULT_SETTINGS[:pid_]
|
195
|
+
Iodine::DEFAULT_SETTINGS.delete :pid_
|
196
|
+
pid_filename << "iodine.pid" if(pid_filename[-1] == '/')
|
197
|
+
if File.exist?(pid_filename)
|
198
|
+
raise "pid filename shold point to a valid file name (not a folder)!" if(!File.file?(pid_filename))
|
199
|
+
File.delete(pid_filename)
|
200
|
+
end
|
201
|
+
Iodine.on_state(:pre_start) do
|
202
|
+
IO.binwrite(pid_filename, "#{Process.pid}\r\n")
|
203
|
+
end
|
204
|
+
Iodine.on_state(:on_finish) do
|
205
|
+
File.delete(pid_filename)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
### Puma / Thin DSL compatibility - depracated (DSLs are evil)
|
210
|
+
|
211
|
+
if(!defined?(after_fork))
|
212
|
+
# @deprecated use {Iodine.on_state}.
|
213
|
+
#
|
214
|
+
# Performs a block of code whenever a new worker process spins up (performed once per worker).
|
215
|
+
def after_fork(*args, &block)
|
216
|
+
warn "after_fork is deprecated, use Iodine.on_state(:after_fork)."
|
217
|
+
Iodine.on_state(:after_fork, &block)
|
218
|
+
end
|
219
|
+
end
|
220
|
+
if(!defined?(after_fork_in_worker))
|
221
|
+
# @deprecated use {Iodine.on_state}.
|
222
|
+
#
|
223
|
+
# Performs a block of code whenever a new worker process spins up (performed once per worker).
|
224
|
+
def after_fork_in_worker(*args, &block)
|
225
|
+
warn "after_fork_in_worker is deprecated, use Iodine.on_state(:enter_child)."
|
226
|
+
Iodine.on_state(:enter_child, &block)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
if(!defined?(after_fork_in_master))
|
230
|
+
# @deprecated use {Iodine.on_state}.
|
231
|
+
#
|
232
|
+
# Performs a block of code whenever a new worker process spins up (performed once per worker).
|
233
|
+
def after_fork_in_master(*args, &block)
|
234
|
+
warn "after_fork_in_master is deprecated, use Iodine.on_state(:enter_master)."
|
235
|
+
Iodine.on_state(:enter_master, &block)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
if(!defined?(on_worker_boot))
|
239
|
+
# @deprecated use {Iodine.on_state}.
|
240
|
+
#
|
241
|
+
# Performs a block of code before a new worker process spins up (performed once per worker).
|
242
|
+
def on_worker_boot(*args, &block)
|
243
|
+
warn "on_worker_boot is deprecated, use Iodine.on_state(:after_fork)."
|
244
|
+
Iodine.on_state(:after_fork, &block)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
if(!defined?(on_worker_fork))
|
248
|
+
# @deprecated use {Iodine.on_state}.
|
249
|
+
#
|
250
|
+
# Performs a block of code before a new worker process spins up (performed once per worker).
|
251
|
+
def on_worker_fork(*args, &block)
|
252
|
+
warn "on_worker_fork is deprecated, use Iodine.on_state(:before_fork)."
|
253
|
+
Iodine.on_state(:before_fork, &block)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
if(!defined?(before_fork))
|
257
|
+
# @deprecated use {Iodine.on_state}.
|
258
|
+
#
|
259
|
+
# Performs a block of code just before a new worker process spins up (performed once per worker, in the master thread).
|
260
|
+
def before_fork(*args, &block)
|
261
|
+
warn "before_fork is deprecated, use Iodine.on_state(:before_fork)."
|
262
|
+
Iodine.on_state(:before_fork, &block)
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
|
267
|
+
#############
|
268
|
+
## At end of loading
|
269
|
+
|
270
|
+
### Load configuration filer
|
271
|
+
if Iodine::DEFAULT_SETTINGS[:conf_]
|
272
|
+
require Iodine::DEFAULT_SETTINGS[:conf_]
|
273
|
+
Iodine::DEFAULT_SETTINGS.delete :conf_
|
274
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'iodine' unless defined?(::Iodine::VERSION)
|
2
|
+
|
3
|
+
module Iodine
|
4
|
+
# Iodine's {Iodine::Rack} module provides a Rack compliant interface (connecting Iodine to Rack) for an HTTP and Websocket Server.
|
5
|
+
module Rack
|
6
|
+
|
7
|
+
# Runs a Rack app, as par the Rack handler requirements.
|
8
|
+
def self.run(app, options = {})
|
9
|
+
# nested applications... is that a thing?
|
10
|
+
Iodine.listen(service: :http, handler: app, port: options[:Port], address: options[:Host])
|
11
|
+
|
12
|
+
# start Iodine
|
13
|
+
Iodine.start
|
14
|
+
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
18
|
+
# patches an assumption by Rack, issue #98 code donated by @Shelvak (Néstor Coppi)
|
19
|
+
def self.shutdown
|
20
|
+
Iodine.stop
|
21
|
+
end
|
22
|
+
|
23
|
+
IODINE_RACK_LOADED = true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
ENV['RACK_HANDLER'] ||= 'iodine'
|
28
|
+
|
29
|
+
begin
|
30
|
+
::Rack::Handler.register('iodine', 'Iodine::Rack') if defined?(::Rack::Handler)
|
31
|
+
::Rack::Handler.register('Iodine', 'Iodine::Rack') if defined?(::Rack::Handler)
|
32
|
+
rescue StandardError
|
33
|
+
end
|
data/logo.png
ADDED
Binary file
|
metadata
ADDED
@@ -0,0 +1,284 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rage-iodine
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.7.58
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Boaz Segev
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-09-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '12.0'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '14.0'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '12.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '14.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: minitest
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '5'
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '6.0'
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '5'
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '6.0'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rspec
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 3.9.0
|
60
|
+
- - "<"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '4.0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 3.9.0
|
70
|
+
- - "<"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '4.0'
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: spec
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 5.3.0
|
80
|
+
- - "<"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '6.0'
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 5.3.0
|
90
|
+
- - "<"
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '6.0'
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: rake-compiler
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '1'
|
100
|
+
- - "<"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '2.0'
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1'
|
110
|
+
- - "<"
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '2.0'
|
113
|
+
description: A fast HTTP / Websocket Server with built-in Pub/Sub support (with or
|
114
|
+
without Redis), static file support and many other features, optimized for Ruby
|
115
|
+
MRI on Linux / BSD / macOS / Windows
|
116
|
+
email:
|
117
|
+
- bo@plezi.io
|
118
|
+
executables:
|
119
|
+
- iodine
|
120
|
+
extensions:
|
121
|
+
- ext/iodine/extconf.rb
|
122
|
+
extra_rdoc_files: []
|
123
|
+
files:
|
124
|
+
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
125
|
+
- ".github/workflows/ruby.yml"
|
126
|
+
- ".gitignore"
|
127
|
+
- ".rspec"
|
128
|
+
- ".yardopts"
|
129
|
+
- CHANGELOG.md
|
130
|
+
- Gemfile
|
131
|
+
- LICENSE.txt
|
132
|
+
- LIMITS.md
|
133
|
+
- README.md
|
134
|
+
- Rakefile
|
135
|
+
- SPEC-PubSub-Draft.md
|
136
|
+
- SPEC-WebSocket-Draft.md
|
137
|
+
- bin/console
|
138
|
+
- bin/info.md
|
139
|
+
- bin/mustache_bench.rb
|
140
|
+
- bin/poc/Gemfile.lock
|
141
|
+
- bin/poc/README.md
|
142
|
+
- bin/poc/config.ru
|
143
|
+
- bin/poc/gemfile
|
144
|
+
- bin/poc/www/index.html
|
145
|
+
- examples/async_task.ru
|
146
|
+
- examples/bates/README.md
|
147
|
+
- examples/bates/config.ru
|
148
|
+
- examples/bates/david+bold.pdf
|
149
|
+
- examples/bates/public/drop-pdf.png
|
150
|
+
- examples/bates/public/index.html
|
151
|
+
- examples/config.ru
|
152
|
+
- examples/echo.ru
|
153
|
+
- examples/etag.ru
|
154
|
+
- examples/hello.ru
|
155
|
+
- examples/pubsub_engine.ru
|
156
|
+
- examples/rack3.ru
|
157
|
+
- examples/redis.ru
|
158
|
+
- examples/shootout.ru
|
159
|
+
- examples/sub-protocols.ru
|
160
|
+
- examples/tcp_client.rb
|
161
|
+
- examples/x-sendfile.ru
|
162
|
+
- exe/iodine
|
163
|
+
- ext/iodine/extconf.rb
|
164
|
+
- ext/iodine/fio.c
|
165
|
+
- ext/iodine/fio.h
|
166
|
+
- ext/iodine/fio_cli.c
|
167
|
+
- ext/iodine/fio_cli.h
|
168
|
+
- ext/iodine/fio_json_parser.h
|
169
|
+
- ext/iodine/fio_siphash.c
|
170
|
+
- ext/iodine/fio_siphash.h
|
171
|
+
- ext/iodine/fio_tls.h
|
172
|
+
- ext/iodine/fio_tls_missing.c
|
173
|
+
- ext/iodine/fio_tls_openssl.c
|
174
|
+
- ext/iodine/fio_tmpfile.h
|
175
|
+
- ext/iodine/fiobj.h
|
176
|
+
- ext/iodine/fiobj4fio.h
|
177
|
+
- ext/iodine/fiobj_ary.c
|
178
|
+
- ext/iodine/fiobj_ary.h
|
179
|
+
- ext/iodine/fiobj_data.c
|
180
|
+
- ext/iodine/fiobj_data.h
|
181
|
+
- ext/iodine/fiobj_hash.c
|
182
|
+
- ext/iodine/fiobj_hash.h
|
183
|
+
- ext/iodine/fiobj_json.c
|
184
|
+
- ext/iodine/fiobj_json.h
|
185
|
+
- ext/iodine/fiobj_mem.h
|
186
|
+
- ext/iodine/fiobj_mustache.c
|
187
|
+
- ext/iodine/fiobj_mustache.h
|
188
|
+
- ext/iodine/fiobj_numbers.c
|
189
|
+
- ext/iodine/fiobj_numbers.h
|
190
|
+
- ext/iodine/fiobj_str.c
|
191
|
+
- ext/iodine/fiobj_str.h
|
192
|
+
- ext/iodine/fiobject.c
|
193
|
+
- ext/iodine/fiobject.h
|
194
|
+
- ext/iodine/hpack.h
|
195
|
+
- ext/iodine/http.c
|
196
|
+
- ext/iodine/http.h
|
197
|
+
- ext/iodine/http1.c
|
198
|
+
- ext/iodine/http1.h
|
199
|
+
- ext/iodine/http1_parser.h
|
200
|
+
- ext/iodine/http_internal.c
|
201
|
+
- ext/iodine/http_internal.h
|
202
|
+
- ext/iodine/http_mime_parser.h
|
203
|
+
- ext/iodine/iodine.c
|
204
|
+
- ext/iodine/iodine.h
|
205
|
+
- ext/iodine/iodine_caller.c
|
206
|
+
- ext/iodine/iodine_caller.h
|
207
|
+
- ext/iodine/iodine_connection.c
|
208
|
+
- ext/iodine/iodine_connection.h
|
209
|
+
- ext/iodine/iodine_defer.c
|
210
|
+
- ext/iodine/iodine_defer.h
|
211
|
+
- ext/iodine/iodine_fiobj2rb.h
|
212
|
+
- ext/iodine/iodine_helpers.c
|
213
|
+
- ext/iodine/iodine_helpers.h
|
214
|
+
- ext/iodine/iodine_http.c
|
215
|
+
- ext/iodine/iodine_http.h
|
216
|
+
- ext/iodine/iodine_json.c
|
217
|
+
- ext/iodine/iodine_json.h
|
218
|
+
- ext/iodine/iodine_mustache.c
|
219
|
+
- ext/iodine/iodine_mustache.h
|
220
|
+
- ext/iodine/iodine_pubsub.c
|
221
|
+
- ext/iodine/iodine_pubsub.h
|
222
|
+
- ext/iodine/iodine_rack_io.c
|
223
|
+
- ext/iodine/iodine_rack_io.h
|
224
|
+
- ext/iodine/iodine_store.c
|
225
|
+
- ext/iodine/iodine_store.h
|
226
|
+
- ext/iodine/iodine_tcp.c
|
227
|
+
- ext/iodine/iodine_tcp.h
|
228
|
+
- ext/iodine/iodine_tls.c
|
229
|
+
- ext/iodine/iodine_tls.h
|
230
|
+
- ext/iodine/mustache_parser.h
|
231
|
+
- ext/iodine/redis_engine.c
|
232
|
+
- ext/iodine/redis_engine.h
|
233
|
+
- ext/iodine/resp_parser.h
|
234
|
+
- ext/iodine/scheduler.c
|
235
|
+
- ext/iodine/scheduler.h
|
236
|
+
- ext/iodine/websocket_parser.h
|
237
|
+
- ext/iodine/websockets.c
|
238
|
+
- ext/iodine/websockets.h
|
239
|
+
- iodine.gemspec
|
240
|
+
- lib/iodine.rb
|
241
|
+
- lib/iodine/connection.rb
|
242
|
+
- lib/iodine/json.rb
|
243
|
+
- lib/iodine/mustache.rb
|
244
|
+
- lib/iodine/pubsub.rb
|
245
|
+
- lib/iodine/rack_utils.rb
|
246
|
+
- lib/iodine/tls.rb
|
247
|
+
- lib/iodine/version.rb
|
248
|
+
- lib/rack/handler/iodine.rb
|
249
|
+
- logo.png
|
250
|
+
homepage: https://github.com/rage-rb/iodine
|
251
|
+
licenses:
|
252
|
+
- MIT
|
253
|
+
metadata:
|
254
|
+
allowed_push_host: https://rubygems.org
|
255
|
+
post_install_message: |-
|
256
|
+
Thank you for installing Iodine 1.7.58.
|
257
|
+
Remember: if iodine supports your business, it's only fair to give value back (code contributions / donations).
|
258
|
+
rdoc_options: []
|
259
|
+
require_paths:
|
260
|
+
- lib
|
261
|
+
- ext
|
262
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
263
|
+
requirements:
|
264
|
+
- - ">="
|
265
|
+
- !ruby/object:Gem::Version
|
266
|
+
version: 2.2.2
|
267
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
268
|
+
requirements:
|
269
|
+
- - ">="
|
270
|
+
- !ruby/object:Gem::Version
|
271
|
+
version: '0'
|
272
|
+
requirements:
|
273
|
+
- 'A Unix based system: Linux / macOS / BSD.'
|
274
|
+
- An updated C compiler.
|
275
|
+
- Ruby >= 2.3.8 (Ruby EOL).
|
276
|
+
- Ruby >= 2.5.0 recommended.
|
277
|
+
- TLS requires OpenSSL >= 1.1.0.
|
278
|
+
- Or Windows with Ruby >= 3.0.0 build with MingW and MingW as compiler.
|
279
|
+
rubygems_version: 3.4.10
|
280
|
+
signing_key:
|
281
|
+
specification_version: 4
|
282
|
+
summary: iodine - a fast HTTP / Websocket Server with Pub/Sub support, optimized for
|
283
|
+
Ruby MRI on Linux / BSD / Windows
|
284
|
+
test_files: []
|