isomorfeus-transport 2.1.0 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ca90b01b8e0190145be6337a5d426a696d14fdf930d27459580c68b1c79f7e0
4
- data.tar.gz: 96a02a4bc0c826f8099464c2186c4d43465a22d23acbc7b78427e765453f47b5
3
+ metadata.gz: 6434b38ce5be03fb545a2db27f311f06ce836417c0c2eebc9bd6ae8097b674a7
4
+ data.tar.gz: e69c76539a86c6452b6b78f69f1c960e319a500c0fca5552e2d635ed72e359b2
5
5
  SHA512:
6
- metadata.gz: eb3a558d2a4932891262951936b0bfcd58dca2c76dca299bc4d289847070b1fac98deece4714424b727dc6d9545ca500c01a367b057c0eef89c45ddea08b9190
7
- data.tar.gz: 43d8418632c1e4b848b16146f2e4367e5c0a80ba7e8d2d78a0699942206206bcf4630437733a4e4405440e332da16a9fa2740fad9eaa91a7ebfdc16693106221
6
+ metadata.gz: dfbc2ee59155e8dd136db2b13a0c0b7efcf78fcfe8e5aca03e418985a3f86f7794523ab846e75f4ce323c79d41151494b0ae420e820f658e9983619d543f2c09
7
+ data.tar.gz: b884f387a05d4155dc1cd23930161bffc8c0f69eda8f25d943acc0a7e56787eaae1acd1c4670155048b4683fd9b56173c471695fcf443ab7f8493d6602d159d3
@@ -21,9 +21,8 @@ module Isomorfeus
21
21
 
22
22
  def self.process_response(response_hash)
23
23
  response_hash[:response][:agent_ids].keys.each do |agent_id|
24
- agent = Isomorfeus::Transport::RequestAgent.get!(agent_id)
25
- Isomorfeus::Transport.unregister_request_in_progress(agent_id)
26
- unless agent.promise.realized?
24
+ agent = Isomorfeus::Transport::RequestAgent.get(agent_id)
25
+ if agent && !agent.promise.realized?
27
26
  agent.full_response = response_hash
28
27
  agent.response = response_hash[:response][:agent_ids][agent_id]
29
28
  agent.promise.resolve(agent)
@@ -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
@@ -10,7 +10,7 @@ module Isomorfeus
10
10
  agents[object_id]
11
11
  end
12
12
 
13
- def get!(object_id)
13
+ def del!(object_id)
14
14
  agents.delete(object_id.to_s)
15
15
  end
16
16
  end
@@ -27,7 +27,17 @@ module Isomorfeus
27
27
  def initialize(request = nil)
28
28
  @id = object_id.to_s
29
29
  self.class.agents[@id] = self
30
+ current_agent = self
30
31
  @promise = Promise.new
32
+ @promise.then do
33
+ Isomorfeus::Transport.unregister_request_in_progress(current_agent.id)
34
+ Isomorfeus::Transport::RequestAgent.del!(current_agent.id)
35
+ end
36
+ @promise.fail do |e|
37
+ STDERR.puts "#{e}"
38
+ Isomorfeus::Transport.unregister_request_in_progress(current_agent.id)
39
+ Isomorfeus::Transport::RequestAgent.del!(current_agent.id)
40
+ end
31
41
  @request = request
32
42
  @sent = false
33
43
  end
@@ -37,6 +47,8 @@ module Isomorfeus
37
47
  self.processed = true
38
48
  Isomorfeus.raise_error(message: self.response[:error]) if self.response.key?(:error)
39
49
  self.result = block.call(self)
50
+ @promise.resolve(self) unless @promise.realized?
51
+ self.result
40
52
  end
41
53
  end
42
54
  end
@@ -9,10 +9,12 @@ module Isomorfeus
9
9
 
10
10
  def on_message(client, data)
11
11
  if Isomorfeus.development?
12
- write_lock = Isomorfeus.zeitwerk_lock.try_write_lock
13
- if write_lock
14
- Isomorfeus.zeitwerk.reload
15
- Isomorfeus.zeitwerk_lock.release_write_lock
12
+ if Isomorfeus.server_requires_reload?
13
+ write_lock = Isomorfeus.zeitwerk_lock.try_write_lock
14
+ if write_lock
15
+ Isomorfeus.zeitwerk.reload
16
+ Isomorfeus.zeitwerk_lock.release_write_lock
17
+ end
16
18
  end
17
19
  Isomorfeus.zeitwerk_lock.acquire_read_lock
18
20
  end
@@ -1,5 +1,5 @@
1
1
  module Isomorfeus
2
2
  module Transport
3
- VERSION = '2.1.0'
3
+ VERSION = '2.2.2'
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.0
4
+ version: 2.2.2
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-14 00:00:00.000000000 Z
11
+ date: 2022-02-21 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.10
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.10
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.34
131
+ version: 10.6.45
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.34
138
+ version: 10.6.45
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.0
145
+ version: 2.2.2
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.0
152
+ version: 2.2.2
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.15
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
146
174
  type: :runtime
147
175
  prerelease: false
148
176
  version_requirements: !ruby/object:Gem::Requirement
149
177
  requirements:
150
178
  - - "~>"
151
179
  - !ruby/object:Gem::Version
152
- version: 4.1.15
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
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
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.0
229
+ version: 2.2.2
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.0
236
+ version: 2.2.2
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
@@ -277,7 +334,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
277
334
  - !ruby/object:Gem::Version
278
335
  version: '0'
279
336
  requirements: []
280
- rubygems_version: 3.3.3
337
+ rubygems_version: 3.3.7
281
338
  signing_key:
282
339
  specification_version: 4
283
340
  summary: Channels, authetication and various transport options for Isomorfeus.