rage-iodine 1.7.58

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  3. data/.github/workflows/ruby.yml +42 -0
  4. data/.gitignore +20 -0
  5. data/.rspec +2 -0
  6. data/.yardopts +8 -0
  7. data/CHANGELOG.md +1098 -0
  8. data/Gemfile +11 -0
  9. data/LICENSE.txt +21 -0
  10. data/LIMITS.md +41 -0
  11. data/README.md +782 -0
  12. data/Rakefile +23 -0
  13. data/SPEC-PubSub-Draft.md +159 -0
  14. data/SPEC-WebSocket-Draft.md +239 -0
  15. data/bin/console +22 -0
  16. data/bin/info.md +353 -0
  17. data/bin/mustache_bench.rb +100 -0
  18. data/bin/poc/Gemfile.lock +23 -0
  19. data/bin/poc/README.md +37 -0
  20. data/bin/poc/config.ru +66 -0
  21. data/bin/poc/gemfile +1 -0
  22. data/bin/poc/www/index.html +57 -0
  23. data/examples/async_task.ru +92 -0
  24. data/examples/bates/README.md +3 -0
  25. data/examples/bates/config.ru +342 -0
  26. data/examples/bates/david+bold.pdf +0 -0
  27. data/examples/bates/public/drop-pdf.png +0 -0
  28. data/examples/bates/public/index.html +600 -0
  29. data/examples/config.ru +59 -0
  30. data/examples/echo.ru +59 -0
  31. data/examples/etag.ru +16 -0
  32. data/examples/hello.ru +29 -0
  33. data/examples/pubsub_engine.ru +81 -0
  34. data/examples/rack3.ru +12 -0
  35. data/examples/redis.ru +70 -0
  36. data/examples/shootout.ru +73 -0
  37. data/examples/sub-protocols.ru +90 -0
  38. data/examples/tcp_client.rb +66 -0
  39. data/examples/x-sendfile.ru +14 -0
  40. data/exe/iodine +280 -0
  41. data/ext/iodine/extconf.rb +110 -0
  42. data/ext/iodine/fio.c +12096 -0
  43. data/ext/iodine/fio.h +6390 -0
  44. data/ext/iodine/fio_cli.c +431 -0
  45. data/ext/iodine/fio_cli.h +189 -0
  46. data/ext/iodine/fio_json_parser.h +687 -0
  47. data/ext/iodine/fio_siphash.c +157 -0
  48. data/ext/iodine/fio_siphash.h +37 -0
  49. data/ext/iodine/fio_tls.h +129 -0
  50. data/ext/iodine/fio_tls_missing.c +649 -0
  51. data/ext/iodine/fio_tls_openssl.c +1056 -0
  52. data/ext/iodine/fio_tmpfile.h +50 -0
  53. data/ext/iodine/fiobj.h +44 -0
  54. data/ext/iodine/fiobj4fio.h +21 -0
  55. data/ext/iodine/fiobj_ary.c +333 -0
  56. data/ext/iodine/fiobj_ary.h +139 -0
  57. data/ext/iodine/fiobj_data.c +1185 -0
  58. data/ext/iodine/fiobj_data.h +167 -0
  59. data/ext/iodine/fiobj_hash.c +409 -0
  60. data/ext/iodine/fiobj_hash.h +176 -0
  61. data/ext/iodine/fiobj_json.c +622 -0
  62. data/ext/iodine/fiobj_json.h +68 -0
  63. data/ext/iodine/fiobj_mem.h +71 -0
  64. data/ext/iodine/fiobj_mustache.c +317 -0
  65. data/ext/iodine/fiobj_mustache.h +62 -0
  66. data/ext/iodine/fiobj_numbers.c +344 -0
  67. data/ext/iodine/fiobj_numbers.h +127 -0
  68. data/ext/iodine/fiobj_str.c +433 -0
  69. data/ext/iodine/fiobj_str.h +172 -0
  70. data/ext/iodine/fiobject.c +620 -0
  71. data/ext/iodine/fiobject.h +654 -0
  72. data/ext/iodine/hpack.h +1923 -0
  73. data/ext/iodine/http.c +2736 -0
  74. data/ext/iodine/http.h +1019 -0
  75. data/ext/iodine/http1.c +825 -0
  76. data/ext/iodine/http1.h +29 -0
  77. data/ext/iodine/http1_parser.h +1835 -0
  78. data/ext/iodine/http_internal.c +1279 -0
  79. data/ext/iodine/http_internal.h +248 -0
  80. data/ext/iodine/http_mime_parser.h +350 -0
  81. data/ext/iodine/iodine.c +1433 -0
  82. data/ext/iodine/iodine.h +64 -0
  83. data/ext/iodine/iodine_caller.c +218 -0
  84. data/ext/iodine/iodine_caller.h +27 -0
  85. data/ext/iodine/iodine_connection.c +941 -0
  86. data/ext/iodine/iodine_connection.h +55 -0
  87. data/ext/iodine/iodine_defer.c +420 -0
  88. data/ext/iodine/iodine_defer.h +6 -0
  89. data/ext/iodine/iodine_fiobj2rb.h +120 -0
  90. data/ext/iodine/iodine_helpers.c +282 -0
  91. data/ext/iodine/iodine_helpers.h +12 -0
  92. data/ext/iodine/iodine_http.c +1280 -0
  93. data/ext/iodine/iodine_http.h +23 -0
  94. data/ext/iodine/iodine_json.c +302 -0
  95. data/ext/iodine/iodine_json.h +6 -0
  96. data/ext/iodine/iodine_mustache.c +567 -0
  97. data/ext/iodine/iodine_mustache.h +6 -0
  98. data/ext/iodine/iodine_pubsub.c +580 -0
  99. data/ext/iodine/iodine_pubsub.h +26 -0
  100. data/ext/iodine/iodine_rack_io.c +273 -0
  101. data/ext/iodine/iodine_rack_io.h +20 -0
  102. data/ext/iodine/iodine_store.c +142 -0
  103. data/ext/iodine/iodine_store.h +20 -0
  104. data/ext/iodine/iodine_tcp.c +346 -0
  105. data/ext/iodine/iodine_tcp.h +13 -0
  106. data/ext/iodine/iodine_tls.c +261 -0
  107. data/ext/iodine/iodine_tls.h +13 -0
  108. data/ext/iodine/mustache_parser.h +1546 -0
  109. data/ext/iodine/redis_engine.c +957 -0
  110. data/ext/iodine/redis_engine.h +79 -0
  111. data/ext/iodine/resp_parser.h +317 -0
  112. data/ext/iodine/scheduler.c +173 -0
  113. data/ext/iodine/scheduler.h +6 -0
  114. data/ext/iodine/websocket_parser.h +506 -0
  115. data/ext/iodine/websockets.c +752 -0
  116. data/ext/iodine/websockets.h +185 -0
  117. data/iodine.gemspec +50 -0
  118. data/lib/iodine/connection.rb +61 -0
  119. data/lib/iodine/json.rb +42 -0
  120. data/lib/iodine/mustache.rb +113 -0
  121. data/lib/iodine/pubsub.rb +55 -0
  122. data/lib/iodine/rack_utils.rb +43 -0
  123. data/lib/iodine/tls.rb +16 -0
  124. data/lib/iodine/version.rb +3 -0
  125. data/lib/iodine.rb +274 -0
  126. data/lib/rack/handler/iodine.rb +33 -0
  127. data/logo.png +0 -0
  128. 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: []