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 +4 -4
- data/lib/isomorfeus-react-base.rb +2 -0
- data/lib/isomorfeus-react.rb +2 -1
- data/lib/isomorfeus/config.rb +15 -0
- data/lib/isomorfeus/react_view_helper.rb +41 -8
- data/lib/isomorfeus/top_level_ssr.rb +1 -6
- data/lib/react/version.rb +1 -1
- metadata +28 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ade4ec53c51f197488b13e348ee86d99f89bb618207e8bee8c63a10fbedc5ef0
|
4
|
+
data.tar.gz: e8a0a41bc73cbacca961b40b233ac7a9b43c075fd731ed73cbf5c803271aa129
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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')
|
data/lib/isomorfeus-react.rb
CHANGED
@@ -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.
|
19
|
+
if Isomorfeus.production?
|
19
20
|
Isomorfeus.server_side_rendering = true
|
20
21
|
else
|
21
22
|
Isomorfeus.server_side_rendering = false
|
data/lib/isomorfeus/config.rb
CHANGED
@@ -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
|
-
|
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
|
30
|
+
var transport_busy = false;
|
30
31
|
if (typeof global.Opal.Isomorfeus.Transport !== 'undefined') {
|
31
|
-
global.Opal.Isomorfeus.Transport
|
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
|
-
|
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
|
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
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.
|
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-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
166
|
+
version: '3.8'
|
153
167
|
description: Write React Components in Ruby.
|
154
168
|
email:
|
155
169
|
- jan@kursator.com
|