isomorfeus-react 16.8.7 → 16.8.8

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: 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