isomorfeus-transport 2.1.1 → 2.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 248d55d33e660304657af70d2cff956e834bea7b1fc79004c6f0922e9ac5ce14
4
- data.tar.gz: 125ddf417c613bdeec962604212db44a71bf37f940bbf9b35b56feb2385c7b10
3
+ metadata.gz: 73dc7fdfde8b9fd88f0d5c0771e94089ac870ab439497e941c39a8086461763f
4
+ data.tar.gz: 4a0f6bc9d44166a1e6362829ac6f2309296e043d7cd57de3c460e1956f964ea7
5
5
  SHA512:
6
- metadata.gz: a9f11baa08314ac284180432ec36ff641e2544c5f592ef17cd6832ce408dbddec51d401a278067f9f2fe68cdd5bebccad974143fa5416179c7cdca6b04ba7ede
7
- data.tar.gz: 7fd94cf7fcec1fdb3c0b81c755b6c39330fe437cd2c4a9d9673fa0bc45025ddba6863d88871563234aea59d754d980af88b616f698d03bc39abd44b4d02a2052
6
+ metadata.gz: ccd348bcdcc4ba424d1d3f348a331f36c47d5d95ab7dbc6e0f3b92ec866896395f3fdaa550c6ce9408e89686fc5f09d0109c3824aa9b51de9f1350ce757fb13e
7
+ data.tar.gz: 95c448f2c43a817f0d7146c4b0c328827601257c37cb503e95909222792f866cfaeb23b3e94bfc507c063d72ce7a0616435d21bae9e5f56b12775a532dce980a
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Isomorfeus
4
+ module Transport
5
+ class CompressorRack
6
+ C_ENCODINGS = %w[br gzip identity].freeze
7
+
8
+ def initialize(app, options = {})
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ status, headers, body = @app.call(env)
14
+ headers = Rack::Utils::HeaderHash[headers]
15
+
16
+
17
+ unless should_deflate?(env, status, headers, body)
18
+ return [status, headers, body]
19
+ end
20
+
21
+ request = Rack::Request.new(env)
22
+
23
+ encoding = Rack::Utils.select_best_encoding(C_ENCODINGS,
24
+ request.accept_encoding)
25
+
26
+ vary = headers["Vary"].to_s.split(",").map(&:strip)
27
+ unless vary.include?("*") || vary.include?("Accept-Encoding")
28
+ headers["Vary"] = vary.push("Accept-Encoding").join(",")
29
+ end
30
+
31
+ case encoding
32
+ when "br"
33
+ headers['Content-Encoding'] = "br"
34
+ headers.delete(Rack::CONTENT_LENGTH)
35
+ [status, headers, BrotliStream.new(body, @sync)]
36
+ when "gzip"
37
+ headers['Content-Encoding'] = "gzip"
38
+ headers.delete(Rack::CONTENT_LENGTH)
39
+ mtime = headers["Last-Modified"]
40
+ mtime = Time.httpdate(mtime).to_i if mtime
41
+ [status, headers, GzipStream.new(body, mtime, @sync)]
42
+ when "identity"
43
+ [status, headers, body]
44
+ when nil
45
+ message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found."
46
+ bp = Rack::BodyProxy.new([message]) { body.close if body.respond_to?(:close) }
47
+ [406, { CONTENT_TYPE => "text/plain", CONTENT_LENGTH => message.length.to_s }, bp]
48
+ end
49
+ end
50
+
51
+ class BrotliStream
52
+ BUFFER_LENGTH = 128 * 1_024
53
+
54
+ def initialize(body, sync)
55
+ @body = body
56
+ @sync
57
+ end
58
+
59
+ def each(&block)
60
+ @writer = block
61
+ brotli = ::Brotli::Writer.new(self, quality: 5)
62
+
63
+ if @body.is_a? ::File
64
+ while part = @body.read(BUFFER_LENGTH)
65
+ brotli.write(part)
66
+ brotli.flush if @sync
67
+ end
68
+ else
69
+ @body.each do |part|
70
+ next if part.empty?
71
+ brotli.write(part)
72
+ brotli.flush if @sync
73
+ end
74
+ end
75
+ ensure
76
+ brotli.close
77
+ end
78
+
79
+ def write(data)
80
+ @writer.call(data)
81
+ end
82
+
83
+ def close
84
+ @body.close if @body.respond_to?(:close)
85
+ end
86
+ end
87
+
88
+ class GzipStream
89
+ BUFFER_LENGTH = 128 * 1_024
90
+
91
+ def initialize(body, mtime, sync)
92
+ @body = body
93
+ @mtime = mtime
94
+ @sync = sync
95
+ end
96
+
97
+ def each(&block)
98
+ @writer = block
99
+ gzip = ::Zlib::GzipWriter.new(self)
100
+ gzip.mtime = @mtime if @mtime
101
+
102
+ if @body.is_a? ::File
103
+ while part = @body.read(BUFFER_LENGTH)
104
+ gzip.write(part)
105
+ gzip.flush if @sync
106
+ end
107
+ else
108
+ @body.each do |part|
109
+ next if part.empty?
110
+ gzip.write(part)
111
+ gzip.flush if @sync
112
+ end
113
+ end
114
+ ensure
115
+ gzip.close
116
+ end
117
+
118
+ def write(data)
119
+ @writer.call(data)
120
+ end
121
+
122
+ def close
123
+ @body.close if @body.respond_to?(:close)
124
+ end
125
+ end
126
+
127
+ private
128
+
129
+ def should_deflate?(env, status, headers, body)
130
+ if Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) ||
131
+ /\bno-transform\b/.match?(headers['Cache-Control'].to_s) ||
132
+ headers['Content-Encoding']&.!~(/\bidentity\b/)
133
+ return false
134
+ end
135
+ return false if headers[Rack::CONTENT_LENGTH] == '0'
136
+ true
137
+ end
138
+ end
139
+ end
140
+ end
@@ -2,9 +2,9 @@ module Isomorfeus
2
2
  module Transport
3
3
  module Middlewares
4
4
  def use_isomorfeus_middlewares
5
- puts "Isomorfeus is using the following middlewares:"
5
+ puts "Isomorfeus is using the following middlewares:" if Isomorfeus.production?
6
6
  Isomorfeus.middlewares.each do |isomorfeus_middleware|
7
- puts "#{isomorfeus_middleware}"
7
+ puts "#{isomorfeus_middleware}" if Isomorfeus.production?
8
8
  use isomorfeus_middleware
9
9
  end
10
10
  end
@@ -70,9 +70,14 @@ module Isomorfeus
70
70
  result
71
71
  end
72
72
  rescue Exception => e
73
- # TODO
74
- Isomorfeus.raise_error(error: e)
75
- return [500, {}, '']
73
+ e_text = "#{e.class}: #{e.message}\n #{e.backtrace.join("\n")}"
74
+ STDERR.puts e_text
75
+ message = if Isomorfeus.production?
76
+ "<html><head><title>Error</title></head><body>Sorry, a error occured!</body></html>"
77
+ else
78
+ "<html><head><title>#{e.class}</title></head><body><pre>#{e_text}</pre></body></html>"
79
+ end
80
+ return [500, { Rack::CONTENT_TYPE => "text/html", Rack::CONTENT_LENGTH => message.length.to_s }, [message]]
76
81
  end
77
82
  end
78
83
  end
@@ -1,5 +1,5 @@
1
1
  module Isomorfeus
2
2
  module Transport
3
- VERSION = '2.1.1'
3
+ VERSION = '2.2.0'
4
4
  end
5
5
  end
@@ -26,7 +26,14 @@ else
26
26
  require 'ostruct'
27
27
  require 'socket'
28
28
  require 'sorted_set'
29
+ require 'time'
30
+ require 'brotli'
31
+ require 'zlib'
29
32
  require 'oj'
33
+ require 'rack'
34
+ require 'rack/body_proxy'
35
+ require 'rack/request'
36
+ require 'rack/utils'
30
37
  require 'active_support'
31
38
  require 'isomorfeus-asset-manager'
32
39
  require 'isomorfeus-hamster'
@@ -44,10 +51,12 @@ else
44
51
  require 'isomorfeus/transport/websocket_client'
45
52
  require 'isomorfeus/transport'
46
53
  require 'isomorfeus/transport/rack_middleware'
54
+ require 'isomorfeus/transport/compressor_rack'
47
55
  require 'isomorfeus/transport/middlewares'
48
56
 
49
- Isomorfeus.add_middleware(Isomorfeus::Transport::RackMiddleware)
50
57
  Isomorfeus.add_middleware(Isomorfeus::AssetManager::RackMiddleware)
58
+ Isomorfeus.add_middleware(Isomorfeus::Transport::CompressorRack)
59
+ Isomorfeus.add_middleware(Isomorfeus::Transport::RackMiddleware)
51
60
 
52
61
  require 'lucid_handler/mixin'
53
62
  require 'lucid_handler/base'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isomorfeus-transport
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-16 00:00:00.000000000 Z
11
+ date: 2022-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 3.1.16
41
+ - !ruby/object:Gem::Dependency
42
+ name: brotli
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.4.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.4.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: isomorfeus-iodine
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -86,70 +100,98 @@ dependencies:
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 0.14.12
103
+ version: 0.14.17
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: 0.14.12
110
+ version: 0.14.17
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: isomorfeus-hamster
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: 0.6.4
117
+ version: 0.6.6
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: 0.6.4
124
+ version: 0.6.6
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: isomorfeus-preact
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: 10.6.36
131
+ version: 10.6.40
118
132
  type: :runtime
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
136
  - - "~>"
123
137
  - !ruby/object:Gem::Version
124
- version: 10.6.36
138
+ version: 10.6.40
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: isomorfeus-policy
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - '='
130
144
  - !ruby/object:Gem::Version
131
- version: 2.1.1
145
+ version: 2.2.0
132
146
  type: :runtime
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - '='
137
151
  - !ruby/object:Gem::Version
138
- version: 2.1.1
152
+ version: 2.2.0
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: isomorfeus-redux
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
157
  - - "~>"
144
158
  - !ruby/object:Gem::Version
145
- version: 4.1.17
159
+ version: 4.1.18
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 4.1.18
167
+ - !ruby/object:Gem::Dependency
168
+ name: isomorfeus-speednode
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 0.5.2
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 0.5.2
181
+ - !ruby/object:Gem::Dependency
182
+ name: rack
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 2.2.3
146
188
  type: :runtime
147
189
  prerelease: false
148
190
  version_requirements: !ruby/object:Gem::Requirement
149
191
  requirements:
150
192
  - - "~>"
151
193
  - !ruby/object:Gem::Version
152
- version: 4.1.17
194
+ version: 2.2.3
153
195
  - !ruby/object:Gem::Dependency
154
196
  name: sorted_set
155
197
  requirement: !ruby/object:Gem::Requirement
@@ -164,20 +206,34 @@ dependencies:
164
206
  - - "~>"
165
207
  - !ruby/object:Gem::Version
166
208
  version: 1.0.3
209
+ - !ruby/object:Gem::Dependency
210
+ name: zlib
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: 2.1.1
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: 2.1.1
167
223
  - !ruby/object:Gem::Dependency
168
224
  name: isomorfeus
169
225
  requirement: !ruby/object:Gem::Requirement
170
226
  requirements:
171
227
  - - '='
172
228
  - !ruby/object:Gem::Version
173
- version: 2.1.1
229
+ version: 2.2.0
174
230
  type: :development
175
231
  prerelease: false
176
232
  version_requirements: !ruby/object:Gem::Requirement
177
233
  requirements:
178
234
  - - '='
179
235
  - !ruby/object:Gem::Version
180
- version: 2.1.1
236
+ version: 2.2.0
181
237
  - !ruby/object:Gem::Dependency
182
238
  name: rake
183
239
  requirement: !ruby/object:Gem::Requirement
@@ -198,14 +254,14 @@ dependencies:
198
254
  requirements:
199
255
  - - "~>"
200
256
  - !ruby/object:Gem::Version
201
- version: 3.10.0
257
+ version: 3.11.0
202
258
  type: :development
203
259
  prerelease: false
204
260
  version_requirements: !ruby/object:Gem::Requirement
205
261
  requirements:
206
262
  - - "~>"
207
263
  - !ruby/object:Gem::Version
208
- version: 3.10.0
264
+ version: 3.11.0
209
265
  description: Channels, authetication and various transport options for Isomorfeus.
210
266
  email: jan@kursator.de
211
267
  executables: []
@@ -217,6 +273,7 @@ files:
217
273
  - lib/isomorfeus-transport.rb
218
274
  - lib/isomorfeus/transport.rb
219
275
  - lib/isomorfeus/transport/client_processor.rb
276
+ - lib/isomorfeus/transport/compressor_rack.rb
220
277
  - lib/isomorfeus/transport/config.rb
221
278
  - lib/isomorfeus/transport/hamster_session_store.rb
222
279
  - lib/isomorfeus/transport/handler/authentication_handler.rb