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