isomorfeus-react 16.8.7 → 16.8.8

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: 7b6a6327262636d63a8a79986b340feace3ed8e4f003c0ec09e7b72aa050b1d3
4
- data.tar.gz: b0891c2aa9d5c60200ed92de5af5c1b44d38ae0066622ae80dba36a5f7b8d478
3
+ metadata.gz: ade4ec53c51f197488b13e348ee86d99f89bb618207e8bee8c63a10fbedc5ef0
4
+ data.tar.gz: e8a0a41bc73cbacca961b40b233ac7a9b43c075fd731ed73cbf5c803271aa129
5
5
  SHA512:
6
- metadata.gz: ab69b514a1b0bbf51fefef42920cb73ee73cc381573e4f33288e32948cfd546c97de5d97c0ff77fd47db490e00445249932c9e3a6c3e822c34ccad74cb04d241
7
- data.tar.gz: 5df9e208f6c011b3720ee3ee05fcec0473db96566970899a232b4be884192eedd563290f7d47f374055d83c255dd4afee2a1026cd75599503bee4941b110a4c3
6
+ metadata.gz: '0604568cd6bcc6679a05aa5d17c713b521420cc00f81bd1a606e0ed63e30a936fe8acb192bc410dac1a5f749d77d1f5f96d9cb1f70e72d25344b1669bbe5c160'
7
+ data.tar.gz: 11a1438224aa6661e0fc3c19dd14083b1840f7f687f83bb68f8883833e2afeba3aeaa8b0b101f7a43220dee228ffd249b778bfe1dc82d0282738774a2cd98fc9
@@ -1,4 +1,5 @@
1
1
  require 'opal'
2
+ require 'opal-autoloader'
2
3
  require 'native'
3
4
  require 'active_support/core_ext/string'
4
5
  require 'react/active_support_support'
@@ -53,3 +54,4 @@ require 'react/memo_component/creator'
53
54
  require 'react/memo_component/mixin'
54
55
  require 'react/memo_component/base'
55
56
 
57
+ Opal::Autoloader.add_load_path('components')
@@ -7,6 +7,7 @@ else
7
7
  require 'oj'
8
8
  require 'opal'
9
9
  require 'opal-activesupport'
10
+ require 'opal-autoloader'
10
11
  require 'opal-browser'
11
12
  require 'isomorfeus-redux'
12
13
  require 'isomorfeus-speednode'
@@ -15,7 +16,7 @@ else
15
16
 
16
17
  Isomorfeus.env = ENV['RACK_ENV']
17
18
 
18
- if Isomorfeus.env == 'production'
19
+ if Isomorfeus.production?
19
20
  Isomorfeus.server_side_rendering = true
20
21
  else
21
22
  Isomorfeus.server_side_rendering = false
@@ -14,6 +14,10 @@ module Isomorfeus
14
14
  end
15
15
 
16
16
  def force_init!
17
+ unless Isomorfeus.initial_state_fetched
18
+ Isomorfeus.initial_state_fetched = true
19
+ Redux::Store.preloaded_state = Isomorfeus.store.get_state
20
+ end
17
21
  Isomorfeus.force_init_store!
18
22
  execute_init_classes
19
23
  end
@@ -27,6 +31,17 @@ module Isomorfeus
27
31
  self.send("#{key}=", value)
28
32
  end
29
33
 
34
+ # only used for SSR
35
+ def cached_component_classes
36
+ @cached_component_classes ||= {}
37
+ end
38
+
39
+ # only used for SSR
40
+ def cached_component_class(class_name)
41
+ return cached_component_classes[class_name] if cached_component_classes.key?(class_name)
42
+ cached_component_classes[class_name] = "::#{class_name}".constantize
43
+ end
44
+
30
45
  def execute_init_classes
31
46
  client_init_class_names.each do |constant|
32
47
  constant.constantize.send(:init)
@@ -4,12 +4,15 @@ module Isomorfeus
4
4
  thread_id_asset = "#{Thread.current.object_id}#{asset}"
5
5
  render_result = "<div data-iso-env=\"#{Isomorfeus.env}\" data-iso-root=\"#{component_name}\" data-iso-props='#{Oj.dump(props, mode: :strict)}'"
6
6
  if Isomorfeus.server_side_rendering
7
+ # initialize speednode context
7
8
  unless Isomorfeus.ssr_contexts.key?(thread_id_asset)
8
9
  asset_file_name = OpalWebpackLoader::Manifest.lookup_path_for(asset)
9
10
  asset_path = File.join('public', asset_file_name)
10
11
  Isomorfeus.ssr_contexts[thread_id_asset] = ExecJS.permissive_compile(File.read(asset_path))
11
12
  end
12
- javascript = ''
13
+
14
+ # build javascript for rendering first pass
15
+ javascript = "global.Opal.Isomorfeus['$force_init!']();\n"
13
16
  if props.key?(:location)
14
17
  javascript << <<~JAVASCRIPT
15
18
  global.Opal.Isomorfeus.TopLevel["$ssr_route_path="]('#{props[:location]}');
@@ -19,20 +22,50 @@ module Isomorfeus
19
22
  ws_scheme = props[:location_scheme] == 'https:' ? 'wss:' : 'ws:'
20
23
  javascript << <<~JAVASCRIPT
21
24
  global.Opal.Isomorfeus.TopLevel["$transport_ws_url="]('#{ws_scheme}#{props[:location_host]}#{Isomorfeus.api_websocket_path}');
22
- if (typeof global.Opal.Isomorfeus.Transport !== 'undefined') {
23
- global.Opal.Isomorfeus.Transport.$connect();
24
- }
25
+ if (typeof global.Opal.Isomorfeus.Transport !== 'undefined') { global.Opal.Isomorfeus.Transport.$connect(); }
25
26
  JAVASCRIPT
26
27
  end
27
28
  javascript << <<~JAVASCRIPT
28
29
  var rendered_tree = global.Opal.Isomorfeus.TopLevel.$render_component_to_string('#{component_name}', #{Oj.dump(props, mode: :strict)})
29
- var application_state = global.Opal.Isomorfeus.store.native.getState();
30
+ var transport_busy = false;
30
31
  if (typeof global.Opal.Isomorfeus.Transport !== 'undefined') {
31
- global.Opal.Isomorfeus.Transport.$disconnect();
32
+ transport_busy = global.Opal.Isomorfeus.Transport['$busy?']();
33
+ if (!transport_busy) { global.Opal.Isomorfeus.Transport.$disconnect(); }
34
+ }
35
+ if (transport_busy) {
36
+ return ['', '', transport_busy]
37
+ } else {
38
+ var application_state = global.Opal.Isomorfeus.store.native.getState();
39
+ return [rendered_tree, application_state, transport_busy];
32
40
  }
33
- return [rendered_tree, application_state]
34
41
  JAVASCRIPT
35
- rendered_tree, application_state = Isomorfeus.ssr_contexts[thread_id_asset].exec(javascript)
42
+ # execute first render pass
43
+ rendered_tree, application_state, transport_busy = Isomorfeus.ssr_contexts[thread_id_asset].exec(javascript)
44
+
45
+ if transport_busy
46
+ # wait for transport requests to finish
47
+ start_time = Time.now
48
+ while transport_busy
49
+ break if (Time.now - start_time) > 10
50
+ sleep 0.01
51
+ transport_busy = Isomorfeus.ssr_contexts[thread_id_asset].exec('return global.Opal.Isomorfeus.Transport["$busy?"]()')
52
+ end
53
+ # build javascript for second render pass
54
+ javascript = <<~JAVASCRIPT
55
+ var rendered_tree = global.Opal.Isomorfeus.TopLevel.$render_component_to_string('#{component_name}', #{Oj.dump(props, mode: :strict)})
56
+ var application_state = global.Opal.Isomorfeus.store.native.getState();
57
+ var transport_busy = false;
58
+ if (typeof global.Opal.Isomorfeus.Transport !== 'undefined') {
59
+ transport_busy = global.Opal.Isomorfeus.Transport['$busy?']();
60
+ global.Opal.Isomorfeus.Transport.$disconnect();
61
+ }
62
+ return [rendered_tree, application_state, transport_busy];
63
+ JAVASCRIPT
64
+ # execute second render pass
65
+ rendered_tree, application_state, _transport_busy = Isomorfeus.ssr_contexts[thread_id_asset].exec(javascript)
66
+ end
67
+
68
+ # build result
36
69
  render_result << " data-iso-state='#{Oj.dump(application_state, mode: :strict)}'>"
37
70
  render_result << rendered_tree
38
71
  else
@@ -10,12 +10,7 @@ module Isomorfeus
10
10
 
11
11
  def render_component_to_string(component_name, props_json)
12
12
  # for some reason props_json arrives already decoded
13
- component = component_name.constantize
14
- unless Isomorfeus.initial_state_fetched
15
- Isomorfeus.initial_state_fetched = true
16
- Redux::Store.preloaded_state = Isomorfeus.store.get_state
17
- end
18
- Isomorfeus.force_init!
13
+ component = Isomorfeus.cached_component_class(component_name)
19
14
  ReactDOMServer.render_to_string(React.create_element(component, `Opal.Hash.$new(props_json)`))
20
15
  end
21
16
  end
data/lib/react/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module React
2
- VERSION = '16.8.7'
2
+ VERSION = '16.8.8'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isomorfeus-react
3
3
  version: !ruby/object:Gem::Version
4
- version: 16.8.7
4
+ version: 16.8.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-27 00:00:00.000000000 Z
11
+ date: 2019-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3.6'
19
+ version: '3.8'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '3.6'
26
+ version: '3.8'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: opal
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.3.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: opal-autoloader
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: opal-browser
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -72,56 +86,56 @@ dependencies:
72
86
  requirements:
73
87
  - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: 0.9.0
89
+ version: 0.9.2
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: 0.9.0
96
+ version: 0.9.2
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: isomorfeus-redux
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 4.0.7
103
+ version: 4.0.8
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: 4.0.7
110
+ version: 4.0.8
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: isomorfeus-speednode
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: 0.2.8
117
+ version: 0.2.10
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.2.8
124
+ version: 0.2.10
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: isomorfeus-puppetmaster
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: 0.2.7
131
+ version: 0.2.9
118
132
  type: :development
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: 0.2.7
138
+ version: 0.2.9
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: rake
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +156,14 @@ dependencies:
142
156
  requirements:
143
157
  - - "~>"
144
158
  - !ruby/object:Gem::Version
145
- version: '3.6'
159
+ version: '3.8'
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
164
  - - "~>"
151
165
  - !ruby/object:Gem::Version
152
- version: '3.6'
166
+ version: '3.8'
153
167
  description: Write React Components in Ruby.
154
168
  email:
155
169
  - jan@kursator.com